X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fmkdir.c;h=48a95badbc760419b3548a6683d55d6b287e481e;hb=07a79e75f502ebd41e5341aacc5de303d3ffaea0;hp=b42899a4a890180a16eeb901f4f6ec3b2e12a25b;hpb=b0e9a709ba1ae1724d413a77f5b67b1a3e6c6cb7;p=oweals%2Fbusybox.git diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index b42899a4a..48a95badb 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -1,7 +1,8 @@ +/* vi: set sw=4 ts=4: */ /* * Mini mkdir implementation for busybox * - * Copyright (C) 1998 by Erik Andersen + * 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 @@ -19,65 +20,56 @@ * */ -#include "internal.h" -#include -#include -#include - -const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n" -"Create the DIRECTORY(ies), if they do not already exist\n\n" -"-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n" -"-p\tno error if existing, make parent directories as needed\n"; +/* BB_AUDIT SUSv3 compliant */ +/* http://www.opengroup.org/onlinepubs/007904975/utilities/mkdir.html */ +/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) + * + * Fixed broken permission setting when -p was used; especially in + * conjunction with -m. + */ -static int parentFlag = FALSE; -static int permFlag = FALSE; -static mode_t mode = 0777; +#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 } +}; -extern int mkdir_main(int argc, char **argv) +int mkdir_main (int argc, char **argv) { - argc--; - argv++; - - /* Parse any options */ - while (argc > 1 && **argv == '-') { - while (*++(*argv)) - switch (**argv) { - case 'm': - permFlag = TRUE; - break; - case 'p': - parentFlag = TRUE; - break; - default: - usage( mkdir_usage); - } - argc--; - argv++; - } - + mode_t mode = (mode_t)(-1); + int status = EXIT_SUCCESS; + int flags = 0; + unsigned long opt; + char *smode; - if (argc < 1) { - usage( mkdir_usage); - } - - while (--argc > 0) { - struct stat statBuf; - if (stat(*(++argv), &statBuf) != ENOENT) { - fprintf(stderr, "%s: File exists\n", *argv); - return( FALSE); + 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 (parentFlag == TRUE) - createPath(*argv, mode); - else { - if (mkdir (*argv, mode) != 0) { - perror(*argv); - exit( FALSE); - } + if(opt & 2) + flags |= FILEUTILS_RECUR; + + if (optind == argc) { + bb_show_usage(); } - } - exit( TRUE); -} + argv += optind; + do { + if (bb_make_directory(*argv, mode, flags)) { + status = EXIT_FAILURE; + } + } while (*++argv); + + return status; +}