[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