Often, when I want to type "systat vmstat" I get confused and type
"vmstat systat". To my surprise, this actually works.

Two things to fix. First, if a drive name is not found, stop and print
an error. Don't ignore it. Second, finish converting atoi to strtonum.

Index: vmstat.c
===================================================================
RCS file: /cvs/src/usr.bin/vmstat/vmstat.c,v
retrieving revision 1.136
diff -u -p -r1.136 vmstat.c
--- vmstat.c    16 Jan 2015 06:40:14 -0000      1.136
+++ vmstat.c    30 Jan 2015 05:05:32 -0000
@@ -136,7 +136,9 @@ main(int argc, char *argv[])
        while ((c = getopt(argc, argv, "c:fiM:mN:stw:vz")) != -1) {
                switch (c) {
                case 'c':
-                       reps = atoi(optarg);
+                       reps = strtonum(optarg, 0, INT_MAX, &errstr);
+                       if (errstr)
+                               errx(1, "-c %s: %s", optarg, errstr);
                        break;
                case 'f':
                        todo |= FORKSTAT;
@@ -222,10 +224,13 @@ main(int argc, char *argv[])
        if (*argv) {
                interval = (u_int)strtonum(*argv, 0, 1000, &errstr);
                if (errstr)
-                       errx(1, "%s: %s", *argv, errstr);
+                       errx(1, "interval %s: %s", *argv, errstr);
 
-               if (*++argv)
-                       reps = atoi(*argv);
+               if (*++argv) {
+                       reps = strtonum(*argv, 0, INT_MAX, &errstr);
+                       if (errstr)
+                               errx(1, "reps %s: %s", *argv, errstr);
+               }
        }
 #endif
 
@@ -276,6 +281,8 @@ choosedrives(char **argv)
                        ++ndrives;
                        break;
                }
+               if (i == dk_ndrive)
+                       errx(1, "invalid interval or drive name: %s", *argv);
        }
        for (i = 0; i < dk_ndrive && ndrives < 2; i++) {
                if (dk_select[i])

Reply via email to