1041394f3SDevin Teske /*- 2041394f3SDevin Teske * Copyright (c) 2013-2014 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 * $FreeBSD$ 27041394f3SDevin Teske */ 28041394f3SDevin Teske 29041394f3SDevin Teske #ifndef _DPV_H_ 30041394f3SDevin Teske #define _DPV_H_ 31041394f3SDevin Teske 32041394f3SDevin Teske #include <sys/types.h> 33041394f3SDevin Teske 34041394f3SDevin Teske #ifndef TRUE 35041394f3SDevin Teske #define TRUE 1 36041394f3SDevin Teske #endif 37041394f3SDevin Teske #ifndef FALSE 38041394f3SDevin Teske #define FALSE 0 39041394f3SDevin Teske #endif 40041394f3SDevin Teske 419e35cfceSDevin Teske /* localeconv(3) */ 429e35cfceSDevin Teske #define LC_NUMERIC_DEFAULT "en_US.ISO8859-1" 439e35cfceSDevin Teske 44041394f3SDevin Teske /* Data to process */ 45041394f3SDevin Teske extern long long dpv_overall_read; 46041394f3SDevin Teske 47041394f3SDevin Teske /* Interrupt flag */ 48041394f3SDevin Teske extern int dpv_interrupt; /* Set to TRUE in interrupt handler */ 49041394f3SDevin Teske extern int dpv_abort; /* Set to true in callback to abort */ 50041394f3SDevin Teske 51041394f3SDevin Teske /* 52041394f3SDevin Teske * Display types for use with display_type member of dpv_config structure 53041394f3SDevin Teske */ 54041394f3SDevin Teske enum dpv_display { 55041394f3SDevin Teske DPV_DISPLAY_LIBDIALOG = 0, /* Display using dialog(3) (default) */ 56041394f3SDevin Teske DPV_DISPLAY_STDOUT, /* Display on stdout */ 57041394f3SDevin Teske DPV_DISPLAY_DIALOG, /* Display using spawned dialog(1) */ 58041394f3SDevin Teske DPV_DISPLAY_XDIALOG, /* Display using spawned Xdialog(1) */ 59041394f3SDevin Teske }; 60041394f3SDevin Teske 61041394f3SDevin Teske /* 62041394f3SDevin Teske * Output types for use with output_type member of dpv_config structure 63041394f3SDevin Teske */ 64041394f3SDevin Teske enum dpv_output { 65041394f3SDevin Teske DPV_OUTPUT_NONE = 0, /* No output (default) */ 66041394f3SDevin Teske DPV_OUTPUT_FILE, /* Read `output' member as file path */ 67041394f3SDevin Teske DPV_OUTPUT_SHELL, /* Read `output' member as shell cmd */ 68041394f3SDevin Teske }; 69041394f3SDevin Teske 70041394f3SDevin Teske /* 71041394f3SDevin Teske * Activity types for use with status member of dpv_file_node structure. 72041394f3SDevin Teske * If you set a status other than DPV_STATUS_RUNNING on the current file in the 73041394f3SDevin Teske * action callback of dpv_config structure, you'll end callbacks for that 74041394f3SDevin Teske * dpv_file_node. 75041394f3SDevin Teske */ 76041394f3SDevin Teske enum dpv_status { 77041394f3SDevin Teske DPV_STATUS_RUNNING = 0, /* Running (default) */ 78041394f3SDevin Teske DPV_STATUS_DONE, /* Completed */ 79041394f3SDevin Teske DPV_STATUS_FAILED, /* Oops, something went wrong */ 80041394f3SDevin Teske }; 81041394f3SDevin Teske 82041394f3SDevin Teske /* 83041394f3SDevin Teske * Anatomy of file option; pass an array of these as dpv() file_list argument 84041394f3SDevin Teske * terminated with a NULL pointer. 85041394f3SDevin Teske */ 86041394f3SDevin Teske struct dpv_file_node { 87041394f3SDevin Teske enum dpv_status status; /* status of read operation */ 88041394f3SDevin Teske char *msg; /* display instead of "Done/Fail" */ 89041394f3SDevin Teske char *name; /* name of file to read */ 90041394f3SDevin Teske char *path; /* path to file */ 91041394f3SDevin Teske long long length; /* expected size */ 92041394f3SDevin Teske long long read; /* number units read (e.g., bytes) */ 93041394f3SDevin Teske struct dpv_file_node *next; /* pointer to next (end with NULL) */ 94041394f3SDevin Teske }; 95041394f3SDevin Teske 96041394f3SDevin Teske /* 97041394f3SDevin Teske * Anatomy of config option to pass as dpv() config argument 98041394f3SDevin Teske */ 99041394f3SDevin Teske struct dpv_config { 100*80f7300dSDevin Teske uint8_t keep_tite; /* Prevent visually distracting exit */ 101041394f3SDevin Teske enum dpv_display display_type; /* Display (default TYPE_LIBDIALOG) */ 102041394f3SDevin Teske enum dpv_output output_type; /* Output (default TYPE_NONE) */ 103041394f3SDevin Teske int debug; /* Enable debugging output on stderr */ 104041394f3SDevin Teske int display_limit; /* Files per `page'. Default -1 */ 105041394f3SDevin Teske int label_size; /* Label size. Default 28 */ 106041394f3SDevin Teske int pbar_size; /* Mini-progress size. See dpv(3) */ 107041394f3SDevin Teske int dialog_updates_per_second; /* Progress updates/s. Default 16 */ 108041394f3SDevin Teske int status_updates_per_second; /* dialog(3) status updates/second. 109041394f3SDevin Teske * Default 2 */ 110041394f3SDevin Teske uint16_t options; /* Special options. Default 0 */ 111041394f3SDevin Teske char *title; /* widget title */ 112041394f3SDevin Teske char *backtitle; /* Widget backtitle */ 113041394f3SDevin Teske char *aprompt; /* Prompt append. Default NULL */ 114041394f3SDevin Teske char *pprompt; /* Prompt prefix. Default NULL */ 115041394f3SDevin Teske char *msg_done; /* Progress text. Default `Done' */ 116041394f3SDevin Teske char *msg_fail; /* Progress text. Default `Fail' */ 117041394f3SDevin Teske char *msg_pending; /* Progress text. Default `Pending' */ 118041394f3SDevin Teske char *output; /* Output format string; see dpv(3) */ 119041394f3SDevin Teske const char *status_solo; /* dialog(3) solo-status format. 120041394f3SDevin Teske * Default DPV_STATUS_SOLO */ 121041394f3SDevin Teske const char *status_many; /* dialog(3) many-status format. 122041394f3SDevin Teske * Default DPV_STATUS_MANY */ 123041394f3SDevin Teske 124041394f3SDevin Teske /* 125041394f3SDevin Teske * Function pointer; action to perform data transfer 126041394f3SDevin Teske */ 127041394f3SDevin Teske int (*action)(struct dpv_file_node *file, int out); 128041394f3SDevin Teske }; 129041394f3SDevin Teske 130041394f3SDevin Teske /* 131041394f3SDevin Teske * Macros for dpv() options bitmask argument 132041394f3SDevin Teske */ 133041394f3SDevin Teske #define DPV_TEST_MODE 0x0001 /* Test mode (fake reading data) */ 134041394f3SDevin Teske #define DPV_WIDE_MODE 0x0002 /* prefix/append bump dialog width */ 135041394f3SDevin Teske #define DPV_NO_LABELS 0x0004 /* Hide file_node.name labels */ 136041394f3SDevin Teske #define DPV_USE_COLOR 0x0008 /* Override to force color output */ 137041394f3SDevin Teske #define DPV_NO_OVERRUN 0x0010 /* Stop transfers when they hit 100% */ 138041394f3SDevin Teske 139041394f3SDevin Teske /* 140041394f3SDevin Teske * Limits (modify with extreme care) 141041394f3SDevin Teske */ 142041394f3SDevin Teske #define DPV_APROMPT_MAX 4096 /* Buffer size for `-a text' */ 143041394f3SDevin Teske #define DPV_DISPLAY_LIMIT 10 /* Max file progress lines */ 144041394f3SDevin Teske #define DPV_PPROMPT_MAX 4096 /* Buffer size for `-p text' */ 145041394f3SDevin Teske #define DPV_STATUS_FORMAT_MAX 80 /* Buffer size for `-u format' */ 146041394f3SDevin Teske 147041394f3SDevin Teske /* 148041394f3SDevin Teske * Extra display information 149041394f3SDevin Teske */ 150041394f3SDevin Teske #define DPV_STATUS_SOLO "%'10lli bytes read @ %'9.1f bytes/sec." 151041394f3SDevin Teske #define DPV_STATUS_MANY (DPV_STATUS_SOLO " [%i/%i busy/wait]") 152041394f3SDevin Teske 153041394f3SDevin Teske /* 154041394f3SDevin Teske * Strings 155041394f3SDevin Teske */ 156041394f3SDevin Teske #define DPV_DONE_DEFAULT "Done" 157041394f3SDevin Teske #define DPV_FAIL_DEFAULT "Fail" 158041394f3SDevin Teske #define DPV_PENDING_DEFAULT "Pending" 159041394f3SDevin Teske 160041394f3SDevin Teske __BEGIN_DECLS 161041394f3SDevin Teske void dpv_free(void); 162041394f3SDevin Teske int dpv(struct dpv_config *_config, struct dpv_file_node *_file_list); 163041394f3SDevin Teske __END_DECLS 164041394f3SDevin Teske 165041394f3SDevin Teske #endif /* !_DPV_H_ */ 166