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: }

Defined functions

cat defined in line 66; used 1 times
  • in line 52
main defined in line 17; never used
prname defined in line 56; used 3 times

Defined variables

d defined in line 14; used 11 times
dd defined in line 14; used 6 times
dir defined in line 15; used 10 times
dot defined in line 9; used 1 times
  • in line 25
dotdot defined in line 10; used 2 times
file defined in line 12; used 5 times
name defined in line 11; used 6 times
off defined in line 13; used 8 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 639
Valid CSS Valid XHTML 1.0 Strict