161ba55bcSBaptiste Daroussin /*- 261ba55bcSBaptiste Daroussin * SPDX-License-Identifier: BSD-2-Clause 361ba55bcSBaptiste Daroussin * 4a6d8be45SAlfonso S. Siciliano * Copyright (c) 2021-2024 Alfonso Sabato Siciliano 561ba55bcSBaptiste Daroussin * 661ba55bcSBaptiste Daroussin * Redistribution and use in source and binary forms, with or without 761ba55bcSBaptiste Daroussin * modification, are permitted provided that the following conditions 861ba55bcSBaptiste Daroussin * are met: 961ba55bcSBaptiste Daroussin * 1. Redistributions of source code must retain the above copyright 1061ba55bcSBaptiste Daroussin * notice, this list of conditions and the following disclaimer. 1161ba55bcSBaptiste Daroussin * 2. Redistributions in binary form must reproduce the above copyright 1261ba55bcSBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the 1361ba55bcSBaptiste Daroussin * documentation and/or other materials provided with the distribution. 1461ba55bcSBaptiste Daroussin * 1561ba55bcSBaptiste Daroussin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1661ba55bcSBaptiste Daroussin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1761ba55bcSBaptiste Daroussin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1861ba55bcSBaptiste Daroussin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1961ba55bcSBaptiste Daroussin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2061ba55bcSBaptiste Daroussin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2161ba55bcSBaptiste Daroussin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2261ba55bcSBaptiste Daroussin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2361ba55bcSBaptiste Daroussin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2461ba55bcSBaptiste Daroussin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2561ba55bcSBaptiste Daroussin * SUCH DAMAGE. 2661ba55bcSBaptiste Daroussin */ 2761ba55bcSBaptiste Daroussin 2861ba55bcSBaptiste Daroussin #include <stdio.h> 2961ba55bcSBaptiste Daroussin #include <stdlib.h> 3061ba55bcSBaptiste Daroussin #include <string.h> 3161ba55bcSBaptiste Daroussin #include <time.h> 3261ba55bcSBaptiste Daroussin #include <unistd.h> 33a6d8be45SAlfonso S. Siciliano #include <wchar.h> 3461ba55bcSBaptiste Daroussin 3561ba55bcSBaptiste Daroussin #include <bsddialog.h> 3661ba55bcSBaptiste Daroussin #include <bsddialog_theme.h> 3761ba55bcSBaptiste Daroussin 3861ba55bcSBaptiste Daroussin #include "util.h" 3961ba55bcSBaptiste Daroussin 4061ba55bcSBaptiste Daroussin #define NO_PRINT_VALUES(rv) \ 4161ba55bcSBaptiste Daroussin (rv == BSDDIALOG_ERROR || rv == BSDDIALOG_CANCEL || rv == BSDDIALOG_ESC) 4261ba55bcSBaptiste Daroussin 4361ba55bcSBaptiste Daroussin /* message */ 4461ba55bcSBaptiste Daroussin int infobox_builder(BUILDER_ARGS) 4561ba55bcSBaptiste Daroussin { 4661ba55bcSBaptiste Daroussin if (argc > 0) 4761ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 4861ba55bcSBaptiste Daroussin 4961ba55bcSBaptiste Daroussin return (bsddialog_infobox(conf, text, rows, cols)); 5061ba55bcSBaptiste Daroussin } 5161ba55bcSBaptiste Daroussin 5261ba55bcSBaptiste Daroussin int msgbox_builder(BUILDER_ARGS) 5361ba55bcSBaptiste Daroussin { 5461ba55bcSBaptiste Daroussin if (argc > 0) 5561ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 5661ba55bcSBaptiste Daroussin 5761ba55bcSBaptiste Daroussin return (bsddialog_msgbox(conf, text, rows, cols)); 5861ba55bcSBaptiste Daroussin } 5961ba55bcSBaptiste Daroussin 6061ba55bcSBaptiste Daroussin int yesno_builder(BUILDER_ARGS) 6161ba55bcSBaptiste Daroussin { 6261ba55bcSBaptiste Daroussin if (argc > 0) 6361ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 6461ba55bcSBaptiste Daroussin 6561ba55bcSBaptiste Daroussin return (bsddialog_yesno(conf, text, rows, cols)); 6661ba55bcSBaptiste Daroussin } 6761ba55bcSBaptiste Daroussin 6861ba55bcSBaptiste Daroussin /* textbox */ 6961ba55bcSBaptiste Daroussin int textbox_builder(BUILDER_ARGS) 7061ba55bcSBaptiste Daroussin { 7161ba55bcSBaptiste Daroussin if (argc > 0) 7261ba55bcSBaptiste Daroussin error_args(opt->name, argc, argv); 7361ba55bcSBaptiste Daroussin 7461ba55bcSBaptiste Daroussin return (bsddialog_textbox(conf, text, rows, cols)); 7561ba55bcSBaptiste Daroussin } 7661ba55bcSBaptiste Daroussin 7761ba55bcSBaptiste Daroussin /* bar */ 7861ba55bcSBaptiste Daroussin int gauge_builder(BUILDER_ARGS) 7961ba55bcSBaptiste Daroussin { 8061ba55bcSBaptiste Daroussin int output; 8161ba55bcSBaptiste Daroussin unsigned int perc; 8261ba55bcSBaptiste Daroussin 8361ba55bcSBaptiste Daroussin perc = 0; 8461ba55bcSBaptiste Daroussin if (argc == 1) { 8561ba55bcSBaptiste Daroussin perc = (u_int)strtoul(argv[0], NULL, 10); 8661ba55bcSBaptiste Daroussin perc = perc > 100 ? 100 : perc; 8761ba55bcSBaptiste Daroussin } else if (argc > 1) { 8861ba55bcSBaptiste Daroussin error_args(opt->name, argc - 1, argv + 1); 8961ba55bcSBaptiste Daroussin } 9061ba55bcSBaptiste Daroussin 9161ba55bcSBaptiste Daroussin output = bsddialog_gauge(conf, text, rows, cols, perc, STDIN_FILENO, 9261ba55bcSBaptiste Daroussin "XXX", "EOF"); 9361ba55bcSBaptiste Daroussin 9461ba55bcSBaptiste Daroussin return (output); 9561ba55bcSBaptiste Daroussin } 9661ba55bcSBaptiste Daroussin 9761ba55bcSBaptiste Daroussin int mixedgauge_builder(BUILDER_ARGS) 9861ba55bcSBaptiste Daroussin { 9961ba55bcSBaptiste Daroussin int output, *minipercs; 10061ba55bcSBaptiste Daroussin unsigned int i, mainperc, nminibars; 10161ba55bcSBaptiste Daroussin const char **minilabels; 10261ba55bcSBaptiste Daroussin 10361ba55bcSBaptiste Daroussin if (argc < 1) 10461ba55bcSBaptiste Daroussin exit_error(true, "%s missing <mainperc>", opt->name); 10561ba55bcSBaptiste Daroussin if (((argc-1) % 2) != 0) 10661ba55bcSBaptiste Daroussin exit_error(true, 10761ba55bcSBaptiste Daroussin "bad %s pair number [<minilabel> <miniperc>]", opt->name); 10861ba55bcSBaptiste Daroussin 10961ba55bcSBaptiste Daroussin mainperc = (u_int)strtoul(argv[0], NULL, 10); 11061ba55bcSBaptiste Daroussin mainperc = mainperc > 100 ? 100 : mainperc; 11161ba55bcSBaptiste Daroussin argc--; 11261ba55bcSBaptiste Daroussin argv++; 11361ba55bcSBaptiste Daroussin 11461ba55bcSBaptiste Daroussin nminibars = argc / 2; 11561ba55bcSBaptiste Daroussin if ((minilabels = calloc(nminibars, sizeof(char*))) == NULL) 11661ba55bcSBaptiste Daroussin exit_error(false, "Cannot allocate memory for minilabels"); 11761ba55bcSBaptiste Daroussin if ((minipercs = calloc(nminibars, sizeof(int))) == NULL) 11861ba55bcSBaptiste Daroussin exit_error(false, "Cannot allocate memory for minipercs"); 11961ba55bcSBaptiste Daroussin 12061ba55bcSBaptiste Daroussin for (i = 0; i < nminibars; i++) { 12161ba55bcSBaptiste Daroussin minilabels[i] = argv[i * 2]; 12261ba55bcSBaptiste Daroussin minipercs[i] = (int)strtol(argv[i * 2 + 1], NULL, 10); 12361ba55bcSBaptiste Daroussin } 12461ba55bcSBaptiste Daroussin 12561ba55bcSBaptiste Daroussin output = bsddialog_mixedgauge(conf, text, rows, cols, mainperc, 12661ba55bcSBaptiste Daroussin nminibars, minilabels, minipercs); 12761ba55bcSBaptiste Daroussin 12861ba55bcSBaptiste Daroussin return (output); 12961ba55bcSBaptiste Daroussin } 13061ba55bcSBaptiste Daroussin 13161ba55bcSBaptiste Daroussin int pause_builder(BUILDER_ARGS) 13261ba55bcSBaptiste Daroussin { 13361ba55bcSBaptiste Daroussin int output; 13461ba55bcSBaptiste Daroussin unsigned int secs; 13561ba55bcSBaptiste Daroussin 13661ba55bcSBaptiste Daroussin if (argc == 0) 13761ba55bcSBaptiste Daroussin exit_error(true, "--pause missing <seconds>"); 13861ba55bcSBaptiste Daroussin if (argc > 1) 13961ba55bcSBaptiste Daroussin error_args(opt->name, argc - 1, argv + 1); 14061ba55bcSBaptiste Daroussin 14161ba55bcSBaptiste Daroussin secs = (u_int)strtoul(argv[0], NULL, 10); 14261ba55bcSBaptiste Daroussin output = bsddialog_pause(conf, text, rows, cols, &secs); 14361ba55bcSBaptiste Daroussin 14461ba55bcSBaptiste Daroussin return (output); 14561ba55bcSBaptiste Daroussin } 14661ba55bcSBaptiste Daroussin 14761ba55bcSBaptiste Daroussin int rangebox_builder(BUILDER_ARGS) 14861ba55bcSBaptiste Daroussin { 14961ba55bcSBaptiste Daroussin int output, min, max, value; 15061ba55bcSBaptiste Daroussin 15161ba55bcSBaptiste Daroussin if (argc < 2) 15261ba55bcSBaptiste Daroussin exit_error(true, "--rangebox missing <min> <max> [<init>]"); 15361ba55bcSBaptiste Daroussin if (argc > 3) 15461ba55bcSBaptiste Daroussin error_args("--rangebox", argc - 3, argv + 3); 15561ba55bcSBaptiste Daroussin 15661ba55bcSBaptiste Daroussin min = (int)strtol(argv[0], NULL, 10); 15761ba55bcSBaptiste Daroussin max = (int)strtol(argv[1], NULL, 10); 15861ba55bcSBaptiste Daroussin 15961ba55bcSBaptiste Daroussin if (argc == 3) { 16061ba55bcSBaptiste Daroussin value = (int)strtol(argv[2], NULL, 10); 16161ba55bcSBaptiste Daroussin value = value < min ? min : value; 16261ba55bcSBaptiste Daroussin value = value > max ? max : value; 16361ba55bcSBaptiste Daroussin } else 16461ba55bcSBaptiste Daroussin value = min; 16561ba55bcSBaptiste Daroussin 16661ba55bcSBaptiste Daroussin output = bsddialog_rangebox(conf, text, rows, cols, min, max, &value); 16761ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output) == false) 16861ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%d", value); 16961ba55bcSBaptiste Daroussin 17061ba55bcSBaptiste Daroussin return (output); 17161ba55bcSBaptiste Daroussin } 17261ba55bcSBaptiste Daroussin 17361ba55bcSBaptiste Daroussin /* date and time */ 17461ba55bcSBaptiste Daroussin static int date(BUILDER_ARGS) 17561ba55bcSBaptiste Daroussin { 17661ba55bcSBaptiste Daroussin int rv; 17761ba55bcSBaptiste Daroussin unsigned int yy, mm, dd; 17861ba55bcSBaptiste Daroussin time_t cal; 17961ba55bcSBaptiste Daroussin struct tm *localtm; 18061ba55bcSBaptiste Daroussin char stringdate[1024]; 18161ba55bcSBaptiste Daroussin 18261ba55bcSBaptiste Daroussin time(&cal); 18361ba55bcSBaptiste Daroussin localtm = localtime(&cal); 18461ba55bcSBaptiste Daroussin yy = localtm->tm_year + 1900; 18561ba55bcSBaptiste Daroussin mm = localtm->tm_mon + 1; 18661ba55bcSBaptiste Daroussin dd = localtm->tm_mday; 18761ba55bcSBaptiste Daroussin 18861ba55bcSBaptiste Daroussin if (argc > 3) { 18961ba55bcSBaptiste Daroussin error_args(opt->name, argc - 3, argv + 3); 19061ba55bcSBaptiste Daroussin } else if (argc == 3) { 19161ba55bcSBaptiste Daroussin /* lib checks/sets max and min */ 19261ba55bcSBaptiste Daroussin dd = (u_int)strtoul(argv[0], NULL, 10); 19361ba55bcSBaptiste Daroussin mm = (u_int)strtoul(argv[1], NULL, 10); 19461ba55bcSBaptiste Daroussin yy = (u_int)strtoul(argv[2], NULL, 10); 19561ba55bcSBaptiste Daroussin } 19661ba55bcSBaptiste Daroussin 19761ba55bcSBaptiste Daroussin if (strcmp(opt->name, "--datebox") == 0) 19861ba55bcSBaptiste Daroussin rv = bsddialog_datebox(conf, text, rows, cols, &yy, &mm, &dd); 19961ba55bcSBaptiste Daroussin else 20061ba55bcSBaptiste Daroussin rv = bsddialog_calendar(conf, text, rows, cols, &yy, &mm, &dd); 20161ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(rv)) 20261ba55bcSBaptiste Daroussin return (rv); 20361ba55bcSBaptiste Daroussin 20461ba55bcSBaptiste Daroussin if (opt->date_fmt != NULL) { 20561ba55bcSBaptiste Daroussin time(&cal); 20661ba55bcSBaptiste Daroussin localtm = localtime(&cal); 20761ba55bcSBaptiste Daroussin localtm->tm_year = yy - 1900; 20861ba55bcSBaptiste Daroussin localtm->tm_mon = mm - 1; 20961ba55bcSBaptiste Daroussin localtm->tm_mday = dd; 21061ba55bcSBaptiste Daroussin strftime(stringdate, 1024, opt->date_fmt, localtm); 21161ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", stringdate); 21261ba55bcSBaptiste Daroussin } else if (opt->bikeshed && ~dd & 1) { 21361ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%u/%u/%u", dd, mm, yy); 21461ba55bcSBaptiste Daroussin } else { 21561ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%02u/%02u/%u", dd, mm, yy); 21661ba55bcSBaptiste Daroussin } 21761ba55bcSBaptiste Daroussin 21861ba55bcSBaptiste Daroussin return (rv); 21961ba55bcSBaptiste Daroussin } 22061ba55bcSBaptiste Daroussin 22161ba55bcSBaptiste Daroussin int calendar_builder(BUILDER_ARGS) 22261ba55bcSBaptiste Daroussin { 22361ba55bcSBaptiste Daroussin /* Use height autosizing with rows = 2. Documented in bsddialog(1). 22461ba55bcSBaptiste Daroussin * 22561ba55bcSBaptiste Daroussin * f_dialog_calendar_size() in bsdconfig/share/dialog.subr:1352 22661ba55bcSBaptiste Daroussin * computes height 2 for `dialog --calendar', called by: 22761ba55bcSBaptiste Daroussin * 1) f_dialog_input_expire_password() in 22861ba55bcSBaptiste Daroussin * bsdconfig/usermgmt/share/user_input.subr:517 and 22961ba55bcSBaptiste Daroussin * 2) f_dialog_input_expire_account() in 23061ba55bcSBaptiste Daroussin * bsdconfig/usermgmt/share/user_input.subr:660. 23161ba55bcSBaptiste Daroussin * 23261ba55bcSBaptiste Daroussin * Then use height autosizing with 2 that is min height like dialog. 23361ba55bcSBaptiste Daroussin */ 23461ba55bcSBaptiste Daroussin if (rows == 2) 23561ba55bcSBaptiste Daroussin rows = 0; 23661ba55bcSBaptiste Daroussin 23761ba55bcSBaptiste Daroussin return (date(conf, text, rows, cols, argc, argv, opt)); 23861ba55bcSBaptiste Daroussin } 23961ba55bcSBaptiste Daroussin 24061ba55bcSBaptiste Daroussin int datebox_builder(BUILDER_ARGS) 24161ba55bcSBaptiste Daroussin { 24261ba55bcSBaptiste Daroussin return (date(conf, text, rows, cols, argc, argv, opt)); 24361ba55bcSBaptiste Daroussin } 24461ba55bcSBaptiste Daroussin 24561ba55bcSBaptiste Daroussin int timebox_builder(BUILDER_ARGS) 24661ba55bcSBaptiste Daroussin { 24761ba55bcSBaptiste Daroussin int output; 24861ba55bcSBaptiste Daroussin unsigned int hh, mm, ss; 24961ba55bcSBaptiste Daroussin time_t clock; 25061ba55bcSBaptiste Daroussin struct tm *localtm; 25161ba55bcSBaptiste Daroussin char stringtime[1024]; 25261ba55bcSBaptiste Daroussin 25361ba55bcSBaptiste Daroussin time(&clock); 25461ba55bcSBaptiste Daroussin localtm = localtime(&clock); 25561ba55bcSBaptiste Daroussin hh = localtm->tm_hour; 25661ba55bcSBaptiste Daroussin mm = localtm->tm_min; 25761ba55bcSBaptiste Daroussin ss = localtm->tm_sec; 25861ba55bcSBaptiste Daroussin 25961ba55bcSBaptiste Daroussin if (argc > 3) { 26061ba55bcSBaptiste Daroussin error_args("--timebox", argc - 3, argv + 3); 26161ba55bcSBaptiste Daroussin } else if (argc == 3) { 26261ba55bcSBaptiste Daroussin hh = (u_int)strtoul(argv[0], NULL, 10); 26361ba55bcSBaptiste Daroussin mm = (u_int)strtoul(argv[1], NULL, 10); 26461ba55bcSBaptiste Daroussin ss = (u_int)strtoul(argv[2], NULL, 10); 26561ba55bcSBaptiste Daroussin } 26661ba55bcSBaptiste Daroussin 26761ba55bcSBaptiste Daroussin output = bsddialog_timebox(conf, text, rows, cols, &hh, &mm, &ss); 26861ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output)) 26961ba55bcSBaptiste Daroussin return (output); 27061ba55bcSBaptiste Daroussin 27161ba55bcSBaptiste Daroussin if (opt->time_fmt != NULL) { 27261ba55bcSBaptiste Daroussin time(&clock); 27361ba55bcSBaptiste Daroussin localtm = localtime(&clock); 27461ba55bcSBaptiste Daroussin localtm->tm_hour = hh; 27561ba55bcSBaptiste Daroussin localtm->tm_min = mm; 27661ba55bcSBaptiste Daroussin localtm->tm_sec = ss; 27761ba55bcSBaptiste Daroussin strftime(stringtime, 1024, opt->time_fmt, localtm); 27861ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", stringtime); 27961ba55bcSBaptiste Daroussin } else if (opt->bikeshed && ~ss & 1) { 28061ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%u:%u:%u", hh, mm, ss); 28161ba55bcSBaptiste Daroussin } else { 28261ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%02u:%02u:%02u", hh, mm, ss); 28361ba55bcSBaptiste Daroussin } 28461ba55bcSBaptiste Daroussin 28561ba55bcSBaptiste Daroussin return (output); 28661ba55bcSBaptiste Daroussin } 28761ba55bcSBaptiste Daroussin 28861ba55bcSBaptiste Daroussin /* menu */ 28961ba55bcSBaptiste Daroussin static void 29061ba55bcSBaptiste Daroussin get_menu_items(int argc, char **argv, bool setprefix, bool setdepth, 29161ba55bcSBaptiste Daroussin bool setname, bool setdesc, bool setstatus, bool sethelp, 29261ba55bcSBaptiste Daroussin unsigned int *nitems, struct bsddialog_menuitem **items, int *focusitem, 29361ba55bcSBaptiste Daroussin struct options *opt) 29461ba55bcSBaptiste Daroussin { 29561ba55bcSBaptiste Daroussin unsigned int i, j, sizeitem; 29661ba55bcSBaptiste Daroussin 29761ba55bcSBaptiste Daroussin *focusitem = -1; 29861ba55bcSBaptiste Daroussin 29961ba55bcSBaptiste Daroussin sizeitem = 0; 30061ba55bcSBaptiste Daroussin sizeitem += setprefix ? 1 : 0; 30161ba55bcSBaptiste Daroussin sizeitem += setdepth ? 1 : 0; 30261ba55bcSBaptiste Daroussin sizeitem += setname ? 1 : 0; 30361ba55bcSBaptiste Daroussin sizeitem += setdesc ? 1 : 0; 30461ba55bcSBaptiste Daroussin sizeitem += setstatus ? 1 : 0; 30561ba55bcSBaptiste Daroussin sizeitem += sethelp ? 1 : 0; 30661ba55bcSBaptiste Daroussin if ((argc % sizeitem) != 0) 30761ba55bcSBaptiste Daroussin exit_error(true, "%s bad arguments items number", opt->name); 30861ba55bcSBaptiste Daroussin 30961ba55bcSBaptiste Daroussin *nitems = argc / sizeitem; 31061ba55bcSBaptiste Daroussin *items = calloc(*nitems, sizeof(struct bsddialog_menuitem)); 31161ba55bcSBaptiste Daroussin if (items == NULL) 31261ba55bcSBaptiste Daroussin exit_error(false, "%s cannot allocate items", opt->name); 31361ba55bcSBaptiste Daroussin 31461ba55bcSBaptiste Daroussin j = 0; 31561ba55bcSBaptiste Daroussin for (i = 0; i < *nitems; i++) { 31661ba55bcSBaptiste Daroussin (*items)[i].prefix = setprefix ? argv[j++] : ""; 31761ba55bcSBaptiste Daroussin (*items)[i].depth = setdepth ? 31861ba55bcSBaptiste Daroussin (u_int)strtoul(argv[j++], NULL, 0) : 0; 31961ba55bcSBaptiste Daroussin (*items)[i].name = setname ? argv[j++] : ""; 32061ba55bcSBaptiste Daroussin (*items)[i].desc = setdesc ? argv[j++] : ""; 32161ba55bcSBaptiste Daroussin if (setstatus) { 32261ba55bcSBaptiste Daroussin if (strcasecmp(argv[j], "on") == 0) 32361ba55bcSBaptiste Daroussin (*items)[i].on = true; 32461ba55bcSBaptiste Daroussin else if (strcasecmp(argv[j], "off") == 0) 32561ba55bcSBaptiste Daroussin (*items)[i].on = false; 32661ba55bcSBaptiste Daroussin else 32761ba55bcSBaptiste Daroussin exit_error(true, 32861ba55bcSBaptiste Daroussin "\"%s\" (item %i) invalid status \"%s\"", 32961ba55bcSBaptiste Daroussin (*items)[i].name, i+1, argv[j]); 33061ba55bcSBaptiste Daroussin j++; 33161ba55bcSBaptiste Daroussin } else 33261ba55bcSBaptiste Daroussin (*items)[i].on = false; 33361ba55bcSBaptiste Daroussin (*items)[i].bottomdesc = sethelp ? argv[j++] : ""; 33461ba55bcSBaptiste Daroussin 33561ba55bcSBaptiste Daroussin if (opt->item_default != NULL && *focusitem == -1) 33661ba55bcSBaptiste Daroussin if (strcmp((*items)[i].name, opt->item_default) == 0) 33761ba55bcSBaptiste Daroussin *focusitem = i; 33861ba55bcSBaptiste Daroussin } 33961ba55bcSBaptiste Daroussin } 34061ba55bcSBaptiste Daroussin 34161ba55bcSBaptiste Daroussin static void 34261ba55bcSBaptiste Daroussin print_menu_items(int output, int nitems, struct bsddialog_menuitem *items, 34361ba55bcSBaptiste Daroussin int focusitem, struct options *opt) 34461ba55bcSBaptiste Daroussin { 34561ba55bcSBaptiste Daroussin bool sep, sepbefore, sepafter, sepsecond, toquote, ismenu, ischecklist; 34661ba55bcSBaptiste Daroussin int i; 34761ba55bcSBaptiste Daroussin char quotech; 34861ba55bcSBaptiste Daroussin const char *focusname, *sepstr; 34961ba55bcSBaptiste Daroussin 35061ba55bcSBaptiste Daroussin ismenu = (strcmp(opt->name, "--menu") == 0) ? true : false; 35161ba55bcSBaptiste Daroussin ischecklist = (strcmp(opt->name, "--checklist") == 0) ? true : false; 35261ba55bcSBaptiste Daroussin sep = false; 35361ba55bcSBaptiste Daroussin quotech = opt->item_singlequote ? '\'' : '"'; 35461ba55bcSBaptiste Daroussin 35561ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output)) 35661ba55bcSBaptiste Daroussin return; 35761ba55bcSBaptiste Daroussin 35861ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP) { 35961ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "HELP "); 36061ba55bcSBaptiste Daroussin 36161ba55bcSBaptiste Daroussin if (focusitem >= 0) { 36261ba55bcSBaptiste Daroussin focusname = items[focusitem].name; 36361ba55bcSBaptiste Daroussin if (opt->item_bottomdesc && 36461ba55bcSBaptiste Daroussin opt->help_print_item_name == false) 36561ba55bcSBaptiste Daroussin focusname = items[focusitem].bottomdesc; 36661ba55bcSBaptiste Daroussin 36761ba55bcSBaptiste Daroussin toquote = false; 36861ba55bcSBaptiste Daroussin if (strchr(focusname, ' ') != NULL) { 36961ba55bcSBaptiste Daroussin toquote = opt->item_always_quote; 37061ba55bcSBaptiste Daroussin if (ismenu == false && 37161ba55bcSBaptiste Daroussin opt->item_output_sepnl == false) 37261ba55bcSBaptiste Daroussin toquote = true; 37361ba55bcSBaptiste Daroussin } 37461ba55bcSBaptiste Daroussin if (toquote) { 37561ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%c%s%c", 37661ba55bcSBaptiste Daroussin quotech, focusname, quotech); 37761ba55bcSBaptiste Daroussin } else 37861ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", focusname); 37961ba55bcSBaptiste Daroussin } 38061ba55bcSBaptiste Daroussin 38161ba55bcSBaptiste Daroussin if (ismenu || opt->help_print_items == false) 38261ba55bcSBaptiste Daroussin return; 38361ba55bcSBaptiste Daroussin sep = true; 38461ba55bcSBaptiste Daroussin } 38561ba55bcSBaptiste Daroussin 38661ba55bcSBaptiste Daroussin sepbefore = false; 38761ba55bcSBaptiste Daroussin sepsecond = false; 38861ba55bcSBaptiste Daroussin if ((sepstr = opt->item_output_sep) == NULL) { 38961ba55bcSBaptiste Daroussin if (opt->item_output_sepnl) 39061ba55bcSBaptiste Daroussin sepstr = "\n"; 39161ba55bcSBaptiste Daroussin else { 39261ba55bcSBaptiste Daroussin sepstr = " "; 39361ba55bcSBaptiste Daroussin sepsecond = true; 39461ba55bcSBaptiste Daroussin } 39561ba55bcSBaptiste Daroussin } else 39661ba55bcSBaptiste Daroussin sepbefore = true; 39761ba55bcSBaptiste Daroussin 39861ba55bcSBaptiste Daroussin sepafter = false; 39961ba55bcSBaptiste Daroussin if (opt->item_output_sepnl) { 40061ba55bcSBaptiste Daroussin sepbefore = false; 40161ba55bcSBaptiste Daroussin sepafter = true; 40261ba55bcSBaptiste Daroussin } 40361ba55bcSBaptiste Daroussin 40461ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 40561ba55bcSBaptiste Daroussin if (items[i].on == false) 40661ba55bcSBaptiste Daroussin continue; 40761ba55bcSBaptiste Daroussin 40861ba55bcSBaptiste Daroussin if (sep || sepbefore) 40961ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", sepstr); 41061ba55bcSBaptiste Daroussin sep = false; 41161ba55bcSBaptiste Daroussin if (sepsecond) 41261ba55bcSBaptiste Daroussin sep = true; 41361ba55bcSBaptiste Daroussin 41461ba55bcSBaptiste Daroussin toquote = false; 41561ba55bcSBaptiste Daroussin if (strchr(items[i].name, ' ') != NULL) { 41661ba55bcSBaptiste Daroussin toquote = opt->item_always_quote; 41761ba55bcSBaptiste Daroussin if (ischecklist && opt->item_output_sepnl == false) 41861ba55bcSBaptiste Daroussin toquote = true; 41961ba55bcSBaptiste Daroussin } 42061ba55bcSBaptiste Daroussin if (toquote) 42161ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%c%s%c", 42261ba55bcSBaptiste Daroussin quotech, items[i].name, quotech); 42361ba55bcSBaptiste Daroussin else 42461ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", items[i].name); 42561ba55bcSBaptiste Daroussin 42661ba55bcSBaptiste Daroussin if (sepafter) 42761ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s", sepstr); 42861ba55bcSBaptiste Daroussin } 42961ba55bcSBaptiste Daroussin } 43061ba55bcSBaptiste Daroussin 43161ba55bcSBaptiste Daroussin int checklist_builder(BUILDER_ARGS) 43261ba55bcSBaptiste Daroussin { 43361ba55bcSBaptiste Daroussin int output, focusitem; 43461ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 43561ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 43661ba55bcSBaptiste Daroussin 43761ba55bcSBaptiste Daroussin if (argc < 1) 43861ba55bcSBaptiste Daroussin exit_error(true, "--checklist missing <menurows>"); 43961ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 44061ba55bcSBaptiste Daroussin 44161ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true, 44261ba55bcSBaptiste Daroussin true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt); 44361ba55bcSBaptiste Daroussin 44461ba55bcSBaptiste Daroussin output = bsddialog_checklist(conf, text, rows, cols, menurows, nitems, 44561ba55bcSBaptiste Daroussin items, &focusitem); 44661ba55bcSBaptiste Daroussin 44761ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 44861ba55bcSBaptiste Daroussin free(items); 44961ba55bcSBaptiste Daroussin 45061ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 45161ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 45261ba55bcSBaptiste Daroussin 45361ba55bcSBaptiste Daroussin return (output); 45461ba55bcSBaptiste Daroussin } 45561ba55bcSBaptiste Daroussin 45661ba55bcSBaptiste Daroussin int menu_builder(BUILDER_ARGS) 45761ba55bcSBaptiste Daroussin { 45861ba55bcSBaptiste Daroussin int output, focusitem; 45961ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 46061ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 46161ba55bcSBaptiste Daroussin 46261ba55bcSBaptiste Daroussin if (argc < 1) 46361ba55bcSBaptiste Daroussin exit_error(true, "--menu missing <menurows>"); 46461ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 46561ba55bcSBaptiste Daroussin 46661ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true, 46761ba55bcSBaptiste Daroussin true, false, opt->item_bottomdesc, &nitems, &items, &focusitem, 46861ba55bcSBaptiste Daroussin opt); 46961ba55bcSBaptiste Daroussin 47061ba55bcSBaptiste Daroussin output = bsddialog_menu(conf, text, rows, cols, menurows, nitems, 47161ba55bcSBaptiste Daroussin items, &focusitem); 47261ba55bcSBaptiste Daroussin 47361ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 47461ba55bcSBaptiste Daroussin free(items); 47561ba55bcSBaptiste Daroussin 47661ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 47761ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 47861ba55bcSBaptiste Daroussin 47961ba55bcSBaptiste Daroussin return (output); 48061ba55bcSBaptiste Daroussin } 48161ba55bcSBaptiste Daroussin 48261ba55bcSBaptiste Daroussin int radiolist_builder(BUILDER_ARGS) 48361ba55bcSBaptiste Daroussin { 48461ba55bcSBaptiste Daroussin int output, focusitem; 48561ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 48661ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 48761ba55bcSBaptiste Daroussin 48861ba55bcSBaptiste Daroussin if (argc < 1) 48961ba55bcSBaptiste Daroussin exit_error(true, "--radiolist missing <menurows>"); 49061ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 49161ba55bcSBaptiste Daroussin 49261ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true, 49361ba55bcSBaptiste Daroussin true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt); 49461ba55bcSBaptiste Daroussin 49561ba55bcSBaptiste Daroussin output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems, 49661ba55bcSBaptiste Daroussin items, &focusitem); 49761ba55bcSBaptiste Daroussin 49861ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 49961ba55bcSBaptiste Daroussin free(items); 50061ba55bcSBaptiste Daroussin 50161ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 50261ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 50361ba55bcSBaptiste Daroussin 50461ba55bcSBaptiste Daroussin return (output); 50561ba55bcSBaptiste Daroussin } 50661ba55bcSBaptiste Daroussin 50761ba55bcSBaptiste Daroussin int treeview_builder(BUILDER_ARGS) 50861ba55bcSBaptiste Daroussin { 50961ba55bcSBaptiste Daroussin int output, focusitem; 51061ba55bcSBaptiste Daroussin unsigned int menurows, nitems; 51161ba55bcSBaptiste Daroussin struct bsddialog_menuitem *items; 51261ba55bcSBaptiste Daroussin 51361ba55bcSBaptiste Daroussin if (argc < 1) 51461ba55bcSBaptiste Daroussin exit_error(true, "--treeview missing <menurows>"); 51561ba55bcSBaptiste Daroussin menurows = (u_int)strtoul(argv[0], NULL, 10); 51661ba55bcSBaptiste Daroussin 51761ba55bcSBaptiste Daroussin get_menu_items(argc-1, argv+1, opt->item_prefix, true, true, true, true, 51861ba55bcSBaptiste Daroussin opt->item_bottomdesc, &nitems, &items, &focusitem, opt); 51961ba55bcSBaptiste Daroussin 52061ba55bcSBaptiste Daroussin conf->menu.no_name = true; 52161ba55bcSBaptiste Daroussin conf->menu.align_left = true; 52261ba55bcSBaptiste Daroussin 52361ba55bcSBaptiste Daroussin output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems, 52461ba55bcSBaptiste Daroussin items, &focusitem); 52561ba55bcSBaptiste Daroussin 52661ba55bcSBaptiste Daroussin print_menu_items(output, nitems, items, focusitem, opt); 52761ba55bcSBaptiste Daroussin free(items); 52861ba55bcSBaptiste Daroussin 52961ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 53061ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 53161ba55bcSBaptiste Daroussin 53261ba55bcSBaptiste Daroussin return (output); 53361ba55bcSBaptiste Daroussin } 53461ba55bcSBaptiste Daroussin 53561ba55bcSBaptiste Daroussin /* form */ 536a6d8be45SAlfonso S. Siciliano static unsigned int strcols(const char *string) 537a6d8be45SAlfonso S. Siciliano { 538a6d8be45SAlfonso S. Siciliano int w; 539a6d8be45SAlfonso S. Siciliano unsigned int ncol; 540a6d8be45SAlfonso S. Siciliano size_t charlen, mb_cur_max; 541a6d8be45SAlfonso S. Siciliano wchar_t wch; 542a6d8be45SAlfonso S. Siciliano mbstate_t mbs; 543a6d8be45SAlfonso S. Siciliano 544a6d8be45SAlfonso S. Siciliano mb_cur_max = MB_CUR_MAX; 545a6d8be45SAlfonso S. Siciliano ncol = 0; 546a6d8be45SAlfonso S. Siciliano memset(&mbs, 0, sizeof(mbs)); 547a6d8be45SAlfonso S. Siciliano while ((charlen = mbrlen(string, mb_cur_max, &mbs)) != 0 && 548a6d8be45SAlfonso S. Siciliano charlen != (size_t)-1 && charlen != (size_t)-2) { 549a6d8be45SAlfonso S. Siciliano if (mbtowc(&wch, string, mb_cur_max) < 0) 550a6d8be45SAlfonso S. Siciliano return (0); 551a6d8be45SAlfonso S. Siciliano if ((w = wcwidth(wch)) > 0) 552a6d8be45SAlfonso S. Siciliano ncol += w; 553a6d8be45SAlfonso S. Siciliano string += charlen; 554a6d8be45SAlfonso S. Siciliano } 555a6d8be45SAlfonso S. Siciliano 556a6d8be45SAlfonso S. Siciliano return (ncol); 557a6d8be45SAlfonso S. Siciliano } 558a6d8be45SAlfonso S. Siciliano 55961ba55bcSBaptiste Daroussin static void 56061ba55bcSBaptiste Daroussin print_form_items(int output, int nitems, struct bsddialog_formitem *items, 56161ba55bcSBaptiste Daroussin int focusitem, struct options *opt) 56261ba55bcSBaptiste Daroussin { 56361ba55bcSBaptiste Daroussin int i; 56461ba55bcSBaptiste Daroussin const char *helpname; 56561ba55bcSBaptiste Daroussin 56661ba55bcSBaptiste Daroussin if (NO_PRINT_VALUES(output)) 56761ba55bcSBaptiste Daroussin return; 56861ba55bcSBaptiste Daroussin 56961ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP) { 57061ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "HELP"); 57161ba55bcSBaptiste Daroussin if (focusitem >= 0) { 57261ba55bcSBaptiste Daroussin helpname = items[focusitem].label; 57361ba55bcSBaptiste Daroussin if (opt->item_bottomdesc && 57461ba55bcSBaptiste Daroussin opt->help_print_item_name == false) 57561ba55bcSBaptiste Daroussin helpname = items[focusitem].bottomdesc; 57661ba55bcSBaptiste Daroussin dprintf(opt->output_fd, " %s", helpname); 57761ba55bcSBaptiste Daroussin } 57861ba55bcSBaptiste Daroussin if (opt->help_print_items == false) 57961ba55bcSBaptiste Daroussin return; 58061ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "\n"); 58161ba55bcSBaptiste Daroussin } 58261ba55bcSBaptiste Daroussin 58361ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 584*079f6054SAlfonso S. Siciliano if (!(items[i].flags & BSDDIALOG_FIELDREADONLY)) 58561ba55bcSBaptiste Daroussin dprintf(opt->output_fd, "%s\n", items[i].value); 58661ba55bcSBaptiste Daroussin free(items[i].value); 58761ba55bcSBaptiste Daroussin } 58861ba55bcSBaptiste Daroussin } 58961ba55bcSBaptiste Daroussin 59061ba55bcSBaptiste Daroussin int form_builder(BUILDER_ARGS) 59161ba55bcSBaptiste Daroussin { 592a6d8be45SAlfonso S. Siciliano int output, fieldlen, focusitem; 59361ba55bcSBaptiste Daroussin unsigned int i, j, flags, formheight, nitems, sizeitem; 59461ba55bcSBaptiste Daroussin struct bsddialog_formitem *items; 59561ba55bcSBaptiste Daroussin 59661ba55bcSBaptiste Daroussin if (argc < 1) 59761ba55bcSBaptiste Daroussin exit_error(true, "--form missing <formheight>"); 59861ba55bcSBaptiste Daroussin formheight = (u_int)strtoul(argv[0], NULL, 10); 59961ba55bcSBaptiste Daroussin 60061ba55bcSBaptiste Daroussin argc--; 60161ba55bcSBaptiste Daroussin argv++; 60261ba55bcSBaptiste Daroussin sizeitem = opt->item_bottomdesc ? 9 : 8; 60361ba55bcSBaptiste Daroussin if (argc % sizeitem != 0) 60461ba55bcSBaptiste Daroussin exit_error(true, "--form bad number of arguments items"); 60561ba55bcSBaptiste Daroussin 60661ba55bcSBaptiste Daroussin nitems = argc / sizeitem; 60761ba55bcSBaptiste Daroussin if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) 60861ba55bcSBaptiste Daroussin exit_error(false, "cannot allocate memory for form items"); 60961ba55bcSBaptiste Daroussin j = 0; 61061ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 61161ba55bcSBaptiste Daroussin items[i].label = argv[j++]; 61261ba55bcSBaptiste Daroussin items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); 61361ba55bcSBaptiste Daroussin items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); 61461ba55bcSBaptiste Daroussin items[i].init = argv[j++]; 61561ba55bcSBaptiste Daroussin items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); 61661ba55bcSBaptiste Daroussin items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); 61761ba55bcSBaptiste Daroussin 61861ba55bcSBaptiste Daroussin fieldlen = (int)strtol(argv[j++], NULL, 10); 619a6d8be45SAlfonso S. Siciliano if (fieldlen == 0) 620a6d8be45SAlfonso S. Siciliano items[i].fieldlen = strcols(items[i].init); 621a6d8be45SAlfonso S. Siciliano else 62261ba55bcSBaptiste Daroussin items[i].fieldlen = abs(fieldlen); 62361ba55bcSBaptiste Daroussin 624a6d8be45SAlfonso S. Siciliano items[i].maxvaluelen = (u_int)strtoul(argv[j++], NULL, 10); 625a6d8be45SAlfonso S. Siciliano if (items[i].maxvaluelen == 0) 626a6d8be45SAlfonso S. Siciliano items[i].maxvaluelen = items[i].fieldlen; 62761ba55bcSBaptiste Daroussin 628a6d8be45SAlfonso S. Siciliano flags = (fieldlen <= 0) ? BSDDIALOG_FIELDREADONLY : 0; 62961ba55bcSBaptiste Daroussin items[i].flags = flags; 63061ba55bcSBaptiste Daroussin 63161ba55bcSBaptiste Daroussin items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : ""; 63261ba55bcSBaptiste Daroussin } 63361ba55bcSBaptiste Daroussin 63461ba55bcSBaptiste Daroussin focusitem = -1; 63561ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, formheight, nitems, 63661ba55bcSBaptiste Daroussin items, &focusitem); 63761ba55bcSBaptiste Daroussin print_form_items(output, nitems, items, focusitem, opt); 63861ba55bcSBaptiste Daroussin free(items); 63961ba55bcSBaptiste Daroussin 64061ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 64161ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 64261ba55bcSBaptiste Daroussin 64361ba55bcSBaptiste Daroussin return (output); 64461ba55bcSBaptiste Daroussin } 64561ba55bcSBaptiste Daroussin 64661ba55bcSBaptiste Daroussin int inputbox_builder(BUILDER_ARGS) 64761ba55bcSBaptiste Daroussin { 64861ba55bcSBaptiste Daroussin int output; 64961ba55bcSBaptiste Daroussin struct bsddialog_formitem item; 65061ba55bcSBaptiste Daroussin 65161ba55bcSBaptiste Daroussin if (argc > 1) 65261ba55bcSBaptiste Daroussin error_args("--inputbox", argc - 1, argv + 1); 65361ba55bcSBaptiste Daroussin 65461ba55bcSBaptiste Daroussin item.label = ""; 65561ba55bcSBaptiste Daroussin item.ylabel = 0; 65661ba55bcSBaptiste Daroussin item.xlabel = 0; 65761ba55bcSBaptiste Daroussin item.init = argc > 0 ? argv[0] : ""; 65861ba55bcSBaptiste Daroussin item.yfield = 0; 65961ba55bcSBaptiste Daroussin item.xfield = 0; 66061ba55bcSBaptiste Daroussin item.fieldlen = 1; 66161ba55bcSBaptiste Daroussin item.maxvaluelen = opt->max_input_form; 66261ba55bcSBaptiste Daroussin item.flags = BSDDIALOG_FIELDNOCOLOR; 66361ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDCURSOREND; 66461ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDEXTEND; 66561ba55bcSBaptiste Daroussin item.bottomdesc = ""; 66661ba55bcSBaptiste Daroussin 66761ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL); 66861ba55bcSBaptiste Daroussin print_form_items(output, 1, &item, -1, opt); 66961ba55bcSBaptiste Daroussin 67061ba55bcSBaptiste Daroussin return (output); 67161ba55bcSBaptiste Daroussin } 67261ba55bcSBaptiste Daroussin 67361ba55bcSBaptiste Daroussin int mixedform_builder(BUILDER_ARGS) 67461ba55bcSBaptiste Daroussin { 675a6d8be45SAlfonso S. Siciliano int output, fieldlen, focusitem; 67661ba55bcSBaptiste Daroussin unsigned int i, j, formheight, nitems, sizeitem; 67761ba55bcSBaptiste Daroussin struct bsddialog_formitem *items; 67861ba55bcSBaptiste Daroussin 67961ba55bcSBaptiste Daroussin if (argc < 1) 68061ba55bcSBaptiste Daroussin exit_error(true, "--mixedform missing <formheight>"); 68161ba55bcSBaptiste Daroussin formheight = (u_int)strtoul(argv[0], NULL, 10); 68261ba55bcSBaptiste Daroussin 68361ba55bcSBaptiste Daroussin argc--; 68461ba55bcSBaptiste Daroussin argv++; 68561ba55bcSBaptiste Daroussin sizeitem = opt->item_bottomdesc ? 10 : 9; 68661ba55bcSBaptiste Daroussin if (argc % sizeitem != 0) 68761ba55bcSBaptiste Daroussin exit_error(true, "--mixedform bad number of arguments items"); 68861ba55bcSBaptiste Daroussin 68961ba55bcSBaptiste Daroussin nitems = argc / sizeitem; 69061ba55bcSBaptiste Daroussin if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) 69161ba55bcSBaptiste Daroussin exit_error(false, "cannot allocate memory for form items"); 69261ba55bcSBaptiste Daroussin j = 0; 69361ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 69461ba55bcSBaptiste Daroussin items[i].label = argv[j++]; 69561ba55bcSBaptiste Daroussin items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); 69661ba55bcSBaptiste Daroussin items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); 69761ba55bcSBaptiste Daroussin items[i].init = argv[j++]; 69861ba55bcSBaptiste Daroussin items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); 69961ba55bcSBaptiste Daroussin items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); 700a6d8be45SAlfonso S. Siciliano fieldlen = (int)strtol(argv[j++], NULL, 10); 701a6d8be45SAlfonso S. Siciliano if (fieldlen == 0) 702a6d8be45SAlfonso S. Siciliano items[i].fieldlen = strcols(items[i].init); 703a6d8be45SAlfonso S. Siciliano else 704a6d8be45SAlfonso S. Siciliano items[i].fieldlen = abs(fieldlen); 70561ba55bcSBaptiste Daroussin items[i].maxvaluelen = (u_int)strtoul(argv[j++], NULL, 10); 706a6d8be45SAlfonso S. Siciliano if (items[i].maxvaluelen == 0) 707a6d8be45SAlfonso S. Siciliano items[i].maxvaluelen = items[i].fieldlen; 708a6d8be45SAlfonso S. Siciliano 70961ba55bcSBaptiste Daroussin items[i].flags = (u_int)strtoul(argv[j++], NULL, 10); 710a6d8be45SAlfonso S. Siciliano if (fieldlen <= 0) 711a6d8be45SAlfonso S. Siciliano items[i].flags |= BSDDIALOG_FIELDREADONLY; 712a6d8be45SAlfonso S. Siciliano 71361ba55bcSBaptiste Daroussin items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : ""; 71461ba55bcSBaptiste Daroussin } 71561ba55bcSBaptiste Daroussin 71661ba55bcSBaptiste Daroussin focusitem = -1; 71761ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, formheight, nitems, 71861ba55bcSBaptiste Daroussin items, &focusitem); 719*079f6054SAlfonso S. Siciliano for (i = 0; i < nitems; i++) { 720*079f6054SAlfonso S. Siciliano if ((int)strtol(argv[i * sizeitem + 6], NULL, 10) > 0) 721*079f6054SAlfonso S. Siciliano items[i].flags &= ~ BSDDIALOG_FIELDREADONLY; 722*079f6054SAlfonso S. Siciliano } 72361ba55bcSBaptiste Daroussin print_form_items(output, nitems, items, focusitem, opt); 72461ba55bcSBaptiste Daroussin free(items); 72561ba55bcSBaptiste Daroussin 72661ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 72761ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 72861ba55bcSBaptiste Daroussin 72961ba55bcSBaptiste Daroussin return (output); 73061ba55bcSBaptiste Daroussin } 73161ba55bcSBaptiste Daroussin 73261ba55bcSBaptiste Daroussin int passwordbox_builder(BUILDER_ARGS) 73361ba55bcSBaptiste Daroussin { 73461ba55bcSBaptiste Daroussin int output; 73561ba55bcSBaptiste Daroussin struct bsddialog_formitem item; 73661ba55bcSBaptiste Daroussin 73761ba55bcSBaptiste Daroussin if (argc > 1) 73861ba55bcSBaptiste Daroussin error_args("--passwordbox", argc - 1, argv + 1); 73961ba55bcSBaptiste Daroussin 74061ba55bcSBaptiste Daroussin item.label = ""; 74161ba55bcSBaptiste Daroussin item.ylabel = 0; 74261ba55bcSBaptiste Daroussin item.xlabel = 0; 74361ba55bcSBaptiste Daroussin item.init = argc > 0 ? argv[0] : ""; 74461ba55bcSBaptiste Daroussin item.yfield = 0; 74561ba55bcSBaptiste Daroussin item.xfield = 0; 74661ba55bcSBaptiste Daroussin item.fieldlen = 1; 74761ba55bcSBaptiste Daroussin item.maxvaluelen = opt->max_input_form; 74861ba55bcSBaptiste Daroussin item.flags = BSDDIALOG_FIELDHIDDEN; 74961ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDNOCOLOR; 75061ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDCURSOREND; 75161ba55bcSBaptiste Daroussin item.flags |= BSDDIALOG_FIELDEXTEND; 75261ba55bcSBaptiste Daroussin item.bottomdesc = ""; 75361ba55bcSBaptiste Daroussin 75461ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL); 75561ba55bcSBaptiste Daroussin print_form_items(output, 1, &item, -1, opt); 75661ba55bcSBaptiste Daroussin 75761ba55bcSBaptiste Daroussin return (output); 75861ba55bcSBaptiste Daroussin } 75961ba55bcSBaptiste Daroussin 76061ba55bcSBaptiste Daroussin int passwordform_builder(BUILDER_ARGS) 76161ba55bcSBaptiste Daroussin { 76261ba55bcSBaptiste Daroussin int output, fieldlen, valuelen, focusitem; 76361ba55bcSBaptiste Daroussin unsigned int i, j, flags, formheight, nitems, sizeitem; 76461ba55bcSBaptiste Daroussin struct bsddialog_formitem *items; 76561ba55bcSBaptiste Daroussin 76661ba55bcSBaptiste Daroussin if (argc < 1) 76761ba55bcSBaptiste Daroussin exit_error(true, "--passwordform missing <formheight>"); 76861ba55bcSBaptiste Daroussin formheight = (u_int)strtoul(argv[0], NULL, 10); 76961ba55bcSBaptiste Daroussin 77061ba55bcSBaptiste Daroussin argc--; 77161ba55bcSBaptiste Daroussin argv++; 77261ba55bcSBaptiste Daroussin sizeitem = opt->item_bottomdesc ? 9 : 8; 77361ba55bcSBaptiste Daroussin if (argc % sizeitem != 0) 77461ba55bcSBaptiste Daroussin exit_error(true, "--passwordform bad arguments items number"); 77561ba55bcSBaptiste Daroussin 77661ba55bcSBaptiste Daroussin flags = BSDDIALOG_FIELDHIDDEN; 77761ba55bcSBaptiste Daroussin nitems = argc / sizeitem; 77861ba55bcSBaptiste Daroussin if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) 77961ba55bcSBaptiste Daroussin exit_error(false, "cannot allocate memory for form items"); 78061ba55bcSBaptiste Daroussin j = 0; 78161ba55bcSBaptiste Daroussin for (i = 0; i < nitems; i++) { 78261ba55bcSBaptiste Daroussin items[i].label = argv[j++]; 78361ba55bcSBaptiste Daroussin items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); 78461ba55bcSBaptiste Daroussin items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); 78561ba55bcSBaptiste Daroussin items[i].init = argv[j++]; 78661ba55bcSBaptiste Daroussin items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); 78761ba55bcSBaptiste Daroussin items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); 78861ba55bcSBaptiste Daroussin 78961ba55bcSBaptiste Daroussin fieldlen = (int)strtol(argv[j++], NULL, 10); 79061ba55bcSBaptiste Daroussin items[i].fieldlen = abs(fieldlen); 79161ba55bcSBaptiste Daroussin 79261ba55bcSBaptiste Daroussin valuelen = (int)strtol(argv[j++], NULL, 10); 79361ba55bcSBaptiste Daroussin items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen; 79461ba55bcSBaptiste Daroussin 79561ba55bcSBaptiste Daroussin flags |= (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0); 79661ba55bcSBaptiste Daroussin items[i].flags = flags; 79761ba55bcSBaptiste Daroussin 79861ba55bcSBaptiste Daroussin items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : ""; 79961ba55bcSBaptiste Daroussin } 80061ba55bcSBaptiste Daroussin 80161ba55bcSBaptiste Daroussin focusitem = -1; 80261ba55bcSBaptiste Daroussin output = bsddialog_form(conf, text, rows, cols, formheight, nitems, 80361ba55bcSBaptiste Daroussin items, &focusitem); 80461ba55bcSBaptiste Daroussin print_form_items(output, nitems, items, focusitem, opt); 80561ba55bcSBaptiste Daroussin free(items); 80661ba55bcSBaptiste Daroussin 80761ba55bcSBaptiste Daroussin if (output == BSDDIALOG_HELP && opt->item_bottomdesc) 80861ba55bcSBaptiste Daroussin output = BSDDIALOG_ITEM_HELP; 80961ba55bcSBaptiste Daroussin 81061ba55bcSBaptiste Daroussin return (output); 81161ba55bcSBaptiste Daroussin } 812