1*61ba55bcSBaptiste Daroussin /*- 2*61ba55bcSBaptiste Daroussin * SPDX-License-Identifier: BSD-2-Clause 3*61ba55bcSBaptiste Daroussin * 4*61ba55bcSBaptiste Daroussin * Copyright (c) 2021-2023 Alfonso Sabato Siciliano 5*61ba55bcSBaptiste Daroussin * 6*61ba55bcSBaptiste Daroussin * Redistribution and use in source and binary forms, with or without 7*61ba55bcSBaptiste Daroussin * modification, are permitted provided that the following conditions 8*61ba55bcSBaptiste Daroussin * are met: 9*61ba55bcSBaptiste Daroussin * 1. Redistributions of source code must retain the above copyright 10*61ba55bcSBaptiste Daroussin * notice, this list of conditions and the following disclaimer. 11*61ba55bcSBaptiste Daroussin * 2. Redistributions in binary form must reproduce the above copyright 12*61ba55bcSBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the 13*61ba55bcSBaptiste Daroussin * documentation and/or other materials provided with the distribution. 14*61ba55bcSBaptiste Daroussin * 15*61ba55bcSBaptiste Daroussin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*61ba55bcSBaptiste Daroussin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*61ba55bcSBaptiste Daroussin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*61ba55bcSBaptiste Daroussin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*61ba55bcSBaptiste Daroussin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*61ba55bcSBaptiste Daroussin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*61ba55bcSBaptiste Daroussin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*61ba55bcSBaptiste Daroussin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*61ba55bcSBaptiste Daroussin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*61ba55bcSBaptiste Daroussin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*61ba55bcSBaptiste Daroussin * SUCH DAMAGE. 26*61ba55bcSBaptiste Daroussin */ 27*61ba55bcSBaptiste Daroussin 28*61ba55bcSBaptiste Daroussin #include <stdio.h> 29*61ba55bcSBaptiste Daroussin #include <stdlib.h> 30*61ba55bcSBaptiste Daroussin #include <string.h> 31*61ba55bcSBaptiste Daroussin #include <time.h> 32*61ba55bcSBaptiste Daroussin #include <unistd.h> 33*61ba55bcSBaptiste Daroussin 34*61ba55bcSBaptiste Daroussin #include <bsddialog.h> 35*61ba55bcSBaptiste Daroussin #include <bsddialog_theme.h> 36*61ba55bcSBaptiste Daroussin 37*61ba55bcSBaptiste Daroussin #include "util.h" 38*61ba55bcSBaptiste Daroussin 39*61ba55bcSBaptiste Daroussin #define NO_PRINT_VALUES(rv) \ 40*61ba55bcSBaptiste Daroussin (rv == BSDDIALOG_ERROR || rv == BSDDIALOG_CANCEL || rv == BSDDIALOG_ESC) 41*61ba55bcSBaptiste Daroussin 42*61ba55bcSBaptiste Daroussin /* message */ 43*61ba55bcSBaptiste Daroussin int infobox_builder(BUILDER_ARGS) 44*61ba55bcSBaptiste Daroussin { 45*61ba55bcSBaptiste Daroussin if (argc > 0) 46*61ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 47*61ba55bcSBaptiste Daroussin 48*61ba55bcSBaptiste Daroussin return (bsddialog_infobox(conf, text, rows, cols)); 49*61ba55bcSBaptiste Daroussin } 50*61ba55bcSBaptiste Daroussin 51*61ba55bcSBaptiste Daroussin int msgbox_builder(BUILDER_ARGS) 52*61ba55bcSBaptiste Daroussin { 53*61ba55bcSBaptiste Daroussin if (argc > 0) 54*61ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 55*61ba55bcSBaptiste Daroussin 56*61ba55bcSBaptiste Daroussin return (bsddialog_msgbox(conf, text, rows, cols)); 57*61ba55bcSBaptiste Daroussin } 58*61ba55bcSBaptiste Daroussin 59*61ba55bcSBaptiste Daroussin int yesno_builder(BUILDER_ARGS) 60*61ba55bcSBaptiste Daroussin { 61*61ba55bcSBaptiste Daroussin if (argc > 0) 62*61ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 63*61ba55bcSBaptiste Daroussin 64*61ba55bcSBaptiste Daroussin return (bsddialog_yesno(conf, text, rows, cols)); 65*61ba55bcSBaptiste Daroussin } 66*61ba55bcSBaptiste Daroussin 67*61ba55bcSBaptiste Daroussin /* textbox */ 68*61ba55bcSBaptiste Daroussin int textbox_builder(BUILDER_ARGS) 69*61ba55bcSBaptiste Daroussin { 70*61ba55bcSBaptiste Daroussin if (argc > 0) 71*61ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 72*61ba55bcSBaptiste Daroussin 73*61ba55bcSBaptiste Daroussin return (bsddialog_textbox(conf, text, rows, cols)); 74*61ba55bcSBaptiste Daroussin } 75*61ba55bcSBaptiste Daroussin 76*61ba55bcSBaptiste Daroussin /* bar */ 77*61ba55bcSBaptiste Daroussin int gauge_builder(BUILDER_ARGS) 78*61ba55bcSBaptiste Daroussin { 79*61ba55bcSBaptiste Daroussin int output; 80*61ba55bcSBaptiste Daroussin unsigned int perc; 81*61ba55bcSBaptiste Daroussin 82*61ba55bcSBaptiste Daroussin perc = 0; 83*61ba55bcSBaptiste Daroussin if (argc == 1) { 84*61ba55bcSBaptiste Daroussin perc = (u_int)strtoul(argv[0], NULL, 10); 85*61ba55bcSBaptiste Daroussin perc = perc > 100 ? 100 : perc; 86*61ba55bcSBaptiste Daroussin } else if (argc > 1) { 87*61ba55bcSBaptiste Daroussin error_args(opt->name, argc - 1, argv + 1); 88*61ba55bcSBaptiste Daroussin } 89*61ba55bcSBaptiste Daroussin 90*61ba55bcSBaptiste Daroussin output = bsddialog_gauge(conf, text, rows, cols, perc, STDIN_FILENO, 91*61ba55bcSBaptiste Daroussin "XXX", "EOF"); 92*61ba55bcSBaptiste Daroussin 93*61ba55bcSBaptiste Daroussin return (output); 94*61ba55bcSBaptiste Daroussin } 95*61ba55bcSBaptiste Daroussin 96*61ba55bcSBaptiste Daroussin int mixedgauge_builder(BUILDER_ARGS) 97*61ba55bcSBaptiste Daroussin { 98*61ba55bcSBaptiste Daroussin int output, *minipercs; 99*61ba55bcSBaptiste Daroussin unsigned int i, mainperc, nminibars; 100*61ba55bcSBaptiste Daroussin const char **minilabels; 101*61ba55bcSBaptiste Daroussin 102*61ba55bcSBaptiste Daroussin if (argc < 1) 103*61ba55bcSBaptiste Daroussin exit_error(true, "%s missing <mainperc>", opt->name); 104*61ba55bcSBaptiste Daroussin if (((argc-1) % 2) != 0) 105*61ba55bcSBaptiste Daroussin exit_error(true, 106*61ba55bcSBaptiste Daroussin "bad %s pair number [<minilabel> <miniperc>]", opt->name); 107*61ba55bcSBaptiste Daroussin 108*61ba55bcSBaptiste Daroussin mainperc = (u_int)strtoul(argv[0], NULL, 10); 109*61ba55bcSBaptiste Daroussin mainperc = mainperc > 100 ? 100 : mainperc; 110*61ba55bcSBaptiste Daroussin argc--; 111*61ba55bcSBaptiste Daroussin argv++; 112*61ba55bcSBaptiste Daroussin 113*61ba55bcSBaptiste Daroussin nminibars = argc / 2; 114*61ba55bcSBaptiste Daroussin if ((minilabels = calloc(nminibars, sizeof(char*))) == NULL) 115*61ba55bcSBaptiste Daroussin exit_error(false, "Cannot allocate memory for minilabels"); 116*61ba55bcSBaptiste Daroussin if ((minipercs = calloc(nminibars, sizeof(int))) == NULL) 117*61ba55bcSBaptiste Daroussin exit_error(false, "Cannot allocate memory for minipercs"); 118*61ba55bcSBaptiste Daroussin 119*61ba55bcSBaptiste Daroussin for (i = 0; i < nminibars; i++) { 120*61ba55bcSBaptiste Daroussin minilabels[i] = argv[i * 2]; 121*61ba55bcSBaptiste Daroussin minipercs[i] = (int)strtol(argv[i * 2 + 1], NULL, 10); 122*61ba55bcSBaptiste Daroussin } 123*61ba55bcSBaptiste Daroussin 124*61ba55bcSBaptiste Daroussin output = bsddialog_mixedgauge(conf, text, rows, cols, mainperc, 125*61ba55bcSBaptiste Daroussin nminibars, minilabels, minipercs); 126*61ba55bcSBaptiste Daroussin 127*61ba55bcSBaptiste Daroussin return (output); 128*61ba55bcSBaptiste Daroussin } 129*61ba55bcSBaptiste Daroussin 130*61ba55bcSBaptiste Daroussin int pause_builder(BUILDER_ARGS) 131*61ba55bcSBaptiste Daroussin { 132*61ba55bcSBaptiste Daroussin int output; 133*61ba55bcSBaptiste Daroussin unsigned int secs; 134*61ba55bcSBaptiste Daroussin 135*61ba55bcSBaptiste Daroussin if (argc == 0) 136*61ba55bcSBaptiste Daroussin exit_error(true, "--pause missing <seconds>"); 137*61ba55bcSBaptiste Daroussin if (argc > 1) 138*61ba55bcSBaptiste Daroussin error_args(opt->name, argc - 1, argv + 1); 139*61ba55bcSBaptiste Daroussin 140*61ba55bcSBaptiste Daroussin secs = (u_int)strtoul(argv[0], NULL, 10); 141*61ba55bcSBaptiste Daroussin output = bsddialog_pause(conf, text, rows, cols, &secs); 142*61ba55bcSBaptiste Daroussin 143*61ba55bcSBaptiste Daroussin return (output); 144*61ba55bcSBaptiste Daroussin } 145*61ba55bcSBaptiste Daroussin 146*61ba55bcSBaptiste Daroussin int rangebox_builder(BUILDER_ARGS) 147*61ba55bcSBaptiste Daroussin { 148*61ba55bcSBaptiste Daroussin int output, min, max, value; 149*61ba55bcSBaptiste Daroussin 150*61ba55bcSBaptiste Daroussin if (argc < 2) 151*61ba55bcSBaptiste Daroussin exit_error(true, "--rangebox missing <min> <max> [<init>]"); 152*61ba55bcSBaptiste Daroussin if (argc > 3) 153*61ba55bcSBaptiste Daroussin error_args("--rangebox", argc - 3, argv + 3); 154*61ba55bcSBaptiste Daroussin 155*61ba55bcSBaptiste Daroussin min = (int)strtol(argv[0], NULL, 10); 156*61ba55bcSBaptiste Daroussin max = (int)strtol(argv[1], NULL, 10); 157*61ba55bcSBaptiste Daroussin 158*61ba55bcSBaptiste Daroussin if (argc == 3) { 159*61ba55bcSBaptiste Daroussin value = (int)strtol(argv[2], NULL, 10); 160*61ba55bcSBaptiste Daroussin value = value < min ? min : value; 161*61ba55bcSBaptiste Daroussin value = value > max ? max : value; 162*61ba55bcSBaptiste Daroussin } else 163*61ba55bcSBaptiste Daroussin value = min; 164*61ba55bcSBaptiste Daroussin 165*61ba55bcSBaptiste Daroussin output = bsddialog_rangebox(conf, text, rows, cols, min, max, &value); 166*61ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output) == false) 167*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%d", value); 168*61ba55bcSBaptiste Daroussin 169*61ba55bcSBaptiste Daroussin return (output); 170*61ba55bcSBaptiste Daroussin } 171*61ba55bcSBaptiste Daroussin 172*61ba55bcSBaptiste Daroussin /* date and time */ 173*61ba55bcSBaptiste Daroussin static int date(BUILDER_ARGS) 174*61ba55bcSBaptiste Daroussin { 175*61ba55bcSBaptiste Daroussin int rv; 176*61ba55bcSBaptiste Daroussin unsigned int yy, mm, dd; 177*61ba55bcSBaptiste Daroussin time_t cal; 178*61ba55bcSBaptiste Daroussin struct tm *localtm; 179*61ba55bcSBaptiste Daroussin char stringdate[1024]; 180*61ba55bcSBaptiste Daroussin 181*61ba55bcSBaptiste Daroussin time(&cal); 182*61ba55bcSBaptiste Daroussin localtm = localtime(&cal); 183*61ba55bcSBaptiste Daroussin yy = localtm->tm_year + 1900; 184*61ba55bcSBaptiste Daroussin mm = localtm->tm_mon + 1; 185*61ba55bcSBaptiste Daroussin dd = localtm->tm_mday; 186*61ba55bcSBaptiste Daroussin 187*61ba55bcSBaptiste Daroussin if (argc > 3) { 188*61ba55bcSBaptiste Daroussin error_args(opt->name, argc - 3, argv + 3); 189*61ba55bcSBaptiste Daroussin } else if (argc == 3) { 190*61ba55bcSBaptiste Daroussin /* lib checks/sets max and min */ 191*61ba55bcSBaptiste Daroussin dd = (u_int)strtoul(argv[0], NULL, 10); 192*61ba55bcSBaptiste Daroussin mm = (u_int)strtoul(argv[1], NULL, 10); 193*61ba55bcSBaptiste Daroussin yy = (u_int)strtoul(argv[2], NULL, 10); 194*61ba55bcSBaptiste Daroussin } 195*61ba55bcSBaptiste Daroussin 196*61ba55bcSBaptiste Daroussin if (strcmp(opt->name, "--datebox") == 0) 197*61ba55bcSBaptiste Daroussin rv = bsddialog_datebox(conf, text, rows, cols, &yy, &mm, &dd); 198*61ba55bcSBaptiste Daroussin else 199*61ba55bcSBaptiste Daroussin rv = bsddialog_calendar(conf, text, rows, cols, &yy, &mm, &dd); 200*61ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(rv)) 201*61ba55bcSBaptiste Daroussin return (rv); 202*61ba55bcSBaptiste Daroussin 203*61ba55bcSBaptiste Daroussin if (opt->date_fmt != NULL) { 204*61ba55bcSBaptiste Daroussin time(&cal); 205*61ba55bcSBaptiste Daroussin localtm = localtime(&cal); 206*61ba55bcSBaptiste Daroussin localtm->tm_year = yy - 1900; 207*61ba55bcSBaptiste Daroussin localtm->tm_mon = mm - 1; 208*61ba55bcSBaptiste Daroussin localtm->tm_mday = dd; 209*61ba55bcSBaptiste Daroussin strftime(stringdate, 1024, opt->date_fmt, localtm); 210*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", stringdate); 211*61ba55bcSBaptiste Daroussin } else if (opt->bikeshed && ~dd & 1) { 212*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%u/%u/%u", dd, mm, yy); 213*61ba55bcSBaptiste Daroussin } else { 214*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%02u/%02u/%u", dd, mm, yy); 215*61ba55bcSBaptiste Daroussin } 216*61ba55bcSBaptiste Daroussin 217*61ba55bcSBaptiste Daroussin return (rv); 218*61ba55bcSBaptiste Daroussin } 219*61ba55bcSBaptiste Daroussin 220*61ba55bcSBaptiste Daroussin int calendar_builder(BUILDER_ARGS) 221*61ba55bcSBaptiste Daroussin { 222*61ba55bcSBaptiste Daroussin /* Use height autosizing with rows = 2. Documented in bsddialog(1). 223*61ba55bcSBaptiste Daroussin * 224*61ba55bcSBaptiste Daroussin * f_dialog_calendar_size() in bsdconfig/share/dialog.subr:1352 225*61ba55bcSBaptiste Daroussin * computes height 2 for `dialog --calendar', called by: 226*61ba55bcSBaptiste Daroussin * 1) f_dialog_input_expire_password() in 227*61ba55bcSBaptiste Daroussin * bsdconfig/usermgmt/share/user_input.subr:517 and 228*61ba55bcSBaptiste Daroussin * 2) f_dialog_input_expire_account() in 229*61ba55bcSBaptiste Daroussin * bsdconfig/usermgmt/share/user_input.subr:660. 230*61ba55bcSBaptiste Daroussin * 231*61ba55bcSBaptiste Daroussin * Then use height autosizing with 2 that is min height like dialog. 232*61ba55bcSBaptiste Daroussin */ 233*61ba55bcSBaptiste Daroussin if (rows == 2) 234*61ba55bcSBaptiste Daroussin rows = 0; 235*61ba55bcSBaptiste Daroussin 236*61ba55bcSBaptiste Daroussin return (date(conf, text, rows, cols, argc, argv, opt)); 237*61ba55bcSBaptiste Daroussin } 238*61ba55bcSBaptiste Daroussin 239*61ba55bcSBaptiste Daroussin int datebox_builder(BUILDER_ARGS) 240*61ba55bcSBaptiste Daroussin { 241*61ba55bcSBaptiste Daroussin return (date(conf, text, rows, cols, argc, argv, opt)); 242*61ba55bcSBaptiste Daroussin } 243*61ba55bcSBaptiste Daroussin 244*61ba55bcSBaptiste Daroussin int timebox_builder(BUILDER_ARGS) 245*61ba55bcSBaptiste Daroussin { 246*61ba55bcSBaptiste Daroussin int output; 247*61ba55bcSBaptiste Daroussin unsigned int hh, mm, ss; 248*61ba55bcSBaptiste Daroussin time_t clock; 249*61ba55bcSBaptiste Daroussin struct tm *localtm; 250*61ba55bcSBaptiste Daroussin char stringtime[1024]; 251*61ba55bcSBaptiste Daroussin 252*61ba55bcSBaptiste Daroussin time(&clock); 253*61ba55bcSBaptiste Daroussin localtm = localtime(&clock); 254*61ba55bcSBaptiste Daroussin hh = localtm->tm_hour; 255*61ba55bcSBaptiste Daroussin mm = localtm->tm_min; 256*61ba55bcSBaptiste Daroussin ss = localtm->tm_sec; 257*61ba55bcSBaptiste Daroussin 258*61ba55bcSBaptiste Daroussin if (argc > 3) { 259*61ba55bcSBaptiste Daroussin error_args("--timebox", argc - 3, argv + 3); 260*61ba55bcSBaptiste Daroussin } else if (argc == 3) { 261*61ba55bcSBaptiste Daroussin hh = (u_int)strtoul(argv[0], NULL, 10); 262*61ba55bcSBaptiste Daroussin mm = (u_int)strtoul(argv[1], NULL, 10); 263*61ba55bcSBaptiste Daroussin ss = (u_int)strtoul(argv[2], NULL, 10); 264*61ba55bcSBaptiste Daroussin } 265*61ba55bcSBaptiste Daroussin 266*61ba55bcSBaptiste Daroussin output = bsddialog_timebox(conf, text, rows, cols, &hh, &mm, &ss); 267*61ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output)) 268*61ba55bcSBaptiste Daroussin return (output); 269*61ba55bcSBaptiste Daroussin 270*61ba55bcSBaptiste Daroussin if (opt->time_fmt != NULL) { 271*61ba55bcSBaptiste Daroussin time(&clock); 272*61ba55bcSBaptiste Daroussin localtm = localtime(&clock); 273*61ba55bcSBaptiste Daroussin localtm->tm_hour = hh; 274*61ba55bcSBaptiste Daroussin localtm->tm_min = mm; 275*61ba55bcSBaptiste Daroussin localtm->tm_sec = ss; 276*61ba55bcSBaptiste Daroussin strftime(stringtime, 1024, opt->time_fmt, localtm); 277*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", stringtime); 278*61ba55bcSBaptiste Daroussin } else if (opt->bikeshed && ~ss & 1) { 279*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%u:%u:%u", hh, mm, ss); 280*61ba55bcSBaptiste Daroussin } else { 281*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%02u:%02u:%02u", hh, mm, ss); 282*61ba55bcSBaptiste Daroussin } 283*61ba55bcSBaptiste Daroussin 284*61ba55bcSBaptiste Daroussin return (output); 285*61ba55bcSBaptiste Daroussin } 286*61ba55bcSBaptiste Daroussin 287*61ba55bcSBaptiste Daroussin /* menu */ 288*61ba55bcSBaptiste Daroussin static void 289*61ba55bcSBaptiste Daroussin get_menu_items(int argc, char **argv, bool setprefix, bool setdepth, 290*61ba55bcSBaptiste Daroussin bool setname, bool setdesc, bool setstatus, bool sethelp, 291*61ba55bcSBaptiste Daroussin unsigned int *nitems, struct bsddialog_menuitem **items, int *focusitem, 292*61ba55bcSBaptiste Daroussin struct options *opt) 293*61ba55bcSBaptiste Daroussin { 294*61ba55bcSBaptiste Daroussin unsigned int i, j, sizeitem; 295*61ba55bcSBaptiste Daroussin 296*61ba55bcSBaptiste Daroussin *focusitem = -1; 297*61ba55bcSBaptiste Daroussin 298*61ba55bcSBaptiste Daroussin sizeitem = 0; 299*61ba55bcSBaptiste Daroussin sizeitem += setprefix ? 1 : 0; 300*61ba55bcSBaptiste Daroussin sizeitem += setdepth ? 1 : 0; 301*61ba55bcSBaptiste Daroussin sizeitem += setname ? 1 : 0; 302*61ba55bcSBaptiste Daroussin sizeitem += setdesc ? 1 : 0; 303*61ba55bcSBaptiste Daroussin sizeitem += setstatus ? 1 : 0; 304*61ba55bcSBaptiste Daroussin sizeitem += sethelp ? 1 : 0; 305*61ba55bcSBaptiste Daroussin if ((argc % sizeitem) != 0) 306*61ba55bcSBaptiste Daroussin exit_error(true, "%s bad arguments items number", opt->name); 307*61ba55bcSBaptiste Daroussin 308*61ba55bcSBaptiste Daroussin *nitems = argc / sizeitem; 309*61ba55bcSBaptiste Daroussin *items = calloc(*nitems, sizeof(struct bsddialog_menuitem)); 310*61ba55bcSBaptiste Daroussin if (items == NULL) 311*61ba55bcSBaptiste Daroussin exit_error(false, "%s cannot allocate items", opt->name); 312*61ba55bcSBaptiste Daroussin 313*61ba55bcSBaptiste Daroussin j = 0; 314*61ba55bcSBaptiste Daroussin for (i = 0; i < *nitems; i++) { 315*61ba55bcSBaptiste Daroussin (*items)[i].prefix = setprefix ? argv[j++] : ""; 316*61ba55bcSBaptiste Daroussin (*items)[i].depth = setdepth ? 317*61ba55bcSBaptiste Daroussin (u_int)strtoul(argv[j++], NULL, 0) : 0; 318*61ba55bcSBaptiste Daroussin (*items)[i].name = setname ? argv[j++] : ""; 319*61ba55bcSBaptiste Daroussin (*items)[i].desc = setdesc ? argv[j++] : ""; 320*61ba55bcSBaptiste Daroussin if (setstatus) { 321*61ba55bcSBaptiste Daroussin if (strcasecmp(argv[j], "on") == 0) 322*61ba55bcSBaptiste Daroussin (*items)[i].on = true; 323*61ba55bcSBaptiste Daroussin else if (strcasecmp(argv[j], "off") == 0) 324*61ba55bcSBaptiste Daroussin (*items)[i].on = false; 325*61ba55bcSBaptiste Daroussin else 326*61ba55bcSBaptiste Daroussin exit_error(true, 327*61ba55bcSBaptiste Daroussin "\"%s\" (item %i) invalid status \"%s\"", 328*61ba55bcSBaptiste Daroussin (*items)[i].name, i+1, argv[j]); 329*61ba55bcSBaptiste Daroussin j++; 330*61ba55bcSBaptiste Daroussin } else 331*61ba55bcSBaptiste Daroussin (*items)[i].on = false; 332*61ba55bcSBaptiste Daroussin (*items)[i].bottomdesc = sethelp ? argv[j++] : ""; 333*61ba55bcSBaptiste Daroussin 334*61ba55bcSBaptiste Daroussin if (opt->item_default != NULL && *focusitem == -1) 335*61ba55bcSBaptiste Daroussin if (strcmp((*items)[i].name, opt->item_default) == 0) 336*61ba55bcSBaptiste Daroussin *focusitem = i; 337*61ba55bcSBaptiste Daroussin } 338*61ba55bcSBaptiste Daroussin } 339*61ba55bcSBaptiste Daroussin 340*61ba55bcSBaptiste Daroussin static void 341*61ba55bcSBaptiste Daroussin print_menu_items(int output, int nitems, struct bsddialog_menuitem *items, 342*61ba55bcSBaptiste Daroussin int focusitem, struct options *opt) 343*61ba55bcSBaptiste Daroussin { 344*61ba55bcSBaptiste Daroussin bool sep, sepbefore, sepafter, sepsecond, toquote, ismenu, ischecklist; 345*61ba55bcSBaptiste Daroussin int i; 346*61ba55bcSBaptiste Daroussin char quotech; 347*61ba55bcSBaptiste Daroussin const char *focusname, *sepstr; 348*61ba55bcSBaptiste Daroussin 349*61ba55bcSBaptiste Daroussin ismenu = (strcmp(opt->name, "--menu") == 0) ? true : false; 350*61ba55bcSBaptiste Daroussin ischecklist = (strcmp(opt->name, "--checklist") == 0) ? true : false; 351*61ba55bcSBaptiste Daroussin sep = false; 352*61ba55bcSBaptiste Daroussin quotech = opt->item_singlequote ? '\'' : '"'; 353*61ba55bcSBaptiste Daroussin 354*61ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output)) 355*61ba55bcSBaptiste Daroussin return; 356*61ba55bcSBaptiste Daroussin 357*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP) { 358*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "HELP "); 359*61ba55bcSBaptiste Daroussin 360*61ba55bcSBaptiste Daroussin if (focusitem >= 0) { 361*61ba55bcSBaptiste Daroussin focusname = items[focusitem].name; 362*61ba55bcSBaptiste Daroussin if (opt->item_bottomdesc && 363*61ba55bcSBaptiste Daroussin opt->help_print_item_name == false) 364*61ba55bcSBaptiste Daroussin focusname = items[focusitem].bottomdesc; 365*61ba55bcSBaptiste Daroussin 366*61ba55bcSBaptiste Daroussin toquote = false; 367*61ba55bcSBaptiste Daroussin if (strchr(focusname, ' ') != NULL) { 368*61ba55bcSBaptiste Daroussin toquote = opt->item_always_quote; 369*61ba55bcSBaptiste Daroussin if (ismenu == false && 370*61ba55bcSBaptiste Daroussin opt->item_output_sepnl == false) 371*61ba55bcSBaptiste Daroussin toquote = true; 372*61ba55bcSBaptiste Daroussin } 373*61ba55bcSBaptiste Daroussin if (toquote) { 374*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%c%s%c", 375*61ba55bcSBaptiste Daroussin quotech, focusname, quotech); 376*61ba55bcSBaptiste Daroussin } else 377*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", focusname); 378*61ba55bcSBaptiste Daroussin } 379*61ba55bcSBaptiste Daroussin 380*61ba55bcSBaptiste Daroussin if (ismenu || opt->help_print_items == false) 381*61ba55bcSBaptiste Daroussin return; 382*61ba55bcSBaptiste Daroussin sep = true; 383*61ba55bcSBaptiste Daroussin } 384*61ba55bcSBaptiste Daroussin 385*61ba55bcSBaptiste Daroussin sepbefore = false; 386*61ba55bcSBaptiste Daroussin sepsecond = false; 387*61ba55bcSBaptiste Daroussin if ((sepstr = opt->item_output_sep) == NULL) { 388*61ba55bcSBaptiste Daroussin if (opt->item_output_sepnl) 389*61ba55bcSBaptiste Daroussin sepstr = "\n"; 390*61ba55bcSBaptiste Daroussin else { 391*61ba55bcSBaptiste Daroussin sepstr = " "; 392*61ba55bcSBaptiste Daroussin sepsecond = true; 393*61ba55bcSBaptiste Daroussin } 394*61ba55bcSBaptiste Daroussin } else 395*61ba55bcSBaptiste Daroussin sepbefore = true; 396*61ba55bcSBaptiste Daroussin 397*61ba55bcSBaptiste Daroussin sepafter = false; 398*61ba55bcSBaptiste Daroussin if (opt->item_output_sepnl) { 399*61ba55bcSBaptiste Daroussin sepbefore = false; 400*61ba55bcSBaptiste Daroussin sepafter = true; 401*61ba55bcSBaptiste Daroussin } 402*61ba55bcSBaptiste Daroussin 403*61ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 404*61ba55bcSBaptiste Daroussin if (items[i].on == false) 405*61ba55bcSBaptiste Daroussin continue; 406*61ba55bcSBaptiste Daroussin 407*61ba55bcSBaptiste Daroussin if (sep || sepbefore) 408*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", sepstr); 409*61ba55bcSBaptiste Daroussin sep = false; 410*61ba55bcSBaptiste Daroussin if (sepsecond) 411*61ba55bcSBaptiste Daroussin sep = true; 412*61ba55bcSBaptiste Daroussin 413*61ba55bcSBaptiste Daroussin toquote = false; 414*61ba55bcSBaptiste Daroussin if (strchr(items[i].name, ' ') != NULL) { 415*61ba55bcSBaptiste Daroussin toquote = opt->item_always_quote; 416*61ba55bcSBaptiste Daroussin if (ischecklist && opt->item_output_sepnl == false) 417*61ba55bcSBaptiste Daroussin toquote = true; 418*61ba55bcSBaptiste Daroussin } 419*61ba55bcSBaptiste Daroussin if (toquote) 420*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%c%s%c", 421*61ba55bcSBaptiste Daroussin quotech, items[i].name, quotech); 422*61ba55bcSBaptiste Daroussin else 423*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", items[i].name); 424*61ba55bcSBaptiste Daroussin 425*61ba55bcSBaptiste Daroussin if (sepafter) 426*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", sepstr); 427*61ba55bcSBaptiste Daroussin } 428*61ba55bcSBaptiste Daroussin } 429*61ba55bcSBaptiste Daroussin 430*61ba55bcSBaptiste Daroussin int checklist_builder(BUILDER_ARGS) 431*61ba55bcSBaptiste Daroussin { 432*61ba55bcSBaptiste Daroussin int output, focusitem; 433*61ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 434*61ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 435*61ba55bcSBaptiste Daroussin 436*61ba55bcSBaptiste Daroussin if (argc < 1) 437*61ba55bcSBaptiste Daroussin exit_error(true, "--checklist missing <menurows>"); 438*61ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 439*61ba55bcSBaptiste Daroussin 440*61ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true, 441*61ba55bcSBaptiste Daroussin true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt); 442*61ba55bcSBaptiste Daroussin 443*61ba55bcSBaptiste Daroussin output = bsddialog_checklist(conf, text, rows, cols, menurows, nitems, 444*61ba55bcSBaptiste Daroussin items, &focusitem); 445*61ba55bcSBaptiste Daroussin 446*61ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 447*61ba55bcSBaptiste Daroussin free(items); 448*61ba55bcSBaptiste Daroussin 449*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 450*61ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 451*61ba55bcSBaptiste Daroussin 452*61ba55bcSBaptiste Daroussin return (output); 453*61ba55bcSBaptiste Daroussin } 454*61ba55bcSBaptiste Daroussin 455*61ba55bcSBaptiste Daroussin int menu_builder(BUILDER_ARGS) 456*61ba55bcSBaptiste Daroussin { 457*61ba55bcSBaptiste Daroussin int output, focusitem; 458*61ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 459*61ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 460*61ba55bcSBaptiste Daroussin 461*61ba55bcSBaptiste Daroussin if (argc < 1) 462*61ba55bcSBaptiste Daroussin exit_error(true, "--menu missing <menurows>"); 463*61ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 464*61ba55bcSBaptiste Daroussin 465*61ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true, 466*61ba55bcSBaptiste Daroussin true, false, opt->item_bottomdesc, &nitems, &items, &focusitem, 467*61ba55bcSBaptiste Daroussin opt); 468*61ba55bcSBaptiste Daroussin 469*61ba55bcSBaptiste Daroussin output = bsddialog_menu(conf, text, rows, cols, menurows, nitems, 470*61ba55bcSBaptiste Daroussin items, &focusitem); 471*61ba55bcSBaptiste Daroussin 472*61ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 473*61ba55bcSBaptiste Daroussin free(items); 474*61ba55bcSBaptiste Daroussin 475*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 476*61ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 477*61ba55bcSBaptiste Daroussin 478*61ba55bcSBaptiste Daroussin return (output); 479*61ba55bcSBaptiste Daroussin } 480*61ba55bcSBaptiste Daroussin 481*61ba55bcSBaptiste Daroussin int radiolist_builder(BUILDER_ARGS) 482*61ba55bcSBaptiste Daroussin { 483*61ba55bcSBaptiste Daroussin int output, focusitem; 484*61ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 485*61ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 486*61ba55bcSBaptiste Daroussin 487*61ba55bcSBaptiste Daroussin if (argc < 1) 488*61ba55bcSBaptiste Daroussin exit_error(true, "--radiolist missing <menurows>"); 489*61ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 490*61ba55bcSBaptiste Daroussin 491*61ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true, 492*61ba55bcSBaptiste Daroussin true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt); 493*61ba55bcSBaptiste Daroussin 494*61ba55bcSBaptiste Daroussin output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems, 495*61ba55bcSBaptiste Daroussin items, &focusitem); 496*61ba55bcSBaptiste Daroussin 497*61ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 498*61ba55bcSBaptiste Daroussin free(items); 499*61ba55bcSBaptiste Daroussin 500*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 501*61ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 502*61ba55bcSBaptiste Daroussin 503*61ba55bcSBaptiste Daroussin return (output); 504*61ba55bcSBaptiste Daroussin } 505*61ba55bcSBaptiste Daroussin 506*61ba55bcSBaptiste Daroussin int treeview_builder(BUILDER_ARGS) 507*61ba55bcSBaptiste Daroussin { 508*61ba55bcSBaptiste Daroussin int output, focusitem; 509*61ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 510*61ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 511*61ba55bcSBaptiste Daroussin 512*61ba55bcSBaptiste Daroussin if (argc < 1) 513*61ba55bcSBaptiste Daroussin exit_error(true, "--treeview missing <menurows>"); 514*61ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 515*61ba55bcSBaptiste Daroussin 516*61ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, true, true, true, true, 517*61ba55bcSBaptiste Daroussin opt->item_bottomdesc, &nitems, &items, &focusitem, opt); 518*61ba55bcSBaptiste Daroussin 519*61ba55bcSBaptiste Daroussin conf->menu.no_name = true; 520*61ba55bcSBaptiste Daroussin conf->menu.align_left = true; 521*61ba55bcSBaptiste Daroussin 522*61ba55bcSBaptiste Daroussin output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems, 523*61ba55bcSBaptiste Daroussin items, &focusitem); 524*61ba55bcSBaptiste Daroussin 525*61ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 526*61ba55bcSBaptiste Daroussin free(items); 527*61ba55bcSBaptiste Daroussin 528*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 529*61ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 530*61ba55bcSBaptiste Daroussin 531*61ba55bcSBaptiste Daroussin return (output); 532*61ba55bcSBaptiste Daroussin } 533*61ba55bcSBaptiste Daroussin 534*61ba55bcSBaptiste Daroussin /* form */ 535*61ba55bcSBaptiste Daroussin static void 536*61ba55bcSBaptiste Daroussin print_form_items(int output, int nitems, struct bsddialog_formitem *items, 537*61ba55bcSBaptiste Daroussin int focusitem, struct options *opt) 538*61ba55bcSBaptiste Daroussin { 539*61ba55bcSBaptiste Daroussin int i; 540*61ba55bcSBaptiste Daroussin const char *helpname; 541*61ba55bcSBaptiste Daroussin 542*61ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output)) 543*61ba55bcSBaptiste Daroussin return; 544*61ba55bcSBaptiste Daroussin 545*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP) { 546*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "HELP"); 547*61ba55bcSBaptiste Daroussin if (focusitem >= 0) { 548*61ba55bcSBaptiste Daroussin helpname = items[focusitem].label; 549*61ba55bcSBaptiste Daroussin if (opt->item_bottomdesc && 550*61ba55bcSBaptiste Daroussin opt->help_print_item_name == false) 551*61ba55bcSBaptiste Daroussin helpname = items[focusitem].bottomdesc; 552*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, " %s", helpname); 553*61ba55bcSBaptiste Daroussin } 554*61ba55bcSBaptiste Daroussin if(opt->help_print_items == false) 555*61ba55bcSBaptiste Daroussin return; 556*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "\n"); 557*61ba55bcSBaptiste Daroussin } 558*61ba55bcSBaptiste Daroussin 559*61ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 560*61ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s\n", items[i].value); 561*61ba55bcSBaptiste Daroussin free(items[i].value); 562*61ba55bcSBaptiste Daroussin } 563*61ba55bcSBaptiste Daroussin } 564*61ba55bcSBaptiste Daroussin 565*61ba55bcSBaptiste Daroussin int form_builder(BUILDER_ARGS) 566*61ba55bcSBaptiste Daroussin { 567*61ba55bcSBaptiste Daroussin int output, fieldlen, valuelen, focusitem; 568*61ba55bcSBaptiste Daroussin unsigned int i, j, flags, formheight, nitems, sizeitem; 569*61ba55bcSBaptiste Daroussin struct bsddialog_formitem *items; 570*61ba55bcSBaptiste Daroussin 571*61ba55bcSBaptiste Daroussin if (argc < 1) 572*61ba55bcSBaptiste Daroussin exit_error(true, "--form missing <formheight>"); 573*61ba55bcSBaptiste Daroussin formheight = (u_int)strtoul(argv[0], NULL, 10); 574*61ba55bcSBaptiste Daroussin 575*61ba55bcSBaptiste Daroussin argc--; 576*61ba55bcSBaptiste Daroussin argv++; 577*61ba55bcSBaptiste Daroussin sizeitem = opt->item_bottomdesc ? 9 : 8; 578*61ba55bcSBaptiste Daroussin if (argc % sizeitem != 0) 579*61ba55bcSBaptiste Daroussin exit_error(true, "--form bad number of arguments items"); 580*61ba55bcSBaptiste Daroussin 581*61ba55bcSBaptiste Daroussin nitems = argc / sizeitem; 582*61ba55bcSBaptiste Daroussin if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) 583*61ba55bcSBaptiste Daroussin exit_error(false, "cannot allocate memory for form items"); 584*61ba55bcSBaptiste Daroussin j = 0; 585*61ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 586*61ba55bcSBaptiste Daroussin items[i].label = argv[j++]; 587*61ba55bcSBaptiste Daroussin items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); 588*61ba55bcSBaptiste Daroussin items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); 589*61ba55bcSBaptiste Daroussin items[i].init = argv[j++]; 590*61ba55bcSBaptiste Daroussin items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); 591*61ba55bcSBaptiste Daroussin items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); 592*61ba55bcSBaptiste Daroussin 593*61ba55bcSBaptiste Daroussin fieldlen = (int)strtol(argv[j++], NULL, 10); 594*61ba55bcSBaptiste Daroussin items[i].fieldlen = abs(fieldlen); 595*61ba55bcSBaptiste Daroussin 596*61ba55bcSBaptiste Daroussin valuelen = (int)strtol(argv[j++], NULL, 10); 597*61ba55bcSBaptiste Daroussin items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen; 598*61ba55bcSBaptiste Daroussin 599*61ba55bcSBaptiste Daroussin flags = (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0); 600*61ba55bcSBaptiste Daroussin items[i].flags = flags; 601*61ba55bcSBaptiste Daroussin 602*61ba55bcSBaptiste Daroussin items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : ""; 603*61ba55bcSBaptiste Daroussin } 604*61ba55bcSBaptiste Daroussin 605*61ba55bcSBaptiste Daroussin focusitem = -1; 606*61ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, formheight, nitems, 607*61ba55bcSBaptiste Daroussin items, &focusitem); 608*61ba55bcSBaptiste Daroussin print_form_items(output, nitems, items, focusitem, opt); 609*61ba55bcSBaptiste Daroussin free(items); 610*61ba55bcSBaptiste Daroussin 611*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 612*61ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 613*61ba55bcSBaptiste Daroussin 614*61ba55bcSBaptiste Daroussin return (output); 615*61ba55bcSBaptiste Daroussin } 616*61ba55bcSBaptiste Daroussin 617*61ba55bcSBaptiste Daroussin int inputbox_builder(BUILDER_ARGS) 618*61ba55bcSBaptiste Daroussin { 619*61ba55bcSBaptiste Daroussin int output; 620*61ba55bcSBaptiste Daroussin struct bsddialog_formitem item; 621*61ba55bcSBaptiste Daroussin 622*61ba55bcSBaptiste Daroussin if (argc > 1) 623*61ba55bcSBaptiste Daroussin error_args("--inputbox", argc - 1, argv + 1); 624*61ba55bcSBaptiste Daroussin 625*61ba55bcSBaptiste Daroussin item.label = ""; 626*61ba55bcSBaptiste Daroussin item.ylabel = 0; 627*61ba55bcSBaptiste Daroussin item.xlabel = 0; 628*61ba55bcSBaptiste Daroussin item.init = argc > 0 ? argv[0] : ""; 629*61ba55bcSBaptiste Daroussin item.yfield = 0; 630*61ba55bcSBaptiste Daroussin item.xfield = 0; 631*61ba55bcSBaptiste Daroussin item.fieldlen = 1; 632*61ba55bcSBaptiste Daroussin item.maxvaluelen = opt->max_input_form; 633*61ba55bcSBaptiste Daroussin item.flags = BSDDIALOG_FIELDNOCOLOR; 634*61ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDCURSOREND; 635*61ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDEXTEND; 636*61ba55bcSBaptiste Daroussin item.bottomdesc = ""; 637*61ba55bcSBaptiste Daroussin 638*61ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL); 639*61ba55bcSBaptiste Daroussin print_form_items(output, 1, &item, -1, opt); 640*61ba55bcSBaptiste Daroussin 641*61ba55bcSBaptiste Daroussin return (output); 642*61ba55bcSBaptiste Daroussin } 643*61ba55bcSBaptiste Daroussin 644*61ba55bcSBaptiste Daroussin int mixedform_builder(BUILDER_ARGS) 645*61ba55bcSBaptiste Daroussin { 646*61ba55bcSBaptiste Daroussin int output, focusitem; 647*61ba55bcSBaptiste Daroussin unsigned int i, j, formheight, nitems, sizeitem; 648*61ba55bcSBaptiste Daroussin struct bsddialog_formitem *items; 649*61ba55bcSBaptiste Daroussin 650*61ba55bcSBaptiste Daroussin if (argc < 1) 651*61ba55bcSBaptiste Daroussin exit_error(true, "--mixedform missing <formheight>"); 652*61ba55bcSBaptiste Daroussin formheight = (u_int)strtoul(argv[0], NULL, 10); 653*61ba55bcSBaptiste Daroussin 654*61ba55bcSBaptiste Daroussin argc--; 655*61ba55bcSBaptiste Daroussin argv++; 656*61ba55bcSBaptiste Daroussin sizeitem = opt->item_bottomdesc ? 10 : 9; 657*61ba55bcSBaptiste Daroussin if (argc % sizeitem != 0) 658*61ba55bcSBaptiste Daroussin exit_error(true, "--mixedform bad number of arguments items"); 659*61ba55bcSBaptiste Daroussin 660*61ba55bcSBaptiste Daroussin nitems = argc / sizeitem; 661*61ba55bcSBaptiste Daroussin if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) 662*61ba55bcSBaptiste Daroussin exit_error(false, "cannot allocate memory for form items"); 663*61ba55bcSBaptiste Daroussin j = 0; 664*61ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 665*61ba55bcSBaptiste Daroussin items[i].label = argv[j++]; 666*61ba55bcSBaptiste Daroussin items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); 667*61ba55bcSBaptiste Daroussin items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); 668*61ba55bcSBaptiste Daroussin items[i].init = argv[j++]; 669*61ba55bcSBaptiste Daroussin items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); 670*61ba55bcSBaptiste Daroussin items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); 671*61ba55bcSBaptiste Daroussin items[i].fieldlen = (u_int)strtoul(argv[j++], NULL, 10); 672*61ba55bcSBaptiste Daroussin items[i].maxvaluelen = (u_int)strtoul(argv[j++], NULL, 10); 673*61ba55bcSBaptiste Daroussin items[i].flags = (u_int)strtoul(argv[j++], NULL, 10); 674*61ba55bcSBaptiste Daroussin items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : ""; 675*61ba55bcSBaptiste Daroussin } 676*61ba55bcSBaptiste Daroussin 677*61ba55bcSBaptiste Daroussin focusitem = -1; 678*61ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, formheight, nitems, 679*61ba55bcSBaptiste Daroussin items, &focusitem); 680*61ba55bcSBaptiste Daroussin print_form_items(output, nitems, items, focusitem, opt); 681*61ba55bcSBaptiste Daroussin free(items); 682*61ba55bcSBaptiste Daroussin 683*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 684*61ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 685*61ba55bcSBaptiste Daroussin 686*61ba55bcSBaptiste Daroussin return (output); 687*61ba55bcSBaptiste Daroussin } 688*61ba55bcSBaptiste Daroussin 689*61ba55bcSBaptiste Daroussin int passwordbox_builder(BUILDER_ARGS) 690*61ba55bcSBaptiste Daroussin { 691*61ba55bcSBaptiste Daroussin int output; 692*61ba55bcSBaptiste Daroussin struct bsddialog_formitem item; 693*61ba55bcSBaptiste Daroussin 694*61ba55bcSBaptiste Daroussin if (argc > 1) 695*61ba55bcSBaptiste Daroussin error_args("--passwordbox", argc - 1, argv + 1); 696*61ba55bcSBaptiste Daroussin 697*61ba55bcSBaptiste Daroussin item.label = ""; 698*61ba55bcSBaptiste Daroussin item.ylabel = 0; 699*61ba55bcSBaptiste Daroussin item.xlabel = 0; 700*61ba55bcSBaptiste Daroussin item.init = argc > 0 ? argv[0] : ""; 701*61ba55bcSBaptiste Daroussin item.yfield = 0; 702*61ba55bcSBaptiste Daroussin item.xfield = 0; 703*61ba55bcSBaptiste Daroussin item.fieldlen = 1; 704*61ba55bcSBaptiste Daroussin item.maxvaluelen = opt->max_input_form; 705*61ba55bcSBaptiste Daroussin item.flags = BSDDIALOG_FIELDHIDDEN; 706*61ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDNOCOLOR; 707*61ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDCURSOREND; 708*61ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDEXTEND; 709*61ba55bcSBaptiste Daroussin item.bottomdesc = ""; 710*61ba55bcSBaptiste Daroussin 711*61ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL); 712*61ba55bcSBaptiste Daroussin print_form_items(output, 1, &item, -1, opt); 713*61ba55bcSBaptiste Daroussin 714*61ba55bcSBaptiste Daroussin return (output); 715*61ba55bcSBaptiste Daroussin } 716*61ba55bcSBaptiste Daroussin 717*61ba55bcSBaptiste Daroussin int passwordform_builder(BUILDER_ARGS) 718*61ba55bcSBaptiste Daroussin { 719*61ba55bcSBaptiste Daroussin int output, fieldlen, valuelen, focusitem; 720*61ba55bcSBaptiste Daroussin unsigned int i, j, flags, formheight, nitems, sizeitem; 721*61ba55bcSBaptiste Daroussin struct bsddialog_formitem *items; 722*61ba55bcSBaptiste Daroussin 723*61ba55bcSBaptiste Daroussin if (argc < 1) 724*61ba55bcSBaptiste Daroussin exit_error(true, "--passwordform missing <formheight>"); 725*61ba55bcSBaptiste Daroussin formheight = (u_int)strtoul(argv[0], NULL, 10); 726*61ba55bcSBaptiste Daroussin 727*61ba55bcSBaptiste Daroussin argc--; 728*61ba55bcSBaptiste Daroussin argv++; 729*61ba55bcSBaptiste Daroussin sizeitem = opt->item_bottomdesc ? 9 : 8; 730*61ba55bcSBaptiste Daroussin if (argc % sizeitem != 0) 731*61ba55bcSBaptiste Daroussin exit_error(true, "--passwordform bad arguments items number"); 732*61ba55bcSBaptiste Daroussin 733*61ba55bcSBaptiste Daroussin flags = BSDDIALOG_FIELDHIDDEN; 734*61ba55bcSBaptiste Daroussin nitems = argc / sizeitem; 735*61ba55bcSBaptiste Daroussin if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) 736*61ba55bcSBaptiste Daroussin exit_error(false, "cannot allocate memory for form items"); 737*61ba55bcSBaptiste Daroussin j = 0; 738*61ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 739*61ba55bcSBaptiste Daroussin items[i].label = argv[j++]; 740*61ba55bcSBaptiste Daroussin items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); 741*61ba55bcSBaptiste Daroussin items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); 742*61ba55bcSBaptiste Daroussin items[i].init = argv[j++]; 743*61ba55bcSBaptiste Daroussin items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); 744*61ba55bcSBaptiste Daroussin items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); 745*61ba55bcSBaptiste Daroussin 746*61ba55bcSBaptiste Daroussin fieldlen = (int)strtol(argv[j++], NULL, 10); 747*61ba55bcSBaptiste Daroussin items[i].fieldlen = abs(fieldlen); 748*61ba55bcSBaptiste Daroussin 749*61ba55bcSBaptiste Daroussin valuelen = (int)strtol(argv[j++], NULL, 10); 750*61ba55bcSBaptiste Daroussin items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen; 751*61ba55bcSBaptiste Daroussin 752*61ba55bcSBaptiste Daroussin flags |= (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0); 753*61ba55bcSBaptiste Daroussin items[i].flags = flags; 754*61ba55bcSBaptiste Daroussin 755*61ba55bcSBaptiste Daroussin items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : ""; 756*61ba55bcSBaptiste Daroussin } 757*61ba55bcSBaptiste Daroussin 758*61ba55bcSBaptiste Daroussin focusitem = -1; 759*61ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, formheight, nitems, 760*61ba55bcSBaptiste Daroussin items, &focusitem); 761*61ba55bcSBaptiste Daroussin print_form_items(output, nitems, items, focusitem, opt); 762*61ba55bcSBaptiste Daroussin free(items); 763*61ba55bcSBaptiste Daroussin 764*61ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 765*61ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 766*61ba55bcSBaptiste Daroussin 767*61ba55bcSBaptiste Daroussin return (output); 768*61ba55bcSBaptiste Daroussin } 769