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;
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) {
/* 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) {
/* 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);
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) {
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) {
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);
{
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,
{
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
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
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;
}
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. */
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);
/* 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,
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) {
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;