From 8e483c7bbdb8266e13b63dfc9ae5ad3cba341bbc Mon Sep 17 00:00:00 2001 From: Jonathan Dowland Date: Thu, 2 Apr 2026 21:29:46 +0100 Subject: [PATCH 1/2] let mkdir fail if the directory already exists --- src/libduc/duc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/libduc/duc.c b/src/libduc/duc.c index aa232a7..f27d8fb 100644 --- a/src/libduc/duc.c +++ b/src/libduc/duc.c @@ -56,6 +56,18 @@ void duc_set_log_callback(duc *duc, duc_log_callback cb) duc->log_callback = cb; } +int mkdir_p(const char *pathname, mode_t mode) +{ + int r = mkdir(pathname, mode); + if((-1) == r && errno == EEXIST) { + // if it's a directory, this is fine. + struct stat statbuf; + if((-1) != stat(pathname, &statbuf) && (statbuf.st_mode & S_IFMT) == S_IFDIR) + return 0; + } + return r; +} + // Return 0 ok, -1 for errors. int duc_open(duc *duc, const char *path_db, duc_open_flags flags) { @@ -96,7 +108,7 @@ int duc_open(duc *duc, const char *path_db, duc_open_flags flags) /* Append parent folder */ snprintf(tmp, sizeof tmp, "%s/duc", home); /* Create if needed */ - res = mkdir(tmp, 0700); + res = mkdir_p(tmp, 0700); if (res != 0) { duc_log(duc, DUC_LOG_FTL, "Error! Cannot create mkdir \"%s\", %s", tmp, strerror(errno)); exit(1); @@ -113,7 +125,7 @@ int duc_open(duc *duc, const char *path_db, duc_open_flags flags) /* Append parent folder */ snprintf(tmp, sizeof tmp, "%s/.cache/duc", home); /* Create if needed */ - res = mkdir(tmp, 0700); + res = mkdir_p(tmp, 0700); if (res != 0) { duc_log(duc, DUC_LOG_FTL, "Error! Cannot create mkdir \"%s\", %s", tmp, strerror(errno)); exit(1); From 9de60ca4b712299cf9bdc1a9e24afa6f039ea1da Mon Sep 17 00:00:00 2001 From: Jonathan Dowland Date: Tue, 21 Apr 2026 18:49:12 +0100 Subject: [PATCH 2/2] also create parent directory (XDG_CACHE_HOME or ~/.cache) if missing --- src/libduc/duc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libduc/duc.c b/src/libduc/duc.c index f27d8fb..0706dce 100644 --- a/src/libduc/duc.c +++ b/src/libduc/duc.c @@ -105,6 +105,12 @@ int duc_open(duc *duc, const char *path_db, duc_open_flags flags) if(path_db == NULL) { char *home = getenv("XDG_CACHE_HOME"); if(home) { + /* ensure parent folder exists */ + res = mkdir_p(home, 0700); + if (res != 0) { + duc_log(duc, DUC_LOG_FTL, "Error! Cannot create directory \"%s\", %s", home, strerror(errno)); + exit(1); + } /* Append parent folder */ snprintf(tmp, sizeof tmp, "%s/duc", home); /* Create if needed */ @@ -122,6 +128,12 @@ int duc_open(duc *duc, const char *path_db, duc_open_flags flags) if(path_db == NULL) { char *home = getenv("HOME"); if(home) { + /* ensure parent folder exists */ + res = mkdir_p(home, 0700); + if (res != 0) { + duc_log(duc, DUC_LOG_FTL, "Error! Cannot create directory \"%s\", %s", home, strerror(errno)); + exit(1); + } /* Append parent folder */ snprintf(tmp, sizeof tmp, "%s/.cache/duc", home); /* Create if needed */