Blame whiptail.c

Packit Service 8876fe
#include "config.h"
Packit Service 8876fe
#include <fcntl.h>
Packit Service 8876fe
#include <popt.h>
Packit Service 8876fe
#include <stdio.h>
Packit Service 8876fe
#include <string.h>
Packit Service 8876fe
#include <stdlib.h>
Packit Service 8876fe
#include <signal.h>
Packit Service 8876fe
#include <unistd.h>
Packit Service 8876fe
#include <wchar.h>
Packit Service 8876fe
#include <slang.h>
Packit Service 8876fe
#include <sys/stat.h>
Packit Service 8876fe
Packit Service 8876fe
#include "nls.h"
Packit Service 8876fe
#include "dialogboxes.h"
Packit Service 8876fe
#include "newt.h"
Packit Service 8876fe
#include "newt_pr.h"
Packit Service 8876fe
Packit Service 8876fe
enum { NO_ERROR = 0, WAS_ERROR = 1 };
Packit Service 8876fe
Packit Service 8876fe
enum mode { MODE_NONE, MODE_INFOBOX, MODE_MSGBOX, MODE_YESNO, MODE_CHECKLIST,
Packit Service 8876fe
		MODE_INPUTBOX, MODE_RADIOLIST, MODE_MENU, MODE_GAUGE ,
Packit Service 8876fe
		MODE_TEXTBOX, MODE_PASSWORDBOX};
