Roughly top to bottom:

  - Sort includes alphabetically
  - Ditch __progname for getprogname(3)
  - Sort prototypes alphabetically
  - usage() is __dead
  - Sort stack variables by size (?), then alphabetically (?)
     * I have no idea if I did this right, but it looks
       cleaner than before.
     * Don't sizes vary by architecture?  At least for pointers?
     * Alphabetically by type name and then by variable name?
       Some other scheme?  style(9) seems to contradict itself
       here in the example.
  - rqtp -> timeout, to match nanosleep(2) manpage
  - t -> tsecs, more obvious
  - Don't initialize variables in the declaration block
  - Brace the getopt switch statement
  - Use for loops in lieu of while loops to initialize
    and iterate cp
     * I don't think it clarifies things in the first
       nanosecond loop, so that's unchanged
  - Check explicitly for -1 on nanosleep's return
  - No need to (void) the fprintf in usage()
  - POSIX.2 was consolidated into POSIX.1 after 1997
  - sleep(1) *may* exit 0 when it gets a SIGALRM: it's allowed
    to do other things, too
  - No more lint: drop ARGSUSED
  - _exit(2)ing from a signal handler is (now) a well-known
    practice, no need to explain

ok?

--
Scott Cheloha

Index: bin/sleep/sleep.c
===================================================================
RCS file: /cvs/src/bin/sleep/sleep.c,v
retrieving revision 1.26
diff -u -p -r1.26 sleep.c
--- bin/sleep/sleep.c   4 Feb 2018 02:18:15 -0000       1.26
+++ bin/sleep/sleep.c   14 Feb 2018 17:12:52 -0000
@@ -31,52 +31,51 @@
  */
 
 #include <ctype.h>
+#include <err.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include <unistd.h>
-#include <err.h>
 
-extern char *__progname;
-
-void usage(void);
 void alarmh(int);
+void __dead usage(void);
 
 int
 main(int argc, char *argv[])
 {
-       int ch;
-       time_t secs = 0, t;
+       struct timespec timeout;
+       time_t secs, tsecs;
+       long nsecs;
        char *cp;
-       long nsecs = 0;
-       struct timespec rqtp;
-       int i;
+       int ch, i;
+
+       secs = nsecs = 0;
 
        if (pledge("stdio", NULL) == -1)
                err(1, "pledge");
 
        signal(SIGALRM, alarmh);
 
-       while ((ch = getopt(argc, argv, "")) != -1)
+       while ((ch = getopt(argc, argv, "")) != -1) {
                switch(ch) {
                default:
                        usage();
                }
+       }
        argc -= optind;
        argv += optind;
 
        if (argc != 1)
                usage();
 
-       cp = *argv;
-       while ((*cp != '\0') && (*cp != '.')) {
+       for (cp = *argv; *cp != '\0' && *cp != '.'; cp++) {
                if (!isdigit((unsigned char)*cp))
                        errx(1, "seconds is invalid: %s", *argv);
-               t = (secs * 10) + (*cp++ - '0');
-               if (t / 10 != secs)     /* oflow */
+               tsecs = (secs * 10) + (*cp - '0');
+               if (tsecs / 10 != secs) /* overflow */
                        errx(1, "seconds is too large: %s", *argv);
-               secs = t;
+               secs = tsecs;
        }
 
        /* Handle fractions of a second */
@@ -95,8 +94,8 @@ main(int argc, char *argv[])
                 * in the above for loop. Be pedantic about
                 * checking the rest of the argument.
                 */
-               while (*cp != '\0') {
-                       if (!isdigit((unsigned char)*cp++))
+               for (; *cp != '\0'; cp++) {
+                       if (!isdigit((unsigned char)*cp))
                                errx(1, "seconds is invalid: %s", *argv);
                }
        }
@@ -108,38 +107,32 @@ main(int argc, char *argv[])
                 * calls if we have more than that.
                 */
                if (secs > 100000000) {
-                       rqtp.tv_sec = 100000000;
-                       rqtp.tv_nsec = 0;
+                       timeout.tv_sec = 100000000;
+                       timeout.tv_nsec = 0;
                } else {
-                       rqtp.tv_sec = secs;
-                       rqtp.tv_nsec = nsecs;
+                       timeout.tv_sec = secs;
+                       timeout.tv_nsec = nsecs;
                }
-               if (nanosleep(&rqtp, NULL))
-                       err(1, NULL);
-               secs -= rqtp.tv_sec;
-               nsecs -= rqtp.tv_nsec;
+               if (nanosleep(&timeout, NULL) == -1)
+                       err(1, "nanosleep");
+               secs -= timeout.tv_sec;
+               nsecs -= timeout.tv_nsec;
        }
        return (0);
 }
 
-void
+void __dead
 usage(void)
 {
-       (void)fprintf(stderr, "usage: %s seconds\n", __progname);
+       fprintf(stderr, "usage: %s seconds\n", getprogname());
        exit(1);
 }
 
 /*
- * POSIX 1003.2 says sleep should exit with 0 return code on reception
- * of SIGALRM.
+ * POSIX.1 says sleep may exit with status 0 upon receipt of SIGALRM.
  */
-/* ARGSUSED */
 void
 alarmh(int signo)
 {
-       /*
-        * exit() flushes stdio buffers, which is not legal in a signal
-        * handler. Use _exit().
-        */
        _exit(0);
 }

Reply via email to