diff options
author | Ben Hutchings <ben@decadent.org.uk> | 2016-01-06 01:09:16 +0000 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2016-01-05 17:48:48 -0800 |
commit | 4d9db8a092aee0dfaebb65e0b4f054a40d92cbd9 (patch) | |
tree | f6f7e43371ae4dc8659b9a17fb00e6d6bdbbecc7 | |
parent | 32b36eb98fafad924f3f69904d74d2f2168a4753 (diff) | |
download | klibc-4d9db8a092aee0dfaebb65e0b4f054a40d92cbd9.tar.gz |
[klibc] readlink: Add -f option
This is needed to support mounting non-root filesystems in
initramfs-tools.
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | usr/utils/readlink.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/usr/utils/readlink.c b/usr/utils/readlink.c index 4e3cfcbc0ee5a..ffb0b1f70642c 100644 --- a/usr/utils/readlink.c +++ b/usr/utils/readlink.c @@ -7,24 +7,45 @@ const char *progname; static __noreturn usage(void) { - fprintf(stderr, "Usage: %s link...\n", progname); + fprintf(stderr, "Usage: %s [-f] link...\n", progname); exit(1); } int main(int argc, char *argv[]) { + int c, f_flag = 0; const char *name; char link_name[PATH_MAX]; int rv; int i; - progname = *argv++; + progname = argv[0]; - if (argc < 2) + do { + c = getopt(argc, argv, "f"); + if (c == EOF) + break; + switch (c) { + case 'f': + f_flag = 1; + break; + + case '?': + fprintf(stderr, "%s: invalid option -%c\n", + progname, optopt); + usage(); + } + } while (1); + + if (optind == argc) usage(); + argv += optind; while ((name = *argv++)) { - rv = readlink(name, link_name, sizeof link_name - 1); + if (f_flag) + rv = realpath(name, link_name) ? strlen(link_name) : -1; + else + rv = readlink(name, link_name, sizeof link_name - 1); if (rv < 0) { perror(name); exit(1); |