gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-exchange] branch master updated: update getopt confi


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] branch master updated: update getopt config parsing style to match 'getopt' GNUnet branch API change
Date: Wed, 15 Mar 2017 12:01:09 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new ae3e850  update getopt config parsing style to match 'getopt' GNUnet 
branch API change
ae3e850 is described below

commit ae3e850c946947cead6b9330f7c8e9764bd5f934
Author: Christian Grothoff <address@hidden>
AuthorDate: Wed Mar 15 12:01:06 2017 +0100

    update getopt config parsing style to match 'getopt' GNUnet branch API 
change
---
 src/auditor/taler-auditor-sign.c               |  77 ++++++---------
 src/benchmark/taler-exchange-benchmark.c       |  58 ++++++-----
 src/exchange-tools/Makefile.am                 |   4 +-
 src/exchange-tools/taler-exchange-dbinit.c     |  14 +--
 src/exchange-tools/taler-exchange-keyup.c      |  60 +++++------
 src/exchange-tools/taler-exchange-reservemod.c | 131 +++++++------------------
 src/exchange-tools/taler-exchange-wire.c       |  86 ++++++++--------
 src/exchange/taler-exchange-aggregator.c       |   9 +-
 src/exchange/taler-exchange-httpd.c            |  37 ++++---
 src/include/taler_amount_lib.h                 |  10 ++
 src/include/taler_util.h                       |  17 ++++
 src/util/amount.c                              |  21 ++--
 src/util/util.c                                |  66 +++++++++++++
 13 files changed, 302 insertions(+), 288 deletions(-)

diff --git a/src/auditor/taler-auditor-sign.c b/src/auditor/taler-auditor-sign.c
index 90888da..5d73ecc 100644
--- a/src/auditor/taler-auditor-sign.c
+++ b/src/auditor/taler-auditor-sign.c
@@ -26,7 +26,7 @@
 /**
  * Are we running in verbose mode?
  */
-static int verbose;
+static unsigned int verbose;
 
 /**
  * Filename of the auditor's private key.
@@ -34,11 +34,6 @@ static int verbose;
 static char *auditor_key_file;
 
 /**
- * Exchange's public key (in Crockford base32 encoding).
- */
-static char *exchange_public_key;
-
-/**
  * File with the Exchange's denomination keys to sign, itself
  * signed by the Exchange's public key.
  */
@@ -144,23 +139,35 @@ main (int argc,
 {
   char *cfgfile = NULL;
   const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    {'a', "auditor-key", "FILENAME",
-     "file containing the private key of the auditor", 1,
-     &GNUNET_GETOPT_set_filename, &auditor_key_file},
+    GNUNET_GETOPT_OPTION_FILENAME ('a',
+                                   "auditor-key",
+                                   "FILENAME",
+                                   "file containing the private key of the 
auditor",
+                                   &auditor_key_file),
     GNUNET_GETOPT_OPTION_CFG_FILE (&cfgfile),
     GNUNET_GETOPT_OPTION_HELP ("Private key of the auditor to use for 
signing"),
-    {'m', "exchange-key", "KEY",
-     "public key of the exchange (Crockford base32 encoded)", 1,
-     &GNUNET_GETOPT_set_string, &exchange_public_key},
-    {'u', "auditor-url", "URL",
-     "URL of the auditor (informative link for the user)", 1,
-     &GNUNET_GETOPT_set_string, &auditor_url},
-    {'r', "exchange-request", "FILENAME",
-     "set of keys the exchange requested the auditor to sign", 1,
-     &GNUNET_GETOPT_set_string, &exchange_request_file},
-    {'o', "output", "FILENAME",
-     "where to write our signature", 1,
-     &GNUNET_GETOPT_set_string, &output_file},
+    GNUNET_GETOPT_OPTION_MANDATORY
+    (GNUNET_GETOPT_OPTION_SET_BASE32_AUTO ('m',
+                                           "exchange-key",
+                                           "KEY",
+                                           "public key of the exchange 
(Crockford base32 encoded)",
+                                           &master_public_key)),
+    GNUNET_GETOPT_OPTION_STRING ('u',
+                                 "auditor-url",
+                                 "URL",
+                                 "URL of the auditor (informative link for the 
user)",
+                                 &auditor_url),
+    GNUNET_GETOPT_OPTION_MANDATORY
+    (GNUNET_GETOPT_OPTION_FILENAME ('r',
+                                    "exchange-request",
+                                    "FILENAME",
+                                    "set of keys the exchange requested the 
auditor to sign",
+                                    &exchange_request_file)),
+    GNUNET_GETOPT_OPTION_FILENAME ('o',
+                                   "output",
+                                   "FILENAME",
+                                   "where to write our signature",
+                                   &output_file),
     GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION),
     GNUNET_GETOPT_OPTION_VERBOSE (&verbose),
     GNUNET_GETOPT_OPTION_END
@@ -213,7 +220,7 @@ main (int argc,
                                                &auditor_url)) )
   {
     fprintf (stderr,
-             "Auditor URL not given\n");
+             "Auditor URL not given in neither configuration nor 
command-line\n");
     return 1;
   }
   if (GNUNET_YES != GNUNET_DISK_file_test (auditor_key_file))
