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