blob: 61d35d5cda1249235b1e918c87d3a4f675bc52c4 [file] [log] [blame]
Eric Andersenf6be9441999-10-13 21:12:06 +00001/*
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
Eric Andersencc8ed391999-10-05 16:24:54 +000022#include "internal.h"
Eric Andersenf6be9441999-10-13 21:12:06 +000023#include <stdio.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000024#include <errno.h>
25#include <sys/param.h>
26
Eric Andersenf6be9441999-10-13 21:12:06 +000027const 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";
Eric Andersencc8ed391999-10-05 16:24:54 +000031
Eric Andersenf6be9441999-10-13 21:12:06 +000032
33static int parentFlag = FALSE;
34static int permFlag = FALSE;
35static mode_t mode = 0777;
36
37
38extern int mkdir_main(int argc, char **argv)
Eric Andersencc8ed391999-10-05 16:24:54 +000039{
Eric Andersenf6be9441999-10-13 21:12:06 +000040 argc--;
41 argv++;
Eric Andersencc8ed391999-10-05 16:24:54 +000042
Eric Andersenf6be9441999-10-13 21:12:06 +000043 /* 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 fprintf(stderr, "%s\n", mkdir_usage);
55 exit(FALSE);
56 }
57 argc--;
58 argv++;
59 }
60
61
62 if (argc < 1) {
63 fprintf(stderr, "%s\n", mkdir_usage);
64 exit (FALSE);
65 }
66
67 while (--argc > 0) {
68 struct stat statBuf;
69 if (stat(*(++argv), &statBuf) != ENOENT) {
70 fprintf(stderr, "%s: File exists\n", *argv);
71 return( FALSE);
Eric Andersencc8ed391999-10-05 16:24:54 +000072 }
Eric Andersenf6be9441999-10-13 21:12:06 +000073 if (parentFlag == TRUE)
74 createPath(*argv, mode);
75 else {
76 if (mkdir (*argv, mode) != 0) {
77 perror(*argv);
78 exit( FALSE);
79 }
Eric Andersencc8ed391999-10-05 16:24:54 +000080 }
Eric Andersenf6be9441999-10-13 21:12:06 +000081 }
82 exit( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +000083}
84
Eric Andersencc8ed391999-10-05 16:24:54 +000085