diff options
Diffstat (limited to 'src/bank-lib/taler-fakebank-run.c')
-rw-r--r-- | src/bank-lib/taler-fakebank-run.c | 191 |
1 files changed, 175 insertions, 16 deletions
diff --git a/src/bank-lib/taler-fakebank-run.c b/src/bank-lib/taler-fakebank-run.c index 4b94a4bd9..c15145ecb 100644 --- a/src/bank-lib/taler-fakebank-run.c +++ b/src/bank-lib/taler-fakebank-run.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2016, 2017 Taler Systems SA + Copyright (C) 2016-2022 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -21,12 +21,73 @@ * @file bank-lib/taler-fakebank-run.c * @brief Launch the fakebank, for testing the fakebank itself. * @author Marcello Stanisci + * @author Christian Grothoff */ - #include "platform.h" #include "taler_fakebank_lib.h" +#include "taler_mhd_lib.h" + +/** + * Number of threads to use (-n) + */ +static unsigned int num_threads; + +/** + * Force connection close after each request (-C) + */ +static int connection_close; + +/** + * Global return value. + */ +static int ret; + +/** + * Handle for the service. + */ +static struct TALER_FAKEBANK_Handle *fb; + +/** + * Keepalive task in multi-threaded mode. + */ +static struct GNUNET_SCHEDULER_Task *keepalive; + +/** + * Amount to credit an account with on /register. + */ +static struct TALER_Amount signup_bonus; + +/** + * Stop the process. + * + * @param cls NULL + */ +static void +do_shutdown (void *cls) +{ + (void) cls; + TALER_FAKEBANK_stop (fb); + fb = NULL; + if (NULL != keepalive) + { + GNUNET_SCHEDULER_cancel (keepalive); + keepalive = NULL; + } +} + + +/** + * Task that should never be run. + * + * @param cls NULL + */ +static void +keepalive_task (void *cls) +{ + (void) cls; + GNUNET_assert (0); +} -int ret; /** * Main function that will be run. @@ -43,7 +104,11 @@ run (void *cls, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { + unsigned long long port = 8082; + unsigned long long ram = 1024 * 128; /* 128 k entries */ char *currency_string; + char *hostname; + char *exchange_url; (void) cls; (void) args; @@ -52,14 +117,91 @@ run (void *cls, TALER_config_get_currency (cfg, ¤cy_string)) { - ret = 1; + ret = EXIT_NOTCONFIGURED; return; } - if (NULL == TALER_FAKEBANK_start (8082, - currency_string)) - ret = 1; + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_number (cfg, + "bank", + "HTTP_PORT", + &port)) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Listening on default port %llu\n", + port); + } + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cfg, + "bank", + "SUGGESTED_EXCHANGE", + &exchange_url)) + { + /* no suggested exchange */ + exchange_url = NULL; + } + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cfg, + "bank", + "HOSTNAME", + &hostname)) + { + hostname = GNUNET_strdup ("localhost"); + } + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_number (cfg, + "bank", + "RAM_LIMIT", + &ram)) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Maximum transaction history in RAM set to default of %llu\n", + ram); + } + { + enum TALER_MHD_GlobalOptions go; + + go = TALER_MHD_GO_NONE; + if (0 != connection_close) + go |= TALER_MHD_GO_FORCE_CONNECTION_CLOSE; + TALER_MHD_setup (go); + } + if (GNUNET_OK != + TALER_amount_is_valid (&signup_bonus)) + { + GNUNET_assert (GNUNET_OK == + TALER_amount_set_zero (currency_string, + &signup_bonus)); + } + if (0 != strcmp (currency_string, + signup_bonus.currency)) + { + fprintf (stderr, + "Signup bonus and main currency do not match\n"); + ret = EXIT_INVALIDARGUMENT; + return; + } + fb = TALER_FAKEBANK_start3 (hostname, + (uint16_t) port, + exchange_url, + currency_string, + ram, + num_threads, + &signup_bonus); + GNUNET_free (hostname); + GNUNET_free (exchange_url); GNUNET_free (currency_string); - ret = 0; + if (NULL == fb) + { + GNUNET_break (0); + ret = EXIT_FAILURE; + return; + } + keepalive = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, + &keepalive_task, + NULL); + GNUNET_SCHEDULER_add_shutdown (&do_shutdown, + NULL); + ret = EXIT_SUCCESS; } @@ -75,16 +217,33 @@ main (int argc, char *const *argv) { const struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_option_flag ('C', + "connection-close", + "force HTTP connections to be closed after each request", + &connection_close), + GNUNET_GETOPT_option_uint ('n', + "num-threads", + "NUM_THREADS", + "size of the thread pool", + &num_threads), + TALER_getopt_get_amount ('s', + "signup-bonus", + "AMOUNT", + "amount to credit newly registered account (created out of thin air)", + &signup_bonus), GNUNET_GETOPT_OPTION_END }; + enum GNUNET_GenericReturnValue iret; - if (GNUNET_OK != - GNUNET_PROGRAM_run (argc, argv, - "taler-fakebank-run", - "Runs the fakebank", - options, - &run, - NULL)) - return 1; + iret = GNUNET_PROGRAM_run (argc, argv, + "taler-fakebank-run", + "Runs the fakebank", + options, + &run, + NULL); + if (GNUNET_SYSERR == iret) + return EXIT_INVALIDARGUMENT; + if (GNUNET_NO == iret) + return EXIT_SUCCESS; return ret; } |