[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-storage.c,1.38,1.39

cras at procontrol.fi cras at procontrol.fi
Fri May 30 02:49:21 EEST 2003


Update of /home/cvs/dovecot/src/lib-storage/index/maildir
In directory danu:/tmp/cvs-serv13212/lib-storage/index/maildir

Modified Files:
	maildir-storage.c 
Log Message:
Some fixes/cleanups for cases when maildir doesn't exist



Index: maildir-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- maildir-storage.c	17 May 2003 13:09:55 -0000	1.38
+++ maildir-storage.c	29 May 2003 22:49:19 -0000	1.39
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "home-expand.h"
+#include "mkdir-parents.h"
 #include "unlink-directory.h"
 #include "subscription-file/subscription-file.h"
 #include "maildir-index.h"
@@ -179,30 +180,56 @@
 	return t_strconcat(storage->control_dir, "/.", name, NULL);
 }
 
-/* create or fix maildir, ignore if it already exists */
-static int create_maildir(struct mail_storage *storage,
-			  const char *dir, int verify)
+static int mkdir_verify(struct mail_storage *storage,
+			const char *dir, int verify)
 {
-	const char **tmp, *path;
+	struct stat st;
+
+	if (verify) {
+		if (lstat(dir, &st) == 0)
+			return TRUE;
+
+		if (errno != ENOENT) {
+			mail_storage_set_critical(storage,
+						  "lstat(%s) failed: %m", dir);
+			return FALSE;
+		}
+	}
 
 	if (mkdir(dir, CREATE_MODE) < 0 && (errno != EEXIST || !verify)) {
-		if (errno != EEXIST) {
+		if (errno != EEXIST && (!verify || errno != ENOENT)) {
 			mail_storage_set_critical(storage,
 						  "mkdir(%s) failed: %m", dir);
 		}
 		return FALSE;
 	}
 
+	return TRUE;
+}
+
+/* create or fix maildir, ignore if it already exists */
+static int create_maildir(struct mail_storage *storage,
+			  const char *dir, int verify)
+{
+	const char **tmp, *path;
+
+	if (!verify && !mkdir_verify(storage, dir, verify))
+		return FALSE;
+
 	for (tmp = maildirs; *tmp != NULL; tmp++) {
 		path = t_strconcat(dir, "/", *tmp, NULL);
 
-		if (mkdir(path, CREATE_MODE) < 0 &&
-		    (errno != EEXIST || !verify)) {
-			if (errno != EEXIST) {
-				mail_storage_set_critical(storage,
-					"mkdir(%s) failed: %m", dir);
-			}
-			return FALSE;
+		if (!mkdir_verify(storage, path, verify)) {
+			if (!verify || errno != ENOENT)
+				return FALSE;
+
+			/* small optimization. if we're verifying, we don't
+			   check that the root dir actually exists unless we
+			   fail here. */
+			if (!mkdir_verify(storage, dir, verify))
+				return FALSE;
+			if (!mkdir_verify(storage, path, verify))
+				return FALSE;
 		}
 	}
 
@@ -220,7 +247,7 @@
 		return TRUE;
 
 	dir = t_strconcat(storage->index_dir, "/.", name, NULL);
-	if (mkdir(dir, CREATE_MODE) == -1 && errno != EEXIST) {
+	if (mkdir_parents(dir, CREATE_MODE) == -1 && errno != EEXIST) {
 		mail_storage_set_critical(storage, "mkdir(%s) failed: %m", dir);
 		return FALSE;
 	}
@@ -236,7 +263,7 @@
 		return TRUE;
 
 	dir = t_strconcat(storage->control_dir, "/.", name, NULL);
-	if (mkdir(dir, CREATE_MODE) < 0 && errno != EEXIST) {
+	if (mkdir_parents(dir, CREATE_MODE) < 0 && errno != EEXIST) {
 		mail_storage_set_critical(storage, "mkdir(%s) failed: %m", dir);
 		return FALSE;
 	}
@@ -254,11 +281,8 @@
 
 	/* create the .INBOX directory */
 	inbox = t_strconcat(storage->dir, "/.INBOX", NULL);
-	if (mkdir(inbox, CREATE_MODE) < 0 && errno != EEXIST) {
-		mail_storage_set_critical(storage, "mkdir(%s) failed: %m",
-					  inbox);
+	if (!mkdir_verify(storage, inbox, TRUE))
 		return FALSE;
-	}
 
 	/* make sure the index directories exist */
 	return create_index_dir(storage, "INBOX") &&



More information about the dovecot-cvs mailing list