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