sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 11fee4c8ba27200ba1f40e2ea8581d0044eb930a
parent d24584466c9ea27451bd9c56804e935247807085
Author: sin <sin@2f30.org>
Date:   Mon, 16 Nov 2015 16:28:36 +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.

Diffstat:
Mreadlink.1 | 9++++-----
Mreadlink.c | 64+++++++++++++---------------------------------------------------
2 files changed, 17 insertions(+), 56 deletions(-)

diff --git 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 @@ -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');