Packit Service 8876fe
Packit Service 8876fe
#define OPT_MSGBOX 		1000
Packit Service 8876fe
#define OPT_CHECKLIST 		1001
Packit Service 8876fe
#define OPT_YESNO 		1002
Packit Service 8876fe
#define OPT_INPUTBOX 		1003
Packit Service 8876fe
#define OPT_FULLBUTTONS 	1004
Packit Service 8876fe
#define OPT_MENU	 	1005
Packit Service 8876fe
#define OPT_RADIOLIST	 	1006
Packit Service 8876fe
#define OPT_GAUGE	 	1007
Packit Service 8876fe
#define OPT_INFOBOX	 	1008
Packit Service 8876fe
#define OPT_TEXTBOX		1009
Packit Service 8876fe
#define OPT_PASSWORDBOX		1010
Packit Service 8876fe
Packit Service 8876fe
static void usage(int err) {
Packit Service 8876fe
    newtFinished();
Packit Service 8876fe
    fprintf (err ? stderr : stdout,
Packit Service 8876fe
             _("Box options: \n"
Packit Service 8876fe
	       "\t--msgbox <text> <height> <width>\n"
Packit Service 8876fe
	       "\t--yesno  <text> <height> <width>\n"
Packit Service 8876fe
	       "\t--infobox <text> <height> <width>\n"
Packit Service 8876fe
	       "\t--inputbox <text> <height> <width> [init] \n"
Packit Service 8876fe
	       "\t--passwordbox <text> <height> <width> [init] \n"
Packit Service 8876fe
	       "\t--textbox <file> <height> <width>\n"
Packit Service 8876fe
	       "\t--menu <text> <height> <width> <listheight> [tag item] ...\n"
Packit Service 8876fe
	       "\t--checklist <text> <height> <width> <listheight> [tag item status]...\n"
Packit Service 8876fe
	       "\t--radiolist <text> <height> <width> <listheight> [tag item status]...\n"
Packit Service 8876fe
	       "\t--gauge <text> <height> <width> <percent>\n"
Packit Service 8876fe
	       "Options: (depend on box-option)\n"
Packit Service 8876fe
	       "\t--clear				clear screen on exit\n"
Packit Service 8876fe
	       "\t--defaultno			default no button\n"	
Packit Service 8876fe
	       "\t--default-item <string>		set default string\n"
Packit Service 8876fe
	       "\t--fb, --fullbuttons		use full buttons\n"
Packit Service 8876fe
	       "\t--nocancel			no cancel button\n"
Packit Service 8876fe
	       "\t--yes-button <text>		set text of yes button\n"
Packit Service 8876fe
	       "\t--no-button <text>		set text of no button\n"
Packit Service 8876fe
	       "\t--ok-button <text>		set text of ok button\n"
Packit Service 8876fe
	       "\t--cancel-button <text>		set text of cancel button\n"
Packit Service 8876fe
	       "\t--noitem			don't display items\n"
Packit Service 8876fe
	       "\t--notags			don't display tags\n"
Packit Service 8876fe
	       "\t--separate-output		output one line at a time\n"
Packit Service 8876fe
	       "\t--output-fd <fd>		output to fd, not stdout\n"
Packit Service 8876fe
	       "\t--title <title>			display title\n"
Packit Service 8876fe
	       "\t--backtitle <backtitle>		display backtitle\n"
Packit Service 8876fe
	       "\t--scrolltext			force vertical scrollbars\n"
Packit Service 8876fe
	       "\t--topleft			put window in top-left corner\n"
Packit Service 8876fe
	       "\t-h, --help			print this message\n"
Packit Service 8876fe
	       "\t-v, --version			print version information\n\n"));
Packit Service 8876fe
    exit(err ? DLG_ERROR : 0 );
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
static void print_version(void) {
Packit Service 8876fe
    fprintf (stdout, _("whiptail (newt): %s\n"), VERSION);
Packit Service 8876fe
}
Packit Service 8876fe
	     
Packit Service 8876fe
#if 0
Packit Service 8876fe
/* FIXME Copied from newt.c
Packit Service 8876fe
 * Place somewhere better -- dialogboxes? -- amck
Packit Service 8876fe
 */
Packit Service 8876fe
int wstrlen(const char *str, int len) {
Packit Service 8876fe
       mbstate_t ps;
Packit Service 8876fe
       wchar_t tmp;
Packit Service 8876fe
       int nchars = 0;
Packit Service 8876fe
Packit Service 8876fe
       if (!str) return 0;
Packit Service 8876fe
      if (!len) return 0;
Packit Service 8876fe
       if (len < 0) len = strlen(str);
Packit Service 8876fe
      memset(&ps,0,sizeof(mbstate_t));
Packit Service 8876fe
       while (len > 0) {
Packit Service 8876fe
               int x,y;
Packit Service 8876fe
Packit Service 8876fe
               x = mbrtowc(&tmp,str,len,&ps);
Packit Service 8876fe
               if (x >0) {
Packit Service 8876fe
                       str += x;
Packit Service 8876fe
                       len -= x;
Packit Service 8876fe
                       y = wcwidth(tmp);
Packit Service 8876fe
                       if (y>0)
Packit Service 8876fe
                         nchars+=y;
Packit Service 8876fe
               } else break;
Packit Service 8876fe
       }
Packit Service 8876fe
       return nchars;
Packit Service 8876fe
}
Packit Service 8876fe
#endif
Packit Service 8876fe
Packit Service 8876fe
/*
Packit Service 8876fe
 * The value of *width is increased if it is not as large as the width of
Packit Service 8876fe
 * the line.
Packit Service 8876fe
 */
Packit Service 8876fe
static const char * lineWidth(int * width, const char * line, int *chrs)
Packit Service 8876fe
{
Packit Service 8876fe
    const char *    s = line;
Packit Service 8876fe
Packit Service 8876fe
    if ( line == NULL )
Packit Service 8876fe
       return 0;
Packit Service 8876fe
Packit Service 8876fe
   while ( *s != '\0' && *s != '\n' )
Packit Service 8876fe
       s++;
Packit Service 8876fe
Packit Service 8876fe
    if ( *s == '\n' )
Packit Service 8876fe
       s++;
Packit Service 8876fe
Packit Service 8876fe
    *chrs = _newt_wstrlen (line, s - line );
Packit Service 8876fe
    *width = max(*width, *chrs);
Packit Service 8876fe
Packit Service 8876fe
    return s;
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
Packit Service 8876fe
/*
Packit Service 8876fe
 * cleanNewlines
Packit Service 8876fe
 * Handle newlines in text. Hack.
Packit Service 8876fe
 */
Packit Service 8876fe
void cleanNewlines (char *text)
Packit Service 8876fe
{
Packit Service 8876fe
    char *p, *q;
Packit Service 8876fe
Packit Service 8876fe
    for (p = q = text; *p; p++, q++)
Packit Service 8876fe
        if (*p == '\\' && p[1] == 'n') {
Packit Service 8876fe
            p++;
Packit Service 8876fe
            *q = '\n';
Packit Service 8876fe
        } else
Packit Service 8876fe
            *q = *p;
Packit Service 8876fe
    *q = '\0';
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
/*
Packit Service 8876fe
 * The height of a text string is added to height, and width is increased
Packit Service 8876fe
 * if it is not big enough to store the text string.
Packit Service 8876fe
 */
Packit Service 8876fe
static const char * textSize(int * height, int * width,
Packit Service 8876fe
                            int maxWidth,
Packit Service 8876fe
                            const char * text)
Packit Service 8876fe
{
Packit Service 8876fe
    int h = 0;
Packit Service 8876fe
    int w = 0;
Packit Service 8876fe
    int chrs = 0;
Packit Service 8876fe
Packit Service 8876fe
Packit Service 8876fe
    if ( text == NULL )
Packit Service 8876fe
       return 0;
Packit Service 8876fe
Packit Service 8876fe
   while ( *text != '\0' ) {
Packit Service 8876fe
       h++;
Packit Service 8876fe
       text = lineWidth(width, text, &chrs);
Packit Service 8876fe
       /* Allow for text overflowing. May overestimate a bit */
Packit Service 8876fe
       h += chrs /  maxWidth;
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    h += 2;
Packit Service 8876fe
   w += 2;
Packit Service 8876fe
Packit Service 8876fe
    *height += h;
Packit Service 8876fe
    *width += w;
Packit Service 8876fe
Packit Service 8876fe
    *width = min(*width, maxWidth);
Packit Service 8876fe
    return text;
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
/*
Packit Service 8876fe
 * Add space for buttons.
Packit Service 8876fe
 * NOTE: when this is internationalized, the button width might change.
Packit Service 8876fe
 */
Packit Service 8876fe
static void spaceForButtons(int * height, int * width, int count, int full) {
Packit Service 8876fe
    /* Make space for the buttons */
Packit Service 8876fe
    if ( full ) {
Packit Service 8876fe
       *height += 4;
Packit Service 8876fe
       if ( count == 1 )
Packit Service 8876fe
           *width = max(*width, 7);
Packit Service 8876fe
       else
Packit Service 8876fe
           *width = max(*width, 20);
Packit Service 8876fe
    }
Packit Service 8876fe
    else {
Packit Service 8876fe
       *height += 2;
Packit Service 8876fe
       if ( count == 1 )
Packit Service 8876fe
           *width = max(*width, 7);
Packit Service 8876fe
       else
Packit Service 8876fe
           *width = max(*width, 19);
Packit Service 8876fe
    }
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
static int menuSize(int * height, int * width, enum mode mode,
Packit Service 8876fe
		    poptContext options) {
Packit Service 8876fe
    const char ** argv = poptGetArgs(options);
Packit Service 8876fe
    const char ** items = argv;
Packit Service 8876fe
    int         h = 0;
Packit Service 8876fe
    int         tagWidth = 0;
Packit Service 8876fe
    int         descriptionWidth = 0;
Packit Service 8876fe
    int         overhead = 10;
Packit Service 8876fe
    static char buf[20];
Packit Service 8876fe
Packit Service 8876fe
    if ( argv == 0 || *argv == 0 )
Packit Service 8876fe
       return 0;
Packit Service 8876fe
Packit Service 8876fe
    argv++;
Packit Service 8876fe
    if ( mode == MODE_MENU )
Packit Service 8876fe
       overhead = 5;
Packit Service 8876fe
Packit Service 8876fe
    while ( argv[0] != 0 && argv[1] ) {
Packit Service 8876fe
       tagWidth = max(tagWidth, strlen(argv[0]));
Packit Service 8876fe
       descriptionWidth = max(descriptionWidth, strlen(argv[1]));
Packit Service 8876fe
Packit Service 8876fe
       if ( mode == MODE_MENU )
Packit Service 8876fe
           argv += 2;
Packit Service 8876fe
       else
Packit Service 8876fe
          argv += 3;
Packit Service 8876fe
       h++;
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    *width = max(*width, tagWidth + descriptionWidth + overhead);
Packit Service 8876fe
    *width = min(*width, SLtt_Screen_Cols);
Packit Service 8876fe
Packit Service 8876fe
    h = min(h, SLtt_Screen_Rows - *height - 4);
Packit Service 8876fe
    *height = *height + h + 1;
Packit Service 8876fe
    sprintf(buf, "%d", h);
Packit Service 8876fe
   *items = buf;
Packit Service 8876fe
    return 0;
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
/*
Packit Service 8876fe
 * Guess the size of a window, given what will be displayed within it.
Packit Service 8876fe
 */
Packit Service 8876fe
static void guessSize(int * height, int * width, enum mode mode,
Packit Service 8876fe
                     int * flags, int fullButtons,
Packit Service 8876fe
                     const char * title, const char * text,
Packit Service 8876fe
                     poptContext options) {
Packit Service 8876fe
Packit Service 8876fe
    int w = 0, h = 0, chrs = 0;
Packit Service 8876fe
Packit Service 8876fe
    textSize(&h, &w, SLtt_Screen_Cols -4 , text);     /* Width and height for text */
Packit Service 8876fe
    lineWidth(&w, title, &chrs);             /* Width for title */
Packit Service 8876fe
Packit Service 8876fe
    if ( w > 0 )
Packit Service 8876fe
       w += 4;
Packit Service 8876fe
Packit Service 8876fe
    switch ( mode ) {
Packit Service 8876fe
       case MODE_CHECKLIST:
Packit Service 8876fe
       case MODE_RADIOLIST:
Packit Service 8876fe
       case MODE_MENU:
Packit Service 8876fe
           spaceForButtons(&h, &w, *flags & FLAG_NOCANCEL ? 1 : 2,
Packit Service 8876fe
            fullButtons);
Packit Service 8876fe
           menuSize(&h, &w, mode, options);
Packit Service 8876fe
               break;
Packit Service 8876fe
       case MODE_YESNO:
Packit Service 8876fe
       case MODE_MSGBOX:
Packit Service 8876fe
           spaceForButtons(&h, &w, 1, fullButtons);
Packit Service 8876fe
           break;
Packit Service 8876fe
       case MODE_INPUTBOX:
Packit Service 8876fe
           spaceForButtons(&h, &w, *flags & FLAG_NOCANCEL ? 1 : 2,
Packit Service 8876fe
            fullButtons);
Packit Service 8876fe
           h += 1;
Packit Service 8876fe
           break;
Packit Service 8876fe
       case MODE_GAUGE:
Packit Service 8876fe
           h += 2;
Packit Service 8876fe
           break;
Packit Service 8876fe
       case MODE_NONE:
Packit Service 8876fe
	   break;
Packit Service 8876fe
       default:
Packit Service 8876fe
               break;
Packit Service 8876fe
    };
Packit Service 8876fe
Packit Service 8876fe
    /*
Packit Service 8876fe
     * Fixed window-border overhead.
Packit Service 8876fe
     * NOTE: This will change if we add a way to turn off drop-shadow and/or
Packit Service 8876fe
     * box borders. That would be desirable for display-sized screens.
Packit Service 8876fe
     */
Packit Service 8876fe
    w += 2;
Packit Service 8876fe
    h += 2;
Packit Service 8876fe
Packit Service 8876fe
   if ( h > SLtt_Screen_Rows - 1 ) {
Packit Service 8876fe
       h = SLtt_Screen_Rows - 1;
Packit Service 8876fe
       *flags |= FLAG_SCROLL_TEXT;
Packit Service 8876fe
       w += 2; /* Add width of slider - is this right? */
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    *width = min(max(*width, w), SLtt_Screen_Cols);
Packit Service 8876fe
    *height = max(*height, h);
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
char *
Packit Service 8876fe
readTextFile(const char * filename)
Packit Service 8876fe
{
Packit Service 8876fe
    int fd = open(filename, O_RDONLY, 0);
Packit Service 8876fe
    struct stat s;
Packit Service 8876fe
    char * buf;
Packit Service 8876fe
Packit Service 8876fe
    if ( fd < 0 || fstat(fd, &s) != 0 ) {
Packit Service 8876fe
       perror(filename);
Packit Service 8876fe
       exit(DLG_ERROR);
Packit Service 8876fe
     }
Packit Service 8876fe
Packit Service 8876fe
    if ( (buf = malloc(s.st_size + 1)) == 0 ) {
Packit Service 8876fe
       fprintf(stderr, _("%s: too large to display.\n"), filename);
Packit Service 8876fe
       exit(DLG_ERROR);
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    if ( read(fd, buf, s.st_size) != s.st_size ) {
Packit Service 8876fe
        perror(filename);
Packit Service 8876fe
        exit(DLG_ERROR);
Packit Service 8876fe
    }
Packit Service 8876fe
   close(fd);
Packit Service 8876fe
   buf[s.st_size] = '\0';
Packit Service 8876fe
   return buf;
Packit Service 8876fe
}
Packit Service 8876fe
Packit Service 8876fe
int main(int argc, const char ** argv) {
Packit Service 8876fe
    enum mode mode = MODE_NONE;
Packit Service 8876fe
    poptContext optCon;
Packit Service 8876fe
    int arg;
Packit Service 8876fe
    char * text;
Packit Service 8876fe
    const char * nextArg;
Packit Service 8876fe
    char * end;
Packit Service 8876fe
    int height;
Packit Service 8876fe
    int width;
Packit Service 8876fe
    int fd = -1;
Packit Service 8876fe
    int needSpace = 0;
Packit Service 8876fe
    int noCancel = 0;
Packit Service 8876fe
    int noTags = 0;
Packit Service 8876fe
    int noItem = 0;
Packit Service 8876fe
    int clear = 0;
Packit Service 8876fe
    int scrollText = 0;
Packit Service 8876fe
    int rc = DLG_CANCEL;
Packit Service 8876fe
    int flags = 0;
Packit Service 8876fe
    int defaultNo = 0;
Packit Service 8876fe
    int separateOutput = 0;
Packit Service 8876fe
    int fullButtons = 0;
Packit Service 8876fe
    int outputfd = 2;
Packit Service 8876fe
    int topLeft = 0;
Packit Service 8876fe
    FILE *output = stderr;
Packit Service 8876fe
    char * result;
Packit Service 8876fe
    char ** selections, ** next;
Packit Service 8876fe
    char * title = NULL;
Packit Service 8876fe
    char *default_item = NULL;
Packit Service 8876fe
    char * backtitle = NULL;
Packit Service 8876fe
    char * yes_button = NULL;
Packit Service 8876fe
    char * no_button = NULL;
Packit Service 8876fe
    char * ok_button = NULL;
Packit Service 8876fe
    char * cancel_button = NULL;
Packit Service 8876fe
    int help = 0, version = 0;
Packit Service 8876fe
    struct poptOption optionsTable[] = {
Packit Service 8876fe
	    { "backtitle", '\0', POPT_ARG_STRING, &backtitle, 0 },
Packit Service 8876fe
	    { "checklist", '\0', 0, 0, OPT_CHECKLIST },
Packit Service 8876fe
	    { "clear", '\0', 0, &clear, 0 },
Packit Service 8876fe
	    { "defaultno", '\0', 0, &defaultNo, 0 },
Packit Service 8876fe
	    { "inputbox", '\0', 0, 0, OPT_INPUTBOX },
Packit Service 8876fe
	    { "fb", '\0', 0, 0, OPT_FULLBUTTONS },
Packit Service 8876fe
	    { "fullbuttons", '\0', 0, 0, OPT_FULLBUTTONS },
Packit Service 8876fe
	    { "gauge", '\0', 0, 0, OPT_GAUGE },
Packit Service 8876fe
	    { "infobox", '\0', 0, 0, OPT_INFOBOX },
Packit Service 8876fe
	    { "menu", '\0', 0, 0, OPT_MENU },
Packit Service 8876fe
	    { "msgbox", '\0', 0, 0, OPT_MSGBOX },
Packit Service 8876fe
	    { "nocancel", '\0', 0, &noCancel, 0 },
Packit Service 8876fe
	    { "noitem", '\0', 0, &noItem, 0 },
Packit Service 8876fe
            { "default-item", '\0', POPT_ARG_STRING, &default_item, 0},
Packit Service 8876fe
	    { "notags", '\0', 0, &noTags, 0 },
Packit Service 8876fe
	    { "radiolist", '\0', 0, 0, OPT_RADIOLIST },
Packit Service 8876fe
	    { "scrolltext", '\0', 0, &scrollText, 0 },
Packit Service 8876fe
	    { "separate-output", '\0', 0, &separateOutput, 0 },
Packit Service 8876fe
	    { "title", '\0', POPT_ARG_STRING, &title, 0 },
Packit Service 8876fe
	    { "textbox", '\0', 0, 0, OPT_TEXTBOX },
Packit Service 8876fe
	    { "topleft", '\0', 0, &topLeft, 0 },
Packit Service 8876fe
	    { "yesno", '\0', 0, 0, OPT_YESNO },
Packit Service 8876fe
	    { "passwordbox", '\0', 0, 0, OPT_PASSWORDBOX },
Packit Service 8876fe
	    { "output-fd", '\0',  POPT_ARG_INT, &outputfd, 0 },
Packit Service 8876fe
	    { "yes-button", '\0', POPT_ARG_STRING, &yes_button, 0},
Packit Service 8876fe
	    { "no-button", '\0', POPT_ARG_STRING, &no_button, 0},
Packit Service 8876fe
	    { "ok-button", '\0', POPT_ARG_STRING, &ok_button, 0},
Packit Service 8876fe
	    { "cancel-button", '\0', POPT_ARG_STRING, &cancel_button, 0},
Packit Service 8876fe
	    { "help", 'h', 0,  &help, 0, NULL, NULL },
Packit Service 8876fe
	    { "version", 'v', 0, &version, 0, NULL, NULL },
Packit Service 8876fe
	    { 0, 0, 0, 0, 0 } 
Packit Service 8876fe
    };
Packit Service 8876fe
   
Packit Service 8876fe
#ifdef ENABLE_NLS
Packit Service 8876fe
    setlocale (LC_ALL, "");
Packit Service 8876fe
    bindtextdomain (PACKAGE, LOCALEDIR);
Packit Service 8876fe
    textdomain (PACKAGE);
Packit Service 8876fe
#endif
Packit Service 8876fe
Packit Service 8876fe
    optCon = poptGetContext("whiptail", argc, argv, optionsTable, 0);
Packit Service 8876fe
Packit Service 8876fe
    while ((arg = poptGetNextOpt(optCon)) > 0) {
Packit Service 8876fe
	switch (arg) {
Packit Service 8876fe
	  case OPT_INFOBOX:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_INFOBOX;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_MENU:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_MENU;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_MSGBOX:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_MSGBOX;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_TEXTBOX:
Packit Service 8876fe
    	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_TEXTBOX;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_PASSWORDBOX:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_PASSWORDBOX;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_RADIOLIST:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_RADIOLIST;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_CHECKLIST:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_CHECKLIST;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_FULLBUTTONS:
Packit Service 8876fe
	    fullButtons = 1;
Packit Service 8876fe
	    useFullButtons(1);
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_YESNO:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_YESNO;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_GAUGE:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_GAUGE;
Packit Service 8876fe
	    break;
Packit Service 8876fe
Packit Service 8876fe
	  case OPT_INPUTBOX:
Packit Service 8876fe
	    if (mode != MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
	    mode = MODE_INPUTBOX;
Packit Service 8876fe
	    break;
Packit Service 8876fe
	}
Packit Service 8876fe
    }
Packit Service 8876fe
    
Packit Service 8876fe
    if (help) {
Packit Service 8876fe
	    usage(NO_ERROR);
Packit Service 8876fe
	    exit(0);
Packit Service 8876fe
    }
Packit Service 8876fe
    if (version) {
Packit Service 8876fe
	    print_version();
Packit Service 8876fe
	    exit(0);
Packit Service 8876fe
    }
Packit Service 8876fe
    
Packit Service 8876fe
    if (arg < -1) {
Packit Service 8876fe
	fprintf(stderr, "%s: %s\n", 
Packit Service 8876fe
		poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
Packit Service 8876fe
		poptStrerror(arg));
Packit Service 8876fe
	exit(1);
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    output = fdopen (outputfd, "w");
Packit Service 8876fe
    if (output == NULL ) {
Packit Service 8876fe
        perror ("Cannot open output-fd\n");
Packit Service 8876fe
        exit (DLG_ERROR);
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    if (mode == MODE_NONE) usage(WAS_ERROR);
Packit Service 8876fe
Packit Service 8876fe
    if (!(nextArg = poptGetArg(optCon))) usage(WAS_ERROR);
Packit Service 8876fe
    text = strdup(nextArg);
Packit Service 8876fe
Packit Service 8876fe
    if (mode == MODE_TEXTBOX) {
Packit Service 8876fe
	char *t = text;
Packit Service 8876fe
	text = readTextFile(t);
Packit Service 8876fe
	free(t);
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    if (!(nextArg = poptGetArg(optCon))) usage(WAS_ERROR);
Packit Service 8876fe
    height = strtoul(nextArg, &end, 10);
Packit Service 8876fe
    if (*end) usage(WAS_ERROR);
Packit Service 8876fe
Packit Service 8876fe
    if (!(nextArg = poptGetArg(optCon))) usage(WAS_ERROR);
Packit Service 8876fe
    width = strtoul(nextArg, &end, 10);
Packit Service 8876fe
    if (*end) usage(WAS_ERROR);
Packit Service 8876fe
Packit Service 8876fe
    if (mode == MODE_GAUGE) {
Packit Service 8876fe
	fd = dup(0);
Packit Service 8876fe
	if (fd < 0 || close(0) < 0) {
Packit Service 8876fe
	    perror("dup/close stdin");
Packit Service 8876fe
	    exit(DLG_ERROR);
Packit Service 8876fe
	}
Packit Service 8876fe
	if (open("/dev/tty", O_RDWR) != 0) {
Packit Service 8876fe
	    perror("open /dev/tty");
Packit Service 8876fe
	    exit(DLG_ERROR);
Packit Service 8876fe
	}
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    newtInit();
Packit Service 8876fe
    newtCls();
Packit Service 8876fe
Packit Service 8876fe
    cleanNewlines(text);
Packit Service 8876fe
Packit Service 8876fe
    if ( height <= 0 || width <= 0 )
Packit Service 8876fe
       guessSize(&height, &width, mode, &flags, fullButtons, title, text,
Packit Service 8876fe
                 optCon);
Packit Service 8876fe
Packit Service 8876fe
    width -= 2;
Packit Service 8876fe
    height -= 2;
Packit Service 8876fe
Packit Service 8876fe
    newtOpenWindow(topLeft ? 1 : (SLtt_Screen_Cols - width) / 2,
Packit Service 8876fe
		   topLeft ? 1 : (SLtt_Screen_Rows - height) / 2, width, height, title);
Packit Service 8876fe
    if (backtitle)
Packit Service 8876fe
	newtDrawRootText(0, 0, backtitle);
Packit Service 8876fe
Packit Service 8876fe
    if (ok_button)
Packit Service 8876fe
	setButtonText(ok_button, BUTTON_OK);
Packit Service 8876fe
    if (cancel_button)
Packit Service 8876fe
	setButtonText(cancel_button, BUTTON_CANCEL);
Packit Service 8876fe
    if (yes_button)
Packit Service 8876fe
	setButtonText(yes_button, BUTTON_YES);
Packit Service 8876fe
    if (no_button)
Packit Service 8876fe
	setButtonText(no_button, BUTTON_NO);
Packit Service 8876fe
Packit Service 8876fe
    if (noCancel) flags |= FLAG_NOCANCEL;
Packit Service 8876fe
    if (noItem) flags |= FLAG_NOITEM;
Packit Service 8876fe
    if (noTags) flags |= FLAG_NOTAGS;
Packit Service 8876fe
    if (scrollText) flags |= FLAG_SCROLL_TEXT;
Packit Service 8876fe
    if (defaultNo) flags |= FLAG_DEFAULT_NO;
Packit Service 8876fe
Packit Service 8876fe
    switch (mode) {
Packit Service 8876fe
      case MODE_MSGBOX:
Packit Service 8876fe
      case MODE_TEXTBOX:
Packit Service 8876fe
	rc = messageBox(text, height, width, MSGBOX_MSG, flags);
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_INFOBOX:
Packit Service 8876fe
	rc = messageBox(text, height, width, MSGBOX_INFO, flags);
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_YESNO:
Packit Service 8876fe
	rc = messageBox(text, height, width, MSGBOX_YESNO, flags);
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_INPUTBOX:
Packit Service 8876fe
	rc = inputBox(text, height, width, optCon, flags, &result);
Packit Service 8876fe
	if (rc == DLG_OKAY) {
Packit Service 8876fe
	    fprintf(output, "%s", result);
Packit Service 8876fe
	    free(result);
Packit Service 8876fe
	}
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_PASSWORDBOX:
Packit Service 8876fe
	rc = inputBox(text, height, width, optCon, flags | FLAG_PASSWORD,
Packit Service 8876fe
	      &result);
Packit Service 8876fe
	if (rc == DLG_OKAY) {
Packit Service 8876fe
	    fprintf (output, "%s", result);
Packit Service 8876fe
	    free(result);
Packit Service 8876fe
	}
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_MENU:
Packit Service 8876fe
	rc = listBox(text, height, width, optCon, flags, default_item, &result);
Packit Service 8876fe
	if (rc == DLG_OKAY) {
Packit Service 8876fe
	    fprintf(output, "%s", result);
Packit Service 8876fe
	    free(result);
Packit Service 8876fe
	}
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_RADIOLIST:
Packit Service 8876fe
	rc = checkList(text, height, width, optCon, 1, flags, &selections);
Packit Service 8876fe
	if (rc == DLG_OKAY && selections[0]) {
Packit Service 8876fe
	    fprintf(output, "%s", selections[0]);
Packit Service 8876fe
	    free(selections[0]);
Packit Service 8876fe
	    free(selections);
Packit Service 8876fe
	}
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_CHECKLIST:
Packit Service 8876fe
	rc = checkList(text, height, width, optCon, 0, flags, &selections);
Packit Service 8876fe
Packit Service 8876fe
	if (!rc) {
Packit Service 8876fe
	    for (next = selections; *next; next++) {
Packit Service 8876fe
		if (!separateOutput) {
Packit Service 8876fe
		    if (needSpace) putc(' ', output);
Packit Service 8876fe
		    fprintf(output, "\"%s\"", *next);
Packit Service 8876fe
		    needSpace = 1;
Packit Service 8876fe
		} else {
Packit Service 8876fe
		    fprintf(output, "%s\n", *next);
Packit Service 8876fe
		}
Packit Service 8876fe
		free(*next);
Packit Service 8876fe
	    }
Packit Service 8876fe
Packit Service 8876fe
	    free(selections);
Packit Service 8876fe
	}
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      case MODE_GAUGE:
Packit Service 8876fe
	rc = gauge(text, height, width, optCon, fd, flags);
Packit Service 8876fe
	break;
Packit Service 8876fe
Packit Service 8876fe
      default:
Packit Service 8876fe
	usage(WAS_ERROR);
Packit Service 8876fe
    }
Packit Service 8876fe
Packit Service 8876fe
    if (rc == DLG_ERROR) usage(WAS_ERROR);
Packit Service 8876fe
Packit Service 8876fe
    if (clear)
Packit Service 8876fe
	newtPopWindow();
Packit Service 8876fe
    newtFinished();
Packit Service 8876fe
Packit Service 8876fe
    free(text);
Packit Service 8876fe
    poptFreeContext(optCon);
Packit Service 8876fe
Packit Service 8876fe
    return ( rc == DLG_ESCAPE ) ? -1 : rc;
Packit Service 8876fe
}