|
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 |
}
|