From: Timo Sirainen Date: Tue, 25 Sep 2012 21:23:02 +0000 (+0300) Subject: lib-storage: Improved mailbox_list_mkdir() error handling. X-Git-Tag: 2.2.alpha1~148 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48ce03445eaea184426156440116ca1da978bb54;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Improved mailbox_list_mkdir() error handling. --- diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 28f7673284..370f2ca2d4 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -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, diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index f3440d6709..39a90125e8 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -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.