/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2021-2022 Alfonso Sabato Siciliano * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "util_theme.h" enum OPTS { /* Options */ ALTERNATE_SCREEN = '?' + 1, AND_DIALOG, ASCII_LINES, BACKTITLE, BEGIN_X, BEGIN_Y, BIKESHED, CANCEL_LABEL, CLEAR_DIALOG, CLEAR_SCREEN, COLORS, COLUMNS_PER_ROW, CR_WRAP, DATE_FORMAT, DEFAULT_BUTTON, DEFAULT_ITEM, DEFAULT_NO, DISABLE_ESC, ESC_RETURNCANCEL, EXIT_LABEL, EXTRA_BUTTON, EXTRA_LABEL, GENERIC_BUTTON1, GENERIC_BUTTON2, HELP_BUTTON, HELP_LABEL, HELP_PRINT_NAME, HELP_STATUS, HFILE, HLINE, HMSG, IGNORE, INSECURE, ITEM_BOTTOM_DESC, ITEM_DEPTH, ITEM_PREFIX, LOAD_THEME, MAX_INPUT, NO_CANCEL, NO_DESCRIPTIONS, NO_LINES, NO_NAMES, NO_OK, NO_SHADOW, NORMAL_SCREEN, OK_LABEL, OUTPUT_FD, OUTPUT_SEPARATOR, PRINT_MAXSIZE, PRINT_SIZE, PRINT_VERSION, QUOTED, SAVE_THEME, SEPARATE_OUTPUT, SHADOW, SINGLE_QUOTED, SLEEP, STDERR, STDOUT, SWITCH_BUTTONS, TAB_ESCAPE, TAB_LEN, TEXT_UNCHANGED, THEME, TIME_FORMAT, TITLE, /* Dialogs */ CALENDAR, CHECKLIST, DATEBOX, FORM, GAUGE, INFOBOX, INPUTBOX, MENU, MIXEDFORM, MIXEDGAUGE, MSGBOX, PASSWORDBOX, PASSWORDFORM, PAUSE, RADIOLIST, RANGEBOX, TEXTBOX, TIMEBOX, TREEVIEW, YESNO }; /* options descriptor */ static struct option longopts[] = { /* Options */ {"alternate-screen", no_argument, NULL, ALTERNATE_SCREEN}, {"and-dialog", no_argument, NULL, AND_DIALOG}, {"and-widget", no_argument, NULL, AND_DIALOG}, {"ascii-lines", no_argument, NULL, ASCII_LINES}, {"backtitle", required_argument, NULL, BACKTITLE}, {"begin-x", required_argument, NULL, BEGIN_X}, {"begin-y", required_argument, NULL, BEGIN_Y}, {"bikeshed", no_argument, NULL, BIKESHED}, {"cancel-label", required_argument, NULL, CANCEL_LABEL}, {"clear", no_argument, NULL, CLEAR_SCREEN}, {"clear-dialog", no_argument, NULL, CLEAR_DIALOG}, {"clear-screen", no_argument, NULL, CLEAR_SCREEN}, {"colors", no_argument, NULL, COLORS}, {"columns-per-row", required_argument, NULL, COLUMNS_PER_ROW}, {"cr-wrap", no_argument, NULL, CR_WRAP}, {"date-format", required_argument, NULL, DATE_FORMAT}, {"defaultno", no_argument, NULL, DEFAULT_NO}, {"default-button", required_argument, NULL, DEFAULT_BUTTON}, {"default-item", required_argument, NULL, DEFAULT_ITEM}, {"default-no", no_argument, NULL, DEFAULT_NO}, {"disable-esc", no_argument, NULL, DISABLE_ESC}, {"esc-return-cancel", no_argument, NULL, ESC_RETURNCANCEL}, {"exit-label", required_argument, NULL, EXIT_LABEL}, {"extra-button", no_argument, NULL, EXTRA_BUTTON}, {"extra-label", required_argument, NULL, EXTRA_LABEL}, {"generic-button1", required_argument, NULL, GENERIC_BUTTON1}, {"generic-button2", required_argument, NULL, GENERIC_BUTTON2}, {"help-button", no_argument, NULL, HELP_BUTTON}, {"help-label", required_argument, NULL, HELP_LABEL}, {"help-print-name", no_argument, NULL, HELP_PRINT_NAME}, {"help-status", no_argument, NULL, HELP_STATUS}, {"help-tags", no_argument, NULL, HELP_PRINT_NAME}, {"hfile", required_argument, NULL, HFILE}, {"hline", required_argument, NULL, HLINE}, {"hmsg", required_argument, NULL, HMSG}, {"ignore", no_argument, NULL, IGNORE}, {"insecure", no_argument, NULL, INSECURE}, {"item-bottom-desc", no_argument, NULL, ITEM_BOTTOM_DESC}, {"item-depth", no_argument, NULL, ITEM_DEPTH}, {"item-help", no_argument, NULL, ITEM_BOTTOM_DESC}, {"item-prefix", no_argument, NULL, ITEM_PREFIX}, {"keep-tite", no_argument, NULL, ALTERNATE_SCREEN}, {"load-theme", required_argument, NULL, LOAD_THEME}, {"max-input", required_argument, NULL, MAX_INPUT}, {"no-cancel", no_argument, NULL, NO_CANCEL}, {"nocancel", no_argument, NULL, NO_CANCEL}, {"no-descriptions", no_argument, NULL, NO_DESCRIPTIONS}, {"no-items", no_argument, NULL, NO_DESCRIPTIONS}, {"no-label", required_argument, NULL, CANCEL_LABEL}, {"no-lines", no_argument, NULL, NO_LINES}, {"no-names", no_argument, NULL, NO_NAMES}, {"no-ok", no_argument, NULL, NO_OK}, {"nook ", no_argument, NULL, NO_OK}, {"no-shadow", no_argument, NULL, NO_SHADOW}, {"no-tags", no_argument, NULL, NO_NAMES}, {"normal-screen", no_argument, NULL, NORMAL_SCREEN}, {"ok-label", required_argument, NULL, OK_LABEL}, {"output-fd", required_argument, NULL, OUTPUT_FD}, {"output-separator", required_argument, NULL, OUTPUT_SEPARATOR}, {"print-maxsize", no_argument, NULL, PRINT_MAXSIZE}, {"print-size", no_argument, NULL, PRINT_SIZE}, {"print-version", no_argument, NULL, PRINT_VERSION}, {"quoted", no_argument, NULL, QUOTED}, {"save-theme", required_argument, NULL, SAVE_THEME}, {"separate-output", no_argument, NULL, SEPARATE_OUTPUT}, {"separator", required_argument, NULL, OUTPUT_SEPARATOR}, {"shadow", no_argument, NULL, SHADOW}, {"single-quoted", no_argument, NULL, SINGLE_QUOTED}, {"sleep", required_argument, NULL, SLEEP}, {"stderr", no_argument, NULL, STDERR}, {"stdout", no_argument, NULL, STDOUT}, {"switch-buttons", no_argument, NULL, SWITCH_BUTTONS}, {"tab-escape", no_argument, NULL, TAB_ESCAPE}, {"tab-len", required_argument, NULL, TAB_LEN}, {"text-unchanged", no_argument, NULL, TEXT_UNCHANGED}, {"theme", required_argument, NULL, THEME}, {"time-format", required_argument, NULL, TIME_FORMAT}, {"title", required_argument, NULL, TITLE}, {"yes-label", required_argument, NULL, OK_LABEL}, /* Dialogs */ {"calendar", no_argument, NULL, CALENDAR}, {"checklist", no_argument, NULL, CHECKLIST}, {"datebox", no_argument, NULL, DATEBOX}, {"form", no_argument, NULL, FORM}, {"gauge", no_argument, NULL, GAUGE}, {"infobox", no_argument, NULL, INFOBOX}, {"inputbox", no_argument, NULL, INPUTBOX}, {"menu", no_argument, NULL, MENU}, {"mixedform", no_argument, NULL, MIXEDFORM}, {"mixedgauge", no_argument, NULL, MIXEDGAUGE}, {"msgbox", no_argument, NULL, MSGBOX}, {"passwordbox", no_argument, NULL, PASSWORDBOX}, {"passwordform", no_argument, NULL, PASSWORDFORM}, {"pause", no_argument, NULL, PAUSE}, {"radiolist", no_argument, NULL, RADIOLIST}, {"rangebox", no_argument, NULL, RANGEBOX}, {"textbox", no_argument, NULL, TEXTBOX}, {"timebox", no_argument, NULL, TIMEBOX}, {"treeview", no_argument, NULL, TREEVIEW}, {"yesno", no_argument, NULL, YESNO}, /* END */ { NULL, 0, NULL, 0} }; /* Menus options */ static bool item_prefix_opt; static bool item_bottomdesc_opt; static bool item_output_sepnl_opt; static bool item_singlequote_opt; static bool list_items_on_opt; static bool item_help_print_name_opt; static bool item_always_quote_opt; static bool item_depth_opt; static char *item_output_sep_opt; static char *item_default_opt; /* Date and Time options */ static char *date_fmt_opt; static char *time_fmt_opt; /* Forms options */ static int unsigned max_input_form_opt; /* General options */ static bool esc_return_cancel_opt; static bool ignore_opt; static int output_fd_opt; static int getH_opt; static int getW_opt; /* Text option */ static bool cr_wrap_opt; static bool tab_escape_opt; static bool text_unchanged_opt; /* Theme and Screen options*/ static bool bikeshed_opt; static enum bsddialog_default_theme theme_opt; static char *backtitle_opt; static bool clear_screen_opt; static char *loadthemefile; static char *savethemefile; static const char *screen_mode_opt; /* Functions */ #define UNUSED_PAR(x) UNUSED_ ## x __attribute__((__unused__)) static void custom_text(char *text, char *buf); static void usage(void); /* Dialogs */ #define BUILDER_ARGS struct bsddialog_conf *conf, char* text, int rows, \ int cols, int argc, char **argv static int calendar_builder(BUILDER_ARGS); static int checklist_builder(BUILDER_ARGS); static int datebox_builder(BUILDER_ARGS); static int form_builder(BUILDER_ARGS); static int gauge_builder(BUILDER_ARGS); static int infobox_builder(BUILDER_ARGS); static int inputbox_builder(BUILDER_ARGS); static int menu_builder(BUILDER_ARGS); static int mixedform_builder(BUILDER_ARGS); static int mixedgauge_builder(BUILDER_ARGS); static int msgbox_builder(BUILDER_ARGS); static int passwordbox_builder(BUILDER_ARGS); static int passwordform_builder(BUILDER_ARGS); static int pause_builder(BUILDER_ARGS); static int radiolist_builder(BUILDER_ARGS); static int rangebox_builder(BUILDER_ARGS); static int textbox_builder(BUILDER_ARGS); static int timebox_builder(BUILDER_ARGS); static int treeview_builder(BUILDER_ARGS); static int yesno_builder(BUILDER_ARGS); /* init, exit and internals */ static bool in_bsddialog_mode; static bool mandatory_dialog; static int (*dialogbuilder)(BUILDER_ARGS); static void exit_error(const char *errstr, bool with_usage) { if (in_bsddialog_mode) bsddialog_end(); printf("Error: %s.\n\n", errstr); if (with_usage) { printf("See \'bsddialog --help\' or \'man 1 bsddialog\' "); printf("for more information.\n"); } exit (255); } static void sigint_handler(int UNUSED_PAR(sig)) { bsddialog_end(); exit(255); } static void start_bsddialog_mode(void) { if (in_bsddialog_mode) return; if (bsddialog_init() != BSDDIALOG_OK) exit_error(bsddialog_geterror(), false); in_bsddialog_mode = true; signal(SIGINT, sigint_handler); } static void error_args(const char *dialog, int argc, char **argv) { int i; if (in_bsddialog_mode) bsddialog_end(); printf("Error: %s unexpected argument%s:", dialog, argc > 1 ? "s" : ""); for (i = 0; i < argc; i++) printf(" \"%s\"", argv[i]); printf(".\n\n"); printf("See \'bsddialog --help\' or \'man 1 bsddialog\' "); printf("for more information.\n"); exit (255); } static void usage(void) { printf("usage: bsddialog --help\n"); printf(" bsddialog --version\n"); printf(" bsddialog [--] -- " "[]\n"); printf(" bsddialog -- ... [--and-dialog -- " "...] ...\n"); printf("\n"); printf("Options:\n"); printf(" --alternate-screen, --ascii-lines, --backtitle ," " --begin-x ,\n --begin-y , --bikeshed, --calendar," " --cancel-label