Mercurial > dovecot > core-2.2
changeset 11822:7a6cf8dae9bf
Added mail_temp_dir setting, used by deliver and lmtp for creating temp mail files.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 15 Jul 2010 13:42:33 +0100 |
parents | 0d16970d9df3 |
children | 4138737f41e6 |
files | src/lda/main.c src/lib-storage/mail-storage-settings.c src/lib-storage/mail-storage-settings.h src/lib-storage/mail-user.c src/lib-storage/mail-user.h src/lmtp/client.c src/lmtp/client.h src/lmtp/commands.c src/lmtp/lmtp-settings.c src/lmtp/lmtp-settings.h src/plugins/quota/quota-fs.c |
diffstat | 11 files changed, 26 insertions(+), 88 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lda/main.c Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lda/main.c Thu Jul 15 13:42:33 2010 +0100 @@ -85,51 +85,15 @@ return ret; } -static int deliver_create_dir(struct mail_user *user, const char *dir) -{ - struct mail_namespace *ns; - const char *origin; - mode_t mode; - gid_t gid; - - ns = mail_namespace_find_inbox(user->namespaces); - if (ns == NULL) - ns = user->namespaces; - - mailbox_list_get_dir_permissions(ns->list, NULL, &mode, &gid, &origin); - if (mkdir_parents_chgrp(dir, mode, gid, origin) == 0) { - return 0; - } else if (errno == EACCES) { - i_error("%s", eacces_error_get_creating("mkdir_parents_chown", - dir)); - return -1; - } else { - i_error("mkdir_parents_chown(%s, gid=%s) failed: %m", - dir, dec2str(gid)); - return -1; - } -} - static int seekable_fd_callback(const char **path_r, void *context) { struct mail_deliver_context *ctx = context; - const char *dir, *p; string_t *path; int fd; path = t_str_new(128); - str_append(path, mail_user_get_temp_prefix(ctx->dest_user)); + mail_user_set_get_temp_prefix(path, ctx->dest_user->set); fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1); - if (fd == -1 && errno == ENOENT) { - dir = str_c(path); - p = strrchr(dir, '/'); - if (p != NULL) { - dir = t_strdup_until(dir, p); - if (deliver_create_dir(ctx->dest_user, dir) < 0) - return -1; - fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1); - } - } if (fd == -1) { i_error("safe_mkstemp(%s) failed: %m", str_c(path)); return -1;
--- a/src/lib-storage/mail-storage-settings.c Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lib-storage/mail-storage-settings.c Thu Jul 15 13:42:33 2010 +0100 @@ -141,6 +141,7 @@ static const struct setting_define mail_user_setting_defines[] = { DEF(SET_STR, base_dir), DEF(SET_STR, auth_socket_path), + DEF(SET_STR, mail_temp_dir), DEF(SET_STR, mail_uid), DEF(SET_STR, mail_gid), @@ -169,6 +170,7 @@ static const struct mail_user_settings mail_user_default_settings = { .base_dir = PKG_RUNDIR, .auth_socket_path = "auth-userdb", + .mail_temp_dir = "/tmp", .mail_uid = "", .mail_gid = "",
--- a/src/lib-storage/mail-storage-settings.h Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lib-storage/mail-storage-settings.h Thu Jul 15 13:42:33 2010 +0100 @@ -53,6 +53,7 @@ struct mail_user_settings { const char *base_dir; const char *auth_socket_path; + const char *mail_temp_dir; const char *mail_uid; const char *mail_gid;
--- a/src/lib-storage/mail-user.c Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lib-storage/mail-user.c Thu Jul 15 13:42:33 2010 +0100 @@ -23,8 +23,6 @@ struct mail_user_module_register mail_user_module_register = { 0 }; struct auth_master_connection *mail_user_auth_master_conn; -static const char *mail_user_get_temp_prefix_base(struct mail_user *user); - static void mail_user_deinit_base(struct mail_user *user) { mail_namespaces_deinit(&user->namespaces); @@ -57,7 +55,6 @@ i_panic("Settings check unexpectedly failed: %s", error); user->v.deinit = mail_user_deinit_base; - user->v.get_temp_prefix = mail_user_get_temp_prefix_base; p_array_init(&user->module_contexts, user->pool, 5); return user; } @@ -339,32 +336,13 @@ return 0; } -static const char *mail_user_get_temp_prefix_base(struct mail_user *user) +void mail_user_set_get_temp_prefix(string_t *dest, + const struct mail_user_settings *set) { - struct mail_namespace *ns; - const char *dir; - - if (user->_home != NULL) { - return t_strconcat(user->_home, "/.temp.", my_hostname, ".", - my_pid, ".", NULL); - } - - ns = mail_namespace_find_inbox(user->namespaces); - if (ns == NULL) - ns = user->namespaces; - - if (ns->storage->temp_path_prefix != NULL) - return ns->storage->temp_path_prefix; - - dir = mailbox_list_get_path(ns->list, NULL, - MAILBOX_LIST_PATH_TYPE_DIR); - return t_strconcat(dir, "/", - mailbox_list_get_temp_prefix(ns->list), NULL); -} - -const char *mail_user_get_temp_prefix(struct mail_user *user) -{ - return user->v.get_temp_prefix(user); + str_append(dest, set->mail_temp_dir); + str_append(dest, "/dovecot."); + str_append(dest, master_service_get_name(master_service)); + str_append_c(dest, '.'); } const char *mail_user_get_anvil_userip_ident(struct mail_user *user)
--- a/src/lib-storage/mail-user.h Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lib-storage/mail-user.h Thu Jul 15 13:42:33 2010 +0100 @@ -8,7 +8,6 @@ struct mail_user_vfuncs { void (*deinit)(struct mail_user *user); - const char *(*get_temp_prefix)(struct mail_user *user); }; struct mail_user { @@ -89,9 +88,10 @@ successfully, 0 if there is no home directory (either user doesn't exist or has no home directory) or -1 if lookup failed. */ int mail_user_get_home(struct mail_user *user, const char **home_r); -/* Returns path + file prefix for creating a temporary file. Uses home - directory if possible, fallbacks to mail directory. */ -const char *mail_user_get_temp_prefix(struct mail_user *user); +/* Appends path + file prefix for creating a temporary file. + The file prefix doesn't contain any uniqueness. */ +void mail_user_set_get_temp_prefix(string_t *dest, + const struct mail_user_settings *set); /* Returns TRUE if plugin is loaded for the user. */ bool mail_user_is_plugin_loaded(struct mail_user *user, struct module *module);
--- a/src/lmtp/client.c Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lmtp/client.c Thu Jul 15 13:42:33 2010 +0100 @@ -163,7 +163,7 @@ &set_parser, &error) < 0) i_fatal("%s", error); - lmtp_settings_dup(set_parser, client->pool, + lmtp_settings_dup(set_parser, client->pool, &client->user_set, &client->lmtp_set, &client->set); }
--- a/src/lmtp/client.h Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lmtp/client.h Thu Jul 15 13:42:33 2010 +0100 @@ -3,7 +3,7 @@ #include "network.h" -#define CLIENT_MAIL_DATA_MAX_INMEMORY_SIZE (1024*128) +#define CLIENT_MAIL_DATA_MAX_INMEMORY_SIZE 1//(1024*128) struct mail_recipient { const char *address; @@ -45,6 +45,7 @@ const struct setting_parser_info *user_set_info; const struct lda_settings *set; const struct lmtp_settings *lmtp_set; + const struct mail_user_settings *user_set; int fd_in, fd_out; struct io *io; struct istream *input;
--- a/src/lmtp/commands.c Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lmtp/commands.c Thu Jul 15 13:42:33 2010 +0100 @@ -736,7 +736,7 @@ /* move everything to a temporary file. FIXME: it really shouldn't be in /tmp.. */ path = t_str_new(256); - str_append(path, "/tmp/dovecot.lmtp."); + mail_user_set_get_temp_prefix(path, client->user_set); fd = safe_mkstemp_hostpid(path, 0600, (uid_t)-1, (gid_t)-1); if (fd == -1) return -1;
--- a/src/lmtp/lmtp-settings.c Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lmtp/lmtp-settings.c Thu Jul 15 13:42:33 2010 +0100 @@ -8,6 +8,7 @@ #include "master-service-settings.h" #include "lda-settings.h" #include "lmtp-settings.h" +#include "mail-storage-settings.h" #include <stddef.h> #include <unistd.h> @@ -83,12 +84,15 @@ }; void lmtp_settings_dup(const struct setting_parser_context *set_parser, - pool_t pool, const struct lmtp_settings **lmtp_set_r, + pool_t pool, + const struct mail_user_settings **user_set_r, + const struct lmtp_settings **lmtp_set_r, const struct lda_settings **lda_set_r) { void **sets; sets = settings_parser_get_list(set_parser) + 1; + *user_set_r = settings_dup(&mail_user_setting_parser_info, sets[0], pool); *lda_set_r = settings_dup(&lda_setting_parser_info, sets[1], pool); *lmtp_set_r = settings_dup(&lmtp_setting_parser_info, sets[2], pool); }
--- a/src/lmtp/lmtp-settings.h Wed Jul 14 17:16:55 2010 +0100 +++ b/src/lmtp/lmtp-settings.h Thu Jul 15 13:42:33 2010 +0100 @@ -11,7 +11,9 @@ extern const struct setting_parser_info lmtp_setting_parser_info; void lmtp_settings_dup(const struct setting_parser_context *set_parser, - pool_t pool, const struct lmtp_settings **lmtp_set_r, + pool_t pool, + const struct mail_user_settings **user_set_r, + const struct lmtp_settings **lmtp_set_r, const struct lda_settings **lda_set_r); #endif
--- a/src/plugins/quota/quota-fs.c Wed Jul 14 17:16:55 2010 +0100 +++ b/src/plugins/quota/quota-fs.c Thu Jul 15 13:42:33 2010 +0100 @@ -92,17 +92,6 @@ return &root->root; } -static const char * -quota_fs_mail_user_get_temp_prefix(struct mail_user *user ATTR_UNUSED) -{ - /* when filesystem quota is used, temp files will decrease the user's - quota if they're written under user's home. for example with lda - large mails are also first written to this temp directory, so if it - were in user's home, the user would always have two have twice - as much space available as necessary. */ - return t_strconcat("/tmp/dovecot.", my_pid, ".", NULL); -} - static int fs_quota_init(struct quota_root *_root, const char *args) { struct fs_quota_root *root = (struct fs_quota_root *)_root; @@ -128,9 +117,6 @@ return -1; } } - - _root->quota->user->v.get_temp_prefix = - quota_fs_mail_user_get_temp_prefix; return 0; }