X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fpwd.c;h=9455975e7a08fe842518cb7d4fadaccfd7f501cd;hb=4c77ad75b11caa824a82eb8a88e91d71c51cdd43;hp=9279dbee627b90c0eb9165c45ab20e1d522c00ce;hpb=68404f13d4bf4826e3609703dad5375763db28ab;p=oweals%2Fbusybox.git diff --git a/coreutils/pwd.c b/coreutils/pwd.c index 9279dbee6..9455975e7 100644 --- a/coreutils/pwd.c +++ b/coreutils/pwd.c @@ -4,23 +4,82 @@ * * Copyright (C) 1995, 1996 by Bruce Perens . * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//usage:#define pwd_trivial_usage +//usage: "" +//usage:#define pwd_full_usage "\n\n" +//usage: "Print the full filename of the current working directory" +//usage: +//usage:#define pwd_example_usage +//usage: "$ pwd\n" +//usage: "/root\n" + #include "libbb.h" /* This is a NOFORK applet. Be very careful! */ +static int logical_getcwd(void) +{ + struct stat st1; + struct stat st2; + char *wd; + char *p; + + wd = getenv("PWD"); + if (!wd || wd[0] != '/') + return 0; + + p = wd; + while (*p) { + /* doing strstr(p, "/.") by hand is smaller and faster... */ + if (*p++ != '/') + continue; + if (*p != '.') + continue; + /* we found "/.", skip to next char */ + p++; + if (*p == '.') + p++; /* we found "/.." */ + if (*p == '\0' || *p == '/') + return 0; /* "/./" or "/../" component: bad */ + } + + if (stat(wd, &st1) != 0) + return 0; + if (stat(".", &st2) != 0) + return 0; + if (st1.st_ino != st2.st_ino) + return 0; + if (st1.st_dev != st2.st_dev) + return 0; + + puts(wd); + return 1; +} + int pwd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int pwd_main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) +int pwd_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) { char *buf; + if (ENABLE_DESKTOP) { + /* TODO: assume -L if $POSIXLY_CORRECT? (coreutils does that) + * Rationale: + * POSIX requires a default of -L, but most scripts expect -P + */ + unsigned opt = getopt32(argv, "LP"); + if ((opt & 1) && logical_getcwd()) + return fflush_all(); + } + buf = xrealloc_getcwd_or_warn(NULL); - if (buf != NULL) { + + if (buf) { puts(buf); free(buf); - return fflush(stdout); + return fflush_all(); } return EXIT_FAILURE;