]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Improved mailbox_list_mkdir() error handling.
authorTimo Sirainen <tss@iki.fi>
Tue, 25 Sep 2012 21:23:02 +0000 (00:23 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 25 Sep 2012 21:23:02 +0000 (00:23 +0300)
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h

index 28f76732842fb24c6ce1179b77e95e6ea47db15a..370f2ca2d45a8cbab7bf7d7ce8b70e418ead4668 100644 (file)
@@ -1421,13 +1421,21 @@ int mailbox_list_mkdir(struct mailbox_list *list,
        }
        if (mkdir_parents_chgrp(path, perm.dir_create_mode,
                                perm.file_create_gid,
-                               perm.file_create_gid_origin) < 0 &&
-           errno != EEXIST) {
+                               perm.file_create_gid_origin) == 0)
+               return 1;
+       else if (errno == EEXIST)
+               return 0;
+       else if (errno == ENOTDIR) {
+               mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
+                       "Mailbox doesn't allow inferior mailboxes");
+               return -1;
+       } else if (mailbox_list_set_error_from_errno(list)) {
+               return -1;
+       } else {
                mailbox_list_set_critical(list, "mkdir_parents(%s) failed: %m",
                                          path);
                return -1;
        }
-       return 0;
 }
 
 int mailbox_list_mkdir_parent(struct mailbox_list *list,
index f3440d67099322336adb84d2fac1faf421241dac..39a90125e81b286d015bd2feb6133c4ec959ca72 100644 (file)
@@ -162,7 +162,8 @@ void mailbox_list_get_permissions(struct mailbox_list *list, const char *name,
 void mailbox_list_get_root_permissions(struct mailbox_list *list,
                                       mode_t *file_mode_r, mode_t *dir_mode_r,
                                       gid_t *gid_r, const char **gid_origin_r);
-/* Create path's directory with proper permissions. */
+/* Create path's directory with proper permissions. Returns 1 if created,
+   0 if it already existed, -1 if error. */
 int mailbox_list_mkdir(struct mailbox_list *list,
                       const char *mailbox, const char *path) ATTR_NULL(2);
 /* Like mailbox_list_mkdir(), but create path's parent parent directory.