From ad239cf0bd9ebc8e206ce196dc93eb15b6056706 Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Sun, 3 Jan 2021 22:03:16 +0100 Subject: rwc: internally use and print absolute paths Else it's not possible to deal with calls like "rwc ./x" in a proper way. --- rwc.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'rwc.c') diff --git a/rwc.c b/rwc.c index 43ea95a..a316999 100644 --- a/rwc.c +++ b/rwc.c @@ -63,12 +63,45 @@ wdorder(const void *a, const void *b) return 1; } +static char * +realpath_nx(char *path) +{ + char *r = realpath(path, 0); + + if (!r && errno == ENOENT) { + // resolve dirname and append basename + + char *path2 = strdup(path); + if (!path2) + return 0; + char *d = realpath(dirname(path2), 0); + free(path2); + if (!d) + return 0; + char *b = basename(path); + size_t l = strlen(d) + 1 + strlen(b) + 1; + r = malloc(l); + if (!r) + return 0; + snprintf(r, l, "%s/%s", d, b); + } + + return r; +} + static void -add(char *file) +add(char *path) { struct stat st; int wd; + char *file = realpath_nx(path); + if (!file) { + fprintf(stderr, "%s: realpath: %s: %s\n", + argv0, path, strerror(errno)); + return; + } + char *dir = file; tsearch(strdup(file), &root, order); -- cgit 1.4.1