X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Freadlink.c;h=b8e327d11863fcd5025b0dc26d06f91d9cedae32;hb=00bd76728d44901a260f2dcdbeed52b3c85d6b6b;hp=87602fbc693ca77d89b51ef62eb56d5e8abf1583;hpb=0ef64bdb40c54681e8dd5ab8df42ac88e4ab1d4a;p=oweals%2Fbusybox.git diff --git a/coreutils/readlink.c b/coreutils/readlink.c index 87602fbc6..b8e327d11 100644 --- a/coreutils/readlink.c +++ b/coreutils/readlink.c @@ -6,6 +6,34 @@ * * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config READLINK +//config: bool "readlink (3.6 kb)" +//config: default y +//config: help +//config: This program reads a symbolic link and returns the name +//config: of the file it points to +//config: +//config:config FEATURE_READLINK_FOLLOW +//config: bool "Enable canonicalization by following all symlinks (-f)" +//config: default y +//config: depends on READLINK +//config: help +//config: Enable the readlink option (-f). + +//applet:IF_READLINK(APPLET_NOFORK(readlink, readlink, BB_DIR_USR_BIN, BB_SUID_DROP, readlink)) + +//kbuild:lib-$(CONFIG_READLINK) += readlink.o + +//usage:#define readlink_trivial_usage +//usage: IF_FEATURE_READLINK_FOLLOW("[-fnv] ") "FILE" +//usage:#define readlink_full_usage "\n\n" +//usage: "Display the value of a symlink" +//usage: IF_FEATURE_READLINK_FOLLOW( "\n" +//usage: "\n -f Canonicalize by following all symlinks" +//usage: "\n -n Don't add newline" +//usage: "\n -v Verbose" +//usage: ) + #include "libbb.h" /* @@ -28,7 +56,10 @@ * -q, --quiet, -s, --silent suppress most error messages * -v, --verbose report error messages * - * bbox supports: -f -n -v (fully), -q -s (accepts but ignores) + * bbox supports: -f (partially) -n -v (fully), -q -s (accepts but ignores) + * Note: we export the -f flag, but our -f behaves like coreutils' -e. + * Unfortunately, there isn't a C lib function we can leverage to get this + * behavior which means we'd have to implement the full stack ourselves :(. */ int readlink_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; @@ -40,8 +71,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv) IF_FEATURE_READLINK_FOLLOW( unsigned opt; /* We need exactly one non-option argument. */ - opt_complementary = "=1"; - opt = getopt32(argv, "fnvsq"); + opt = getopt32(argv, "^" "fnvsq" "\0" "=1"); fname = argv[optind]; ) IF_NOT_FEATURE_READLINK_FOLLOW( @@ -54,6 +84,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv) if (!(opt & 4)) /* not -v */ logmode = LOGMODE_NONE; + /* NOFORK: only one alloc is allowed; must free */ if (opt & 1) { /* -f */ buf = xmalloc_realpath(fname); } else { @@ -63,9 +94,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv) if (!buf) return EXIT_FAILURE; printf((opt & 2) ? "%s" : "%s\n", buf); - - if (ENABLE_FEATURE_CLEAN_UP) - free(buf); + free(buf); fflush_stdout_and_exit(EXIT_SUCCESS); }