Annotation of 40BSD/cmd/pwd.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)pwd.c       4.1 (Berkeley) 10/1/80";
                      2: /*
                      3:  * Print working (current) directory
                      4:  */
                      5: #include       <stdio.h>
                      6: #include       <sys/param.h>
                      7: #include       <sys/stat.h>
                      8: #include       <sys/dir.h>
                      9: 
                     10: char   dot[]   = ".";
                     11: char   dotdot[] = "..";
                     12: char   name[BUFSIZ];
                     13: int    file;
                     14: int    off     = -1;
                     15: struct stat    d, dd;
                     16: struct direct  dir;
                     17: 
                     18: main()
                     19: {
                     20:        int rdev, rino;
                     21: 
                     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:                        prname();
                     29:                if ((file = open(dotdot,0)) < 0) {
                     30:                        fprintf(stderr,"pwd: cannot open ..\n");
                     31:                        exit(1);
                     32:                }
                     33:                fstat(file, &dd);
                     34:                chdir(dotdot);
                     35:                if(d.st_dev == dd.st_dev) {
                     36:                        if(d.st_ino == dd.st_ino)
                     37:                                prname();
                     38:                        do
                     39:                                if (read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) {
                     40:                                        fprintf(stderr,"read error in ..\n");
                     41:                                        exit(1);
                     42:                                }
                     43:                        while (dir.d_ino != d.st_ino);
                     44:                }
                     45:                else do {
                     46:                                if(read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) {
                     47:                                        fprintf(stderr,"read error in ..\n");
                     48:                                        exit(1);
                     49:                                }
                     50:                                stat(dir.d_name, &dd);
                     51:                        } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
                     52:                close(file);
                     53:                cat();
                     54:        }
                     55: }
                     56: 
                     57: prname()
                     58: {
                     59:        write(1, "/", 1);
                     60:        if (off<0)
                     61:                off = 0;
                     62:        name[off] = '\n';
                     63:        write(1, name, off+1);
                     64:        exit(0);
                     65: }
                     66: 
                     67: cat()
                     68: {
                     69:        register i, j;
                     70: 
                     71:        i = -1;
                     72:        while (dir.d_name[++i] != 0);
                     73:        if ((off+i+2) > BUFSIZ-1)
                     74:                prname();
                     75:        for(j=off+1; j>=0; --j)
                     76:                name[j+i+1] = name[j];
                     77:        off=i+off+1;
                     78:        name[i] = '/';
                     79:        for(--i; i>=0; --i)
                     80:                name[i] = dir.d_name[i];
                     81: }

unix.superglobalmegacorp.com

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