|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.