From a34891981c1311026a064af5312d7e4535c9ba11 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 16 Apr 2016 13:57:22 +0200 Subject: [PATCH] make all exchange-tools load configs properly like other Taler tools --- src/exchange-tools/taler-exchange-keycheck.c | 89 ++--- src/exchange-tools/taler-exchange-keyup.c | 2 +- .../taler-exchange-reservemod.c | 308 ++++++++++-------- 3 files changed, 216 insertions(+), 183 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. @@ -194,42 +198,20 @@ exchange_denomkeys_check () /** - * The main function of the keyup tool + * Main function that will be run. * - * @param argc number of arguments from the command line - * @param argv command line arguments - * @return 0 ok, 1 on error + * @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 */ -int -main (int argc, char *const *argv) +static void +run (void *cls, + char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) { - 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 - }; - - GNUNET_assert (GNUNET_OK == - 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); + kcfg = cfg; if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (kcfg, "exchange", @@ -239,17 +221,46 @@ main (int argc, char *const *argv) GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "exchange", "KEYDIR"); - return 1; + global_ret = 1; + return; } if ( (GNUNET_OK != exchange_signkeys_check ()) || (GNUNET_OK != exchange_denomkeys_check ()) ) { - GNUNET_CONFIGURATION_destroy (kcfg); - return 1; + global_ret = 1; + return; } - GNUNET_CONFIGURATION_destroy (kcfg); - return 0; +} + + +/** + * The main function of the keyup 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[] = { + GNUNET_GETOPT_OPTION_END + }; + + GNUNET_assert (GNUNET_OK == + GNUNET_log_setup ("taler-exchange-keycheck", + "WARNING", + NULL)); + if (GNUNET_OK != + GNUNET_PROGRAM_run (argc, argv, + "taler-exchange-keycheck", + "Check keys of the exchange for validity", + options, + &run, NULL)) + return 1; + return global_ret; + } /* 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 @@ -30,16 +30,170 @@ */ static char *exchange_directory; -/** - * Handle to the exchange's configuration - */ -static struct GNUNET_CONFIGURATION_Handle *cfg; - /** * Our DB plugin. */ static struct TALER_EXCHANGEDB_Plugin *plugin; +/** + * Public key of the reserve as a string. + */ +static char *reserve_pub_str; + +/** + * Amount to add as a string. + */ +static char *add_str; + +/** + * Details about the wire transfer in JSON format. + */ +static char *details; + +/** + * Return value from main(). + */ +static int global_ret; + + +/** + * Run the database transaction. + * + * @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 + */ +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) +{ + struct TALER_Amount add_value; + json_t *jdetails; + json_error_t error; + struct TALER_ReservePublicKeyP reserve_pub; + + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_filename (cfg, + "exchange", + "KEYDIR", + &exchange_directory)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "exchange", + "KEYDIR"); + global_ret = 1; + return; + } + if ((NULL == reserve_pub_str) || + (GNUNET_OK != + GNUNET_STRINGS_string_to_data (reserve_pub_str, + strlen (reserve_pub_str), + &reserve_pub, + sizeof (struct TALER_ReservePublicKeyP)))) + { + fprintf (stderr, + "Parsing reserve key invalid\n"); + global_ret = 1; + return; + } + if ( (NULL == add_str) || + (GNUNET_OK != + TALER_string_to_amount (add_str, + &add_value)) ) + { + fprintf (stderr, + "Failed to parse currency amount `%s'\n", + add_str); + global_ret = 1; + return; + } + if (NULL == details) + { + fprintf (stderr, + "No wiring details given (justification required)\n"); + global_ret = 1; + return; + } + jdetails = json_loads (details, + JSON_REJECT_DUPLICATES, + &error); + if (NULL == jdetails) + { + fprintf (stderr, + "Failed to parse JSON transaction details `%s': %s (%s)\n", + details, + error.text, + error.source); + global_ret = 1; + return; + } + + if (NULL == + (plugin = TALER_EXCHANGEDB_plugin_load (cfg))) + { + fprintf (stderr, + "Failed to initialize database plugin.\n"); + global_ret = 1; + return; + } + 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 @@ -51,20 +205,10 @@ static struct TALER_EXCHANGEDB_Plugin *plugin; int main (int argc, char *const *argv) { - 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}, @@ -72,143 +216,21 @@ main (int argc, char *const *argv) {'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", - "KEYDIR", - &exchange_directory)) - { - 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); + GNUNET_PROGRAM_run (argc, argv, + "taler-exchange-reservemod", + "Deposit funds into a Taler reserve", + options, + &run, NULL)) return 1; - } - if ((NULL == reserve_pub_str) || - (GNUNET_OK != - GNUNET_STRINGS_string_to_data (reserve_pub_str, - strlen (reserve_pub_str), - &reserve_pub, - sizeof (struct TALER_ReservePublicKeyP)))) - { - 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; - } - if ( (NULL == add_str) || - (GNUNET_OK != - TALER_string_to_amount (add_str, - &add_value)) ) - { - 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; - } - - 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; - } - jdetails = json_loads (details, - JSON_REJECT_DUPLICATES, - &error); - if (NULL == jdetails) - { - fprintf (stderr, - "Failed to parse JSON transaction details `%s': %s (%s)\n", - 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; - } - if (GNUNET_NO == ret) - { - fprintf (stderr, - "Record exists, reserve not updated.\n"); - } - 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; + return global_ret; } /* end taler-exchange-reservemod.c */