BSD 3 development
[unix-history] / usr / src / cmd / mkdir.c
CommitLineData
9c79dca0
BJ
1/*
2** make directory
3*/
4
5#include <signal.h>
6#include <stdio.h>
7
8int Errors = 0;
9char *strcat();
10char *strcpy();
11
12main(argc, argv)
13char *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
31mkdir(d)
32char *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}