@@ -230,32 +237,6 @@ main (int argc,
   }
   GNUNET_CRYPTO_eddsa_key_get_public (eddsa_priv,
                                       &apub.eddsa_pub);
-  if (NULL == exchange_public_key)
-  {
-    fprintf (stderr,
-             "Exchange public key not given\n");
-    GNUNET_free (eddsa_priv);
-    return 1;
-  }
-  if (GNUNET_OK !=
-      GNUNET_STRINGS_string_to_data (exchange_public_key,
-                                     strlen (exchange_public_key),
-                                     &master_public_key,
-                                     sizeof (master_public_key)))
-  {
-    fprintf (stderr,
-             "Public key `%s' malformed\n",
-             exchange_public_key);
-    GNUNET_free (eddsa_priv);
-    return 1;
-  }
-  if (NULL == exchange_request_file)
-  {
-    fprintf (stderr,
-             "Exchange signing request not given\n");
-    GNUNET_free (eddsa_priv);
-    return 1;
-  }
   fh = GNUNET_DISK_file_open (exchange_request_file,
                               GNUNET_DISK_OPEN_READ,
                               GNUNET_DISK_PERM_NONE);
diff --git a/src/benchmark/taler-exchange-benchmark.c 
b/src/benchmark/taler-exchange-benchmark.c
index 62a7fb6..39236c6 100644
--- a/src/benchmark/taler-exchange-benchmark.c
+++ b/src/benchmark/taler-exchange-benchmark.c
@@ -268,7 +268,7 @@ static int run_exchange;
  * every 50 iterations. Also includes how long the iteration took,
  * so we can see if it is stable.
  */
