Minix1.1/usr/src/commands/pwd.c

Compare this file to the similar file:
Show the results in this format:

/* pwd - print working directory		Author: Adri Koppes */

#include "stat.h"

struct direct {
    unsigned short d_ino;
    char d_name[14];
}
main()
{
	register int fd;
	register char name[128], *n;
	char *last_index();
	struct stat s, st;
	struct direct d;

	*name = 0;
	stat(".", &s);
	do {
		if ((fd = open("..",0)) < 0) {
			prints("Can't open ..\n");
			exit(1);
		}
		st.st_dev = s.st_dev;
		st.st_ino = s.st_ino;
		st.st_mode = s.st_mode;
		st.st_nlink = s.st_nlink;
		st.st_uid = s.st_uid;
		st.st_gid = s.st_gid;
		st.st_rdev = s.st_rdev;
		st.st_size = s.st_size;
		st.st_atime = s.st_atime;
		st.st_mtime = s.st_mtime;
		st.st_ctime = s.st_ctime;
		stat("..", &s);
		chdir("..");
		if (s.st_dev == st.st_dev)
			do
				if (read(fd, (char *)&d, sizeof(struct direct)) < sizeof(struct direct)) {
					prints("Can't read ..\n");
					exit(1);
				}
			while(d.d_ino != st.st_ino);
		else
			do {
				if (read(fd, (char *)&d, sizeof(struct direct)) < sizeof(struct direct)) {
					prints("Can't read ..\n");
					exit(1);
				}
				stat(d.d_name, &s);
			} while ((s.st_dev != st.st_dev) || (s.st_ino != st.st_ino));
		close(fd);
		if (strcmp(".",d.d_name)) {
			strcat(name,"/");
			strcat(name,d.d_name);
		}
	} while ((s.st_ino != st.st_ino) || (s.st_dev != st.st_dev));
	if (!*name)
		prints("/");
	else
		while (n = last_index(name, '/')) {
			prints(n);
			*n = 0;
		}
	prints(name);
	prints("\n");
	exit(0);
}


char   *
last_index (string, ch)
register char  *string;
register char   ch;
{
    register char  *retval = 0;

    for (; *string; *string++)
	if (*string == ch)
	    retval = string;
    return (retval);
}