changeset 10119:1e63221f5c83 HEAD

Moved most of getopt() handling to lib-master.
author Timo Sirainen <tss@iki.fi>
date Tue, 20 Oct 2009 20:07:45 -0400
parents 1ae1d47aaef8
children b584904d3bc7
files src/anvil/main.c src/auth/main.c src/config/doveconf.c src/config/main.c src/dict/main.c src/doveadm/doveadm.c src/dsync/dsync.c src/imap/main.c src/lda/main.c src/lib-master/master-service-private.h src/lib-master/master-service.c src/lib-master/master-service.h src/lmtp/main.c src/log/main.c src/login-common/main.c src/master/main.c src/plugins/convert/convert-tool.c src/plugins/expire/expire-tool.c src/pop3/main.c src/ssl-params/main.c
diffstat 20 files changed, 82 insertions(+), 138 deletions(-) [+]
line wrap: on
line diff
--- a/src/anvil/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/anvil/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -8,9 +8,6 @@
 #include "connect-limit.h"
 #include "anvil-connection.h"
 
-#include <stdlib.h>
-#include <unistd.h>
-
 struct connect_limit *connect_limit;
 
 static void client_connected(const struct master_service_connection *conn)
@@ -22,13 +19,9 @@
 
 int main(int argc, char *argv[])
 {
-	int c;
-
-	master_service = master_service_init("anvil", 0, argc, argv);
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	master_service = master_service_init("anvil", 0, argc, argv, NULL);
+	if (master_getopt(master_service) > 0)
+		return FATAL_DEFAULT;
 
 	master_service_set_die_with_master(master_service, TRUE);
 	master_service_init_log(master_service, "anvil: ");
--- a/src/auth/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/auth/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -21,10 +21,6 @@
 #include "auth-master-connection.h"
 #include "auth-client-connection.h"
 
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/un.h>
-
 enum auth_socket_type {
 	AUTH_SOCKET_UNKNOWN = 0,
 	AUTH_SOCKET_CLIENT,
@@ -161,23 +157,18 @@
 
 int main(int argc, char *argv[])
 {
-	const char *getopt_str;
 	int c;
 
-	master_service = master_service_init("auth", 0, argc, argv);
+	master_service = master_service_init("auth", 0, argc, argv, "w");
 	master_service_init_log(master_service, "auth: ");
 
-        getopt_str = t_strconcat("w", master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+	while ((c = master_getopt(master_service)) > 0) {
 		switch (c) {
 		case 'w':
 			worker = TRUE;
 			break;
 		default:
-			if (!master_service_parse_option(master_service,
-							 c, optarg))
-				exit(FATAL_DEFAULT);
-			break;
+			return FATAL_DEFAULT;
 		}
 	}
 
--- a/src/config/doveconf.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/config/doveconf.c	Tue Oct 20 20:07:45 2009 -0400
@@ -13,7 +13,6 @@
 #include "config-request.h"
 
 #include <stdio.h>
-#include <stdlib.h>
 #include <unistd.h>
 
 struct config_request_get_string_ctx {
@@ -225,7 +224,7 @@
 int main(int argc, char *argv[])
 {
 	enum config_dump_scope scope = CONFIG_DUMP_SCOPE_ALL;
-	const char *getopt_str, *config_path, *module = "";
+	const char *config_path, *module = "";
 	struct config_filter filter;
 	const char *error;
 	char **exec_args = NULL;
@@ -234,11 +233,9 @@
 	memset(&filter, 0, sizeof(filter));
 	master_service = master_service_init("config",
 					     MASTER_SERVICE_FLAG_STANDALONE,
-					     argc, argv);
+					     argc, argv, "af:m:nNe");
 	i_set_failure_prefix("doveconf: ");
-	getopt_str = t_strconcat("af:m:nNe",
-				 master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+	while ((c = master_getopt(master_service)) > 0) {
 		if (c == 'e')
 			break;
 		switch (c) {
@@ -257,9 +254,7 @@
 			scope = CONFIG_DUMP_SCOPE_SET;
 			break;
 		default:
-			if (!master_service_parse_option(master_service,
-							 c, optarg))
-				exit(FATAL_DEFAULT);
+			return FATAL_DEFAULT;
 		}
 	}
 	config_path = master_service_get_config_path(master_service);
--- a/src/config/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/config/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -8,9 +8,6 @@
 #include "config-parser.h"
 #include "config-request.h"
 
-#include <stdlib.h>
-#include <unistd.h>
-
 static void client_connected(const struct master_service_connection *conn)
 {
 	config_connection_create(conn->fd);
@@ -19,13 +16,10 @@
 int main(int argc, char *argv[])
 {
 	const char *path, *error;
-	int c;
 
-	master_service = master_service_init("config", 0, argc, argv);
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	master_service = master_service_init("config", 0, argc, argv, NULL);
+	if (master_getopt(master_service) > 0)
+		return FATAL_DEFAULT;
 
 	master_service_init_log(master_service, "config: ");
 	master_service_init_finish(master_service);
--- a/src/dict/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/dict/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -13,9 +13,6 @@
 #include "dict-connection.h"
 #include "dict-settings.h"
 
-#include <stdlib.h>
-#include <unistd.h>
-
 static struct module *modules;
 
 static void client_connected(const struct master_service_connection *conn)
@@ -77,13 +74,10 @@
 		NULL
 	};
 	const char *error;
-	int c;
 
-	master_service = master_service_init("dict", 0, argc, argv);
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	master_service = master_service_init("dict", 0, argc, argv, NULL);
+	if (master_getopt(master_service) > 0)
+		return FATAL_DEFAULT;
 
 	if (master_service_settings_read_simple(master_service, set_roots,
 						&error) < 0)
--- a/src/doveadm/doveadm.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/doveadm/doveadm.c	Tue Oct 20 20:07:45 2009 -0400
@@ -70,12 +70,11 @@
 
 int main(int argc, char *argv[])
 {
-	const char *cmd_name, *getopt_str;
-	int c;
+	const char *cmd_name;
 
 	master_service = master_service_init("doveadm",
 					     MASTER_SERVICE_FLAG_STANDALONE,
-					     argc, argv);
+					     argc, argv, "+");
 	i_array_init(&doveadm_cmds, 32);
 	doveadm_mail_init();
 	doveadm_register_cmd(&doveadm_cmd_help);
@@ -86,11 +85,8 @@
 
 	/* "+" is GNU extension to stop at the first non-option.
 	   others just accept -+ option. */
-	getopt_str = t_strconcat("+", master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			usage();
-	}
+	if (master_getopt(master_service) > 0)
+		usage();
 	if (optind == argc)
 		usage();
 
--- a/src/dsync/dsync.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/dsync/dsync.c	Tue Oct 20 20:07:45 2009 -0400
@@ -72,19 +72,17 @@
 	struct mail_storage_service_input input;
 	struct mail_user *mail_user;
 	struct dsync_worker *worker1, *worker2;
-	const char *getopt_str, *username, *mailbox = NULL, *cmd = NULL;
+	const char *username, *mailbox = NULL, *cmd = NULL;
 	bool dest = TRUE;
 	int c, ret, fd_in = STDIN_FILENO, fd_out = STDOUT_FILENO;
 
 	master_service = master_service_init("dsync",
 					     MASTER_SERVICE_FLAG_STANDALONE |
 					     MASTER_SERVICE_FLAG_STD_CLIENT,
-					     argc, argv);
+					     argc, argv, "b:e:fu:v");
 
 	username = getenv("USER");
-	getopt_str = t_strconcat("b:e:fu:v",
-				 master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+	while ((c = master_getopt(master_service)) > 0) {
 		if (c == '-')
 			break;
 		switch (c) {
@@ -105,9 +103,7 @@
 			brain_flags |= DSYNC_BRAIN_FLAG_VERBOSE;
 			break;
 		default:
-			if (!master_service_parse_option(master_service,
-							 c, optarg))
-				usage();
+			usage();
 		}
 	}
 	if (optind != argc)
--- a/src/imap/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/imap/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -201,7 +201,6 @@
 int main(int argc, char *argv[], char *envp[])
 {
 	enum master_service_flags service_flags = 0;
-	int c;
 
 	if (IS_STANDALONE() && getuid() == 0 &&
 	    net_getpeername(1, NULL, NULL) == 0) {
@@ -218,11 +217,10 @@
 			MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
 	}
 
-	master_service = master_service_init("imap", service_flags, argc, argv);
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	master_service = master_service_init("imap", service_flags,
+					     argc, argv, NULL);
+	if (master_getopt(master_service) > 0)
+		exit(FATAL_DEFAULT);
         process_title_init(argv, envp);
 	master_service_init_finish(master_service);
 
--- a/src/lda/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/lda/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -244,7 +244,7 @@
 	};
 	struct mail_deliver_context ctx;
 	enum mail_storage_service_flags service_flags = 0;
-	const char *user, *errstr, *path, *getopt_str;
+	const char *user, *errstr, *path;
 	struct mail_storage_service_input service_input;
 	struct mail_user *raw_mail_user;
 	struct mail_namespace *raw_ns;
@@ -287,7 +287,7 @@
 	master_service = master_service_init("lda",
 		MASTER_SERVICE_FLAG_STANDALONE |
 		MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR,
-		argc, argv);
+		argc, argv, "a:d:p:ekm:nsf:");
 
 	memset(&ctx, 0, sizeof(ctx));
 	ctx.pool = pool_alloconly_create("mail deliver context", 256);
@@ -295,9 +295,7 @@
 	path = NULL;
 
 	user = getenv("USER");
-	getopt_str = t_strconcat("a:d:p:ekm:nsf:",
-				 master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+	while ((c = master_getopt(master_service)) > 0) {
 		switch (c) {
 		case 'a':
 			/* destination address */
@@ -341,12 +339,8 @@
 				p_strdup(ctx.pool, address_sanitize(optarg));
 			break;
 		default:
-			if (!master_service_parse_option(master_service,
-							 c, optarg)) {
-				print_help();
-				exit(EX_USAGE);
-			}
-			break;
+			print_help();
+			return EX_USAGE;
 		}
 	}
 	if (optind != argc) {
--- a/src/lib-master/master-service-private.h	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/lib-master/master-service-private.h	Tue Oct 20 20:07:45 2009 -0400
@@ -15,7 +15,8 @@
 	struct ioloop *ioloop;
 
 	char *name;
-        enum master_service_flags flags;
+	char *getopt_str;
+	enum master_service_flags flags;
 
 	int argc;
 	char **argv;
--- a/src/lib-master/master-service.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/lib-master/master-service.c	Tue Oct 20 20:07:45 2009 -0400
@@ -78,7 +78,7 @@
 
 struct master_service *
 master_service_init(const char *name, enum master_service_flags flags,
-		    int argc, char *argv[])
+		    int argc, char *argv[], const char *getopt_str)
 {
 	struct master_service *service;
 	const char *str;
@@ -110,6 +110,8 @@
 	service->argc = argc;
 	service->argv = argv;
 	service->name = i_strdup(name);
+	service->getopt_str =
+		i_strconcat(master_service_getopt_string(), getopt_str, NULL);
 	service->flags = flags;
 	service->ioloop = io_loop_create();
 	service->service_count_left = (unsigned int)-1;
@@ -147,6 +149,18 @@
 	return service;
 }
 
+int master_getopt(struct master_service *service)
+{
+	int c;
+
+	while ((c = getopt(service->argc, service->argv,
+			   service->getopt_str)) > 0) {
+		if (!master_service_parse_option(service, c, optarg))
+			break;
+	}
+	return c;
+}
+
 void master_service_init_log(struct master_service *service,
 			     const char *prefix)
 {
@@ -569,6 +583,7 @@
 	io_loop_destroy(&service->ioloop);
 
 	i_free(service->listeners);
+	i_free(service->getopt_str);
 	i_free(service->name);
 	i_free(service);
 
--- a/src/lib-master/master-service.h	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/lib-master/master-service.h	Tue Oct 20 20:07:45 2009 -0400
@@ -43,7 +43,10 @@
 /* Start service initialization. */
 struct master_service *
 master_service_init(const char *name, enum master_service_flags flags,
-		    int argc, char *argv[]);
+		    int argc, char *argv[], const char *getopt_str);
+/* Call getopt() and handle internal parameters. Return values are the same as
+   getopt()'s. */
+int master_getopt(struct master_service *service);
 /* Parser command line option. Returns TRUE if processed. */
 bool master_service_parse_option(struct master_service *service,
 				 int opt, const char *arg);
--- a/src/lmtp/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/lmtp/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -63,18 +63,16 @@
 	enum mail_storage_service_flags storage_service_flags =
 		MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT |
 		MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
-	int c;
 
 	if (IS_STANDALONE()) {
 		service_flags |= MASTER_SERVICE_FLAG_STANDALONE |
 			MASTER_SERVICE_FLAG_STD_CLIENT;
 	}
 
-	master_service = master_service_init("lmtp", service_flags, argc, argv);
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	master_service = master_service_init("lmtp", service_flags,
+					     argc, argv, NULL);
+	if (master_getopt(master_service) > 0)
+		return FATAL_DEFAULT;
 
 	multi_service = mail_storage_service_multi_init(master_service,
 							set_roots,
--- a/src/log/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/log/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -7,7 +7,6 @@
 #include "master-service-settings.h"
 #include "log-connection.h"
 
-#include <stdlib.h>
 #include <unistd.h>
 
 pid_t master_pid;
@@ -39,18 +38,15 @@
 int main(int argc, char *argv[])
 {
 	const char *error;
-	int c;
 
-	master_service = master_service_init("log", 0, argc, argv);
+	master_service = master_service_init("log", 0, argc, argv, NULL);
 
 	/* use log prefix and log to stderr until we've configured the real
 	   logging */
 	i_set_failure_file("/dev/stderr", "log: ");
 
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	if (master_getopt(master_service) > 0)
+		return FATAL_DEFAULT;
 
 	if (master_service_settings_read_simple(master_service,
 						NULL, &error) < 0)
--- a/src/login-common/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/login-common/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -171,18 +171,16 @@
 	enum master_service_flags service_flags =
 		MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN |
 		MASTER_SERVICE_FLAG_TRACK_LOGIN_STATE;
-	const char *getopt_str;
 	pool_t set_pool;
 	bool allow_core_dumps = FALSE;
 	int c;
 
 	master_service = master_service_init(login_process_name, service_flags,
-					     argc, argv);
+					     argc, argv, "DS");
 	master_service_init_log(master_service, t_strconcat(
 		login_process_name, ": ", NULL));
 
-        getopt_str = t_strconcat("DS", master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+	while ((c = master_getopt(master_service)) > 0) {
 		switch (c) {
 		case 'D':
 			allow_core_dumps = TRUE;
@@ -191,10 +189,7 @@
 			ssl_connections = TRUE;
 			break;
 		default:
-			if (!master_service_parse_option(master_service,
-							 c, optarg))
-				exit(FATAL_DEFAULT);
-			break;
+			return FATAL_DEFAULT;
 		}
 	}
 
--- a/src/master/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/master/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -591,7 +591,7 @@
 {
 	struct master_settings *set;
 	unsigned int child_process_env_idx = 0;
-	const char *getopt_str, *error, *env_tz, *doveconf_arg = NULL;
+	const char *error, *env_tz, *doveconf_arg = NULL;
 	failure_callback_t *orig_info_callback, *orig_debug_callback;
 	void **sets;
 	bool foreground = FALSE, ask_key_pass = FALSE, log_error = FALSE;
@@ -606,7 +606,7 @@
 	master_service = master_service_init(MASTER_SERVICE_NAME,
 				MASTER_SERVICE_FLAG_STANDALONE |
 				MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR,
-				argc, argv);
+				argc, argv, "Fanp-");
 	i_set_failure_prefix("");
 
 	io_loop_set_time_moved_callback(current_ioloop, master_time_moved);
@@ -614,8 +614,7 @@
 	master_uid = geteuid();
 	master_gid = getegid();
 
-	getopt_str = t_strconcat("Fanp-", master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+	while ((c = master_getopt(master_service)) > 0) {
 		if (c == '-')
 			break;
 		switch (c) {
--- a/src/plugins/convert/convert-tool.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/plugins/convert/convert-tool.c	Tue Oct 20 20:07:45 2009 -0400
@@ -23,16 +23,14 @@
 	struct mail_namespace *dest_ns;
 	struct mail_namespace_settings ns_set;
 	const char *error;
-	int i, c, ret = 0;
+	int i, ret = 0;
 
 	master_service = master_service_init("convert-tool",
 					     MASTER_SERVICE_FLAG_STANDALONE,
-					     argc, argv);
+					     argc, argv, NULL);
 
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			i_fatal(USAGE_STRING);
-	}
+	if (master_getopt(master_service) > 0)
+		i_fatal(USAGE_STRING);
 	if (argc - optind < 4)
 		i_fatal(USAGE_STRING);
 
--- a/src/plugins/expire/expire-tool.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/plugins/expire/expire-tool.c	Tue Oct 20 20:07:45 2009 -0400
@@ -312,25 +312,20 @@
 
 int main(int argc, char *argv[])
 {
-	const char *getopt_str;
 	bool test = FALSE;
 	int c;
 
 	master_service = master_service_init("expire-tool",
 					     MASTER_SERVICE_FLAG_STANDALONE,
-					     argc, argv);
+					     argc, argv, "t");
 
-	getopt_str = t_strconcat("t", master_service_getopt_string(), NULL);
-	while ((c = getopt(argc, argv, getopt_str)) > 0) {
+	while ((c = master_getopt(master_service)) > 0) {
 		switch (c) {
 		case 't':
 			test = TRUE;
 			break;
 		default:
-			if (!master_service_parse_option(master_service,
-							 c, optarg))
-				i_fatal("Unknown parameter: -%c", c);
-			break;
+			return FATAL_DEFAULT;
 		}
 	}
 	if (optind != argc)
--- a/src/pop3/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/pop3/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -164,7 +164,6 @@
 int main(int argc, char *argv[], char *envp[])
 {
 	enum master_service_flags service_flags = 0;
-	int c;
 
 	if (IS_STANDALONE() && getuid() == 0 &&
 	    net_getpeername(1, NULL, NULL) == 0) {
@@ -181,11 +180,10 @@
 			MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
 	}
 
-	master_service = master_service_init("pop3", service_flags, argc, argv);
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	master_service = master_service_init("pop3", service_flags,
+					     argc, argv, NULL);
+	if (master_getopt(master_service) > 0)
+		return FATAL_DEFAULT;
         process_title_init(argv, envp);
 	master_service_init_finish(master_service);
 
--- a/src/ssl-params/main.c	Tue Oct 20 19:44:57 2009 -0400
+++ b/src/ssl-params/main.c	Tue Oct 20 20:07:45 2009 -0400
@@ -8,8 +8,6 @@
 #include "ssl-params-settings.h"
 #include "ssl-params.h"
 
-#include <stdlib.h>
-#include <unistd.h>
 #include <sys/wait.h>
 
 #define SSL_BUILD_PARAM_FNAME "ssl-parameters.dat"
@@ -117,15 +115,12 @@
 int main(int argc, char *argv[])
 {
 	const struct ssl_params_settings *set;
-	int c;
 
-	master_service = master_service_init("ssl-params", 0, argc, argv);
+	master_service = master_service_init("ssl-params", 0, argc, argv, NULL);
 	master_service_init_log(master_service, "ssl-params: ");
 
-	while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
-		if (!master_service_parse_option(master_service, c, optarg))
-			exit(FATAL_DEFAULT);
-	}
+	if (master_getopt(master_service) > 0)
+		return FATAL_DEFAULT;
 
 	set = ssl_params_settings_read(master_service);
 	master_service_init_finish(master_service);