readlink: Add -f option
authorBen Hutchings <ben@decadent.org.uk>
Sat, 27 Sep 2014 14:18:21 +0000 (15:18 +0100)
committerRaspbian forward porter <root@raspbian.org>
Tue, 17 May 2016 23:45:58 +0000 (23:45 +0000)
This is needed to support mounting non-root filesystems in
initramfs-tools.

Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Gbp-Pq: Name readlink-add-f-option.patch

usr/utils/readlink.c

index 4e3cfcbc0ee5a644d0c4d4ec80b4601965a49d25..ffb0b1f70642cb0e14cf22ca5fffd7b61df6ac56 100644 (file)
@@ -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);