commit 11fee4c8ba27200ba1f40e2ea8581d0044eb930a
Author:     sin <[email protected]>
AuthorDate: Mon Nov 16 16:28:36 2015 +0000
Commit:     sin <[email protected]>
CommitDate: Mon Nov 16 16:30:19 2015 +0000

    readlink: Remove broken support for -m and -e
    
    There is no need to bloat readlink with these options.  No one has
    ever used them anyway.

diff --git a/readlink.1 b/readlink.1
index 43ac58a..46b4cad 100644
--- a/readlink.1
+++ b/readlink.1
@@ -1,4 +1,4 @@
-.Dd 2015-10-08
+.Dd 2015-11-16
 .Dt READLINK 1
 .Os sbase
 .Sh NAME
@@ -6,7 +6,7 @@
 .Nd print symbolic link target or canonical file name
 .Sh SYNOPSIS
 .Nm
-.Op Fl e | Fl f | Fl m
+.Op Fl f
 .Op Fl n
 .Ar path
 .Sh DESCRIPTION
@@ -19,12 +19,11 @@ If not,
 exits with a non-zero return value.
 .Sh OPTIONS
 .Bl -tag -width Ds
-.It Fl e | Fl f | Fl m
+.It Fl f
 Canonicalize
-.Ar name ,
+.Ar path ,
 which needn't be a symlink,
 by recursively following every symlink in its path components.
-All | All but the last | No path components must exist.
 .It Fl n
 Do not print the terminating newline.
 .El
diff --git a/readlink.c b/readlink.c
index 8d2a98d..d059584 100644
--- a/readlink.c
+++ b/readlink.c
@@ -1,34 +1,28 @@
 /* See LICENSE file for copyright and license details. */
-#include <sys/stat.h>
-
-#include <libgen.h>
-#include <unistd.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "util.h"
 
 static void
 usage(void)
 {
-       eprintf("usage: %s [-e | -f | -m] [-n] path\n", argv0);
+       eprintf("usage: %s [-fn] path\n", argv0);
 }
 
 int
 main(int argc, char *argv[])
 {
-       struct stat st;
+       char buf[PATH_MAX];
        ssize_t n;
-       int nflag = 0, mefflag = 0;
-       char buf1[PATH_MAX], buf2[PATH_MAX], arg[PATH_MAX],
-            *p, *slash, *prefix, *lp, *b = buf1;
+       int nflag = 0, fflag = 0;
 
        ARGBEGIN {
-       case 'm':
-       case 'e':
        case 'f':
-               mefflag = ARGC();
+               fflag = ARGC();
                break;
        case 'n':
                nflag = 1;
@@ -43,48 +37,16 @@ main(int argc, char *argv[])
        if (strlen(argv[0]) >= PATH_MAX)
                eprintf("path too long\n");
 
-       switch (mefflag) {
-       case 'm':
-               slash = strchr(argv[0], '/');
-               prefix = (slash == argv[0]) ? "/" : (!slash) ? "./" : "";
-
-               estrlcpy(arg, prefix, sizeof(arg));
-               estrlcat(arg, argv[0], sizeof(arg));
-
-               for (lp = "", p = arg + (argv[0][0] == '/'); *p; p++) {
-                       if (*p != '/')
-                               continue;
-                       *p = '\0';
-                       if (!realpath(arg, b)) {
-                               *p = '/';
-                               goto mdone;
-                       }
-                       b = (b == buf1) ? buf2 : buf1;
-                       lp = p;
-                       *p = '/';
-               }
-               if (!realpath(arg, b)) {
-mdone:
-                       b = (b == buf1) ? buf2 : buf1;
-                       estrlcat(b, lp, sizeof(arg));
-               }
-               break;
-       case 'e':
-               if (stat(argv[0], &st) < 0)
-                       eprintf("stat %s:", argv[0]);
-               if (!realpath(argv[0], b))
+       if (fflag) {
+               if (!realpath(argv[0], buf))
                        eprintf("realpath %s:", argv[0]);
-               break;
-       case 'f':
-               if (!realpath(argv[0], b))
-                       eprintf("realpath %s:", argv[0]);
-               break;
-       default:
-               if ((n = readlink(argv[0], b, PATH_MAX - 1)) < 0)
+       } else {
+               if ((n = readlink(argv[0], buf, PATH_MAX - 1)) < 0)
                        eprintf("readlink %s:", argv[0]);
-               b[n] = '\0';
+               buf[n] = '\0';
        }
-       fputs(b, stdout);
+
+       fputs(buf, stdout);
        if (!nflag)
                putchar('\n');
 

Reply via email to