- CONFIG_FEATURE_READLINK_FOLLOW readlink -f patch from Colin Watson <cjwatson@debian...
authorsolar <solar@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Wed, 8 Dec 2004 16:47:28 +0000 (16:47 +0000)
committersolar <solar@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Wed, 8 Dec 2004 16:47:28 +0000 (16:47 +0000)
git-svn-id: svn://busybox.net/trunk/busybox@9542 69ca8d6d-28ef-0310-b511-8ec308f3f277

debianutils/Config.in
debianutils/readlink.c
include/usage.h

index 7cf7cad..f13d56e 100644 (file)
@@ -24,6 +24,13 @@ config CONFIG_READLINK
          This program reads a symbolic link and returns the name
          of the file it points to
 
+config CONFIG_FEATURE_READLINK_FOLLOW
+       bool "  Enable canonicalization by following all symlinks (-f)"
+       default n
+       depends on CONFIG_READLINK
+       help
+         Enable the readlink option (-f).
+
 config CONFIG_RUN_PARTS
        bool "run-parts"
        default n
index d8d7e8c..90927bb 100644 (file)
 #include <errno.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <getopt.h>
 #include "busybox.h"
 
+#ifdef CONFIG_FEATURE_READLINK_FOLLOW
+# define READLINK_FOLLOW       "f"
+# define READLINK_FLAG_f       (1 << 0)
+#else
+# define READLINK_FOLLOW       ""
+#endif
+
+static const char readlink_options[] = READLINK_FOLLOW;
+
 int readlink_main(int argc, char **argv)
 {
        char *buf = NULL;
+       unsigned long opt = bb_getopt_ulflags(argc, argv, readlink_options);
+#ifdef CONFIG_FEATURE_READLINK_FOLLOW
+       RESERVE_CONFIG_BUFFER(resolved_path, PATH_MAX);
+#endif
 
        /* no options, no getopt */
 
-       if (argc != 2)
+       if (optind + 1 != argc)
                bb_show_usage();
 
-       buf = xreadlink(argv[1]);
+#ifdef CONFIG_FEATURE_READLINK_FOLLOW
+       if (opt & READLINK_FLAG_f) {
+               buf = realpath(argv[optind], resolved_path);
+       } else
+#endif
+               buf = xreadlink(argv[optind]);
+
        if (!buf)
                return EXIT_FAILURE;
        puts(buf);
index 377eb10..d928a10 100644 (file)
        "\t-s\tSet the system date and time (default).\n" \
        "\t-p\tPrint the date and time."
 
+#ifdef CONFIG_FEATURE_READLINK_FOLLOW
+#define USAGE_READLINK_FOLLOW(a) a
+#else
+#define USAGE_READLINK_FOLLOW(a)
+#endif
+
 #define readlink_trivial_usage \
-       ""
+       USAGE_READLINK_FOLLOW("[-f] ") "FILE"
 #define readlink_full_usage \
-       "Displays the value of a symbolic link."
+       "Displays the value of a symbolic link." \
+       USAGE_READLINK_FOLLOW("\n\nOptions:\n" \
+       "\t-f\tcanonicalize by following all symlinks")
 
 #define realpath_trivial_usage \
        "pathname  ..."