V10/netfs/serv/mkdir.c

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

/*
 * mkdir, rmdir
 * for systems without the system calls
 */
#include <errno.h>
#include <rf.h>

mkdir(s, mode)
char *s;
int mode;
{
	int npid, pid, sts;

	if ((pid = fork()) < 0) {
		rflog("can't mkdir %s: fork failed: %d\n", s, errno);
		errno = ENOTDIR;	/* or something */
		return (-1);
	}
	if (pid == 0) {		/* child */
		setgid(rfgid);
		setuid(rfuid);
		close(0);
		close(1);
		close(2);
		open("/dev/null", 2);
		dup(0);
		dup(0);
		execl("/bin/mkdir", "mkdir", s, (char *)0);
		execl("/usr/bin/mkdir", "mkdir", s, (char *)0);
		rflog("can't mkdir %s: can't exec mkdir\n", s);
		_exit(127);
	}
	while ((npid = wait(&sts)) != pid)
		if (npid < 0) {
			rflog("can't mkdir %s: bad wait: %d\n", s, errno);
			errno = ENOTDIR;
			return (-1);
		}
	if (sts) {
		errno = EPERM;		/* probably */
		return (-1);
	}
	if (chmod(s, mode) < 0) {
		rmdir(s);		/* what if it fails? */
		return (-1);
	}
	return (0);
}

rmdir(s)
char *s;
{
	int npid, pid, sts;

	if ((pid = fork()) < 0) {
		rflog("can't rmdir %s: fork failed: %d\n", s, errno);
		errno = ENOTDIR;	/* or something */
		return (-1);
	}
	if (pid == 0) {		/* child */
		setgid(rfgid);
		setuid(rfuid);
		close(0);
		close(1);
		close(2);
		open("/dev/null", 2);
		dup(0);
		dup(0);
		execl("/bin/rmdir", "rmdir", s, (char *)0);
		execl("/usr/bin/rmdir", "rmdir", s, (char *)0);
		rflog("can't rmdir %s: can't exec rmdir\n", s);
		_exit(127);
	}
	while ((npid = wait(&sts)) != pid)
		if (npid < 0) {
			rflog("can't rmdir %s: bad wait: %d\n", s, errno);
			errno = ENOTDIR;
			return (-1);
		}
	if (sts) {
		errno = EPERM;		/* probably */
		return (-1);
	}
	return (0);
}