gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated (4eb95884 -> a25429ca)


From: gnunet
Subject: [taler-exchange] branch master updated (4eb95884 -> a25429ca)
Date: Sat, 11 Dec 2021 20:06:22 +0100

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

grothoff pushed a change to branch master
in repository exchange.

    from 4eb95884 -more logging, less hanging ;-)
     new 40175318 towards simplified / more efficient /recoup
     new a25429ca fix #7123

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/curl/curl.c                            |  13 ---
 src/exchange/taler-exchange-httpd_recoup.c | 123 +++++++++++++------------
 src/lib/exchange_api_common.c              |  17 ----
 src/lib/exchange_api_curl_defaults.c       |  14 +--
 src/lib/exchange_api_handle.c              | 139 +----------------------------
 src/lib/exchange_api_link.c                |  19 ----
 6 files changed, 69 insertions(+), 256 deletions(-)

diff --git a/src/curl/curl.c b/src/curl/curl.c
index 424c41fd..5009fa3c 100644
--- a/src/curl/curl.c
+++ b/src/curl/curl.c
@@ -30,14 +30,6 @@
 #endif
 
 
-/**
- * Add the @a body as POST data to the easy handle in @a ctx.
- *
- * @param[in,out] ctx a request context (updated)
- * @param eh easy handle to use
- * @param body JSON body to add to @e ctx
- * @return #GNUNET_OK on success #GNUNET_SYSERR on failure
- */
 enum GNUNET_GenericReturnValue
 TALER_curl_easy_post (struct TALER_CURL_PostContext *ctx,
                       CURL *eh,
@@ -101,11 +93,6 @@ TALER_curl_easy_post (struct TALER_CURL_PostContext *ctx,
 }
 
 
-/**
- * Free the data in @a ctx.
- *
- * @param[in] ctx a request context (updated)
- */
 void
 TALER_curl_easy_post_finished (struct TALER_CURL_PostContext *ctx)
 {
diff --git a/src/exchange/taler-exchange-httpd_recoup.c 
b/src/exchange/taler-exchange-httpd_recoup.c
index 24f1073e..c2cae086 100644
--- a/src/exchange/taler-exchange-httpd_recoup.c
+++ b/src/exchange/taler-exchange-httpd_recoup.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2017-2020 Taler Systems SA
+  Copyright (C) 2017-2021 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Affero General Public License as published by the Free 
Software
@@ -28,6 +28,7 @@
 #include <pthread.h>
 #include "taler_json_lib.h"
 #include "taler_mhd_lib.h"
+#include "taler-exchange-httpd_db.h"
 #include "taler-exchange-httpd_recoup.h"
 #include "taler-exchange-httpd_responses.h"
 #include "taler-exchange-httpd_keys.h"
@@ -94,9 +95,9 @@ struct RecoupContext
   struct GNUNET_TIME_Absolute now;
 
   /**
-   * #GNUNET_YES if the client claims the coin originated from a refresh.
+   * true if the client claims the coin originated from a refresh.
    */
-  int refreshed;
+  bool refreshed;
 
 };
 
@@ -129,57 +130,10 @@ recoup_transaction (void *cls,
   struct TALER_Amount spent;
   struct TALER_Amount recouped;
   enum GNUNET_DB_QueryStatus qs;
-  int existing_recoup_found;
+  bool existing_recoup_found;
 
   /* Check whether a recoup is allowed, and if so, to which
      reserve / account the money should go */
-  if (pc->refreshed)
-  {
-    qs = TEH_plugin->get_old_coin_by_h_blind (TEH_plugin->cls,
-                                              &pc->h_blind,
-                                              &pc->target.old_coin_pub);
-    if (0 > qs)
-    {
-      if (GNUNET_DB_STATUS_HARD_ERROR == qs)
-      {
-        GNUNET_break (0);
-        *mhd_ret = TALER_MHD_reply_with_error (connection,
-                                               MHD_HTTP_INTERNAL_SERVER_ERROR,
-                                               
TALER_EC_GENERIC_DB_FETCH_FAILED,
-                                               "old coin by h_blind");
-      }
-      return qs;
-    }
-  }
-  else
-  {
-    qs = TEH_plugin->get_reserve_by_h_blind (TEH_plugin->cls,
-                                             &pc->h_blind,
-                                             &pc->target.reserve_pub);
-    if (0 > qs)
-    {
-      if (GNUNET_DB_STATUS_HARD_ERROR == qs)
-      {
-        GNUNET_break (0);
-        *mhd_ret = TALER_MHD_reply_with_error (connection,
-                                               MHD_HTTP_INTERNAL_SERVER_ERROR,
-                                               
TALER_EC_GENERIC_DB_FETCH_FAILED,
-                                               "reserve by h_blind");
-      }
-      return qs;
-    }
-  }
-  if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                "Recoup requested for unknown envelope %s\n",
-                GNUNET_h2s (&pc->h_blind.hash));
-    *mhd_ret = TALER_MHD_reply_with_error (connection,
-                                           MHD_HTTP_NOT_FOUND,
-                                           
TALER_EC_EXCHANGE_RECOUP_WITHDRAW_NOT_FOUND,
-                                           NULL);
-    return GNUNET_DB_STATUS_HARD_ERROR;
-  }
 
   /* Calculate remaining balance, including recoups already applied. */
   qs = TEH_plugin->get_coin_transactions (TEH_plugin->cls,
@@ -206,7 +160,7 @@ recoup_transaction (void *cls,
                  TALER_amount_set_zero (pc->value.currency,
                                         &recouped));
   /* Check if this coin has been recouped already at least once */
-  existing_recoup_found = GNUNET_NO;
+  existing_recoup_found = false;
   for (struct TALER_EXCHANGEDB_TransactionList *pos = tl;
        NULL != pos;
        pos = pos->next)
@@ -214,7 +168,7 @@ recoup_transaction (void *cls,
     if ( (TALER_EXCHANGEDB_TT_RECOUP == pos->type) ||
          (TALER_EXCHANGEDB_TT_RECOUP_REFRESH == pos->type) )
     {
-      existing_recoup_found = GNUNET_YES;
+      existing_recoup_found = true;
       break;
     }
   }
@@ -252,8 +206,7 @@ recoup_transaction (void *cls,
                                            NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
-  if ( (0 == pc->amount.fraction) &&
-       (0 == pc->amount.value) )
+  if (TALER_amount_is_zero (&pc->amount))
   {
     /* Recoup has no effect: coin fully spent! */
     enum GNUNET_DB_QueryStatus ret;
@@ -332,7 +285,7 @@ recoup_transaction (void *cls,
  * @param coin information about the coin
  * @param coin_bks blinding data of the coin (to be checked)
  * @param coin_sig signature of the coin
- * @param refreshed #GNUNET_YES if the coin was refreshed
+ * @param refreshed true if the coin was refreshed
  * @return MHD result code
  */
 static MHD_RESULT
@@ -341,7 +294,7 @@ verify_and_execute_recoup (
   const struct TALER_CoinPublicInfo *coin,
   const union TALER_DenominationBlindingKeyP *coin_bks,
   const struct TALER_CoinSpendSignatureP *coin_sig,
-  int refreshed)
+  bool refreshed)
 {
   struct RecoupContext pc;
   const struct TEH_DenominationKey *dk;
@@ -460,7 +413,6 @@ verify_and_execute_recoup (
     GNUNET_free (coin_ev);
   }
 
-  /* Perform actual recoup transaction */
   pc.coin_sig = coin_sig;
   pc.coin_bks = coin_bks;
   pc.coin = coin;
@@ -480,6 +432,53 @@ verify_and_execute_recoup (
       return mhd_ret;
   }
 
+  {
+    enum GNUNET_DB_QueryStatus qs;
+
+    if (pc.refreshed)
+    {
+      qs = TEH_plugin->get_old_coin_by_h_blind (TEH_plugin->cls,
+                                                &pc.h_blind,
+                                                &pc.target.old_coin_pub);
+      if (0 > qs)
+      {
+        GNUNET_break (0);
+        return TALER_MHD_reply_with_error (
+          connection,
+          MHD_HTTP_INTERNAL_SERVER_ERROR,
+          TALER_EC_GENERIC_DB_FETCH_FAILED,
+          "old coin by h_blind");
+      }
+    }
+    else
+    {
+      qs = TEH_plugin->get_reserve_by_h_blind (TEH_plugin->cls,
+                                               &pc.h_blind,
+                                               &pc.target.reserve_pub);
+      if (0 > qs)
+      {
+        GNUNET_break (0);
+        return TALER_MHD_reply_with_error (
+          connection,
+          MHD_HTTP_INTERNAL_SERVER_ERROR,
+          TALER_EC_GENERIC_DB_FETCH_FAILED,
+          "reserve by h_blind");
+      }
+    }
+    if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                  "Recoup requested for unknown envelope %s\n",
+                  GNUNET_h2s (&pc.h_blind.hash));
+      return TALER_MHD_reply_with_error (
+        connection,
+        MHD_HTTP_NOT_FOUND,
+        TALER_EC_EXCHANGE_RECOUP_WITHDRAW_NOT_FOUND,
+        NULL);
+    }
+  }
+
+  /* Perform actual recoup transaction */
   {
     MHD_RESULT mhd_ret;
 
@@ -531,7 +530,7 @@ TEH_handler_recoup (struct MHD_Connection *connection,
   struct TALER_CoinPublicInfo coin;
   union TALER_DenominationBlindingKeyP coin_bks;
   struct TALER_CoinSpendSignatureP coin_sig;
-  int refreshed = GNUNET_NO;
+  bool refreshed = false;
   struct GNUNET_JSON_Specification spec[] = {
     GNUNET_JSON_spec_fixed_auto ("denom_pub_hash",
                                  &coin.denom_pub_hash),
@@ -541,9 +540,9 @@ TEH_handler_recoup (struct MHD_Connection *connection,
                                  &coin_bks),
     GNUNET_JSON_spec_fixed_auto ("coin_sig",
                                  &coin_sig),
-    GNUNET_JSON_spec_mark_optional
-      (GNUNET_JSON_spec_boolean ("refreshed",
-                                 &refreshed)),
+    GNUNET_JSON_spec_mark_optional (
+      GNUNET_JSON_spec_bool ("refreshed",
+                             &refreshed)),
     GNUNET_JSON_spec_end ()
   };
 
diff --git a/src/lib/exchange_api_common.c b/src/lib/exchange_api_common.c
index 4f6588a2..98a6ab20 100644
--- a/src/lib/exchange_api_common.c
+++ b/src/lib/exchange_api_common.c
@@ -386,12 +386,6 @@ TALER_EXCHANGE_parse_reserve_history (
 }
 
 
-/**
- * Free memory (potentially) allocated by 
#TALER_EXCHANGE_parse_reserve_history().
- *
- * @param rhistory result to free
- * @param len number of entries in @a rhistory
- */
 void
 TALER_EXCHANGE_free_reserve_history (
   struct TALER_EXCHANGE_ReserveHistory *rhistory,
@@ -416,17 +410,6 @@ TALER_EXCHANGE_free_reserve_history (
 }
 
 
-/**
- * Verify a coins transaction history as returned by the exchange.
- *
- * @param dk fee structure for the coin, NULL to skip verifying fees
- * @param currency expected currency for the coin
- * @param coin_pub public key of the coin
- * @param history history of the coin in json encoding
- * @param[out] h_denom_pub set to the hash of the coin's denomination (if 
available)
- * @param[out] total how much of the coin has been spent according to @a 
history
- * @return #GNUNET_OK if @a history is valid, #GNUNET_SYSERR if not
- */
 enum GNUNET_GenericReturnValue
 TALER_EXCHANGE_verify_coin_history (
   const struct TALER_EXCHANGE_DenomPublicKey *dk,
diff --git a/src/lib/exchange_api_curl_defaults.c 
b/src/lib/exchange_api_curl_defaults.c
index 82d3ace1..6d601695 100644
--- a/src/lib/exchange_api_curl_defaults.c
+++ b/src/lib/exchange_api_curl_defaults.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2014-2018 Taler Systems SA
+  Copyright (C) 2014-2018, 2021 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 by the Free Software
@@ -23,12 +23,6 @@
 #include "exchange_api_curl_defaults.h"
 
 
-/**
- * Get a curl handle with the right defaults for the exchange lib.  In the
- * future, we might manage a pool of connections here.
- *
- * @param url URL to query
- */
 CURL *
 TALER_EXCHANGE_curl_easy_get_ (const char *url)
 {
@@ -45,6 +39,12 @@ TALER_EXCHANGE_curl_easy_get_ (const char *url)
                  curl_easy_setopt (eh,
                                    CURLOPT_FOLLOWLOCATION,
                                    1L));
+  /* Enable compression (using whatever curl likes), see
+     https://curl.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html  */
+  GNUNET_break (CURLE_OK ==
+                curl_easy_setopt (eh,
+                                  CURLOPT_ACCEPT_ENCODING,
+                                  ""));
   /* limit MAXREDIRS to 5 as a simple security measure against
      a potential infinite loop caused by a malicious target */
   GNUNET_assert (CURLE_OK ==
diff --git a/src/lib/exchange_api_handle.c b/src/lib/exchange_api_handle.c
index 49e39a0e..5898a0df 100644
--- a/src/lib/exchange_api_handle.c
+++ b/src/lib/exchange_api_handle.c
@@ -166,13 +166,6 @@ struct KeysRequest
 };
 
 
-/**
- * Signature of functions called with the result from our call to the
- * auditor's /deposit-confirmation handler.
- *
- * @param cls closure of type `struct TEAH_AuditorInteractionEntry *`
- * @param hr HTTP response
- */
 void
 TEAH_acc_confirmation_cb (void *cls,
                           const struct TALER_AUDITOR_HttpResponse *hr)
@@ -195,15 +188,6 @@ TEAH_acc_confirmation_cb (void *cls,
 }
 
 
-/**
- * Iterate over all available auditors for @a h, calling
- * @a ac and giving it a chance to start a deposit
- * confirmation interaction.
- *
- * @param h exchange to go over auditors for
- * @param ac function to call per auditor
- * @param ac_cls closure for @a ac
- */
 void
 TEAH_get_auditors_for_dc (struct TALER_EXCHANGE_Handle *h,
                           TEAH_AuditorCallback ac,
@@ -1054,12 +1038,6 @@ static void
 request_keys (void *cls);
 
 
-/**
- * Let the user set the last valid denomination time manually.
- *
- * @param exchange the exchange handle.
- * @param last_denom_new new last denomination time.
- */
 void
 TALER_EXCHANGE_set_last_denom (struct TALER_EXCHANGE_Handle *exchange,
                                struct GNUNET_TIME_Absolute last_denom_new)
@@ -1071,14 +1049,6 @@ TALER_EXCHANGE_set_last_denom (struct 
TALER_EXCHANGE_Handle *exchange,
 }
 
 
-/**
- * Check if our current response for /keys is valid, and if
- * not trigger download.
- *
- * @param exchange exchange to check keys for
- * @param flags options controlling when to download what
- * @return until when the response is current, 0 if we are re-downloading
- */
 struct GNUNET_TIME_Absolute
 TALER_EXCHANGE_check_keys_current (struct TALER_EXCHANGE_Handle *exchange,
                                    enum TALER_EXCHANGE_CheckKeysFlags flags)
@@ -1330,12 +1300,6 @@ keys_completed_cb (void *cls,
 /* ********************* library internal API ********* */
 
 
-/**
- * Get the context of a exchange.
- *
- * @param h the exchange handle to query
- * @return ctx context to execute jobs in
- */
 struct GNUNET_CURL_Context *
 TEAH_handle_to_context (struct TALER_EXCHANGE_Handle *h)
 {
@@ -1343,12 +1307,6 @@ TEAH_handle_to_context (struct TALER_EXCHANGE_Handle *h)
 }
 
 
-/**
- * Check if the handle is ready to process requests.
- *
- * @param h the exchange handle to query
- * @return #GNUNET_YES if we are ready, #GNUNET_NO if not
- */
 enum GNUNET_GenericReturnValue
 TEAH_handle_is_ready (struct TALER_EXCHANGE_Handle *h)
 {
@@ -1356,13 +1314,6 @@ TEAH_handle_is_ready (struct TALER_EXCHANGE_Handle *h)
 }
 
 
-/**
- * Obtain the URL to use for an API request.
- *
- * @param h handle for the exchange
- * @param path Taler API path (i.e. "/reserve/withdraw")
- * @return the full URL to use with cURL
- */
 char *
 TEAH_path_to_url (struct TALER_EXCHANGE_Handle *h,
                   const char *path)
@@ -1611,17 +1562,6 @@ deserialize_data (struct TALER_EXCHANGE_Handle *exchange,
 }
 
 
-/**
- * Serialize the latest key data from @a
- * exchange to be persisted on disk (to be used with
- * #TALER_EXCHANGE_OPTION_DATA to more efficiently recover
- * the state).
- *
- * @param exchange which exchange's key and wire data should be
- *        serialized
- * @return NULL on error (i.e. no current data available);
- *         otherwise JSON object owned by the caller
- */
 json_t *
 TALER_EXCHANGE_serialize_data (struct TALER_EXCHANGE_Handle *exchange)
 {
@@ -1790,24 +1730,6 @@ TALER_EXCHANGE_serialize_data (struct 
TALER_EXCHANGE_Handle *exchange)
 }
 
 
-/**
- * Initialise a connection to the exchange. Will connect to the
- * exchange and obtain information about the exchange's master
- * public key and the exchange's auditor.
- * The respective information will be passed to the @a cert_cb
- * once available, and all future interactions with the exchange
- * will be checked to be signed (where appropriate) by the
- * respective master key.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param cert_cb function to call with the exchange's
- *        certification information
- * @param cert_cb_cls closure for @a cert_cb
- * @param ... list of additional arguments,
- *        terminated by #TALER_EXCHANGE_OPTION_END.
- * @return the exchange handle; NULL upon error
- */
 struct TALER_EXCHANGE_Handle *
 TALER_EXCHANGE_connect (
   struct GNUNET_CURL_Context *ctx,
@@ -1825,7 +1747,7 @@ TALER_EXCHANGE_connect (
   /* Disable 100 continue processing */
   GNUNET_break (GNUNET_OK ==
                 GNUNET_CURL_append_header (ctx,
-                                           "Expect:"));
+                                           MHD_HTTP_HEADER_EXPECT ":"));
   exchange = GNUNET_new (struct TALER_EXCHANGE_Handle);
   exchange->ctx = ctx;
   exchange->url = GNUNET_strdup (url);
@@ -1968,11 +1890,6 @@ request_keys (void *cls)
 }
 
 
-/**
- * Disconnect from the exchange
- *
- * @param exchange the exchange handle
- */
 void
 TALER_EXCHANGE_disconnect (struct TALER_EXCHANGE_Handle *exchange)
 {
@@ -2025,14 +1942,6 @@ TALER_EXCHANGE_disconnect (struct TALER_EXCHANGE_Handle 
*exchange)
 }
 
 
-/**
- * Test if the given @a pub is a the current signing key from the exchange
- * according to @a keys.
- *
- * @param keys the exchange's key set
- * @param pub claimed current online signing key for the exchange
- * @return #GNUNET_OK if @a pub is (according to /keys) a current signing key
- */
 enum GNUNET_GenericReturnValue
 TALER_EXCHANGE_test_signing_key (const struct TALER_EXCHANGE_Keys *keys,
                                  const struct TALER_ExchangePublicKeyP *pub)
@@ -2058,12 +1967,6 @@ TALER_EXCHANGE_test_signing_key (const struct 
TALER_EXCHANGE_Keys *keys,
 }
 
 
-/**
- * Get exchange's base URL.
- *
- * @param exchange exchange handle.
- * @return the base URL from the handle.
- */
 const char *
 TALER_EXCHANGE_get_base_url (const struct TALER_EXCHANGE_Handle *exchange)
 {
@@ -2071,14 +1974,6 @@ TALER_EXCHANGE_get_base_url (const struct 
TALER_EXCHANGE_Handle *exchange)
 }
 
 
-/**
- * Obtain the denomination key details from the exchange.
- *
- * @param keys the exchange's key set
- * @param pk public key of the denomination to lookup
- * @return details about the given denomination key, NULL if the key is
- * not found
- */
 const struct TALER_EXCHANGE_DenomPublicKey *
 TALER_EXCHANGE_get_denomination_key (
   const struct TALER_EXCHANGE_Keys *keys,
@@ -2093,12 +1988,6 @@ TALER_EXCHANGE_get_denomination_key (
 }
 
 
-/**
- * Create a copy of a denomination public key.
- *
- * @param key key to copy
- * @returns a copy, must be freed with #TALER_EXCHANGE_destroy_denomination_key
- */
 struct TALER_EXCHANGE_DenomPublicKey *
 TALER_EXCHANGE_copy_denomination_key (
   const struct TALER_EXCHANGE_DenomPublicKey *key)
@@ -2113,12 +2002,6 @@ TALER_EXCHANGE_copy_denomination_key (
 }
 
 
-/**
- * Destroy a denomination public key.
- * Should only be called with keys created by 
#TALER_EXCHANGE_copy_denomination_key.
- *
- * @param key key to destroy.
- */
 void
 TALER_EXCHANGE_destroy_denomination_key (
   struct TALER_EXCHANGE_DenomPublicKey *key)
@@ -2128,13 +2011,6 @@ TALER_EXCHANGE_destroy_denomination_key (
 }
 
 
-/**
- * Obtain the denomination key details from the exchange.
- *
- * @param keys the exchange's key set
- * @param hc hash of the public key of the denomination to lookup
- * @return details about the given denomination key
- */
 const struct TALER_EXCHANGE_DenomPublicKey *
 TALER_EXCHANGE_get_denomination_key_by_hash (
   const struct TALER_EXCHANGE_Keys *keys,
@@ -2148,12 +2024,6 @@ TALER_EXCHANGE_get_denomination_key_by_hash (
 }
 
 
-/**
- * Obtain the keys from the exchange.
- *
- * @param exchange the exchange handle
- * @return the exchange's key set
- */
 const struct TALER_EXCHANGE_Keys *
 TALER_EXCHANGE_get_keys (struct TALER_EXCHANGE_Handle *exchange)
 {
@@ -2163,13 +2033,6 @@ TALER_EXCHANGE_get_keys (struct TALER_EXCHANGE_Handle 
*exchange)
 }
 
 
-/**
- * Obtain the keys from the exchange in the
- * raw JSON format
- *
- * @param exchange the exchange handle
- * @return the exchange's keys in raw JSON
- */
 json_t *
 TALER_EXCHANGE_get_keys_raw (struct TALER_EXCHANGE_Handle *exchange)
 {
diff --git a/src/lib/exchange_api_link.c b/src/lib/exchange_api_link.c
index a9dc8852..55d3bdb6 100644
--- a/src/lib/exchange_api_link.c
+++ b/src/lib/exchange_api_link.c
@@ -418,19 +418,6 @@ handle_link_finished (void *cls,
 }
 
 
-/**
- * Submit a link request to the exchange and get the exchange's response.
- *
- * This API is typically not used by anyone, it is more a threat against those
- * trying to receive a funds transfer by abusing the refresh protocol.
- *
- * @param exchange the exchange handle; the exchange must be ready to operate
- * @param coin_priv private key to request link data for
- * @param link_cb the callback to call with the useful result of the
- *        refresh operation the @a coin_priv was involved in (if any)
- * @param link_cb_cls closure for @a link_cb
- * @return a handle for this request
- */
 struct TALER_EXCHANGE_LinkHandle *
 TALER_EXCHANGE_link (struct TALER_EXCHANGE_Handle *exchange,
                      const struct TALER_CoinSpendPrivateKeyP *coin_priv,
@@ -496,12 +483,6 @@ TALER_EXCHANGE_link (struct TALER_EXCHANGE_Handle 
*exchange,
 }
 
 
-/**
- * Cancel a link request.  This function cannot be used
- * on a request handle if the callback was already invoked.
- *
- * @param lh the link handle
- */
 void
 TALER_EXCHANGE_link_cancel (struct TALER_EXCHANGE_LinkHandle *lh)
 {

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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