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