blob: cf65f272f503130bd58d32256cc31773246d000e [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 Andersene77ae3a1999-10-19 20:03:34 +000027static const char mkdir_usage[] = "Usage: mkdir [OPTION] DIRECTORY...\n"
Eric Andersenf6be9441999-10-13 21:12:06 +000028"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:
Eric Andersenb0e9a701999-10-18 22:28:26 +000054 usage( mkdir_usage);
Eric Andersenf6be9441999-10-13 21:12:06 +000055 }
56 argc--;
57 argv++;
58 }
59
60
61 if (argc < 1) {
Eric Andersenb0e9a701999-10-18 22:28:26 +000062 usage( mkdir_usage);
Eric Andersenf6be9441999-10-13 21:12:06 +000063 }
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);
Eric Andersencc8ed391999-10-05 16:24:54 +000070 }
Eric Andersenf6be9441999-10-13 21:12:06 +000071 if (parentFlag == TRUE)
72 createPath(*argv, mode);
73 else {
74 if (mkdir (*argv, mode) != 0) {
75 perror(*argv);
76 exit( FALSE);
77 }
Eric Andersencc8ed391999-10-05 16:24:54 +000078 }
Eric Andersenf6be9441999-10-13 21:12:06 +000079 }
80 exit( TRUE);
Eric Andersencc8ed391999-10-05 16:24:54 +000081}
82
Eric Andersencc8ed391999-10-05 16:24:54 +000083