X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcheckpoint.c;h=46f4702b5b1c6f67e89d6f9f421e7160fad3bedb;hb=7fe7adcbb985e78aaf9f78051fa26167779be1f6;hp=3c3ca78d909ecfdc498e6e58e1424a77ea3a0c7b;hpb=717a07e208ced8ab10c59e70eada67c1a2e8afa2;p=chaz%2Ftar diff --git a/src/checkpoint.c b/src/checkpoint.c index 3c3ca78..46f4702 100644 --- a/src/checkpoint.c +++ b/src/checkpoint.c @@ -1,6 +1,6 @@ /* Checkpoint management for tar. - Copyright 2007, 2013 Free Software Foundation, Inc. + Copyright 2007, 2013-2014 Free Software Foundation, Inc. This file is part of GNU tar. @@ -185,7 +185,8 @@ getarg (const char *input, const char ** endp, char **argbuf, size_t *arglen) static int tty_cleanup; -static const char *def_format = "%s: %t: %T%*\r"; +static const char *def_format = + "%{%Y-%m-%d %H:%M:%S}t: %ds, %{read,wrote}T%*\r"; static int format_checkpoint_string (FILE *fp, size_t len, @@ -254,8 +255,33 @@ format_checkpoint_string (FILE *fp, size_t len, break; case 'T': - compute_duration (); - len += format_total_stats (fp, checkpoint_total_format, ',', 0); + { + const char **fmt = checkpoint_total_format, *fmtbuf[3]; + struct wordsplit ws; + compute_duration (); + + if (arg) + { + ws.ws_delim = ","; + if (wordsplit (arg, &ws, WRDSF_NOVAR | WRDSF_NOCMD | + WRDSF_QUOTE | WRDSF_DELIM)) + ERROR ((0, 0, _("cannot split string '%s': %s"), + arg, wordsplit_strerror (&ws))); + else + { + int i; + + for (i = 0; i < ws.ws_wordc; i++) + fmtbuf[i] = ws.ws_wordv[i]; + for (; i < 3; i++) + fmtbuf[i] = NULL; + fmt = fmtbuf; + } + } + len += format_total_stats (fp, fmt, ',', 0); + if (arg) + wordsplit_free (&ws); + } break; case 't': @@ -362,11 +388,11 @@ run_checkpoint_actions (bool do_write) } } -static void -finish_checkpoint_actions (void) +void +checkpoint_flush_actions (void) { struct checkpoint_action *p; - + for (p = checkpoint_action; p; p = p->next) { switch (p->opcode) @@ -378,14 +404,13 @@ finish_checkpoint_actions (void) while (w--) fputc (' ', tty); fputc ('\r', tty); + fflush (tty); } break; default: /* nothing */; } } - if (tty) - fclose (tty); } void @@ -399,5 +424,9 @@ void checkpoint_finish (void) { if (checkpoint_option) - finish_checkpoint_actions (); + { + checkpoint_flush_actions (); + if (tty) + fclose (tty); + } }