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 permisions on 'path', pass the appropriate 'mode'
35 * val. Otherwise, pass -1 to get default permisions.
42 int bb_make_directory (char *path, long mode, int flags)
55 if (flags & FILEUTILS_RECUR) { /* Get the parent. */
56 /* Bypass leading non-'/'s and then subsequent '/'s. */
62 c = *s; /* Save the current char */
63 *s = 0; /* and replace it with nul. */
70 if (mkdir(path, 0777) < 0) {
71 /* If we failed for any other reason than the directory
72 * already exists, output a diagnostic and return -1.*/
73 if (errno != EEXIST) {
78 /* Since the directory exists, don't attempt to change
79 * permissions if it was the full target. Note that
80 * this is not an error conditon. */
88 /* Done. If necessary, updated perms on the newly
89 * created directory. Failure to update here _is_
92 if ((mode != -1) && (chmod(path, mode) < 0)){
93 fail_msg = "set permissions of";
99 /* Remove any inserted nul from the path (recursive mode). */
104 bb_perror_msg ("Cannot %s directory `%s'", fail_msg, path);