diff options
Diffstat (limited to 'lib/libdpv')
| -rw-r--r-- | lib/libdpv/Makefile | 14 | ||||
| -rw-r--r-- | lib/libdpv/Makefile.depend | 21 | ||||
| -rw-r--r-- | lib/libdpv/dialog_util.c | 637 | ||||
| -rw-r--r-- | lib/libdpv/dialog_util.h | 70 | ||||
| -rw-r--r-- | lib/libdpv/dialogrc.c | 357 | ||||
| -rw-r--r-- | lib/libdpv/dialogrc.h | 54 | ||||
| -rw-r--r-- | lib/libdpv/dprompt.c | 764 | ||||
| -rw-r--r-- | lib/libdpv/dprompt.h | 57 | ||||
| -rw-r--r-- | lib/libdpv/dpv.3 | 529 | ||||
| -rw-r--r-- | lib/libdpv/dpv.c | 728 | ||||
| -rw-r--r-- | lib/libdpv/dpv.h | 163 | ||||
| -rw-r--r-- | lib/libdpv/dpv_private.h | 65 | ||||
| -rw-r--r-- | lib/libdpv/status.c | 109 | ||||
| -rw-r--r-- | lib/libdpv/status.h | 41 | ||||
| -rw-r--r-- | lib/libdpv/util.c | 104 | ||||
| -rw-r--r-- | lib/libdpv/util.h | 48 |
16 files changed, 0 insertions, 3761 deletions
diff --git a/lib/libdpv/Makefile b/lib/libdpv/Makefile deleted file mode 100644 index 31f1186fa31b..000000000000 --- a/lib/libdpv/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -PACKAGE= dpv -LIB= dpv -SHLIB_MAJOR= 3 -INCS= dpv.h -MAN= dpv.3 -MLINKS= dpv.3 dpv_free.3 - -LIBADD= dialog figpar util tinfow ncursesw - -SRCS= dialog_util.c dialogrc.c dprompt.c dpv.c status.c util.c - -CFLAGS+= -I${.CURDIR} - -.include <bsd.lib.mk> diff --git a/lib/libdpv/Makefile.depend b/lib/libdpv/Makefile.depend deleted file mode 100644 index 50c80402dceb..000000000000 --- a/lib/libdpv/Makefile.depend +++ /dev/null @@ -1,21 +0,0 @@ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/libdialog \ - include \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - lib/libfigpar \ - lib/libutil \ - lib/msun \ - lib/ncurses/ncurses \ - lib/ncurses/tinfo \ - - -.include <dirdeps.mk> - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/lib/libdpv/dialog_util.c b/lib/libdpv/dialog_util.c deleted file mode 100644 index 149df8b50302..000000000000 --- a/lib/libdpv/dialog_util.c +++ /dev/null @@ -1,637 +0,0 @@ -/*- - * Copyright (c) 2013-2018 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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 <sys/cdefs.h> -#include <sys/ioctl.h> - -#include <ctype.h> -#include <err.h> -#include <fcntl.h> -#include <limits.h> -#include <spawn.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <termios.h> -#include <unistd.h> - -#include "dialog_util.h" -#include "dpv.h" -#include "dpv_private.h" - -extern char **environ; - -#define TTY_DEFAULT_ROWS 24 -#define TTY_DEFAULT_COLS 80 - -/* [X]dialog(1) characteristics */ -uint8_t dialog_test = 0; -uint8_t use_dialog = 0; -uint8_t use_libdialog = 1; -uint8_t use_xdialog = 0; -uint8_t use_color = 1; -char dialog[PATH_MAX] = DIALOG; - -/* [X]dialog(1) functionality */ -char *title = NULL; -char *backtitle = NULL; -int dheight = 0; -int dwidth = 0; -static char *dargv[64] = { NULL }; - -/* TTY/Screen characteristics */ -static struct winsize *maxsize = NULL; - -/* Function prototypes */ -static void tty_maxsize_update(void); -static void x11_maxsize_update(void); - -/* - * Update row/column fields of `maxsize' global (used by dialog_maxrows() and - * dialog_maxcols()). If the `maxsize' pointer is NULL, it will be initialized. - * The `ws_row' and `ws_col' fields of `maxsize' are updated to hold current - * maximum height and width (respectively) for a dialog(1) widget based on the - * active TTY size. - * - * This function is called automatically by dialog_maxrows/cols() to reflect - * changes in terminal size in-between calls. - */ -static void -tty_maxsize_update(void) -{ - int fd = STDIN_FILENO; - struct termios t; - - if (maxsize == NULL) { - if ((maxsize = malloc(sizeof(struct winsize))) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - memset((void *)maxsize, '\0', sizeof(struct winsize)); - } - - if (!isatty(fd)) - fd = open("/dev/tty", O_RDONLY); - if ((tcgetattr(fd, &t) < 0) || (ioctl(fd, TIOCGWINSZ, maxsize) < 0)) { - maxsize->ws_row = TTY_DEFAULT_ROWS; - maxsize->ws_col = TTY_DEFAULT_COLS; - } -} - -/* - * Update row/column fields of `maxsize' global (used by dialog_maxrows() and - * dialog_maxcols()). If the `maxsize' pointer is NULL, it will be initialized. - * The `ws_row' and `ws_col' fields of `maxsize' are updated to hold current - * maximum height and width (respectively) for an Xdialog(1) widget based on - * the active video resolution of the X11 environment. - * - * This function is called automatically by dialog_maxrows/cols() to initialize - * `maxsize'. Since video resolution changes are less common and more obtrusive - * than changes to terminal size, the dialog_maxrows/cols() functions only call - * this function when `maxsize' is set to NULL. - */ -static void -x11_maxsize_update(void) -{ - FILE *f = NULL; - char *cols; - char *cp; - char *rows; - char cmdbuf[LINE_MAX]; - char rbuf[LINE_MAX]; - - if (maxsize == NULL) { - if ((maxsize = malloc(sizeof(struct winsize))) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - memset((void *)maxsize, '\0', sizeof(struct winsize)); - } - - /* Assemble the command necessary to get X11 sizes */ - snprintf(cmdbuf, LINE_MAX, "%s --print-maxsize 2>&1", dialog); - - fflush(STDIN_FILENO); /* prevent popen(3) from seeking on stdin */ - - if ((f = popen(cmdbuf, "r")) == NULL) { - if (debug) - warnx("WARNING! Command `%s' failed", cmdbuf); - return; - } - - /* Read in the line returned from Xdialog(1) */ - if ((fgets(rbuf, LINE_MAX, f) == NULL) || (pclose(f) < 0)) - return; - - /* Check for X11-related errors */ - if (strncmp(rbuf, "Xdialog: Error", 14) == 0) - return; - - /* Parse expected output: MaxSize: YY, XXX */ - if ((rows = strchr(rbuf, ' ')) == NULL) - return; - if ((cols = strchr(rows, ',')) != NULL) { - /* strtonum(3) doesn't like trailing junk */ - *(cols++) = '\0'; - if ((cp = strchr(cols, '\n')) != NULL) - *cp = '\0'; - } - - /* Convert to unsigned short */ - maxsize->ws_row = (unsigned short)strtonum( - rows, 0, USHRT_MAX, (const char **)NULL); - maxsize->ws_col = (unsigned short)strtonum( - cols, 0, USHRT_MAX, (const char **)NULL); -} - -/* - * Return the current maximum height (rows) for an [X]dialog(1) widget. - */ -int -dialog_maxrows(void) -{ - - if (use_xdialog && maxsize == NULL) - x11_maxsize_update(); /* initialize maxsize for GUI */ - else if (!use_xdialog) - tty_maxsize_update(); /* update maxsize for TTY */ - return (maxsize->ws_row); -} - -/* - * Return the current maximum width (cols) for an [X]dialog(1) widget. - */ -int -dialog_maxcols(void) -{ - - if (use_xdialog && maxsize == NULL) - x11_maxsize_update(); /* initialize maxsize for GUI */ - else if (!use_xdialog) - tty_maxsize_update(); /* update maxsize for TTY */ - - if (use_dialog || use_libdialog) { - if (use_shadow) - return (maxsize->ws_col - 2); - else - return (maxsize->ws_col); - } else - return (maxsize->ws_col); -} - -/* - * Return the current maximum width (cols) for the terminal. - */ -int -tty_maxcols(void) -{ - - if (use_xdialog && maxsize == NULL) - x11_maxsize_update(); /* initialize maxsize for GUI */ - else if (!use_xdialog) - tty_maxsize_update(); /* update maxsize for TTY */ - - return (maxsize->ws_col); -} - -/* - * Spawn an [X]dialog(1) `--gauge' box with a `--prompt' value of init_prompt. - * Writes the resulting process ID to the pid_t pointed at by `pid'. Returns a - * file descriptor (int) suitable for writing data to the [X]dialog(1) instance - * (data written to the file descriptor is seen as standard-in by the spawned - * [X]dialog(1) process). - */ -int -dialog_spawn_gauge(char *init_prompt, pid_t *pid) -{ - char dummy_init[2] = ""; - char *cp; - int height; - int width; - int error; - posix_spawn_file_actions_t action; -#if DIALOG_SPAWN_DEBUG - unsigned int i; -#endif - unsigned int n = 0; - int stdin_pipe[2] = { -1, -1 }; - - /* Override `dialog' with a path from ENV_DIALOG if provided */ - if ((cp = getenv(ENV_DIALOG)) != NULL) - snprintf(dialog, PATH_MAX, "%s", cp); - - /* For Xdialog(1), set ENV_XDIALOG_HIGH_DIALOG_COMPAT */ - setenv(ENV_XDIALOG_HIGH_DIALOG_COMPAT, "1", 1); - - /* Constrain the height/width */ - height = dialog_maxrows(); - if (backtitle != NULL) - height -= use_shadow ? 5 : 4; - if (dheight < height) - height = dheight; - width = dialog_maxcols(); - if (dwidth < width) - width = dwidth; - - /* Populate argument array */ - dargv[n++] = dialog; - if (title != NULL) { - if ((dargv[n] = malloc(8)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - sprintf(dargv[n++], "--title"); - dargv[n++] = title; - } else { - if ((dargv[n] = malloc(8)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - sprintf(dargv[n++], "--title"); - if ((dargv[n] = malloc(1)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - *dargv[n++] = '\0'; - } - if (backtitle != NULL) { - if ((dargv[n] = malloc(12)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - sprintf(dargv[n++], "--backtitle"); - dargv[n++] = backtitle; - } - if (use_color) { - if ((dargv[n] = malloc(11)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - sprintf(dargv[n++], "--colors"); - } - if (use_xdialog) { - if ((dargv[n] = malloc(7)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - sprintf(dargv[n++], "--left"); - - /* - * NOTE: Xdialog(1)'s `--wrap' appears to be broken for the - * `--gauge' widget prompt-updates. Add it anyway (in-case it - * gets fixed in some later release). - */ - if ((dargv[n] = malloc(7)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - sprintf(dargv[n++], "--wrap"); - } - if ((dargv[n] = malloc(8)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - sprintf(dargv[n++], "--gauge"); - dargv[n++] = use_xdialog ? dummy_init : init_prompt; - if ((dargv[n] = malloc(40)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - snprintf(dargv[n++], 40, "%u", height); - if ((dargv[n] = malloc(40)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - snprintf(dargv[n++], 40, "%u", width); - dargv[n] = NULL; - - /* Open a pipe(2) to communicate with [X]dialog(1) */ - if (pipe(stdin_pipe) < 0) - err(EXIT_FAILURE, "%s: pipe(2)", __func__); - - /* Fork [X]dialog(1) process */ -#if DIALOG_SPAWN_DEBUG - fprintf(stderr, "%s: spawning `", __func__); - for (i = 0; i < n; i++) { - if (i == 0) - fprintf(stderr, "%s", dargv[i]); - else if (*dargv[i] == '-' && *(dargv[i] + 1) == '-') - fprintf(stderr, " %s", dargv[i]); - else - fprintf(stderr, " \"%s\"", dargv[i]); - } - fprintf(stderr, "'\n"); -#endif - posix_spawn_file_actions_init(&action); - posix_spawn_file_actions_adddup2(&action, stdin_pipe[0], STDIN_FILENO); - posix_spawn_file_actions_addclose(&action, stdin_pipe[1]); - error = posix_spawnp(pid, dialog, &action, - (const posix_spawnattr_t *)NULL, dargv, environ); - if (error != 0) err(EXIT_FAILURE, "%s", dialog); - - /* NB: Do not free(3) *dargv[], else SIGSEGV */ - - return (stdin_pipe[1]); -} - -/* - * Returns the number of lines in buffer pointed to by `prompt'. Takes both - * newlines and escaped-newlines into account. - */ -unsigned int -dialog_prompt_numlines(const char *prompt, uint8_t nlstate) -{ - uint8_t nls = nlstate; /* See dialog_prompt_nlstate() */ - const char *cp = prompt; - unsigned int nlines = 1; - - if (prompt == NULL || *prompt == '\0') - return (0); - - while (*cp != '\0') { - if (use_dialog) { - if (strncmp(cp, "\\n", 2) == 0) { - cp++; - nlines++; - nls = TRUE; /* See declaration comment */ - } else if (*cp == '\n') { - if (!nls) - nlines++; - nls = FALSE; /* See declaration comment */ - } - } else if (use_libdialog) { - if (*cp == '\n') - nlines++; - } else if (strncmp(cp, "\\n", 2) == 0) { - cp++; - nlines++; - } - cp++; - } - - return (nlines); -} - -/* - * Returns the length in bytes of the longest line in buffer pointed to by - * `prompt'. Takes newlines and escaped newlines into account. Also discounts - * dialog(1) color escape codes if enabled (via `use_color' global). - */ -unsigned int -dialog_prompt_longestline(const char *prompt, uint8_t nlstate) -{ - uint8_t backslash = 0; - uint8_t nls = nlstate; /* See dialog_prompt_nlstate() */ - const char *p = prompt; - int longest = 0; - int n = 0; - - /* `prompt' parameter is required */ - if (prompt == NULL) - return (0); - if (*prompt == '\0') - return (0); /* shortcut */ - - /* Loop until the end of the string */ - while (*p != '\0') { - /* dialog(1) and dialog(3) will render literal newlines */ - if (use_dialog || use_libdialog) { - if (*p == '\n') { - if (!use_libdialog && nls) - n++; - else { - if (n > longest) - longest = n; - n = 0; - } - nls = FALSE; /* See declaration comment */ - p++; - continue; - } - } - - /* Check for backslash character */ - if (*p == '\\') { - /* If second backslash, count as a single-char */ - if ((backslash ^= 1) == 0) - n++; - } else if (backslash) { - if (*p == 'n' && !use_libdialog) { /* new line */ - /* NB: dialog(3) ignores escaped newlines */ - nls = TRUE; /* See declaration comment */ - if (n > longest) - longest = n; - n = 0; - } else if (use_color && *p == 'Z') { - if (*++p != '\0') - p++; - backslash = 0; - continue; - } else /* [X]dialog(1)/dialog(3) only expand those */ - n += 2; - - backslash = 0; - } else - n++; - p++; - } - if (n > longest) - longest = n; - - return (longest); -} - -/* - * Returns a pointer to the last line in buffer pointed to by `prompt'. Takes - * both newlines (if using dialog(1) versus Xdialog(1)) and escaped newlines - * into account. If no newlines (escaped or otherwise) appear in the buffer, - * `prompt' is returned. If passed a NULL pointer, returns NULL. - */ -char * -dialog_prompt_lastline(char *prompt, uint8_t nlstate) -{ - uint8_t nls = nlstate; /* See dialog_prompt_nlstate() */ - char *lastline; - char *p; - - if (prompt == NULL) - return (NULL); - if (*prompt == '\0') - return (prompt); /* shortcut */ - - lastline = p = prompt; - while (*p != '\0') { - /* dialog(1) and dialog(3) will render literal newlines */ - if (use_dialog || use_libdialog) { - if (*p == '\n') { - if (use_libdialog || !nls) - lastline = p + 1; - nls = FALSE; /* See declaration comment */ - } - } - /* dialog(3) does not expand escaped newlines */ - if (use_libdialog) { - p++; - continue; - } - if (*p == '\\' && *(p + 1) != '\0' && *(++p) == 'n') { - nls = TRUE; /* See declaration comment */ - lastline = p + 1; - } - p++; - } - - return (lastline); -} - -/* - * Returns the number of extra lines generated by wrapping the text in buffer - * pointed to by `prompt' within `ncols' columns (for prompts, this should be - * dwidth - 4). Also discounts dialog(1) color escape codes if enabled (via - * `use_color' global). - */ -int -dialog_prompt_wrappedlines(char *prompt, int ncols, uint8_t nlstate) -{ - uint8_t backslash = 0; - uint8_t nls = nlstate; /* See dialog_prompt_nlstate() */ - char *cp; - char *p = prompt; - int n = 0; - int wlines = 0; - - /* `prompt' parameter is required */ - if (p == NULL) - return (0); - if (*p == '\0') - return (0); /* shortcut */ - - /* Loop until the end of the string */ - while (*p != '\0') { - /* dialog(1) and dialog(3) will render literal newlines */ - if (use_dialog || use_libdialog) { - if (*p == '\n') { - if (use_dialog || !nls) - n = 0; - nls = FALSE; /* See declaration comment */ - } - } - - /* Check for backslash character */ - if (*p == '\\') { - /* If second backslash, count as a single-char */ - if ((backslash ^= 1) == 0) - n++; - } else if (backslash) { - if (*p == 'n' && !use_libdialog) { /* new line */ - /* NB: dialog(3) ignores escaped newlines */ - nls = TRUE; /* See declaration comment */ - n = 0; - } else if (use_color && *p == 'Z') { - if (*++p != '\0') - p++; - backslash = 0; - continue; - } else /* [X]dialog(1)/dialog(3) only expand those */ - n += 2; - - backslash = 0; - } else - n++; - - /* Did we pass the width barrier? */ - if (n > ncols) { - /* - * Work backward to find the first whitespace on-which - * dialog(1) will wrap the line (but don't go before - * the start of this line). - */ - cp = p; - while (n > 1 && !isspace(*cp)) { - cp--; - n--; - } - if (n > 0 && isspace(*cp)) - p = cp; - wlines++; - n = 1; - } - - p++; - } - - return (wlines); -} - -/* - * Returns zero if the buffer pointed to by `prompt' contains an escaped - * newline but only if appearing after any/all literal newlines. This is - * specific to dialog(1) and does not apply to Xdialog(1). - * - * As an attempt to make shell scripts easier to read, dialog(1) will "eat" - * the first literal newline after an escaped newline. This however has a bug - * in its implementation in that rather than allowing `\\n\n' to be treated - * similar to `\\n' or `\n', dialog(1) expands the `\\n' and then translates - * the following literal newline (with or without characters between [!]) into - * a single space. - * - * If you want to be compatible with Xdialog(1), it is suggested that you not - * use literal newlines (they aren't supported); but if you have to use them, - * go right ahead. But be forewarned... if you set $DIALOG in your environment - * to something other than `cdialog' (our current dialog(1)), then it should - * do the same thing w/respect to how to handle a literal newline after an - * escaped newline (you could do no wrong by translating every literal newline - * into a space but only when you've previously encountered an escaped one; - * this is what dialog(1) is doing). - * - * The ``newline state'' (or nlstate for short; as I'm calling it) is helpful - * if you plan to combine multiple strings into a single prompt text. In lead- - * up to this procedure, a common task is to calculate and utilize the widths - * and heights of each piece of prompt text to later be combined. However, if - * (for example) the first string ends in a positive newline state (has an - * escaped newline without trailing literal), the first literal newline in the - * second string will be mangled. - * - * The return value of this function should be used as the `nlstate' argument - * to dialog_*() functions that require it to allow accurate calculations in - * the event such information is needed. - */ -uint8_t -dialog_prompt_nlstate(const char *prompt) -{ - const char *cp; - - if (prompt == NULL) - return 0; - - /* - * Work our way backward from the end of the string for efficiency. - */ - cp = prompt + strlen(prompt); - while (--cp >= prompt) { - /* - * If we get to a literal newline first, this prompt ends in a - * clean state for rendering with dialog(1). Otherwise, if we - * get to an escaped newline first, this prompt ends in an un- - * clean state (following literal will be mangled; see above). - */ - if (*cp == '\n') - return (0); - else if (*cp == 'n' && --cp > prompt && *cp == '\\') - return (1); - } - - return (0); /* no newlines (escaped or otherwise) */ -} - -/* - * Free allocated items initialized by tty_maxsize_update() and - * x11_maxsize_update() - */ -void -dialog_maxsize_free(void) -{ - if (maxsize != NULL) { - free(maxsize); - maxsize = NULL; - } -} diff --git a/lib/libdpv/dialog_util.h b/lib/libdpv/dialog_util.h deleted file mode 100644 index 016b8bcd7300..000000000000 --- a/lib/libdpv/dialog_util.h +++ /dev/null @@ -1,70 +0,0 @@ -/*- - * Copyright (c) 2013-2014 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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. - */ - -#ifndef _DIALOG_UTIL_H_ -#define _DIALOG_UTIL_H_ - -#include <sys/types.h> - -#include "dialogrc.h" - -#define DIALOG_SPAWN_DEBUG 0 /* Debug spawning of [X]dialog(1) */ - -/* dialog(3) and [X]dialog(1) characteristics */ -#define DIALOG "dialog" -#define XDIALOG "Xdialog" -#define PROMPT_MAX 16384 -#define ENV_DIALOG "DIALOG" -#define ENV_USE_COLOR "USE_COLOR" -#define ENV_XDIALOG_HIGH_DIALOG_COMPAT "XDIALOG_HIGH_DIALOG_COMPAT" -extern uint8_t dialog_test; -extern uint8_t use_libdialog; -extern uint8_t use_dialog; -extern uint8_t use_xdialog; -extern uint8_t use_color; -extern char dialog[]; - -/* dialog(3) and [X]dialog(1) functionality */ -extern char *title, *backtitle; -extern int dheight, dwidth; - -__BEGIN_DECLS -uint8_t dialog_prompt_nlstate(const char *_prompt); -void dialog_maxsize_free(void); -char *dialog_prompt_lastline(char *_prompt, uint8_t _nlstate); -int dialog_maxcols(void); -int dialog_maxrows(void); -int dialog_prompt_wrappedlines(char *_prompt, int _ncols, - uint8_t _nlstate); -int dialog_spawn_gauge(char *_init_prompt, pid_t *_pid); -int tty_maxcols(void); -#define tty_maxrows() dialog_maxrows() -unsigned int dialog_prompt_longestline(const char *_prompt, - uint8_t _nlstate); -unsigned int dialog_prompt_numlines(const char *_prompt, uint8_t _nlstate); -__END_DECLS - -#endif /* !_DIALOG_UTIL_H_ */ diff --git a/lib/libdpv/dialogrc.c b/lib/libdpv/dialogrc.c deleted file mode 100644 index 2ac745964e15..000000000000 --- a/lib/libdpv/dialogrc.c +++ /dev/null @@ -1,357 +0,0 @@ -/*- - * Copyright (c) 2013-2015 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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 <sys/types.h> - -#include <err.h> -#include <errno.h> -#include <figpar.h> -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <string_m.h> - -#include "dialogrc.h" - -#define STR_BUFSIZE 255 - -/* dialog(1) `.dialogrc' characteristics */ -uint8_t use_colors = 1; -uint8_t use_shadow = 1; -char gauge_color[STR_BUFSIZE] = "47b"; /* (BLUE,WHITE,ON) */ -char separator[STR_BUFSIZE] = ""; - -/* Function prototypes */ -static int setattr(struct figpar_config *, uint32_t, char *, char *); -static int setbool(struct figpar_config *, uint32_t, char *, char *); -static int setnum(struct figpar_config *, uint32_t, char *, char *); -static int setstr(struct figpar_config *, uint32_t, char *, char *); - -/* - * Anatomy of DIALOGRC (~/.dialogrc by default) - * NOTE: Must appear after private function prototypes (above) - * NB: Brace-initialization of union requires cast to *first* member of union - */ -static struct figpar_config dialogrc_config[] = { - /* TYPE DIRECTIVE DEFAULT HANDLER */ - {FIGPAR_TYPE_INT, "aspect", {(void *)0}, &setnum}, - {FIGPAR_TYPE_STR, "separate_widget", {separator}, &setstr}, - {FIGPAR_TYPE_INT, "tab_len", {(void *)0}, &setnum}, - {FIGPAR_TYPE_BOOL, "visit_items", {(void *)0}, &setbool}, - {FIGPAR_TYPE_BOOL, "use_shadow", {(void *)1}, &setbool}, - {FIGPAR_TYPE_BOOL, "use_colors", {(void *)1}, &setbool}, - {FIGPAR_TYPE_STR, "screen_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "shadow_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "dialog_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "title_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "border_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "button_active_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "button_inactive_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "button_key_active_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "button_key_inactive_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "button_label_active_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "button_label_inactive_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "inputbox_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "inputbox_border_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "searchbox_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "searchbox_title_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "searchbox_border_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "position_indicator_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "menubox_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "menubox_border_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "item_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "item_selected_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "tag_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "tag_selected_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "tag_key_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "tag_key_selected_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "check_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "check_selected_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "uarrow_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "darrow_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "itemhelp_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "form_active_text_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "form_text_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "form_item_readonly_color", {NULL}, &setattr}, - {FIGPAR_TYPE_STR, "gauge_color", {gauge_color}, &setattr}, - {0, NULL, {0}, NULL} -}; - -/* - * figpar call-back for interpreting value as .dialogrc `Attribute' - */ -static int -setattr(struct figpar_config *option, uint32_t line __unused, - char *directive __unused, char *value) -{ - char *cp = value; - char *val; - size_t len; - char attrbuf[4]; - - if (option == NULL) { - warnx("%s:%d:%s: Missing callback parameter", __FILE__, - __LINE__, __func__); - return (-1); /* Abort processing */ - } - - /* Allocate memory for the data if not already done */ - if (option->value.str == NULL) { - if ((option->value.str = malloc(STR_BUFSIZE)) == NULL) - return (-1); - } - - /* - * If the first character is left-parenthesis, the format is - * `(background,foreground,highlight)' otherwise, we should take it - * as a reference to another color. - */ - if (*cp != '(') { - /* Copy the [current] value from the referenced color */ - val = dialogrc_config_option(cp)->value.str; - if (val != NULL) - snprintf(option->value.str, STR_BUFSIZE, "%s", val); - - return (0); - } else - cp++; - - strtolower(cp); - - /* Initialize the attrbuf (fg,bg,hi,NUL) */ - attrbuf[0] = '0'; - attrbuf[1] = '0'; - attrbuf[2] = 'B'; /* \ZB = disable; \Zb = enable (see dialog(1)) */ - attrbuf[3] = '\0'; - - /* Interpret the foreground color */ - if (strncmp(cp, "red,", 4) == 0) attrbuf[0] = '1'; - else if (strncmp(cp, "green,", 6) == 0) attrbuf[0] = '2'; - else if (strncmp(cp, "yellow,", 7) == 0) attrbuf[0] = '3'; - else if (strncmp(cp, "blue,", 5) == 0) attrbuf[0] = '4'; - else if (strncmp(cp, "magenta,", 8) == 0) attrbuf[0] = '5'; - else if (strncmp(cp, "cyan,", 5) == 0) attrbuf[0] = '6'; - else if (strncmp(cp, "white,", 6) == 0) attrbuf[0] = '7'; - else if (strncmp(cp, "black,", 6) == 0) attrbuf[0] = '8'; - - /* Advance to the background color */ - cp = strchr(cp, ','); - if (cp == NULL) - goto write_attrbuf; - else - cp++; - - /* Interpret the background color */ - if (strncmp(cp, "red,", 4) == 0) attrbuf[1] = '1'; - else if (strncmp(cp, "green,", 6) == 0) attrbuf[1] = '2'; - else if (strncmp(cp, "yellow,", 7) == 0) attrbuf[1] = '3'; - else if (strncmp(cp, "blue,", 5) == 0) attrbuf[1] = '4'; - else if (strncmp(cp, "magenta,", 8) == 0) attrbuf[1] = '5'; - else if (strncmp(cp, "cyan,", 5) == 0) attrbuf[1] = '6'; - else if (strncmp(cp, "white,", 6) == 0) attrbuf[1] = '7'; - else if (strncmp(cp, "black,", 6) == 0) attrbuf[1] = '8'; - - /* Advance to the highlight */ - cp = strchr(cp, ','); - if (cp == NULL) - goto write_attrbuf; - else - cp++; - - /* Trim trailing parenthesis */ - len = strlen(cp); - if (cp[len - 1] == ')') - cp[len - 1] = '\0'; - - /* Interpret the highlight (initialized to off above) */ - if (strcmp(cp, "on") == 0 || strncmp(cp, "on,", 3) == 0) - attrbuf[2] = 'b'; /* \Zb = enable bold (see dialog(1)) */ - -write_attrbuf: - sprintf(option->value.str, "%s", attrbuf); - - return (0); -} - -/* - * figpar call-back for interpreting value as .dialogrc `Boolean' - */ -static int -setbool(struct figpar_config *option, uint32_t line __unused, - char *directive __unused, char *value) -{ - - if (option == NULL) { - warnx("%s:%d:%s: Missing callback parameter", __FILE__, - __LINE__, __func__); - return (-1); /* Abort processing */ - } - - /* Assume ON, check for OFF (case-insensitive) */ - option->value.boolean = 1; - strtolower(value); - if (strcmp(value, "off") == 0) - option->value.boolean = 0; - - return (0); -} - -/* - * figpar call-back for interpreting value as .dialogrc `Number' - */ -static int -setnum(struct figpar_config *option, uint32_t line __unused, - char *directive __unused, char *value) -{ - - if (option == NULL) { - warnx("%s:%d:%s: Missing callback parameter", __FILE__, - __LINE__, __func__); - return (-1); /* Abort processing */ - } - - /* Convert the string to a 32-bit signed integer */ - option->value.num = (int32_t)strtol(value, (char **)NULL, 10); - - return (0); -} - -/* - * figpar call-back for interpreting value as .dialogrc `String' - */ -static int -setstr(struct figpar_config *option, uint32_t line __unused, - char *directive __unused, char *value) -{ - size_t len; - - if (option == NULL) { - warnx("%s:%d:%s: Missing callback parameter", __FILE__, - __LINE__, __func__); - return (-1); /* Abort processing */ - } - - /* Allocate memory for the data if not already done */ - if (option->value.str == NULL) { - if ((option->value.str = malloc(STR_BUFSIZE)) == NULL) - return (-1); - } - - /* Trim leading quote */ - if (*value == '"') - value++; - - /* Write the data into the buffer */ - snprintf(option->value.str, STR_BUFSIZE, "%s", value); - - /* Trim trailing quote */ - len = strlen(option->value.str); - if (option->value.str[len - 1] == '"') - option->value.str[len - 1] = '\0'; - - return (0); -} - -/* - * Parse (in order of preference) $DIALOGRC or `$HOME/.dialogrc'. Returns zero - * on success, -1 on failure (and errno should be consulted). - */ -int -parse_dialogrc(void) -{ - char *cp; - int res; - size_t len; - char path[PATH_MAX]; - - /* Allow $DIALOGRC to override `$HOME/.dialogrc' default */ - if ((cp = getenv(ENV_DIALOGRC)) != NULL && *cp != '\0') - snprintf(path, PATH_MAX, "%s", cp); - else if ((cp = getenv(ENV_HOME)) != NULL) { - /* Copy $HOME into buffer and append trailing `/' if missing */ - snprintf(path, PATH_MAX, "%s", cp); - len = strlen(path); - cp = path + len; - if (len > 0 && len < (PATH_MAX - 1) && *(cp - 1) != '/') { - *cp++ = '/'; - *cp = '\0'; - len++; - } - - /* If we still have room, shove in the name of rc file */ - if (len < (PATH_MAX - 1)) - snprintf(cp, PATH_MAX - len, "%s", DIALOGRC); - } else { - /* Like dialog(1), don't process a file if $HOME is unset */ - errno = ENOENT; - return (-1); - } - - /* Process file (either $DIALOGRC if set, or `$HOME/.dialogrc') */ - res = parse_config(dialogrc_config, - path, NULL, FIGPAR_BREAK_ON_EQUALS); - - /* Set some globals based on what we parsed */ - use_shadow = dialogrc_config_option("use_shadow")->value.boolean; - use_colors = dialogrc_config_option("use_colors")->value.boolean; - snprintf(gauge_color, STR_BUFSIZE, "%s", - dialogrc_config_option("gauge_color")->value.str); - - return (res); -} - -/* - * Return a pointer to the `.dialogrc' config option specific to `directive' or - * static figpar_dummy_config (full of NULLs) if none found (see - * get_config_option(3); part of figpar(3)). - */ -struct figpar_config * -dialogrc_config_option(const char *directive) -{ - return (get_config_option(dialogrc_config, directive)); -} - -/* - * Free allocated items initialized by setattr() (via parse_config() callback - * matrix [dialogrc_config] used in parse_dialogrc() above). - */ -void -dialogrc_free(void) -{ - char *value; - uint32_t n; - - for (n = 0; dialogrc_config[n].directive != NULL; n++) { - if (dialogrc_config[n].action != &setattr) - continue; - value = dialogrc_config[n].value.str; - if (value != NULL && value != gauge_color) { - free(dialogrc_config[n].value.str); - dialogrc_config[n].value.str = NULL; - } - } -} diff --git a/lib/libdpv/dialogrc.h b/lib/libdpv/dialogrc.h deleted file mode 100644 index f25d64a3b78f..000000000000 --- a/lib/libdpv/dialogrc.h +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * Copyright (c) 2013-2015 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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. - */ - -#ifndef _DIALOGRC_H_ -#define _DIALOGRC_H_ - -#include <sys/types.h> - -#include <figpar.h> - -/* dialog(3) dlg_color_table[] attributes */ -#define GAUGE_ATTR 33 /* entry used for gauge_color */ - -/* dialog(1) characteristics */ -#define DIALOGRC ".dialogrc" -#define ENV_DIALOGRC "DIALOGRC" -#define ENV_HOME "HOME" - -/* dialog(1) `.dialogrc' characteristics */ -extern uint8_t use_colors; -extern uint8_t use_shadow; -extern char gauge_color[]; -extern char separator[]; - -__BEGIN_DECLS -void dialogrc_free(void); -int parse_dialogrc(void); -struct figpar_config *dialogrc_config_option(const char *_directive); -__END_DECLS - -#endif /* !_DIALOGRC_H_ */ diff --git a/lib/libdpv/dprompt.c b/lib/libdpv/dprompt.c deleted file mode 100644 index 66f785ac86a1..000000000000 --- a/lib/libdpv/dprompt.c +++ /dev/null @@ -1,764 +0,0 @@ -/*- - * Copyright (c) 2013-2014 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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 <sys/types.h> - -#define _BSD_SOURCE /* to get dprintf() prototype in stdio.h below */ -#include <dialog.h> -#include <err.h> -#include <libutil.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <string_m.h> -#include <unistd.h> - -#include "dialog_util.h" -#include "dialogrc.h" -#include "dprompt.h" -#include "dpv.h" -#include "dpv_private.h" - -#define FLABEL_MAX 1024 - -static int fheight = 0; /* initialized by dprompt_init() */ -static char dprompt[PROMPT_MAX + 1] = ""; -static char *dprompt_pos = (char *)(0); /* treated numerically */ - -/* Display characteristics */ -#define FM_DONE 0x01 -#define FM_FAIL 0x02 -#define FM_PEND 0x04 -static uint8_t dprompt_free_mask; -static char *done = NULL; -static char *fail = NULL; -static char *pend = NULL; -int display_limit = DISPLAY_LIMIT_DEFAULT; /* Max entries to show */ -int label_size = LABEL_SIZE_DEFAULT; /* Max width for labels */ -int pbar_size = PBAR_SIZE_DEFAULT; /* Mini-progressbar size */ -static int gauge_percent = 0; -static int done_size, done_lsize, done_rsize; -static int fail_size, fail_lsize, fail_rsize; -static int mesg_size, mesg_lsize, mesg_rsize; -static int pend_size, pend_lsize, pend_rsize; -static int pct_lsize, pct_rsize; -static void *gauge = NULL; -#define SPIN_SIZE 4 -static char spin[SPIN_SIZE + 1] = "/-\\|"; -static char msg[PROMPT_MAX + 1]; -static char *spin_cp = spin; - -/* Function prototypes */ -static char spin_char(void); -static int dprompt_add_files(struct dpv_file_node *file_list, - struct dpv_file_node *curfile, int pct); - -/* - * Returns a pointer to the current spin character in the spin string and - * advances the global position to the next character for the next call. - */ -static char -spin_char(void) -{ - char ch; - - if (*spin_cp == '\0') - spin_cp = spin; - ch = *spin_cp; - - /* Advance the spinner to the next char */ - if (++spin_cp >= (spin + SPIN_SIZE)) - spin_cp = spin; - - return (ch); -} - -/* - * Initialize heights and widths based on various strings and environment - * variables (such as ENV_USE_COLOR). - */ -void -dprompt_init(struct dpv_file_node *file_list) -{ - uint8_t nls = 0; - int len; - int max_cols; - int max_rows; - int nthfile; - int numlines; - struct dpv_file_node *curfile; - - /* - * Initialize dialog(3) `colors' support and draw backtitle - */ - if (use_libdialog && !debug) { - init_dialog(stdin, stdout); - dialog_vars.colors = 1; - if (backtitle != NULL) { - dialog_vars.backtitle = (char *)backtitle; - dlg_put_backtitle(); - } - } - - /* Calculate width of dialog(3) or [X]dialog(1) --gauge box */ - dwidth = label_size + pbar_size + 9; - - /* - * Calculate height of dialog(3) or [X]dialog(1) --gauge box - */ - dheight = 5; - max_rows = dialog_maxrows(); - /* adjust max_rows for backtitle and/or dialog(3) statusLine */ - if (backtitle != NULL) - max_rows -= use_shadow ? 3 : 2; - if (use_libdialog && use_shadow) - max_rows -= 2; - /* add lines for `-p text' */ - numlines = dialog_prompt_numlines(pprompt, 0); - if (debug) - warnx("`-p text' is %i line%s long", numlines, - numlines == 1 ? "" : "s"); - dheight += numlines; - /* adjust dheight for various implementations */ - if (use_dialog) { - dheight -= dialog_prompt_nlstate(pprompt); - nls = dialog_prompt_nlstate(pprompt); - } else if (use_xdialog) { - if (pprompt == NULL || *pprompt == '\0') - dheight++; - } else if (use_libdialog) { - if (pprompt != NULL && *pprompt != '\0') - dheight--; - } - /* limit the number of display items (necessary per dialog(1,3)) */ - if (display_limit == 0 || display_limit > DPV_DISPLAY_LIMIT) - display_limit = DPV_DISPLAY_LIMIT; - /* verify fheight will fit (stop if we hit 1) */ - for (; display_limit > 0; display_limit--) { - nthfile = numlines = 0; - fheight = (int)dpv_nfiles > display_limit ? - (unsigned int)display_limit : dpv_nfiles; - for (curfile = file_list; curfile != NULL; - curfile = curfile->next) { - nthfile++; - numlines += dialog_prompt_numlines(curfile->name, nls); - if ((nthfile % display_limit) == 0) { - if (numlines > fheight) - fheight = numlines; - numlines = nthfile = 0; - } - } - if (numlines > fheight) - fheight = numlines; - if ((dheight + fheight + - (int)dialog_prompt_numlines(aprompt, use_dialog) - - (use_dialog ? (int)dialog_prompt_nlstate(aprompt) : 0)) - <= max_rows) - break; - } - /* don't show any items if we run the risk of hitting a blank set */ - if ((max_rows - (use_shadow ? 5 : 4)) >= fheight) - dheight += fheight; - else - fheight = 0; - /* add lines for `-a text' */ - numlines = dialog_prompt_numlines(aprompt, use_dialog); - if (debug) - warnx("`-a text' is %i line%s long", numlines, - numlines == 1 ? "" : "s"); - dheight += numlines; - - /* If using Xdialog(1), adjust accordingly (based on testing) */ - if (use_xdialog) - dheight += dheight / 4; - - /* For wide mode, long prefix (`pprompt') or append (`aprompt') - * strings will bump width */ - if (wide) { - len = (int)dialog_prompt_longestline(pprompt, 0); /* !nls */ - if ((len + 4) > dwidth) - dwidth = len + 4; - len = (int)dialog_prompt_longestline(aprompt, 1); /* nls */ - if ((len + 4) > dwidth) - dwidth = len + 4; - } - - /* Enforce width constraints to maximum values */ - max_cols = dialog_maxcols(); - if (max_cols > 0 && dwidth > max_cols) - dwidth = max_cols; - - /* Optimize widths to sane values*/ - if (pbar_size > dwidth - 9) { - pbar_size = dwidth - 9; - label_size = 0; - /* -9 = "| - [" ... "] |" */ - } - if (pbar_size < 0) - label_size = dwidth - 8; - /* -8 = "| " ... " - |" */ - else if (label_size > (dwidth - pbar_size - 9) || wide) - label_size = no_labels ? 0 : dwidth - pbar_size - 9; - /* -9 = "| " ... " - [" ... "] |" */ - - /* Hide labels if requested */ - if (no_labels) - label_size = 0; - - /* Touch up the height (now that we know dwidth) */ - dheight += dialog_prompt_wrappedlines(pprompt, dwidth - 4, 0); - dheight += dialog_prompt_wrappedlines(aprompt, dwidth - 4, 1); - - if (debug) - warnx("dheight = %i dwidth = %i fheight = %i", - dheight, dwidth, fheight); - - /* Calculate left/right portions of % */ - pct_lsize = (pbar_size - 4) / 2; /* -4 == printf("%-3s%%", pct) */ - pct_rsize = pct_lsize; - /* If not evenly divisible by 2, increment the right-side */ - if ((pct_rsize + pct_rsize + 4) != pbar_size) - pct_rsize++; - - /* Initialize "Done" text */ - if (done == NULL && (done = msg_done) == NULL) { - if ((done = getenv(ENV_MSG_DONE)) != NULL) - done_size = strlen(done); - else { - done_size = strlen(DPV_DONE_DEFAULT); - if ((done = malloc(done_size + 1)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - dprompt_free_mask |= FM_DONE; - snprintf(done, done_size + 1, DPV_DONE_DEFAULT); - } - } - if (pbar_size < done_size) { - done_lsize = done_rsize = 0; - *(done + pbar_size) = '\0'; - done_size = pbar_size; - } else { - /* Calculate left/right portions for mini-progressbar */ - done_lsize = (pbar_size - done_size) / 2; - done_rsize = done_lsize; - /* If not evenly divisible by 2, increment the right-side */ - if ((done_rsize + done_size + done_lsize) != pbar_size) - done_rsize++; - } - - /* Initialize "Fail" text */ - if (fail == NULL && (fail = msg_fail) == NULL) { - if ((fail = getenv(ENV_MSG_FAIL)) != NULL) - fail_size = strlen(fail); - else { - fail_size = strlen(DPV_FAIL_DEFAULT); - if ((fail = malloc(fail_size + 1)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - dprompt_free_mask |= FM_FAIL; - snprintf(fail, fail_size + 1, DPV_FAIL_DEFAULT); - } - } - if (pbar_size < fail_size) { - fail_lsize = fail_rsize = 0; - *(fail + pbar_size) = '\0'; - fail_size = pbar_size; - } else { - /* Calculate left/right portions for mini-progressbar */ - fail_lsize = (pbar_size - fail_size) / 2; - fail_rsize = fail_lsize; - /* If not evenly divisible by 2, increment the right-side */ - if ((fail_rsize + fail_size + fail_lsize) != pbar_size) - fail_rsize++; - } - - /* Initialize "Pending" text */ - if (pend == NULL && (pend = msg_pending) == NULL) { - if ((pend = getenv(ENV_MSG_PENDING)) != NULL) - pend_size = strlen(pend); - else { - pend_size = strlen(DPV_PENDING_DEFAULT); - if ((pend = malloc(pend_size + 1)) == NULL) - errx(EXIT_FAILURE, "Out of memory?!"); - dprompt_free_mask |= FM_PEND; - snprintf(pend, pend_size + 1, DPV_PENDING_DEFAULT); - } - } - if (pbar_size < pend_size) { - pend_lsize = pend_rsize = 0; - *(pend + pbar_size) = '\0'; - pend_size = pbar_size; - } else { - /* Calculate left/right portions for mini-progressbar */ - pend_lsize = (pbar_size - pend_size) / 2; - pend_rsize = pend_lsize; - /* If not evenly divisible by 2, increment the right-side */ - if ((pend_rsize + pend_lsize + pend_size) != pbar_size) - pend_rsize++; - } - - if (debug) - warnx("label_size = %i pbar_size = %i", label_size, pbar_size); - - dprompt_clear(); -} - -/* - * Clear the [X]dialog(1) `--gauge' prompt buffer. - */ -void -dprompt_clear(void) -{ - - *dprompt = '\0'; - dprompt_pos = dprompt; -} - -/* - * Append to the [X]dialog(1) `--gauge' prompt buffer. Syntax is like printf(3) - * and returns the number of bytes appended to the buffer. - */ -int -dprompt_add(const char *format, ...) -{ - int len; - va_list ap; - - if (dprompt_pos >= (dprompt + PROMPT_MAX)) - return (0); - - va_start(ap, format); - len = vsnprintf(dprompt_pos, (size_t)(PROMPT_MAX - - (dprompt_pos - dprompt)), format, ap); - va_end(ap); - if (len == -1) - errx(EXIT_FAILURE, "%s: Oops, dprompt buffer overflow", - __func__); - - if ((dprompt_pos + len) < (dprompt + PROMPT_MAX)) - dprompt_pos += len; - else - dprompt_pos = dprompt + PROMPT_MAX; - - return (len); -} - -/* - * Append active files to the [X]dialog(1) `--gauge' prompt buffer. Syntax - * requires a pointer to the head of the dpv_file_node linked-list. Returns the - * number of files processed successfully. - */ -static int -dprompt_add_files(struct dpv_file_node *file_list, - struct dpv_file_node *curfile, int pct) -{ - char c; - char bold_code = 'b'; /* default: enabled */ - char color_code = '4'; /* default: blue */ - uint8_t after_curfile = curfile != NULL ? FALSE : TRUE; - uint8_t nls = 0; - char *cp; - char *lastline; - char *name; - const char *bg_code; - const char *estext; - const char *format; - enum dprompt_state dstate; - int estext_lsize; - int estext_rsize; - int flabel_size; - int hlen; - int lsize; - int nlines = 0; - int nthfile = 0; - int pwidth; - int rsize; - struct dpv_file_node *fp; - char flabel[FLABEL_MAX + 1]; - char human[32]; - char pbar[pbar_size + 16]; /* +15 for optional color */ - char pbar_cap[sizeof(pbar)]; - char pbar_fill[sizeof(pbar)]; - - - /* Override color defaults with that of main progress bar */ - if (use_colors || use_shadow) { /* NB: shadow enables color */ - color_code = gauge_color[0]; - /* NB: str[1] aka bg is unused */ - bold_code = gauge_color[2]; - } - - /* - * Create mini-progressbar for current file (if applicable) - */ - *pbar = '\0'; - if (pbar_size >= 0 && pct >= 0 && curfile != NULL && - (curfile->length >= 0 || dialog_test)) { - snprintf(pbar, pbar_size + 1, "%*s%3u%%%*s", pct_lsize, "", - pct, pct_rsize, ""); - if (use_color) { - /* Calculate the fill-width of progressbar */ - pwidth = pct * pbar_size / 100; - /* Round up based on one-tenth of a percent */ - if ((pct * pbar_size % 100) > 50) - pwidth++; - - /* - * Make two copies of pbar. Make one represent the fill - * and the other the remainder (cap). We'll insert the - * ANSI delimiter in between. - */ - *pbar_fill = '\0'; - *pbar_cap = '\0'; - strncat(pbar_fill, (const char *)(pbar), dwidth); - *(pbar_fill + pwidth) = '\0'; - strncat(pbar_cap, (const char *)(pbar+pwidth), dwidth); - - /* Finalize the mini [color] progressbar */ - snprintf(pbar, sizeof(pbar), - "\\Z%c\\Zr\\Z%c%s%s%s\\Zn", bold_code, color_code, - pbar_fill, "\\ZR", pbar_cap); - } - } - - for (fp = file_list; fp != NULL; fp = fp->next) { - flabel_size = label_size; - name = fp->name; - nthfile++; - - /* - * Support multiline filenames (where the filename is taken as - * the last line and the text leading up to the last line can - * be used as (for example) a heading/separator between files. - */ - if (use_dialog) - nls = dialog_prompt_nlstate(pprompt); - nlines += dialog_prompt_numlines(name, nls); - lastline = dialog_prompt_lastline(name, 1); - if (name != lastline) { - c = *lastline; - *lastline = '\0'; - dprompt_add("%s", name); - *lastline = c; - name = lastline; - } - - /* Support color codes (for dialog(1,3)) in file names */ - if ((use_dialog || use_libdialog) && use_color) { - cp = name; - while (*cp != '\0') { - if (*cp == '\\' && *(cp + 1) != '\0' && - *(++cp) == 'Z' && *(cp + 1) != '\0') { - cp++; - flabel_size += 3; - } - cp++; - } - if (flabel_size > FLABEL_MAX) - flabel_size = FLABEL_MAX; - } - - /* If no mini-progressbar, increase label width */ - if (pbar_size < 0 && flabel_size <= FLABEL_MAX - 2 && - no_labels == FALSE) - flabel_size += 2; - - /* If name is too long, add an ellipsis */ - if (snprintf(flabel, flabel_size + 1, "%s", name) > - flabel_size) sprintf(flabel + flabel_size - 3, "..."); - - /* - * Append the label (processing the current file differently) - */ - if (fp == curfile && pct < 100) { - /* - * Add an ellipsis to current file name if it will fit. - * There may be an ellipsis already from truncating the - * label (in which case, we already have one). - */ - cp = flabel + strlen(flabel); - if (cp < (flabel + flabel_size)) - snprintf(cp, flabel_size - - (cp - flabel) + 1, "..."); - - /* Append label (with spinner and optional color) */ - dprompt_add("%s%-*s%s %c", use_color ? "\\Zb" : "", - flabel_size, flabel, use_color ? "\\Zn" : "", - spin_char()); - } else - dprompt_add("%-*s%s %s", flabel_size, - flabel, use_color ? "\\Zn" : "", " "); - - /* - * Append pbar/status (processing the current file differently) - */ - dstate = DPROMPT_NONE; - if (fp->msg != NULL) - dstate = DPROMPT_CUSTOM_MSG; - else if (pbar_size < 0) - dstate = DPROMPT_NONE; - else if (pbar_size < 4) - dstate = DPROMPT_MINIMAL; - else if (after_curfile) - dstate = DPROMPT_PENDING; - else if (fp == curfile) { - if (*pbar == '\0') { - if (fp->length < 0) - dstate = DPROMPT_DETAILS; - else if (fp->status == DPV_STATUS_RUNNING) - dstate = DPROMPT_DETAILS; - else - dstate = DPROMPT_END_STATE; - } - else if (dialog_test) /* status/length ignored */ - dstate = pct < 100 ? - DPROMPT_PBAR : DPROMPT_END_STATE; - else if (fp->status == DPV_STATUS_RUNNING) - dstate = fp->length < 0 ? - DPROMPT_DETAILS : DPROMPT_PBAR; - else /* not running */ - dstate = fp->length < 0 ? - DPROMPT_DETAILS : DPROMPT_END_STATE; - } else { /* before curfile */ - if (dialog_test) - dstate = DPROMPT_END_STATE; - else - dstate = fp->length < 0 ? - DPROMPT_DETAILS : DPROMPT_END_STATE; - } - format = use_color ? - " [\\Z%c%s%-*s%s%-*s\\Zn]\\n" : - " [%-*s%s%-*s]\\n"; - if (fp->status == DPV_STATUS_FAILED) { - bg_code = "\\Zr\\Z1"; /* Red */ - estext_lsize = fail_lsize; - estext_rsize = fail_rsize; - estext = fail; - } else { /* e.g., DPV_STATUS_DONE */ - bg_code = "\\Zr\\Z2"; /* Green */ - estext_lsize = done_lsize; - estext_rsize = done_rsize; - estext = done; - } - switch (dstate) { - case DPROMPT_PENDING: /* Future file(s) */ - dprompt_add(" [%-*s%s%-*s]\\n", - pend_lsize, "", pend, pend_rsize, ""); - break; - case DPROMPT_PBAR: /* Current file */ - dprompt_add(" [%s]\\n", pbar); - break; - case DPROMPT_END_STATE: /* Past/Current file(s) */ - if (use_color) - dprompt_add(format, bold_code, bg_code, - estext_lsize, "", estext, - estext_rsize, ""); - else - dprompt_add(format, - estext_lsize, "", estext, - estext_rsize, ""); - break; - case DPROMPT_DETAILS: /* Past/Current file(s) */ - humanize_number(human, pbar_size + 2, fp->read, "", - HN_AUTOSCALE, HN_NOSPACE | HN_DIVISOR_1000); - - /* Calculate center alignment */ - hlen = (int)strlen(human); - lsize = (pbar_size - hlen) / 2; - rsize = lsize; - if ((lsize+hlen+rsize) != pbar_size) - rsize++; - - if (use_color) - dprompt_add(format, bold_code, bg_code, - lsize, "", human, rsize, ""); - else - dprompt_add(format, - lsize, "", human, rsize, ""); - break; - case DPROMPT_CUSTOM_MSG: /* File-specific message override */ - snprintf(msg, PROMPT_MAX + 1, "%s", fp->msg); - if (pbar_size < (mesg_size = strlen(msg))) { - mesg_lsize = mesg_rsize = 0; - *(msg + pbar_size) = '\0'; - mesg_size = pbar_size; - } else { - mesg_lsize = (pbar_size - mesg_size) / 2; - mesg_rsize = mesg_lsize; - if ((mesg_rsize + mesg_size + mesg_lsize) - != pbar_size) - mesg_rsize++; - } - if (use_color) - dprompt_add(format, bold_code, bg_code, - mesg_lsize, "", msg, mesg_rsize, ""); - else - dprompt_add(format, mesg_lsize, "", msg, - mesg_rsize, ""); - break; - case DPROMPT_MINIMAL: /* Short progress bar, minimal room */ - if (use_color) - dprompt_add(format, bold_code, bg_code, - pbar_size, "", "", 0, ""); - else - dprompt_add(format, pbar_size, "", "", 0, ""); - break; - case DPROMPT_NONE: /* pbar_size < 0 */ - /* FALLTHROUGH */ - default: - dprompt_add(" \\n"); - /* - * NB: Leading space required for the case when - * spin_char() returns a single backslash [\] which - * without the space, changes the meaning of `\n' - */ - } - - /* Stop building if we've hit the internal limit */ - if (nthfile >= display_limit) - break; - - /* If this is the current file, all others are pending */ - if (fp == curfile) - after_curfile = TRUE; - } - - /* - * Since we cannot change the height/width of the [X]dialog(1) widget - * after spawn, to make things look nice let's pad the height so that - * the `-a text' always appears in the same spot. - * - * NOTE: fheight is calculated in dprompt_init(). It represents the - * maximum height required to display the set of items (broken up into - * pieces of display_limit chunks) whose names contain the most - * newlines for any given set. - */ - while (nlines < fheight) { - dprompt_add("\n"); - nlines++; - } - - return (nthfile); -} - -/* - * Process the dpv_file_node linked-list of named files, re-generating the - * [X]dialog(1) `--gauge' prompt text for the current state of transfers. - */ -void -dprompt_recreate(struct dpv_file_node *file_list, - struct dpv_file_node *curfile, int pct) -{ - size_t len; - - /* - * Re-Build the prompt text - */ - dprompt_clear(); - if (display_limit > 0) - dprompt_add_files(file_list, curfile, pct); - - /* Xdialog(1) requires newlines (a) escaped and (b) in triplicate */ - if (use_xdialog) { - /* Replace `\n' with `\n\\n\n' in dprompt */ - len = strlen(dprompt); - len += strcount(dprompt, "\\n") * 5; /* +5 chars per count */ - if (len > PROMPT_MAX) - errx(EXIT_FAILURE, "%s: Oops, dprompt buffer overflow " - "(%zu > %i)", __func__, len, PROMPT_MAX); - if (replaceall(dprompt, "\\n", "\n\\n\n") < 0) - err(EXIT_FAILURE, "%s: replaceall()", __func__); - } - else if (use_libdialog) - strexpandnl(dprompt); -} - -/* - * Print the [X]dialog(1) `--gauge' prompt text to a buffer. - */ -int -dprompt_sprint(char * restrict str, const char *prefix, const char *append) -{ - - return (snprintf(str, PROMPT_MAX, "%s%s%s%s", use_color ? "\\Zn" : "", - prefix ? prefix : "", dprompt, append ? append : "")); -} - -/* - * Print the [X]dialog(1) `--gauge' prompt text to file descriptor fd (could - * be STDOUT_FILENO or a pipe(2) file descriptor to actual [X]dialog(1)). - */ -void -dprompt_dprint(int fd, const char *prefix, const char *append, int overall) -{ - int percent = gauge_percent; - - if (overall >= 0 && overall <= 100) - gauge_percent = percent = overall; - dprintf(fd, "XXX\n%s%s%s%s\nXXX\n%i\n", use_color ? "\\Zn" : "", - prefix ? prefix : "", dprompt, append ? append : "", percent); - fsync(fd); -} - -/* - * Print the dialog(3) `gauge' prompt text using libdialog. - */ -void -dprompt_libprint(const char *prefix, const char *append, int overall) -{ - int percent = gauge_percent; - char buf[DPV_PPROMPT_MAX + DPV_APROMPT_MAX + DPV_DISPLAY_LIMIT * 1024]; - - dprompt_sprint(buf, prefix, append); - - if (overall >= 0 && overall <= 100) - gauge_percent = percent = overall; - gauge = dlg_reallocate_gauge(gauge, title == NULL ? "" : title, - buf, dheight, dwidth, percent); - dlg_update_gauge(gauge, percent); -} - -/* - * Free allocated items initialized by dprompt_init() - */ -void -dprompt_free(void) -{ - if ((dprompt_free_mask & FM_DONE) != 0) { - dprompt_free_mask ^= FM_DONE; - free(done); - done = NULL; - } - if ((dprompt_free_mask & FM_FAIL) != 0) { - dprompt_free_mask ^= FM_FAIL; - free(fail); - fail = NULL; - } - if ((dprompt_free_mask & FM_PEND) != 0) { - dprompt_free_mask ^= FM_PEND; - free(pend); - pend = NULL; - } -} diff --git a/lib/libdpv/dprompt.h b/lib/libdpv/dprompt.h deleted file mode 100644 index c63b1213eb0c..000000000000 --- a/lib/libdpv/dprompt.h +++ /dev/null @@ -1,57 +0,0 @@ -/*- - * Copyright (c) 2013-2014 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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. - */ - -#ifndef _DPROMPT_H_ -#define _DPROMPT_H_ - -#include <sys/cdefs.h> - -#include "dpv.h" - -/* Display characteristics */ -#define ENV_MSG_DONE "msg_done" -#define ENV_MSG_FAIL "msg_fail" -#define ENV_MSG_PENDING "msg_pending" -extern int display_limit; -extern int label_size; -extern int pbar_size; - -__BEGIN_DECLS -void dprompt_clear(void); -void dprompt_dprint(int _fd, const char *_prefix, const char *_append, - int _overall); -void dprompt_free(void); -void dprompt_init(struct dpv_file_node *_file_list); -void dprompt_libprint(const char *_prefix, const char *_append, - int _overall); -void dprompt_recreate(struct dpv_file_node *_file_list, - struct dpv_file_node *_curfile, int _pct); -int dprompt_add(const char *_format, ...); -int dprompt_sprint(char * restrict _str, const char *_prefix, - const char *_append); -__END_DECLS - -#endif /* !_DPROMPT_H_ */ diff --git a/lib/libdpv/dpv.3 b/lib/libdpv/dpv.3 deleted file mode 100644 index bbc6de0bcfcc..000000000000 --- a/lib/libdpv/dpv.3 +++ /dev/null @@ -1,529 +0,0 @@ -.\" Copyright (c) 2013-2018 Devin Teske -.\" All rights reserved. -.\" -.\" 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. -.\" -.Dd March 13, 2018 -.Dt DPV 3 -.Os -.Sh NAME -.Nm dpv -.Nd dialog progress view library -.Sh LIBRARY -.Lb libdpv -.Sh SYNOPSIS -.In dpv.h -.Ft int -.Fo dpv -.Fa "struct dpv_config *config" -.Fa "struct dpv_file_node *file_list" -.Fc -.Ft void -.Fo dpv_free -.Fa "void" -.Fc -.Sh DESCRIPTION -The -.Nm -library provides an interface for creating complex -.Dq gauge -widgets for displaying progress on various actions. -The -.Nm -library can display progress with one of -.Xr dialog 3 , -.Xr dialog 1 , -or -.Xr Xdialog 1 Pq Pa ports/x11/xdialog . -.Pp -The -.Fn dpv -.Fa config -argument properties for configuring global display features: -.Bd -literal -offset indent -struct dpv_config { - uint8_t keep_tite; /* Cleaner exit for scripts */ - enum dpv_display display_type; /* Def. DPV_DISPLAY_LIBDIALOG */ - enum dpv_output output_type; /* Default DPV_OUTPUT_NONE */ - int debug; /* Enable debug on stderr */ - int display_limit; /* Files/page. Default -1 */ - int label_size; /* Label size. Default 28 */ - int pbar_size; /* Mini-progress size */ - int dialog_updates_per_second; /* Default 16 */ - int status_updates_per_second; /* Default 2 */ - uint16_t options; /* Default 0 (none) */ - char *title; /* Widget title */ - char *backtitle; /* Widget backtitle */ - char *aprompt; /* Append. Default NULL */ - char *pprompt; /* Prefix. Default NULL */ - char *msg_done; /* Default `Done' */ - char *msg_fail; /* Default `Fail' */ - char *msg_pending; /* Default `Pending' */ - char *output; /* Output format string */ - const char *status_solo; /* dialog(3) solo-status format. - * Default DPV_STATUS_SOLO */ - const char *status_many; /* dialog(3) many-status format. - * Default DPV_STATUS_MANY */ - - /* - * Function pointer; action to perform data transfer - */ - int (*action)(struct dpv_file_node *file, int out); -}; - -enum dpv_display { - DPV_DISPLAY_LIBDIALOG = 0, /* Use dialog(3) (default) */ - DPV_DISPLAY_STDOUT, /* Use stdout */ - DPV_DISPLAY_DIALOG, /* Use spawned dialog(1) */ - DPV_DISPLAY_XDIALOG, /* Use spawned Xdialog(1) */ -}; - -enum dpv_output { - DPV_OUTPUT_NONE = 0, /* No output (default) */ - DPV_OUTPUT_FILE, /* Read `output' member as file path */ - DPV_OUTPUT_SHELL, /* Read `output' member as shell cmd */ -}; -.Ed -.Pp -The -.Va options -member of the -.Fn dpv -.Fa config -argument is a mask of bit fields indicating various processing options. -Possible flags are: -.Bl -tag -width DPV_NO_OVERRUN -.It Dv DPV_TEST_MODE -Enable test mode. -In test mode, -the -.Fn action -callback of the -.Fa config -argument is not called but instead simulated-data is used to drive progress. -Appends -.Dq [TEST MODE] -to the status line -.Po -to override, -set the -.Va status_format -member of the -.Fn dpv -.Fa config -argument; -for example, -to -.Dv DPV_STATUS_DEFAULT -.Pc . -.It Dv DPV_WIDE_MODE -Enable wide mode. -In wide mode, -the length of the -.Va aprompt -and -.Va pprompt -members of the -.Fn dpv -.Fa config -argument will bump the width of the gauge widget. -Prompts wider than the maximum width will wrap -.Po -unless using -.Xr Xdialog 1 Pq Pa ports/x11/xdialog ; -see BUGS section below -.Pc . -.It Dv DPV_NO_LABELS -Disables the display of labels associated with each transfer -.Po -.Va label_size -member of -.Fn dpv -.Fa config -argument is ignored -.Pc . -.It Dv DPV_USE_COLOR -Force the use of color even if the -.Va display_type -does not support color -.Po -.Ev USE_COLOR -environment variable is ignored -.Pc . -.It Dv DPV_NO_OVERRUN -When enabled, -callbacks for the current -.Vt dpv_file_node -are terminated when -.Fn action -returns 100 or greater -.Po -alleviates the need to change the -.Va status -of the current -.Vt dpv_file_node -but may also cause file truncation if the stream exceeds expected length -.Pc . -.El -.Pp -The -.Fa file_list -argument to -.Fn dpv -is a pointer to a -.Dq linked-list , -described in -.In dpv.h : -.Bd -literal -offset indent -struct dpv_file_node { - enum dpv_status status; /* status of read operation */ - char *msg; /* display instead of "Done/Fail" */ - char *name; /* name of file to read */ - char *path; /* path to file */ - long long length; /* expected size */ - long long read; /* number units read (e.g., bytes) */ - struct dpv_file_node *next;/* pointer to next (end with NULL) */ -}; -.Ed -.Pp -For each of the items in the -.Fa file_list -.Dq linked-list -argument, -the -.Fn action -callback member of the -.Fn dpv -.Fa config -argument is called. -The -.Fn action -function performs a -.Dq nominal -action on the file and return. -The return value of -.Vt int -represents the current progress percentage -.Pq 0-100 -for the current file. -.Pp -The -.Fn action -callback provides two variables for each call. -.Fa file -provides a reference to the current -.Vt dpv_file_node -being processed. -.Fa out -provides a file descriptor where the data goes. -.Pp -If the -.Va output -member of the -.Fn dpv -.Fa config -argument was set to DPV_OUTPUT_NONE -.Pq default ; when invoking Fn dpv , -the -.Fa out -file descriptor of -.Fn action -will be zero and can be ignored. -If -.Fa output -was set to DPV_OUTPUT_FILE, -.Fa out -will be an open file descriptor to a file. -If -.Fa output -was set to DPV_OUTPUT_SHELL, -.Fa out -will be an open file descriptor to a pipe for a spawned shell program. -When -.Fa out -is greater than zero, -write data that has been read back to -.Fa out . -.Pp -To abort -.Fn dpv , -either from the -.Fn action -callback or asynchronously from a signal handler, -two globals are provided via -.In dpv.h : -.Bd -literal -offset indent -extern int dpv_interrupt; /* Set to TRUE in interrupt handler */ -extern int dpv_abort; /* Set to true in callback to abort */ -.Ed -.Pp -These globals are not automatically reset and must be manually maintained. -Do not forget to reset these globals before subsequent invocations of -.Fn dpv -when making multiple calls from the same program. -.Pp -In addition, -the -.Va status -member of the -.Fn action -.Fa file -argument can be used to control callbacks for the current file. -The -.Va status -member can be set to any of the below from -.In dpv.h : -.Bd -literal -offset indent -enum dpv_status { - DPV_STATUS_RUNNING = 0, /* Running (default) */ - DPV_STATUS_DONE, /* Completed */ - DPV_STATUS_FAILED, /* Oops, something went wrong */ -}; -.Ed -.Pp -The default -.Fa status -is zero, -DPV_STATUS_RUNNING, -which keeps the callbacks coming for the current -.Fn file . -Setting -.Ql file->status -to anything other than DPV_STATUS_RUNNING will cause -.Fn dpv -to loop to the next file, -effecting the next callback, -if any. -.Pp -The -.Fn action -callback is responsible for calculating percentages and -.Pq recommended -maintaining a -.Nm -global counter so -.Fn dpv -can display throughput statistics. -Percentages are reported through the -.Vt int -return value of the -.Fn action -callback. -Throughput statistics are calculated from the below global -.Vt int -in -.In dpv.h : -.Bd -literal -offset indent -extern int dpv_overall_read; -.Ed -.Pp -Set this to the number of bytes that have been read for all files. -Throughput information is displayed in the status line -.Pq only available when using Xr dialog 3 -at the bottom of the screen. -See DPV_DISPLAY_LIBDIALOG above. -.Pp -Note that -.Va dpv_overall_read -does not have to represent bytes. -For example, -the -.Va status_format -can be changed to display something other than -.Dq Li bytes -and increment -.Va dpv_overall_read -accordingly -.Pq for example, counting lines . -.Pp -When -.Fn dpv -is processing the current file, -the -.Va length -and -.Va read -members of the -.Fn action -.Fa file -argument are used for calculating the display of mini progress bars -.Po -if enabled; -see -.Va pbar_size -above -.Pc . -If the -.Va length -member of the current -.Fa file -is less than zero -.Pq indicating an unknown file length , -a -.Xr humanize_number 3 -version of the -.Va read -member is used instead of a traditional progress bar. -Otherwise a progress bar is calculated as percentage read to file length. -.Fn action -callback must maintain these member values for mini-progress bars. -.Pp -The -.Fn dpv_free -function performs -.Xr free 3 -on private global variables initialized by -.Fn dpv . -.Sh ENVIRONMENT -The below environment variables are referenced by -.Nm : -.Bl -tag -width ".Ev USE_COLOR" -.It Ev DIALOG -Override command string used to launch -.Xr dialog 1 -.Pq requires Dv DPV_DISPLAY_DIALOG -or -.Xr Xdialog 1 Pq Pa ports/x11/xdialog -.Pq requires Dv DPV_DISPLAY_XDIALOG ; -default is either -.Ql dialog -.Pq for Dv DPV_DISPLAY_DIALOG -or -.Ql Xdialog -.Pq for Dv DPV_DISPLAY_XDIALOG . -.It Ev DIALOGRC -If set and non-NULL, -path to -.Ql .dialogrc -file. -.It Ev HOME -If -.Ql Ev $DIALOGRC -is either not set or NULL, -used as a prefix to -.Ql .dialogrc -.Pq that is, Ql $HOME/.dialogrc . -.It Ev USE_COLOR -If set and NULL, -disables the use of color when using -.Xr dialog 1 . -Does not apply to -.Xr Xdialog 1 Pq Pa ports/x11/xdialog . -.It Ev msg_done Ev msg_fail Ev msg_pending -Internationalization strings for overriding the default English strings -.Ql Done , -.Ql Fail , -and -.Ql Pending -respectively. -To prevent their usage, -explicitly set the -.Va msg_done , -.Va msg_fail , -and -.Va msg_pending -members of -.Fn dpv -.Fa config -argument to default macros -.Pq DPV_DONE_DEFAULT, DPV_FAIL_DEFAULT, and DPV_PENDING_DEFAULT -or desired values. -.El -.Sh FILES -.Bl -tag -width ".Pa $HOME/.dialogrc" -compact -.It Pa $HOME/.dialogrc -.El -.Sh SEE ALSO -.Xr dialog 1 , -.Xr Xdialog 1 Pq Pa ports/x11/xdialog , -.Xr dialog 3 -.Sh HISTORY -The -.Nm -library first appeared in -.Fx 10.2 . -.Sh AUTHORS -.An Devin Teske Aq dteske@FreeBSD.org -.Sh BUGS -.Xr Xdialog 1 Pq Pa ports/x11/xdialog , -when given both -.Ql Fl -title Ar title -.Po -see above -.Ql Va title -member of -.Va struct dpv_config -.Pc -and -.Ql Fl -backtitle Ar backtitle -.Po -see above -.Ql Va backtitle -member of -.Va struct dpv_config -.Pc , -displays the backtitle in place of the title and vice-versa. -.Pp -.Xr Xdialog 1 Pq Pa ports/x11/xdialog -does not wrap long prompt texts received after initial launch. -This is a known issue with the -.Ql --gauge -widget in -.Xr Xdialog 1 Pq Pa ports/x11/xdialog . -Embed escaped newlines within prompt text to force line breaks. -.Pp -.Xr dialog 1 -does not display the first character after a series of escaped escape-sequences -(for example, ``\\\\n'' produces ``\\'' instead of ``\\n''). -This is a known issue with -.Xr dialog 1 -and does not affect -.Xr dialog 3 -or -.Xr Xdialog 1 Pq Pa ports/x11/xdialog . -.Pp -If an application ignores -.Ev USE_COLOR -when set and NULL before calling -.Fn dpv -with color escape sequences anyway, -.Xr dialog 3 -and -.Xr dialog 1 -may not render properly. -Workaround is to detect when -.Ev USE_COLOR -is set and NULL and either not use color escape sequences at that time or use -.Xr unsetenv 3 -to unset -.Ev USE_COLOR , -forcing interpretation of color sequences. -This does not effect -.Xr Xdialog 1 Pq Pa ports/x11/xdialog , -which renders the color escape sequences as plain text. -See -.Do -embedded "\\Z" sequences -.Dc -in -.Xr dialog 1 -for additional information. diff --git a/lib/libdpv/dpv.c b/lib/libdpv/dpv.c deleted file mode 100644 index 0c3ea68faf59..000000000000 --- a/lib/libdpv/dpv.c +++ /dev/null @@ -1,728 +0,0 @@ -/*- - * Copyright (c) 2013-2016 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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 <sys/cdefs.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/types.h> -#include <sys/wait.h> - -#include <ctype.h> -#include <dialog.h> -#include <err.h> -#include <limits.h> -#include <locale.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <string_m.h> -#include <unistd.h> - -#include "dialog_util.h" -#include "dialogrc.h" -#include "dprompt.h" -#include "dpv.h" -#include "dpv_private.h" -#include "status.h" -#include "util.h" - -/* Test Mechanics (Only used when dpv_config.options |= DPV_TEST_MODE) */ -#define INCREMENT 1 /* Increment % per-pass test-mode */ -#define XDIALOG_INCREMENT 15 /* different for slower Xdialog(1) */ -static uint8_t increment = INCREMENT; - -/* Debugging */ -uint8_t debug = FALSE; - -/* Data to process */ -int dpv_interrupt = FALSE; -int dpv_abort = FALSE; -unsigned int dpv_nfiles = 0; - -/* Data processing */ -long long dpv_overall_read = 0; -static char pathbuf[PATH_MAX]; - -/* Extra display information */ -uint8_t keep_tite = FALSE; /* dpv_config.keep_tite */ -uint8_t no_labels = FALSE; /* dpv_config.options & DPV_NO_LABELS */ -uint8_t wide = FALSE; /* dpv_config.options & DPV_WIDE_MODE */ -char *aprompt = NULL; /* dpv_config.aprompt */ -char *msg_done = NULL; /* dpv_config.msg_done */ -char *msg_fail = NULL; /* dpv_config.msg_fail */ -char *msg_pending = NULL; /* dpv_config.msg_pending */ -char *pprompt = NULL; /* dpv_config.pprompt */ - -/* Status-Line format for when using dialog(3) */ -static const char *status_format_custom = NULL; -static char status_format_default[DPV_STATUS_FORMAT_MAX]; - -/* - * Takes a pointer to a dpv_config structure containing layout details and - * pointer to initial element in a linked-list of dpv_file_node structures, - * each presenting a file to process. Executes the `action' function passed-in - * as a member to the `config' structure argument. - */ -int -dpv(struct dpv_config *config, struct dpv_file_node *file_list) -{ - char c; - uint8_t keep_going; - uint8_t nls = FALSE; /* See dialog_prompt_nlstate() */ - uint8_t no_overrun = FALSE; - uint8_t pprompt_nls = FALSE; /* See dialog_prompt_nlstate() */ - uint8_t shrink_label_size = FALSE; - mode_t mask; - uint16_t options; - char *cp; - char *fc; - char *last; - char *name; - char *output; - const char *status_fmt; - const char *path_fmt; - enum dpv_display display_type; - enum dpv_output output_type; - enum dpv_status status; - int (*action)(struct dpv_file_node *file, int out); - int backslash; - int dialog_last_update = 0; - int dialog_old_nthfile = 0; - int dialog_old_seconds = -1; - int dialog_out = STDOUT_FILENO; - int dialog_update_usec = 0; - int dialog_updates_per_second; - int files_left; - int max_cols; - int nthfile = 0; - int output_out; - int overall = 0; - int pct; - int res; - int seconds; - int status_last_update = 0; - int status_old_nthfile = 0; - int status_old_seconds = -1; - int status_update_usec = 0; - int status_updates_per_second; - pid_t output_pid; - pid_t pid; - size_t len; - struct dpv_file_node *curfile; - struct dpv_file_node *first_file; - struct dpv_file_node *list_head; - struct timeval now; - struct timeval start; - char init_prompt[PROMPT_MAX + 1] = ""; - - /* Initialize globals to default values */ - aprompt = NULL; - pprompt = NULL; - options = 0; - action = NULL; - backtitle = NULL; - debug = FALSE; - dialog_test = FALSE; - dialog_updates_per_second = DIALOG_UPDATES_PER_SEC; - display_limit = DISPLAY_LIMIT_DEFAULT; - display_type = DPV_DISPLAY_LIBDIALOG; - keep_tite = FALSE; - label_size = LABEL_SIZE_DEFAULT; - msg_done = NULL; - msg_fail = NULL; - msg_pending = NULL; - no_labels = FALSE; - output = NULL; - output_type = DPV_OUTPUT_NONE; - pbar_size = PBAR_SIZE_DEFAULT; - status_format_custom = NULL; - status_updates_per_second = STATUS_UPDATES_PER_SEC; - title = NULL; - wide = FALSE; - - /* Process config options (overriding defaults) */ - if (config != NULL) { - if (config->aprompt != NULL) { - if (aprompt == NULL) { - aprompt = malloc(DPV_APROMPT_MAX); - if (aprompt == NULL) - return (-1); - } - snprintf(aprompt, DPV_APROMPT_MAX, "%s", - config->aprompt); - } - if (config->pprompt != NULL) { - if (pprompt == NULL) { - pprompt = malloc(DPV_PPROMPT_MAX + 2); - /* +2 is for implicit "\n" appended later */ - if (pprompt == NULL) - return (-1); - } - snprintf(pprompt, DPV_APROMPT_MAX, "%s", - config->pprompt); - } - - options = config->options; - action = config->action; - backtitle = config->backtitle; - debug = config->debug; - dialog_test = ((options & DPV_TEST_MODE) != 0); - dialog_updates_per_second = config->dialog_updates_per_second; - display_limit = config->display_limit; - display_type = config->display_type; - keep_tite = config->keep_tite; - label_size = config->label_size; - msg_done = (char *)config->msg_done; - msg_fail = (char *)config->msg_fail; - msg_pending = (char *)config->msg_pending; - no_labels = ((options & DPV_NO_LABELS) != 0); - no_overrun = ((options & DPV_NO_OVERRUN) != 0); - output = config->output; - output_type = config->output_type; - pbar_size = config->pbar_size; - status_updates_per_second = config->status_updates_per_second; - title = config->title; - wide = ((options & DPV_WIDE_MODE) != 0); - - /* Enforce some minimums (pedantic) */ - if (display_limit < -1) - display_limit = -1; - if (label_size < -1) - label_size = -1; - if (pbar_size < -1) - pbar_size = -1; - - /* For the mini-pbar, -1 means hide, zero is invalid unless - * only one file is given */ - if (pbar_size == 0) { - if (file_list == NULL || file_list->next == NULL) - pbar_size = -1; - else - pbar_size = PBAR_SIZE_DEFAULT; - } - - /* For the label, -1 means auto-size, zero is invalid unless - * specifically requested through the use of options flag */ - if (label_size == 0 && no_labels == FALSE) - label_size = LABEL_SIZE_DEFAULT; - - /* Status update should not be zero */ - if (status_updates_per_second == 0) - status_updates_per_second = STATUS_UPDATES_PER_SEC; - } /* config != NULL */ - - /* Process the type of display we've been requested to produce */ - switch (display_type) { - case DPV_DISPLAY_STDOUT: - debug = TRUE; - use_color = FALSE; - use_dialog = FALSE; - use_libdialog = FALSE; - use_xdialog = FALSE; - break; - case DPV_DISPLAY_DIALOG: - use_color = TRUE; - use_dialog = TRUE; - use_libdialog = FALSE; - use_xdialog = FALSE; - break; - case DPV_DISPLAY_XDIALOG: - snprintf(dialog, PATH_MAX, XDIALOG); - use_color = FALSE; - use_dialog = FALSE; - use_libdialog = FALSE; - use_xdialog = TRUE; - break; - default: - use_color = TRUE; - use_dialog = FALSE; - use_libdialog = TRUE; - use_xdialog = FALSE; - break; - } /* display_type */ - - /* Enforce additional minimums that require knowing our display type */ - if (dialog_updates_per_second == 0) - dialog_updates_per_second = use_xdialog ? - XDIALOG_UPDATES_PER_SEC : DIALOG_UPDATES_PER_SEC; - - /* Allow forceful override of use_color */ - if (config != NULL && (config->options & DPV_USE_COLOR) != 0) - use_color = TRUE; - - /* Count the number of files in provided list of dpv_file_node's */ - if (use_dialog && pprompt != NULL && *pprompt != '\0') - pprompt_nls = dialog_prompt_nlstate(pprompt); - - max_cols = dialog_maxcols(); - if (label_size == -1) - shrink_label_size = TRUE; - - /* Process file arguments */ - for (curfile = file_list; curfile != NULL; curfile = curfile->next) { - dpv_nfiles++; - - /* dialog(3) only expands literal newlines */ - if (use_libdialog) strexpandnl(curfile->name); - - /* Optionally calculate label size for file */ - if (shrink_label_size) { - nls = FALSE; - name = curfile->name; - if (curfile == file_list) - nls = pprompt_nls; - last = (char *)dialog_prompt_lastline(name, nls); - if (use_dialog) { - c = *last; - *last = '\0'; - nls = dialog_prompt_nlstate(name); - *last = c; - } - len = dialog_prompt_longestline(last, nls); - if ((int)len > (label_size - 3)) { - if (label_size > 0) - label_size += 3; - label_size = len; - /* Room for ellipsis (unless NULL) */ - if (label_size > 0) - label_size += 3; - } - - if (max_cols > 0 && label_size > (max_cols - pbar_size - - 9)) - label_size = max_cols - pbar_size - 9; - } - - if (debug) - warnx("label=[%s] path=[%s] size=%lli", - curfile->name, curfile->path, curfile->length); - } /* file_list */ - - /* Optionally process the contents of DIALOGRC (~/.dialogrc) */ - if (use_dialog) { - res = parse_dialogrc(); - if (debug && res == 0) { - warnx("Successfully read `%s' config file", DIALOGRC); - warnx("use_shadow = %i (Boolean)", use_shadow); - warnx("use_colors = %i (Boolean)", use_colors); - warnx("gauge_color=[%s] (FBH)", gauge_color); - } - } else if (use_libdialog) { - init_dialog(stdin, stdout); - use_shadow = dialog_state.use_shadow; - use_colors = dialog_state.use_colors; - gauge_color[0] = 48 + dlg_color_table[GAUGE_ATTR].fg; - gauge_color[1] = 48 + dlg_color_table[GAUGE_ATTR].bg; - gauge_color[2] = dlg_color_table[GAUGE_ATTR].hilite ? - 'b' : 'B'; - gauge_color[3] = '\0'; - end_dialog(); - if (debug) { - warnx("Finished initializing dialog(3) library"); - warnx("use_shadow = %i (Boolean)", use_shadow); - warnx("use_colors = %i (Boolean)", use_colors); - warnx("gauge_color=[%s] (FBH)", gauge_color); - } - } - - /* Enable mini progress bar automatically for stdin streams if unable - * to calculate progress (missing `lines:' syntax). */ - if (dpv_nfiles <= 1 && file_list != NULL && file_list->length < 0 && - !dialog_test) - pbar_size = PBAR_SIZE_DEFAULT; - - /* If $USE_COLOR is set and non-NULL enable color; otherwise disable */ - if ((cp = getenv(ENV_USE_COLOR)) != 0) - use_color = *cp != '\0' ? 1 : 0; - - /* Print error and return `-1' if not given at least one name */ - if (dpv_nfiles == 0) { - warnx("%s: no labels provided", __func__); - return (-1); - } else if (debug) - warnx("%s: %u label%s provided", __func__, dpv_nfiles, - dpv_nfiles == 1 ? "" : "s"); - - /* If only one file and pbar size is zero, default to `-1' */ - if (dpv_nfiles <= 1 && pbar_size == 0) - pbar_size = -1; - - /* Print some debugging information */ - if (debug) { - warnx("%s: %s(%i) max rows x cols = %i x %i", - __func__, use_xdialog ? XDIALOG : DIALOG, - use_libdialog ? 3 : 1, dialog_maxrows(), - dialog_maxcols()); - } - - /* Xdialog(1) updates a lot slower than dialog(1) */ - if (dialog_test && use_xdialog) - increment = XDIALOG_INCREMENT; - - /* Always add implicit newline to pprompt (when specified) */ - if (pprompt != NULL && *pprompt != '\0') { - len = strlen(pprompt); - /* - * NOTE: pprompt = malloc(PPROMPT_MAX + 2) - * NOTE: (see getopt(2) section above for pprompt allocation) - */ - pprompt[len++] = '\\'; - pprompt[len++] = 'n'; - pprompt[len++] = '\0'; - } - - /* Xdialog(1) requires newlines (a) escaped and (b) in triplicate */ - if (use_xdialog && pprompt != NULL) { - /* Replace `\n' with `\n\\n\n' in pprompt */ - len = strlen(pprompt); - len += strcount(pprompt, "\\n") * 2; - if (len > DPV_PPROMPT_MAX) - errx(EXIT_FAILURE, "%s: Oops, pprompt buffer overflow " - "(%zu > %i)", __func__, len, DPV_PPROMPT_MAX); - if (replaceall(pprompt, "\\n", "\n\\n\n") < 0) - err(EXIT_FAILURE, "%s: replaceall()", __func__); - } - /* libdialog requires literal newlines */ - else if (use_libdialog && pprompt != NULL) - strexpandnl(pprompt); - - /* Xdialog(1) requires newlines (a) escaped and (b) in triplicate */ - if (use_xdialog && aprompt != NULL) { - /* Replace `\n' with `\n\\n\n' in aprompt */ - len = strlen(aprompt); - len += strcount(aprompt, "\\n") * 2; - if (len > DPV_APROMPT_MAX) - errx(EXIT_FAILURE, "%s: Oops, aprompt buffer overflow " - " (%zu > %i)", __func__, len, DPV_APROMPT_MAX); - if (replaceall(aprompt, "\\n", "\n\\n\n") < 0) - err(EXIT_FAILURE, "%s: replaceall()", __func__); - } - /* libdialog requires literal newlines */ - else if (use_libdialog && aprompt != NULL) - strexpandnl(aprompt); - - /* - * Warn user about an obscure dialog(1) bug (neither Xdialog(1) nor - * libdialog are affected) in the `--gauge' widget. If the first non- - * whitespace letter of "{new_prompt}" in "XXX\n{new_prompt}\nXXX\n" - * is a number, the number can sometimes be mistaken for a percentage - * to the overall progressbar. Other nasty side-effects such as the - * entire prompt not displaying or displaying improperly are caused by - * this bug too. - * - * NOTE: When we can use color, we have a work-around... prefix the - * output with `\Zn' (used to terminate ANSI and reset to normal). - */ - if (use_dialog && !use_color) { - backslash = 0; - - /* First, check pprompt (falls through if NULL) */ - fc = pprompt; - while (fc != NULL && *fc != '\0') { - if (*fc == '\n') /* leading literal newline OK */ - break; - if (!isspace(*fc) && *fc != '\\' && backslash == 0) - break; - else if (backslash > 0 && *fc != 'n') - break; - else if (*fc == '\\') { - backslash++; - if (backslash > 2) - break; /* we're safe */ - } - fc++; - } - /* First non-whitespace character that dialog(1) will see */ - if (fc != NULL && *fc >= '0' && *fc <= '9') - warnx("%s: WARNING! text argument to `-p' begins with " - "a number (not recommended)", __func__); - else if (fc > pprompt) - warnx("%s: WARNING! text argument to `-p' begins with " - "whitespace (not recommended)", __func__); - - /* - * If no pprompt or pprompt is all whitespace, check the first - * file name provided to make sure it is alright too. - */ - if ((pprompt == NULL || *fc == '\0') && file_list != NULL) { - first_file = file_list; - fc = first_file->name; - while (fc != NULL && *fc != '\0' && isspace(*fc)) - fc++; - /* First non-whitespace char that dialog(1) will see */ - if (fc != NULL && *fc >= '0' && *fc <= '9') - warnx("%s: WARNING! File name `%s' begins " - "with a number (use `-p text' for safety)", - __func__, first_file->name); - } - } - - dprompt_init(file_list); - /* Reads: label_size pbar_size pprompt aprompt dpv_nfiles */ - /* Inits: dheight and dwidth */ - - /* Default localeconv(3) settings for dialog(3) status */ - setlocale(LC_NUMERIC, - getenv("LC_ALL") == NULL && getenv("LC_NUMERIC") == NULL ? - LC_NUMERIC_DEFAULT : ""); - - if (!debug) { - /* Internally create the initial `--gauge' prompt text */ - dprompt_recreate(file_list, (struct dpv_file_node *)NULL, 0); - - /* Spawn [X]dialog(1) `--gauge', returning pipe descriptor */ - if (use_libdialog) { - status_printf(""); - dprompt_libprint(pprompt, aprompt, 0); - } else { - dprompt_sprint(init_prompt, pprompt, aprompt); - dialog_out = dialog_spawn_gauge(init_prompt, &pid); - dprompt_dprint(dialog_out, pprompt, aprompt, 0); - } - } /* !debug */ - - /* Seed the random(3) generator */ - if (dialog_test) - srandom(0xf1eeface); - - /* Set default/custom status line format */ - if (dpv_nfiles > 1) { - snprintf(status_format_default, DPV_STATUS_FORMAT_MAX, "%s", - DPV_STATUS_MANY); - status_format_custom = config->status_many; - } else { - snprintf(status_format_default, DPV_STATUS_FORMAT_MAX, "%s", - DPV_STATUS_SOLO); - status_format_custom = config->status_solo; - } - - /* Add test mode identifier to default status line if enabled */ - if (dialog_test && (strlen(status_format_default) + 12) < - DPV_STATUS_FORMAT_MAX) - strcat(status_format_default, " [TEST MODE]"); - - /* Verify custom status format */ - status_fmt = fmtcheck(status_format_custom, status_format_default); - if (status_format_custom != NULL && - status_fmt == status_format_default) { - warnx("WARNING! Invalid status_format configuration `%s'", - status_format_custom); - warnx("Default status_format `%s'", status_format_default); - } - - /* Record when we started (used to prevent updating too quickly) */ - (void)gettimeofday(&start, (struct timezone *)NULL); - - /* Calculate number of microseconds in-between sub-second updates */ - if (status_updates_per_second != 0) - status_update_usec = 1000000 / status_updates_per_second; - if (dialog_updates_per_second != 0) - dialog_update_usec = 1000000 / dialog_updates_per_second; - - /* - * Process the file list [serially] (one for each argument passed) - */ - files_left = dpv_nfiles; - list_head = file_list; - for (curfile = file_list; curfile != NULL; curfile = curfile->next) { - keep_going = TRUE; - output_out = -1; - pct = 0; - nthfile++; - files_left--; - - if (dpv_interrupt) - break; - if (dialog_test) - pct = 0 - increment; - - /* Attempt to spawn output program for this file */ - if (!dialog_test && output != NULL) { - mask = umask(0022); - (void)umask(mask); - - switch (output_type) { - case DPV_OUTPUT_SHELL: - output_out = shell_spawn_pipecmd(output, - curfile->name, &output_pid); - break; - case DPV_OUTPUT_FILE: - path_fmt = fmtcheck(output, "%s"); - if (path_fmt == output) - len = snprintf(pathbuf, - PATH_MAX, output, curfile->name); - else - len = snprintf(pathbuf, - PATH_MAX, "%s", output); - if (len >= PATH_MAX) { - warnx("%s:%d:%s: pathbuf[%u] too small" - "to hold output argument", - __FILE__, __LINE__, __func__, - PATH_MAX); - return (-1); - } - if ((output_out = open(pathbuf, - O_CREAT|O_WRONLY, DEFFILEMODE & ~mask)) - < 0) { - warn("%s", pathbuf); - return (-1); - } - break; - default: - break; - } - } - - while (!dpv_interrupt && keep_going) { - if (dialog_test) { - usleep(50000); - pct += increment; - dpv_overall_read += - (int)(random() / 512 / dpv_nfiles); - /* 512 limits fake readout to Megabytes */ - } else if (action != NULL) - pct = action(curfile, output_out); - - if (no_overrun || dialog_test) - keep_going = (pct < 100); - else { - status = curfile->status; - keep_going = (status == DPV_STATUS_RUNNING); - } - - /* Get current time and calculate seconds elapsed */ - gettimeofday(&now, (struct timezone *)NULL); - now.tv_sec = now.tv_sec - start.tv_sec; - now.tv_usec = now.tv_usec - start.tv_usec; - if (now.tv_usec < 0) - now.tv_sec--, now.tv_usec += 1000000; - seconds = now.tv_sec + (now.tv_usec / 1000000.0); - - /* Update dialog (be it dialog(3), dialog(1), etc.) */ - if ((dialog_updates_per_second != 0 && - ( - seconds != dialog_old_seconds || - now.tv_usec - dialog_last_update >= - dialog_update_usec || - nthfile != dialog_old_nthfile - )) || pct == 100 - ) { - /* Calculate overall progress (rounding up) */ - overall = (100 * nthfile - 100 + pct) / - dpv_nfiles; - if (((100 * nthfile - 100 + pct) * 10 / - dpv_nfiles % 100) > 50) - overall++; - - dprompt_recreate(list_head, curfile, pct); - - if (use_libdialog && !debug) { - /* Update dialog(3) widget */ - dprompt_libprint(pprompt, aprompt, - overall); - } else { - /* stdout, dialog(1), or Xdialog(1) */ - dprompt_dprint(dialog_out, pprompt, - aprompt, overall); - fsync(dialog_out); - } - dialog_old_seconds = seconds; - dialog_old_nthfile = nthfile; - dialog_last_update = now.tv_usec; - } - - /* Update the status line */ - if ((use_libdialog && !debug) && - status_updates_per_second != 0 && - ( - keep_going != TRUE || - seconds != status_old_seconds || - now.tv_usec - status_last_update >= - status_update_usec || - nthfile != status_old_nthfile - ) - ) { - status_printf(status_fmt, dpv_overall_read, - (dpv_overall_read / (seconds == 0 ? 1 : - seconds) * 1.0), - 1, /* XXX until we add parallelism XXX */ - files_left); - status_old_seconds = seconds; - status_old_nthfile = nthfile; - status_last_update = now.tv_usec; - } - } - - if (!dialog_test && output_out >= 0) { - close(output_out); - waitpid(output_pid, (int *)NULL, 0); - } - - if (dpv_abort) - break; - - /* Advance head of list when we hit the max display lines */ - if (display_limit > 0 && nthfile % display_limit == 0) - list_head = curfile->next; - } - - if (!debug) { - if (use_libdialog) - end_dialog(); - else { - close(dialog_out); - waitpid(pid, (int *)NULL, 0); - } - if (!keep_tite && !dpv_interrupt) - printf("\n"); - } else - warnx("%s: %lli overall read", __func__, dpv_overall_read); - - if (dpv_interrupt || dpv_abort) - return (-1); - else - return (0); -} - -/* - * Free allocated items initialized by dpv() - */ -void -dpv_free(void) -{ - dialogrc_free(); - dprompt_free(); - dialog_maxsize_free(); - if (aprompt != NULL) { - free(aprompt); - aprompt = NULL; - } - if (pprompt != NULL) { - free(pprompt); - pprompt = NULL; - } - status_free(); -} diff --git a/lib/libdpv/dpv.h b/lib/libdpv/dpv.h deleted file mode 100644 index 656de484dc5b..000000000000 --- a/lib/libdpv/dpv.h +++ /dev/null @@ -1,163 +0,0 @@ -/*- - * Copyright (c) 2013-2016 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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. - */ - -#ifndef _DPV_H_ -#define _DPV_H_ - -#include <sys/types.h> - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -/* localeconv(3) */ -#define LC_NUMERIC_DEFAULT "en_US.ISO8859-1" - -/* Data to process */ -extern long long dpv_overall_read; - -/* Interrupt flag */ -extern int dpv_interrupt; /* Set to TRUE in interrupt handler */ -extern int dpv_abort; /* Set to true in callback to abort */ - -/* - * Display types for use with display_type member of dpv_config structure - */ -enum dpv_display { - DPV_DISPLAY_LIBDIALOG = 0, /* Display using dialog(3) (default) */ - DPV_DISPLAY_STDOUT, /* Display on stdout */ - DPV_DISPLAY_DIALOG, /* Display using spawned dialog(1) */ - DPV_DISPLAY_XDIALOG, /* Display using spawned Xdialog(1) */ -}; - -/* - * Output types for use with output_type member of dpv_config structure - */ -enum dpv_output { - DPV_OUTPUT_NONE = 0, /* No output (default) */ - DPV_OUTPUT_FILE, /* Read `output' member as file path */ - DPV_OUTPUT_SHELL, /* Read `output' member as shell cmd */ -}; - -/* - * Activity types for use with status member of dpv_file_node structure. - * If you set a status other than DPV_STATUS_RUNNING on the current file in the - * action callback of dpv_config structure, you'll end callbacks for that - * dpv_file_node. - */ -enum dpv_status { - DPV_STATUS_RUNNING = 0, /* Running (default) */ - DPV_STATUS_DONE, /* Completed */ - DPV_STATUS_FAILED, /* Oops, something went wrong */ -}; - -/* - * Anatomy of file option; pass an array of these as dpv() file_list argument - * terminated with a NULL pointer. - */ -struct dpv_file_node { - enum dpv_status status; /* status of read operation */ - char *msg; /* display instead of "Done/Fail" */ - char *name; /* name of file to read */ - char *path; /* path to file */ - long long length; /* expected size */ - long long read; /* number units read (e.g., bytes) */ - struct dpv_file_node *next; /* pointer to next (end with NULL) */ -}; - -/* - * Anatomy of config option to pass as dpv() config argument - */ -struct dpv_config { - uint8_t keep_tite; /* Prevent visually distracting exit */ - enum dpv_display display_type; /* Display (default TYPE_LIBDIALOG) */ - enum dpv_output output_type; /* Output (default TYPE_NONE) */ - int debug; /* Enable debugging output on stderr */ - int display_limit; /* Files per `page'. Default -1 */ - int label_size; /* Label size. Default 28 */ - int pbar_size; /* Mini-progress size. See dpv(3) */ - int dialog_updates_per_second; /* Progress updates/s. Default 16 */ - int status_updates_per_second; /* dialog(3) status updates/second. - * Default 2 */ - uint16_t options; /* Special options. Default 0 */ - char *title; /* widget title */ - char *backtitle; /* Widget backtitle */ - char *aprompt; /* Prompt append. Default NULL */ - char *pprompt; /* Prompt prefix. Default NULL */ - char *msg_done; /* Progress text. Default `Done' */ - char *msg_fail; /* Progress text. Default `Fail' */ - char *msg_pending; /* Progress text. Default `Pending' */ - char *output; /* Output format string; see dpv(3) */ - const char *status_solo; /* dialog(3) solo-status format. - * Default DPV_STATUS_SOLO */ - const char *status_many; /* dialog(3) many-status format. - * Default DPV_STATUS_MANY */ - - /* - * Function pointer; action to perform data transfer - */ - int (*action)(struct dpv_file_node *file, int out); -}; - -/* - * Macros for dpv() options bitmask argument - */ -#define DPV_TEST_MODE 0x0001 /* Test mode (fake reading data) */ -#define DPV_WIDE_MODE 0x0002 /* prefix/append bump dialog width */ -#define DPV_NO_LABELS 0x0004 /* Hide file_node.name labels */ -#define DPV_USE_COLOR 0x0008 /* Override to force color output */ -#define DPV_NO_OVERRUN 0x0010 /* Stop transfers when they hit 100% */ - -/* - * Limits (modify with extreme care) - */ -#define DPV_APROMPT_MAX 4096 /* Buffer size for `-a text' */ -#define DPV_DISPLAY_LIMIT 10 /* Max file progress lines */ -#define DPV_PPROMPT_MAX 4096 /* Buffer size for `-p text' */ -#define DPV_STATUS_FORMAT_MAX 80 /* Buffer size for `-u format' */ - -/* - * Extra display information - */ -#define DPV_STATUS_SOLO "%'10lli bytes read @ %'9.1f bytes/sec." -#define DPV_STATUS_MANY (DPV_STATUS_SOLO " [%i/%i busy/wait]") - -/* - * Strings - */ -#define DPV_DONE_DEFAULT "Done" -#define DPV_FAIL_DEFAULT "Fail" -#define DPV_PENDING_DEFAULT "Pending" - -__BEGIN_DECLS -void dpv_free(void); -int dpv(struct dpv_config *_config, struct dpv_file_node *_file_list); -__END_DECLS - -#endif /* !_DPV_H_ */ diff --git a/lib/libdpv/dpv_private.h b/lib/libdpv/dpv_private.h deleted file mode 100644 index 79629c3377c2..000000000000 --- a/lib/libdpv/dpv_private.h +++ /dev/null @@ -1,65 +0,0 @@ -/*- - * Copyright (c) 2013-2016 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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. - */ - -#ifndef _DPV_PRIVATE_H_ -#define _DPV_PRIVATE_H_ - -#include <sys/types.h> - -/* Debugging */ -extern uint8_t debug; - -/* Data to process */ -extern unsigned int dpv_nfiles; - -/* Extra display information */ -extern uint8_t keep_tite; -extern uint8_t no_labels; -extern uint8_t wide; -extern char *msg_done, *msg_fail, *msg_pending; -extern char *pprompt, *aprompt; -extern const char status_format[]; - -/* Defaults */ -#define DIALOG_UPDATES_PER_SEC 16 -#define XDIALOG_UPDATES_PER_SEC 4 -#define DISPLAY_LIMIT_DEFAULT 0 /* Auto-calculate */ -#define LABEL_SIZE_DEFAULT 28 -#define PBAR_SIZE_DEFAULT 17 -#define STATUS_UPDATES_PER_SEC 2 - -/* states for dprompt_add_files() of dprompt.c */ -enum dprompt_state { - DPROMPT_NONE = 0, /* Default */ - DPROMPT_PENDING, /* Pending */ - DPROMPT_PBAR, /* Progress bar */ - DPROMPT_END_STATE, /* Done/Fail */ - DPROMPT_DETAILS, /* dpv_file_node->read */ - DPROMPT_CUSTOM_MSG, /* dpv_file_node->msg */ - DPROMPT_MINIMAL, /* whitespace */ -}; - -#endif /* !_DPV_PRIVATE_H_ */ diff --git a/lib/libdpv/status.c b/lib/libdpv/status.c deleted file mode 100644 index de2bdc45fdd2..000000000000 --- a/lib/libdpv/status.c +++ /dev/null @@ -1,109 +0,0 @@ -/*- - * Copyright (c) 2013-2014 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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 <sys/cdefs.h> -#include <curses.h> -#include <dialog.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> - -#include "dialog_util.h" -#include "status.h" - -/* static globals */ -static char *status_buf = NULL; -static int status_bufsize = -1; -static int status_row; -static int status_width; - -/* - * Print a `one-liner' status message at the bottom of the screen. Messages are - * trimmed to fit within the console length (ANSI coloring not accounted for). - */ -void -status_printf(const char *fmt, ...) -{ - int n, attrs; - chtype color = dlg_color_pair(dlg_color_table[BUTTON_ACTIVE_ATTR].fg, - dlg_color_table[SCREEN_ATTR].bg) | A_BOLD; - va_list args; - - status_row = tty_maxrows() - 1; - status_width = tty_maxcols(); - - /* NULL is a special convention meaning "erase the old stuff" */ - if (fmt == NULL) { - move(status_row, 0); - clrtoeol(); - return; - } - - /* Resize buffer if terminal width is greater */ - if ((status_width + 1) > status_bufsize) { - status_buf = realloc(status_buf, status_width + 1); - if (status_buf == NULL) { - status_bufsize = -1; - return; - } - status_bufsize = status_width + 1; - } - - /* Print the message within a space-filled buffer */ - memset(status_buf, ' ', status_width); - va_start(args, fmt); - n = vsnprintf(status_buf, status_width + 1, fmt, args); - va_end(args); - - /* If vsnprintf(3) produced less bytes than the maximum, change the - * implicitly-added NUL-terminator into a space and terminate at max */ - if (n < status_width) { - status_buf[n] = ' '; - status_buf[status_width] = '\0'; - } - - /* Print text in screen bg, button active fg, and bold */ - attrs = getattrs(stdscr); - attrset(color); - mvaddstr(status_row, 0, status_buf); - attrset(attrs); - - /* Seat the cursor over the last character at absolute lower-right */ - move(status_row, status_width - 1); - refresh(); -} - -/* - * Free allocated items initialized by status_printf() - */ -void -status_free(void) -{ - if (status_buf != NULL) { - free(status_buf); - status_buf = NULL; - } -} diff --git a/lib/libdpv/status.h b/lib/libdpv/status.h deleted file mode 100644 index a07767cb424b..000000000000 --- a/lib/libdpv/status.h +++ /dev/null @@ -1,41 +0,0 @@ -/*- - * Copyright (c) 2013-2014 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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. - */ - -#ifndef _STATUS_H_ -#define _STATUS_H_ - -#include <sys/cdefs.h> - -/* dialog(3) dlg_color_table[] attributes */ -#define SCREEN_ATTR 0 /* entry used for status line bg */ -#define BUTTON_ACTIVE_ATTR 5 /* entry used for status line fg */ - -__BEGIN_DECLS -void status_free(void); -void status_printf(const char *_format, ...); -__END_DECLS - -#endif /* !_STATUS_H_ */ diff --git a/lib/libdpv/util.c b/lib/libdpv/util.c deleted file mode 100644 index 4b2393b45821..000000000000 --- a/lib/libdpv/util.c +++ /dev/null @@ -1,104 +0,0 @@ -/*- - * Copyright (c) 2013-2018 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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 <sys/cdefs.h> -#include <err.h> -#include <limits.h> -#include <spawn.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "util.h" - -extern char **environ; -static char cmdbuf[CMDBUFMAX] = ""; -static char shellcmd[PATH_MAX] = PATH_SHELL; -static char *shellcmd_argv[6] = { - shellcmd, - __DECONST(char *, "-c"), - cmdbuf, - __DECONST(char *, "--"), - shellcmd, - NULL, -}; - -/* - * Spawn a sh(1) command. Writes the resulting process ID to the pid_t pointed - * at by `pid'. Returns a file descriptor (int) suitable for writing data to - * the spawned command (data written to file descriptor is seen as standard-in - * by the spawned sh(1) command). Returns `-1' if unable to spawn command. - * - * If cmd contains a single "%s" sequence, replace it with label if non-NULL. - */ -int -shell_spawn_pipecmd(const char *cmd, const char *label, pid_t *pid) -{ - int error; - int len; - posix_spawn_file_actions_t action; -#if SHELL_SPAWN_DEBUG - unsigned int i; -#endif - int stdin_pipe[2] = { -1, -1 }; - - /* Populate argument array */ - if (label != NULL && fmtcheck(cmd, "%s") == cmd) - len = snprintf(cmdbuf, CMDBUFMAX, cmd, label); - else - len = snprintf(cmdbuf, CMDBUFMAX, "%s", cmd); - if (len >= CMDBUFMAX) { - warnx("%s:%d:%s: cmdbuf[%u] too small to hold cmd argument", - __FILE__, __LINE__, __func__, CMDBUFMAX); - return (-1); - } - - /* Open a pipe to communicate with [X]dialog(1) */ - if (pipe(stdin_pipe) < 0) - err(EXIT_FAILURE, "%s: pipe(2)", __func__); - - /* Fork sh(1) process */ -#if SHELL_SPAWN_DEBUG - fprintf(stderr, "%s: spawning `", __func__); - for (i = 0; shellcmd_argv[i] != NULL; i++) { - if (i == 0) - fprintf(stderr, "%s", shellcmd_argv[i]); - else if (i == 2) - fprintf(stderr, " '%s'", shellcmd_argv[i]); - else - fprintf(stderr, " %s", shellcmd_argv[i]); - } - fprintf(stderr, "'\n"); -#endif - posix_spawn_file_actions_init(&action); - posix_spawn_file_actions_adddup2(&action, stdin_pipe[0], STDIN_FILENO); - posix_spawn_file_actions_addclose(&action, stdin_pipe[1]); - error = posix_spawnp(pid, shellcmd, &action, - (const posix_spawnattr_t *)NULL, shellcmd_argv, environ); - if (error != 0) err(EXIT_FAILURE, "%s", shellcmd); - - return stdin_pipe[1]; -} diff --git a/lib/libdpv/util.h b/lib/libdpv/util.h deleted file mode 100644 index ed2b5f7269a5..000000000000 --- a/lib/libdpv/util.h +++ /dev/null @@ -1,48 +0,0 @@ -/*- - * Copyright (c) 2013-2016 Devin Teske <dteske@FreeBSD.org> - * All rights reserved. - * - * 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. - */ - -#ifndef _UTIL_H_ -#define _UTIL_H_ - -#include <sys/types.h> - -#include <paths.h> - -#define SHELL_SPAWN_DEBUG 0 /* Debug spawning of sh(1) commands */ - -#ifdef _PATH_BSHELL -#define PATH_SHELL _PATH_BSHELL -#else -#define PATH_SHELL "/bin/sh" -#endif - -#define CMDBUFMAX 65536 - -__BEGIN_DECLS -int shell_spawn_pipecmd(const char *_cmd, const char *_label, pid_t *_pid); -__END_DECLS - -#endif /* !_UTIL_H_ */ |
