b42899a4a890180a16eeb901f4f6ec3b2e12a25b
[oweals/busybox.git] / coreutils / mkdir.c
1 /*
2  * Mini mkdir implementation for busybox
3  *
4  * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21
22 #include "internal.h"
23 #include <stdio.h>
24 #include <errno.h>
25 #include <sys/param.h>
26
27 const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n"
28 "Create the DIRECTORY(ies), if they do not already exist\n\n"
29 "-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n"
30 "-p\tno error if existing, make parent directories as needed\n";
31
32
33 static int parentFlag = FALSE;
34 static int permFlag = FALSE;
35 static mode_t mode = 0777;
36
37
38 extern int mkdir_main(int argc, char **argv)
39 {
40     argc--;
41     argv++;
42
43     /* Parse any options */
44     while (argc > 1 && **argv == '-') {
45         while (*++(*argv))
46             switch (**argv) {
47             case 'm':
48                 permFlag = TRUE;
49                 break;
50             case 'p':
51                 parentFlag = TRUE;
52                 break;
53             default:
54                 usage( mkdir_usage);
55             }
56         argc--;
57         argv++;
58     }
59
60
61     if (argc < 1) {
62         usage( mkdir_usage);
63     }
64
65     while (--argc > 0) {
66         struct stat statBuf;
67         if (stat(*(++argv), &statBuf) != ENOENT) {
68             fprintf(stderr, "%s: File exists\n", *argv);
69             return( FALSE);
70         }
71         if (parentFlag == TRUE)
72             createPath(*argv, mode);
73         else { 
74             if (mkdir (*argv, mode) != 0) {
75                 perror(*argv);
76                 exit( FALSE);
77             }
78         }
79     }
80     exit( TRUE);
81 }
82
83