This patch replaces a custom error message in readlink.c with err(3).
The custom message and call to strlen(3) aren't needed because
readlink(2) checks the length of the argument string and sets errno
to ENAMETOOLONG if it is too long.

Dropping strlen(3) lets us drop string.h.

Using err(3) also lets us trivially report the myriad ways readlink(2)
can fail.  At the moment we just exit 1, which can be misleading during
interactive use.

While here, do other miscellaneous style(9)-type changes.

Any takers?

--
Scott Cheloha

P.S. returning from main() is preferred over exit(3), right?

Index: readlink.c
===================================================================
RCS file: /cvs/src/usr.bin/readlink/readlink.c,v
retrieving revision 1.27
diff -u -p -r1.27 readlink.c
--- readlink.c  9 Oct 2015 01:37:08 -0000       1.27
+++ readlink.c  4 Apr 2017 21:10:41 -0000
@@ -32,17 +32,17 @@
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <unistd.h>
 
-static void    usage(void);
+static __dead void     usage(void);
 
 int
 main(int argc, char *argv[])
 {
        char buf[PATH_MAX];
-       int n, ch, nflag = 0, fflag = 0;
-       extern int optind;
+       int ch, fflag, n, nflag;
+
+       fflag = nflag = 0;
 
        if (pledge("stdio rpath", NULL) == -1)
                err(1, "pledge");
@@ -64,30 +64,26 @@ main(int argc, char *argv[])
        if (argc != 1)
                usage();
 
-       n = strlen(argv[0]);
-       if (n > PATH_MAX - 1) {
-               fprintf(stderr,
-                   "readlink: filename longer than PATH_MAX-1 (%d)\n",
-                   PATH_MAX - 1);
-               exit(1);
-       }
-
        if (fflag) {
                if (realpath(argv[0], buf) == NULL)
                        err(1, "%s", argv[0]);
        } else {
-               if ((n = readlink(argv[0], buf, sizeof buf-1)) < 0)
-                       exit(1);
+               if ((n = readlink(argv[0], buf, sizeof(buf) - 1)) == -1) {
+                       if (errno == EINVAL)
+                               errx(1, "%s: Not a symbolic link", argv[0]);
+                       else
+                               err(1, "%s", argv[0]);
+               }
                buf[n] = '\0';
        }
 
        printf("%s", buf);
        if (!nflag)
                putchar('\n');
-       exit(0);
+       return 0;
 }
 
-static void
+static __dead void
 usage(void)
 {
        (void)fprintf(stderr, "usage: readlink [-fn] file\n");

Reply via email to