Mercurial > dovecot > core-2.2
diff src/config/main.c @ 9013:8b616cc6d848 HEAD
Added dovecof --exec and made deliver use it instead of forking.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 09 Feb 2009 19:38:02 -0500 |
parents | 9d0037a997f4 |
children | fb8f4adc61c4 |
line wrap: on
line diff
--- a/src/config/main.c Mon Feb 09 19:37:17 2009 -0500 +++ b/src/config/main.c Mon Feb 09 19:38:02 2009 -0500 @@ -1,8 +1,9 @@ -/* Copyright (C) 2005-2008 Timo Sirainen */ +/* Copyright (C) 2005-2009 Dovecot authors, see the included COPYING file */ #include "common.h" #include "lib-signals.h" #include "ioloop.h" +#include "env-util.h" #include "str.h" #include "config-connection.h" #include "config-parser.h" @@ -17,7 +18,8 @@ static void main_init(const char *service) { - i_set_failure_internal(); + if (getenv("LOG_TO_MASTER") != NULL) + i_set_failure_internal(); parsers_pool = pool_alloconly_create("parent parsers", 2048); config_parsers_fix_parents(parsers_pool); @@ -30,39 +32,51 @@ int main(int argc, char *argv[]) { struct ioloop *ioloop; - const char *path, *service = ""; + const char *service = ""; + char **exec_args = NULL; bool dump_nondefaults = FALSE, human_readable = FALSE; - int c; + int i; lib_init(); - path = getenv("CONFIG_FILE_PATH"); - if (path != NULL) - config_path = path; - - while ((c = getopt(argc, argv, "c:s:na")) > 0) { - switch (c) { - case 'c': - config_path = optarg; - break; - case 's': - service = optarg; - break; - case 'n': - dump_nondefaults = TRUE; - /* fall through */ - case 'a': + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-a") == 0) { /* FIXME: make it work */ human_readable = TRUE; + } else if (strcmp(argv[i], "-c") == 0) { + /* config file */ + i++; + if (i == argc) i_fatal("Missing config file argument"); + config_path = argv[i]; + } else if (strcmp(argv[i], "-n") == 0) { + dump_nondefaults = TRUE; + human_readable = TRUE; + } else if (strcmp(argv[i], "-s") == 0) { + /* service */ + i++; + if (i == argc) i_fatal("Missing service argument"); + service = argv[i]; + } else if (strcmp(argv[i], "--exec") == 0) { + /* <command> [<args>] */ + i++; + if (i == argc) i_fatal("Missing exec binary argument"); + exec_args = &argv[i]; break; - default: - i_fatal("Unknown parameter: %c", c); + } else { + i_fatal("Unknown parameter: %s", argv[i]); } } main_init(service); ioloop = io_loop_create(); - config_connection_dump_request(STDOUT_FILENO, "master"); + if (exec_args == NULL) + config_connection_dump_request(STDOUT_FILENO, "master"); + else { + config_connection_putenv(); + env_put("DOVECONF_ENV=1"); + execvp(exec_args[0], exec_args); + i_fatal("execvp(%s) failed: %m", exec_args[0]); + } io_loop_destroy(&ioloop); lib_deinit(); return 0;