|
|
1.1 ! root 1: /* pwd.c - return the current working directory */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: #ifndef BSD42 ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: #ifndef SYS5 ! 9: #include <ndir.h> ! 10: #else SYS5 ! 11: #include <dir.h> ! 12: #endif SYS5 ! 13: #endif BSD42 ! 14: ! 15: #define MAXPATHLEN 1024 ! 16: ! 17: static char curwd[MAXPATHLEN]; ! 18: ! 19: ! 20: ! 21: char *pwd () { ! 22: register char *cp; ! 23: ! 24: #ifndef BSD42 ! 25: if (getwd (curwd) == NOTOK) { ! 26: admonish (NULL, "unable to determine working directory"); ! 27: #else BSD42 ! 28: if (getwd (curwd) == NULL) { ! 29: admonish (NULLCP, "unable to determine working directory: %s", curwd); ! 30: #endif BSD42 ! 31: if (mypath == NULL ! 32: || *mypath == NULL ! 33: || ((void) strcpy (curwd, mypath), chdir (curwd)) == NOTOK) { ! 34: (void) strcpy (curwd, "/"); ! 35: (void) chdir (curwd); ! 36: } ! 37: return curwd; ! 38: } ! 39: ! 40: if ((cp = curwd + strlen (curwd) - 1) > curwd && *cp == '/') ! 41: *cp = NULL; ! 42: ! 43: return curwd; ! 44: } ! 45: ! 46: /* */ ! 47: ! 48: #ifndef BSD42 ! 49: /* getwd() - get the current working directory */ ! 50: ! 51: /* Algorithm from several sources, -ljobs, pwd.c, etc., etc. */ ! 52: ! 53: getwd (cwd) ! 54: register char *cwd; ! 55: { ! 56: int found; ! 57: char tmp1[BUFSIZ], ! 58: tmp2[BUFSIZ]; ! 59: struct stat st1, ! 60: st2, ! 61: root; ! 62: register struct direct *dp; ! 63: register DIR * dd; ! 64: ! 65: (void) strcpy (cwd, "/"); ! 66: (void) stat ("/", &root); ! 67: ! 68: for (;;) { ! 69: if ((dd = opendir ("..")) == NULL) ! 70: return NOTOK; ! 71: if (stat (".", &st2) == NOTOK || stat ("..", &st1) == NOTOK) ! 72: goto out; ! 73: if (st2.st_ino == root.st_ino && st2.st_dev == root.st_dev) { ! 74: closedir (dd); ! 75: return chdir (cwd); ! 76: } ! 77: ! 78: if (st2.st_ino == st1.st_ino && st2.st_dev == st1.st_dev) { ! 79: closedir (dd); ! 80: (void) chdir ("/"); ! 81: if ((dd = opendir (".")) == NULL) ! 82: return NOTOK; ! 83: if (stat (".", &st1) < 0) ! 84: goto out; ! 85: if (st2.st_dev != st1.st_dev) ! 86: while (dp = readdir (dd)) { ! 87: if (stat (dp -> d_name, &st1) == NOTOK) ! 88: goto out; ! 89: if (st2.st_dev == st1.st_dev) { ! 90: (void) sprintf (tmp1, "%s%s", dp -> d_name, cwd); ! 91: (void) strcpy (cwd + 1, tmp1); ! 92: closedir (dd); ! 93: return (chdir (cwd)); ! 94: } ! 95: } ! 96: else { ! 97: closedir (dd); ! 98: return (chdir (cwd)); ! 99: } ! 100: } ! 101: ! 102: found = 0; ! 103: while (dp = readdir (dd)) { ! 104: (void) sprintf (tmp2, "../%s", dp -> d_name); ! 105: if (stat (tmp2, &st1) != NOTOK ! 106: && st1.st_ino == st2.st_ino ! 107: && st1.st_dev == st2.st_dev) { ! 108: closedir (dd); ! 109: found++; ! 110: (void) chdir (".."); ! 111: (void) sprintf (tmp1, "%s%s", dp -> d_name, cwd); ! 112: (void) strcpy (cwd + 1, tmp1); ! 113: break; ! 114: } ! 115: } ! 116: if (!found) ! 117: goto out; ! 118: } ! 119: ! 120: out: ; ! 121: closedir (dd); ! 122: return NOTOK; ! 123: } ! 124: #endif not BSD42
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.