1 /* vi: set sw=4 ts=4: */
3 * parse_mode implementation for busybox
5 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 /* Mar 5, 2003 Manuel Novoa III
25 * This is the main work function for the 'mkdir' applet. As such, it
26 * strives to be SUSv3 compliant in it's behaviour when recursively
27 * making missing parent dirs, and in it's mode setting of the final
30 * To recursively build all missing intermediate directories, make
31 * sure that (flags & FILEUTILS_RECUR) is non-zero. Newly created
32 * intermediate directories will have at least u+wx perms.
34 * To set specific permissions on 'path', pass the appropriate 'mode'
35 * val. Otherwise, pass -1 to get default permissions.
43 int bb_make_directory (char *path, long mode, int flags)
54 mode = (S_IXUSR | S_IXGRP | S_IXOTH |
55 S_IWUSR | S_IWGRP | S_IWOTH |
56 S_IRUSR | S_IRGRP | S_IROTH) & ~mask;
64 if (flags & FILEUTILS_RECUR) { /* Get the parent. */
65 /* Bypass leading non-'/'s and then subsequent '/'s. */
71 c = *s; /* Save the current char */
72 *s = 0; /* and replace it with nul. */
79 if (mkdir(path, 0777) < 0) {
80 /* If we failed for any other reason than the directory
81 * already exists, output a diagnostic and return -1.*/
83 || !(flags & FILEUTILS_RECUR)
84 || (stat(path, &st) < 0 || !S_ISDIR(st.st_mode))) {
89 /* Since the directory exists, don't attempt to change
90 * permissions if it was the full target. Note that
91 * this is not an error conditon. */
99 /* Done. If necessary, updated perms on the newly
100 * created directory. Failure to update here _is_
103 if ((mode != -1) && (chmod(path, mode) < 0)){
104 fail_msg = "set permissions of";
110 /* Remove any inserted nul from the path (recursive mode). */
115 bb_perror_msg ("Cannot %s directory `%s'", fail_msg, path);