]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mail_storage_service_init*() can now take multiple set_roots.
authorTimo Sirainen <tss@iki.fi>
Wed, 15 Apr 2009 16:40:16 +0000 (12:40 -0400)
committerTimo Sirainen <tss@iki.fi>
Wed, 15 Apr 2009 16:40:16 +0000 (12:40 -0400)
--HG--
branch : HEAD

src/imap/main.c
src/lda/main.c
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-service.h
src/pop3/main.c

index d2f0616fffb5fe74cfbc20a60ef12d48481932fc..f8834c47662fc5fbae11a7c82a90f10f60aa4ff3 100644 (file)
@@ -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);
index 2c3a0f8806040e0b7d1dabc5fd7250b427b48081..93bc1db6a5e200a834905437961f64ae187b7c82 100644 (file)
@@ -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));
 
index 0d194b22b5b34feb69fdf3dc69f1ab80efd6d960..9a5aa23244df2bd292c1582b39e93d88641dfcf4 100644 (file)
@@ -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. */
index b3c03df769f25143899bcfd4bbcfa4fd9ca8ca63..86cf8ea3e67e3d98f6adc305a4404e3ba75b5e0f 100644 (file)
@@ -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,
index cbfafb494b19a3ec2f47c644d9f170ac66810246..5e68fa16c2083f9529699158e15bdb1c7eae14f0 100644 (file)
@@ -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);