-static int be_verbose;
+static unsigned int be_verbose;
 
 /**
  * How many coins the benchmark should operate on
@@ -1442,17 +1442,12 @@ run (void *cls)
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "gotten pool_size of %d\n",
               pool_size);
-  if (NULL == config_file)
-  {
-    fail ("-c option is mandatory");
-    return;
-  }
-
   cfg = GNUNET_CONFIGURATION_create ();
   GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
                                 NULL);
-  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_parse (cfg,
-                                                  config_file))
+  if (GNUNET_SYSERR ==
+      GNUNET_CONFIGURATION_parse (cfg,
+                                  config_file))
   {
     fail ("Failed to parse configuration file");
     return;
@@ -1567,23 +1562,33 @@ main (int argc,
   struct GNUNET_OS_Process *proc;
   unsigned int cnt;
   const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    {'a', "automate", NULL,
-     "Initialize and start the bank and exchange", GNUNET_NO,
-     &GNUNET_GETOPT_set_one, &run_exchange},
-    GNUNET_GETOPT_OPTION_CFG_FILE (&config_file),
-    {'e', "exchange-uri", "URI",
-     "URI of the exchange", GNUNET_YES,
-     &GNUNET_GETOPT_set_string, &exchange_uri},
-    {'E', "exchange-admin-uri", "URI",
-     "URI of the administrative interface of the exchange", GNUNET_YES,
-     &GNUNET_GETOPT_set_string, &exchange_admin_uri},
+    GNUNET_GETOPT_OPTION_SET_ONE ('a',
+                                  "automate",
+                                  "Initialize and start the bank and exchange",
+                                  &run_exchange),
+    GNUNET_GETOPT_OPTION_MANDATORY
+    (GNUNET_GETOPT_OPTION_CFG_FILE (&config_file)),
+    GNUNET_GETOPT_OPTION_STRING ('e',
+                                 "exchange-uri",
+                                 "URI",
+                                 "URI of the exchange",
+                                 &exchange_uri),
+    GNUNET_GETOPT_OPTION_STRING ('E',
+                                 "exchange-admin-uri",
+                                 "URI",
+                                 "URI of the administrative interface of the 
exchange",
+                                 &exchange_admin_uri),
     GNUNET_GETOPT_OPTION_HELP ("tool to benchmark the Taler exchange"),
-    {'s', "pool-size", "SIZE",
-     "How many coins this benchmark should instantiate", GNUNET_YES,
-     &GNUNET_GETOPT_set_uint, &pool_size},
-    {'l', "limit", "LIMIT",
-     "Terminate the benchmark after LIMIT operations", GNUNET_YES,
-     &GNUNET_GETOPT_set_uint, &num_iterations},
+    GNUNET_GETOPT_OPTION_SET_UINT ('s',
+                                   "pool-size",
+                                   "SIZE",
+                                   "How many coins this benchmark should 
instantiate",
+                                   &pool_size),
+    GNUNET_GETOPT_OPTION_SET_UINT ('l',
+                                   "limit",
+                                   "LIMIT",
+                                   "Terminate the benchmark after LIMIT 
operations",
+                                   &num_iterations),
     GNUNET_GETOPT_OPTION_VERBOSE (&be_verbose),
     GNUNET_GETOPT_OPTION_END
   };
@@ -1687,7 +1692,8 @@ main (int argc,
     GNUNET_free (wget);
     fprintf (stderr, "\n");
   }
-  GNUNET_SCHEDULER_run (&run, NULL);
+  GNUNET_SCHEDULER_run (&run,
+                        NULL);
   if (run_exchange)
   {
     GNUNET_OS_process_kill (exchanged,
diff --git a/src/exchange-tools/Makefile.am b/src/exchange-tools/Makefile.am
index 60b2cc2..8eb2ac2 100644
--- a/src/exchange-tools/Makefile.am
+++ b/src/exchange-tools/Makefile.am
@@ -58,7 +58,9 @@ taler_exchange_reservemod_LDADD = \
   $(top_builddir)/src/util/libtalerutil.la \
   $(top_builddir)/src/pq/libtalerpq.la \
   $(top_builddir)/src/exchangedb/libtalerexchangedb.la \
-  -lgnunetutil -ljansson $(XLIB)
+  -lgnunetjson \
+  -lgnunetutil \
+  -ljansson $(XLIB)
 taler_exchange_reservemod_LDFLAGS = \
   $(POSTGRESQL_LDFLAGS)
 taler_exchange_reservemod_CPPFLAGS = \
diff --git a/src/exchange-tools/taler-exchange-dbinit.c 
b/src/exchange-tools/taler-exchange-dbinit.c
index b0f53d5..23a31fa 100644
--- a/src/exchange-tools/taler-exchange-dbinit.c
+++ b/src/exchange-tools/taler-exchange-dbinit.c
@@ -96,12 +96,14 @@ main (int argc,
       char *const *argv)
 {
   const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    {'r', "reset", NULL,
-     "reset database (DANGEROUS: all existing data is lost!)", 0,
-     &GNUNET_GETOPT_set_one, &reset_db},
-    {'g', "gc", NULL,
-     "garbage collect database", 0,
-     &GNUNET_GETOPT_set_one, &gc_db},
+    GNUNET_GETOPT_OPTION_SET_ONE ('r',
+                                  "reset",
+                                  "reset database (DANGEROUS: all existing 
data is lost!)",
+                                  &reset_db),
+    GNUNET_GETOPT_OPTION_SET_ONE ('g',
+                                  "gc",
+                                  "garbage collect database",
+                                  &gc_db),
     GNUNET_GETOPT_OPTION_END
   };
 
diff --git a/src/exchange-tools/taler-exchange-keyup.c 
b/src/exchange-tools/taler-exchange-keyup.c
index f14e28b..679a3ff 100644
--- a/src/exchange-tools/taler-exchange-keyup.c
+++ b/src/exchange-tools/taler-exchange-keyup.c
@@ -185,11 +185,6 @@ static FILE *auditor_output_file;
 static char *exchange_directory;
 
 /**
- * Time to pretend when the key update is executed.
- */
-static char *pretend_time_str;
-
-/**
  * Directory where we should write the wire transfer fee structure.
  */
 static char *feedir;
