# HG changeset patch # User Timo Sirainen # Date 1291604911 0 # Node ID 57d7ea7fa5f6a239ec12843cd992a01118f7310f # Parent 16929d83a00c769a2a95bd770f22f653b5f0e2b8 lib-storage: Added mailbox_list_get_root_[dir_]permissions() They should be used instead of mailbox_list_get_[dir_]permissions() with name=NULL parameter. diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/index/dbox-multi/mdbox-map.c --- a/src/lib-storage/index/dbox-multi/mdbox-map.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/index/dbox-multi/mdbox-map.c Mon Dec 06 03:08:31 2010 +0000 @@ -77,8 +77,9 @@ map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0, sizeof(uint16_t), sizeof(uint16_t)); - mailbox_list_get_permissions(root_list, NULL, &map->create_mode, - &map->create_gid, &map->create_gid_origin); + mailbox_list_get_root_permissions(root_list, &map->create_mode, + &map->create_gid, + &map->create_gid_origin); mail_index_set_permissions(map->index, map->create_mode, map->create_gid, map->create_gid_origin); return map; diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/list/mailbox-list-fs.c --- a/src/lib-storage/list/mailbox-list-fs.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/list/mailbox-list-fs.c Mon Dec 06 03:08:31 2010 +0000 @@ -331,8 +331,7 @@ path = t_strdup_until(path, p); } - mailbox_list_get_dir_permissions(list, NULL, &mode, - &gid, &gid_origin); + mailbox_list_get_root_dir_permissions(list, &mode, &gid, &gid_origin); if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0) return 0; else if (errno == EEXIST) { @@ -533,8 +532,8 @@ /* create the hierarchy */ p = strrchr(newpath, '/'); if (p != NULL) { - mailbox_list_get_dir_permissions(newlist, NULL, &mode, - &gid, &origin); + mailbox_list_get_root_dir_permissions(newlist, &mode, + &gid, &origin); p = t_strdup_until(newpath, p); if (mkdir_parents_chgrp(p, mode, gid, origin) < 0 && errno != EEXIST) { diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/list/mailbox-list-maildir.c --- a/src/lib-storage/list/mailbox-list-maildir.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/list/mailbox-list-maildir.c Mon Dec 06 03:08:31 2010 +0000 @@ -284,7 +284,7 @@ /* Maildir++ spec wants that maildirfolder named file is created for all subfolders. */ - mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin); + mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin); path = t_strconcat(dir, "/" MAILDIR_SUBFOLDER_FILENAME, NULL); old_mask = umask(0); @@ -347,8 +347,8 @@ root_dir = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_MAILBOX); - mailbox_list_get_dir_permissions(list, NULL, &mode, - &gid, &gid_origin); + mailbox_list_get_root_dir_permissions(list, &mode, + &gid, &gid_origin); if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0) { /* ok */ } else if (errno == EEXIST) { diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/list/subscription-file.c --- a/src/lib-storage/list/subscription-file.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/list/subscription-file.c Mon Dec 06 03:08:31 2010 +0000 @@ -108,7 +108,7 @@ dotlock_set.timeout = SUBSCRIPTION_FILE_LOCK_TIMEOUT; dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT; - mailbox_list_get_permissions(list, NULL, &mode, &gid, &origin); + mailbox_list_get_root_permissions(list, &mode, &gid, &origin); fd_out = file_dotlock_open_group(&dotlock_set, path, 0, mode, gid, origin, &dotlock); if (fd_out == -1 && errno == ENOENT) { diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/mail-storage.c --- a/src/lib-storage/mail-storage.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/mail-storage.c Mon Dec 06 03:08:31 2010 +0000 @@ -243,7 +243,7 @@ return ret; /* we need to create the root directory. */ - mailbox_list_get_dir_permissions(list, NULL, &mode, &gid, &origin); + mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin); if (mkdir_parents_chgrp(root_dir, mode, gid, origin) < 0 && errno != EEXIST) { *error_r = mail_error_create_eacces_msg("mkdir", root_dir); diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/mailbox-list.c --- a/src/lib-storage/mailbox-list.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/mailbox-list.c Mon Dec 06 03:08:31 2010 +0000 @@ -490,15 +490,26 @@ { mode_t dir_mode; - if (list->file_create_mode != (mode_t)-1 && name == NULL) { + i_assert(name != NULL); + + mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r, + gid_origin_r); +} + +void mailbox_list_get_root_permissions(struct mailbox_list *list, + mode_t *mode_r, gid_t *gid_r, + const char **gid_origin_r) +{ + mode_t dir_mode; + + if (list->file_create_mode != (mode_t)-1) { *mode_r = list->file_create_mode; *gid_r = list->file_create_gid; *gid_origin_r = list->file_create_gid_origin; - return; + } else { + mailbox_list_get_permissions_full(list, NULL, mode_r, &dir_mode, + gid_r, gid_origin_r); } - - mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r, - gid_origin_r); } void mailbox_list_get_dir_permissions(struct mailbox_list *list, @@ -508,15 +519,26 @@ { mode_t file_mode; - if (list->dir_create_mode != (mode_t)-1 && name == NULL) { + i_assert(name != NULL); + + mailbox_list_get_permissions_full(list, name, &file_mode, + mode_r, gid_r, gid_origin_r); +} + +void mailbox_list_get_root_dir_permissions(struct mailbox_list *list, + mode_t *mode_r, gid_t *gid_r, + const char **gid_origin_r) +{ + mode_t file_mode; + + if (list->dir_create_mode != (mode_t)-1) { *mode_r = list->dir_create_mode; *gid_r = list->file_create_gid; *gid_origin_r = list->file_create_gid_origin; - return; + } else { + mailbox_list_get_permissions_full(list, NULL, &file_mode, + mode_r, gid_r, gid_origin_r); } - - mailbox_list_get_permissions_full(list, name, &file_mode, - mode_r, gid_r, gid_origin_r); } static int @@ -591,7 +613,7 @@ mode_t mode; gid_t gid; - mailbox_list_get_dir_permissions(list, NULL, &mode, &gid, &origin); + mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin); /* get the directory path up to last %variable. for example unexpanded path may be "/var/mail/%d/%2n/%n/Maildir", and we want @@ -1112,7 +1134,7 @@ path = t_strconcat(path, "/"MAILBOX_LOG_FILE_NAME, NULL); list->changelog = mailbox_log_alloc(path); - mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin); + mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin); mailbox_log_set_permissions(list->changelog, mode, gid, gid_origin); return TRUE; } diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/mailbox-list.h --- a/src/lib-storage/mailbox-list.h Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/mailbox-list.h Mon Dec 06 03:08:31 2010 +0000 @@ -173,18 +173,24 @@ struct mail_storage **storage); /* Returns the mode and GID that should be used when creating new files to - the specified mailbox, or to mailbox list root if name is NULL. (gid_t)-1 is + the specified mailbox or to mailbox list root. (gid_t)-1 is returned if it's not necessary to change the default gid. */ void mailbox_list_get_permissions(struct mailbox_list *list, const char *name, mode_t *mode_r, gid_t *gid_r, const char **gid_origin_r); +void mailbox_list_get_root_permissions(struct mailbox_list *list, + mode_t *mode_r, gid_t *gid_r, + const char **gid_origin_r); /* Like mailbox_list_get_permissions(), but add execute-bits for mode if either read or write bit is set (e.g. 0640 -> 0750). */ void mailbox_list_get_dir_permissions(struct mailbox_list *list, const char *name, mode_t *mode_r, gid_t *gid_r, const char **gid_origin_r); +void mailbox_list_get_root_dir_permissions(struct mailbox_list *list, + mode_t *mode_r, gid_t *gid_r, + const char **gid_origin_r); /* Create path's parent directory with proper permissions. Since most directories are created lazily, this function can be used to easily create them whenever file creation fails with ENOENT. */ diff -r 16929d83a00c -r 57d7ea7fa5f6 src/lib-storage/mailbox-uidvalidity.c --- a/src/lib-storage/mailbox-uidvalidity.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/lib-storage/mailbox-uidvalidity.c Mon Dec 06 03:08:31 2010 +0000 @@ -41,7 +41,7 @@ gid_t gid; const char *gid_origin; - mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin); + mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin); old_mask = umask(0666 & ~mode); fd = open(path, O_RDWR | O_CREAT, 0666); diff -r 16929d83a00c -r 57d7ea7fa5f6 src/plugins/acl/acl-backend-vfile-acllist.c --- a/src/plugins/acl/acl-backend-vfile-acllist.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/plugins/acl/acl-backend-vfile-acllist.c Mon Dec 06 03:08:31 2010 +0000 @@ -228,7 +228,7 @@ /* Build it into a temporary file and rename() over. There's no need to use locking, because even if multiple processes are rebuilding the file at the same time the result should be the same. */ - mailbox_list_get_permissions(list, NULL, &mode, &gid, &origin); + mailbox_list_get_root_permissions(list, &mode, &gid, &origin); fd = safe_mkstemp_group(path, mode, gid, origin); if (fd == -1 && errno == ENOENT) { if (mailbox_list_create_parent_dir(backend->backend.list, NULL, diff -r 16929d83a00c -r 57d7ea7fa5f6 src/plugins/lazy-expunge/lazy-expunge-plugin.c --- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c Mon Dec 06 03:08:31 2010 +0000 @@ -242,7 +242,7 @@ int ret; /* make sure the destination root directory exists */ - mailbox_list_get_dir_permissions(dest_list, NULL, &mode, &gid, &origin); + mailbox_list_get_root_dir_permissions(dest_list, &mode, &gid, &origin); dir = mailbox_list_get_path(dest_list, NULL, MAILBOX_LIST_PATH_TYPE_DIR); if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 && errno != EEXIST) { diff -r 16929d83a00c -r 57d7ea7fa5f6 src/plugins/quota/quota-maildir.c --- a/src/plugins/quota/quota-maildir.c Mon Dec 06 02:16:22 2010 +0000 +++ b/src/plugins/quota/quota-maildir.c Mon Dec 06 03:08:31 2010 +0000 @@ -236,16 +236,15 @@ namespaces = array_get(&root->root.quota->namespaces, &count); i_assert(count > 0); for (i = 0; i < count; i++) { - if ((namespaces[i]->flags & NAMESPACE_FLAG_INBOX_USER) != 0) { - mailbox_list_get_permissions(namespaces[i]->list, - NULL, &mode, &gid, - &gid_origin); - mailbox_list_get_dir_permissions(namespaces[i]->list, - NULL, - &dir_mode, &dir_gid, - &dir_gid_origin); - break; - } + if ((namespaces[i]->flags & NAMESPACE_FLAG_INBOX_USER) == 0) + continue; + + mailbox_list_get_root_permissions(namespaces[i]->list, + &mode, &gid, &gid_origin); + mailbox_list_get_root_dir_permissions(namespaces[i]->list, + &dir_mode, &dir_gid, + &dir_gid_origin); + break; } dotlock_settings.use_excl_lock = set->dotlock_use_excl;