| /* readlink.c - Return string representation of a symbolic link. |
| * |
| * Copyright 2007 Rob Landley <rob@landley.net> |
| |
| USE_READLINK(NEWTOY(readlink, "<1nqmef(canonicalize)[-mef]", TOYFLAG_USR|TOYFLAG_BIN)) |
| USE_REALPATH(NEWTOY(realpath, "<1", TOYFLAG_USR|TOYFLAG_BIN)) |
| |
| config READLINK |
| bool "readlink" |
| default y |
| help |
| usage: readlink FILE... |
| |
| With no options, show what symlink points to, return error if not symlink. |
| |
| Options for producing canonical paths (all symlinks/./.. resolved): |
| |
| -e Canonical path to existing entry (fail if missing) |
| -f Full path (fail if directory missing) |
| -m Ignore missing entries, show where it would be |
| -n No trailing newline |
| -q Quiet (no output, just error code) |
| |
| config REALPATH |
| bool "realpath" |
| default y |
| help |
| usage: realpath FILE... |
| |
| Display the canonical absolute pathname |
| */ |
| |
| #define FOR_readlink |
| #define FORCE_FLAGS |
| #include "toys.h" |
| |
| void readlink_main(void) |
| { |
| char **arg, *s; |
| |
| for (arg = toys.optargs; *arg; arg++) { |
| // Calculating full canonical path? |
| // Take advantage of flag positions to calculate m = -1, f = 0, e = 1 |
| if (toys.optflags & (FLAG_f|FLAG_e|FLAG_m)) |
| s = xabspath(*arg, (toys.optflags&(FLAG_f|FLAG_e))-1); |
| else s = xreadlink(*arg); |
| |
| if (s) { |
| if (!FLAG(q)) xprintf(FLAG(n) ? "%s" : "%s\n", s); |
| if (CFG_TOYBOX_FREE) free(s); |
| } else toys.exitval = 1; |
| } |
| } |
| |
| void realpath_main(void) |
| { |
| toys.optflags = FLAG_f; |
| readlink_main(); |
| } |