|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)mkdir.c 5.7 (Berkeley) 5/31/90";
28: #endif /* not lint */
29:
30: #include <sys/types.h>
31: #include <sys/stat.h>
32: #include <errno.h>
33: #include <stdio.h>
34: #include <string.h>
35:
36: extern int errno;
37:
38: main(argc, argv)
39: int argc;
40: char **argv;
41: {
42: extern int optind;
43: int ch, exitval, pflag;
44:
45: pflag = 0;
46: while ((ch = getopt(argc, argv, "p")) != EOF)
47: switch(ch) {
48: case 'p':
49: pflag = 1;
50: break;
51: case '?':
52: default:
53: usage();
54: }
55:
56: if (!*(argv += optind))
57: usage();
58:
59: for (exitval = 0; *argv; ++argv)
60: if (pflag)
61: exitval |= build(*argv);
62: else if (mkdir(*argv, 0777) < 0) {
63: (void)fprintf(stderr, "mkdir: %s: %s\n",
64: *argv, strerror(errno));
65: exitval = 1;
66: }
67: exit(exitval);
68: }
69:
70: build(path)
71: char *path;
72: {
73: register char *p;
74: struct stat sb;
75: int create, ch;
76:
77: for (create = 0, p = path;; ++p)
78: if (!*p || *p == '/') {
79: ch = *p;
80: *p = '\0';
81: if (stat(path, &sb)) {
82: if (errno != ENOENT || mkdir(path, 0777) < 0) {
83: (void)fprintf(stderr, "mkdir: %s: %s\n",
84: path, strerror(errno));
85: return(1);
86: }
87: create = 1;
88: }
89: if (!(*p = ch))
90: break;
91: }
92: if (!create) {
93: (void)fprintf(stderr, "mkdir: %s: %s\n", path,
94: strerror(EEXIST));
95: return(1);
96: }
97: return(0);
98: }
99:
100: usage()
101: {
102: (void)fprintf(stderr, "usage: mkdir [-p] dirname ...\n");
103: exit(1);
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.