Use the monotonic clock for logging progress in cdio(1) and ftp(1).
authorcheloha <cheloha@openbsd.org>
Sat, 23 Dec 2017 20:04:23 +0000 (20:04 +0000)
committercheloha <cheloha@openbsd.org>
Sat, 23 Dec 2017 20:04:23 +0000 (20:04 +0000)
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
usr.bin/cdio/rip.c
usr.bin/ftp/util.c

index 2866d80..4136815 100644 (file)
@@ -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 <mjc@openbsd.org>
  *
@@ -16,6 +16,7 @@
  */
 
 #include <sys/limits.h>
+#include <sys/time.h>
 #include <sys/types.h>
 #include <sys/scsiio.h>
 #include <sys/param.h> /* setbit, isset */
@@ -27,6 +28,7 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <string.h>
+#include <time.h>
 #include <unistd.h>
 #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));
index 64c8d1e..cd637c2 100644 (file)
@@ -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 <av@bsdua.org>
@@ -23,6 +23,7 @@
 #include <sys/ioctl.h>
 #include <sys/scsiio.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 
 #include <scsi/scsi_all.h>
 #include <scsi/scsi_disk.h>
@@ -37,6 +38,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 #include <unistd.h>
 
 #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);
index 8fa6c1b..1c82f3f 100644 (file)
@@ -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))