blob: 70fdbdfb5660e62f413125df3e1b80663c7c5247 [file] [log] [blame]
Erik Andersene49d5ec2000-02-08 19:58:47 +00001/* vi: set sw=4 ts=4: */
Eric Andersenf6be9441999-10-13 21:12:06 +00002/*
3 * Mini mkdir implementation for busybox
4 *
Eric Andersenc4996011999-10-20 22:08:37 +00005 *
6 * Copyright (C) 1999 by Lineo, inc.
7 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
Eric Andersenf6be9441999-10-13 21:12:06 +00008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 *
23 */
24
Eric Andersencc8ed391999-10-05 16:24:54 +000025#include "internal.h"
Erik Andersenfac10d72000-02-07 05:29:42 +000026#define bb_need_name_too_long
27#define BB_DECLARE_EXTERN
28#include "messages.c"
29
Eric Andersenf6be9441999-10-13 21:12:06 +000030#include <stdio.h>
Eric Andersencc8ed391999-10-05 16:24:54 +000031#include <errno.h>
Erik Andersene49d5ec2000-02-08 19:58:47 +000032#include <sys/param.h> /* for PATH_MAX */
Eric Andersencc8ed391999-10-05 16:24:54 +000033
Erik Andersen5509af72000-01-23 18:19:02 +000034static const char mkdir_usage[] =
Erik Andersene49d5ec2000-02-08 19:58:47 +000035 "mkdir [OPTION] DIRECTORY...\n\n"
36 "Create the DIRECTORY(ies), if they do not already exist\n\n"
37 "Options:\n"
38
39 "\t-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n"
40 "\t-p\tno error if existing, make parent directories as needed\n";
Eric Andersencc8ed391999-10-05 16:24:54 +000041
Eric Andersenf6be9441999-10-13 21:12:06 +000042
43static int parentFlag = FALSE;
Eric Andersended62591999-11-18 00:19:26 +000044static mode_t mode = 0777;
Eric Andersenf6be9441999-10-13 21:12:06 +000045
46
47extern int mkdir_main(int argc, char **argv)
Eric Andersencc8ed391999-10-05 16:24:54 +000048{
Erik Andersene49d5ec2000-02-08 19:58:47 +000049 int i = FALSE;
Eric Andersencc8ed391999-10-05 16:24:54 +000050
Erik Andersene49d5ec2000-02-08 19:58:47 +000051 argc--;
52 argv++;
53
54 /* Parse any options */
55 while (argc > 0 && **argv == '-') {
56 while (i == FALSE && *++(*argv)) {
57 switch (**argv) {
58 case 'm':
59 if (--argc == 0)
60 usage(mkdir_usage);
61 /* Find the specified modes */
62 mode = 0;
63 if (parse_mode(*(++argv), &mode) == FALSE) {
64 fprintf(stderr, "Unknown mode: %s\n", *argv);
65 exit FALSE;
66 }
67 /* Set the umask for this process so it doesn't
68 * screw up whatever the user just entered. */
69 umask(0);
70 i = TRUE;
71 break;
72 case 'p':
73 parentFlag = TRUE;
74 break;
75 default:
76 usage(mkdir_usage);
77 }
Eric Andersenfa0540f1999-10-22 18:18:31 +000078 }
Erik Andersene49d5ec2000-02-08 19:58:47 +000079 argc--;
80 argv++;
Eric Andersenfa0540f1999-10-22 18:18:31 +000081 }
Eric Andersenf6be9441999-10-13 21:12:06 +000082
Erik Andersene49d5ec2000-02-08 19:58:47 +000083 if (argc < 1) {
84 usage(mkdir_usage);
85 }
Eric Andersenf6be9441999-10-13 21:12:06 +000086
Erik Andersene49d5ec2000-02-08 19:58:47 +000087 while (argc > 0) {
88 int status;
89 struct stat statBuf;
90 char buf[PATH_MAX + 1];
91
92 if (strlen(*argv) > PATH_MAX - 1) {
93 fprintf(stderr, name_too_long, "mkdir");
94 exit FALSE;
95 }
96 strcpy(buf, *argv);
97 status = stat(buf, &statBuf);
98 if (parentFlag == FALSE && status != -1 && errno != ENOENT) {
99 fprintf(stderr, "%s: File exists\n", buf);
100 exit FALSE;
101 }
102 if (parentFlag == TRUE) {
103 strcat(buf, "/");
104 createPath(buf, mode);
105 } else {
106 if (mkdir(buf, mode) != 0 && parentFlag == FALSE) {
107 perror(buf);
108 exit FALSE;
109 }
110 }
111 argc--;
112 argv++;
Erik Andersenfac10d72000-02-07 05:29:42 +0000113 }
Erik Andersene49d5ec2000-02-08 19:58:47 +0000114 exit TRUE;
Eric Andersencc8ed391999-10-05 16:24:54 +0000115}