|
|
1.1 ! root 1: /* @(#) $Header: makedir.c,v 1.4 89/12/15 14:39:26 leres Exp $ (LBL) */ ! 2: /* makedir.c - make a directory */ ! 3: ! 4: #include "../h/mh.h" ! 5: #include <stdio.h> ! 6: #include <errno.h> ! 7: ! 8: extern int errno; ! 9: ! 10: ! 11: makedir(dir) ! 12: register char *dir; ! 13: { ! 14: register int i, pid; ! 15: register char *cp; ! 16: char temp[BUFSIZ]; ! 17: ! 18: m_update(); ! 19: (void) fflush(stdout); ! 20: ! 21: #ifdef BSD42 ! 22: if (getuid() == geteuid()) { ! 23: errno = 0; ! 24: if ((i = mkdir(dir, 0755)) < 0 && errno == ENOENT) { ! 25: /* Attempt to create higher level directories */ ! 26: cp = strcpy(temp, dir); ! 27: if (*cp == '/') ! 28: ++cp; ! 29: while (cp = index(cp, '/')) { ! 30: *cp = '\0'; ! 31: errno = 0; ! 32: if ((i = mkdir(temp, 0755)) < 0 && ! 33: errno != EEXIST) ! 34: break; ! 35: *cp++ = '/'; ! 36: } ! 37: if (i >= 0) ! 38: i = mkdir(temp, 0755); ! 39: } ! 40: if (i < 0) { ! 41: advise(dir, "unable to create directory"); ! 42: return(0); ! 43: } ! 44: } else ! 45: #endif BSD42 ! 46: switch (pid = vfork()) { ! 47: ! 48: case NOTOK: ! 49: advise("fork", "unable to"); ! 50: return(0); ! 51: ! 52: case OK: ! 53: (void) setgid(getgid()); ! 54: (void) setuid(getuid()); ! 55: ! 56: execl("/bin/mkdir", "mkdir", dir, NULLCP); ! 57: execl("/usr/bin/mkdir", "mkdir", dir, NULLCP); ! 58: perror("unable to exec mkdir"); ! 59: _exit(-1); ! 60: ! 61: default: ! 62: if (pidXwait(pid, "mkdir")) ! 63: return(0); ! 64: break; ! 65: } ! 66: ! 67: if ((cp = m_find("folder-protect")) == NULL) ! 68: cp = foldprot; ! 69: (void) chmod(dir, atooi(cp)); ! 70: return(1); ! 71: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.