1 static char *sccsid = "@(#)pwd.c 4.3 (Berkeley) 05/07/82"; 2 /* 3 * Print working (current) directory 4 */ 5 #include <stdio.h> 6 #include <sys/param.h> 7 #include <sys/stat.h> 8 #include <dir.h> 9 10 char dot[] = "."; 11 char dotdot[] = ".."; 12 char name[BUFSIZ]; 13 DIR *file; 14 int off = -1; 15 struct stat d, dd; 16 struct direct *dir; 17 18 main() 19 { 20 int rdev, rino; 21 22 stat("/", &d); 23 rdev = d.st_dev; 24 rino = d.st_ino; 25 for (;;) { 26 stat(dot, &d); 27 if (d.st_ino==rino && d.st_dev==rdev) 28 prname(); 29 if ((file = opendir(dotdot)) == NULL) { 30 fprintf(stderr,"pwd: cannot open ..\n"); 31 exit(1); 32 } 33 fstat(file->dd_fd, &dd); 34 chdir(dotdot); 35 if(d.st_dev == dd.st_dev) { 36 if(d.st_ino == dd.st_ino) 37 prname(); 38 do 39 if ((dir = readdir(file)) == NULL) { 40 fprintf(stderr,"read error in ..\n"); 41 exit(1); 42 } 43 while (dir->d_ino != d.st_ino); 44 } else 45 do { 46 if ((dir = readdir(file)) == NULL) { 47 fprintf(stderr,"read error in ..\n"); 48 exit(1); 49 } 50 stat(dir->d_name, &dd); 51 } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); 52 closedir(file); 53 cat(); 54 } 55 } 56 57 prname() 58 { 59 write(1, "/", 1); 60 if (off<0) 61 off = 0; 62 name[off] = '\n'; 63 write(1, name, off+1); 64 exit(0); 65 } 66 67 cat() 68 { 69 register i, j; 70 71 i = dir->d_namlen; 72 if ((off + dir->d_namlen + 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 } 81