X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mkdir.c;h=03c49f0983cfa96486cc3d09c5c35c3619a112a1;hb=c126f8ffb6143f1455bea63dad21b2832ddb8b3c;hp=017ef9b08083c3c56f3e4217bc8bc2eb5a905d23;hpb=5509af7073ffff75d86ff8c67a2075169a859efd;p=oweals%2Fbusybox.git diff --git a/mkdir.c b/mkdir.c index 017ef9b08..03c49f098 100644 --- a/mkdir.c +++ b/mkdir.c @@ -1,9 +1,8 @@ +/* vi: set sw=4 ts=4: */ /* * Mini mkdir implementation for busybox * - * - * Copyright (C) 1999 by Lineo, inc. - * Written 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 @@ -21,88 +20,45 @@ * */ -#include "internal.h" -#include #include -#include - -static const char mkdir_usage[] = -"mkdir [OPTION] DIRECTORY...\n\n" -"Create the DIRECTORY(ies), if they do not already exist\n\n" -"Options:\n" -"\t-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n" -"\t-p\tno error if existing, make parent directories as needed\n"; - +#include +#include +#include +#include +#include +#include +#include -static int parentFlag = FALSE; -static mode_t mode = 0777; +#include "busybox.h" - -extern int mkdir_main(int argc, char **argv) +extern int mkdir_main (int argc, char **argv) { - int i=FALSE; - argc--; - argv++; + mode_t mode = -1; + int flags = 0; + int status = 0; + int i, opt; - /* 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); + while ((opt = getopt (argc, argv, "m:p")) != -1) { + switch (opt) { + case 'm': + mode = 0777; + if (!parse_mode (optarg, &mode)) + error_msg_and_die ("invalid mode `%s'", optarg); + break; + case 'p': + flags |= FILEUTILS_RECUR; + break; + default: + show_usage (); } - /* 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); - } } - argc--; - argv++; - } - - if (argc < 1) { - usage( mkdir_usage); - } + if (optind == argc) + show_usage (); - while (argc > 0) { - int status; - struct stat statBuf; - char buf[NAME_MAX]; + for (i = optind; i < argc; i++) + if (make_directory (argv[i], mode, flags) < 0) + status = 1; - strcpy (buf, *argv); - status=stat(buf, &statBuf); - if (parentFlag == FALSE && status != -1 && status != ENOENT ) { - fprintf(stderr, "%s: File exists\n", buf); - exit( FALSE); - } - if (parentFlag == TRUE) { - strcat( buf, "/"); - createPath(buf, mode); - } - else { - if (mkdir (buf, mode) != 0 && parentFlag == FALSE) { - perror(buf); - exit( FALSE); - } - } - argc--; - argv++; - } - exit( TRUE); + return status; } - -