mkdir.c revision b55de6798507178dc7a50570108b435afa9a8346
1#include <stdio.h> 2#include <unistd.h> 3#include <string.h> 4#include <errno.h> 5#include <sys/limits.h> 6#include <sys/stat.h> 7 8static int usage() 9{ 10 fprintf(stderr,"mkdir [OPTION] <target>\n"); 11 fprintf(stderr," --help display usage and exit\n"); 12 fprintf(stderr," -p, --parents create parent directories as needed\n"); 13 return -1; 14} 15 16int mkdir_main(int argc, char *argv[]) 17{ 18 int symbolic = 0; 19 int ret; 20 if(argc < 2 || strcmp(argv[1], "--help") == 0) { 21 return usage(); 22 } 23 24 int recursive = (strcmp(argv[1], "-p") == 0 || 25 strcmp(argv[1], "--parents") == 0) ? 1 : 0; 26 27 if(recursive && argc < 3) { 28 // -p specified without a path 29 return usage(); 30 } 31 32 if(recursive) { 33 argc--; 34 argv++; 35 } 36 37 char currpath[PATH_MAX], *pathpiece; 38 struct stat st; 39 40 while(argc > 1) { 41 argc--; 42 argv++; 43 if(recursive) { 44 // reset path 45 strcpy(currpath, ""); 46 // create the pieces of the path along the way 47 pathpiece = strtok(argv[0], "/"); 48 if(argv[0][0] == '/') { 49 // prepend / if needed 50 strcat(currpath, "/"); 51 } 52 while(pathpiece != NULL) { 53 if(strlen(currpath) + strlen(pathpiece) + 2/*NUL and slash*/ > PATH_MAX) { 54 fprintf(stderr, "Invalid path specified: too long\n"); 55 return 1; 56 } 57 strcat(currpath, pathpiece); 58 strcat(currpath, "/"); 59 if(stat(currpath, &st) != 0) { 60 ret = mkdir(currpath, 0777); 61 if(ret < 0) { 62 fprintf(stderr, "mkdir failed for %s, %s\n", currpath, strerror(errno)); 63 return ret; 64 } 65 } 66 pathpiece = strtok(NULL, "/"); 67 } 68 } else { 69 ret = mkdir(argv[0], 0777); 70 if(ret < 0) { 71 fprintf(stderr, "mkdir failed for %s, %s\n", argv[0], strerror(errno)); 72 return ret; 73 } 74 } 75 } 76 77 return 0; 78} 79