Annotation of 3BSD/cmd/pwd.c, revision 1.1.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.