diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-20 18:36:55 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-20 18:36:55 +0000 |
commit | 456fa6c0b17b2ff465a34db031f667b3fcd4bf2e (patch) | |
tree | c33b80a72a22047d49243ea6307de8e19d3a98e2 /debianutils | |
parent | df5189269074042a60fa87425ef8a01a9aaa4af6 (diff) | |
download | busybox-w32-456fa6c0b17b2ff465a34db031f667b3fcd4bf2e.tar.gz busybox-w32-456fa6c0b17b2ff465a34db031f667b3fcd4bf2e.tar.bz2 busybox-w32-456fa6c0b17b2ff465a34db031f667b3fcd4bf2e.zip |
readlink: do not emit errors if file doesnt not exist / not a link
getopt32: add =N support
Diffstat (limited to 'debianutils')
-rw-r--r-- | debianutils/readlink.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/debianutils/readlink.c b/debianutils/readlink.c index 0d5ad94f4..9536d3200 100644 --- a/debianutils/readlink.c +++ b/debianutils/readlink.c | |||
@@ -13,21 +13,32 @@ | |||
13 | #include <stdlib.h> | 13 | #include <stdlib.h> |
14 | #include <getopt.h> | 14 | #include <getopt.h> |
15 | 15 | ||
16 | #define READLINK_FLAG_f (1 << 0) | ||
17 | |||
18 | int readlink_main(int argc, char **argv) | 16 | int readlink_main(int argc, char **argv) |
19 | { | 17 | { |
20 | char *buf; | 18 | char *buf; |
21 | unsigned opt = ENABLE_FEATURE_READLINK_FOLLOW ? | 19 | char *fname; |
22 | getopt32(argc, argv, "f") : 0; | 20 | |
23 | 21 | USE_FEATURE_READLINK_FOLLOW( | |
24 | if (argc != (ENABLE_FEATURE_READLINK_FOLLOW ? optind + 1 : 2)) | 22 | unsigned opt; |
25 | bb_show_usage(); | 23 | /* We need exactly one non-option argument. */ |
26 | 24 | opt_complementary = "=1"; | |
27 | if (opt & READLINK_FLAG_f) | 25 | opt = getopt32(argc, argv, "f"); |
28 | buf = realpath(argv[optind], bb_common_bufsiz1); | 26 | fname = argv[optind]; |
29 | else | 27 | ) |
30 | buf = xreadlink(argv[ENABLE_FEATURE_READLINK_FOLLOW ? optind : 1]); | 28 | SKIP_FEATURE_READLINK_FOLLOW( |
29 | const unsigned opt = 0; | ||
30 | if (argc != 2) bb_show_usage(); | ||
31 | fname = argv[1]; | ||
32 | ) | ||
33 | |||
34 | /* compat: coreutils readlink reports errors silently via exit code */ | ||
35 | logmode = LOGMODE_NONE; | ||
36 | |||
37 | if (opt) { | ||
38 | buf = realpath(fname, bb_common_bufsiz1); | ||
39 | } else { | ||
40 | buf = xreadlink(fname); | ||
41 | } | ||
31 | 42 | ||
32 | if (!buf) | 43 | if (!buf) |
33 | return EXIT_FAILURE; | 44 | return EXIT_FAILURE; |
@@ -36,5 +47,5 @@ int readlink_main(int argc, char **argv) | |||
36 | if (ENABLE_FEATURE_CLEAN_UP && buf != bb_common_bufsiz1) | 47 | if (ENABLE_FEATURE_CLEAN_UP && buf != bb_common_bufsiz1) |
37 | free(buf); | 48 | free(buf); |
38 | 49 | ||
39 | return EXIT_SUCCESS; | 50 | bb_fflush_stdout_and_exit(EXIT_SUCCESS); |
40 | } | 51 | } |