Lines Matching +full:read +full:- +full:out
1 /*-
2 * Copyright (c) 2013-2016 Devin Teske <dteske@FreeBSD.org>
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 static int fd = -1;
64 static uint8_t multiple = FALSE; /* `-m' */
71 static int operate_common(struct dpv_file_node *file, int out);
72 static int operate_on_bytes(struct dpv_file_node *file, int out);
73 static int operate_on_lines(struct dpv_file_node *file, int out);
76 operate_common(struct dpv_file_node *file, int out) in operate_common() argument
84 if (realpath(file->path, rpath) == 0 || in operate_common()
86 warn("%s", file->path); in operate_common()
87 file->status = DPV_STATUS_FAILED; in operate_common()
88 return (-1); in operate_common()
100 close(fd--); in operate_common()
111 fd -= 1; in operate_common()
114 fd -= 2; in operate_common()
123 if (out >= 0) { in operate_common()
124 if (fstat(out, &sb) != 0) { in operate_common()
125 warn("%i", out); in operate_common()
126 file->status = DPV_STATUS_FAILED; in operate_common()
127 return (-1); in operate_common()
144 err(EXIT_FAILURE, "Out of memory?!"); in operate_common()
152 operate_on_bytes(struct dpv_file_node *file, int out) in operate_on_bytes() argument
157 if (operate_common(file, out) < 0) in operate_on_bytes()
158 return (-1); in operate_on_bytes()
160 /* [Re-]Fill the buffer */ in operate_on_bytes()
161 if ((r = read(fd, buf, bsize)) <= 0) { in operate_on_bytes()
164 fd = -1; in operate_on_bytes()
165 file->status = DPV_STATUS_DONE; in operate_on_bytes()
169 /* [Re-]Dump the buffer */ in operate_on_bytes()
170 if (out >= 0) { in operate_on_bytes()
171 if ((w = write(out, buf, r)) < 0) { in operate_on_bytes()
175 fsync(out); in operate_on_bytes()
179 file->read += r; in operate_on_bytes()
182 if (file->length >= 0) { in operate_on_bytes()
183 progress = (file->read * 100 / (file->length > 0 ? in operate_on_bytes()
184 file->length : 1)); in operate_on_bytes()
186 /* If no_overrun, do not return 100% until read >= length */ in operate_on_bytes()
187 if (no_overrun && progress == 100 && file->read < file->length) in operate_on_bytes()
188 progress--; in operate_on_bytes()
192 return (-1); in operate_on_bytes()
196 operate_on_lines(struct dpv_file_node *file, int out) in operate_on_lines() argument
202 if (operate_common(file, out) < 0) in operate_on_lines()
203 return (-1); in operate_on_lines()
205 /* [Re-]Fill the buffer */ in operate_on_lines()
206 if ((r = read(fd, buf, bsize)) <= 0) { in operate_on_lines()
209 fd = -1; in operate_on_lines()
210 file->status = DPV_STATUS_DONE; in operate_on_lines()
215 /* [Re-]Dump the buffer */ in operate_on_lines()
216 if (out >= 0) { in operate_on_lines()
217 if ((w = write(out, buf, r)) < 0) { in operate_on_lines()
221 fsync(out); in operate_on_lines()
227 dpv_overall_read++, p++, file->read++; in operate_on_lines()
230 if (file->length >= 0) { in operate_on_lines()
231 progress = (file->read * 100 / file->length); in operate_on_lines()
233 /* If no_overrun, do not return 100% until read >= length */ in operate_on_lines()
234 if (no_overrun && progress == 100 && file->read < file->length) in operate_on_lines()
235 progress--; in operate_on_lines()
239 return (-1); in operate_on_lines()
244 * stdin or fifos and produces necessary config to drive dpv(3) `--gauge'
245 * widget. If the `-d' flag is used, output is instead send to terminal
265 errx(EXIT_FAILURE, "Out of memory?!"); in main()
269 * Process command-line options in main()
272 "a:b:dDhi:I:klL:mn:No:p:P:t:TU:wx:X")) != -1) { in main()
275 if (config->aprompt == NULL) { in main()
276 config->aprompt = malloc(DPV_APROMPT_MAX); in main()
277 if (config->aprompt == NULL) in main()
278 errx(EXIT_FAILURE, "Out of memory?!"); in main()
280 snprintf(config->aprompt, DPV_APROMPT_MAX, "%s", in main()
284 if (config->backtitle != NULL) in main()
285 free((char *)config->backtitle); in main()
286 config->backtitle = malloc(strlen(optarg) + 1); in main()
287 if (config->backtitle == NULL) in main()
288 errx(EXIT_FAILURE, "Out of memory?!"); in main()
289 *(config->backtitle) = '\0'; in main()
290 strcat(config->backtitle, optarg); in main()
294 config->debug = debug; in main()
297 config->display_type = DPV_DISPLAY_DIALOG; in main()
302 case 'i': /* status line format string for single-file */ in main()
303 config->status_solo = optarg; in main()
305 case 'I': /* status line format string for many-files */ in main()
306 config->status_many = optarg; in main()
309 config->keep_tite = TRUE; in main()
315 config->label_size = in main()
317 if (config->label_size == 0 && errno == EINVAL) in main()
319 "`-L' argument must be numeric"); in main()
320 else if (config->label_size < -1) in main()
321 config->label_size = -1; in main()
326 case 'o': /* `-o path' for sending data-read to file */ in main()
328 config->output_type = DPV_OUTPUT_FILE; in main()
329 config->output = optarg; in main()
332 config->display_limit = in main()
334 if (config->display_limit == 0 && errno == EINVAL) in main()
336 "`-n' argument must be numeric"); in main()
337 else if (config->display_limit < 0) in main()
338 config->display_limit = -1; in main()
340 case 'N': /* No overrun (truncate reads of known-length) */ in main()
342 config->options |= DPV_NO_OVERRUN; in main()
345 if (config->pprompt == NULL) { in main()
346 config->pprompt = malloc(DPV_PPROMPT_MAX + 2); in main()
347 if (config->pprompt == NULL) in main()
348 errx(EXIT_FAILURE, "Out of memory?!"); in main()
351 snprintf(config->pprompt, DPV_PPROMPT_MAX, "%s", in main()
354 case 'P': /* custom size for mini-progressbar */ in main()
355 config->pbar_size = in main()
357 if (config->pbar_size == 0 && errno == EINVAL) in main()
359 "`-P' argument must be numeric"); in main()
360 else if (config->pbar_size < -1) in main()
361 config->pbar_size = -1; in main()
364 if (config->title != NULL) in main()
365 free(config->title); in main()
366 config->title = malloc(strlen(optarg) + 1); in main()
367 if (config->title == NULL) in main()
368 errx(EXIT_FAILURE, "Out of memory?!"); in main()
369 *(config->title) = '\0'; in main()
370 strcat(config->title, optarg); in main()
372 case 'T': /* test mode (don't read data, fake it) */ in main()
373 config->options |= DPV_TEST_MODE; in main()
376 config->status_updates_per_second = in main()
378 if (config->status_updates_per_second == 0 && in main()
381 "`-U' argument must be numeric"); in main()
383 case 'w': /* `-p' and `-a' widths bump [X]dialog(1) width */ in main()
384 config->options |= DPV_WIDE_MODE; in main()
386 case 'x': /* `-x cmd' for sending data-read to sh(1) code */ in main()
388 config->output_type = DPV_OUTPUT_SHELL; in main()
389 config->output = optarg; in main()
392 config->display_type = DPV_DISPLAY_XDIALOG; in main()
401 argc -= optind; in main()
411 errx(EXIT_FAILURE, "Out of memory?!"); in main()
415 if ((curfile->next = malloc(file_node_size)) == NULL) in main()
416 errx(EXIT_FAILURE, "Out of memory?!"); in main()
417 memset((void *)(curfile->next), '\0', file_node_size); in main()
418 curfile = curfile->next; in main()
420 curfile->name = argv[n]; in main()
422 /* Read possible `lines:' prefix from label syntax */ in main()
423 if (sscanf(curfile->name, "%lli:%c", &(curfile->length), in main()
425 curfile->name = strchr(curfile->name, ':') + 1; in main()
427 curfile->length = -1; in main()
429 /* Read path argument if enabled */ in main()
434 curfile->path = argv[n]; in main()
447 * Set cleanup routine for Ctrl-C action in main()
449 if (config->display_type == DPV_DISPLAY_LIBDIALOG) { in main()
456 config->status_solo = LINE_STATUS_SOLO; in main()
457 config->status_many = LINE_STATUS_SOLO; in main()
458 config->action = operate_on_lines; in main()
460 config->status_solo = BYTE_STATUS_SOLO; in main()
461 config->status_many = BYTE_STATUS_SOLO; in main()
462 config->action = operate_on_bytes; in main()
471 if (!config->keep_tite) in main()
479 * Interrupt handler to indicate we received a Ctrl-C interrupt.
498 fprintf(stderr, " %s [options] -m [bytes1:]label1 path1 " in usage()
501 #define OPTFMT "\t%-14s %s\n" in usage()
502 fprintf(stderr, OPTFMT, "-a text", in usage()
504 fprintf(stderr, OPTFMT, "-b backtitle", in usage()
505 "String to be displayed on the backdrop, at top-left."); in usage()
506 fprintf(stderr, OPTFMT, "-D", in usage()
508 fprintf(stderr, OPTFMT, "-d", in usage()
510 fprintf(stderr, OPTFMT, "-h", in usage()
512 fprintf(stderr, OPTFMT, "-I format", in usage()
514 fprintf(stderr, OPTFMT, "-i format", in usage()
516 fprintf(stderr, OPTFMT, "-L size", in usage()
517 "Label size. Must be a number greater than 0, or -1."); in usage()
518 fprintf(stderr, OPTFMT, "-m", in usage()
520 fprintf(stderr, OPTFMT, "-N", in usage()
522 fprintf(stderr, OPTFMT, "-n num", in usage()
523 "Display at-most num files per screen. Default is -1."); in usage()
524 fprintf(stderr, OPTFMT, "-o file", in usage()
526 fprintf(stderr, OPTFMT, "-P size", in usage()
527 "Mini-progressbar size. Must be a number greater than 3."); in usage()
528 fprintf(stderr, OPTFMT, "-p text", in usage()
530 fprintf(stderr, OPTFMT, "-T", in usage()
531 "Test mode. Don't actually read any data, but fake it."); in usage()
532 fprintf(stderr, OPTFMT, "-t title", in usage()
534 fprintf(stderr, OPTFMT, "-U num", in usage()
535 "Update status line num times per-second. Default is 2."); in usage()
536 fprintf(stderr, OPTFMT, "-w", in usage()
537 "Wide. Width of `-p' and `-a' text bump dialog(1) width."); in usage()
538 fprintf(stderr, OPTFMT, "-X", in usage()
540 fprintf(stderr, OPTFMT, "-x cmd", in usage()