From 5eb87a29ca2d74b75d73c9fb7e3357d355a037f5 Mon Sep 17 00:00:00 2001 From: cheloha Date: Sat, 23 Dec 2017 20:04:23 +0000 Subject: [PATCH] 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@ --- usr.bin/cdio/mmc.c | 18 ++++++++++-------- usr.bin/cdio/rip.c | 18 ++++++++++-------- usr.bin/ftp/util.c | 28 ++++++++++++++-------------- 3 files changed, 34 insertions(+), 30 deletions(-) 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)) -- 2.20.1