diff options
Diffstat (limited to 'mkdir.c')
-rw-r--r-- | mkdir.c | 97 |
1 files changed, 31 insertions, 66 deletions
@@ -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 | |||
31 | static int parentFlag = FALSE; | ||
32 | static mode_t mode = 0777; | ||
33 | 31 | ||
32 | #include "busybox.h" | ||
34 | 33 | ||
35 | extern int mkdir_main(int argc, char **argv) | 34 | extern 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 | } |