Annotation of 3BSD/cmd/pwd.c, revision 1.1

1.1     ! root        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[BUFSIZ];
        !            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) > 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: }

unix.superglobalmegacorp.com

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