Viewing: mkdir.c
📄 mkdir.c (Read Only) ⬅ To go back
/* AdrOS mkdir utility */
#include <stdio.h>
#include <string.h>
#include <unistd.h>

static int pflag = 0;   /* -p: create parent directories */

static int mkdir_p(const char* path) {
    char tmp[256];
    size_t len = strlen(path);
    if (len >= sizeof(tmp)) return -1;
    strcpy(tmp, path);

    for (char* p = tmp + 1; *p; p++) {
        if (*p == '/') {
            *p = '\0';
            mkdir(tmp);   /* ignore errors — parent may already exist */
            *p = '/';
        }
    }
    return mkdir(tmp);
}

int main(int argc, char** argv) {
    if (argc <= 1) {
        fprintf(stderr, "mkdir: missing operand\n");
        return 1;
    }

    int rc = 0;
    int start = 1;

    for (int i = 1; i < argc; i++) {
        if (argv[i][0] == '-' && argv[i][1]) {
            const char* f = argv[i] + 1;
            while (*f) {
                if (*f == 'p') pflag = 1;
                else {
                    fprintf(stderr, "mkdir: invalid option -- '%c'\n", *f);
                    return 1;
                }
                f++;
            }
            start = i + 1;
        }
    }

    for (int i = start; i < argc; i++) {
        int r;
        if (pflag) {
            r = mkdir_p(argv[i]);
        } else {
            r = mkdir(argv[i]);
        }
        if (r < 0) {
            fprintf(stderr, "mkdir: cannot create directory '%s'\n", argv[i]);
            rc = 1;
        }
    }
    return rc;
}