summaryrefslogtreecommitdiff
path: root/src/mkdirp.c
diff options
context:
space:
mode:
authorPhil Jones <philj56@gmail.com>2022-06-11 10:14:53 +0100
committerPhil Jones <philj56@gmail.com>2022-06-11 10:14:53 +0100
commitc0cd4cdf78886040528b16fad084a14165a16384 (patch)
tree82788f09527c91060cea22246f1af9a2572ce655 /src/mkdirp.c
parent7c31982244f179cb2f51bb1d81b21ad4efd649ba (diff)
Add compgen caching.
A list of commands is now stored in $XDG_CACHE_HOME/.cache/tofi-compgen, and regenerated as necessary.
Diffstat (limited to 'src/mkdirp.c')
-rw-r--r--src/mkdirp.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/mkdirp.c b/src/mkdirp.c
new file mode 100644
index 0000000..14bfb2c
--- /dev/null
+++ b/src/mkdirp.c
@@ -0,0 +1,38 @@
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include "log.h"
+#include "mkdirp.h"
+#include "xmalloc.h"
+
+bool mkdirp(const char *path)
+{
+ struct stat statbuf;
+ if (stat(path, &statbuf) == 0) {
+ /* If the file exists, we don't need to do anything. */
+ return true;
+ }
+
+ /*
+ * Walk down the path, creating directories as we go.
+ * This works by repeatedly finding the next / in path, then calling
+ * mkdir() on the string up to that point.
+ */
+ char *tmp = xstrdup(path);
+ char *cursor = tmp;
+ while ((cursor = strchr(cursor + 1, '/')) != NULL) {
+ *cursor = '\0';
+ log_debug("Creating directory %s\n", tmp);
+ if (mkdir(tmp, 0700) != 0 && errno != EEXIST) {
+ log_error(
+ "Error creating file path: %s.\n",
+ strerror(errno));
+ free(tmp);
+ return false;
+ }
+ *cursor = '/';
+ }
+ free(tmp);
+ return true;
+}