Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8dc9777b authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Lose mkdir to toybox."

parents 8641daee de4fd83e
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -127,7 +127,6 @@ OUR_TOOLS := \
    log \
    ls \
    lsof \
    mkdir \
    mount \
    nandread \
    netstat \

toolbox/mkdir.c

deleted100644 → 0
+0 −77
Original line number Diff line number Diff line
#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;
}