diff src/config/main.c @ 9159:6324a79d3ee1 HEAD

Initial commit for v2.0 master rewrite. Several features are still missing.
author Timo Sirainen <tss@iki.fi>
date Thu, 23 Apr 2009 19:53:44 -0400
parents 81ff88345441
children f8460b27db00
line wrap: on
line diff
--- a/src/config/main.c	Thu Apr 23 14:07:45 2009 -0400
+++ b/src/config/main.c	Thu Apr 23 19:53:44 2009 -0400
@@ -1,11 +1,9 @@
 /* Copyright (C) 2005-2009 Dovecot authors, see the included COPYING file */
 
 #include "common.h"
-#include "lib-signals.h"
-#include "ioloop.h"
 #include "array.h"
 #include "env-util.h"
-#include "str.h"
+#include "master-service.h"
 #include "config-connection.h"
 #include "config-parser.h"
 
@@ -14,59 +12,62 @@
 
 ARRAY_TYPE(const_string) config_strings;
 
-static const char *config_path = SYSCONFDIR "/" PACKAGE ".conf";
+static struct master_service *service;
 static pool_t config_pool;
 
-static void main_init(const char *service)
+static void main_init(const char *service_name)
 {
-	if (getenv("LOG_TO_MASTER") != NULL)
-		i_set_failure_internal();
-
 	config_pool = pool_alloconly_create("config parser", 10240);
 	p_array_init(&config_strings, config_pool, 256);
-	config_parse_file(config_pool, &config_strings, config_path, service);
+	config_parse_file(config_pool, &config_strings,
+			  master_service_get_config_path(service),
+			  service_name);
+}
+
+static void client_connected(const struct master_service_connection *conn)
+{
+	config_connection_create(conn->fd);
 }
 
 int main(int argc, char *argv[])
 {
 	enum config_dump_flags flags = 0;
-	struct ioloop *ioloop;
-	const char *service = "";
+	const char *getopt_str, *service_name = "";
 	char **exec_args = NULL;
-	int i;
+	int c;
+
+	service = master_service_init("config", 0, argc, argv);
 
-	lib_init();
-
-	for (i = 1; i < argc; i++) {
-		if (strcmp(argv[i], "-a") == 0) {
+	getopt_str = t_strconcat("anp:e", master_service_getopt_string(), NULL);
+	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+		if (c == 'e')
+			break;
+		switch (c) {
+		case 'a':
 			flags |= CONFIG_DUMP_FLAG_HUMAN |
 				CONFIG_DUMP_FLAG_DEFAULTS;
-		} 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) {
+			break;
+		case 'n':
 			flags |= CONFIG_DUMP_FLAG_HUMAN;
-		} 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;
+		case 'p':
+			service_name = optarg;
 			break;
-		} else {
-			i_fatal("Unknown parameter: %s", argv[i]);
+		default:
+			if (!master_service_parse_option(service, c, optarg))
+				exit(FATAL_DEFAULT);
 		}
 	}
+	if (argv[optind] != NULL)
+		exec_args = &argv[optind];
 
-	main_init(service);
-	ioloop = io_loop_create();
-	if (exec_args == NULL)
+	master_service_init_log(service, "doveconf: ", 0);
+	master_service_init_finish(service);
+	main_init(service_name);
+
+	if (master_service_get_socket_count(service) > 0)
+		master_service_run(service, client_connected);
+	else if (exec_args == NULL)
 		config_connection_dump_request(STDOUT_FILENO, "master", flags);
 	else {
 		config_connection_putenv();
@@ -74,8 +75,8 @@
 		execvp(exec_args[0], exec_args);
 		i_fatal("execvp(%s) failed: %m", exec_args[0]);
 	}
+	config_connections_destroy_all();
 	pool_unref(&config_pool);
-	io_loop_destroy(&ioloop);
-	lib_deinit();
+	master_service_deinit(&service);
         return 0;
 }