Blame


1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull
4 aeb54c0e 2004-04-15 devnull char *e;
5 24c8d849 2004-04-21 devnull ulong mode = 0777L;
6 aeb54c0e 2004-04-15 devnull
7 bc7cb1a1 2003-11-23 devnull void
8 aeb54c0e 2004-04-15 devnull usage(void)
9 aeb54c0e 2004-04-15 devnull {
10 24c8d849 2004-04-21 devnull fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");
11 aeb54c0e 2004-04-15 devnull exits("usage");
12 aeb54c0e 2004-04-15 devnull }
13 aeb54c0e 2004-04-15 devnull
14 aeb54c0e 2004-04-15 devnull int
15 aeb54c0e 2004-04-15 devnull makedir(char *s)
16 aeb54c0e 2004-04-15 devnull {
17 aeb54c0e 2004-04-15 devnull int f;
18 aeb54c0e 2004-04-15 devnull
19 aeb54c0e 2004-04-15 devnull if(access(s, AEXIST) == 0){
20 aeb54c0e 2004-04-15 devnull fprint(2, "mkdir: %s already exists\n", s);
21 aeb54c0e 2004-04-15 devnull e = "error";
22 aeb54c0e 2004-04-15 devnull return -1;
23 aeb54c0e 2004-04-15 devnull }
24 24c8d849 2004-04-21 devnull f = create(s, OREAD, DMDIR | mode);
25 aeb54c0e 2004-04-15 devnull if(f < 0){
26 aeb54c0e 2004-04-15 devnull fprint(2, "mkdir: can't create %s: %r\n", s);
27 aeb54c0e 2004-04-15 devnull e = "error";
28 aeb54c0e 2004-04-15 devnull return -1;
29 aeb54c0e 2004-04-15 devnull }
30 aeb54c0e 2004-04-15 devnull close(f);
31 aeb54c0e 2004-04-15 devnull return 0;
32 aeb54c0e 2004-04-15 devnull }
33 aeb54c0e 2004-04-15 devnull
34 aeb54c0e 2004-04-15 devnull void
35 aeb54c0e 2004-04-15 devnull mkdirp(char *s)
36 aeb54c0e 2004-04-15 devnull {
37 aeb54c0e 2004-04-15 devnull char *p;
38 aeb54c0e 2004-04-15 devnull
39 aeb54c0e 2004-04-15 devnull for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
40 aeb54c0e 2004-04-15 devnull *p = 0;
41 aeb54c0e 2004-04-15 devnull if(access(s, AEXIST) != 0 && makedir(s) < 0)
42 aeb54c0e 2004-04-15 devnull return;
43 aeb54c0e 2004-04-15 devnull *p = '/';
44 aeb54c0e 2004-04-15 devnull }
45 aeb54c0e 2004-04-15 devnull if(access(s, AEXIST) != 0)
46 aeb54c0e 2004-04-15 devnull makedir(s);
47 aeb54c0e 2004-04-15 devnull }
48 aeb54c0e 2004-04-15 devnull
49 aeb54c0e 2004-04-15 devnull
50 aeb54c0e 2004-04-15 devnull void
51 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
52 bc7cb1a1 2003-11-23 devnull {
53 aeb54c0e 2004-04-15 devnull int i, pflag;
54 24c8d849 2004-04-21 devnull char *m;
55 bc7cb1a1 2003-11-23 devnull
56 aeb54c0e 2004-04-15 devnull pflag = 0;
57 aeb54c0e 2004-04-15 devnull ARGBEGIN{
58 aeb54c0e 2004-04-15 devnull default:
59 aeb54c0e 2004-04-15 devnull usage();
60 24c8d849 2004-04-21 devnull case 'm':
61 24c8d849 2004-04-21 devnull m = ARGF();
62 24c8d849 2004-04-21 devnull if(m == nil)
63 24c8d849 2004-04-21 devnull usage();
64 24c8d849 2004-04-21 devnull mode = strtoul(m, &m, 8);
65 24c8d849 2004-04-21 devnull if(mode > 0777)
66 24c8d849 2004-04-21 devnull usage();
67 24c8d849 2004-04-21 devnull break;
68 aeb54c0e 2004-04-15 devnull case 'p':
69 aeb54c0e 2004-04-15 devnull pflag = 1;
70 aeb54c0e 2004-04-15 devnull break;
71 aeb54c0e 2004-04-15 devnull }ARGEND
72 aeb54c0e 2004-04-15 devnull
73 aeb54c0e 2004-04-15 devnull for(i=0; i<argc; i++){
74 aeb54c0e 2004-04-15 devnull if(pflag)
75 aeb54c0e 2004-04-15 devnull mkdirp(argv[i]);
76 aeb54c0e 2004-04-15 devnull else
77 aeb54c0e 2004-04-15 devnull makedir(argv[i]);
78 bc7cb1a1 2003-11-23 devnull }
79 bc7cb1a1 2003-11-23 devnull exits(e);
80 bc7cb1a1 2003-11-23 devnull }