diff options
Diffstat (limited to 'mkdir.c')
-rw-r--r-- | mkdir.c | 119 |
1 files changed, 73 insertions, 46 deletions
@@ -1,58 +1,85 @@ +/* + * Mini mkdir implementation for busybox + * + * Copyright (C) 1998 by Erik Andersen <andersee@debian.org> + * + * 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" +#include <stdio.h> #include <errno.h> #include <sys/param.h> -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."; +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"; -/*make directories skipping the last part of the path. Used here and by untar*/ -int mkdir_until(const char *fpath, const struct FileInfo * fi) -{ - char path[PATH_MAX]; - char * s = path; - 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; - } - } - - } - s++; - } - return 0; -} +static int parentFlag = FALSE; +static int permFlag = FALSE; +static mode_t mode = 0777; + -int -mkdir_fn(const struct FileInfo * i) +extern int mkdir_main(int argc, char **argv) { - if ( i->makeParentDirectories ) { - if(mkdir_until(i->source, i)) return 1; - } + argc--; + argv++; + + /* Parse any options */ + while (argc > 1 && **argv == '-') { + while (*++(*argv)) + switch (**argv) { + case 'm': + permFlag = TRUE; + break; + case 'p': + parentFlag = TRUE; + break; + default: + fprintf(stderr, "%s\n", mkdir_usage); + exit(FALSE); + } + argc--; + argv++; + } + - if ( mkdir(i->source, i->orWithMode) != 0 && errno != EEXIST ) { - name_and_error(i->source); - return 1; + if (argc < 1) { + fprintf(stderr, "%s\n", mkdir_usage); + exit (FALSE); + } + + while (--argc > 0) { + struct stat statBuf; + if (stat(*(++argv), &statBuf) != ENOENT) { + fprintf(stderr, "%s: File exists\n", *argv); + return( FALSE); + } + if (parentFlag == TRUE) + createPath(*argv, mode); + else { + if (mkdir (*argv, mode) != 0) { + perror(*argv); + exit( FALSE); + } } - else - return 0; + } + exit( TRUE); } + |