X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fmkdir.c;h=c837e97267c6e8808305f3c6e03d4fdf02ef3f87;hb=138ce54c9c1930348bc842be781accd7c50c2cef;hp=b0a2d57d630526021043a63e5b78ad87602901c5;hpb=61677feff7f549a48267c2c0c50a7420de6e2599;p=oweals%2Fbusybox.git diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index b0a2d57d6..c837e9726 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -2,113 +2,77 @@ /* * Mini mkdir implementation for busybox * - * Copyright (C) 1999,2000 by Lineo, inc. - * Written by Erik Andersen , - * - * 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 + * Copyright (C) 2001 Matt Kraai * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ -#include "internal.h" -#define bb_need_name_too_long -#define BB_DECLARE_EXTERN -#include "messages.c" - -#include -#include -#include /* for PATH_MAX */ +/* BB_AUDIT SUSv3 compliant */ +/* http://www.opengroup.org/onlinepubs/007904975/utilities/mkdir.html */ -static const char mkdir_usage[] = - "mkdir [OPTION] DIRECTORY...\n\n" - "Create the DIRECTORY(ies), if they do not already exist\n\n" - "Options:\n" +/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) + * + * Fixed broken permission setting when -p was used; especially in + * conjunction with -m. + */ - "\t-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n" - "\t-p\tno error if existing, make parent directories as needed\n"; +/* Nov 28, 2006 Yoshinori Sato : Add SELinux Support. + */ +#include "libbb.h" -static int parentFlag = FALSE; -static mode_t mode = 0777; +/* This is a NOFORK applet. Be very careful! */ +#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS +static const char mkdir_longopts[] ALIGN1 = + "mode\0" Required_argument "m" + "parents\0" No_argument "p" +#if ENABLE_SELINUX + "context\0" Required_argument "Z" +#endif + ; +#endif -extern int mkdir_main(int argc, char **argv) +int mkdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int mkdir_main(int argc UNUSED_PARAM, char **argv) { - int i = FALSE; + mode_t mode = (mode_t)(-1); + int status = EXIT_SUCCESS; + int flags = 0; + unsigned opt; + char *smode; +#if ENABLE_SELINUX + security_context_t scontext; +#endif - argc--; - argv++; - - /* Parse any options */ - while (argc > 0 && **argv == '-') { - while (i == FALSE && *++(*argv)) { - switch (**argv) { - case 'm': - if (--argc == 0) - usage(mkdir_usage); - /* Find the specified modes */ - mode = 0; - if (parse_mode(*(++argv), &mode) == FALSE) { - fprintf(stderr, "Unknown mode: %s\n", *argv); - exit FALSE; - } - /* Set the umask for this process so it doesn't - * screw up whatever the user just entered. */ - umask(0); - i = TRUE; - break; - case 'p': - parentFlag = TRUE; - break; - default: - usage(mkdir_usage); - } +#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS + applet_long_options = mkdir_longopts; +#endif + opt = getopt32(argv, "m:p" IF_SELINUX("Z:"), &smode IF_SELINUX(,&scontext)); + if (opt & 1) { + mode = 0777; + if (!bb_parse_mode(smode, &mode)) { + bb_error_msg_and_die("invalid mode '%s'", smode); } - argc--; - argv++; } - - if (argc < 1) { - usage(mkdir_usage); + if (opt & 2) + flags |= FILEUTILS_RECUR; +#if ENABLE_SELINUX + if (opt & 4) { + selinux_or_die(); + setfscreatecon_or_die(scontext); } +#endif - while (argc > 0) { - int status; - struct stat statBuf; - char buf[PATH_MAX + 1]; + argv += optind; + if (!argv[0]) + bb_show_usage(); - if (strlen(*argv) > PATH_MAX - 1) { - fprintf(stderr, name_too_long, "mkdir"); - exit FALSE; - } - strcpy(buf, *argv); - status = stat(buf, &statBuf); - if (parentFlag == FALSE && status != -1 && errno != ENOENT) { - fprintf(stderr, "%s: File exists\n", buf); - exit FALSE; + do { + if (bb_make_directory(*argv, mode, flags)) { + status = EXIT_FAILURE; } - if (parentFlag == TRUE) { - strcat(buf, "/"); - createPath(buf, mode); - } else { - if (mkdir(buf, mode) != 0 && parentFlag == FALSE) { - perror(buf); - exit FALSE; - } - } - argc--; - argv++; - } - exit TRUE; + } while (*++argv); + + return status; }