|
|
1.1 ! root 1: /******************************************************************* ! 2: * curdir: get current directory ! 3: ******************************************************************* ! 4: * returns full pathname of working (current) directory. ! 5: * This is an adaptation of pwd, and works for grafted directories. ! 6: * Unlike pwd, returns to current directory after it is finished. ! 7: * Uses stdio buffering for directory reads. ! 8: */ ! 9: ! 10: static char rcsid[]= ! 11: "$Header: /arthur/src/local/bin/rcs/src/RCS/curdir.c,v 3.2 87/10/18 10:21:49 narten Exp $"; ! 12: ! 13: /******************************************************************* ! 14: * $Log: curdir.c,v $ ! 15: * Revision 3.2 87/10/18 10:21:49 narten ! 16: * Updating version numbers. Changes relative to 1.1 are actually ! 17: * relative to 3.2 ! 18: * ! 19: * Revision 1.1 84/01/23 14:50:01 kcs ! 20: * Initial revision ! 21: * ! 22: * Revision 3.2 82/12/24 15:41:51 wft ! 23: * Changed curdir() such that it returns a pointer to the pathname of ! 24: * the current working directory, just as Berkeley's getcwd(). ! 25: * ! 26: * Revision 3.1 82/10/18 21:16:21 wft ! 27: * curdir() now uses stdio buffering for directory reads, ! 28: * returns to working directory after done, and closes the directories. ! 29: * A testprogram was also added. ! 30: * ! 31: *******************************************************************/ ! 32: ! 33: ! 34: #include "rcsbase.h" ! 35: #include <sys/param.h> ! 36: #include <sys/stat.h> ! 37: #include <sys/dir.h> ! 38: #define dot "." ! 39: #define dotdot ".." ! 40: ! 41: ! 42: static char cwd[NCPPN]; ! 43: ! 44: char * curdir() ! 45: /* Function: places the pathname of the current directory into cwd ! 46: * and returns a pointer to it. Returns NULL on failure. ! 47: */ ! 48: { ! 49: FILE *file; ! 50: struct stat d, dd; ! 51: struct direct dir; ! 52: ! 53: int rdev, rino; ! 54: int off; ! 55: register i,j; ! 56: ! 57: cwd[off= 0] = '/'; ! 58: cwd[1] = '\0'; ! 59: stat("/", &d); ! 60: rdev = d.st_dev; ! 61: rino = d.st_ino; ! 62: for (;;) { ! 63: if (stat(dot, &d)<0) return NULL; ! 64: if (d.st_ino==rino && d.st_dev==rdev) { ! 65: if (cwd[off] == '/') cwd[off] = '\0'; ! 66: chdir(cwd); /*change back to current directory*/ ! 67: return cwd; ! 68: } ! 69: if ((file = fopen(dotdot,"r")) == NULL) return NULL; ! 70: if (fstat(fileno(file), &dd)<0) goto fail; ! 71: chdir(dotdot); ! 72: if(d.st_dev == dd.st_dev) { ! 73: if(d.st_ino == dd.st_ino) { ! 74: if (cwd[off] == '/') cwd[off] = '\0'; ! 75: chdir(cwd); /*change back to current directory*/ ! 76: fclose(file); ! 77: return cwd; ! 78: } ! 79: do { ! 80: if (fread((char *)&dir, sizeof(dir), 1, file) !=1) ! 81: goto fail; ! 82: } while (dir.d_ino != d.st_ino); ! 83: } ! 84: else do { ! 85: if(fread((char *)&dir, sizeof(dir), 1, file) != 1) { ! 86: goto fail; ! 87: } ! 88: stat(dir.d_name, &dd); ! 89: } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); ! 90: fclose(file); ! 91: ! 92: /* concatenate file name */ ! 93: i = -1; ! 94: while (dir.d_name[++i] != 0); ! 95: for(j=off+1; j>0; --j) ! 96: cwd[j+i+1] = cwd[j]; ! 97: off=i+off+1; ! 98: cwd[i+1] = '/'; ! 99: for(--i; i>=0; --i) ! 100: cwd[i+1] = dir.d_name[i]; ! 101: } /* end for */ ! 102: ! 103: fail: fclose(file); ! 104: return NULL; ! 105: } ! 106: ! 107: ! 108: #ifdef TEST ! 109: main () ! 110: { ! 111: printf ("pwd = %s\n", curdir()); ! 112: } ! 113: #endif TEST ! 114:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.