X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/5dd6771b28c257af405d7248639ed0e3bcdce38b..7559e1ebf:/sbr/makedir.c?ds=inline diff --git a/sbr/makedir.c b/sbr/makedir.c index 4337b7ce..562949be 100644 --- a/sbr/makedir.c +++ b/sbr/makedir.c @@ -12,10 +12,8 @@ */ #include -#include -#include #include - + int makedir (char *dir) { @@ -23,15 +21,14 @@ makedir (char *dir) char* folder_perms_ASCII; int had_an_error = 0; mode_t folder_perms, saved_umask; - pid_t pid; register char* c; - context_save(); /* save the context file */ + context_save(); /* save the context file */ fflush(stdout); if (!(folder_perms_ASCII = context_find ("folder-protect"))) - folder_perms_ASCII = foldprot; /* defaults to "700" */ - + folder_perms_ASCII = foldprot; /* defaults to "700" */ + /* Because mh-profile.man documents "Folder-Protect:" as an octal constant, and we don't want to force the user to remember to include a leading zero, we call atooi(folder_perms_ASCII) here rather than @@ -45,74 +42,37 @@ makedir (char *dir) to interact with the umask. Clear it temporarily. */ saved_umask = umask(0); - if (getuid () == geteuid ()) { - c = strncpy(path, dir, sizeof(path)); - - while (!had_an_error && (c = strchr((c + 1), '/')) != NULL) { - *c = (char)0; - if (access(path, X_OK)) { - if (errno != ENOENT){ - advise (dir, "unable to create directory"); - had_an_error = 1; - } - /* Create an outer directory. */ - if (mkdir(path, folder_perms)) { - advise (dir, "unable to create directory"); - had_an_error = 1; - } - } - *c = '/'; - } + c = strncpy(path, dir, sizeof(path)); - if (!had_an_error) { - /* Create the innermost nested subdirectory of the path we're being - asked to create. */ - if (mkdir (dir, folder_perms) == -1) { - advise (dir, "unable to create directory"); - had_an_error = 1; - } - } + while (!had_an_error && (c = strchr((c + 1), '/')) != NULL) { + *c = (char)0; + if (access(path, X_OK)) { + if (errno != ENOENT){ + advise (dir, "unable to create directory"); + had_an_error = 1; + } + /* Create an outer directory. */ + if (mkdir(path, folder_perms)) { + advise (dir, "unable to create directory"); + had_an_error = 1; + } + } + *c = '/'; } - else { - /* Ummm, why do we want to avoid creating directories with the effective - user ID? None of the nmh tools are installed such that the effective - should be different from the real, and if some parent process made - the two be different, I don't see why it should be our job to enforce - the real UID. Also, why the heck do we call the mkdir executable - rather than the library function in this case?? If we do want to - call the mkdir executable, we should at least be giving it -p (and - change the single chmod() call below) so it can successfully create - nested directories like the above code can. - - -- Dan Harkless */ - switch (pid = vfork()) { - case -1: - advise ("fork", "unable to"); - return 0; - - case 0: - setgid (getgid ()); - setuid (getuid ()); - - execl ("/bin/mkdir", "mkdir", dir, NULL); - execl ("/usr/bin/mkdir", "mkdir", dir, NULL); - fprintf (stderr, "unable to exec "); - perror ("mkdir"); - _exit (-1); - - default: - if (pidXwait(pid, "mkdir")) - return 0; - break; - } - chmod (dir, folder_perms); + if (!had_an_error) { + /* Create the innermost nested subdirectory of the path we're being + asked to create. */ + if (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 (had_an_error) - return 0; /* opposite of UNIX error return convention */ + return 0; /* opposite of UNIX error return convention */ else - return 1; + return 1; }