| #include <stdio.h> | 
 | #include <unistd.h> | 
 | #include <string.h> | 
 | #include <errno.h> | 
 | #include <sys/limits.h> | 
 | #include <sys/stat.h> | 
 |  | 
 | static int usage() | 
 | { | 
 |     fprintf(stderr,"mkdir [OPTION] <target>\n"); | 
 |     fprintf(stderr,"    --help           display usage and exit\n"); | 
 |     fprintf(stderr,"    -p, --parents    create parent directories as needed\n"); | 
 |     return -1; | 
 | } | 
 |  | 
 | int mkdir_main(int argc, char *argv[]) | 
 | { | 
 |     int ret; | 
 |     if(argc < 2 || strcmp(argv[1], "--help") == 0) { | 
 |         return usage(); | 
 |     } | 
 |  | 
 |     int recursive = (strcmp(argv[1], "-p") == 0 || | 
 |                      strcmp(argv[1], "--parents") == 0) ? 1 : 0; | 
 |  | 
 |     if(recursive && argc < 3) { | 
 |         // -p specified without a path | 
 |         return usage(); | 
 |     } | 
 |  | 
 |     if(recursive) { | 
 |         argc--; | 
 |         argv++; | 
 |     } | 
 |  | 
 |     char currpath[PATH_MAX], *pathpiece; | 
 |     struct stat st; | 
 |  | 
 |     while(argc > 1) { | 
 |         argc--; | 
 |         argv++; | 
 |         if(recursive) { | 
 |             // reset path | 
 |             strcpy(currpath, ""); | 
 |             // create the pieces of the path along the way | 
 |             pathpiece = strtok(argv[0], "/"); | 
 |             if(argv[0][0] == '/') { | 
 |                 // prepend / if needed | 
 |                 strcat(currpath, "/"); | 
 |             } | 
 |             while(pathpiece != NULL) { | 
 |                 if(strlen(currpath) + strlen(pathpiece) + 2/*NUL and slash*/ > PATH_MAX) { | 
 |                     fprintf(stderr, "Invalid path specified: too long\n"); | 
 |                     return 1; | 
 |                 } | 
 |                 strcat(currpath, pathpiece); | 
 |                 strcat(currpath, "/"); | 
 |                 if(stat(currpath, &st) != 0) { | 
 |                     ret = mkdir(currpath, 0777); | 
 |                     if(ret < 0) { | 
 |                         fprintf(stderr, "mkdir failed for %s, %s\n", currpath, strerror(errno)); | 
 |                         return ret; | 
 |                     } | 
 |                 } | 
 |                 pathpiece = strtok(NULL, "/"); | 
 |             } | 
 |         } else { | 
 |             ret = mkdir(argv[0], 0777); | 
 |             if(ret < 0) { | 
 |                 fprintf(stderr, "mkdir failed for %s, %s\n", argv[0], strerror(errno)); | 
 |                 return ret; | 
 |             } | 
 |         } | 
 |     } | 
 |      | 
 |     return 0; | 
 | } |