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