From: Timo Sirainen Date: Wed, 21 Oct 2009 00:07:45 +0000 (-0400) Subject: Moved most of getopt() handling to lib-master. X-Git-Tag: 2.0.alpha2~44 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=578ef2538ccf42e2a48234c24a8b709397101d88;p=thirdparty%2Fdovecot%2Fcore.git Moved most of getopt() handling to lib-master. --HG-- branch : HEAD --- diff --git a/src/anvil/main.c b/src/anvil/main.c index 57e2de41c5..726158d61a 100644 --- a/src/anvil/main.c +++ b/src/anvil/main.c @@ -8,9 +8,6 @@ #include "connect-limit.h" #include "anvil-connection.h" -#include -#include - struct connect_limit *connect_limit; static void client_connected(const struct master_service_connection *conn) @@ -22,13 +19,9 @@ static void client_connected(const struct master_service_connection *conn) 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: "); diff --git a/src/auth/main.c b/src/auth/main.c index 27b89de2c1..198b62c25d 100644 --- a/src/auth/main.c +++ b/src/auth/main.c @@ -21,10 +21,6 @@ #include "auth-master-connection.h" #include "auth-client-connection.h" -#include -#include -#include - enum auth_socket_type { AUTH_SOCKET_UNKNOWN = 0, AUTH_SOCKET_CLIENT, @@ -161,23 +157,18 @@ static void client_connected(const struct master_service_connection *conn) 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; } } diff --git a/src/config/doveconf.c b/src/config/doveconf.c index fff0005cae..df1c83dbb2 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -13,7 +13,6 @@ #include "config-request.h" #include -#include #include struct config_request_get_string_ctx { @@ -225,7 +224,7 @@ static void filter_parse_arg(struct config_filter *filter, const char *arg) 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 @@ int main(int argc, char *argv[]) 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 @@ int main(int argc, char *argv[]) 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); diff --git a/src/config/main.c b/src/config/main.c index 25cda4a1ef..ddb6a09958 100644 --- a/src/config/main.c +++ b/src/config/main.c @@ -8,9 +8,6 @@ #include "config-parser.h" #include "config-request.h" -#include -#include - static void client_connected(const struct master_service_connection *conn) { config_connection_create(conn->fd); @@ -19,13 +16,10 @@ static void client_connected(const struct master_service_connection *conn) 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); diff --git a/src/dict/main.c b/src/dict/main.c index 8ca3ba0cdc..92c010b7ee 100644 --- a/src/dict/main.c +++ b/src/dict/main.c @@ -13,9 +13,6 @@ #include "dict-connection.h" #include "dict-settings.h" -#include -#include - static struct module *modules; static void client_connected(const struct master_service_connection *conn) @@ -77,13 +74,10 @@ int main(int argc, char *argv[]) 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) diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index b0ce1ac15d..6a6a1527a3 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -70,12 +70,11 @@ static bool doveadm_try_run(const char *cmd_name, int argc, char *argv[]) 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 @@ int main(int argc, char *argv[]) /* "+" 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(); diff --git a/src/dsync/dsync.c b/src/dsync/dsync.c index c8887035f2..e6cdc6e8ae 100644 --- a/src/dsync/dsync.c +++ b/src/dsync/dsync.c @@ -72,19 +72,17 @@ int main(int argc, char *argv[]) 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 @@ int main(int argc, char *argv[]) brain_flags |= DSYNC_BRAIN_FLAG_VERBOSE; break; default: - if (!master_service_parse_option(master_service, - c, optarg)) - usage(); + usage(); } } if (optind != argc) diff --git a/src/imap/main.c b/src/imap/main.c index ce48d48c04..2587c1de1c 100644 --- a/src/imap/main.c +++ b/src/imap/main.c @@ -201,7 +201,6 @@ static void client_connected(const struct master_service_connection *conn) 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 @@ int main(int argc, char *argv[], char *envp[]) 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); diff --git a/src/lda/main.c b/src/lda/main.c index ec0b9d5554..55d5b490ad 100644 --- a/src/lda/main.c +++ b/src/lda/main.c @@ -244,7 +244,7 @@ int main(int argc, char *argv[]) }; 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 @@ int main(int argc, char *argv[]) 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 @@ int main(int argc, char *argv[]) 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 @@ int main(int argc, char *argv[]) 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) { diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index 996b3adc0a..0e3c04828d 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -15,7 +15,8 @@ struct master_service { struct ioloop *ioloop; char *name; - enum master_service_flags flags; + char *getopt_str; + enum master_service_flags flags; int argc; char **argv; diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 0f425ec5ea..9eed3a1799 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -78,7 +78,7 @@ static void master_service_verify_version(struct master_service *service) 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 @@ master_service_init(const char *name, enum master_service_flags flags, 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 @@ master_service_init(const char *name, enum master_service_flags flags, 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 @@ void master_service_deinit(struct master_service **_service) io_loop_destroy(&service->ioloop); i_free(service->listeners); + i_free(service->getopt_str); i_free(service->name); i_free(service); diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index f4cd867522..3250f05105 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -43,7 +43,10 @@ const char *master_service_getopt_string(void); /* 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); diff --git a/src/lmtp/main.c b/src/lmtp/main.c index 0e14f6b733..4a2329d046 100644 --- a/src/lmtp/main.c +++ b/src/lmtp/main.c @@ -63,18 +63,16 @@ int main(int argc, char *argv[], char *envp[]) 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, diff --git a/src/log/main.c b/src/log/main.c index d1abb609bc..bcf7ac3b65 100644 --- a/src/log/main.c +++ b/src/log/main.c @@ -7,7 +7,6 @@ #include "master-service-settings.h" #include "log-connection.h" -#include #include pid_t master_pid; @@ -39,18 +38,15 @@ static void client_connected(const struct master_service_connection *conn) 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) diff --git a/src/login-common/main.c b/src/login-common/main.c index e30d50f23a..ec49daf76b 100644 --- a/src/login-common/main.c +++ b/src/login-common/main.c @@ -171,18 +171,16 @@ int main(int argc, char *argv[], char *envp[]) 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 @@ int main(int argc, char *argv[], char *envp[]) ssl_connections = TRUE; break; default: - if (!master_service_parse_option(master_service, - c, optarg)) - exit(FATAL_DEFAULT); - break; + return FATAL_DEFAULT; } } diff --git a/src/master/main.c b/src/master/main.c index 43f9a721b5..ca59268b44 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -591,7 +591,7 @@ int main(int argc, char *argv[]) { 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 @@ int main(int argc, char *argv[]) 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 @@ int main(int argc, char *argv[]) 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) { diff --git a/src/plugins/convert/convert-tool.c b/src/plugins/convert/convert-tool.c index c8ae5548fc..ae430f523a 100644 --- a/src/plugins/convert/convert-tool.c +++ b/src/plugins/convert/convert-tool.c @@ -23,16 +23,14 @@ int main(int argc, char *argv[]) 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); diff --git a/src/plugins/expire/expire-tool.c b/src/plugins/expire/expire-tool.c index 90d47d851a..6951b470c2 100644 --- a/src/plugins/expire/expire-tool.c +++ b/src/plugins/expire/expire-tool.c @@ -312,25 +312,20 @@ static void expire_run(struct master_service *service, bool testrun) 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) diff --git a/src/pop3/main.c b/src/pop3/main.c index d6f909ae7c..b7e2efc609 100644 --- a/src/pop3/main.c +++ b/src/pop3/main.c @@ -164,7 +164,6 @@ static void client_connected(const struct master_service_connection *conn) 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 @@ int main(int argc, char *argv[], char *envp[]) 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); diff --git a/src/ssl-params/main.c b/src/ssl-params/main.c index dbbeafa33f..aaa340aef1 100644 --- a/src/ssl-params/main.c +++ b/src/ssl-params/main.c @@ -8,8 +8,6 @@ #include "ssl-params-settings.h" #include "ssl-params.h" -#include -#include #include #define SSL_BUILD_PARAM_FNAME "ssl-parameters.dat" @@ -117,15 +115,12 @@ static void main_deinit(void) 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);