Hi,

This keeps the progress printouts from stalling in the
pathological case.

We were also missing <sys/time.h> for gettimeofday(2).

--
Scott Cheloha

Index: usr.bin/cdio/mmc.c
===================================================================
RCS file: /cvs/src/usr.bin/cdio/mmc.c,v
retrieving revision 1.30
diff -u -p -r1.30 mmc.c
--- usr.bin/cdio/mmc.c  16 Jan 2015 06:40:06 -0000      1.30
+++ usr.bin/cdio/mmc.c  10 Sep 2017 20:37:45 -0000
@@ -18,6 +18,7 @@
 #include <sys/limits.h>
 #include <sys/types.h>
 #include <sys/scsiio.h>
+#include <sys/time.h>
 #include <sys/param.h> /* setbit, isset */
 #include <scsi/cd.h>
 #include <scsi/scsi_all.h>
@@ -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 tv, otv, atv;
        u_char databuf[65536], nblk;
        u_int end_lba, lba, tmp;
        scsireq_t scr;
@@ -451,9 +453,9 @@ writetrack(struct track_info *tr, int tr
        scr.senselen = SENSEBUFLEN;
        scr.flags = SCCMD_ESCAPE|SCCMD_WRITE;
 
-       timerclear(&otv);
+       timespecclear(&otv);
        atv.tv_sec = 1;
-       atv.tv_usec = 0;
+       atv.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, &tv);
+                       if (lba == end_lba || timespeccmp(&tv, &otv, >)) {
                                fprintf(stderr,
                                    "\rtrack %02d '%c' %08u/%08u %3d%%",
                                    track, tr->type,
                                    lba, end_lba, 100 * lba / end_lba);
-                               timeradd(&tv, &atv, &otv);
+                               timespecadd(&tv, &atv, &otv);
                        }
                        tmp = htobe32(lba); /* update lba in cdb */
                        memcpy(&scr.cmd[2], &tmp, sizeof(tmp));
Index: usr.bin/cdio/rip.c
===================================================================
RCS file: /cvs/src/usr.bin/cdio/rip.c,v
retrieving revision 1.16
diff -u -p -r1.16 rip.c
--- usr.bin/cdio/rip.c  20 Aug 2015 22:32:41 -0000      1.16
+++ usr.bin/cdio/rip.c  10 Sep 2017 20:37:45 -0000
@@ -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 *
 int
 read_track(struct track *ti)
 {
-       struct timeval tv, otv, atv;
+       struct timespec tv, otv, atv;
        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);
+       timespecclear(&otv);
        atv.tv_sec = 1;
-       atv.tv_usec = 0;
+       atv.tv_nsec = 0;
 
        for (i = 0; i < n_sec; ) {
-               gettimeofday(&tv, NULL);
-               if (timercmp(&tv, &otv, >)) {
+               clock_gettime(CLOCK_MONOTONIC, &tv);
+               if (timespeccmp(&tv, &otv, >)) {
                        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(&tv, &atv, &otv);
                }
 
                error = read_data_sector(i + ti->start_lba, sec, blksize);

Reply via email to