commit 8bb679ea06e38d34f8db08db7ed2e840a64cc16d
Author: Oswald Buddenhagen <[email protected]>
Date: Thu May 5 19:00:24 2022 +0200
create sync state parent directories recursively
this may matter with SyncState being for example ~/.local/state/isync/.
src/common.h | 2 ++
src/drv_maildir.c | 17 +----------------
src/sync_state.c | 2 +-
src/util.c | 16 ++++++++++++++++
4 files changed, 20 insertions(+), 17 deletions(-)
diff --git a/src/common.h b/src/common.h
index b5f3c742..8f0ded56 100644
--- a/src/common.h
+++ b/src/common.h
@@ -186,6 +186,8 @@ void ATTR_NORETURN oom( void );
int map_name( const char *arg, char **result, uint reserve, const char *in,
const char *out );
+int mkdir_p( char *path, int len );
+
#define DEFINE_ARRAY_TYPE(T) \
typedef struct { \
T *data; \
diff --git a/src/drv_maildir.c b/src/drv_maildir.c
index c4dea266..6c1daa4e 100644
--- a/src/drv_maildir.c
+++ b/src/drv_maildir.c
@@ -563,21 +563,6 @@ maildir_clear_tmp( char *buf, int bufsz, int bl )
return DRV_OK;
}
-static int
-make_box_dir( char *buf, int bl )
-{
- char *p;
-
- if (!mkdir( buf, 0700 ) || errno == EEXIST)
- return 0;
- p = memrchr( buf, '/', (size_t)bl - 1 );
- *p = 0;
- if (make_box_dir( buf, (int)(p - buf) ))
- return -1;
- *p = '/';
- return mkdir( buf, 0700 );
-}
-
static int
maildir_validate( const char *box, int create, maildir_store_t *ctx )
{
@@ -593,7 +578,7 @@ maildir_validate( const char *box, int create,
maildir_store_t *ctx )
}
if (!create)
return DRV_BOX_BAD;
- if (make_box_dir( buf, bl )) {
+ if (mkdir_p( buf, bl - 1 )) {
sys_error( "Maildir error: cannot create mailbox '%s'",
buf );
ctx->conf->failed = FAIL_FINAL;
maildir_invoke_bad_callback( ctx );
diff --git a/src/sync_state.c b/src/sync_state.c
index c6761e97..0b0cfd65 100644
--- a/src/sync_state.c
+++ b/src/sync_state.c
@@ -58,7 +58,7 @@ prepare_state( sync_vars_t *svars )
// Note that this may be shorter than the configuration value,
// as that may contain a filename prefix.
*s = 0;
- if (mkdir( svars->dname, 0700 ) && errno != EEXIST) {
+ if (mkdir_p( svars->dname, s - svars->dname )) {
sys_error( "Error: cannot create SyncState directory
'%s'", svars->dname );
return 0;
}
diff --git a/src/util.c b/src/util.c
index 9e3c846e..df150ee4 100644
--- a/src/util.c
+++ b/src/util.c
@@ -8,6 +8,7 @@
#include "common.h"
#include <fcntl.h>
+#include <sys/stat.h>
#include <errno.h>
#include <ctype.h>
#include <pwd.h>
@@ -539,6 +540,21 @@ map_name( const char *arg, char **result, uint reserve,
const char *in, const ch
return 0;
}
+int
+mkdir_p( char *path, int len )
+{
+ if (!mkdir( path, 0700 ) || errno == EEXIST)
+ return 0;
+ char *p = memrchr( path, '/', (size_t)len );
+ *p = 0;
+ if (mkdir_p( path, (int)(p - path) )) {
+ *p = '/';
+ return -1;
+ }
+ *p = '/';
+ return mkdir( path, 0700 );
+}
+
static int
compare_uints( const void *l, const void *r )
{
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel