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