Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e1d2913 authored by Michael Wright's avatar Michael Wright
Browse files

Add standard options to readlink

Change-Id: I4c2624d22ce879a3578d5b17440a9895b19e2f1f
parent 18860c52
Loading
Loading
Loading
Loading
+44 −8
Original line number Diff line number Diff line
@@ -34,26 +34,62 @@
#include <stdlib.h>
#include <unistd.h>

static int skip_newline, quiet_errors, canonicalize;

static void usage(char* name) {
    fprintf(stderr, "Usage: %s FILE\n", name);
    fprintf(stderr, "Usage: %s [OPTION]... FILE\n", name);
}

int readlink_main(int argc, char* argv[]) {
    if (argc != 2) {
    int c;
    while ((c = getopt(argc, argv, "nfqs")) != -1) {
        switch (c) {
        case 'n':
            skip_newline = 1;
            break;
        case 'f':
            canonicalize = 1;
            break;
        case 'q':
        case 's':
            quiet_errors = 1;
            break;
        case '?':
        default:
            usage(argv[0]);
            return EXIT_FAILURE;
        }
    }
    int index = optind;
    if (argc - index != 1) {
        usage(argv[0]);
        return EXIT_FAILURE;
    }

    char name[PATH_MAX+1];
    if (canonicalize) {
        if(!realpath(argv[optind], name)) {
            if (!quiet_errors) {
                perror("readlink");
            }
            return EXIT_FAILURE;
        }
    } else {
        ssize_t len = readlink(argv[1], name, PATH_MAX);

        if (len < 0) {
            if (!quiet_errors) {
                perror("readlink");
            }
            return EXIT_FAILURE;
        }

        name[len] = '\0';
    printf("%s\n", name);
    }

    fputs(name, stdout);
    if (!skip_newline) {
        fputs("\n", stdout);
    }

    return EXIT_SUCCESS;
}