X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fmkdir.c;h=70fdbdfb5660e62f413125df3e1b80663c7c5247;hb=298854f02963bd8e43dfeb7224d88cfeb0c932cb;hp=8f1fa04db50d705f93a888e6db2deb99a6314a80;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index 8f1fa04db..70fdbdfb5 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -1,58 +1,115 @@ +/* vi: set sw=4 ts=4: */ +/* + * Mini mkdir implementation for busybox + * + * + * Copyright (C) 1999 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 + * + */ + #include "internal.h" +#define bb_need_name_too_long +#define BB_DECLARE_EXTERN +#include "messages.c" + +#include #include -#include +#include /* for PATH_MAX */ + +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"; + -const char mkdir_usage[] = "mkdir [-m mode] directory [directory ...]\n" -"\tCreate directories.\n" -"\n" -"\t-m mode:\tSpecifiy the mode for the new directory\n" -"\t\tunder the argument directory."; +static int parentFlag = FALSE; +static mode_t mode = 0777; -/*make directories skipping the last part of the path. Used here and by untar*/ -int mkdir_until(const char *fpath, const struct FileInfo * fi) + +extern int mkdir_main(int argc, char **argv) { - char path[PATH_MAX]; - char * s = path; + int i = FALSE; - strcpy(path, fpath); - if ( s[0] == '\0' && s[1] == '\0' ) { - usage(mkdir_usage); - return 1; - } - s++; - while ( *s != '\0' ) { - if ( *s == '/' ) { - int status; - - *s = '\0'; - status = mkdir(path, (fi?fi->orWithMode:0700) ); - *s = '/'; - - if ( status != 0 ) { - if ( errno != EEXIST ) { - name_and_error(fpath); - return 1; + 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); } - } - s++; + argc--; + argv++; } - return 0; -} -int -mkdir_fn(const struct FileInfo * i) -{ - if ( i->makeParentDirectories ) { - if(mkdir_until(i->source, i)) return 1; + if (argc < 1) { + usage(mkdir_usage); } - if ( mkdir(i->source, i->orWithMode) != 0 && errno != EEXIST ) { - name_and_error(i->source); - return 1; + while (argc > 0) { + int status; + struct stat statBuf; + char buf[PATH_MAX + 1]; + + 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; + } + if (parentFlag == TRUE) { + strcat(buf, "/"); + createPath(buf, mode); + } else { + if (mkdir(buf, mode) != 0 && parentFlag == FALSE) { + perror(buf); + exit FALSE; + } + } + argc--; + argv++; } - else - return 0; + exit TRUE; } -