X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6e0e2e4490ebb9daf1f62ed7a2d30412551772ee..91baa2e0868d9d2e5cf664d63f4fbba25c4470cf:/sbr/makedir.c?ds=sidebyside diff --git a/sbr/makedir.c b/sbr/makedir.c index e4c3c26c..67f69c86 100644 --- a/sbr/makedir.c +++ b/sbr/makedir.c @@ -2,7 +2,9 @@ /* * makedir.c -- make a directory * - * $Id$ + * 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. */ /* @@ -10,11 +12,7 @@ */ #include -#include -#include #include - -extern int errno; int makedir (char *dir) @@ -30,20 +28,23 @@ makedir (char *dir) fflush(stdout); if (!(folder_perms_ASCII = context_find ("folder-protect"))) - folder_perms_ASCII = foldprot; /* defaults to "0700" */ - - /* Call strtoul() with radix=0, which means it'll determine the base by - looking at the first digit. That way it'll know "0700" is an octal - constant (and if someone gets wacky and changes the representation to hex - it'll still work). */ - folder_perms = strtoul(folder_perms_ASCII, NULL, 0); + 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 + strtoul(folder_perms_ASCII, NULL, 0). Therefore, if anyone ever tries to + specify a mode in say, hex, they'll get garbage. (I guess nmh uses its + atooi() function rather than calling strtoul() with a radix of 8 because + some ancient platforms are missing that functionality. */ + folder_perms = atooi(folder_perms_ASCII); /* Folders have definite desired permissions that are set -- we don't want to interact with the umask. Clear it temporarily. */ saved_umask = umask(0); if (getuid () == geteuid ()) { - c = strncpy(path, dir, sizeof(path)); + c = strncpy(path, dir, sizeof(path)); while (!had_an_error && (c = strchr((c + 1), '/')) != NULL) { *c = (char)0; @@ -82,22 +83,22 @@ makedir (char *dir) nested directories like the above code can. -- Dan Harkless */ - switch (pid = vfork()) { - case -1: + switch (pid = fork()) { + case -1: advise ("fork", "unable to"); return 0; - case 0: + case 0: setgid (getgid ()); setuid (getuid ()); - execl ("/bin/mkdir", "mkdir", dir, NULL); - execl ("/usr/bin/mkdir", "mkdir", dir, NULL); + execl ("/bin/mkdir", "mkdir", dir, (void *) NULL); + execl ("/usr/bin/mkdir", "mkdir", dir, (void *) NULL); fprintf (stderr, "unable to exec "); perror ("mkdir"); _exit (-1); - default: + default: if (pidXwait(pid, "mkdir")) return 0; break;