|
|
1.1 ! root 1: static char *sccsid = "@(#)pwd.c 4.1 (Berkeley) 10/1/80"; ! 2: /* ! 3: * Print working (current) directory ! 4: */ ! 5: #include <stdio.h> ! 6: #include <sys/param.h> ! 7: #include <sys/stat.h> ! 8: #include <sys/dir.h> ! 9: ! 10: char dot[] = "."; ! 11: char dotdot[] = ".."; ! 12: char name[BUFSIZ]; ! 13: int file; ! 14: int off = -1; ! 15: struct stat d, dd; ! 16: struct direct dir; ! 17: ! 18: main() ! 19: { ! 20: int rdev, rino; ! 21: ! 22: stat("/", &d); ! 23: rdev = d.st_dev; ! 24: rino = d.st_ino; ! 25: for (;;) { ! 26: stat(dot, &d); ! 27: if (d.st_ino==rino && d.st_dev==rdev) ! 28: prname(); ! 29: if ((file = open(dotdot,0)) < 0) { ! 30: fprintf(stderr,"pwd: cannot open ..\n"); ! 31: exit(1); ! 32: } ! 33: fstat(file, &dd); ! 34: chdir(dotdot); ! 35: if(d.st_dev == dd.st_dev) { ! 36: if(d.st_ino == dd.st_ino) ! 37: prname(); ! 38: do ! 39: if (read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) { ! 40: fprintf(stderr,"read error in ..\n"); ! 41: exit(1); ! 42: } ! 43: while (dir.d_ino != d.st_ino); ! 44: } ! 45: else do { ! 46: if(read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) { ! 47: fprintf(stderr,"read error in ..\n"); ! 48: exit(1); ! 49: } ! 50: stat(dir.d_name, &dd); ! 51: } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); ! 52: close(file); ! 53: cat(); ! 54: } ! 55: } ! 56: ! 57: prname() ! 58: { ! 59: write(1, "/", 1); ! 60: if (off<0) ! 61: off = 0; ! 62: name[off] = '\n'; ! 63: write(1, name, off+1); ! 64: exit(0); ! 65: } ! 66: ! 67: cat() ! 68: { ! 69: register i, j; ! 70: ! 71: i = -1; ! 72: while (dir.d_name[++i] != 0); ! 73: if ((off+i+2) > BUFSIZ-1) ! 74: prname(); ! 75: for(j=off+1; j>=0; --j) ! 76: name[j+i+1] = name[j]; ! 77: off=i+off+1; ! 78: name[i] = '/'; ! 79: for(--i; i>=0; --i) ! 80: name[i] = dir.d_name[i]; ! 81: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.