]> Zhao Yanbai Git Server - minix.git/commitdiff
readclock: code clean-up, add -q, manpage updates 21/721/3
authorThomas Cort <tcort@minix3.org>
Thu, 8 Aug 2013 00:06:47 +0000 (20:06 -0400)
committerGerrit Code Review <gerrit@gerrit>
Fri, 9 Aug 2013 10:41:53 +0000 (12:41 +0200)
 - Simplify the message passing between readclock and the driver.

 - Add a -q command line option to suppress warning messages. This
 cuts down on the noise when readclock is called early in the boot
 sequence and a secondary RTC driver (ex TPS95650) isn't up yet.

 - Update the man page to be less i386 centric and add details about
 the new -q option.

Change-Id: If8d7c50a217ca98c1e9fae0ca92521e2e7c893e4

commands/readclock/readclock.c
etc/rc
man/man8/readclock.8

index 1b4d4120af881ccd13bfd00dc44e5a4af9f0ee7e..a71c646798e2c9092c9dc560005c1a8c405bce0f 100644 (file)
 #include <minix/rs.h>
 #include <sys/ipc.h>
 
-int nflag = 0;                 /* Tell what, but don't do it. */
-int wflag = 0;                 /* Set the CMOS clock. */
-int Wflag = 0;                 /* Also set the CMOS clock register bits. */
-int y2kflag = 0;               /* Interpret 1980 as 2000 for clock with Y2K bug. */
-
 void errmsg(char *s);
-void get_time(struct tm *t);
-void set_time(struct tm *t);
+static void readclock(int type, struct tm *t, int flags);
 void usage(void);
 
+int quiet = 0;
+
 int
 main(int argc, char **argv)
 {
+       int flags = RTCDEV_NOFLAGS;
+       int nflag = 0;  /* Tell what, but don't do it. */
+       int wflag = 0;  /* Set the CMOS clock. */
        struct tm time1;
        struct tm time2;
        struct tm tmnow;
@@ -52,10 +51,14 @@ main(int argc, char **argv)
                                wflag = 1;
                                break;
                        case 'W':
-                               Wflag = 1;
+                               flags |= RTCDEV_CMOSREG;
+                               wflag = 1; /* -W implies -w */
                                break;
                        case '2':
-                               y2kflag = 1;
+                               flags |= RTCDEV_Y2KBUG;
+                               break;
+                       case 'q':
+                               quiet = 1;
                                break;
                        default:
                                usage();
@@ -63,12 +66,10 @@ main(int argc, char **argv)
                }
                argc--;
        }
-       if (Wflag)
-               wflag = 1;      /* -W implies -w */
 
        /* Read the CMOS real time clock. */
        for (i = 0; i < 10; i++) {
-               get_time(&time1);
+               readclock(RTCDEV_GET_TIME, &time1, flags);
                now = time(NULL);
 
                time1.tm_isdst = -1;    /* Do timezone calculations. */
@@ -78,7 +79,7 @@ main(int argc, char **argv)
                if (rtc != -1)
                        break;
 
-               printf
+               if (!quiet) printf
                    ("readclock: Invalid time read from CMOS RTC: %d-%02d-%02d %02d:%02d:%02d\n",
                    time2.tm_year + 1900, time2.tm_mon + 1, time2.tm_mday,
                    time2.tm_hour, time2.tm_min, time2.tm_sec);
@@ -90,10 +91,12 @@ main(int argc, char **argv)
        if (!wflag) {
                /* Set system time. */
                if (nflag) {
-                       printf("stime(%lu)\n", (unsigned long) rtc);
+                       if (!quiet)
+                               printf("stime(%lu)\n", (unsigned long) rtc);
                } else {
                        if (stime(&rtc) < 0) {
-                               errmsg("Not allowed to set time.");
+                               if (!quiet)
+                                       errmsg("Not allowed to set time.");
                                exit(1);
                        }
                }
@@ -102,19 +105,20 @@ main(int argc, char **argv)
                        "%a %b %d %H:%M:%S %Z %Y", &tmnow) != 0) {
                        if (date[8] == '0')
                                date[8] = ' ';
-                       printf("%s\n", date);
+                       if (!quiet) printf("%s\n", date);
                }
        } else {
                /* Set the CMOS clock to the system time. */
                tmnow = *localtime(&now);
                if (nflag) {
-                       printf("%04d-%02d-%02d %02d:%02d:%02d\n",
-                           tmnow.tm_year + 1900,
-                           tmnow.tm_mon + 1,
-                           tmnow.tm_mday,
-                           tmnow.tm_hour, tmnow.tm_min, tmnow.tm_sec);
+                       if (!quiet)
+                               printf("%04d-%02d-%02d %02d:%02d:%02d\n",
+                                   tmnow.tm_year + 1900,
+                                   tmnow.tm_mon + 1,
+                                   tmnow.tm_mday,
+                                   tmnow.tm_hour, tmnow.tm_min, tmnow.tm_sec);
                } else {
-                       set_time(&tmnow);
+                       readclock(RTCDEV_SET_TIME, &tmnow, flags);
                }
        }
        exit(0);
