X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fmkdir.c;h=47f4cc843c77c12d5680f600f4c13de2b6152113;hb=5929edc1fac4340f99ed84e92bf3a2bedd4177c2;hp=f003db99fa25d606f2b83ab11168815e02f7f74a;hpb=822e7fd587d603b3a47e09d9be5305ccd9cc4c43;p=oweals%2Fbusybox.git diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index f003db99f..47f4cc843 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -20,46 +20,60 @@ * */ -#include -#include -#include -#include -#include -#include -#include -#include +/* 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. + */ +#include +#include +#include /* struct option */ #include "busybox.h" -extern int mkdir_main (int argc, char **argv) +#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS +static const struct option mkdir_long_options[] = { + { "mode", 1, NULL, 'm' }, + { "parents", 0, NULL, 'p' }, + { 0, 0, 0, 0 } +}; +#endif + +int mkdir_main (int argc, char **argv) { - mode_t mode = -1; + mode_t mode = (mode_t)(-1); + int status = EXIT_SUCCESS; int flags = 0; - int i, opt; + unsigned long opt; + char *smode; - while ((opt = getopt (argc, argv, "m:p")) != -1) { - switch (opt) { - case 'm': +#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS + bb_applet_long_options = mkdir_long_options; +#endif + opt = bb_getopt_ulflags(argc, argv, "m:p", &smode); + if(opt & 1) { mode = 0777; - if (!parse_mode (optarg, &mode)) { - error_msg_and_die ("invalid mode `%s'", optarg); - } - umask(0); - break; - case 'p': - flags |= FILEUTILS_RECUR; - break; - default: - show_usage (); + if (!bb_parse_mode (smode, &mode)) { + bb_error_msg_and_die ("invalid mode `%s'", smode); } } + if(opt & 2) + flags |= FILEUTILS_RECUR; - if (optind == argc) - show_usage (); - - for (i = optind; i < argc; i++) { - make_directory (argv[i], mode, flags); + if (optind == argc) { + bb_show_usage(); } - return(EXIT_SUCCESS); + argv += optind; + + do { + if (bb_make_directory(*argv, mode, flags)) { + status = EXIT_FAILURE; + } + } while (*++argv); + + return status; }