Mercurial > dovecot > core-2.2
changeset 12630:82f984d7a241
lib-storage: Merged returning dir mode into mailbox_list_get_[root_]permissions().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 01 Feb 2011 20:59:21 +0200 |
parents | 02370eda76f8 |
children | 7701fb66d82a |
files | src/lib-storage/index/dbox-multi/mdbox-map.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/list/subscription-file.c src/lib-storage/mail-storage.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h src/lib-storage/mailbox-uidvalidity.c src/plugins/acl/acl-backend-vfile-acllist.c src/plugins/acl/acl-backend-vfile.c src/plugins/lazy-expunge/lazy-expunge-plugin.c src/plugins/quota/quota-maildir.c |
diffstat | 12 files changed, 100 insertions(+), 143 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/index/dbox-multi/mdbox-map.c Tue Feb 01 20:59:21 2011 +0200 @@ -50,6 +50,7 @@ { struct mdbox_map *map; const char *root, *index_root; + mode_t dir_mode; root = mailbox_list_get_path(root_list, NULL, MAILBOX_LIST_PATH_TYPE_DIR); @@ -77,7 +78,8 @@ map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0, sizeof(uint16_t), sizeof(uint16_t)); - mailbox_list_get_root_permissions(root_list, &map->create_mode, + mailbox_list_get_root_permissions(root_list, + &map->create_mode, &dir_mode, &map->create_gid, &map->create_gid_origin); mail_index_set_permissions(map->index, map->create_mode,
--- a/src/lib-storage/list/mailbox-list-fs.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-fs.c Tue Feb 01 20:59:21 2011 +0200 @@ -265,7 +265,7 @@ enum mailbox_dir_create_type type) { const char *path, *gid_origin, *p; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; bool directory, create_parent_dir; int ret; @@ -284,8 +284,9 @@ path = t_strdup_until(path, p); } - mailbox_list_get_root_dir_permissions(list, &mode, &gid, &gid_origin); - if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0) + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &gid_origin); + if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0) return 0; else if (errno == EEXIST) { if (create_parent_dir) @@ -448,7 +449,7 @@ const char *p, *origin; enum mailbox_list_path_type path_type, alt_path_type; struct stat st; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; bool rmdir_parent = FALSE; @@ -487,10 +488,10 @@ /* create the hierarchy */ p = strrchr(newpath, '/'); if (p != NULL) { - mailbox_list_get_root_dir_permissions(newlist, &mode, - &gid, &origin); + mailbox_list_get_root_permissions(newlist, &file_mode, + &dir_mode, &gid, &origin); p = t_strdup_until(newpath, p); - if (mkdir_parents_chgrp(p, mode, gid, origin) < 0 && + if (mkdir_parents_chgrp(p, dir_mode, gid, origin) < 0 && errno != EEXIST) { if (mailbox_list_set_error_from_errno(oldlist)) return -1;
--- a/src/lib-storage/list/mailbox-list-maildir.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-maildir.c Tue Feb 01 20:59:21 2011 +0200 @@ -265,17 +265,18 @@ const char *dir) { const char *path, *gid_origin; - mode_t mode, old_mask; + mode_t file_mode, dir_mode, old_mask; gid_t gid; int fd; /* Maildir++ spec wants that maildirfolder named file is created for all subfolders. */ - mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin); + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &gid_origin); path = t_strconcat(dir, "/" MAILDIR_SUBFOLDER_FILENAME, NULL); old_mask = umask(0); - fd = open(path, O_CREAT | O_WRONLY, mode); + fd = open(path, O_CREAT | O_WRONLY, file_mode); umask(old_mask); if (fd != -1) { /* ok */ @@ -310,7 +311,7 @@ enum mailbox_dir_create_type type) { const char *path, *root_dir, *gid_origin, *p; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; bool create_parent_dir; @@ -334,9 +335,9 @@ root_dir = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_MAILBOX); - mailbox_list_get_root_dir_permissions(list, &mode, - &gid, &gid_origin); - if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0) { + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &gid_origin); + if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0) { /* ok */ } else if (errno == EEXIST) { if (create_parent_dir)
--- a/src/lib-storage/list/subscription-file.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/list/subscription-file.c Tue Feb 01 20:59:21 2011 +0200 @@ -94,7 +94,7 @@ struct istream *input; struct ostream *output; int fd_in, fd_out; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; bool found, changed = FALSE, failed = FALSE; @@ -108,15 +108,17 @@ dotlock_set.timeout = SUBSCRIPTION_FILE_LOCK_TIMEOUT; dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT; - mailbox_list_get_root_permissions(list, &mode, &gid, &origin); + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &origin); fd_out = file_dotlock_open_group(&dotlock_set, path, 0, - mode, gid, origin, &dotlock); + file_mode, gid, origin, &dotlock); if (fd_out == -1 && errno == ENOENT) { /* directory hasn't been created yet. */ if (mailbox_list_create_parent_dir(list, NULL, path) < 0) return -1; fd_out = file_dotlock_open_group(&dotlock_set, path, 0, - mode, gid, origin, &dotlock); + file_mode, gid, + origin, &dotlock); } if (fd_out == -1) { if (errno == EAGAIN) {
--- a/src/lib-storage/mail-storage.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/mail-storage.c Tue Feb 01 20:59:21 2011 +0200 @@ -216,7 +216,7 @@ enum mail_storage_flags flags, const char **error_r) { const char *root_dir, *origin, *error; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; bool autocreate; int ret; @@ -247,8 +247,9 @@ return ret; /* we need to create the root directory. */ - mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin); - if (mkdir_parents_chgrp(root_dir, mode, gid, origin) < 0 && + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &origin); + if (mkdir_parents_chgrp(root_dir, dir_mode, gid, origin) < 0 && errno != EEXIST) { *error_r = mail_error_create_eacces_msg("mkdir", root_dir); return -1; @@ -1480,8 +1481,7 @@ static void mailbox_get_permissions_if_not_set(struct mailbox *box) { - const char *origin, *dir_origin; - gid_t dir_gid; + const char *origin; if (box->_perm.file_create_mode != 0) return; @@ -1496,11 +1496,9 @@ mailbox_list_get_permissions(box->list, box->name, &box->_perm.file_create_mode, + &box->_perm.dir_create_mode, &box->_perm.file_create_gid, &origin); box->_perm.file_create_gid_origin = p_strdup(box->pool, origin); - mailbox_list_get_dir_permissions(box->list, box->name, - &box->_perm.dir_create_mode, - &dir_gid, &dir_origin); } const struct mailbox_permissions *mailbox_get_permissions(struct mailbox *box)
--- a/src/lib-storage/mailbox-list.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/mailbox-list.c Tue Feb 01 20:59:21 2011 +0200 @@ -519,8 +519,8 @@ return list->v.get_hierarchy_sep(list); } -static void -mailbox_list_get_permissions_full(struct mailbox_list *list, const char *name, +void mailbox_list_get_permissions(struct mailbox_list *list, + const char *name, mode_t *file_mode_r, mode_t *dir_mode_r, gid_t *gid_r, const char **gid_origin_r) { @@ -546,10 +546,9 @@ } if (name != NULL) { /* return defaults */ - mailbox_list_get_permissions_full(list, NULL, - file_mode_r, - dir_mode_r, gid_r, - gid_origin_r); + mailbox_list_get_permissions(list, NULL, + file_mode_r, dir_mode_r, + gid_r, gid_origin_r); return; } } else { @@ -597,61 +596,19 @@ } } -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 *file_mode_r, mode_t *dir_mode_r, + gid_t *gid_r, const char **gid_origin_r) { - mode_t dir_mode; - - 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; + *file_mode_r = list->file_create_mode; + *dir_mode_r = list->dir_create_mode; *gid_r = list->file_create_gid; *gid_origin_r = list->file_create_gid_origin; } else { - mailbox_list_get_permissions_full(list, NULL, mode_r, &dir_mode, - gid_r, gid_origin_r); - } -} - -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) -{ - mode_t file_mode; - - 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; - } else { - mailbox_list_get_permissions_full(list, NULL, &file_mode, - mode_r, gid_r, gid_origin_r); + mailbox_list_get_permissions(list, NULL, + file_mode_r, dir_mode_r, + gid_r, gid_origin_r); } } @@ -724,10 +681,11 @@ { const char *expanded, *unexpanded, *root_dir, *p, *origin; struct stat st; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; - mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin); + mailbox_list_get_root_permissions(list, &file_mode, &dir_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 @@ -762,7 +720,7 @@ return -1; } } - if (gid == (gid_t)-1 && (mode & S_ISGID) == 0) { + if (gid == (gid_t)-1 && (dir_mode & S_ISGID) == 0) { /* change the group for user directories */ gid = getegid(); } @@ -770,7 +728,7 @@ /* the rest of the directories exist only for one user. create them with default directory permissions */ - if (mkdir_parents_chgrp(path, mode, gid, origin) < 0 && + if (mkdir_parents_chgrp(path, dir_mode, gid, origin) < 0 && errno != EEXIST) { mailbox_list_set_critical(list, "mkdir(%s) failed: %m", path); return -1; @@ -1220,7 +1178,7 @@ static bool mailbox_list_init_changelog(struct mailbox_list *list) { const char *path; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; const char *gid_origin; @@ -1236,8 +1194,9 @@ path = t_strconcat(path, "/"MAILBOX_LOG_FILE_NAME, NULL); list->changelog = mailbox_log_alloc(path); - mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin); - mailbox_log_set_permissions(list->changelog, mode, gid, gid_origin); + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &gid_origin); + mailbox_log_set_permissions(list->changelog, dir_mode, gid, gid_origin); return TRUE; } @@ -1515,15 +1474,16 @@ { const char *p, *dir, *origin; gid_t gid; - mode_t mode; + mode_t file_mode, dir_mode; p = strrchr(path, '/'); if (p == NULL) return 0; dir = t_strdup_until(path, p); - mailbox_list_get_dir_permissions(list, mailbox, &mode, &gid, &origin); - if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 && + mailbox_list_get_permissions(list, mailbox, &file_mode, &dir_mode, + &gid, &origin); + if (mkdir_parents_chgrp(dir, dir_mode, gid, origin) < 0 && errno != EEXIST) { mailbox_list_set_critical(list, "mkdir_parents(%s) failed: %m", dir); @@ -1536,7 +1496,7 @@ const char *name) { const char *root_dir, *index_dir, *parent_dir, *p, *origin; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; unsigned int n = 0; @@ -1549,13 +1509,13 @@ return 0; if (name == NULL) { - mailbox_list_get_root_dir_permissions(list, &mode, - &gid, &origin); + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &origin); } else { - mailbox_list_get_dir_permissions(list, name, &mode, - &gid, &origin); + mailbox_list_get_permissions(list, name, &file_mode, &dir_mode, + &gid, &origin); } - while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) { + while (mkdir_chgrp(index_dir, dir_mode, gid, origin) < 0) { if (errno == EEXIST) break;
--- a/src/lib-storage/mailbox-list.h Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/mailbox-list.h Tue Feb 01 20:59:21 2011 +0200 @@ -165,25 +165,17 @@ struct mail_storage **storage); char mailbox_list_get_hierarchy_sep(struct mailbox_list *list); -/* Returns the mode and GID that should be used when creating new files to - 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); +/* Returns the mode and GID that should be used when creating new files and + directories to the specified mailbox. (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 *file_mode_r, mode_t *dir_mode_r, + gid_t *gid_r, const char **gid_origin_r); +/* Like mailbox_list_get_permissions(), but for creating files/dirs to the + mail root directory (or even the root dir itself). */ 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); + mode_t *file_mode_r, mode_t *dir_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. */
--- a/src/lib-storage/mailbox-uidvalidity.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/lib-storage/mailbox-uidvalidity.c Tue Feb 01 20:59:21 2011 +0200 @@ -37,13 +37,14 @@ { char buf[8+1]; int fd; - mode_t mode, old_mask; + mode_t file_mode, dir_mode, old_mask; gid_t gid; const char *gid_origin; - mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin); + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &gid_origin); - old_mask = umask(0666 & ~mode); + old_mask = umask(0666 & ~file_mode); fd = open(path, O_RDWR | O_CREAT, 0666); umask(old_mask); if (fd == -1) {
--- a/src/plugins/acl/acl-backend-vfile-acllist.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/plugins/acl/acl-backend-vfile-acllist.c Tue Feb 01 20:59:21 2011 +0200 @@ -205,7 +205,7 @@ struct ostream *output; struct stat st; string_t *path; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; int fd, ret; @@ -227,13 +227,14 @@ /* 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_root_permissions(list, &mode, &gid, &origin); - fd = safe_mkstemp_group(path, mode, gid, origin); + mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, + &gid, &origin); + fd = safe_mkstemp_group(path, file_mode, gid, origin); if (fd == -1 && errno == ENOENT) { if (mailbox_list_create_parent_dir(backend->backend.list, NULL, str_c(path)) < 0) return -1; - fd = safe_mkstemp_group(path, mode, gid, origin); + fd = safe_mkstemp_group(path, file_mode, gid, origin); } if (fd == -1) { if (errno == EACCES) {
--- a/src/plugins/acl/acl-backend-vfile.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/plugins/acl/acl-backend-vfile.c Tue Feb 01 20:59:21 2011 +0200 @@ -900,7 +900,7 @@ { struct acl_object *_aclobj = &aclobj->aclobj; const char *gid_origin; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; int fd; @@ -912,9 +912,9 @@ /* first lock the ACL file */ mailbox_list_get_permissions(_aclobj->backend->list, _aclobj->name, - &mode, &gid, &gid_origin); + &file_mode, &dir_mode, &gid, &gid_origin); fd = file_dotlock_open_group(&dotlock_set, aclobj->local_path, 0, - mode, gid, gid_origin, dotlock_r); + file_mode, gid, gid_origin, dotlock_r); if (fd == -1) { i_error("file_dotlock_open(%s) failed: %m", aclobj->local_path); return -1;
--- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c Tue Feb 01 20:59:21 2011 +0200 @@ -235,14 +235,15 @@ struct mailbox *dest_box; const char *dir, *origin; enum mail_error error; - mode_t mode; + mode_t file_mode, dir_mode; gid_t gid; int ret; /* make sure the destination root directory exists */ - mailbox_list_get_root_dir_permissions(dest_list, &mode, &gid, &origin); + mailbox_list_get_root_permissions(dest_list, &file_mode, &dir_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 && + if (mkdir_parents_chgrp(dir, dir_mode, gid, origin) < 0 && errno != EEXIST) { mail_storage_set_critical(src_box->storage, "mkdir_parents(%s) failed: %m", dir);
--- a/src/plugins/quota/quota-maildir.c Tue Feb 01 20:41:54 2011 +0200 +++ b/src/plugins/quota/quota-maildir.c Tue Feb 01 20:59:21 2011 +0200 @@ -222,18 +222,18 @@ struct mail_namespace *const *namespaces; unsigned int i, count; struct dotlock *dotlock; - const char *p, *dir, *gid_origin, *dir_gid_origin; + const char *p, *dir, *gid_origin; string_t *str; - mode_t mode, dir_mode; - gid_t gid, dir_gid; + mode_t file_mode, dir_mode; + gid_t gid; int fd; i_assert(root->fd == -1); /* figure out what permissions we should use for maildirsize. use the inbox namespace's permissions if possible. */ - mode = 0600; dir_mode = 0700; dir_gid_origin = gid_origin = "default"; - gid = dir_gid = (gid_t)-1; + file_mode = 0600; dir_mode = 0700; gid_origin = "default"; + gid = (gid_t)-1; namespaces = array_get(&root->root.quota->namespaces, &count); i_assert(count > 0); for (i = 0; i < count; i++) { @@ -241,10 +241,8 @@ 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); + &file_mode, &dir_mode, + &gid, &gid_origin); break; } @@ -252,20 +250,20 @@ dotlock_settings.nfs_flush = set->mail_nfs_storage; fd = file_dotlock_open_group(&dotlock_settings, path, DOTLOCK_CREATE_FLAG_NONBLOCK, - mode, gid, gid_origin, &dotlock); + file_mode, gid, gid_origin, &dotlock); if (fd == -1 && errno == ENOENT) { /* the control directory doesn't exist yet? create it */ p = strrchr(path, '/'); dir = t_strdup_until(path, p); - if (mkdir_parents_chgrp(dir, dir_mode, dir_gid, - dir_gid_origin) < 0 && + if (mkdir_parents_chgrp(dir, dir_mode, gid, gid_origin) < 0 && errno != EEXIST) { i_error("mkdir_parents(%s) failed: %m", dir); return -1; } fd = file_dotlock_open_group(&dotlock_settings, path, DOTLOCK_CREATE_FLAG_NONBLOCK, - mode, gid, gid_origin, &dotlock); + file_mode, gid, gid_origin, + &dotlock); } if (fd == -1) { if (errno == EAGAIN) {