From eb79c6c47c1ce1effff9fe7985f29daa30beb481 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 5 May 2025 19:16:29 +0300 Subject: [PATCH] mkdir: Add -p option --- userspace/programs/mkdir/main.cpp | 50 +++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/userspace/programs/mkdir/main.cpp b/userspace/programs/mkdir/main.cpp index 07afcd8c..528761c5 100644 --- a/userspace/programs/mkdir/main.cpp +++ b/userspace/programs/mkdir/main.cpp @@ -1,23 +1,55 @@ +#include +#include #include +#include #include -int main(int argc, char** argv) +int create_directory(const char* path, bool create_parents) { - if (argc <= 1) + const size_t pathlen = strlen(path); + if (pathlen == 0 || pathlen >= PATH_MAX) { - fprintf(stderr, "Missing operand\n"); + fprintf(stderr, "mkdir: %s\n", strerror(ENOENT)); return 1; } - int ret = 0; - for (int i = 1; i < argc; i++) + if (!create_parents) { - if (mkdir(argv[i], 0755) == -1) - { + const int ret = mkdir(path, 0755); + if (ret == -1) perror("mkdir"); - ret = 1; - } + return -ret; + } + + int ret = 0; + char buffer[PATH_MAX]; + for (size_t i = 0; path[i];) + { + for (; path[i] && path[i] != '/'; i++) + buffer[i] = path[i]; + for (; path[i] && path[i] == '/'; i++) + buffer[i] = path[i]; + buffer[i] = '\0'; + ret = mkdir(buffer, 0755); } return ret; } + +int main(int argc, char** argv) +{ + const bool create_parents = argc >= 2 && strcmp(argv[1], "-p") == 0; + + if (argc <= 1 + create_parents) + { + fprintf(stderr, "missing operand\n"); + return 1; + } + + int ret = 0; + for (int i = 1 + create_parents; i < argc; i++) + if (create_directory(argv[i], create_parents) == -1) + ret = 1; + + return ret; +}