]>
Commit | Line | Data |
---|---|---|
44a7a5ab A |
1 | /* |
2 | * Copyright (c) 1983, 1992, 1993 | |
3 | * The Regents of the University of California. All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * 3. All advertising materials mentioning features or use of this software | |
14 | * must display the following acknowledgement: | |
15 | * This product includes software developed by the University of | |
16 | * California, Berkeley and its contributors. | |
17 | * 4. Neither the name of the University nor the names of its contributors | |
18 | * may be used to endorse or promote products derived from this software | |
19 | * without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
31 | * SUCH DAMAGE. | |
32 | */ | |
33 | ||
00337e45 | 34 | #include <sys/cdefs.h> |
44a7a5ab | 35 | #ifndef lint |
00337e45 | 36 | __used static char const copyright[] = |
6c780a1f A |
37 | "@(#) Copyright (c) 1983, 1992, 1993\n\ |
38 | The Regents of the University of California. All rights reserved.\n"; | |
44a7a5ab A |
39 | #endif /* not lint */ |
40 | ||
41 | #ifndef lint | |
42 | #if 0 | |
43 | static char sccsid[] = "@(#)mkdir.c 8.2 (Berkeley) 1/25/94"; | |
44a7a5ab A |
44 | #endif |
45 | #endif /* not lint */ | |
6c780a1f A |
46 | #include <sys/cdefs.h> |
47 | __RCSID("$FreeBSD: src/bin/mkdir/mkdir.c,v 1.26 2002/06/30 05:13:54 obrien Exp $"); | |
44a7a5ab A |
48 | |
49 | #include <sys/types.h> | |
50 | #include <sys/stat.h> | |
51 | ||
52 | #include <err.h> | |
53 | #include <errno.h> | |
6c780a1f | 54 | #include <libgen.h> |
44a7a5ab A |
55 | #include <stdio.h> |
56 | #include <stdlib.h> | |
57 | #include <string.h> | |
6c780a1f | 58 | #include <sysexits.h> |
44a7a5ab A |
59 | #include <unistd.h> |
60 | ||
6c780a1f A |
61 | static void usage(void); |
62 | ||
63 | int vflag; | |
44a7a5ab A |
64 | |
65 | int | |
6c780a1f | 66 | main(int argc, char *argv[]) |
44a7a5ab | 67 | { |
6c780a1f A |
68 | int ch, exitval, success, pflag; |
69 | mode_t omode, *set = (mode_t *)NULL; | |
70 | char *mode; | |
44a7a5ab | 71 | |
4d0bb651 | 72 | pflag = 0; |
6c780a1f A |
73 | mode = NULL; |
74 | while ((ch = getopt(argc, argv, "m:pv")) != -1) | |
44a7a5ab | 75 | switch(ch) { |
6c780a1f A |
76 | case 'm': |
77 | mode = optarg; | |
78 | break; | |
44a7a5ab A |
79 | case 'p': |
80 | pflag = 1; | |
81 | break; | |
6c780a1f A |
82 | case 'v': |
83 | vflag = 1; | |
44a7a5ab A |
84 | break; |
85 | case '?': | |
86 | default: | |
87 | usage(); | |
88 | } | |
6c780a1f | 89 | |
4d0bb651 | 90 | // argc -= optind; |
44a7a5ab | 91 | argv += optind; |
6c780a1f | 92 | if (argv[0] == NULL) |
44a7a5ab | 93 | usage(); |
44a7a5ab | 94 | |
6c780a1f A |
95 | if (mode == NULL) { |
96 | omode = S_IRWXU | S_IRWXG | S_IRWXO; | |
97 | } else { | |
98 | if ((set = setmode(mode)) == NULL) | |
99 | errx(1, "invalid file mode: %s", mode); | |
100 | omode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO); | |
101 | free(set); | |
102 | } | |
44a7a5ab | 103 | |
6c780a1f A |
104 | for (exitval = 0; *argv != NULL; ++argv) { |
105 | success = 1; | |
44a7a5ab | 106 | if (pflag) { |
4d0bb651 A |
107 | int status = mkpath_np(*argv, omode); |
108 | if (status && status != EEXIST) { | |
109 | warnc(status, "%s", *argv); | |
6c780a1f | 110 | success = 0; |
4d0bb651 | 111 | } |
6c780a1f A |
112 | } else if (mkdir(*argv, omode) < 0) { |
113 | if (errno == ENOTDIR || errno == ENOENT) | |
114 | warn("%s", dirname(*argv)); | |
115 | else | |
44a7a5ab | 116 | warn("%s", *argv); |
6c780a1f A |
117 | success = 0; |
118 | } else if (vflag) | |
864a4b6e | 119 | (void)printf("mkdir: created directory '%s'\n", *argv); |
6c780a1f A |
120 | |
121 | if (!success) | |
122 | exitval = 1; | |
123 | /* | |
124 | * The mkdir() and umask() calls both honor only the low | |
125 | * nine bits, so if you try to set a mode including the | |
126 | * sticky, setuid, setgid bits you lose them. Don't do | |
127 | * this unless the user has specifically requested a mode, | |
128 | * as chmod will (obviously) ignore the umask. | |
129 | */ | |
130 | if (success && mode != NULL && chmod(*argv, omode) == -1) { | |
131 | warn("%s", *argv); | |
132 | exitval = 1; | |
44a7a5ab A |
133 | } |
134 | } | |
135 | exit(exitval); | |
44a7a5ab A |
136 | } |
137 | ||
44a7a5ab | 138 | void |
6c780a1f | 139 | usage(void) |
44a7a5ab A |
140 | { |
141 | ||
6c780a1f A |
142 | (void)fprintf(stderr, "usage: mkdir [-pv] [-m mode] directory ...\n"); |
143 | exit (EX_USAGE); | |
44a7a5ab | 144 | } |