- CONFIG_FEATURE_READLINK_FOLLOW readlink -f patch from Colin Watson
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -23,18 +23,38 @@ | |
| #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); | |
| @@ -1985,10 +1985,18 @@ | |
| "\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 ..." | |