pwd.c (825B)
1 /* See LICENSE file for copyright and license details. */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <sys/stat.h> 6 7 #include "util.h" 8 9 static const char *getpwd(const char *cwd); 10 11 static void 12 usage(void) 13 { 14 eprintf("usage: %s [-LP]\n", argv0); 15 } 16 17 int 18 main(int argc, char *argv[]) 19 { 20 char *cwd; 21 char mode = 'L'; 22 23 ARGBEGIN { 24 case 'L': 25 case 'P': 26 mode = ARGC(); 27 break; 28 default: 29 usage(); 30 } ARGEND; 31 32 cwd = agetcwd(); 33 puts((mode == 'L') ? getpwd(cwd) : cwd); 34 35 return 0; 36 } 37 38 static const char * 39 getpwd(const char *cwd) 40 { 41 const char *pwd; 42 struct stat cst, pst; 43 44 if (!(pwd = getenv("PWD")) || pwd[0] != '/' || stat(pwd, &pst) < 0) 45 return cwd; 46 if (stat(cwd, &cst) < 0) 47 eprintf("stat %s:", cwd); 48 if (pst.st_dev == cst.st_dev && pst.st_ino == cst.st_ino) 49 return pwd; 50 else 51 return cwd; 52 }