summaryrefslogtreecommitdiff
path: root/command/mkdir.c
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-05-06 00:39:44 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-05-06 00:39:44 -0400
commitd8f2c10b7108fff6b7e437291093a1cadc15ab9f (patch)
tree3fc50a19d6fbb9c94a8fe147cd2a6c4ba7f59b8d /command/mkdir.c
parentansii c (diff)
downloadlazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.tar.gz
lazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.tar.bz2
lazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.zip
refactor
Diffstat (limited to 'command/mkdir.c')
-rw-r--r--command/mkdir.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/command/mkdir.c b/command/mkdir.c
new file mode 100644
index 0000000..0d3950d
--- /dev/null
+++ b/command/mkdir.c
@@ -0,0 +1,70 @@
+#include "command.h"
+#include "lslib.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+static struct {
+ bool make_parent;
+ mode_t mode;
+} flags;
+
+static int short_arg(char c, char* next) {
+ switch (c) {
+ case 'p':
+ flags.make_parent = true;
+ break;
+ case 'm':
+ check_arg(next);
+ flags.mode = get_mode(next);
+ return ARG_USED;
+ default:
+ return ARG_INVALID;
+ }
+ return ARG_UNUSED;
+}
+
+static void help(void) {
+ printf("Usage: mkdir [-m MODE] [-p] DIRECTORY...\n\n");
+ printf("Create DIRECTORY\n\n");
+ printf("\t-m\tMODE\n");
+ printf("\t-p\tNo error if exists; make parent directories as needed\n");
+}
+
+static bool mkdir_parents(char* path) {
+ size_t i;
+ for (i = 1; i < strlen(path); i++) {
+ if (path[i] != '/') continue;
+ path[i] = '\0';
+ if (mkdir(path, flags.mode) < 0 && errno != EEXIST) {
+ error_s("failed to create directory '%s': %s", path, strerror(errno));
+ return false;
+ };
+ path[i] = '/';
+ }
+ return true;
+}
+
+COMMAND(makedir) {
+
+ int start, i;
+
+ if (argc < 1) global_help(help);
+
+ flags.make_parent = false;
+ flags.mode = 0755;
+
+ start = parse_args(argc, argv, help, short_arg, NULL);
+
+ for (i = start; i < argc; i++) {
+ if (flags.make_parent && !mkdir_parents(argv[i])) {
+ continue;
+ }
+ if (mkdir(argv[i], flags.mode) < 0) {
+ error_s("failed to create directory '%s': %s", argv[i], strerror(errno));
+ }
+ }
+
+ return EXIT_SUCCESS;
+}