Hi

readlink is explicitly documented to silently exit 1 if run without -f,
and GNU readlink behaves the same way. I doubt that should change.



On Tue, Apr 04, 2017 at 04:40:19PM -0500, Scott Cheloha wrote:
> 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