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[512];
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) > 511)
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: }
Defined functions
cat
defined in line
66; used 1 times
main
defined in line
17;
never used
Defined variables
d
defined in line
14; used 11 times
dd
defined in line
14; used 6 times
dir
defined in line
15; used 10 times
dot
defined in line
9; used 1 times
file
defined in line
12; used 5 times
name
defined in line
11; used 6 times
off
defined in line
13; used 8 times