From 72ee09458401ffb2356feae251cd2c68fd072d89 Mon Sep 17 00:00:00 2001 From: Felix Palmen Date: Fri, 26 Jul 2024 11:24:27 +0200 Subject: [PATCH] ConfigFile: Attempt to create path on write --- src/bin/xmoji/configfile.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/bin/xmoji/configfile.c b/src/bin/xmoji/configfile.c index 0b8208c..e174e61 100644 --- a/src/bin/xmoji/configfile.c +++ b/src/bin/xmoji/configfile.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #define TMPSUFX ".tmp" @@ -190,6 +191,25 @@ PSC_Event *ConfigFile_changed(ConfigFile *self) return self->changed; } +static int ensurepath(char *current) +{ + int rc = 0; + char *sep = strrchr(current, '/'); + if (!sep || sep == current) return rc; + *sep = 0; + struct stat st; + if (stat(current, &st) < 0) + { + rc = ensurepath(current); + } + else if (S_ISDIR(st.st_mode)) goto done; + else rc = -1; + if (rc == 0) rc = mkdir(current, 0777); +done: + *sep = '/'; + return rc; +} + int ConfigFile_write(ConfigFile *self) { int rc = -1; @@ -197,6 +217,7 @@ int ConfigFile_write(ConfigFile *self) char *tmpnm = PSC_malloc(nmlen + sizeof TMPSUFX); memcpy(tmpnm, self->path, nmlen); memcpy(tmpnm+nmlen, TMPSUFX, sizeof TMPSUFX); + if (ensurepath(tmpnm) < 0) goto done; FILE *f = fopen(tmpnm, "w"); if (!f) goto done; for (size_t i = 0; i < self->nkeys; ++i)