Эх сурвалжийг харах

don't make intermediate directories proper maildirs

"phantom" mailboxes waste time on syncing. furthermore, mutt's mailbox
navigator provides no means to enter subfolders of maildirs.
Oswald Buddenhagen 10 жил өмнө
parent
commit
a7eddc6ede
1 өөрчлөгдсөн 26 нэмэгдсэн , 15 устгасан
  1. 26 15
      src/drv_maildir.c

+ 26 - 15
src/drv_maildir.c

@@ -214,22 +214,22 @@ maildir_list_recurse( store_t *gctx, int isBox, int *flags, const char *inbox, i
                       char *path, int pathLen, char *name, int nameLen )
                       char *path, int pathLen, char *name, int nameLen )
 {
 {
 	DIR *dir;
 	DIR *dir;
-	int pl, nl, missing;
+	int pl, nl;
 	struct dirent *de;
 	struct dirent *de;
 	struct stat st;
 	struct stat st;
 
 
 	if (isBox) {
 	if (isBox) {
 		path[pathLen++] = '/';
 		path[pathLen++] = '/';
-		nfsnprintf( path + pathLen, _POSIX_PATH_MAX - pathLen, "cur" );
-		missing = stat( path, &st ) || !S_ISDIR(st.st_mode);
-		if (!missing || isBox > 1)
+		if (isBox > 1 ||
+		    (nfsnprintf( path + pathLen, _POSIX_PATH_MAX - pathLen, "cur" ),
+		     !stat( path, &st ) && S_ISDIR(st.st_mode)))
 			add_string_list( &gctx->boxes, name );
 			add_string_list( &gctx->boxes, name );
-		if (missing)
-			return 0;
 		path[pathLen] = 0;
 		path[pathLen] = 0;
 		name[nameLen++] = '/';
 		name[nameLen++] = '/';
 	}
 	}
 	if (!(dir = opendir( path ))) {
 	if (!(dir = opendir( path ))) {
+		if (isBox && (errno == ENOENT || errno == ENOTDIR))
+			return 0;
 		sys_error( "Maildir error: cannot list %s", path );
 		sys_error( "Maildir error: cannot list %s", path );
 		return -1;
 		return -1;
 	}
 	}
@@ -369,9 +369,27 @@ maildir_clear_tmp( char *buf, int bufsz, int bl )
 }
 }
 
 
 static int
 static int
-maildir_validate( const char *box, int create, maildir_store_t *ctx )
+make_box_dir( char *buf, int bl )
 {
 {
 	char *p;
 	char *p;
+
+	if (!mkdir( buf, 0700 ) || errno == EEXIST)
+		return 0;
+	p = memrchr( buf, '/', bl - 1 );
+	if (*(p + 1) != '.') {
+		errno = ENOENT;
+		return -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 )
+{
 	int i, bl, ret;
 	int i, bl, ret;
 	struct stat st;
 	struct stat st;
 	char buf[_POSIX_PATH_MAX];
 	char buf[_POSIX_PATH_MAX];
@@ -384,14 +402,7 @@ maildir_validate( const char *box, int create, maildir_store_t *ctx )
 		}
 		}
 		if (!create)
 		if (!create)
 			return DRV_BOX_BAD;
 			return DRV_BOX_BAD;
-		p = memrchr( buf, '/', bl - 1 );
-		if (*(p + 1) == '.') {
-			*p = 0;
-			if ((ret = maildir_validate( buf, 1, ctx )) != DRV_OK)
-				return ret;
-			*p = '/';
-		}
-		if (mkdir( buf, 0700 )) {
+		if (make_box_dir( buf, bl )) {
 			sys_error( "Maildir error: cannot create mailbox '%s'", box );
 			sys_error( "Maildir error: cannot create mailbox '%s'", box );
 			maildir_invoke_bad_callback( &ctx->gen );
 			maildir_invoke_bad_callback( &ctx->gen );
 			return DRV_CANCELED;
 			return DRV_CANCELED;