X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fmkdir.c;h=c950847dc34bcb8b8e1d64b2c18357768a1bfc44;hb=87559829ffc79b94adcee00b64706ce78ff2f3fb;hp=cf65f272f503130bd58d32256cc31773246d000e;hpb=e77ae3a2c0328590b43447550bdb1284650b8236;p=oweals%2Fbusybox.git diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index cf65f272f..c950847dc 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -1,7 +1,9 @@ +/* vi: set sw=4 ts=4: */ /* * Mini mkdir implementation for busybox * - * Copyright (C) 1998 by Erik Andersen + * 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 @@ -19,65 +21,84 @@ * */ -#include "internal.h" +#include "busybox.h" +#define bb_need_name_too_long +#define BB_DECLARE_EXTERN +#include "messages.c" + #include #include -#include - -static 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"; - static int parentFlag = FALSE; -static int permFlag = FALSE; static mode_t mode = 0777; extern int mkdir_main(int argc, char **argv) { - argc--; - argv++; + int i = FALSE; - /* 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++; - } - - - 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); + /* 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) { + errorMsg("Unknown mode: %s\n", *argv); + return EXIT_FAILURE; + } + /* 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 (parentFlag == TRUE) - createPath(*argv, mode); - else { - if (mkdir (*argv, mode) != 0) { - perror(*argv); - exit( FALSE); - } + + if (argc < 1) { + usage(mkdir_usage); } - } - exit( TRUE); -} + while (argc > 0) { + int status; + struct stat statBuf; + char buf[BUFSIZ + 1]; + if (strlen(*argv) > BUFSIZ - 1) { + errorMsg(name_too_long); + return EXIT_FAILURE; + } + strcpy(buf, *argv); + status = stat(buf, &statBuf); + if (parentFlag == FALSE && status != -1 && errno != ENOENT) { + errorMsg("%s: File exists\n", buf); + return EXIT_FAILURE; + } + if (parentFlag == TRUE) { + strcat(buf, "/"); + createPath(buf, mode); + } else { + if (mkdir(buf, mode) != 0 && parentFlag == FALSE) { + perror(buf); + return EXIT_FAILURE; + } + } + argc--; + argv++; + } + return EXIT_SUCCESS; +}