From c40f79737a4ce6ae0cd8bd6ea7f302217333e486 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sat, 22 Aug 2020 19:43:03 +0200 Subject: Added Makefile --- src/mkdir.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/mkdir.c (limited to 'src/mkdir.c') diff --git a/src/mkdir.c b/src/mkdir.c new file mode 100644 index 0000000..3ab73d1 --- /dev/null +++ b/src/mkdir.c @@ -0,0 +1,86 @@ +#define _POSIX_C_SOURCE 2 + +#include +#include +#include +#include +#include +#include +#include +#include + +char *g_name = "mkdir"; + +int mkdir_wrapper(const char *path, mode_t mode, bool verbose) +{ + int ret; + + if ((ret = mkdir(path, mode)) == -1 && (verbose || errno != EEXIST)) + fprintf(stderr, "%s: cannot create directory '%s': %s\n", g_name, path, strerror(errno)); + else if (verbose) + printf("%s: created directory '%s'\n", g_name, path); + return ret; +} + +int main(int argc, char **argv) +{ + int option; + mode_t mode = 0755; + bool parent = false; + bool verbose = false; + + g_name = argv[0]; + if (argc == 1) + { + fprintf(stderr, "%s: missing operand\n", g_name); + return EXIT_FAILURE; + } + while ((option = getopt(argc, argv, "m:pv")) != -1) + { + switch (option) + { + case 'm': + sscanf(optarg, "%o", &mode); // TODO mode not working + break; + case 'p': + parent = true; + break; + case 'v': + verbose = true; + break; + } + } + for (; optind < argc; optind++) + { + // remove duplicate slash + for (size_t i = 0; argv[optind][i] != '\0'; i++) + { + if (argv[optind][i] == '/' && argv[optind][i + 1] == '/') + { + memmove(&argv[optind][i], &argv[optind][i + 1], strlen(&argv[optind][i + 1]) + 1); + i--; + } + } + + if (parent) + { + char *tmp; + char *searched = argv[optind]; + + if (*searched == '/') + searched++; + for (; (tmp = strchr(searched, '/')) != NULL; searched = tmp + 1) + { + if (tmp[1] == '\0') + continue; + *tmp = '\0'; + mkdir_wrapper(argv[optind], mode, verbose); + *tmp = '/'; + } + mkdir_wrapper(argv[optind], mode, verbose); + } + else + mkdir_wrapper(argv[optind], mode, verbose); + } + return EXIT_SUCCESS; +} -- cgit