You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.2 KiB
53 lines
1.2 KiB
/* 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|TOYFLAG_MAYFORK))
|
|
|
|
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 canonical 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 (!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 = 0;
|
|
|
|
// 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 = 0;
|
|
} else s = 0;
|
|
|
|
// If -L didn't give us a valid path, use cwd.
|
|
if (s || (s = pwd)) puts(s);
|
|
free(pwd);
|
|
if (!s) perror_exit("xgetcwd");
|
|
}
|