BSD 3 development
[unix-history] / usr / src / cmd / pwd.c
CommitLineData
3a54d117
BJ
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
9char dot[] = ".";
10char dotdot[] = "..";
11char name[BUFSIZ];
12int file;
13int off = -1;
14struct stat d, dd;
15struct direct dir;
16
17main()
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
56prname()
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
66cat()
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}