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 | } |
