# HG changeset patch # User Timo Sirainen # Date 1247019984 14400 # Node ID f3c6cabae3af6c5df011e5792247e90556bdd35f # Parent c8dc38a3b902f9bdb83c60046d790e9643b299ea Added mailbox_list_create_parent_dir() and used it when creating subscriptions file. diff -r c8dc38a3b902 -r f3c6cabae3af src/lib-storage/list/subscription-file.c --- 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); } diff -r c8dc38a3b902 -r f3c6cabae3af src/lib-storage/mailbox-list.c --- 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) { diff -r c8dc38a3b902 -r f3c6cabae3af src/lib-storage/mailbox-list.h --- 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. */