home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s2 / pwd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  1.2 KB  |  62 lines

  1. char dot[] ".";
  2. char dotdot[] "..";
  3. char root[] "/";
  4. char name[512];
  5. int file, off -1;
  6. struct statb {int devn, inum, i[18];}x;
  7. struct entry { int jnum; char name[16];}y;
  8.  
  9. main() {
  10.     int n;
  11.  
  12. loop0:
  13.     stat(dot, &x);
  14.     if((file = open(dotdot,0)) < 0) prname();
  15. loop1:
  16.     if((n = read(file,&y,16)) < 16) prname();
  17.     if(y.jnum != x.inum)goto loop1;
  18.     close(file);
  19.     if(y.jnum == 1) ckroot();
  20.     cat();
  21.     chdir(dotdot);
  22.     goto loop0;
  23. }
  24. ckroot() {
  25.     int i, n;
  26.  
  27.     if((n = stat(y.name,&x)) < 0) prname();
  28.     i = x.devn;
  29.     if((n = chdir(root)) < 0) prname();
  30.     if((file = open(root,0)) < 0) prname();
  31. loop:
  32.     if((n = read(file,&y,16)) < 16) prname();
  33.     if(y.jnum == 0) goto loop;
  34.     if((n = stat(y.name,&x)) < 0) prname();
  35.     if(x.devn != i) goto loop;
  36.     x.i[0] =& 060000;
  37.     if(x.i[0] != 040000) goto loop;
  38.     if(y.name[0]=='.')if(((y.name[1]=='.') && (y.name[2]==0)) ||
  39.                 (y.name[1] == 0)) goto pr;
  40.     cat();
  41. pr:
  42.     write(1,root,1);
  43.     prname();
  44. }
  45. prname() {
  46.     if(off<0)off=0;
  47.     name[off] = '\n';
  48.     write(1,name,off+1);
  49.     exit();
  50. }
  51. cat() {
  52.     int i, j;
  53.  
  54.     i = -1;
  55.     while(y.name[++i] != 0);
  56.     if((off+i+2) > 511) prname();
  57.     for(j=off+1; j>=0; --j) name[j+i+1] = name[j];
  58.     off=i+off+1;
  59.     name[i] = root[0];
  60.     for(--i; i>=0; --i) name[i] = y.name[i];
  61. }
  62.