File:  [CSRG BSD Unix] / 43BSDReno / contrib / mh / sbr / makedir.c
Revision 1.1: download - view: text, annotated - select for diffs
Tue Apr 24 16:12:56 2018 UTC (8 years, 1 month ago) by root
CVS tags: MAIN, HEAD
Initial revision

/* @(#) $Header: /var/lib/cvsd/repos/CSRG/43BSDReno/contrib/mh/sbr/makedir.c,v 1.1 2018/04/24 16:12:56 root Exp $ (LBL) */
/* makedir.c - make a directory */

#include "../h/mh.h"
#include <stdio.h>
#include <errno.h>

extern int errno;


makedir(dir)
	register char *dir;
{
	register int i, pid;
	register char *cp;
	char temp[BUFSIZ];

	m_update();
	(void) fflush(stdout);

#ifdef	BSD42
	if (getuid() == geteuid()) {
		errno = 0;
		if ((i = mkdir(dir, 0755)) < 0 && errno == ENOENT) {
			/* Attempt to create higher level directories */
			cp = strcpy(temp, dir);
			if (*cp == '/')
				++cp;
			while (cp = index(cp, '/')) {
				*cp = '\0';
				errno = 0;
				if ((i = mkdir(temp, 0755)) < 0 &&
				    errno != EEXIST)
					break;
				*cp++ = '/';
			}
			if (i >= 0)
				i = mkdir(temp, 0755);
		}
		if (i < 0) {
			advise(dir, "unable to create directory");
			return(0);
		}
	} else
#endif	BSD42
		switch (pid = vfork()) {

		case NOTOK:
			advise("fork", "unable to");
			return(0);

		case OK:
			(void) setgid(getgid());
			(void) setuid(getuid());

			execl("/bin/mkdir", "mkdir", dir, NULLCP);
			execl("/usr/bin/mkdir", "mkdir", dir, NULLCP);
			perror("unable to exec mkdir");
			_exit(-1);

		default:
			if (pidXwait(pid, "mkdir"))
				return(0);
			break;
		}

	if ((cp = m_find("folder-protect")) == NULL)
		cp = foldprot;
	(void) chmod(dir, atooi(cp));
	return(1);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.