Annotation of 43BSD/contrib/dsh/src/getwd.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  Getwd
                      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: DIR    *file;
                     12: int    off     = -1;
                     13: struct stat    d, dd;
                     14: struct direct  *dir;
                     15: 
                     16: getwd(name)
                     17: char   *name;
                     18: {
                     19:        int rdev, rino;
                     20: 
                     21:        name[0] = '/';
                     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:                        return;
                     29:                }
                     30:                if ((file = opendir(dotdot)) == NULL) {
                     31:                        error ("can't open ..");
                     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:                                return;
                     38:                        }
                     39:                        do
                     40:                                if ((dir = readdir(file)) == NULL) {
                     41:                                        fprintf(stderr,"read error in ..\n");
                     42:                                        exit(1);
                     43:                                }
                     44:                        while (dir->d_ino != d.st_ino);
                     45:                } else
                     46:                        do {
                     47:                                if ((dir = readdir(file)) == NULL) {
                     48:                                        fprintf(stderr,"read error in ..\n");
                     49:                                        exit(1);
                     50:                                }
                     51:                                stat(dir->d_name, &dd);
                     52:                        } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
                     53:                closedir(file);
                     54:                cat(name+1);
                     55:        }
                     56: }
                     57: 
                     58: cat(name)
                     59: char *name;
                     60: {
                     61:        register i, j;
                     62: 
                     63:        i = dir->d_namlen;
                     64:        for(j=off+1; j>=0; --j)
                     65:                name[j+i+1] = name[j];
                     66:        off=i+off+1;
                     67:        name[i] = '/';
                     68:        for(--i; i>=0; --i)
                     69:                name[i] = dir->d_name[i];
                     70: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.