From: Timo Sirainen Date: Wed, 15 Apr 2009 16:40:16 +0000 (-0400) Subject: mail_storage_service_init*() can now take multiple set_roots. X-Git-Tag: 2.0.alpha1~946 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=812883e7758a86f615b9508ef10df1339123da83;p=thirdparty%2Fdovecot%2Fcore.git mail_storage_service_init*() can now take multiple set_roots. --HG-- branch : HEAD --- diff --git a/src/imap/main.c b/src/imap/main.c index d2f0616fff..f8834c4766 100644 --- a/src/imap/main.c +++ b/src/imap/main.c @@ -134,6 +134,10 @@ static void main_deinit(void) int main(int argc, char *argv[], char *envp[]) { + const struct setting_parser_info *set_roots[] = { + &imap_setting_parser_info, + NULL + }; enum master_service_flags service_flags = 0; enum mail_storage_service_flags storage_service_flags = 0; struct mail_user *mail_user; @@ -178,8 +182,7 @@ int main(int argc, char *argv[], char *envp[]) i_fatal("USER environment missing"); } - mail_user = mail_storage_service_init_user(service, user, - &imap_setting_parser_info, + mail_user = mail_storage_service_init_user(service, user, set_roots, storage_service_flags); set = mail_storage_service_get_settings(service); restrict_access_allow_coredumps(TRUE); diff --git a/src/lda/main.c b/src/lda/main.c index 2c3a0f8806..93bc1db6a5 100644 --- a/src/lda/main.c +++ b/src/lda/main.c @@ -176,6 +176,10 @@ static void print_help(void) int main(int argc, char *argv[]) { + const struct setting_parser_info *set_roots[] = { + &lda_setting_parser_info, + NULL + }; struct mail_deliver_context ctx; enum mail_storage_service_flags service_flags = 0; const char *user, *errstr, *path, *getopt_str; @@ -314,8 +318,8 @@ int main(int argc, char *argv[]) } service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT; - ctx.dest_user = mail_storage_service_init_user(service, user, - &lda_setting_parser_info, service_flags); + ctx.dest_user = mail_storage_service_init_user(service, user, set_roots, + service_flags); ctx.set = mail_storage_service_get_settings(service); duplicate_init(mail_user_set_get_storage_set(ctx.dest_user->set)); diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 0d194b22b5..9a5aa23244 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -282,11 +282,13 @@ service_drop_privileges(const struct mail_user_settings *set, static void mail_storage_service_init_settings(struct master_service *service, - const struct setting_parser_info *set_root, + const struct setting_parser_info *set_roots[], bool preserve_home) { - const struct setting_parser_info *set_roots[3]; + ARRAY_DEFINE(all_set_roots, const struct setting_parser_info *); + const struct setting_parser_info *info = &mail_user_setting_parser_info; const char *error; + unsigned int i; (void)umask(0077); @@ -294,12 +296,15 @@ mail_storage_service_init_settings(struct master_service *service, mail_storage_register_all(); mailbox_list_register_all(); - set_roots[0] = &mail_user_setting_parser_info; - set_roots[1] = set_root; - set_roots[2] = NULL; + t_array_init(&all_set_roots, 5); + array_append(&all_set_roots, &info, 1); + for (i = 0; set_roots[i] != NULL; i++) + array_append(&all_set_roots, &set_roots[i], 1); + (void)array_append_space(&all_set_roots); /* read settings after registering storages so they can have their own setting definitions too */ + set_roots = array_idx_modifiable(&all_set_roots, 0); if (master_service_settings_read(service, set_roots, mail_storage_get_dynamic_parsers(), preserve_home, &error) < 0) @@ -395,7 +400,7 @@ user_expand_varstr(struct master_service *service, const char *user, struct mail_user * mail_storage_service_init_user(struct master_service *service, const char *user, - const struct setting_parser_info *set_root, + const struct setting_parser_info *set_roots[], enum mail_storage_service_flags flags) { const struct master_service_settings *set; @@ -408,7 +413,7 @@ mail_storage_service_init_user(struct master_service *service, const char *user, bool userdb_lookup; userdb_lookup = (flags & MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP) != 0; - mail_storage_service_init_settings(service, set_root, !userdb_lookup); + mail_storage_service_init_settings(service, set_roots, !userdb_lookup); if ((flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0) set_keyval(service, "mail_debug", "yes"); @@ -484,7 +489,7 @@ void mail_storage_service_deinit_user(void) struct mail_storage_service_multi_ctx * mail_storage_service_multi_init(struct master_service *service, - const struct setting_parser_info *set_root, + const struct setting_parser_info *set_roots[], enum mail_storage_service_flags flags) { struct mail_storage_service_multi_ctx *ctx; @@ -497,7 +502,7 @@ mail_storage_service_multi_init(struct master_service *service, ctx->service = service; ctx->flags = flags; - mail_storage_service_init_settings(service, set_root, FALSE); + mail_storage_service_init_settings(service, set_roots, FALSE); /* do all the global initialization. delay initializing plugins until we drop privileges the first time. */ diff --git a/src/lib-storage/mail-storage-service.h b/src/lib-storage/mail-storage-service.h index b3c03df769..86cf8ea3e6 100644 --- a/src/lib-storage/mail-storage-service.h +++ b/src/lib-storage/mail-storage-service.h @@ -16,13 +16,13 @@ struct setting_parser_info; struct mail_user * mail_storage_service_init_user(struct master_service *service, const char *user, - const struct setting_parser_info *set_root, + const struct setting_parser_info *set_roots[], enum mail_storage_service_flags flags); void mail_storage_service_deinit_user(void); struct mail_storage_service_multi_ctx * mail_storage_service_multi_init(struct master_service *service, - const struct setting_parser_info *set_root, + const struct setting_parser_info *set_roots[], enum mail_storage_service_flags flags); /* Returns 1 if ok, 0 if user wasn't found, -1 if error. */ int mail_storage_service_multi_next(struct mail_storage_service_multi_ctx *ctx, diff --git a/src/pop3/main.c b/src/pop3/main.c index cbfafb494b..5e68fa16c2 100644 --- a/src/pop3/main.c +++ b/src/pop3/main.c @@ -139,6 +139,10 @@ static void main_deinit(void) int main(int argc, char *argv[], char *envp[]) { + const struct setting_parser_info *set_roots[] = { + &pop3_setting_parser_info, + NULL + }; enum master_service_flags service_flags = 0; enum mail_storage_service_flags storage_service_flags = MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT; @@ -176,8 +180,7 @@ int main(int argc, char *argv[], char *envp[]) i_fatal("USER environment missing"); } - mail_user = mail_storage_service_init_user(service, user, - &pop3_setting_parser_info, + mail_user = mail_storage_service_init_user(service, user, set_roots, storage_service_flags); set = mail_storage_service_get_settings(service); restrict_access_allow_coredumps(TRUE);