commit 8bb679ea06e38d34f8db08db7ed2e840a64cc16d
Author: Oswald Buddenhagen <o...@users.sf.net>
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
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to