X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fmkdir.c;h=48a95badbc760419b3548a6683d55d6b287e481e;hb=e2e56c7c4129de7d20df42e8239fd304c81ef29b;hp=8f1fa04db50d705f93a888e6db2deb99a6314a80;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index 8f1fa04db..48a95badb 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -1,58 +1,75 @@ -#include "internal.h" -#include -#include - -const char mkdir_usage[] = "mkdir [-m mode] directory [directory ...]\n" -"\tCreate directories.\n" -"\n" -"\t-m mode:\tSpecifiy the mode for the new directory\n" -"\t\tunder the argument directory."; - -/*make directories skipping the last part of the path. Used here and by untar*/ -int mkdir_until(const char *fpath, const struct FileInfo * fi) -{ - char path[PATH_MAX]; - char * s = path; +/* vi: set sw=4 ts=4: */ +/* + * Mini mkdir implementation for busybox + * + * Copyright (C) 2001 Matt Kraai + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ - strcpy(path, fpath); - if ( s[0] == '\0' && s[1] == '\0' ) { - usage(mkdir_usage); - return 1; - } - s++; - while ( *s != '\0' ) { - if ( *s == '/' ) { - int status; - - *s = '\0'; - status = mkdir(path, (fi?fi->orWithMode:0700) ); - *s = '/'; - - if ( status != 0 ) { - if ( errno != EEXIST ) { - name_and_error(fpath); - return 1; - } - } +/* BB_AUDIT SUSv3 compliant */ +/* http://www.opengroup.org/onlinepubs/007904975/utilities/mkdir.html */ - } - s++; - } - return 0; -} +/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) + * + * Fixed broken permission setting when -p was used; especially in + * conjunction with -m. + */ + +#include +#include +#include /* struct option */ +#include "busybox.h" + +static const struct option mkdir_long_options[] = { + { "mode", 1, NULL, 'm' }, + { "parents", 0, NULL, 'p' }, + { 0, 0, 0, 0 } +}; -int -mkdir_fn(const struct FileInfo * i) +int mkdir_main (int argc, char **argv) { - if ( i->makeParentDirectories ) { - if(mkdir_until(i->source, i)) return 1; + mode_t mode = (mode_t)(-1); + int status = EXIT_SUCCESS; + int flags = 0; + unsigned long opt; + char *smode; + + bb_applet_long_options = mkdir_long_options; + opt = bb_getopt_ulflags(argc, argv, "m:p", &smode); + if(opt & 1) { + mode = 0777; + if (!bb_parse_mode (smode, &mode)) { + bb_error_msg_and_die ("invalid mode `%s'", smode); + } } + if(opt & 2) + flags |= FILEUTILS_RECUR; - if ( mkdir(i->source, i->orWithMode) != 0 && errno != EEXIST ) { - name_and_error(i->source); - return 1; + if (optind == argc) { + bb_show_usage(); } - else - return 0; -} + argv += optind; + + do { + if (bb_make_directory(*argv, mode, flags)) { + status = EXIT_FAILURE; + } + } while (*++argv); + + return status; +}