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 symbolic = 0; 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 20b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(argc < 2 || strcmp(argv[1], "--help") == 0) { 21b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam return usage(); 22b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 23b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam 24b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam int recursive = (strcmp(argv[1], "-p") == 0 || 25b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam strcmp(argv[1], "--parents") == 0) ? 1 : 0; 26b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam 27b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(recursive && argc < 3) { 28b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam // -p specified without a path 29b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam return usage(); 30b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 31b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam 32b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(recursive) { 33b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam argc--; 34b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam argv++; 35b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 36b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam 37b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam char currpath[PATH_MAX], *pathpiece; 38b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam struct stat st; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 1) { 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 43b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(recursive) { 44b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam // reset path 45b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam strcpy(currpath, ""); 46b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam // create the pieces of the path along the way 47b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam pathpiece = strtok(argv[0], "/"); 48b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(argv[0][0] == '/') { 49b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam // prepend / if needed 50b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam strcat(currpath, "/"); 51b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 52b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam while(pathpiece != NULL) { 53b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(strlen(currpath) + strlen(pathpiece) + 2/*NUL and slash*/ > PATH_MAX) { 54b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam fprintf(stderr, "Invalid path specified: too long\n"); 55b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam return 1; 56b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 57b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam strcat(currpath, pathpiece); 58b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam strcat(currpath, "/"); 59b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(stat(currpath, &st) != 0) { 60b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam ret = mkdir(currpath, 0777); 61b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(ret < 0) { 62b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam fprintf(stderr, "mkdir failed for %s, %s\n", currpath, strerror(errno)); 63b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam return ret; 64b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 65b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 66b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam pathpiece = strtok(NULL, "/"); 67b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 68b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } else { 69b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam ret = mkdir(argv[0], 0777); 70b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam if(ret < 0) { 71b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam fprintf(stderr, "mkdir failed for %s, %s\n", argv[0], strerror(errno)); 72b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam return ret; 73b55de6798507178dc7a50570108b435afa9a8346Anthony Newnam } 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 79