From 9284f998cb1f3e8fafcfd338b328f3d0c35ac179 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 15 Mar 2017 09:39:46 +0100 Subject: [PATCH] getopt major style fix, remove macro-mania with nicer typed functions --- po/POTFILES.in | 19 +- src/include/gnunet_getopt_lib.h | 286 +++++++++----------- src/util/getopt_helpers.c | 450 +++++++++++++++++++++++++++++--- src/util/gnunet-config.c | 58 ++-- src/util/gnunet-ecc.c | 56 ++-- src/util/gnunet-resolver.c | 9 +- src/util/gnunet-scrypt.c | 41 +-- src/util/service.c | 7 +- src/util/service_new.c | 7 +- 9 files changed, 652 insertions(+), 281 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index aea7d5ef7..b0fae9dbe 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -37,31 +37,19 @@ src/block/block.c src/block/plugin_block_template.c src/block/plugin_block_test.c src/cadet/cadet_api.c -src/cadet/cadet_api_new.c -src/cadet/cadet_common.c -src/cadet/cadet_path.c src/cadet/cadet_test_lib.c -src/cadet/cadet_test_lib_new.c src/cadet/desirability_table.c src/cadet/gnunet-cadet.c src/cadet/gnunet-cadet-profiler.c src/cadet/gnunet-service-cadet.c src/cadet/gnunet-service-cadet_channel.c src/cadet/gnunet-service-cadet_connection.c +src/cadet/gnunet-service-cadet_core.c src/cadet/gnunet-service-cadet_dht.c src/cadet/gnunet-service-cadet_hello.c -src/cadet/gnunet-service-cadet_local.c -src/cadet/gnunet-service-cadet-new.c -src/cadet/gnunet-service-cadet-new_channel.c -src/cadet/gnunet-service-cadet-new_connection.c -src/cadet/gnunet-service-cadet-new_core.c -src/cadet/gnunet-service-cadet-new_dht.c -src/cadet/gnunet-service-cadet-new_hello.c -src/cadet/gnunet-service-cadet-new_paths.c -src/cadet/gnunet-service-cadet-new_peer.c -src/cadet/gnunet-service-cadet-new_tunnels.c +src/cadet/gnunet-service-cadet_paths.c src/cadet/gnunet-service-cadet_peer.c -src/cadet/gnunet-service-cadet_tunnel.c +src/cadet/gnunet-service-cadet_tunnels.c src/consensus/consensus_api.c src/consensus/gnunet-consensus-profiler.c src/consensus/gnunet-service-consensus.c @@ -165,7 +153,6 @@ src/fs/gnunet-service-fs_cadet_client.c src/fs/gnunet-service-fs_cadet_server.c src/fs/gnunet-service-fs_cp.c src/fs/gnunet-service-fs_indexing.c -src/fs/gnunet-service-fs_lc.c src/fs/gnunet-service-fs_pe.c src/fs/gnunet-service-fs_pr.c src/fs/gnunet-service-fs_push.c diff --git a/src/include/gnunet_getopt_lib.h b/src/include/gnunet_getopt_lib.h index b04020a70..cd546905e 100644 --- a/src/include/gnunet_getopt_lib.h +++ b/src/include/gnunet_getopt_lib.h @@ -97,6 +97,7 @@ typedef int const char *option, const char *value); + /** * @brief Definition of a command line option. */ @@ -141,244 +142,215 @@ struct GNUNET_GETOPT_CommandLineOption }; + /** - * Macro defining the option to print the command line + * Defining the option to print the command line * help text (-h option). * * @param about string with brief description of the application */ -#define GNUNET_GETOPT_OPTION_HELP(about) \ - { 'h', "help", (const char *) NULL, gettext_noop("print this help"), 0, &GNUNET_GETOPT_format_help_, (void *) about } +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_HELP (const char *about); /** - * Macro defining the option to print the version of + * Define the option to print the version of * the application (-v option) * * @param version string with the version number */ -#define GNUNET_GETOPT_OPTION_VERSION(version) \ - { 'v', "version", (const char *) NULL, gettext_noop("print the version number"), 0, &GNUNET_GETOPT_print_version_, (void *) version } +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_VERSION (const char *version); + /** * Allow user to specify log file name (-l option) * - * @param logfn set to the name of the logfile + * @param[out] logfn set to the name of the logfile */ -#define GNUNET_GETOPT_OPTION_LOGFILE(logfn) \ - { 'l', "logfile", "LOGFILE", gettext_noop("configure logging to write logs to LOGFILE"), 1, &GNUNET_GETOPT_set_string, (void *) logfn } +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_LOGFILE (char **logfn); /** - * Allow user to specify log level (-L option) + * Allow user to specify a string. * - * @param loglev set to the log level + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] str set to the string */ -#define GNUNET_GETOPT_OPTION_LOGLEVEL(loglev) \ - { 'L', "log", "LOGLEVEL", gettext_noop("configure logging to use LOGLEVEL"), 1, &GNUNET_GETOPT_set_string, (void *) loglev } - +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_STRING (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + char **str); /** - * Get number of verbose (-V) flags + * Allow user to specify a filename (automatically path expanded). * - * @param level where to store the verbosity level (should be an 'int') + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] str set to the string */ -#define GNUNET_GETOPT_OPTION_VERBOSE(level) \ - { 'V', "verbose", (const char *) NULL, gettext_noop("be verbose"), 0, &GNUNET_GETOPT_increment_value, (void *) level } +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_FILENAME (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + char **str); /** - * Get configuration file name (-c option) + * Allow user to specify a flag (which internally means setting + * an integer to 1/#GNUNET_YES/#GNUNET_OK. * - * @param fn set to the configuration file name + * @param shortName short name of the option + * @param name long name of the option + * @param description long help text for the option + * @param[out] val set to 1 if the option is present */ -#define GNUNET_GETOPT_OPTION_CFG_FILE(fn) \ - { 'c', "config", "FILENAME", gettext_noop("use configuration file FILENAME"), 1, &GNUNET_GETOPT_set_string, (void *) fn } +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_ONE (char shortName, + const char *name, + const char *description, + int *val); /** - * Marker for the end of the list of options. + * Allow user to specify an `unsigned int`. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the value specified at the command line */ -#define GNUNET_GETOPT_OPTION_END \ - { '\0', NULL, NULL, NULL, 0, NULL, NULL } +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_UINT (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + unsigned int *val); /** - * Parse the command line. + * Allow user to specify an `unsigned long long`. * - * @param binaryOptions Name of application with option summary - * @param allOptions defined options and handlers - * @param argc number of arguments in @a argv - * @param argv actual arguments - * @return index into argv with first non-option - * argument, or #GNUNET_SYSERR on error + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the value specified at the command line */ -int -GNUNET_GETOPT_run (const char *binaryOptions, - const struct GNUNET_GETOPT_CommandLineOption *allOptions, - unsigned int argc, char *const *argv); +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_ULONG (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + unsigned long long *val); /** - * Set an option of type 'unsigned long long' from the command line. - * A pointer to this function should be passed as part of the - * `struct GNUNET_GETOPT_CommandLineOption` array to initialize options - * of this type. It should be followed by a pointer to a value of - * type `unsigned long long`. + * Allow user to specify a `struct GNUNET_TIME_Relative` + * (using human-readable "fancy" time). * - * @param ctx command line processing context - * @param scls additional closure (will point to the 'unsigned long long') - * @param option name of the option - * @param value actual value of the option as a string. - * @return #GNUNET_OK if parsing the value worked + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the time specified at the command line */ -int -GNUNET_GETOPT_set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value); +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_RELATIVE_TIME (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + struct GNUNET_TIME_Relative *val); /** - * Set an option of type 'struct GNUNET_TIME_Relative' from the command line. - * A pointer to this function should be passed as part of the - * `struct GNUNET_GETOPT_CommandLineOption` array to initialize options - * of this type. It should be followed by a pointer to a value of - * type `struct GNUNET_TIME_Relative`. + * Increment @a val each time the option flag is given by one. * - * @param ctx command line processing context - * @param scls additional closure (will point to the 'struct GNUNET_TIME_Relative') - * @param option name of the option - * @param value actual value of the option as a string. - * @return #GNUNET_OK if parsing the value worked + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to 1 if the option is present */ -int -GNUNET_GETOPT_set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value); +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_INCREMENT_VALUE (char shortName, + const char *name, + const char *description, + unsigned int *val); /** - * Set an option of type 'unsigned int' from the command line. - * A pointer to this function should be passed as part of the - * `struct GNUNET_GETOPT_CommandLineOption` array to initialize options - * of this type. It should be followed by a pointer to a value of - * type `unsigned int`. + * Define the '-L' log level option. Note that we do not check + * that the log level is valid here. * - * @param ctx command line processing context - * @param scls additional closure (will point to the 'unsigned int') - * @param option name of the option - * @param value actual value of the option as a string. - * @return #GNUNET_OK if parsing the value worked + * @param[out] level set to the log level */ -int -GNUNET_GETOPT_set_uint (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value); +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_LOGLEVEL (char **level); /** - * Set an option of type 'int' from the command line to 1 if the - * given option is present. - * A pointer to this function should be passed as part of the - * `struct GNUNET_GETOPT_CommandLineOption` array to initialize options - * of this type. It should be followed by a pointer to a value of - * type `int`. + * Define the '-V' verbosity option. Using the option more + * than once increments @a level each time. * - * @param ctx command line processing context - * @param scls additional closure (will point to the `int`) - * @param option name of the option - * @param value not used (NULL) - * @return #GNUNET_OK (always) + * @param[out] level set to the verbosity level */ -int -GNUNET_GETOPT_set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value); +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_VERBOSE (int *level); /** - * Set an option of type 'char *' from the command line. - * A pointer to this function should be passed as part of the - * `struct GNUNET_GETOPT_CommandLineOption` array to initialize options - * of this type. It should be followed by a pointer to a value of - * type `char *`, which will be allocated with the requested string. + * Allow user to specify log file name (-l option) * - * @param ctx command line processing context - * @param scls additional closure (will point to the `char *`, - * which will be allocated) - * @param option name of the option - * @param value actual value of the option (a string) - * @return #GNUNET_OK (always) + * @param[out] logfn set to the name of the logfile */ -int -GNUNET_GETOPT_set_string (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value); +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_LOGFILE (char **logfn); /** - * Set an option of type 'char *' from the command line doing fs expansion. - * A pointer to this function should be passed as part of the - * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options - * of this type. It should be followed by a pointer to a value of - * type 'char *', which will be allocated with the requested string. + * Allow user to specify configuration file name (-c option) * - * @param ctx command line processing context - * @param scls additional closure (will point to the 'char *', - * which will be allocated) - * @param option name of the option - * @param value actual value of the option (a string) - * @return #GNUNET_OK (always) + * @param[out] fn set to the name of the configuration file */ -int -GNUNET_GETOPT_set_filename (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value); +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_CFG_FILE (char **fn); + /** - * Set an option of type 'unsigned int' from the command line. Each - * time the option flag is given, the value is incremented by one. - * A pointer to this function should be passed as part of the - * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options - * of this type. It should be followed by a pointer to a value of - * type 'int'. - * - * @param ctx command line processing context - * @param scls additional closure (will point to the 'int') - * @param option name of the option - * @param value not used (NULL) - * @return #GNUNET_OK (always) + * Marker for the end of the list of options. */ -int -GNUNET_GETOPT_increment_value (struct GNUNET_GETOPT_CommandLineProcessorContext - *ctx, void *scls, const char *option, - const char *value); - +#define GNUNET_GETOPT_OPTION_END \ + { '\0', NULL, NULL, NULL, 0, NULL, NULL } -/* *************** internal prototypes - use macros above! ************* */ /** - * Print out details on command line options (implements --help). + * Parse the command line. * - * @param ctx command line processing context - * @param scls additional closure (points to about text) - * @param option name of the option - * @param value not used (NULL) - * @return #GNUNET_NO (do not continue, not an error) + * @param binaryOptions Name of application with option summary + * @param allOptions defined options and handlers + * @param argc number of arguments in @a argv + * @param argv actual arguments + * @return index into argv with first non-option + * argument, or #GNUNET_SYSERR on error */ int -GNUNET_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext - *ctx, void *scls, const char *option, - const char *value); +GNUNET_GETOPT_run (const char *binaryOptions, + const struct GNUNET_GETOPT_CommandLineOption *allOptions, + unsigned int argc, + char *const *argv); -/** - * Print out program version (implements --version). - * - * @param ctx command line processing context - * @param scls additional closure (points to version string) - * @param option name of the option - * @param value not used (NULL) - * @return #GNUNET_NO (do not continue, not an error) - */ -int -GNUNET_GETOPT_print_version_ (struct GNUNET_GETOPT_CommandLineProcessorContext - *ctx, void *scls, const char *option, - const char *value); #if 0 /* keep Emacsens' auto-indent happy */ { diff --git a/src/util/getopt_helpers.c b/src/util/getopt_helpers.c index 4d7104503..234f5371f 100644 --- a/src/util/getopt_helpers.c +++ b/src/util/getopt_helpers.c @@ -38,11 +38,11 @@ * @param value not used (NULL) * @return #GNUNET_NO (do not continue, not an error) */ -int -GNUNET_GETOPT_print_version_ (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, - const char *option, - const char *value) +static int +print_version (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { const char *version = scls; @@ -53,6 +53,26 @@ GNUNET_GETOPT_print_version_ (struct GNUNET_GETOPT_CommandLineProcessorContext * } +/** + * Define the option to print the version of + * the application (-v option) + * + * @param version string with the version number + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_VERSION (const char *version) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = 'v', + .name = "version", + .description = gettext_noop("print the version number"), + .processor = &print_version, + .scls = (void *) version + }; + return clo; +} + + /** * At what offset does the help text start? */ @@ -67,11 +87,11 @@ GNUNET_GETOPT_print_version_ (struct GNUNET_GETOPT_CommandLineProcessorContext * * @param value not used (NULL) * @return #GNUNET_NO (do not continue, not an error) */ -int -GNUNET_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, - const char *option, - const char *value) +static int +format_help (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { const char *about = scls; size_t slen; @@ -164,6 +184,27 @@ OUTER: } +/** + * Defining the option to print the command line + * help text (-h option). + * + * @param about string with brief description of the application + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_HELP (const char *about) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = 'h', + .name = "help", + .description = gettext_noop("print this help"), + .processor = format_help, + .scls = (void *) about + }; + + return clo; +} + + /** * Set an option of type 'unsigned int' from the command line. Each * time the option flag is given, the value is incremented by one. @@ -173,23 +214,72 @@ OUTER: * type 'int'. * * @param ctx command line processing context - * @param scls additional closure (will point to the 'int') + * @param scls additional closure (will point to the 'unsigned int') * @param option name of the option * @param value not used (NULL) * @return #GNUNET_OK */ -int -GNUNET_GETOPT_increment_value (struct GNUNET_GETOPT_CommandLineProcessorContext - *ctx, void *scls, const char *option, - const char *value) +static int +increment_value (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { - int *val = scls; + unsigned int *val = scls; (*val)++; return GNUNET_OK; } +/** + * Increment @a val each time the option flag is given by one. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val increment by 1 each time the option is present + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_INCREMENT_VALUE (char shortName, + const char *name, + const char *description, + unsigned int *val) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .description = description, + .processor = &increment_value, + .scls = (void *) val + }; + + return clo; +} + + +/** + * Define the '-V' verbosity option. Using the option more + * than once increments @a level each time. + * + * @param[out] level set to the verbosity level + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_VERBOSE (int *level) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = 'V', + .name = "verbose", + .description = gettext_noop("be verbose"), + .processor = &increment_value, + .scls = (void *) level + }; + + return clo; +} + + /** * Set an option of type 'int' from the command line to 1 if the * given option is present. @@ -204,9 +294,11 @@ GNUNET_GETOPT_increment_value (struct GNUNET_GETOPT_CommandLineProcessorContext * @param value not used (NULL) * @return #GNUNET_OK */ -int -GNUNET_GETOPT_set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value) +static int +set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { int *val = scls; @@ -215,6 +307,34 @@ GNUNET_GETOPT_set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, } +/** + * Allow user to specify a flag (which internally means setting + * an integer to 1/#GNUNET_YES/#GNUNET_OK. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to 1 if the option is present + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_ONE (char shortName, + const char *name, + const char *description, + int *val) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .description = description, + .processor = &set_one, + .scls = (void *) val + }; + + return clo; +} + + /** * Set an option of type 'char *' from the command line. * A pointer to this function should be passed as part of the @@ -229,9 +349,11 @@ GNUNET_GETOPT_set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, * @param value actual value of the option (a string) * @return #GNUNET_OK */ -int -GNUNET_GETOPT_set_string (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value) +static int +set_string (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { char **val = scls; @@ -242,18 +364,159 @@ GNUNET_GETOPT_set_string (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, } -int -GNUNET_GETOPT_set_filename (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value) +/** + * Allow user to specify a string. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] str set to the string + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_STRING (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + char **str) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .argumentHelp = argumentHelp, + .description = description, + .require_argument = 1, + .processor = &set_string, + .scls = (void *) str + }; + + return clo; +} + + +/** + * Define the '-L' log level option. Note that we do not check + * that the log level is valid here. + * + * @param[out] level set to the log level + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_LOGLEVEL (char **level) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = 'L', + .name = "log", + .argumentHelp = "LOGLEVEL", + .description = gettext_noop("configure logging to use LOGLEVEL"), + .require_argument = 1, + .processor = &set_string, + .scls = (void *) level + }; + + return clo; +} + + +/** + * Set an option of type 'char *' from the command line with + * filename expansion a la #GNUNET_STRINGS_filename_expand(). + * + * @param ctx command line processing context + * @param scls additional closure (will point to the `char *`, + * which will be allocated) + * @param option name of the option + * @param value actual value of the option (a string) + * @return #GNUNET_OK + */ +static int +set_filename (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { char **val = scls; - GNUNET_assert (value != NULL); + GNUNET_assert (NULL != value); GNUNET_free_non_null (*val); *val = GNUNET_STRINGS_filename_expand (value); return GNUNET_OK; } + +/** + * Allow user to specify a filename (automatically path expanded). + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] str set to the string + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_FILENAME (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + char **str) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .argumentHelp = argumentHelp, + .description = description, + .require_argument = 1, + .processor = &set_filename, + .scls = (void *) str + }; + + return clo; +} + + +/** + * Allow user to specify log file name (-l option) + * + * @param[out] logfn set to the name of the logfile + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_LOGFILE (char **logfn) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = 'l', + .name = "logfile", + .argumentHelp = "FILENAME", + .description = gettext_noop ("configure logging to write logs to FILENAME"), + .require_argument = 1, + .processor = &set_filename, + .scls = (void *) logfn + }; + + return clo; +} + + +/** + * Allow user to specify configuration file name (-c option) + * + * @param[out] fn set to the name of the configuration file + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_CFG_FILE (char **fn) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = 'c', + .name = "config", + .argumentHelp = "FILENAME", + .description = gettext_noop("use configuration file FILENAME"), + .require_argument = 1, + .processor = &set_filename, + .scls = (void *) fn + }; + + return clo; +} + + /** * Set an option of type 'unsigned long long' from the command line. * A pointer to this function should be passed as part of the @@ -267,21 +530,57 @@ GNUNET_GETOPT_set_filename (struct GNUNET_GETOPT_CommandLineProcessorContext *ct * @param value actual value of the option as a string. * @return #GNUNET_OK if parsing the value worked */ -int -GNUNET_GETOPT_set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value) +static int +set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { unsigned long long *val = scls; - if (1 != SSCANF (value, "%llu", val)) + if (1 != SSCANF (value, + "%llu", + val)) { - FPRINTF (stderr, _("You must pass a number to the `%s' option.\n"), option); + FPRINTF (stderr, + _("You must pass a number to the `%s' option.\n"), + option); return GNUNET_SYSERR; } return GNUNET_OK; } +/** + * Allow user to specify an `unsigned long long` + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the value specified at the command line + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_ULONG (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + unsigned long long *val) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .argumentHelp = argumentHelp, + .description = description, + .require_argument = 1, + .processor = &set_ulong, + .scls = (void *) val + }; + + return clo; +} + + /** * Set an option of type 'struct GNUNET_TIME_Relative' from the command line. * A pointer to this function should be passed as part of the @@ -295,9 +594,11 @@ GNUNET_GETOPT_set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, * @param value actual value of the option as a string. * @return #GNUNET_OK if parsing the value worked */ -int -GNUNET_GETOPT_set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value) +static int +set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { struct GNUNET_TIME_Relative *val = scls; @@ -305,13 +606,46 @@ GNUNET_GETOPT_set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContex GNUNET_STRINGS_fancy_time_to_relative (value, val)) { - FPRINTF (stderr, _("You must pass relative time to the `%s' option.\n"), option); + FPRINTF (stderr, + _("You must pass relative time to the `%s' option.\n"), + option); return GNUNET_SYSERR; } return GNUNET_OK; } +/** + * Allow user to specify a `struct GNUNET_TIME_Relative` + * (using human-readable "fancy" time). + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the time specified at the command line + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_RELATIVE_TIME (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + struct GNUNET_TIME_Relative *val) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .argumentHelp = argumentHelp, + .description = description, + .require_argument = 1, + .processor = &set_relative_time, + .scls = (void *) val + }; + + return clo; +} + + /** * Set an option of type 'unsigned int' from the command line. * A pointer to this function should be passed as part of the @@ -325,19 +659,55 @@ GNUNET_GETOPT_set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContex * @param value actual value of the option as a string. * @return #GNUNET_OK if parsing the value worked */ -int -GNUNET_GETOPT_set_uint (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, - void *scls, const char *option, const char *value) +static int +set_uint (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, + const char *option, + const char *value) { unsigned int *val = scls; - if (1 != SSCANF (value, "%u", val)) + if (1 != SSCANF (value, + "%u", + val)) { - FPRINTF (stderr, _("You must pass a number to the `%s' option.\n"), option); + FPRINTF (stderr, + _("You must pass a number to the `%s' option.\n"), + option); return GNUNET_SYSERR; } return GNUNET_OK; } +/** + * Allow user to specify an unsigned integer. + * + * @param shortName short name of the option + * @param name long name of the option + * @param argumentHelp help text for the option argument + * @param description long help text for the option + * @param[out] val set to the value specified at the command line + */ +struct GNUNET_GETOPT_CommandLineOption +GNUNET_GETOPT_OPTION_SET_UINT (char shortName, + const char *name, + const char *argumentHelp, + const char *description, + unsigned int *val) +{ + struct GNUNET_GETOPT_CommandLineOption clo = { + .shortName = shortName, + .name = name, + .argumentHelp = argumentHelp, + .description = description, + .require_argument = 1, + .processor = &set_uint, + .scls = (void *) val + }; + + return clo; +} + + /* end of getopt_helpers.c */ diff --git a/src/util/gnunet-config.c b/src/util/gnunet-config.c index 7ec7162f1..2beb772a9 100644 --- a/src/util/gnunet-config.c +++ b/src/util/gnunet-config.c @@ -223,34 +223,48 @@ run (void *cls, int main (int argc, char *const *argv) { - static const struct GNUNET_GETOPT_CommandLineOption options[] = { - { 'f', "filename", NULL, - gettext_noop ("obtain option of value as a filename (with $-expansion)"), - 0, &GNUNET_GETOPT_set_one, &is_filename }, - { 's', "section", "SECTION", - gettext_noop ("name of the section to access"), - 1, &GNUNET_GETOPT_set_string, §ion }, - { 'o', "option", "OPTION", - gettext_noop ("name of the option to access"), - 1, &GNUNET_GETOPT_set_string, &option }, - { 'V', "value", "VALUE", - gettext_noop ("value to set"), - 1, &GNUNET_GETOPT_set_string, &value }, - { 'S', "list-sections", NULL, - gettext_noop ("print available configuration sections"), - 0, &GNUNET_GETOPT_set_one, &list_sections }, - { 'w', "rewrite", NULL, - gettext_noop ("write configuration file that only contains delta to defaults"), - 0, &GNUNET_GETOPT_set_one, &rewrite }, + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_SET_ONE ('f', + "filename", + gettext_noop ("obtain option of value as a filename (with $-expansion)"), + &is_filename), + GNUNET_GETOPT_OPTION_STRING ('s', + "section", + "SECTION", + gettext_noop ("name of the section to access"), + §ion), + GNUNET_GETOPT_OPTION_STRING ('o', + "option", + "OPTION", + gettext_noop ("name of the option to access"), + &option), + GNUNET_GETOPT_OPTION_STRING ('V', + "value", + "VALUE", + gettext_noop ("value to set"), + &value), + GNUNET_GETOPT_OPTION_SET_ONE ('S', + "list-sections", + gettext_noop ("print available configuration sections"), + &list_sections), + GNUNET_GETOPT_OPTION_SET_ONE ('w', + "rewrite", + gettext_noop ("write configuration file that only contains delta to defaults"), + &rewrite), GNUNET_GETOPT_OPTION_END }; - if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) + if (GNUNET_OK != + GNUNET_STRINGS_get_utf8_args (argc, argv, + &argc, &argv)) return 2; ret = (GNUNET_OK == - GNUNET_PROGRAM_run (argc, argv, "gnunet-config [OPTIONS]", + GNUNET_PROGRAM_run (argc, + argv, + "gnunet-config [OPTIONS]", gettext_noop ("Manipulate GNUnet configuration files"), - options, &run, NULL)) ? 0 : ret; + options, + &run, NULL)) ? 0 : ret; GNUNET_free ((void*) argv); return ret; } diff --git a/src/util/gnunet-ecc.c b/src/util/gnunet-ecc.c index ddfd9b1c3..732228b52 100644 --- a/src/util/gnunet-ecc.c +++ b/src/util/gnunet-ecc.c @@ -41,7 +41,7 @@ static int list_keys; /** * Flag for listing public key. */ -static int list_keys_count; +static unsigned int list_keys_count; /** * Flag for printing public key. @@ -406,36 +406,50 @@ run (void *cls, char *const *args, const char *cfgfile, * @return 0 ok, 1 on error */ int -main (int argc, char *const *argv) +main (int argc, + char *const *argv) { list_keys_count = UINT32_MAX; - static const struct GNUNET_GETOPT_CommandLineOption options[] = { - { 'i', "iterate", "FILE", - gettext_noop ("list keys included in a file (for testing)"), - 0, &GNUNET_GETOPT_set_one, &list_keys }, - { 'e', "end=", "COUNT", - gettext_noop ("number of keys to list included in a file (for testing)"), - 1, &GNUNET_GETOPT_set_uint, &list_keys_count }, - { 'g', "generate-keys", "COUNT", - gettext_noop ("create COUNT public-private key pairs (for testing)"), - 1, &GNUNET_GETOPT_set_uint, &make_keys }, - { 'p', "print-public-key", NULL, - gettext_noop ("print the public key in ASCII format"), - 0, &GNUNET_GETOPT_set_one, &print_public_key }, - { 'E', "examples", NULL, - gettext_noop ("print examples of ECC operations (used for compatibility testing)"), - 0, &GNUNET_GETOPT_set_one, &print_examples_flag }, + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_SET_ONE ('i', + "iterate", + gettext_noop ("list keys included in a file (for testing)"), + &list_keys), + GNUNET_GETOPT_OPTION_SET_UINT ('e', + "end=", + "COUNT", + gettext_noop ("number of keys to list included in a file (for testing)"), + &list_keys_count), + GNUNET_GETOPT_OPTION_SET_UINT ('g', + "generate-keys", + "COUNT", + gettext_noop ("create COUNT public-private key pairs (for testing)"), + &make_keys), + GNUNET_GETOPT_OPTION_SET_ONE ('p', + "print-public-key", + gettext_noop ("print the public key in ASCII format"), + &print_public_key), + GNUNET_GETOPT_OPTION_SET_ONE ('E', + "examples", + gettext_noop ("print examples of ECC operations (used for compatibility testing)"), + &print_examples_flag), GNUNET_GETOPT_OPTION_END }; int ret; - if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) + if (GNUNET_OK != + GNUNET_STRINGS_get_utf8_args (argc, argv, + &argc, &argv)) return 2; ret = (GNUNET_OK == - GNUNET_PROGRAM_run (argc, argv, "gnunet-ecc [OPTIONS] keyfile [VANITY_PREFIX]", + GNUNET_PROGRAM_run (argc, + argv, + "gnunet-ecc [OPTIONS] keyfile [VANITY_PREFIX]", gettext_noop ("Manipulate GNUnet private ECC key files"), - options, &run, NULL)) ? 0 : 1; + options, + &run, + NULL)) ? 0 : 1; GNUNET_free ((void*) argv); return ret; } diff --git a/src/util/gnunet-resolver.c b/src/util/gnunet-resolver.c index e84a2332f..563cf9fce 100644 --- a/src/util/gnunet-resolver.c +++ b/src/util/gnunet-resolver.c @@ -144,10 +144,11 @@ run (void *cls, char *const *args, const char *cfgfile, int main (int argc, char *const *argv) { - static const struct GNUNET_GETOPT_CommandLineOption options[] = { - { 'r', "reverse", NULL, - gettext_noop ("perform a reverse lookup"), - 0, &GNUNET_GETOPT_set_one, &reverse }, + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_SET_ONE ('r', + "reverse", + gettext_noop ("perform a reverse lookup"), + &reverse), GNUNET_GETOPT_OPTION_END }; int ret; diff --git a/src/util/gnunet-scrypt.c b/src/util/gnunet-scrypt.c index ab0cf92e0..7c73cfe1e 100644 --- a/src/util/gnunet-scrypt.c +++ b/src/util/gnunet-scrypt.c @@ -307,21 +307,30 @@ run (void *cls, * @return 0 ok, 1 on error */ int -main (int argc, char *const *argv) +main (int argc, + char *const *argv) { - static const struct GNUNET_GETOPT_CommandLineOption options[] = { - { 'b', "bits", "BITS", - gettext_noop ("number of bits to require for the proof of work"), - 1, &GNUNET_GETOPT_set_ulong, &nse_work_required }, - { 'k', "keyfile", "FILE", - gettext_noop ("file with private key, otherwise default is used"), - 1, &GNUNET_GETOPT_set_filename, &pkfn }, - { 'o', "outfile", "FILE", - gettext_noop ("file with proof of work, otherwise default is used"), - 1, &GNUNET_GETOPT_set_filename, &pwfn }, - { 't', "timeout", "TIME", - gettext_noop ("time to wait between calculations"), - 1, &GNUNET_GETOPT_set_relative_time, &proof_find_delay }, + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_SET_ULONG ('b', + "bits", + "BITS", + gettext_noop ("number of bits to require for the proof of work"), + &nse_work_required), + GNUNET_GETOPT_OPTION_FILENAME ('k', + "keyfile", + "FILE", + gettext_noop ("file with private key, otherwise default is used"), + &pkfn), + GNUNET_GETOPT_OPTION_FILENAME ('o', + "outfile", + "FILE", + gettext_noop ("file with proof of work, otherwise default is used"), + &pwfn), + GNUNET_GETOPT_OPTION_SET_RELATIVE_TIME ('t', + "timeout", + "TIME", + gettext_noop ("time to wait between calculations"), + &proof_find_delay), GNUNET_GETOPT_OPTION_END }; int ret; @@ -334,7 +343,9 @@ main (int argc, char *const *argv) GNUNET_PROGRAM_run (argc, argv, "gnunet-scrypt [OPTIONS] prooffile", gettext_noop ("Manipulate GNUnet proof of work files"), - options, &run, NULL)) ? 0 : 1; + options, + &run, + NULL)) ? 0 : 1; GNUNET_free ((void*) argv); GNUNET_free_non_null (pwfn); return ret; diff --git a/src/util/service.c b/src/util/service.c index 496904fb1..d1dffa139 100644 --- a/src/util/service.c +++ b/src/util/service.c @@ -1402,9 +1402,10 @@ GNUNET_SERVICE_run (int argc, char *const *argv, struct GNUNET_GETOPT_CommandLineOption service_options[] = { GNUNET_GETOPT_OPTION_CFG_FILE (&opt_cfg_fn), - {'d', "daemonize", NULL, - gettext_noop ("do daemonize (detach from terminal)"), 0, - GNUNET_GETOPT_set_one, &do_daemonize}, + GNUNET_GETOPT_OPTION_SET_ONE ('d', + "daemonize", + gettext_noop ("do daemonize (detach from terminal)"), + &do_daemonize), GNUNET_GETOPT_OPTION_HELP (NULL), GNUNET_GETOPT_OPTION_LOGLEVEL (&loglev), GNUNET_GETOPT_OPTION_LOGFILE (&logfile), diff --git a/src/util/service_new.c b/src/util/service_new.c index 9c0ee539b..b4d03c17c 100644 --- a/src/util/service_new.c +++ b/src/util/service_new.c @@ -1723,9 +1723,10 @@ GNUNET_SERVICE_ruN_ (int argc, struct GNUNET_GETOPT_CommandLineOption service_options[] = { GNUNET_GETOPT_OPTION_CFG_FILE (&opt_cfg_filename), - {'d', "daemonize", NULL, - gettext_noop ("do daemonize (detach from terminal)"), 0, - GNUNET_GETOPT_set_one, &do_daemonize}, + GNUNET_GETOPT_OPTION_SET_ONE ('d', + "daemonize", + gettext_noop ("do daemonize (detach from terminal)"), + &do_daemonize), GNUNET_GETOPT_OPTION_HELP (NULL), GNUNET_GETOPT_OPTION_LOGLEVEL (&loglev), GNUNET_GETOPT_OPTION_LOGFILE (&logfile), -- 2.25.1