Annotation of 43BSD/contrib/dsh/src/getwd.c, revision 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.