summaryrefslogtreecommitdiffstats
path: root/gnu/lib/libdialog
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1994-10-28 03:08:28 +0000
committerache <ache@FreeBSD.org>1994-10-28 03:08:28 +0000
commita984cc06a4664f37ee078344f9d75728f8d68a75 (patch)
treeececb7800f05ccfd7dbac76ba80123d0f3fc52a4 /gnu/lib/libdialog
parentf9c842861b87b5b7b2ca8862b9a2eeddf2373461 (diff)
downloadFreeBSD-src-a984cc06a4664f37ee078344f9d75728f8d68a75.zip
FreeBSD-src-a984cc06a4664f37ee078344f9d75728f8d68a75.tar.gz
Implement dialog_prgbox() function which allows run program
(via pipe) with output to dialog box
Diffstat (limited to 'gnu/lib/libdialog')
-rw-r--r--gnu/lib/libdialog/Makefile4
-rw-r--r--gnu/lib/libdialog/checklist.c4
-rw-r--r--gnu/lib/libdialog/dialog.h1
-rw-r--r--gnu/lib/libdialog/dialog.priv.h4
-rw-r--r--gnu/lib/libdialog/inputbox.c4
-rw-r--r--gnu/lib/libdialog/kernel.c106
-rw-r--r--gnu/lib/libdialog/lineedit.c3
-rw-r--r--gnu/lib/libdialog/menubox.c4
-rw-r--r--gnu/lib/libdialog/msgbox.c7
-rw-r--r--gnu/lib/libdialog/prgbox.c113
-rw-r--r--gnu/lib/libdialog/radiolist.c4
-rw-r--r--gnu/lib/libdialog/raw_popen.c160
-rw-r--r--gnu/lib/libdialog/textbox.c2
-rw-r--r--gnu/lib/libdialog/yesno.c4
14 files changed, 394 insertions, 26 deletions
diff --git a/gnu/lib/libdialog/Makefile b/gnu/lib/libdialog/Makefile
index 701936d..b5f0b24 100644
--- a/gnu/lib/libdialog/Makefile
+++ b/gnu/lib/libdialog/Makefile
@@ -1,9 +1,9 @@
# Makefile for libdialog
-# $Id: Makefile,v 1.3 1994/10/20 21:56:34 ache Exp $
+# $Id: Makefile,v 1.4 1994/10/21 15:42:27 ache Exp $
LIB= dialog
SRCS= kernel.c rc.c checklist.c inputbox.c menubox.c msgbox.c \
- lineedit.c radiolist.c textbox.c yesno.c
+ lineedit.c radiolist.c textbox.c yesno.c prgbox.c raw_popen.c
CFLAGS+= -Wall -Wstrict-prototypes -DLOCALE
diff --git a/gnu/lib/libdialog/checklist.c b/gnu/lib/libdialog/checklist.c
index 4bdaadc..f802f33 100644
--- a/gnu/lib/libdialog/checklist.c
+++ b/gnu/lib/libdialog/checklist.c
@@ -81,7 +81,8 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
- print_autowrap(dialog, prompt, width, 1, 3);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
list_width = width-6;
getyx(dialog, cur_y, cur_x);
@@ -306,6 +307,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
break;
case ' ':
case '\n':
+ case '\r':
delwin(dialog);
if (!button) {
*result = '\0';
diff --git a/gnu/lib/libdialog/dialog.h b/gnu/lib/libdialog/dialog.h
index 88bcaa3..f2b5d69 100644
--- a/gnu/lib/libdialog/dialog.h
+++ b/gnu/lib/libdialog/dialog.h
@@ -83,6 +83,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int box_width, chtype attrs,
void dialog_create_rc(unsigned char *filename);
int dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width);
+int dialog_prgbox(unsigned char *title, const char *line, int height, int width, int pause, int use_shell);
int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int width, int pause);
int dialog_textbox(unsigned char *title, unsigned char *file, int height, int width);
int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height, int item_no, unsigned char **items, unsigned char *result);
diff --git a/gnu/lib/libdialog/dialog.priv.h b/gnu/lib/libdialog/dialog.priv.h
index b0340db..f21a4e8 100644
--- a/gnu/lib/libdialog/dialog.priv.h
+++ b/gnu/lib/libdialog/dialog.priv.h
@@ -155,5 +155,7 @@ extern int parse_rc(void);
void color_setup(void);
#endif
void attr_clear(WINDOW *win, int height, int width, chtype attr);
-void print_autowrap(WINDOW *win, unsigned char *prompt, int width, int y, int x);
+void print_autowrap(WINDOW *win, unsigned char *prompt, int height, int width, int maxwidth, int y, int x, int center, int rawmode);
void print_button(WINDOW *win, unsigned char *label, int y, int x, int selected);
+FILE *raw_popen(const char *program, char * const *argv, const char *type);
+int raw_pclose(FILE *iop);
diff --git a/gnu/lib/libdialog/inputbox.c b/gnu/lib/libdialog/inputbox.c
index 5bf6fcc..bf423c9 100644
--- a/gnu/lib/libdialog/inputbox.c
+++ b/gnu/lib/libdialog/inputbox.c
@@ -64,7 +64,8 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
- print_autowrap(dialog, prompt, width, 1, 3);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
/* Draw the input field box */
box_width = width-6;
@@ -146,6 +147,7 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
break;
case ' ':
case '\n':
+ case '\r':
delwin(dialog);
if (button < 1)
strcpy(result, instr);
diff --git a/gnu/lib/libdialog/kernel.c b/gnu/lib/libdialog/kernel.c
index eb8ff8e..bdaa87f 100644
--- a/gnu/lib/libdialog/kernel.c
+++ b/gnu/lib/libdialog/kernel.c
@@ -166,19 +166,21 @@ void attr_clear(WINDOW *win, int height, int width, chtype attr)
* string may contain "\n" to represent a newline character or the real
* newline '\n', but in that case, auto wrap around will be disabled.
*/
-void print_autowrap(WINDOW *win, unsigned char *prompt, int width, int y, int x)
+void print_autowrap(WINDOW *win, unsigned char *prompt, int height, int width, int maxwidth, int y, int x, int center, int rawmode)
{
- int first = 1, cur_x, cur_y;
+ int first = 1, cur_x, cur_y, i;
unsigned char tempstr[MAX_LEN+1], *word, *tempptr, *tempptr1;
+ chtype ostuff[132], attrs = 0, init_bottom = 0;
+
+ wsetscrreg(win, y, height);
+ getyx(win, cur_y, cur_x);
strcpy(tempstr, prompt);
- if ((strstr(tempstr, "\\n") != NULL) ||
+ if ((!rawmode && strstr(tempstr, "\\n") != NULL) ||
(strchr(tempstr, '\n') != NULL)) { /* Prompt contains "\n" or '\n' */
word = tempstr;
- cur_y = y;
- wmove(win, cur_y, x);
while (1) {
- tempptr = strstr(word, "\\n");
+ tempptr = rawmode ? NULL : strstr(word, "\\n");
tempptr1 = strchr(word, '\n');
if (tempptr == NULL && tempptr1 == NULL)
break;
@@ -203,25 +205,99 @@ void print_autowrap(WINDOW *win, unsigned char *prompt, int width, int y, int x)
waddstr(win, word);
word = tempptr + 1;
- wmove(win, ++cur_y, x);
+ if (++cur_y > height) {
+ cur_y--;
+ if (!init_bottom) {
+ for (i = 0; i < x; i++)
+ ostuff[i] = mvwinch(win, cur_y, i);
+ for (i = width; i < maxwidth; i++)
+ ostuff[i] = mvwinch(win, cur_y, i);
+ attrs = getattrs(win);
+ init_bottom = 1;
+ }
+ scrollok(win, TRUE);
+ scroll(win);
+ scrollok(win, FALSE);
+ wmove(win, cur_y, 0);
+ for (i = 0; i < x; i++) {
+ wattrset(win, ostuff[i]&A_ATTRIBUTES);
+ waddch(win, ostuff[i]);
+ }
+ wattrset(win, attrs);
+ for ( ; i < width; i++)
+ waddch(win, ' ');
+ for ( ; i < maxwidth; i++) {
+ wattrset(win, ostuff[i]&A_ATTRIBUTES);
+ waddch(win, ostuff[i]);
+ }
+ wattrset(win, attrs);
+ wrefresh(win);
+ }
+ wmove(win, cur_y, cur_x = x);
}
waddstr(win, word);
}
- else if (strlen(tempstr) <= width-x*2) { /* If prompt is short */
- wmove(win, y, (width - strlen(tempstr)) / 2);
+ else if (center && strlen(tempstr) <= width-x*2) { /* If prompt is short */
+ wmove(win, cur_y, (width - strlen(tempstr)) / 2);
+ waddstr(win, tempstr);
+ }
+ else if (!center && strlen(tempstr) <= width-cur_x) { /* If prompt is short */
waddstr(win, tempstr);
}
else {
- cur_x = x;
- cur_y = y;
/* Print prompt word by word, wrap around if necessary */
- while ((word = strtok(first ? tempstr : NULL, " ")) != NULL) {
+ while ((word = strtok(first ? tempstr : NULL, "\t\n ")) != NULL) {
+ int loop;
+ unsigned char sc;
+
if (first) /* First iteration */
first = 0;
- if (cur_x+strlen(word) >= width) { /* wrap around to next line */
- cur_y++;
- cur_x = x;
+ do {
+ loop = 0;
+ if (cur_x+strlen(word) >= width+1) { /* wrap around to next line */
+ if (x+strlen(word) >= width+1) {
+ sc = word[width-cur_x-1];
+ word[width-cur_x-1] = '\0';
+ wmove(win, cur_y, cur_x);
+ waddstr(win, word);
+ word[width-cur_x-1] = sc;
+ word += width-cur_x-1;
+ getyx(win, cur_y, cur_x);
+ loop = 1;
+ }
+ cur_y++;
+ cur_x = x;
+ if (cur_y > height) {
+ cur_y--;
+ if (!init_bottom) {
+ for (i = 0; i < x; i++)
+ ostuff[i] = mvwinch(win, cur_y, i);
+ for (i = width; i < maxwidth; i++)
+ ostuff[i] = mvwinch(win, cur_y, i);
+ attrs = getattrs(win);
+ init_bottom = 1;
+ }
+ scrollok(win, TRUE);
+ scroll(win);
+ scrollok(win, FALSE);
+ wmove(win, cur_y, 0);
+ for (i = 0; i < x; i++) {
+ wattrset(win, ostuff[i]&A_ATTRIBUTES);
+ waddch(win, ostuff[i]);
+ }
+ wattrset(win, attrs);
+ for ( ; i < width; i++)
+ waddch(win, ' ');
+ for ( ; i < maxwidth; i++) {
+ wattrset(win, ostuff[i]&A_ATTRIBUTES);
+ waddch(win, ostuff[i]);
+ }
+ wattrset(win, attrs);
+ wrefresh(win);
+ }
+ }
}
+ while(loop);
wmove(win, cur_y, cur_x);
waddstr(win, word);
getyx(win, cur_y, cur_x);
diff --git a/gnu/lib/libdialog/lineedit.c b/gnu/lib/libdialog/lineedit.c
index 138aa41..78088e8 100644
--- a/gnu/lib/libdialog/lineedit.c
+++ b/gnu/lib/libdialog/lineedit.c
@@ -49,9 +49,12 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int box_width, chtype attr,
case KEY_UP:
case KEY_DOWN:
case ESC:
+ case '\r':
case '\n':
for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--)
instr[i] = '\0';
+ if (key == '\r')
+ key = '\n';
goto ret;
case KEY_HOME:
input_x = scroll = 0;
diff --git a/gnu/lib/libdialog/menubox.c b/gnu/lib/libdialog/menubox.c
index 2e95a69..332dfa7 100644
--- a/gnu/lib/libdialog/menubox.c
+++ b/gnu/lib/libdialog/menubox.c
@@ -71,7 +71,8 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
- print_autowrap(dialog, prompt, width, 1, 3);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
menu_width = width-6;
getyx(dialog, cur_y, cur_x);
@@ -271,6 +272,7 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
wrefresh(dialog);
break;
case ' ':
+ case '\r':
case '\n':
delwin(dialog);
if (!button)
diff --git a/gnu/lib/libdialog/msgbox.c b/gnu/lib/libdialog/msgbox.c
index fe19d00..c56b58b 100644
--- a/gnu/lib/libdialog/msgbox.c
+++ b/gnu/lib/libdialog/msgbox.c
@@ -53,7 +53,8 @@ int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int w
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
- print_autowrap(dialog, prompt, width-2, 1, 2);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
if (pause) {
wattrset(dialog, border_attr);
@@ -68,8 +69,10 @@ int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int w
waddch(dialog, ' ');
print_button(dialog, " OK ", height-2, width/2-4, TRUE);
wrefresh(dialog);
- while (key != ESC && key != '\n' && key != ' ')
+ while (key != ESC && key != '\n' && key != ' ' && key != '\r')
key = wgetch(dialog);
+ if (key == '\r')
+ key = '\n';
}
else {
key = '\n';
diff --git a/gnu/lib/libdialog/prgbox.c b/gnu/lib/libdialog/prgbox.c
new file mode 100644
index 0000000..b9a6606
--- /dev/null
+++ b/gnu/lib/libdialog/prgbox.c
@@ -0,0 +1,113 @@
+/*
+ * msgbox.c -- implements the message box and info box
+ *
+ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <dialog.h>
+#include "dialog.priv.h"
+
+
+/*
+ * Display a message box. Program will pause and display an "OK" button
+ * if the parameter 'pause' is non-zero.
+ */
+int dialog_prgbox(unsigned char *title, const char *line, int height, int width, int pause, int use_shell)
+{
+ int i, x, y, key = 0;
+ WINDOW *dialog;
+ FILE *f;
+ unsigned char *s, buf[MAX_LEN];
+
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
+
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ wmove(dialog, 1, 2);
+
+ if (!use_shell) {
+ char cmdline[MAX_LEN];
+ char *av[51], **ap = av, *val;
+ int first = 1;
+
+ strcpy(cmdline, line);
+ while ((val = strtok(first ? cmdline : NULL, " \t")) != NULL) {
+ first = 0;
+ *ap++ = val;
+ }
+ *ap = NULL;
+ f = raw_popen(av[0], av, "r");
+ } else
+ f = raw_popen(line, NULL, "r");
+
+ while (fgets(buf, sizeof(buf), f) != NULL) {
+ i = strlen(buf);
+ if (buf[i-1] == '\n')
+ buf[i-1] = '\0';
+ s = buf;
+ while ((s = strchr(s, '\t')) != NULL)
+ *s++ = ' ';
+ print_autowrap(dialog, buf, height-(pause?3:1), width-2, width, 1, 2, FALSE, TRUE);
+ print_autowrap(dialog, "\n", height-(pause?3:1), width-2, width, 1, 2, FALSE, FALSE);
+ }
+ raw_pclose(f);
+
+ if (pause) {
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+ print_button(dialog, " OK ", height-2, width/2-4, TRUE);
+ wrefresh(dialog);
+ while (key != ESC && key != '\n' && key != ' ' && key != '\r')
+ key = wgetch(dialog);
+ if (key == '\r')
+ key = '\n';
+ }
+ else {
+ key = '\n';
+ wrefresh(dialog);
+ }
+
+ delwin(dialog);
+ return (key == ESC ? -1 : 0);
+}
+/* End of dialog_msgbox() */
diff --git a/gnu/lib/libdialog/radiolist.c b/gnu/lib/libdialog/radiolist.c
index 243b48c..3618e68 100644
--- a/gnu/lib/libdialog/radiolist.c
+++ b/gnu/lib/libdialog/radiolist.c
@@ -89,7 +89,8 @@ int dialog_radiolist(char *title, char *prompt, int height, int width, int list_
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
- print_autowrap(dialog, prompt, width, 1, 3);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
list_width = width-6;
getyx(dialog, cur_y, cur_x);
@@ -316,6 +317,7 @@ int dialog_radiolist(char *title, char *prompt, int height, int width, int list_
wrefresh(dialog);
break;
case ' ':
+ case '\r':
case '\n':
delwin(dialog);
if (!button) {
diff --git a/gnu/lib/libdialog/raw_popen.c b/gnu/lib/libdialog/raw_popen.c
new file mode 100644
index 0000000..6393eb1
--- /dev/null
+++ b/gnu/lib/libdialog/raw_popen.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software written by Ken Arnold and
+ * published in UNIX Review, Vol. 6, No. 8.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <sys/wait.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <paths.h>
+
+static struct pid {
+ struct pid *next;
+ FILE *fp;
+ pid_t pid;
+} *pidlist;
+
+FILE *
+raw_popen(const char *program, char * const *argv, const char *type)
+{
+ struct pid *cur;
+ FILE *iop;
+ int pdes[2], pid;
+
+ if ((*type != 'r' && *type != 'w') || type[1])
+ return (NULL);
+
+ if ((cur = malloc(sizeof(struct pid))) == NULL)
+ return (NULL);
+
+ if (pipe(pdes) < 0) {
+ (void)free(cur);
+ return (NULL);
+ }
+
+ switch (pid = vfork()) {
+ case -1: /* Error. */
+ (void)close(pdes[0]);
+ (void)close(pdes[1]);
+ (void)free(cur);
+ return (NULL);
+ /* NOTREACHED */
+ case 0: /* Child. */
+ if (*type == 'r') {
+ if (pdes[1] != STDOUT_FILENO) {
+ (void)dup2(pdes[1], STDOUT_FILENO);
+ (void)close(pdes[1]);
+ }
+ (void) close(pdes[0]);
+ } else {
+ if (pdes[0] != STDIN_FILENO) {
+ (void)dup2(pdes[0], STDIN_FILENO);
+ (void)close(pdes[0]);
+ }
+ (void)close(pdes[1]);
+ }
+ if (argv == NULL)
+ execl(_PATH_BSHELL, "sh", "-c", program, NULL);
+ else
+ execvp(program, argv);
+ _exit(127);
+ /* NOTREACHED */
+ }
+
+ /* Parent; assume fdopen can't fail. */
+ if (*type == 'r') {
+ iop = fdopen(pdes[0], type);
+ (void)close(pdes[1]);
+ } else {
+ iop = fdopen(pdes[1], type);
+ (void)close(pdes[0]);
+ }
+
+ /* Link into list of file descriptors. */
+ cur->fp = iop;
+ cur->pid = pid;
+ cur->next = pidlist;
+ pidlist = cur;
+
+ return (iop);
+}
+
+/*
+ * pclose --
+ * Pclose returns -1 if stream is not associated with a `popened' command,
+ * if already `pclosed', or waitpid returns an error.
+ */
+int
+raw_pclose(FILE *iop)
+{
+ register struct pid *cur, *last;
+ int omask;
+ union wait pstat;
+ pid_t pid;
+
+ (void)fclose(iop);
+
+ /* Find the appropriate file pointer. */
+ for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
+ if (cur->fp == iop)
+ break;
+ if (cur == NULL)
+ return (-1);
+
+ /* Get the status of the process. */
+ omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP));
+ do {
+ pid = waitpid(cur->pid, (int *) &pstat, 0);
+ } while (pid == -1 && errno == EINTR);
+ (void)sigsetmask(omask);
+
+ /* Remove the entry from the linked list. */
+ if (last == NULL)
+ pidlist = cur->next;
+ else
+ last->next = cur->next;
+ free(cur);
+
+ return (pid == -1 ? -1 : pstat.w_status);
+}
diff --git a/gnu/lib/libdialog/textbox.c b/gnu/lib/libdialog/textbox.c
index 1e4ccd9..cb87474 100644
--- a/gnu/lib/libdialog/textbox.c
+++ b/gnu/lib/libdialog/textbox.c
@@ -130,7 +130,7 @@ int dialog_textbox(unsigned char *title, unsigned char *file, int height, int wi
wmove(dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh(dialog);
- while ((key != ESC) && (key != '\n')) {
+ while ((key != ESC) && (key != '\n') && (key != '\r')) {
key = wgetch(dialog);
switch (key) {
case 'E': /* Exit */
diff --git a/gnu/lib/libdialog/yesno.c b/gnu/lib/libdialog/yesno.c
index 6d15d31..c97d800 100644
--- a/gnu/lib/libdialog/yesno.c
+++ b/gnu/lib/libdialog/yesno.c
@@ -62,7 +62,8 @@ int dialog_yesno(unsigned char *title, unsigned char * prompt, int height, int w
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
- print_autowrap(dialog, prompt, width, 1, 3);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
x = width/2-10;
y = height-2;
@@ -100,6 +101,7 @@ int dialog_yesno(unsigned char *title, unsigned char * prompt, int height, int w
wrefresh(dialog);
break;
case ' ':
+ case '\r':
case '\n':
delwin(dialog);
return button;
OpenPOWER on IntegriCloud