dovecot-2.0: Added mailbox_list_create_parent_dir() and used it ...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Jul 8 05:28:08 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/9ced768849e8
changeset: 9581:9ced768849e8
user: Timo Sirainen <tss at iki.fi>
date: Tue Jul 07 22:27:37 2009 -0400
description:
Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
diffstat:
3 files changed, 31 insertions(+), 10 deletions(-)
src/lib-storage/list/subscription-file.c | 13 +++----------
src/lib-storage/mailbox-list.c | 23 +++++++++++++++++++++++
src/lib-storage/mailbox-list.h | 5 +++++
diffs (93 lines):
diff -r 7a1da6de3cd8 -r 9ced768849e8 src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c Tue Jul 07 22:27:27 2009 -0400
+++ b/src/lib-storage/list/subscription-file.c Tue Jul 07 22:27:37 2009 -0400
@@ -89,11 +89,11 @@ int subsfile_set_subscribed(struct mailb
{
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;
@@ -108,19 +108,12 @@ int subsfile_set_subscribed(struct mailb
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 7a1da6de3cd8 -r 9ced768849e8 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c Tue Jul 07 22:27:27 2009 -0400
+++ b/src/lib-storage/mailbox-list.c Tue Jul 07 22:27:37 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"
@@ -907,6 +908,28 @@ bool mailbox_list_try_get_absolute_path(
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 7a1da6de3cd8 -r 9ced768849e8 src/lib-storage/mailbox-list.h
--- a/src/lib-storage/mailbox-list.h Tue Jul 07 22:27:27 2009 -0400
+++ b/src/lib-storage/mailbox-list.h Tue Jul 07 22:27:37 2009 -0400
@@ -155,6 +155,11 @@ void mailbox_list_get_dir_permissions(st
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. */
More information about the dovecot-cvs
mailing list