|
|
1.1 root 1: /*
2: * Getwd
3: */
4: #include <sys/param.h>
5: #include <sys/stat.h>
6: #include <sys/dir.h>
7:
8: #define dot "."
9: #define dotdot ".."
10:
11: static char *name;
12:
13: static int file;
14: static int off = -1;
15: static struct stat d, dd;
16: static struct direct dir;
17:
18: char *
19: getwd(np)
20: char *np;
21: {
22: int rdev, rino;
23:
24: *np++ = '/';
25: name = np;
26: stat("/", &d);
27: rdev = d.st_dev;
28: rino = d.st_ino;
29: for (;;) {
30: stat(dot, &d);
31: if (d.st_ino==rino && d.st_dev==rdev)
32: goto done;
33: if ((file = open(dotdot,0)) < 0)
34: prexit("getwd: cannot open ..\n");
35: fstat(file, &dd);
36: chdir(dotdot);
37: if(d.st_dev == dd.st_dev) {
38: if(d.st_ino == dd.st_ino)
39: goto done;
40: do
41: if (read(file, (char *)&dir, sizeof(dir)) < sizeof(dir))
42: prexit("getwd: read error in ..\n");
43: while (dir.d_ino != d.st_ino);
44: }
45: else do {
46: if(read(file, (char *)&dir, sizeof(dir)) < sizeof(dir))
47: prexit("getwd: read error in ..\n");
48: stat(dir.d_name, &dd);
49: } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
50: close(file);
51: cat();
52: }
53: done:
54: name--;
55: if (chdir(name) < 0)
56: prexit("getwd: can't change back\n");
57: return (name);
58: }
59:
60: cat()
61: {
62: register i, j;
63:
64: i = -1;
65: while (dir.d_name[++i] != 0);
66: if ((off+i+2) > 1024-1)
67: return;
68: for(j=off+1; j>=0; --j)
69: name[j+i+1] = name[j];
70: if (off >= 0)
71: name[i] = '/';
72: off=i+off+1;
73: name[off] = 0;
74: for(--i; i>=0; --i)
75: name[i] = dir.d_name[i];
76: }
77:
78: prexit(cp)
79: char *cp;
80: {
81: write(2, cp, strlen(cp));
82: exit(1);
83: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.