]>
diplodocus.org Git - nmh/blob - sbr/makedir.c
04e5d779f7ae1da40c3d3b3557bb2134e371e5a4
1 /* makedir.c -- make a directory
3 * This code is Copyright (c) 2002, by the authors of nmh. See the
4 * COPYRIGHT file in the root directory of the nmh distribution for
5 * complete copyright information.
9 * Modified to try recursive create.
17 makedir (const char *dir
)
20 char* folder_perms_ASCII
;
21 mode_t folder_perms
, saved_umask
;
24 context_save(); /* save the context file */
27 if (!(folder_perms_ASCII
= context_find ("folder-protect")))
28 folder_perms_ASCII
= foldprot
; /* defaults to "700" */
30 /* Because mh-profile.man documents "Folder-Protect:" as an octal constant,
31 and we don't want to force the user to remember to include a leading
32 zero, we call atooi(folder_perms_ASCII) here rather than
33 strtoul(folder_perms_ASCII, NULL, 0). Therefore, if anyone ever tries to
34 specify a mode in say, hex, they'll get garbage. (I guess nmh uses its
35 atooi() function rather than calling strtoul() with a radix of 8 because
36 some ancient platforms are missing that functionality. */
37 folder_perms
= atooi(folder_perms_ASCII
);
39 /* Folders have definite desired permissions that are set -- we don't want
40 to interact with the umask. Clear it temporarily. */
41 saved_umask
= umask(0);
43 c
= strncpy(path
, dir
, sizeof(path
));
45 bool had_an_error
= false;
46 while (!had_an_error
&& (c
= strchr((c
+ 1), '/')) != NULL
) {
48 if (access(path
, X_OK
)) {
50 advise (dir
, "unable to create directory");
53 /* Create an outer directory. */
54 if (mkdir(path
, folder_perms
)) {
55 advise (dir
, "unable to create directory");
63 /* Create the innermost nested subdirectory of the path we're being
65 if (mkdir (dir
, folder_perms
) == -1) {
66 advise (dir
, "unable to create directory");
71 umask(saved_umask
); /* put the user's umask back */
74 return 0; /* opposite of UNIX error return convention */