From f0a655e9db3a46ab3f0c8bba7af548ff440ab98e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 19 Jul 2013 18:42:58 +0200 Subject: Nicer command line option specification --- src/config.c | 90 ++++++++++++++++++++---------------------------------------- 1 file changed, 29 insertions(+), 61 deletions(-) (limited to 'src/config.c') diff --git a/src/config.c b/src/config.c index 95e22db..16a9a80 100644 --- a/src/config.c +++ b/src/config.c @@ -552,39 +552,6 @@ static void count_peers(fastd_context_t *ctx, fastd_config_t *conf) { } } - -#define OPTIONS \ - OPTION(usage, "--help" OR "-h", "Shows this help text") \ - OPTION(version, "--version" OR "-v", "Shows the fastd version") \ - OPTION(option_daemon, "--daemon" OR "-d", "Runs fastd in the background") \ - OPTION_ARG(option_user, "--user", "", "Sets the user to run fastd as") \ - OPTION_ARG(option_group, "--group", "", "Sets the group to run fastd as") \ - OPTION_ARG(option_pid_file, "--pid-file", "", "Writes fastd's PID to the specified file") \ - OPTION_ARG(option_log_level, "--log-level", "error|warn|info|verbose|debug", "Sets the stderr log level; default is info, if no alternative log destination is configured") \ - OPTION_ARG(option_syslog_level, "--syslog-level", "error|warn|info|verbose|debug", "Sets the log level for syslog output; default is not to use syslog") \ - OPTION_ARG(option_syslog_ident, "--syslog-ident", "", "Sets the syslog identification; default is 'fastd'") \ - OPTION(option_hide_ip_addresses, "--hide-ip-addresses", "Hides IP addresses in log output") \ - OPTION(option_hide_mac_addresses, "--hide-mac-addresses", "Hides MAC addresses in log output") \ - OPTION_ARG(option_config, "--config" OR "-c", "", "Loads a config file") \ - OPTION_ARG(option_config_peer, "--config-peer", "", "Loads a config file for a single peer") \ - OPTION_ARG(option_config_peer_dir, "--config-peer-dir", "", "Loads all files from a directory as peer configs") \ - OPTION_ARG(option_mode, "--mode" OR "-m", "tap|tun", "Sets the mode of the interface") \ - OPTION_ARG(option_interface, "--interface" OR "-i", "", "Sets the name of the TUN/TAP interface to use") \ - OPTION_ARG(option_mtu, "--mtu" OR "-M", "", "Sets the MTU; must be at least 576") \ - OPTION_ARG(option_bind, "--bind" OR "-b", "
:", "Sets the bind address") \ - OPTION_ARG(option_protocol, "--protocol" OR "-p", "", "Sets the protocol") \ - OPTION_ARG(option_method, "--method", "", "Sets the encryption method") \ - OPTION(option_forward, "--forward", "Enables forwarding of packets between peers; read the documentation before use!") \ - OPTION_ARG(option_on_up, "--on-up", "", "Sets a shell command to execute after interface creation") \ - OPTION_ARG(option_on_down, "--on-down", "", "Sets a shell command to execute before interface destruction") \ - OPTION_ARG(option_on_establish, "--on-establish", "", "Sets a shell command to execute when a new connection is established") \ - OPTION_ARG(option_on_disestablish, "--on-disestablish", "", "Sets a shell command to execute when a connection is lost") \ - OPTION_ARG(option_on_verify, "--on-verify", "", "Sets a shell command to execute to check a connection attempt by an unknown peer") \ - OPTION(option_generate_key, "--generate-key", "Generates a new keypair") \ - OPTION(option_show_key, "--show-key", "Shows the public key corresponding to the configured secret") \ - OPTION(option_machine_readable, "--machine-readable", "Suppresses output of explaining text in the --show-key and --generate-key commands") - - static void print_usage(const char *options, const char *message) { /* 28 spaces */ static const char spaces[] = " "; @@ -602,18 +569,17 @@ static void print_usage(const char *options, const char *message) { } static void usage(fastd_context_t *ctx, fastd_config_t *conf) { -#define OR ", " -#define OPTION(func, options, message) print_usage(" " options, message); -#define OPTION_ARG(func, options, arg, message) print_usage(" " options " " arg, message); - puts("fastd (Fast and Secure Tunnelling Daemon) " FASTD_VERSION " usage:\n"); - OPTIONS - exit(0); - +#define OR ", " +#define OPTION(func, options, message) print_usage(" " options, message) +#define OPTION_ARG(func, options, arg, message) print_usage(" " options " " arg, message) +#include "options.def.h" #undef OR #undef OPTION #undef OPTION_ARG + + exit(0); } static void version(fastd_context_t *ctx, fastd_config_t *conf) { @@ -913,27 +879,33 @@ static void configure_user(fastd_context_t *ctx, fastd_config_t *conf) { } void fastd_configure(fastd_context_t *ctx, fastd_config_t *conf, int argc, char *const argv[]) { -#define OR , -#define OPTION(func, options, message) \ - if(config_match(argv[i], options, NULL)) { \ - i++; \ - func(ctx, conf); \ - continue; \ - } -#define OPTION_ARG(func, options, arg, message) \ - if(config_match(argv[i], options, NULL)) { \ - i+=2; \ - if (i > argc) \ - exit_error(ctx, "config error: option `%s' needs an argument; see --help for usage", argv[i-2]); \ - func(ctx, conf, argv[i-1]); \ - continue; \ - } - default_config(conf); int i = 1; while (i < argc) { - OPTIONS +#define OR , +#define OPTION(func, options, message) \ + ({ \ + if(config_match(argv[i], options, NULL)) { \ + i++; \ + func(ctx, conf); \ + continue; \ + } \ + }) +#define OPTION_ARG(func, options, arg, message) \ + ({ \ + if(config_match(argv[i], options, NULL)) { \ + i+=2; \ + if (i > argc) \ + exit_error(ctx, "config error: option `%s' needs an argument; see --help for usage", argv[i-2]); \ + func(ctx, conf, argv[i-1]); \ + continue; \ + } \ + }) +#include "options.def.h" +#undef OR +#undef OPTION +#undef OPTION_ARG exit_error(ctx, "config error: unknown option `%s'; see --help for usage", argv[i]); } @@ -960,10 +932,6 @@ void fastd_configure(fastd_context_t *ctx, fastd_config_t *conf, int argc, char exit_error(ctx, "config error: neither fixed peers nor peer dirs have been configured"); configure_user(ctx, conf); - -#undef OR -#undef OPTION -#undef OPTION_ARG } static void peer_dirs_read_peer_group(fastd_context_t *ctx, fastd_config_t *new_conf) { -- cgit v1.2.3