1*10126Ssam /* @(#)getcwd.c 4.3 (Berkeley) 01/04/83 */ 29986Ssam 39986Ssam /* 49986Ssam * Getwd 59986Ssam */ 610088Ssam #include <sys/param.h> 710088Ssam #include <sys/stat.h> 810088Ssam #include <sys/dir.h> 99986Ssam 109986Ssam #define dot "." 119986Ssam #define dotdot ".." 129986Ssam 1310088Ssam static char *name; 149986Ssam 1510088Ssam static DIR *file; 1610088Ssam static int off; 1710088Ssam static struct stat d, dd; 1810088Ssam static struct direct *dir; 199986Ssam 209986Ssam char * 219986Ssam getwd(np) 2210088Ssam char *np; 239986Ssam { 2410088Ssam dev_t rdev; 2510088Ssam ino_t rino; 269986Ssam 2710088Ssam off = -1; 289986Ssam *np++ = '/'; 299986Ssam name = np; 309986Ssam stat("/", &d); 319986Ssam rdev = d.st_dev; 329986Ssam rino = d.st_ino; 339986Ssam for (;;) { 349986Ssam stat(dot, &d); 359986Ssam if (d.st_ino==rino && d.st_dev==rdev) 369986Ssam goto done; 379986Ssam if ((file = opendir(dotdot)) == NULL) 389986Ssam prexit("getwd: cannot open ..\n"); 399986Ssam fstat(file->dd_fd, &dd); 40*10126Ssam if (chdir(dotdot) < 0) 41*10126Ssam prexit("getwd: cannot chdir to ..\n"); 42*10126Ssam if (d.st_dev == dd.st_dev) { 439986Ssam if(d.st_ino == dd.st_ino) 449986Ssam goto done; 459986Ssam do 469986Ssam if ((dir = readdir(file)) == NULL) 479986Ssam prexit("getwd: read error in ..\n"); 489986Ssam while (dir->d_ino != d.st_ino); 49*10126Ssam } else 50*10126Ssam do { 519986Ssam if ((dir = readdir(file)) == NULL) 529986Ssam prexit("getwd: read error in ..\n"); 539986Ssam stat(dir->d_name, &dd); 549986Ssam } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); 559986Ssam closedir(file); 569986Ssam cat(); 579986Ssam } 589986Ssam done: 599986Ssam name--; 609986Ssam if (chdir(name) < 0) 619986Ssam prexit("getwd: can't change back\n"); 629986Ssam return (name); 639986Ssam } 649986Ssam 659986Ssam cat() 669986Ssam { 679986Ssam register i, j; 689986Ssam 699986Ssam i = -1; 709986Ssam while (dir->d_name[++i] != 0); 719986Ssam if ((off+i+2) > 1024-1) 729986Ssam return; 739986Ssam for(j=off+1; j>=0; --j) 749986Ssam name[j+i+1] = name[j]; 759986Ssam if (off >= 0) 769986Ssam name[i] = '/'; 779986Ssam off=i+off+1; 789986Ssam name[off] = 0; 799986Ssam for(--i; i>=0; --i) 809986Ssam name[i] = dir->d_name[i]; 819986Ssam } 829986Ssam 839986Ssam prexit(cp) 84*10126Ssam char *cp; 859986Ssam { 869986Ssam write(2, cp, strlen(cp)); 879986Ssam exit(1); 889986Ssam } 89