Commit | Line | Data |
---|---|---|
9c79dca0 BJ |
1 | /* |
2 | ** make directory | |
3 | */ | |
4 | ||
5 | #include <signal.h> | |
6 | #include <stdio.h> | |
7 | ||
8 | int Errors = 0; | |
9 | char *strcat(); | |
10 | char *strcpy(); | |
11 | ||
12 | main(argc, argv) | |
13 | char *argv[]; | |
14 | { | |
15 | ||
16 | signal(SIGHUP, SIG_IGN); | |
17 | signal(SIGINT, SIG_IGN); | |
18 | signal(SIGQUIT, SIG_IGN); | |
19 | signal(SIGPIPE, SIG_IGN); | |
20 | signal(SIGTERM, SIG_IGN); | |
21 | ||
22 | if(argc < 2) { | |
23 | fprintf(stderr, "mkdir: arg count\n"); | |
24 | exit(1); | |
25 | } | |
26 | while(--argc) | |
27 | mkdir(*++argv); | |
28 | exit(Errors!=0); | |
29 | } | |
30 | ||
31 | mkdir(d) | |
32 | char *d; | |
33 | { | |
34 | char pname[128], dname[128]; | |
35 | register i, slash = 0; | |
36 | ||
37 | pname[0] = '\0'; | |
38 | for(i = 0; d[i]; ++i) | |
39 | if(d[i] == '/') | |
40 | slash = i + 1; | |
41 | if(slash) | |
42 | strncpy(pname, d, slash); | |
43 | strcpy(pname+slash, "."); | |
44 | if (access(pname, 02)) { | |
45 | fprintf(stderr,"mkdir: cannot access %s\n", pname); | |
46 | ++Errors; | |
47 | return; | |
48 | } | |
49 | if ((mknod(d, 040777, 0)) < 0) { | |
50 | fprintf(stderr,"mkdir: cannot make directory %s\n", d); | |
51 | ++Errors; | |
52 | return; | |
53 | } | |
54 | chown(d, getuid(), getgid()); | |
55 | strcpy(dname, d); | |
56 | strcat(dname, "/."); | |
57 | if((link(d, dname)) < 0) { | |
58 | fprintf(stderr, "mkdir: cannot link %s\n", dname); | |
59 | unlink(d); | |
60 | ++Errors; | |
61 | return; | |
62 | } | |
63 | strcat(dname, "."); | |
64 | if((link(pname, dname)) < 0) { | |
65 | fprintf(stderr, "mkdir: cannot link %s\n",dname); | |
66 | dname[strlen(dname)] = '\0'; | |
67 | unlink(dname); | |
68 | unlink(d); | |
69 | ++Errors; | |
70 | } | |
71 | } |