Currently, if the system clock is set backwards, ksh won't
check for new mail until the clock ticks up to when it would
have checked for new mail absent the jump.

Measuring $MAILCHECK with the monotonic clock fixes this.

I think checking mlastchkd == 0 to determine if this is the
first run is a hack so I added an explicit flag.

ok?

--
Scott Cheloha

Index: bin/ksh/mail.c
===================================================================
RCS file: /cvs/src/bin/ksh/mail.c,v
retrieving revision 1.23
diff -u -p -r1.23 mail.c
--- bin/ksh/mail.c      9 Apr 2018 17:53:36 -0000       1.23
+++ bin/ksh/mail.c      24 Jun 2018 21:22:28 -0000
@@ -6,6 +6,7 @@
  */
 
 #include <sys/stat.h>
+#include <sys/time.h>
 
 #include <string.h>
 #include <time.h>
@@ -30,7 +31,7 @@ typedef struct mbox {
 
 static mbox_t  *mplist;
 static mbox_t  mbox;
-static time_t  mlastchkd;      /* when mail was last checked */
+static struct  timespec mlastchkd;     /* when mail was last checked */
 static time_t  mailcheck_interval;
 
 static void    munset(mbox_t *); /* free mlist and mval */
@@ -41,14 +42,18 @@ void
 mcheck(void)
 {
        mbox_t          *mbp;
-       time_t           now;
+       struct timespec  elapsed, now;
        struct tbl      *vp;
        struct stat      stbuf;
+       static int       first = 1;
 
-       now = time(NULL);
-       if (mlastchkd == 0)
+       clock_gettime(CLOCK_MONOTONIC, &now);
+       if (first) {
                mlastchkd = now;
-       if (now - mlastchkd >= mailcheck_interval) {
+               first = 0;
+       }
+       timespecsub(&now, &mlastchkd, &elapsed);
+       if (elapsed.tv_sec >= mailcheck_interval) {
                mlastchkd = now;
 
                if (mplist)

Reply via email to