home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / pwd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.3 KB  |  81 lines

  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[512];
  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) > 511)
  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. }
  81.