1041394f3SDevin Teske /*- 2*1a5f047aSDevin Teske * Copyright (c) 2013-2016 Devin Teske <dteske@FreeBSD.org> 3041394f3SDevin Teske * All rights reserved. 4041394f3SDevin Teske * 5041394f3SDevin Teske * Redistribution and use in source and binary forms, with or without 6041394f3SDevin Teske * modification, are permitted provided that the following conditions 7041394f3SDevin Teske * are met: 8041394f3SDevin Teske * 1. Redistributions of source code must retain the above copyright 9041394f3SDevin Teske * notice, this list of conditions and the following disclaimer. 10041394f3SDevin Teske * 2. Redistributions in binary form must reproduce the above copyright 11041394f3SDevin Teske * notice, this list of conditions and the following disclaimer in the 12041394f3SDevin Teske * documentation and/or other materials provided with the distribution. 13041394f3SDevin Teske * 14041394f3SDevin Teske * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15041394f3SDevin Teske * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16041394f3SDevin Teske * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17041394f3SDevin Teske * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18041394f3SDevin Teske * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19041394f3SDevin Teske * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20041394f3SDevin Teske * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21041394f3SDevin Teske * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22041394f3SDevin Teske * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23041394f3SDevin Teske * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24041394f3SDevin Teske * SUCH DAMAGE. 25041394f3SDevin Teske */ 26041394f3SDevin Teske 27041394f3SDevin Teske #ifndef _DPV_H_ 28041394f3SDevin Teske #define _DPV_H_ 29041394f3SDevin Teske 30041394f3SDevin Teske #include <sys/types.h> 31041394f3SDevin Teske 32041394f3SDevin Teske #ifndef TRUE 33041394f3SDevin Teske #define TRUE 1 34041394f3SDevin Teske #endif 35041394f3SDevin Teske #ifndef FALSE 36041394f3SDevin Teske #define FALSE 0 37041394f3SDevin Teske #endif 38041394f3SDevin Teske 399e35cfceSDevin Teske /* localeconv(3) */ 409e35cfceSDevin Teske #define LC_NUMERIC_DEFAULT "en_US.ISO8859-1" 419e35cfceSDevin Teske 42041394f3SDevin Teske /* Data to process */ 43041394f3SDevin Teske extern long long dpv_overall_read; 44041394f3SDevin Teske 45041394f3SDevin Teske /* Interrupt flag */ 46041394f3SDevin Teske extern int dpv_interrupt; /* Set to TRUE in interrupt handler */ 47041394f3SDevin Teske extern int dpv_abort; /* Set to true in callback to abort */ 48041394f3SDevin Teske 49041394f3SDevin Teske /* 50041394f3SDevin Teske * Display types for use with display_type member of dpv_config structure 51041394f3SDevin Teske */ 52041394f3SDevin Teske enum dpv_display { 53041394f3SDevin Teske DPV_DISPLAY_LIBDIALOG = 0, /* Display using dialog(3) (default) */ 54041394f3SDevin Teske DPV_DISPLAY_STDOUT, /* Display on stdout */ 55041394f3SDevin Teske DPV_DISPLAY_DIALOG, /* Display using spawned dialog(1) */ 56041394f3SDevin Teske DPV_DISPLAY_XDIALOG, /* Display using spawned Xdialog(1) */ 57041394f3SDevin Teske }; 58041394f3SDevin Teske 59041394f3SDevin Teske /* 60041394f3SDevin Teske * Output types for use with output_type member of dpv_config structure 61041394f3SDevin Teske */ 62041394f3SDevin Teske enum dpv_output { 63041394f3SDevin Teske DPV_OUTPUT_NONE = 0, /* No output (default) */ 64041394f3SDevin Teske DPV_OUTPUT_FILE, /* Read `output' member as file path */ 65041394f3SDevin Teske DPV_OUTPUT_SHELL, /* Read `output' member as shell cmd */ 66041394f3SDevin Teske }; 67041394f3SDevin Teske 68041394f3SDevin Teske /* 69041394f3SDevin Teske * Activity types for use with status member of dpv_file_node structure. 70041394f3SDevin Teske * If you set a status other than DPV_STATUS_RUNNING on the current file in the 71041394f3SDevin Teske * action callback of dpv_config structure, you'll end callbacks for that 72041394f3SDevin Teske * dpv_file_node. 73041394f3SDevin Teske */ 74041394f3SDevin Teske enum dpv_status { 75041394f3SDevin Teske DPV_STATUS_RUNNING = 0, /* Running (default) */ 76041394f3SDevin Teske DPV_STATUS_DONE, /* Completed */ 77041394f3SDevin Teske DPV_STATUS_FAILED, /* Oops, something went wrong */ 78041394f3SDevin Teske }; 79041394f3SDevin Teske 80041394f3SDevin Teske /* 81041394f3SDevin Teske * Anatomy of file option; pass an array of these as dpv() file_list argument 82041394f3SDevin Teske * terminated with a NULL pointer. 83041394f3SDevin Teske */ 84041394f3SDevin Teske struct dpv_file_node { 85041394f3SDevin Teske enum dpv_status status; /* status of read operation */ 86041394f3SDevin Teske char *msg; /* display instead of "Done/Fail" */ 87041394f3SDevin Teske char *name; /* name of file to read */ 88041394f3SDevin Teske char *path; /* path to file */ 89041394f3SDevin Teske long long length; /* expected size */ 90041394f3SDevin Teske long long read; /* number units read (e.g., bytes) */ 91041394f3SDevin Teske struct dpv_file_node *next; /* pointer to next (end with NULL) */ 92041394f3SDevin Teske }; 93041394f3SDevin Teske 94041394f3SDevin Teske /* 95041394f3SDevin Teske * Anatomy of config option to pass as dpv() config argument 96041394f3SDevin Teske */ 97041394f3SDevin Teske struct dpv_config { 9880f7300dSDevin Teske uint8_t keep_tite; /* Prevent visually distracting exit */ 99041394f3SDevin Teske enum dpv_display display_type; /* Display (default TYPE_LIBDIALOG) */ 100041394f3SDevin Teske enum dpv_output output_type; /* Output (default TYPE_NONE) */ 101041394f3SDevin Teske int debug; /* Enable debugging output on stderr */ 102041394f3SDevin Teske int display_limit; /* Files per `page'. Default -1 */ 103041394f3SDevin Teske int label_size; /* Label size. Default 28 */ 104041394f3SDevin Teske int pbar_size; /* Mini-progress size. See dpv(3) */ 105041394f3SDevin Teske int dialog_updates_per_second; /* Progress updates/s. Default 16 */ 106041394f3SDevin Teske int status_updates_per_second; /* dialog(3) status updates/second. 107041394f3SDevin Teske * Default 2 */ 108041394f3SDevin Teske uint16_t options; /* Special options. Default 0 */ 109041394f3SDevin Teske char *title; /* widget title */ 110041394f3SDevin Teske char *backtitle; /* Widget backtitle */ 111041394f3SDevin Teske char *aprompt; /* Prompt append. Default NULL */ 112041394f3SDevin Teske char *pprompt; /* Prompt prefix. Default NULL */ 113041394f3SDevin Teske char *msg_done; /* Progress text. Default `Done' */ 114041394f3SDevin Teske char *msg_fail; /* Progress text. Default `Fail' */ 115041394f3SDevin Teske char *msg_pending; /* Progress text. Default `Pending' */ 116041394f3SDevin Teske char *output; /* Output format string; see dpv(3) */ 117041394f3SDevin Teske const char *status_solo; /* dialog(3) solo-status format. 118041394f3SDevin Teske * Default DPV_STATUS_SOLO */ 119041394f3SDevin Teske const char *status_many; /* dialog(3) many-status format. 120041394f3SDevin Teske * Default DPV_STATUS_MANY */ 121041394f3SDevin Teske 122041394f3SDevin Teske /* 123041394f3SDevin Teske * Function pointer; action to perform data transfer 124041394f3SDevin Teske */ 125041394f3SDevin Teske int (*action)(struct dpv_file_node *file, int out); 126041394f3SDevin Teske }; 127041394f3SDevin Teske 128041394f3SDevin Teske /* 129041394f3SDevin Teske * Macros for dpv() options bitmask argument 130041394f3SDevin Teske */ 131041394f3SDevin Teske #define DPV_TEST_MODE 0x0001 /* Test mode (fake reading data) */ 132041394f3SDevin Teske #define DPV_WIDE_MODE 0x0002 /* prefix/append bump dialog width */ 133041394f3SDevin Teske #define DPV_NO_LABELS 0x0004 /* Hide file_node.name labels */ 134041394f3SDevin Teske #define DPV_USE_COLOR 0x0008 /* Override to force color output */ 135041394f3SDevin Teske #define DPV_NO_OVERRUN 0x0010 /* Stop transfers when they hit 100% */ 136041394f3SDevin Teske 137041394f3SDevin Teske /* 138041394f3SDevin Teske * Limits (modify with extreme care) 139041394f3SDevin Teske */ 140041394f3SDevin Teske #define DPV_APROMPT_MAX 4096 /* Buffer size for `-a text' */ 141041394f3SDevin Teske #define DPV_DISPLAY_LIMIT 10 /* Max file progress lines */ 142041394f3SDevin Teske #define DPV_PPROMPT_MAX 4096 /* Buffer size for `-p text' */ 143041394f3SDevin Teske #define DPV_STATUS_FORMAT_MAX 80 /* Buffer size for `-u format' */ 144041394f3SDevin Teske 145041394f3SDevin Teske /* 146041394f3SDevin Teske * Extra display information 147041394f3SDevin Teske */ 148041394f3SDevin Teske #define DPV_STATUS_SOLO "%'10lli bytes read @ %'9.1f bytes/sec." 149041394f3SDevin Teske #define DPV_STATUS_MANY (DPV_STATUS_SOLO " [%i/%i busy/wait]") 150041394f3SDevin Teske 151041394f3SDevin Teske /* 152041394f3SDevin Teske * Strings 153041394f3SDevin Teske */ 154041394f3SDevin Teske #define DPV_DONE_DEFAULT "Done" 155041394f3SDevin Teske #define DPV_FAIL_DEFAULT "Fail" 156041394f3SDevin Teske #define DPV_PENDING_DEFAULT "Pending" 157041394f3SDevin Teske 158041394f3SDevin Teske __BEGIN_DECLS 159041394f3SDevin Teske void dpv_free(void); 160041394f3SDevin Teske int dpv(struct dpv_config *_config, struct dpv_file_node *_file_list); 161041394f3SDevin Teske __END_DECLS 162041394f3SDevin Teske 163041394f3SDevin Teske #endif /* !_DPV_H_ */ 164