| /* pwd.c - Print working directory. |
| * |
| * Copyright 2006 Rob Landley <rob@landley.net> |
| * |
| * See http://opengroup.org/onlinepubs/9699919799/utilities/pwd.html |
| |
| USE_PWD(NEWTOY(pwd, ">0LP[-LP]", TOYFLAG_BIN)) |
| |
| config PWD |
| bool "pwd" |
| default y |
| help |
| usage: pwd [-L|-P] |
| |
| Print working (current) directory. |
| |
| -L Use shell's path from $PWD (when applicable) |
| -P Print cannonical absolute path |
| */ |
| |
| #define FOR_pwd |
| #include "toys.h" |
| |
| void pwd_main(void) |
| { |
| char *s, *pwd = getcwd(0, 0), *PWD; |
| |
| // Only use $PWD if it's an absolute path alias for cwd with no "." or ".." |
| if (!(toys.optflags & FLAG_P) && (s = PWD = getenv("PWD"))) { |
| struct stat st1, st2; |
| |
| while (*s == '/') { |
| if (*(++s) == '.') { |
| if (s[1] == '/' || !s[1]) break; |
| if (s[1] == '.' && (s[2] == '/' || !s[2])) break; |
| } |
| while (*s && *s != '/') s++; |
| } |
| if (!*s && s != PWD) s = PWD; |
| else s = NULL; |
| |
| // If current directory exists, make sure it matches. |
| if (s && pwd) |
| if (stat(pwd, &st1) || stat(PWD, &st2) || st1.st_ino != st2.st_ino || |
| st1.st_dev != st2.st_dev) s = NULL; |
| } else s = NULL; |
| |
| // If -L didn't give us a valid path, use cwd. |
| if (!s && !(s = pwd)) perror_exit("xgetcwd"); |
| |
| xprintf("%s\n", s); |
| |
| if (CFG_TOYBOX_FREE) free(pwd); |
| } |