aboutsummaryrefslogtreecommitdiff
path: root/mkdir.c
diff options
context:
space:
mode:
Diffstat (limited to 'mkdir.c')
-rw-r--r--mkdir.c97
1 files changed, 31 insertions, 66 deletions
diff --git a/mkdir.c b/mkdir.c
index d78f57e2b..03c49f098 100644
--- a/mkdir.c
+++ b/mkdir.c
@@ -2,8 +2,7 @@
2/* 2/*
3 * Mini mkdir implementation for busybox 3 * Mini mkdir implementation for busybox
4 * 4 *
5 * Copyright (C) 1999,2000,2001 by Lineo, inc. 5 * Copyright (C) 2001 Matt Kraai <kraai@alumni.carnegiemellon.edu>
6 * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
7 * 6 *
8 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -21,79 +20,45 @@
21 * 20 *
22 */ 21 */
23 22
24#include <stdio.h>
25#include <errno.h> 23#include <errno.h>
26#include <string.h> 24#include <getopt.h>
25#include <sys/stat.h>
26#include <sys/types.h>
27#include <fcntl.h>
28#include <unistd.h>
27#include <stdlib.h> 29#include <stdlib.h>
28#include "busybox.h" 30#include <string.h>
29
30
31static int parentFlag = FALSE;
32static mode_t mode = 0777;
33 31
32#include "busybox.h"
34 33
35extern int mkdir_main(int argc, char **argv) 34extern int mkdir_main (int argc, char **argv)
36{ 35{
37 int i = FALSE; 36 mode_t mode = -1;
37 int flags = 0;
38 int status = 0;
39 int i, opt;
38 40
39 argc--; 41 while ((opt = getopt (argc, argv, "m:p")) != -1) {
40 argv++; 42 switch (opt) {
41 43 case 'm':
42 /* Parse any options */ 44 mode = 0777;
43 while (argc > 0 && **argv == '-') { 45 if (!parse_mode (optarg, &mode))
44 while (i == FALSE && *++(*argv)) { 46 error_msg_and_die ("invalid mode `%s'", optarg);
45 switch (**argv) { 47 break;
46 case 'm': 48 case 'p':
47 if (--argc == 0) 49 flags |= FILEUTILS_RECUR;
48 show_usage(); 50 break;
49 /* Find the specified modes */ 51 default:
50 mode = 0; 52 show_usage ();
51 if (parse_mode(*(++argv), &mode) == FALSE) {
52 error_msg_and_die("Unknown mode: %s", *argv);
53 }
54 /* Set the umask for this process so it doesn't
55 * screw up whatever the user just entered. */
56 umask(0);
57 i = TRUE;
58 break;
59 case 'p':
60 parentFlag = TRUE;
61 break;
62 default:
63 show_usage();
64 }
65 } 53 }
66 argc--;
67 argv++;
68 } 54 }
69 55
70 if (argc < 1) { 56 if (optind == argc)
71 show_usage(); 57 show_usage ();
72 }
73 58
74 while (argc > 0) { 59 for (i = optind; i < argc; i++)
75 int status; 60 if (make_directory (argv[i], mode, flags) < 0)
76 struct stat statBuf; 61 status = 1;
77 char buf[BUFSIZ + 1];
78 62
79 if (strlen(*argv) > BUFSIZ - 1) { 63 return status;
80 error_msg_and_die(name_too_long);
81 }
82 strcpy(buf, *argv);
83 status = stat(buf, &statBuf);
84 if (parentFlag == FALSE && status != -1 && errno != ENOENT) {
85 error_msg_and_die("%s: File exists", buf);
86 }
87 if (parentFlag == TRUE) {
88 strcat(buf, "/");
89 create_path(buf, mode);
90 } else {
91 if (mkdir(buf, mode) != 0 && parentFlag == FALSE) {
92 perror_msg_and_die(buf);
93 }
94 }
95 argc--;
96 argv++;
97 }
98 return EXIT_SUCCESS;
99} 64}