diff options
author | Phil Jones <philj56@gmail.com> | 2022-06-11 10:14:53 +0100 |
---|---|---|
committer | Phil Jones <philj56@gmail.com> | 2022-06-11 10:14:53 +0100 |
commit | c0cd4cdf78886040528b16fad084a14165a16384 (patch) | |
tree | 82788f09527c91060cea22246f1af9a2572ce655 /src/mkdirp.c | |
parent | 7c31982244f179cb2f51bb1d81b21ad4efd649ba (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.c | 38 |
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; +} |