/*
 * mct, Thu Dec  8 13:46:40 EST 2005
 * vim:set ts=4 sw=4 ai nocindent:
 */

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

void pfatal(char *err)
{
	perror(err);
	exit(1);
}

/* Simulate a "/usr/bin/find . -print" */
void find(char *dirname)
{
	DIR *fd;
	struct dirent *d;

	if ((fd = opendir(dirname)) == NULL)
		pfatal("opendir");

	while ((d = readdir(fd)))
	{
		char fullname[MAXPATHLEN];
		struct stat statbuf;

		if (strcmp(".", d->d_name) == 0)
			continue;
		if (strcmp("..", d->d_name) == 0)
			continue;

		snprintf(fullname, MAXPATHLEN-1, "%s/%s", dirname, d->d_name);

		if (lstat(fullname, &statbuf) != 0)
			pfatal("lstat");

		printf("   %s\n", fullname);

		if (S_ISDIR(statbuf.st_mode))
			find(fullname);
	}

	closedir(fd);
}

int main(int argc, char *argv[])
{
	char *tmpdir;
	DIR *fd;
	int i;

	if (argc != 2)
	{
		fprintf(stderr, "Usage: %s <tmpdirname>\n", argv[0]);
		exit(1);
	}

	tmpdir = argv[1];

	if (mkdir(tmpdir, 0777) != 0 && errno != EEXIST)
		pfatal("mkdir");

	printf("\nInitial file system view:\n");
	find("/");

	if ((fd = opendir(".")) == NULL)
		pfatal("opendir");

	if (chroot(tmpdir) != 0)
		pfatal("chroot");

	if (fchdir(dirfd(fd)) != 0)
		pfatal("fchdir");

	for (i = 0; i < 100; i++)
		if (chdir("..") != 0)
			pfatal("chdir");

	if (chroot(".") != 0)
		pfatal("chroot");

	printf("\nNew file system view:\n");
	find("/");
	exit(0);
}