@@ -1041,23 +1036,6 @@ run (void *cls,
   struct GNUNET_CRYPTO_EddsaPrivateKey *eddsa_priv;
 
   kcfg = cfg;
-  if (NULL != pretend_time_str)
-  {
-    if (GNUNET_OK !=
-        GNUNET_STRINGS_fancy_time_to_absolute (pretend_time_str,
-                                               &now))
-    {
-      fprintf (stderr,
-               "timestamp `%s' invalid\n",
-               pretend_time_str);
-      global_ret = 1;
-      return;
-    }
-  }
-  else
-  {
-    now = GNUNET_TIME_absolute_get ();
-  }
   if (NULL == feedir)
   {
     if (GNUNET_OK !=
@@ -1232,27 +1210,35 @@ int
 main (int argc,
       char *const *argv)
 {
-  const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    {'m', "master-key", "FILE",
-     "master key file (private key)", 1,
-     &GNUNET_GETOPT_set_filename, &masterkeyfile},
-    {'f', "feedir", "DIRNAME",
-     "directory where to write wire transfer fee structure", 1,
-     &GNUNET_GETOPT_set_filename, &feedir},
-    {'o', "output", "FILE",
-     "auditor denomination key signing request file to create", 1,
-     &GNUNET_GETOPT_set_filename, &auditorrequestfile},
-    {'t', "time", "TIMESTAMP",
-     "pretend it is a different time for the update", 0,
-     &GNUNET_GETOPT_set_string, &pretend_time_str},
-     GNUNET_GETOPT_OPTION_END
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_OPTION_FILENAME ('m',
+                                   "master-key",
+                                   "FILENAME",
+                                   "master key file (private key)",
+                                   &masterkeyfile),
+    GNUNET_GETOPT_OPTION_FILENAME ('f',
+                                   "feedir",
+                                   "DIRNAME",
+                                   "directory where to write wire transfer fee 
structure",
+                                   &feedir),
+    GNUNET_GETOPT_OPTION_FILENAME ('o',
+                                   "output",
+                                   "FILENAME",
+                                   "auditor denomination key signing request 
file to create",
+                                   &auditorrequestfile),
+    GNUNET_GETOPT_OPTION_SET_ABSOLUTE_TIME ('t',
+                                            "time",
+                                            "TIMESTAMP",
+                                            "pretend it is a different time 
for the update",
+                                            &now),
+    GNUNET_GETOPT_OPTION_END
   };
 
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_log_setup ("taler-exchange-keyup",
                                    "WARNING",
                                    NULL));
-
+  now = GNUNET_TIME_absolute_get ();
   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 ce3297f..9bcc4e1 100644
--- a/src/exchange-tools/taler-exchange-reservemod.c
+++ b/src/exchange-tools/taler-exchange-reservemod.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2014, 2015 GNUnet e.V.
+  Copyright (C) 2014-2017 GNUnet e.V.
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU General Public License as published by the Free Software
@@ -21,6 +21,7 @@
  */
 #include "platform.h"
 #include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_json_lib.h>
 #include <libpq-fe.h>
 #include <jansson.h>
 #include "taler_exchangedb_plugin.h"
@@ -36,24 +37,24 @@ static char *exchange_directory;
 static struct TALER_EXCHANGEDB_Plugin *plugin;
 
 /**
- * Public key of the reserve as a string.
+ * Public key of the reserve.
  */
-static char *reserve_pub_str;
+static struct TALER_ReservePublicKeyP reserve_pub;
 
 /**
- * Amount to add as a string.
+ * Amount to add.  Invalid if not initialized.
  */
-static char *add_str;
+static struct TALER_Amount add_value;
 
 /**
  * Details about the sender account in JSON format.
  */
-static char *sender_details;
+static json_t *sender_details;
 
 /**
  * Details about the wire transfer in JSON format.
  */
-static char *transfer_details;
+static json_t *transfer_details;
 
 /**
  * Return value from main().
@@ -123,12 +124,6 @@ run (void *cls,
      const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  struct TALER_Amount add_value;
-  json_t *jdetails;
-  json_t *tdetails;
-  json_error_t error;
-  struct TALER_ReservePublicKeyP reserve_pub;
-
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_filename (cfg,
                                                "exchange",
@@ -141,72 +136,6 @@ run (void *cls,
     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 == sender_details)
-  {
-    fprintf (stderr,
-             "No sender details given (sender required)\n");
-    global_ret = 1;
-    return;
-  }
-  jdetails = json_loads (sender_details,
-                         JSON_REJECT_DUPLICATES,
-                         &error);
-  if (NULL == jdetails)
-  {
-    fprintf (stderr,
-             "Failed to parse JSON transaction details `%s': %s (%s)\n",
-             sender_details,
-             error.text,
-             error.source);
-    global_ret = 1;
-    return;
-  }
-  if (NULL == transfer_details)
-  {
-    fprintf (stderr,
-             "No transfer details given (justification required)\n");
-    global_ret = 1;
-    json_decref (jdetails);
-    return;
-  }
-  tdetails = json_loads (transfer_details,
-                         JSON_REJECT_DUPLICATES,
-                         &error);
-  if (NULL == tdetails)
-  {
-    fprintf (stderr,
-             "Failed to parse JSON transaction details `%s': %s (%s)\n",
-             transfer_details,
-             error.text,
-             error.source);
-    global_ret = 1;
-    json_decref (jdetails);
-    return;
-  }
-
   if (NULL ==
       (plugin = TALER_EXCHANGEDB_plugin_load (cfg)))
   {
@@ -218,12 +147,12 @@ run (void *cls,
   if (GNUNET_SYSERR ==
       run_transaction (&reserve_pub,
                        &add_value,
-                       jdetails,
-                       tdetails))
+                       sender_details,
+                       transfer_details))
     global_ret = 1;
   TALER_EXCHANGEDB_plugin_unload (plugin);
-  json_decref (jdetails);
-  json_decref (tdetails);
+  json_decref (transfer_details);
+  json_decref (sender_details);
 }
 
 
@@ -238,19 +167,31 @@ 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},
-    {'s', "sender", "JSON",
-     "details about the sender's bank account", 1,
-     &GNUNET_GETOPT_set_string, &sender_details},
-    {'t', "transfer", "JSON",
-     "details that uniquely identify the bank transfer", 1,
-     &GNUNET_GETOPT_set_string, &transfer_details},
+    GNUNET_GETOPT_OPTION_MANDATORY
+    (TALER_getopt_get_amount ('a',
+                              "add",
+                              "DENOM",
+                              "value to add",
+                              &add_value)),
+    GNUNET_GETOPT_OPTION_MANDATORY
+    (GNUNET_JSON_getopt ('s',
+                         "sender",
+                         "JSON",
+                         "details about the sender's bank account",
+                         &sender_details)),
+    GNUNET_GETOPT_OPTION_MANDATORY
+    (GNUNET_JSON_getopt ('t',
+                         "transfer",
+                         "JSON",
+                         "details that uniquely identify the bank transfer",
+                         &transfer_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_MANDATORY
+    (GNUNET_GETOPT_OPTION_SET_BASE32_AUTO ('R',
+                                          "reserve",
+                                          "KEY",
+                                          "reserve (public key) to modify",
+                                           &reserve_pub)),
     GNUNET_GETOPT_OPTION_END
   };
 
diff --git a/src/exchange-tools/taler-exchange-wire.c 
b/src/exchange-tools/taler-exchange-wire.c
index 7249398..b7f6af8 100644
--- a/src/exchange-tools/taler-exchange-wire.c
+++ b/src/exchange-tools/taler-exchange-wire.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2015, 2016 Inria
+  Copyright (C) 2015, 2016, 2017 Inria
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU General Public License as published by the Free Software
@@ -35,12 +35,12 @@ static char *masterkeyfile;
 /**
  * Account holder information in JSON format.
  */
-static char *json_in;
+static json_t *account_holder;
 
 /**
  * Which wire method is this for?
  */
-static const char *method;
+static char *method;
 
 /**
  * Where to write the result.
@@ -70,8 +70,6 @@ run (void *cls,
   struct GNUNET_CRYPTO_EddsaPrivateKey *eddsa_priv;
   struct TALER_MasterPrivateKeyP key;
   struct TALER_MasterSignatureP sig;
-  json_t *j;
-  json_error_t err;
   char *json_out;
   struct GNUNET_HashCode salt;
   struct TALER_WIRE_Plugin *plugin;
@@ -101,40 +99,26 @@ run (void *cls,
     global_ret = 1;
     return;
   }
-  if (NULL == json_in)
-  {
-    fprintf (stderr,
-             "Required -j argument missing\n");
-    global_ret = 1;
-    return;
-  }
-  j = json_loads (json_in,
-                  JSON_REJECT_DUPLICATES,
-                  &err);
-  if (NULL == j)
-  {
-    fprintf (stderr,
-             "Failed to parse JSON: %s (at offset %u)\n",
-             err.text,
-             (unsigned int) err.position);
-    global_ret = 1;
-    return;
-  }
   if (NULL == method)
   {
     json_t *test;
-    test = json_object_get(j, "type");
-    if (NULL == test || (NULL == (method = json_string_value (test))))
+    const char *m;
+
+    test = json_object_get(account_holder,
+                           "type");
+    if ( (NULL == test) ||
+         (NULL == (m = json_string_value (test))))
     {
       fprintf (stderr,
                "Required -t argument missing\n");
       global_ret = 1;
       return;
     }
+    method = GNUNET_strdup (m);
   }
   else
   {
-    json_object_set_new (j,
+    json_object_set_new (account_holder,
                          "type",
                          json_string (method));
   }
@@ -149,18 +133,20 @@ run (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 "Wire transfer method `%s' not supported\n",
                 method);
+    GNUNET_free (method);
     global_ret = 1;
     return;
   }
+  GNUNET_free (method);
   if (GNUNET_OK !=
       plugin->sign_wire_details (plugin->cls,
-                                 j,
+                                 account_holder,
                                  &key,
                                  &salt,
                                  &sig))
   {
     /* sign function should have logged applicable errors */
-    json_decref (j);
+    json_decref (account_holder);
     TALER_WIRE_plugin_unload (plugin);
     global_ret = 1;
     return;
@@ -169,18 +155,19 @@ run (void *cls,
   GNUNET_free (eddsa_priv);
 
   /* add signature and salt to JSON message */
-  json_object_set_new (j,
+  json_object_set_new (account_holder,
                        "salt",
                        GNUNET_JSON_from_data (&salt,
                                               sizeof (salt)));
-  json_object_set_new (j,
+  json_object_set_new (account_holder,
                        "sig",
                        GNUNET_JSON_from_data (&sig,
                                               sizeof (sig)));
 
   /* dump result to stdout */
-  json_out = json_dumps (j, JSON_INDENT(2));
-  json_decref (j);
+  json_out = json_dumps (account_holder,
+                         JSON_INDENT(2));
+  json_decref (account_holder);
   GNUNET_assert (NULL != json_out);
 
   if (NULL != output_filename)
@@ -219,18 +206,27 @@ main (int argc,
       char *const *argv)
 {
   const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    {'j', "json", "JSON",
-     "account information in JSON format", 1,
-     &GNUNET_GETOPT_set_string, &json_in},
-    {'m', "master-key", "FILE",
-     "master key file (private key)", 1,
-     &GNUNET_GETOPT_set_filename, &masterkeyfile},
-    {'t', "type", "METHOD",
-     "which wire transfer method (i.e. 'test' or 'sepa') is this for?", 1,
-     &GNUNET_GETOPT_set_string, &method},
-    {'o', "output", "FILE",
-     "where to write the result", 1,
-     &GNUNET_GETOPT_set_filename, &output_filename},
+    GNUNET_GETOPT_OPTION_MANDATORY
+    (GNUNET_JSON_getopt ('j',
+                         "json",
+                         "JSON",
+                         "account information in JSON format",
+                         &account_holder)),
+    GNUNET_GETOPT_OPTION_FILENAME ('m',
+                                   "master-key",
+                                   "FILENAME",
+                                   "master key file (private key)",
+                                   &masterkeyfile),
+    GNUNET_GETOPT_OPTION_STRING ('t',
+                                 "type",
+                                 "METHOD",
+                                 "which wire transfer method (i.e. 'test' or 
'sepa') is this for?",
+                                 &method),
+    GNUNET_GETOPT_OPTION_FILENAME ('o',
+                                   "output",
+                                   "FILENAME",
+                                   "where to write the result",
+                                   &output_filename),
     GNUNET_GETOPT_OPTION_END
   };
 
diff --git a/src/exchange/taler-exchange-aggregator.c 
b/src/exchange/taler-exchange-aggregator.c
index cbf3fb5..ae4ee24 100644
--- a/src/exchange/taler-exchange-aggregator.c
+++ b/src/exchange/taler-exchange-aggregator.c
@@ -1198,10 +1198,11 @@ int
 main (int argc,
       char *const *argv)
 {
-  static const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    {'t', "test", NULL,
-     "run in test mode and exit when idle", 0,
-     &GNUNET_GETOPT_set_one, &test_mode},
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_OPTION_SET_ONE ('t',
+                                  "test",
+                                  "run in test mode and exit when idle",
+                                  &test_mode),
     GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION),
     GNUNET_GETOPT_OPTION_END
   };
diff --git a/src/exchange/taler-exchange-httpd.c 
b/src/exchange/taler-exchange-httpd.c
index fa000d0..6b430d7 100644
--- a/src/exchange/taler-exchange-httpd.c
+++ b/src/exchange/taler-exchange-httpd.c
@@ -934,23 +934,30 @@ main (int argc,
   char *loglev = NULL;
   char *logfile = NULL;
   const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    {'C', "connection-close", NULL,
-     "force HTTP connections to be closed after each request", 0,
-     &GNUNET_GETOPT_set_one, &TEH_exchange_connection_close},
+    GNUNET_GETOPT_OPTION_SET_ONE ('C',
+                                  "connection-close",
+                                  "force HTTP connections to be closed after 
each request",
+                                  &TEH_exchange_connection_close),
     GNUNET_GETOPT_OPTION_CFG_FILE (&cfgfile),
-    {'D', "disable-admin", NULL,
-     "do not run the /admin-HTTP server", 0,
-     &GNUNET_GETOPT_set_one, &no_admin},
-    {'i', "init-db", NULL,
-     "create database tables and indicies if necessary", 0,
-     &GNUNET_GETOPT_set_one, &init_db},
-    {'t', "timeout", "SECONDS",
-     "after how long do connections timeout by default (in seconds)", 1,
-     &GNUNET_GETOPT_set_uint, &connection_timeout},
+    GNUNET_GETOPT_OPTION_SET_ONE ('D',
+                                  "disable-admin",
+                                  "do not run the /admin-HTTP server",
+                                  &no_admin),
+    GNUNET_GETOPT_OPTION_SET_ONE ('i',
+                                  "init-db",
+                                  "create database tables and indicies if 
necessary",
+                                  &init_db),
+   GNUNET_GETOPT_OPTION_SET_UINT ('t',
+                                  "timeout",
+                                  "SECONDS",
+                                  "after how long do connections timeout by 
default (in seconds)",
+                                  &connection_timeout),
 #if HAVE_DEVELOPER
-    {'f', "file-input", "FILENAME",
-     "run in test-mode using FILENAME as the HTTP request to process", 1,
-     &GNUNET_GETOPT_set_filename, &input_filename},
+   GNUNET_GETOPT_OPTION_FILENAME ('f',
+                                  "file-input",
+                                  "FILENAME",
+                                  "run in test-mode using FILENAME as the HTTP 
request to process",
+                                  &input_filename),
 #endif
     GNUNET_GETOPT_OPTION_HELP ("HTTP server providing a RESTful API to access 
a Taler exchange"),
     GNUNET_GETOPT_OPTION_LOGLEVEL (&loglev),
diff --git a/src/include/taler_amount_lib.h b/src/include/taler_amount_lib.h
index 555894f..e6c36fe 100644
--- a/src/include/taler_amount_lib.h
+++ b/src/include/taler_amount_lib.h
@@ -152,6 +152,16 @@ TALER_amount_get_zero (const char *cur,
 
 
 /**
+ * Test if the given amount is valid.
+ *
+ * @param amount amount to check
+ * @return #GNUNET_OK if @a amount is valid
+ */
+int
+TALER_amount_is_valid (const struct TALER_Amount *amount);
+
+
+/**
  * Convert amount from host to network representation.
  *
  * @param res where to store amount in network representation
diff --git a/src/include/taler_util.h b/src/include/taler_util.h
index c115594..34e07a3 100644
--- a/src/include/taler_util.h
+++ b/src/include/taler_util.h
@@ -111,6 +111,23 @@ TALER_config_get_denom (const struct 
GNUNET_CONFIGURATION_Handle *cfg,
 
 
 /**
+ * Allow user to specify an amount on the command line.
+ *
+ * @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] amount set to the amount specified at the command line
+ */
+struct GNUNET_GETOPT_CommandLineOption
+TALER_getopt_get_amount (char shortName,
+                         const char *name,
+                         const char *argumentHelp,
+                         const char *description,
+                         struct TALER_Amount *amount);
+
+
+/**
  * Return default project data used by Taler.
  */
 const struct GNUNET_OS_ProjectData *
diff --git a/src/util/amount.c b/src/util/amount.c
index 7684ddf..44eefe6 100644
--- a/src/util/amount.c
+++ b/src/util/amount.c
@@ -252,16 +252,15 @@ invalidate (struct TALER_Amount *a)
 
 
 /**
- * Test if @a a is valid
+ * Test if the given amount is valid.
  *
- * @param a amount to test
- * @return #GNUNET_YES if valid,
- *         #GNUNET_NO if invalid
+ * @param amount amount to check
+ * @return #GNUNET_OK if @a amount is valid
  */
-static int
-test_valid (const struct TALER_Amount *a)
+int
+TALER_amount_is_valid (const struct TALER_Amount *amount)
 {
-  return ('\0' != a->currency[0]);
+  return ('\0' != amount->currency[0]);
 }
 
 
@@ -292,8 +291,8 @@ int
 TALER_amount_cmp_currency (const struct TALER_Amount *a1,
                            const struct TALER_Amount *a2)
 {
-  if ( (GNUNET_NO == test_valid (a1)) ||
-       (GNUNET_NO == test_valid (a2)) )
+  if ( (GNUNET_NO == TALER_amount_is_valid (a1)) ||
+       (GNUNET_NO == TALER_amount_is_valid (a2)) )
     return GNUNET_SYSERR;
   if (0 == strcasecmp (a1->currency,
                       a2->currency))
@@ -499,7 +498,7 @@ TALER_amount_normalize (struct TALER_Amount *amount)
 {
   int ret;
 
-  if (GNUNET_YES != test_valid (amount))
+  if (GNUNET_YES != TALER_amount_is_valid (amount))
     return GNUNET_SYSERR;
   ret = GNUNET_NO;
   while ( (amount->value != UINT64_MAX) &&
@@ -535,7 +534,7 @@ TALER_amount_to_string (const struct TALER_Amount *amount)
   unsigned int i;
   struct TALER_Amount norm;
 
-  if (GNUNET_YES != test_valid (amount))
+  if (GNUNET_YES != TALER_amount_is_valid (amount))
     return NULL;
   norm = *amount;
   GNUNET_break (GNUNET_SYSERR !=
diff --git a/src/util/util.c b/src/util/util.c
index e01a2cc..8976b0a 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -93,4 +93,70 @@ TALER_config_get_denom (const struct 
GNUNET_CONFIGURATION_Handle *cfg,
 }
 
 
+
+
+/**
+ * Set an option with an amount 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.
+ *
+ * @param ctx command line processing context
+ * @param scls additional closure (will point to the `struct TALER_Amount`)
+ * @param option name of the option
+ * @param value actual value of the option as a string.
+ * @return #GNUNET_OK if parsing the value worked
+ */
+static int
+set_amount (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+            void *scls,
+            const char *option,
+            const char *value)
+{
+  struct TALER_Amount *amount = scls;
+
+  if (GNUNET_OK !=
+      TALER_string_to_amount (value,
+                              amount))
+  {
+    FPRINTF (stderr,
+             _("Failed to parse amount in option `%s'\n"),
+             option);
+    return GNUNET_SYSERR;
+  }
+
+  return GNUNET_OK;
+}
+
+
+/**
+ * Allow user to specify an amount on the command line.
+ *
+ * @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] amount set to the amount specified at the command line
+ */
+struct GNUNET_GETOPT_CommandLineOption
+TALER_getopt_get_amount (char shortName,
+                         const char *name,
+                         const char *argumentHelp,
+                         const char *description,
+                         struct TALER_Amount *amount)
+{
+  struct GNUNET_GETOPT_CommandLineOption clo = {
+    .shortName =  shortName,
+    .name = name,
+    .argumentHelp = argumentHelp,
+    .description = description,
+    .require_argument = 1,
+    .processor = &set_amount,
+    .scls = (void *) amount
+  };
+
+  return clo;
+}
+
+
 /* end of util.c */

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]