]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Binaries now take -o key=value parameters to override settings.
authorTimo Sirainen <tss@iki.fi>
Wed, 6 May 2009 19:01:49 +0000 (15:01 -0400)
committerTimo Sirainen <tss@iki.fi>
Wed, 6 May 2009 19:01:49 +0000 (15:01 -0400)
--HG--
branch : HEAD

src/lib-master/master-service-private.h
src/lib-master/master-service-settings.c
src/lib-master/master-service.c
src/lib-settings/settings-parser.c
src/lib-settings/settings-parser.h

index e9e48121560d19f2a3e2e328dba485ab5b437cd4..de5332ec79b649fb47f0c2a4068d59615e322679 100644 (file)
@@ -23,6 +23,7 @@ struct master_service {
        const char *version_string;
        const char *config_path;
        int syslog_facility;
+       ARRAY_TYPE(const_string) config_overrides;
 
        unsigned int socket_count, ssl_socket_count;
         struct master_service_listener *listeners;
index 350e70be54050e0d4f1730d0ad3fad3801e2b964..d3a90e1a151d9009433e02bad40857f4e8324094 100644 (file)
@@ -121,6 +121,28 @@ master_service_read_config(struct master_service *service, bool preserve_home,
        return fd;
 }
 
+static int
+master_service_apply_config_overrides(struct master_service *service,
+                                     struct setting_parser_context *parser,
+                                     const char **error_r)
+{
+       const char *const *overrides;
+       unsigned int i, count;
+
+       overrides = array_get(&service->config_overrides, &count);
+       for (i = 0; i < count; i++) {
+               if (settings_parse_line(parser, overrides[i]) < 0) {
+                       *error_r = t_strdup_printf(
+                               "Invalid -o parameter %s: %s", overrides[i],
+                               settings_parser_get_error(parser));
+                       return -1;
+               }
+               settings_parse_set_key_expandeded(parser, service->set_pool,
+                                                 t_strcut(overrides[i], '='));
+       }
+       return 0;
+}
+
 int master_service_settings_read(struct master_service *service,
                                 const struct setting_parser_info *roots[],
                                 const struct dynamic_settings_parser *dyn_parsers,
@@ -187,6 +209,12 @@ int master_service_settings_read(struct master_service *service,
                                                   keys);
        }
 
+       if (array_is_created(&service->config_overrides)) {
+               if (master_service_apply_config_overrides(service, parser,
+                                                         error_r) < 0)
+                       return -1;
+       }
+
        if (!settings_parser_check(parser, service->set_pool, &error)) {
                *error_r = t_strdup_printf("Invalid settings: %s", error);
                return -1;
index 34fd7f8bd59930e759898af6e9c8956e1938979b..27b8ea73dfc8f04a77b1c5487aa396b8c6c651a4 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "lib-signals.h"
 #include "ioloop.h"
+#include "array.h"
 #include "env-util.h"
 #include "home-expand.h"
 #include "restrict-access.h"
@@ -30,7 +31,7 @@ static void master_status_update(struct master_service *service);
 
 const char *master_service_getopt_string(void)
 {
-       return "c:ks:L";
+       return "c:ko:s:L";
 }
 
 static void sig_die(const siginfo_t *si, void *context)
@@ -183,6 +184,11 @@ bool master_service_parse_option(struct master_service *service,
        case 'k':
                service->keep_environment = TRUE;
                break;
+       case 'o':
+               if (!array_is_created(&service->config_overrides))
+                       i_array_init(&service->config_overrides, 16);
+               array_append(&service->config_overrides, &arg, 1);
+               break;
        case 's':
                if ((i = atoi(arg)) < 0)
                        i_fatal("Invalid socket count: %s", arg);
@@ -420,6 +426,8 @@ void master_service_deinit(struct master_service **_service)
                io_remove(&service->io_status_error);
        if (service->io_status_write != NULL)
                io_remove(&service->io_status_write);
+       if (array_is_created(&service->config_overrides))
+               array_free(&service->config_overrides);
 
        lib_signals_deinit();
        io_loop_destroy(&service->ioloop);
index fd1754ba69b5de460db677d051c92c20473a680e..50bfba110fc7f1ff3d053da49d846191640e3b63 100644 (file)
@@ -765,27 +765,32 @@ settings_var_expand_info(const struct setting_parser_info *info,
        }
 }
 
-void settings_parse_set_keys_expandeded(struct setting_parser_context *ctx,
-                                       pool_t pool, const char *const *keys)
+void settings_parse_set_key_expandeded(struct setting_parser_context *ctx,
+                                      pool_t pool, const char *key)
 {
        const struct setting_define *def;
        struct setting_link *link;
        const char **val;
 
-       for (; *keys != NULL; keys++) {
-               if (!settings_find_key(ctx, *keys, &def, &link))
-                       continue;
+       if (!settings_find_key(ctx, key, &def, &link))
+               return;
 
-               val = PTR_OFFSET(link->set_struct, def->offset);
-               if (def->type == SET_STR_VARS && *val != NULL) {
-                       i_assert(**val == SETTING_STRVAR_UNEXPANDED[0] ||
-                                **val == SETTING_STRVAR_EXPANDED[0]);
-                       *val = p_strconcat(pool, SETTING_STRVAR_EXPANDED,
-                                          *val + 1, NULL);
-               }
+       val = PTR_OFFSET(link->set_struct, def->offset);
+       if (def->type == SET_STR_VARS && *val != NULL) {
+               i_assert(**val == SETTING_STRVAR_UNEXPANDED[0] ||
+                        **val == SETTING_STRVAR_EXPANDED[0]);
+               *val = p_strconcat(pool, SETTING_STRVAR_EXPANDED,
+                                  *val + 1, NULL);
        }
 }
 
+void settings_parse_set_keys_expandeded(struct setting_parser_context *ctx,
+                                       pool_t pool, const char *const *keys)
+{
+       for (; *keys != NULL; keys++)
+               settings_parse_set_key_expandeded(ctx, pool, *keys);
+}
+
 void settings_var_expand(const struct setting_parser_info *info,
                         void *set, pool_t pool,
                         const struct var_expand_table *table)
index e7e732fe33206367ba6c8e1a1d70102d269d41b4..781c265c820f783ef6badaf446d44bbf1a272838 100644 (file)
@@ -129,6 +129,8 @@ bool settings_parser_check(struct setting_parser_context *ctx, pool_t pool,
 void settings_parse_set_expanded(struct setting_parser_context *ctx,
                                 bool is_expanded);
 /* Mark all the parsed settings with given keys as being already expanded. */
+void settings_parse_set_key_expandeded(struct setting_parser_context *ctx,
+                                      pool_t pool, const char *key);
 void settings_parse_set_keys_expandeded(struct setting_parser_context *ctx,
                                        pool_t pool, const char *const *keys);
 /* Expand all unexpanded variables using the given table. Update the string