On Wed, Jun 29, 2022 at 09:50:39AM +0000, Job Snijders wrote: > On Wed, Jun 29, 2022 at 09:18:08AM +0000, Job Snijders wrote: > > Add a '-m' monotonic clock option > > I misunderstood what the moreutils ts -m option was doing, below is a > different version, which is 'resistant' against the wallclock jump back > and forth. > > Index: ts.1 > =================================================================== > RCS file: /cvs/src/usr.bin/ts/ts.1,v > retrieving revision 1.1 > diff -u -p -r1.1 ts.1 > --- ts.1 29 Jun 2022 08:39:49 -0000 1.1 > +++ ts.1 29 Jun 2022 09:49:57 -0000 > @@ -23,6 +23,7 @@ > .Sh SYNOPSIS > .Nm ts > .Op Fl i | s > +.Op Fl m > .Op Ar format > .Sh DESCRIPTION > When invoked, the > @@ -33,6 +34,8 @@ The options are as follows: > .Bl -tag -width Ds > .It Fl i > Display time elapsed since the last timestamp. > +.It Fl m > +Use the system's monotonic clock.
I would prefer this is discribed differently. Since it does not show the system's monotonic clock. That is a detail. It bases the timestamps based on the monotonic clock instead of the regular wall clock time. > .It Fl s > Display time elapsed since the start of the program. > .El > Index: ts.c > =================================================================== > RCS file: /cvs/src/usr.bin/ts/ts.c,v > retrieving revision 1.1 > diff -u -p -r1.1 ts.c > --- ts.c 29 Jun 2022 08:39:49 -0000 1.1 > +++ ts.c 29 Jun 2022 09:49:57 -0000 > @@ -38,25 +38,32 @@ static void __dead usage(void); > int > main(int argc, char *argv[]) > { > - int iflag, sflag; > + int iflag, mflag, sflag; > int ch, prev; > - struct timespec start, now, elapsed; > + struct timespec rstart, start, now, elapsed; > struct tm *lt, tm; > + int clock = CLOCK_REALTIME; > > if (pledge("stdio", NULL) == -1) > err(1, "pledge"); > > - iflag = sflag = 0; > + iflag = mflag = sflag = 0; > > - while ((ch = getopt(argc, argv, "is")) != -1) { > + while ((ch = getopt(argc, argv, "ims")) != -1) { > switch (ch) { > case 'i': > iflag = 1; > format = "%H:%M:%S"; > + clock = CLOCK_MONOTONIC; > + break; > + case 'm': > + mflag = 1; > + clock = CLOCK_MONOTONIC; > break; > case 's': > sflag = 1; > format = "%H:%M:%S"; > + clock = CLOCK_MONOTONIC; > break; > default: > usage(); > @@ -81,22 +88,29 @@ main(int argc, char *argv[]) > if ((outbuf = calloc(1, bufsize)) == NULL) > err(1, NULL); > > + clock_gettime(CLOCK_REALTIME, &rstart); > clock_gettime(CLOCK_MONOTONIC, &start); > > for (prev = '\n'; (ch = getchar()) != EOF; prev = ch) { > if (prev == '\n') { > + if (clock_gettime(clock, &now)) > + err(1, "clock_gettime"); > if (iflag || sflag) { > - if (clock_gettime(CLOCK_MONOTONIC, &now)) > - err(1, "clock_gettime"); > timespecsub(&now, &start, &elapsed); > if (gmtime_r(&elapsed.tv_sec, &tm) == NULL) > err(1, "gmtime_r"); > if (iflag) > - clock_gettime(CLOCK_MONOTONIC, &start); > + if (clock_gettime(clock, &start)) > + err(1, "clock_gettime"); > fmtfmt(&tm, elapsed.tv_nsec); > + } else if (mflag) { > + timespecsub(&now, &start, &elapsed); > + timespecadd(&rstart, &elapsed, &now); > + lt = localtime(&now.tv_sec); > + if (lt == NULL) > + err(1, "localtime"); > + fmtfmt(lt, now.tv_nsec); > } else { > - if (clock_gettime(CLOCK_REALTIME, &now)) > - err(1, "clock_gettime"); > lt = localtime(&now.tv_sec); > if (lt == NULL) > err(1, "localtime"); > @@ -115,7 +129,7 @@ main(int argc, char *argv[]) > static void __dead > usage(void) > { > - fprintf(stderr, "usage: %s [-i | -s] [format]\n", getprogname()); > + fprintf(stderr, "usage: %s [-i | -s] [-m] [format]\n", getprogname()); > exit(1); > } > > Code is OK claudio@ -- :wq Claudio