tRecursively create subdirectories - safe - password protected secret keeper
(HTM) git clone git://git.z3bra.org/safe.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 47a560952b5e4cee67d3b7769659767a217654a3
(DIR) parent 0fe1bf13e623f52610fe2307b26c8fada91c750d
(HTM) Author: z3bra <contactatz3bradotorg>
Date: Thu, 23 May 2019 12:10:14 +0200
Recursively create subdirectories
Diffstat:
M safe.c | 37 +++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/safe.c b/safe.c
t@@ -50,6 +50,42 @@ bin2str(uint8_t *d, char *s, size_t size)
sprintf(s, "%02x", d[i]);
}
+char *
+dirname(char *path)
+{
+ static char tmp[PATH_MAX];
+ char *p = NULL;
+ size_t len;
+ snprintf(tmp, sizeof(tmp), "%s", path);
+ len = strlen(tmp);
+ for(p = tmp + len; p > tmp; p--)
+ if(*p == '/')
+ break;
+
+ *p = 0;
+ return tmp;
+}
+
+int
+mkdir_p(char *path, mode_t mode)
+{
+ char tmp[PATH_MAX] = "";
+ char *p = NULL;
+ size_t len;
+
+ snprintf(tmp, sizeof(tmp), "%s", path);
+ len = strlen(tmp);
+ if(len && tmp[len - 1] == '/')
+ tmp[len - 1] = 0;
+ for(p = tmp + 1; *p; p++)
+ if(*p == '/') {
+ *p = 0;
+ mkdir(tmp, mode);
+ *p = '/';
+ }
+ return mkdir(tmp, mode);
+}
+
ssize_t
xread(int fd, void *buf, size_t nbytes)
{
t@@ -186,6 +222,7 @@ store_secret(int fd, char *name)
uint8_t key[crypto_secretstream_xchacha20poly1305_KEYBYTES];
uint8_t salt[crypto_pwhash_SALTBYTES];
+ mkdir_p(dirname(name), 0700);
sfd = open(name, O_WRONLY | O_CREAT, 0600);
if (sfd < 0)
err(1, "open %s", name);