diff options
Diffstat (limited to 'bin/kiss-readlink.c')
-rw-r--r-- | bin/kiss-readlink.c | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/bin/kiss-readlink.c b/bin/kiss-readlink.c index 8dc0c0f..ca65b90 100644 --- a/bin/kiss-readlink.c +++ b/bin/kiss-readlink.c @@ -1,5 +1,5 @@ /* kiss-readlink --- a utility replacement for readlink - * See LICENSE for copyright information + * See LICENSE for copyright information. * * This is basically a 'readlink -f' command. */ @@ -7,30 +7,40 @@ #include <stdlib.h> #include <libgen.h> #include <string.h> +#include <limits.h> + +#define _XOPEN_SOURCE 700 char *realpath(const char *path, char *resolved_path); -int main(int argc, char *argv[]) { +int +main(int argc, char *argv[]) +{ + + char buf[PATH_MAX]; - char buf[512]; - char bname[512]; - strcpy(bname, "/"); - strcat(bname, (basename(argv[1]))); + /* We are going to use these if the file doesn't exist, but we can still + * use directories above the file. We are using dname and bname so that + * they don't clash with the functions with the same name. + */ + char dname[PATH_MAX]; /* directory name */ + char bname[NAME_MAX]; /* base name */ + sprintf(bname, "%s", (basename(argv[1]))); - if (argc != 2 || strcmp(argv[1], "--help") == 0) { - printf("usage: %s [file]\n", argv[0]); - return(1); - } + if (argc != 2 || strcmp(argv[1], "--help") == 0) { + fprintf(stderr, "usage: %s [file]\n", argv[0]); + return 1; + } - if (!realpath(argv[1], buf)) { + if (!realpath(argv[1], buf)) { - if (!realpath(dirname(argv[1]), buf)) { - perror("realpath"); - return(1); - } - strcat(buf, bname); - } + if (!realpath(dirname(argv[1]), dname)) { + perror(argv[0]); + return 1; + } + sprintf(buf, "%s/%s", dname, bname); + } - printf("%s\n", buf); - return(0); + printf("%s\n", buf); + return(0); } |