aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/kiss-readlink.c48
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);
}