From a34891981c1311026a064af5312d7e4535c9ba11 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 16 Apr 2016 13:57:22 +0200 Subject: make all exchange-tools load configs properly like other Taler tools --- src/exchange-tools/taler-exchange-keycheck.c | 85 +++++---- src/exchange-tools/taler-exchange-keyup.c | 2 +- src/exchange-tools/taler-exchange-reservemod.c | 252 ++++++++++++++----------- 3 files changed, 186 insertions(+), 153 deletions(-) diff --git a/src/exchange-tools/taler-exchange-keycheck.c b/src/exchange-tools/taler-exchange-keycheck.c index 064f2249e..eaca7cd61 100644 --- a/src/exchange-tools/taler-exchange-keycheck.c +++ b/src/exchange-tools/taler-exchange-keycheck.c @@ -34,8 +34,12 @@ static char *exchange_directory; /** * Our configuration. */ -static struct GNUNET_CONFIGURATION_Handle *kcfg; +static const struct GNUNET_CONFIGURATION_Handle *kcfg; +/** + * Return value from main(). + */ +static int global_ret; /** * Function called on each signing key. @@ -193,6 +197,43 @@ exchange_denomkeys_check () } +/** + * Main function that will be run. + * + * @param cls closure + * @param args remaining command-line arguments + * @param cfgfile name of the configuration file used (for saving, can be NULL!) + * @param cfg configuration + */ +static void +run (void *cls, + char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + kcfg = cfg; + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_filename (kcfg, + "exchange", + "KEYDIR", + &exchange_directory)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "exchange", + "KEYDIR"); + global_ret = 1; + return; + } + + if ( (GNUNET_OK != exchange_signkeys_check ()) || + (GNUNET_OK != exchange_denomkeys_check ()) ) + { + global_ret = 1; + return; + } +} + + /** * The main function of the keyup tool * @@ -203,10 +244,7 @@ exchange_denomkeys_check () int main (int argc, char *const *argv) { - char *cfgfile; const struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_OPTION_CFG_FILE (&cfgfile), - GNUNET_GETOPT_OPTION_HELP ("gnunet-exchange-keycheck OPTIONS"), GNUNET_GETOPT_OPTION_END }; @@ -214,42 +252,15 @@ main (int argc, char *const *argv) GNUNET_log_setup ("taler-exchange-keycheck", "WARNING", NULL)); - - if (GNUNET_GETOPT_run ("taler-exchange-keycheck", - options, - argc, argv) < 0) - return 1; - kcfg = GNUNET_CONFIGURATION_create (); - if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (kcfg, - cfgfile)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Malformed configuration file `%s', exit ...\n"), - cfgfile); - GNUNET_free_non_null (cfgfile); - return 1; - } - GNUNET_free_non_null (cfgfile); if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_filename (kcfg, - "exchange", - "KEYDIR", - &exchange_directory)) - { - GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, - "exchange", - "KEYDIR"); + GNUNET_PROGRAM_run (argc, argv, + "taler-exchange-keycheck", + "Check keys of the exchange for validity", + options, + &run, NULL)) return 1; - } + return global_ret; - if ( (GNUNET_OK != exchange_signkeys_check ()) || - (GNUNET_OK != exchange_denomkeys_check ()) ) - { - GNUNET_CONFIGURATION_destroy (kcfg); - return 1; - } - GNUNET_CONFIGURATION_destroy (kcfg); - return 0; } /* end of taler-exchange-keycheck.c */ diff --git a/src/exchange-tools/taler-exchange-keyup.c b/src/exchange-tools/taler-exchange-keyup.c index 3d9b9761c..312b4010e 100644 --- a/src/exchange-tools/taler-exchange-keyup.c +++ b/src/exchange-tools/taler-exchange-keyup.c @@ -1064,7 +1064,7 @@ main (int argc, GNUNET_log_setup ("taler-exchange-keyup", "WARNING", NULL)); - + if (GNUNET_OK != GNUNET_PROGRAM_run (argc, argv, "taler-exchange-keyup", diff --git a/src/exchange-tools/taler-exchange-reservemod.c b/src/exchange-tools/taler-exchange-reservemod.c index 3494e88a0..de3e57f1f 100644 --- a/src/exchange-tools/taler-exchange-reservemod.c +++ b/src/exchange-tools/taler-exchange-reservemod.c @@ -31,75 +31,96 @@ static char *exchange_directory; /** - * Handle to the exchange's configuration + * Our DB plugin. */ -static struct GNUNET_CONFIGURATION_Handle *cfg; +static struct TALER_EXCHANGEDB_Plugin *plugin; /** - * Our DB plugin. + * Public key of the reserve as a string. */ -static struct TALER_EXCHANGEDB_Plugin *plugin; +static char *reserve_pub_str; +/** + * Amount to add as a string. + */ +static char *add_str; /** - * The main function of the reservemod tool + * Details about the wire transfer in JSON format. + */ +static char *details; + +/** + * Return value from main(). + */ +static int global_ret; + + +/** + * Run the database transaction. * - * @param argc number of arguments from the command line - * @param argv command line arguments - * @return 0 ok, 1 on error + * @param reserve_pub public key of the reserve to use + * @param add_value value to add + * @param jdetails JSON details + * @return #GNUNET_OK on success, #GNUNET_SYSERR on hard error, + * #GNUNET_NO if record exists */ -int -main (int argc, char *const *argv) +static int +run_transaction (const struct TALER_ReservePublicKeyP *reserve_pub, + const struct TALER_Amount *add_value, + json_t *jdetails) +{ + int ret; + struct TALER_EXCHANGEDB_Session *session; + + session = plugin->get_session (plugin->cls, + GNUNET_NO); + if (NULL == session) + { + fprintf (stderr, + "Failed to initialize DB session\n"); + return GNUNET_SYSERR; + } + /* FIXME: maybe allow passing timestamp via command-line? */ + ret = plugin->reserves_in_insert (plugin->cls, + session, + reserve_pub, + add_value, + GNUNET_TIME_absolute_get (), + jdetails); + if (GNUNET_SYSERR == ret) + { + fprintf (stderr, + "Failed to update reserve.\n"); + } + if (GNUNET_NO == ret) + { + fprintf (stderr, + "Record exists, reserve not updated.\n"); + } + return ret; +} + + +/** + * Main function that will be run. + * + * @param cls closure + * @param args remaining command-line arguments + * @param cfgfile name of the configuration file used (for saving, can be NULL!) + * @param cfg configuration + */ +static void +run (void *cls, + char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) { - char *cfgfile = NULL; - char *reserve_pub_str = NULL; - char *add_str = NULL; struct TALER_Amount add_value; - char *details = NULL; json_t *jdetails; json_error_t error; struct TALER_ReservePublicKeyP reserve_pub; - struct TALER_EXCHANGEDB_Session *session; - const struct GNUNET_GETOPT_CommandLineOption options[] = { - {'a', "add", "DENOM", - "value to add", 1, - &GNUNET_GETOPT_set_string, &add_str}, - GNUNET_GETOPT_OPTION_CFG_FILE (&cfgfile), - {'d', "details", "JSON", - "details about the bank transaction which justify why we add this amount", 1, - &GNUNET_GETOPT_set_string, &details}, - GNUNET_GETOPT_OPTION_HELP ("Deposit funds into a Taler reserve"), - {'R', "reserve", "KEY", - "reserve (public key) to modify", 1, - &GNUNET_GETOPT_set_string, &reserve_pub_str}, - GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION), - GNUNET_GETOPT_OPTION_END - }; - int ret; - GNUNET_assert (GNUNET_OK == - GNUNET_log_setup ("taler-exchange-reservemod", - "WARNING", - NULL)); - - if (GNUNET_GETOPT_run ("taler-exchange-reservemod", - options, - argc, argv) < 0) - return 1; - cfg = GNUNET_CONFIGURATION_create (); - if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, - cfgfile)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Malformed configuration file `%s', exit ...\n"), - cfgfile); - GNUNET_free_non_null (cfgfile); - GNUNET_free_non_null (add_str); - GNUNET_free_non_null (details); - GNUNET_free_non_null (reserve_pub_str); - return 1; - } - GNUNET_free_non_null (cfgfile); if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "exchange", @@ -109,10 +130,8 @@ main (int argc, char *const *argv) GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "exchange", "KEYDIR"); - GNUNET_free_non_null (add_str); - GNUNET_free_non_null (details); - GNUNET_free_non_null (reserve_pub_str); - return 1; + global_ret = 1; + return; } if ((NULL == reserve_pub_str) || (GNUNET_OK != @@ -123,10 +142,8 @@ main (int argc, char *const *argv) { fprintf (stderr, "Parsing reserve key invalid\n"); - GNUNET_free_non_null (add_str); - GNUNET_free_non_null (details); - GNUNET_free_non_null (reserve_pub_str); - return 1; + global_ret = 1; + return; } if ( (NULL == add_str) || (GNUNET_OK != @@ -136,37 +153,15 @@ main (int argc, char *const *argv) fprintf (stderr, "Failed to parse currency amount `%s'\n", add_str); - GNUNET_free_non_null (add_str); - GNUNET_free_non_null (details); - GNUNET_free_non_null (reserve_pub_str); - return 1; + global_ret = 1; + return; } - if (NULL == details) { fprintf (stderr, "No wiring details given (justification required)\n"); - GNUNET_free_non_null (add_str); - GNUNET_free_non_null (reserve_pub_str); - return 1; - } - - ret = 1; - if (NULL == - (plugin = TALER_EXCHANGEDB_plugin_load (cfg))) - { - fprintf (stderr, - "Failed to initialize database plugin.\n"); - goto cleanup; - } - - session = plugin->get_session (plugin->cls, - GNUNET_NO); - if (NULL == session) - { - fprintf (stderr, - "Failed to initialize DB session\n"); - goto cleanup; + global_ret = 1; + return; } jdetails = json_loads (details, JSON_REJECT_DUPLICATES, @@ -178,37 +173,64 @@ main (int argc, char *const *argv) details, error.text, error.source); - goto cleanup; - } - /* FIXME: maybe allow passing timestamp via command-line? */ - ret = plugin->reserves_in_insert (plugin->cls, - session, - &reserve_pub, - &add_value, - GNUNET_TIME_absolute_get (), - jdetails); - json_decref (jdetails); - if (GNUNET_SYSERR == ret) - { - fprintf (stderr, - "Failed to update reserve.\n"); - goto cleanup; + global_ret = 1; + return; } - if (GNUNET_NO == ret) + + if (NULL == + (plugin = TALER_EXCHANGEDB_plugin_load (cfg))) { fprintf (stderr, - "Record exists, reserve not updated.\n"); + "Failed to initialize database plugin.\n"); + global_ret = 1; + return; } - ret = 0; - cleanup: - if (NULL != plugin) - TALER_EXCHANGEDB_plugin_unload (plugin); - if (NULL != cfg) - GNUNET_CONFIGURATION_destroy (cfg); - GNUNET_free_non_null (add_str); - GNUNET_free_non_null (details); - GNUNET_free_non_null (reserve_pub_str); - return ret; + if (GNUNET_SYSERR == + run_transaction (&reserve_pub, + &add_value, + jdetails)) + global_ret = 1; + TALER_EXCHANGEDB_plugin_unload (plugin); + json_decref (jdetails); +} + + +/** + * The main function of the reservemod tool + * + * @param argc number of arguments from the command line + * @param argv command line arguments + * @return 0 ok, 1 on error + */ +int +main (int argc, char *const *argv) +{ + const struct GNUNET_GETOPT_CommandLineOption options[] = { + {'a', "add", "DENOM", + "value to add", 1, + &GNUNET_GETOPT_set_string, &add_str}, + {'d', "details", "JSON", + "details about the bank transaction which justify why we add this amount", 1, + &GNUNET_GETOPT_set_string, &details}, + GNUNET_GETOPT_OPTION_HELP ("Deposit funds into a Taler reserve"), + {'R', "reserve", "KEY", + "reserve (public key) to modify", 1, + &GNUNET_GETOPT_set_string, &reserve_pub_str}, + GNUNET_GETOPT_OPTION_END + }; + + GNUNET_assert (GNUNET_OK == + GNUNET_log_setup ("taler-exchange-reservemod", + "WARNING", + NULL)); + if (GNUNET_OK != + GNUNET_PROGRAM_run (argc, argv, + "taler-exchange-reservemod", + "Deposit funds into a Taler reserve", + options, + &run, NULL)) + return 1; + return global_ret; } /* end taler-exchange-reservemod.c */ -- cgit v1.2.3