Mercurial > dovecot > original-hg > dovecot-1.2
changeset 9204:f3c6cabae3af HEAD
Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 07 Jul 2009 22:26:24 -0400 |
parents | c8dc38a3b902 |
children | 4c8175452173 |
files | src/lib-storage/list/subscription-file.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h |
diffstat | 3 files changed, 31 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/list/subscription-file.c Tue Jul 07 21:51:37 2009 -0400 +++ b/src/lib-storage/list/subscription-file.c Tue Jul 07 22:26:24 2009 -0400 @@ -91,11 +91,11 @@ { struct dotlock_settings dotlock_set; struct dotlock *dotlock; - const char *line, *p, *dir, *origin; + const char *line, *origin; struct istream *input; struct ostream *output; int fd_in, fd_out; - mode_t mode, dir_mode; + mode_t mode; gid_t gid; bool found, failed = FALSE; @@ -112,19 +112,12 @@ dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT; mailbox_list_get_permissions(list, NULL, &mode, &gid, &origin); - mailbox_list_get_dir_permissions(list, NULL, &dir_mode, &gid, &origin); fd_out = file_dotlock_open_group(&dotlock_set, path, 0, mode, gid, origin, &dotlock); if (fd_out == -1 && errno == ENOENT) { /* directory hasn't been created yet. */ - p = strrchr(path, '/'); - dir = p == NULL ? NULL : t_strdup_until(path, p); - if (dir != NULL && - mkdir_parents_chgrp(dir, dir_mode, gid, origin) < 0 && - errno != EEXIST) { - subswrite_set_syscall_error(list, "mkdir()", dir); + 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); }
--- a/src/lib-storage/mailbox-list.c Tue Jul 07 21:51:37 2009 -0400 +++ b/src/lib-storage/mailbox-list.c Tue Jul 07 22:26:24 2009 -0400 @@ -3,6 +3,7 @@ #include "lib.h" #include "array.h" #include "ioloop.h" +#include "mkdir-parents.h" #include "str.h" #include "home-expand.h" #include "unlink-directory.h" @@ -841,6 +842,28 @@ return FALSE; } +int mailbox_list_create_parent_dir(struct mailbox_list *list, + const char *mailbox, const char *path) +{ + const char *p, *dir, *origin; + gid_t gid; + mode_t 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 && + errno != EEXIST) { + mailbox_list_set_critical(list, "mkdir_parents(%s) failed: %m", + dir); + return -1; + } + return 0; +} + const char *mailbox_list_get_last_error(struct mailbox_list *list, enum mail_error *error_r) {
--- a/src/lib-storage/mailbox-list.h Tue Jul 07 21:51:37 2009 -0400 +++ b/src/lib-storage/mailbox-list.h Tue Jul 07 22:26:24 2009 -0400 @@ -158,6 +158,11 @@ const char *name, 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. */ +int mailbox_list_create_parent_dir(struct mailbox_list *list, + const char *mailbox, const char *path); /* Returns TRUE if the name doesn't contain any invalid characters. The create name check can be more strict. */