-
/*
- * makedir.c -- make a directory
- *
- * $Id$
- */
+** makedir.c -- make a directory
+**
+** This code is Copyright (c) 2002, by the authors of nmh. See the
+** COPYRIGHT file in the root directory of the nmh distribution for
+** complete copyright information.
+*/
/*
- * Modified to try recursive create.
- */
+** Modified to try recursive create.
+*/
#include <h/mh.h>
#include <errno.h>
#include <sys/param.h>
#include <sys/file.h>
-extern int errno;
-
int
-makedir (char *dir)
+makedir(char *dir)
{
- pid_t pid;
- register char *cp;
- register char *c;
- char path[PATH_MAX];
+ char path[PATH_MAX];
+ char *cp;
+ int had_an_error = 0;
+ mode_t folder_perms, saved_umask;
+ register char* c;
- context_save(); /* save the context file */
- fflush(stdout);
+ context_save(); /* save the context file */
+ fflush(stdout);
- if (getuid () == geteuid ()) {
- c = strncpy(path, dir, sizeof(path));
+ if (!(cp = context_find("folder-protect")) || !*cp) {
+ cp = foldprot;
+ }
+ folder_perms = strtoul(cp, NULL, 8);
- while ((c = strchr((c + 1), '/')) != NULL) {
- *c = (char)0;
- if (access(path, X_OK)) {
- if (errno != ENOENT){
- advise (dir, "unable to create directory");
- return 0;
- }
- if (mkdir(path, 0775)) {
- advise (dir, "unable to create directory");
- return 0;
- }
- }
- *c = '/';
- }
-
- if (mkdir (dir, 0755) == -1) {
- advise (dir, "unable to create directory");
- return 0;
- }
- } else {
- switch (pid = vfork()) {
- case -1:
- advise ("fork", "unable to");
- return 0;
+ /*
+ ** Folders have definite desired permissions that are set -- we
+ ** don't want to interact with the umask. Clear it temporarily.
+ */
+ saved_umask = umask(0);
- case 0:
- setgid (getgid ());
- setuid (getuid ());
+ c = strncpy(path, dir, sizeof(path));
- execl ("/bin/mkdir", "mkdir", dir, NULL);
- execl ("/usr/bin/mkdir", "mkdir", dir, NULL);
- fprintf (stderr, "unable to exec ");
- perror ("mkdir");
- _exit (-1);
+ while (!had_an_error && (c = strchr((c + 1), '/')) != NULL) {
+ *c = '\0';
+ /* Create an outer directory. */
+ if (mkdir(path, folder_perms) == -1 &&
+ errno != EEXIST) {
+ advise(dir, "unable to create directory");
+ had_an_error = 1;
+ }
+ *c = '/';
+ }
- default:
- if (pidXwait(pid, "mkdir"))
- return 0;
- break;
+ /*
+ ** Create the innermost nested subdirectory of the
+ ** path we're being asked to create.
+ */
+ if (!had_an_error && mkdir(dir, folder_perms)==-1) {
+ advise(dir, "unable to create directory");
+ had_an_error = 1;
}
- }
+ umask(saved_umask); /* put the user's umask back */
- if (!(cp = context_find ("folder-protect")))
- cp = foldprot;
- chmod (dir, atooi (cp));
- return 1;
+ return (had_an_error) ? 0 : 1;
}