From: cheloha Date: Sat, 23 Dec 2017 20:04:23 +0000 (+0000) Subject: Use the monotonic clock for logging progress in cdio(1) and ftp(1). X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=5eb87a29ca2d74b75d73c9fb7e3357d355a037f5;p=openbsd Use the monotonic clock for logging progress in cdio(1) and ftp(1). Keeps the progress log from blipping or stalling if, e.g., the system time is changed in the midst of a rip or a transfer. ok tb@ jca@ --- diff --git a/usr.bin/cdio/mmc.c b/usr.bin/cdio/mmc.c index 2866d805064..4136815241a 100644 --- a/usr.bin/cdio/mmc.c +++ b/usr.bin/cdio/mmc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mmc.c,v 1.30 2015/01/16 06:40:06 deraadt Exp $ */ +/* $OpenBSD: mmc.c,v 1.31 2017/12/23 20:04:23 cheloha Exp $ */ /* * Copyright (c) 2006 Michael Coulter * @@ -16,6 +16,7 @@ */ #include +#include #include #include #include /* setbit, isset */ @@ -27,6 +28,7 @@ #include #include #include +#include #include #include "extern.h" @@ -433,7 +435,7 @@ writetao(struct track_head *thp) int writetrack(struct track_info *tr, int track) { - struct timeval tv, otv, atv; + struct timespec ts, ots, ats; u_char databuf[65536], nblk; u_int end_lba, lba, tmp; scsireq_t scr; @@ -451,9 +453,9 @@ writetrack(struct track_info *tr, int track) scr.senselen = SENSEBUFLEN; scr.flags = SCCMD_ESCAPE|SCCMD_WRITE; - timerclear(&otv); - atv.tv_sec = 1; - atv.tv_usec = 0; + timespecclear(&ots); + ats.tv_sec = 1; + ats.tv_nsec = 0; if (get_nwa(&lba) != SCCMD_OK) { warnx("cannot get next writable address"); @@ -500,13 +502,13 @@ again: } lba += nblk; - gettimeofday(&tv, NULL); - if (lba == end_lba || timercmp(&tv, &otv, >)) { + clock_gettime(CLOCK_MONOTONIC, &ts); + if (lba == end_lba || timespeccmp(&ts, &ots, >)) { fprintf(stderr, "\rtrack %02d '%c' %08u/%08u %3d%%", track, tr->type, lba, end_lba, 100 * lba / end_lba); - timeradd(&tv, &atv, &otv); + timespecadd(&ts, &ats, &ots); } tmp = htobe32(lba); /* update lba in cdb */ memcpy(&scr.cmd[2], &tmp, sizeof(tmp)); diff --git a/usr.bin/cdio/rip.c b/usr.bin/cdio/rip.c index 64c8d1e6656..cd637c2afeb 100644 --- a/usr.bin/cdio/rip.c +++ b/usr.bin/cdio/rip.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rip.c,v 1.16 2015/08/20 22:32:41 deraadt Exp $ */ +/* $OpenBSD: rip.c,v 1.17 2017/12/23 20:04:23 cheloha Exp $ */ /* * Copyright (c) 2007 Alexey Vatchenko @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,7 @@ #include #include #include +#include #include #include "extern.h" @@ -362,7 +364,7 @@ read_data_sector(u_int32_t lba, u_char *sec, u_int32_t secsize) int read_track(struct track *ti) { - struct timeval tv, otv, atv; + struct timespec ts, ots, ats; u_int32_t i, blksize, n_sec; u_char *sec; int error; @@ -373,18 +375,18 @@ read_track(struct track *ti) if (sec == NULL) return (-1); - timerclear(&otv); - atv.tv_sec = 1; - atv.tv_usec = 0; + timespecclear(&ots); + ats.tv_sec = 1; + ats.tv_nsec = 0; for (i = 0; i < n_sec; ) { - gettimeofday(&tv, NULL); - if (timercmp(&tv, &otv, >)) { + clock_gettime(CLOCK_MONOTONIC, &ts); + if (timespeccmp(&ts, &ots, >)) { fprintf(stderr, "\rtrack %u '%c' %08u/%08u %3u%%", ti->track, (ti->isaudio) ? 'a' : 'd', i, n_sec, 100 * i / n_sec); - timeradd(&tv, &atv, &otv); + timespecadd(&ts, &ats, &ots); } error = read_data_sector(i + ti->start_lba, sec, blksize); diff --git a/usr.bin/ftp/util.c b/usr.bin/ftp/util.c index 8fa6c1b05a0..1c82f3fb478 100644 --- a/usr.bin/ftp/util.c +++ b/usr.bin/ftp/util.c @@ -1,4 +1,4 @@ -/* $OpenBSD: util.c,v 1.85 2017/09/05 05:37:35 jca Exp $ */ +/* $OpenBSD: util.c,v 1.86 2017/12/23 20:04:23 cheloha Exp $ */ /* $NetBSD: util.c,v 1.12 1997/08/18 10:20:27 lukem Exp $ */ /*- @@ -744,7 +744,7 @@ updateprogressmeter(int signo) * with flag = 0 * - After the transfer, call with flag = 1 */ -static struct timeval start; +static struct timespec start; char *action; @@ -757,21 +757,21 @@ progressmeter(int flag, const char *filename) */ static const char prefixes[] = " KMGTP"; - static struct timeval lastupdate; + static struct timespec lastupdate; static off_t lastsize; static char *title = NULL; - struct timeval now, td, wait; + struct timespec now, td, wait; off_t cursize, abbrevsize; double elapsed; int ratio, barlength, i, remaining, overhead = 30; char buf[512]; if (flag == -1) { - (void)gettimeofday(&start, NULL); + clock_gettime(CLOCK_MONOTONIC, &start); lastupdate = start; lastsize = restart_point; } - (void)gettimeofday(&now, NULL); + clock_gettime(CLOCK_MONOTONIC, &now); if (!progress || filesize < 0) return; cursize = bytes + restart_point; @@ -851,19 +851,19 @@ progressmeter(int flag, const char *filename) " %5lld %c%c ", (long long)abbrevsize, prefixes[i], prefixes[i] == ' ' ? ' ' : 'B'); - timersub(&now, &lastupdate, &wait); + timespecsub(&now, &lastupdate, &wait); if (cursize > lastsize) { lastupdate = now; lastsize = cursize; if (wait.tv_sec >= STALLTIME) { /* fudge out stalled time */ start.tv_sec += wait.tv_sec; - start.tv_usec += wait.tv_usec; + start.tv_nsec += wait.tv_nsec; } wait.tv_sec = 0; } - timersub(&now, &start, &td); - elapsed = td.tv_sec + (td.tv_usec / 1000000.0); + timespecsub(&now, &start, &td); + elapsed = td.tv_sec + (td.tv_nsec / 1000000000.0); if (flag == 1) { i = (int)elapsed / 3600; @@ -921,7 +921,7 @@ progressmeter(int flag, const char *filename) void ptransfer(int siginfo) { - struct timeval now, td; + struct timespec now, td; double elapsed; off_t bs; int meg, remaining, hh; @@ -930,9 +930,9 @@ ptransfer(int siginfo) if (!verbose && !siginfo) return; - (void)gettimeofday(&now, NULL); - timersub(&now, &start, &td); - elapsed = td.tv_sec + (td.tv_usec / 1000000.0); + clock_gettime(CLOCK_MONOTONIC, &now); + timespecsub(&now, &start, &td); + elapsed = td.tv_sec + (td.tv_nsec / 1000000000.0); bs = bytes / (elapsed == 0.0 ? 1 : elapsed); meg = 0; if (bs > (1024 * 1024))