xref: /original-bsd/bin/pwd/pwd.c (revision fbed46ce)
1 static char *sccsid = "@(#)pwd.c	4.3 (Berkeley) 05/07/82";
2 /*
3  * Print working (current) directory
4  */
5 #include	<stdio.h>
6 #include	<sys/param.h>
7 #include	<sys/stat.h>
8 #include	<dir.h>
9 
10 char	dot[]	= ".";
11 char	dotdot[] = "..";
12 char	name[BUFSIZ];
13 DIR	*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 = opendir(dotdot)) == NULL) {
30 			fprintf(stderr,"pwd: cannot open ..\n");
31 			exit(1);
32 		}
33 		fstat(file->dd_fd, &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 ((dir = readdir(file)) == NULL) {
40 					fprintf(stderr,"read error in ..\n");
41 					exit(1);
42 				}
43 			while (dir->d_ino != d.st_ino);
44 		} else
45 			do {
46 				if ((dir = readdir(file)) == NULL) {
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 		closedir(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 = dir->d_namlen;
72 	if ((off + dir->d_namlen + 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 }
81