@@ -125,12 +129,12 @@ errmsg(char *s)
 {
        static char *prompt = "readclock: ";
 
-       printf("%s%s\n", prompt, s);
+       if (!quiet) printf("%s%s\n", prompt, s);
        prompt = "";
 }
 
-void
-get_time(struct tm *t)
+static void
+readclock(int type, struct tm *t, int flags)
 {
        int r;
        message m;
@@ -138,47 +142,16 @@ get_time(struct tm *t)
 
        r = minix_rs_lookup("readclock.drv", &ep);
        if (r != 0) {
-               errmsg("Couldn't locate readclock.drv\n");
+               if (!quiet) errmsg("Couldn't locate readclock.drv\n");
                exit(1);
        }
 
-       m.RTCDEV_TM = t;
-       m.RTCDEV_FLAGS = (y2kflag) ? RTCDEV_Y2KBUG : RTCDEV_NOFLAGS;
-
-       r = _syscall(ep, RTCDEV_GET_TIME, &m);
-       if (r != RTCDEV_REPLY || m.RTCDEV_STATUS != 0) {
-               errmsg("Call to readclock.drv failed\n");
-               exit(1);
-       }
-}
-
-void
-set_time(struct tm *t)
-{
-       int r;
-       message m;
-       endpoint_t ep;
-
-       r = minix_rs_lookup("readclock.drv", &ep);
-       if (r != 0) {
-               errmsg("Couldn't locate readclock.drv\n");
-               exit(1);
-       }
-
-       m.RTCDEV_TM = t;
-       m.RTCDEV_FLAGS = RTCDEV_NOFLAGS;
-
-       if (y2kflag) {
-               m.RTCDEV_FLAGS |= RTCDEV_Y2KBUG;
-       }
-
-       if (Wflag) {
-               m.RTCDEV_FLAGS |= RTCDEV_CMOSREG;
-       }
+       m.RTCDEV_TM = (char *) t;
+       m.RTCDEV_FLAGS = flags;
 
-       r = _syscall(ep, RTCDEV_SET_TIME, &m);
+       r = _syscall(ep, type, &m);
        if (r != RTCDEV_REPLY || m.RTCDEV_STATUS != 0) {
-               errmsg("Call to readclock.drv failed\n");
+               if (!quiet) errmsg("Call to readclock.drv failed\n");
                exit(1);
        }
 }
@@ -186,6 +159,6 @@ set_time(struct tm *t)
 void
 usage(void)
 {
-       printf("Usage: readclock [-nwW2]\n");
+       if (!quiet) printf("Usage: readclock [-nqwW2]\n");
        exit(1);
 }
diff --git a/etc/rc b/etc/rc
index 319676dc9d41b02a0ed2028651ecbaf03b389a8e..e241c2752a9a19b3592d8b0a75918cf9b7674431 100755 (executable)
--- a/etc/rc
+++ b/etc/rc
@@ -126,7 +126,7 @@ start)
 
     # Start real time clock driver & set system time, otherwise default date.
     up readclock.drv
-    readclock || date 201301010000
+    readclock -q || date 201301010000
 
     # Initialize files.
     >/etc/utmp                         # /etc/utmp keeps track of logins
index 9fd7acda139ca8cb609ff4201a624916342b743b..7094ed63a9dfc5b0e8ac170d743241dd576f694a 100644 (file)
@@ -1,11 +1,11 @@
 .TH READCLOCK 8
 .SH NAME
-readclock \- read the AT's real time clock
+readclock \- read or set a real time clock
 .SH SYNOPSIS
-\fBreadclock\fP [\fB\-nwW2\fP]
+\fBreadclock\fP [\fB\-nqwW2\fP]
 .SH DESCRIPTION
 .B Readclock
-reads the AT's real time clock and sets the machine's time.  It is usually
+reads the real time clock and sets the operating system time.  It is usually
 the second thing done in
 .BR /etc/rc ,
 the first thing is setting the time zone by sourcing
@@ -20,8 +20,11 @@ want to run the clock in GMT then you can put
 Play-act, don't set the time nor change the calibration data, just show what
 would be done.
 .TP
+.B \-q
+Quiet execution. Suppresses all output.
+.TP
 .B \-w
-Write the current time to the CMOS clock.  Dangerous, see
+Write the current time to the hardware clock.  Dangerous, see
 .BR BUGS .
 Don't forget to use
 .B "TZ=GMT"