[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taler-mdb] 15/93: fixes
From: |
gnunet |
Subject: |
[taler-taler-mdb] 15/93: fixes |
Date: |
Mon, 18 Nov 2019 21:12:38 +0100 |
This is an automated email from the git hooks/post-receive script.
marco-boss pushed a commit to branch master
in repository taler-mdb.
commit b608bf09e50e71fdc6320bfc33cfea5cf2db5ade
Author: BOSS_Marco <address@hidden>
AuthorDate: Thu Oct 31 17:43:52 2019 +0100
fixes
---
src/communication.c | 351 ++++++++++++++++++++++++++++------------------------
src/configuration.h | 11 +-
src/main.c | 42 +++----
src/nfc.c | 22 ++--
src/product.c | 60 +++++----
5 files changed, 262 insertions(+), 224 deletions(-)
diff --git a/src/communication.c b/src/communication.c
index f9ddcc0..b0fa7ad 100644
--- a/src/communication.c
+++ b/src/communication.c
@@ -33,216 +33,239 @@ along with
int taler_init(CURL **curl)
{
- if( *curl != NULL ){
- printf( "taler_init: curl handle already initialized\n" );
- return EXIT_FAILURE;
- }
-
- // initialize curl
- CURLcode result = curl_global_init( CURL_GLOBAL_ALL );
- *curl = curl_easy_init();
- if( !(*curl) || result != CURLE_OK ){
- printf( "taler_init: could not inizialize curl handle\n" );
- return EXIT_FAILURE;
- }
-
- return EXIT_SUCCESS;
+ CURLcode result;
+
+ if( *curl != NULL ){
+ printf( "taler_init: curl handle already initialized\n" );
+ return EXIT_FAILURE;
+ }
+
+ /* initialize curl */
+ result = curl_global_init( CURL_GLOBAL_ALL );
+ *curl = curl_easy_init();
+ if( !(*curl) || result != CURLE_OK ){
+ printf( "taler_init: could not inizialize curl handle\n" );
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
}
void taler_exit( CURL **curl )
{
- curl_easy_cleanup(*curl);
- curl_global_cleanup();
+ curl_easy_cleanup(*curl);
+ curl_global_cleanup();
}
int taler_alloc_string( char **string, size_t size )
{
- *string = malloc( size );
- if( !(*string) ){
- printf( "taler_alloc: unable to allocate string" );
- exit( EXIT_FAILURE );
- }
- return EXIT_SUCCESS;
+ *string = malloc( size );
+ if( !(*string) ){
+ printf( "taler_alloc: unable to allocate string" );
+ exit( EXIT_FAILURE );
+ }
+ return EXIT_SUCCESS;
}
-static size_t _taler_write_response( void *contents, size_t size, size_t
nmemb, void *userp )
+static size_t _taler_write_response( void *contents, size_t size, size_t nmemb,
+ void *userp )
{
- size_t realSize = size * nmemb;
- struct TalerResponse *response = (struct TalerResponse *)userp;
-
- char *tempString = realloc( response->string, response->size + realSize +
1 );
- if( !tempString ) {
- printf( "Allocation failure" );
- return EXIT_FAILURE;
- }
-
- response->string = tempString;
- memcpy(&( response->string[response->size] ), contents, realSize );
- response->size += realSize;
- response->string[response->size] = 0;
-
- return realSize;
+ char *tempString;
+ size_t realSize = size * nmemb;
+ struct TalerResponse *response = (struct TalerResponse *)userp;
+
+ tempString = realloc( response->string, response->size + realSize + 1 );
+ if( !tempString ) {
+ printf( "Allocation failure" );
+ return EXIT_FAILURE;
+ }
+
+ response->string = tempString;
+ memcpy(&( response->string[response->size] ), contents, realSize );
+ response->size += realSize;
+ response->string[response->size] = 0;
+
+ return realSize;
}
int taler_create_order_req( ProductOrder *product )
{
- // create the string representing the amount, e.g. "KUDOS:2.5" ( +2
because of ':' and '\0' )
- char amountStr[ strlen(product->currency) + strlen(product->amount) + 2 ];
- sprintf( amountStr, "%s:%s", product->currency, product->amount );
-
- // create the fulfillment ur, e.g.
"taler://fulfillment-success/Enjoy+your+ice+cream!"; ( +2 because of '!' and
'\0' )
- char fulfillmentUrl[ strlen(FULLFILLMENT_URL) + strlen(FULLFILLMENT_MSG) +
strlen(product->product) + 2 ];
- sprintf( fulfillmentUrl, "%s%s%s!", FULLFILLMENT_URL, FULLFILLMENT_MSG,
product->product );
-
- // create the json object for the order request
- json_t *orderReq = json_pack( "{ s: { s:s, s:s, s:s }}", "order",
"summary", product->product, "amount", amountStr, "fulfillment_url",
fulfillmentUrl );
- if( !orderReq ){
- printf( "taler_create_order_req: error creating json object\n" );
- return EXIT_FAILURE;
- }
-
- // create the string to send to taler in compact format
- char *buffer = json_dumps( orderReq, JSON_COMPACT );
- if( !buffer ){
- printf("taler_create_order_req: error converting json to string\n");
- return EXIT_FAILURE;
- }
-
- // allocate memory for the string and copy it into the product
- char* temp = realloc( product->orderRequest, strlen(buffer) + 1 );
- if( !temp ){
- printf( "could not allocate order\n" );
- return EXIT_FAILURE;
- }
- product->orderRequest = temp;
- strcpy( product->orderRequest, buffer );
-
- // print the created order request and free the json object
- printf( "Created order Request: \n" );
- json_dumpf( orderReq, stdout, JSON_INDENT(2) );
- printf("\n");
- json_delete( orderReq );
-
- // free the allocated buffer from json_dumps
- free( buffer );
-
- return EXIT_SUCCESS;
+ json_t *orderReq;
+ char* temp;
+
+ /* create the string representing the amount, e.g. "KUDOS:2.5" ( +2 because
of ':' and '\0' ) */
+ char amountStr[ strlen(product->currency) + strlen(product->amount) + 2 ];
+ /* create the fulfillment ur, e.g.
"taler://fulfillment-success/Enjoy+your+ice+cream!"; ( +2 because of '!' and
'\0' ) */
+ char fulfillmentUrl[ strlen(FULLFILLMENT_URL) + strlen(FULLFILLMENT_MSG) +
+ strlen(product->product) + 2 ];
+
+ /* create the strings declared earlier */
+ sprintf( amountStr, "%s:%s", product->currency, product->amount );
+ sprintf( fulfillmentUrl, "%s%s%s!", FULLFILLMENT_URL, FULLFILLMENT_MSG,
+ product->product );
+
+ /* create the json object for the order request */
+ orderReq = json_pack( "{ s: { s:s, s:s, s:s }}", JSON_REQ_ORDER,
+ JSON_REQ_SUMMARY, product->product, JSON_REQ_AMOUNT,
+ amountStr, JSON_REQ_FULFILLMENT, fulfillmentUrl );
+ if( !orderReq ){
+ printf( "taler_create_order_req: error creating json object\n" );
+ return EXIT_FAILURE;
+ }
+
+ /* create the string to send to taler in compact format */
+ char *buffer = json_dumps( orderReq, JSON_COMPACT );
+ if( !buffer ){
+ printf("taler_create_order_req: error converting json to string\n");
+ return EXIT_FAILURE;
+ }
+
+ /* allocate memory for the string and copy it into the product */
+ temp = realloc( product->orderRequest, strlen(buffer) + 1 );
+ if( !temp ){
+ printf( "could not allocate order\n" );
+ return EXIT_FAILURE;
+ }
+ product->orderRequest = temp;
+ strcpy( product->orderRequest, buffer );
+
+ /* print the created order request and free the json object */
+ printf( "Created order Request: \n" );
+ json_dumpf( orderReq, stdout, JSON_INDENT(2) );
+ printf("\n");
+ json_decref( orderReq );
+
+ /* free the allocated buffer from json_dumps */
+ free( buffer );
+
+ return EXIT_SUCCESS;
}
int taler_create_order( CURL *curl, ProductOrder *product )
{
- // reset the response size
- product->response->size = 0;
+ char url[ strlen(BACKEND_BASE_URL) + strlen( ORDER ) + 1 ];
+ struct curl_slist *list = NULL;
+ CURLcode result;
+
+ /* reset the response size */
+ product->response->size = 0;
- // set the url
- char url[ strlen(BACKEND_BASE_URL) + strlen( ORDER ) + 1 ];
- sprintf( url, "%s%s", BACKEND_BASE_URL, ORDER );
- curl_easy_setopt( curl, CURLOPT_URL, url );
+ /* set the url */
+ sprintf( url, "%s%s", BACKEND_BASE_URL, ORDER );
+ curl_easy_setopt( curl, CURLOPT_URL, url );
- // set the authentication headers
- struct curl_slist *list = NULL;
- list = curl_slist_append( list, AUTH_HEADER );
- curl_easy_setopt( curl, CURLOPT_HTTPHEADER, list );
+ /* set the authentication headers */
+ list = curl_slist_append( list, AUTH_HEADER );
+ curl_easy_setopt( curl, CURLOPT_HTTPHEADER, list );
- // curl option "post"
- curl_easy_setopt( curl, CURLOPT_HTTPPOST, true );
- curl_easy_setopt( curl, CURLOPT_POSTFIELDS, product->orderRequest );
+ /* curl option "post" */
+ curl_easy_setopt( curl, CURLOPT_HTTPPOST, true );
+ curl_easy_setopt( curl, CURLOPT_POSTFIELDS, product->orderRequest );
- // pass the write function and the struct to write to
- curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, _taler_write_response );
- curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)product->response );
+ /* pass the write function and the struct to write to */
+ curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, _taler_write_response );
+ curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)product->response );
- // perform the call
- CURLcode result = curl_easy_perform( curl );
- if( result != CURLE_OK ){
- printf( "could not communicate with \"%s\"\n", url );
- return EXIT_FAILURE;
- }
+ /* perform the call */
+ result = curl_easy_perform( curl );
+ if( result != CURLE_OK ){
+ printf( "could not communicate with \"%s\"\n", url );
+ return EXIT_FAILURE;
+ }
- // reset the curl options
- curl_easy_reset( curl );
+ /* reset the curl options */
+ curl_easy_reset( curl );
- // clean up
- curl_slist_free_all( list );
+ /* clean up */
+ curl_slist_free_all( list );
- printf("%s\n", product->response->string );
+ printf("%s\n", product->response->string );
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}
int taler_check_payment_status( CURL *curl, ProductOrder *product )
{
- // reset the response size
- product->response->size = 0;
+ struct curl_slist *list = NULL;
+ CURLcode result;
- // set the url
- curl_easy_setopt( curl, CURLOPT_URL, product->checkUrl );
+ /* reset the response size */
+ product->response->size = 0;
- // set the authentication headers
- struct curl_slist *list = NULL;
- list = curl_slist_append( list, AUTH_HEADER );
- curl_easy_setopt( curl, CURLOPT_HTTPHEADER, list );
+ /* set the url */
+ curl_easy_setopt( curl, CURLOPT_URL, product->checkUrl );
- // curl option "get"
- curl_easy_setopt( curl, CURLOPT_HTTPGET, true );
+ /* set the authentication headers */
+ list = curl_slist_append( list, AUTH_HEADER );
+ curl_easy_setopt( curl, CURLOPT_HTTPHEADER, list );
- // pass the write function and the struct to write to
- curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, _taler_write_response );
- curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)product->response );
+ /* curl option "get" */
+ curl_easy_setopt( curl, CURLOPT_HTTPGET, true );
- // perform the call
- CURLcode result = curl_easy_perform(curl);
- if( result != CURLE_OK ){
- printf( "could not communicate with \"%s\"\n", product->checkUrl );
- return EXIT_FAILURE;
- }
+ /* pass the write function and the struct to write to */
+ curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, _taler_write_response );
+ curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)product->response );
- // reset the curl options
- curl_easy_reset( curl );
+ /* perform the call */
+ result = curl_easy_perform(curl);
+ if( result != CURLE_OK ){
+ printf( "could not communicate with \"%s\"\n", product->checkUrl );
+ return EXIT_FAILURE;
+ }
- // clean up
- curl_slist_free_all( list );
+ /* reset the curl options */
+ curl_easy_reset( curl );
- return EXIT_SUCCESS;
+ /* clean up */
+ curl_slist_free_all( list );
+
+ return EXIT_SUCCESS;
}
-int taler_parse_json( const TalerResponse *response, const char *memberName,
char **returnStr )
+int taler_parse_json( const TalerResponse *response, const char *memberName,
+ char **returnStr )
{
- if( !(*returnStr) )
- taler_alloc_string( returnStr, 1 );
-
- json_error_t error;
- json_t *root = NULL;
- root = json_loads( response->string, JSON_DISABLE_EOF_CHECK, &error );
- if( !root ){
- printf("taler_parse_json: %s\n", error.text );
- return EXIT_FAILURE;
- }
-
- char *result = NULL;
- if( json_unpack( root, "{s:s}", memberName, &result ) < 0 ){
- printf( "taler_parse_json: no member named \"%s\" found!\n",
memberName );
- json_decref( root );
- return EXIT_FAILURE;
- }
- if( !result ){
- printf( "taler_parse_json: no member named \"%s\" found!\n",
memberName );
- json_decref( root );
- return EXIT_FAILURE;
- }
- char *temp = NULL;
- temp = realloc( *returnStr, strlen(result) + 1 );
- if( !temp ){
- printf( "taler_parse_json: could not allocate memory for member\n" );
- json_decref( root );
- return EXIT_FAILURE;
- }
- *returnStr = temp;
- strcpy( *returnStr, result );
+ /* json variables */
+ json_error_t error;
+ json_t *root = NULL;
+
+ char *temp = NULL;
+
+ /* if the provided string was not allocated before allocate initial size 1 to
+ * realloc later */
+ if( !(*returnStr) )
+ taler_alloc_string( returnStr, 1 );
+
+ /* load the json with th string provided from taler in the response struct */
+ root = json_loads( response->string, JSON_DISABLE_EOF_CHECK, &error );
+ if( !root ){
+ printf("taler_parse_json: %s\n", error.text );
+ return EXIT_FAILURE;
+ }
+ char *result = NULL;
+ if( json_unpack( root, "{s:s}", memberName, &result ) < 0 ){
+ printf( "taler_parse_json: no member named \"%s\" found!\n", memberName );
+ json_decref( root );
+ return EXIT_FAILURE;
+ }
+ if( !result ){
+ printf( "taler_parse_json: no member named \"%s\" found!\n", memberName );
+ json_decref( root );
+ return EXIT_FAILURE;
+ }
+
+ temp = realloc( *returnStr, strlen(result) + 1 );
+ if( !temp ){
+ printf( "taler_parse_json: could not allocate memory for member\n" );
json_decref( root );
+ return EXIT_FAILURE;
+ }
+ *returnStr = temp;
+ strcpy( *returnStr, result );
- return EXIT_SUCCESS;
+ json_decref( root );
+ return EXIT_SUCCESS;
}
diff --git a/src/configuration.h b/src/configuration.h
index fb7c721..b19b5e0 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -44,14 +44,19 @@ static const char*const JSON_PAID = "paid";
static const char*const JSON_PAY_URI = "taler_pay_uri";
static const char*const JSON_ORDER_ID = "order_id";
+/* json order request keys */
+static const char*const JSON_REQ_ORDER = "order";
+static const char*const JSON_REQ_SUMMARY = "summary";
+static const char*const JSON_REQ_AMOUNT = "amount";
+static const char*const JSON_REQ_FULFILLMENT = "fulfillment_url";
-// New AID
+/* New AID */
// static uint8_t taler_aid[] = { 0xF0, 0x00, 0x54, 0x41, 0x4c, 0x45, 0x52 };
-// Demo AID until uptade
+/* Demo AID until uptade */
static const uint8_t taler_aid[] = { 0xA0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01
};
-// APDU commands
+/* APDU commands */
#define APDU_SUCCESS "\x90\x00"
static const uint8_t select_file[] = { 0x00, 0xA4, 0x04, 0x00, 0x07 };
static const uint8_t put_data[] = { 0x00, 0xDA, 0x01, 0x00, 0x7c, 0x01 };
diff --git a/src/main.c b/src/main.c
index 73c3014..493d490 100644
--- a/src/main.c
+++ b/src/main.c
@@ -45,14 +45,14 @@ nfc_context *context = NULL;
void *start_nfc_transmission (void *ignored)
{
- // supress warning about unused variable
+ /* supress warning about unused variable */
(void) ignored;
if ( pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL) != 0 )
{
printf ("Error setting thread cancelling type\n");
}
- // start endless transmission loop (until threads gets cancelled)
+ /* start endless transmission loop (until threads gets cancelled) */
while ( 1 )
{
if ( pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL) != 0 )
@@ -72,7 +72,7 @@ void *start_nfc_transmission (void *ignored)
int main ( )
{
- // initialize nfc
+ /* initialize nfc */
nfc_init (&context);
if ( ! context )
{
@@ -80,7 +80,7 @@ int main ( )
return EXIT_FAILURE;
}
- // inizialize taler
+ /* inizialize taler */
CURL *curl = NULL;
if ( taler_init (&curl) )
{
@@ -88,7 +88,7 @@ int main ( )
return EXIT_FAILURE;
}
- // inizialize product
+ /* inizialize product */
if ( product_init (&product, CURRENCY) )
{
printf ("Unable to init product\n");
@@ -103,32 +103,32 @@ int main ( )
if ( getchar () == 'x' )
break;
- // DEMO snickers
+ /* DEMO snickers */
product.amount = "0.1";
product.product = "Snickers";
- // create the order request
+ /* create the order request */
taler_create_order_req (&product);
- // create the order
+ /* create the order */
while ( taler_create_order (curl, &product) )
;
- // store the order id into the struct
+ /* store the order id into the struct */
product_set_order_id (&product);
- // store the url to check wheter the payment happened or not
+ /* store the url to check wheter the payment happened or not */
product_set_check_url (&product);
- // check the payment status for the first time
+ /* check the payment status for the first time */
while ( taler_check_payment_status (curl, &product) )
;
- // store the url to pay, to do this task the payment status has to be
called before, because the url will be in the response
+ /* store the url to pay, to do this task the payment status has to be
called before, because the url will be in the response */
product_set_pay_url (&product);
- // start a thread to send payment request to taler wallet
+ /* start a thread to send payment request to taler wallet */
pthread_t nfcThread;
if ( pthread_create (&nfcThread, NULL, start_nfc_transmission, NULL) )
{
@@ -136,7 +136,7 @@ int main ( )
return EXIT_FAILURE;
}
- // check the payment status, if paid exit while loop and end thread
transmitting nfc messages
+ /* check the payment status, if paid exit while loop and end thread
transmitting nfc messages */
while ( ! product.paid )
{
printf ("Order payment processing\n");
@@ -144,7 +144,7 @@ int main ( )
sleep (5);
while ( taler_check_payment_status (curl, &product) )
;
- // set the boolean paid member of ProductOrder struct
+ /* set the boolean paid member of ProductOrder struct */
product_set_paid_status (&product);
printf ("Payment status paid: %s\n\n", (product.paid ? "true" :
"false") );
@@ -152,12 +152,12 @@ int main ( )
printf ("Order no.: %s paid!\n\n", product.orderID);
- // -----------------
- // Here comes the code for releasing the product
- // -----------------
+ /* -----------------
+ Here comes the code for releasing the product
+ ----------------- */
- // send cancel request to nfc thread
+ /* send cancel request to nfc thread */
while ( pthread_cancel (nfcThread) != 0 )
{
printf ("Error sending cancel request to thread for nfc transmission");
@@ -175,12 +175,12 @@ int main ( )
fflush (stdout);
}
- // reset the product
+ /* reset the product */
product_reset (&product);
}
- // clear all initialized data
+ /* clear all initialized data */
nfc_exit (context);
product_exit (&product);
taler_exit (&curl);
diff --git a/src/nfc.c b/src/nfc.c
index a4ac1ad..320f94d 100644
--- a/src/nfc.c
+++ b/src/nfc.c
@@ -30,7 +30,7 @@ along with
#include "wallet.h"
-// upper and lower bounds for mifare targets uid length
+/* upper and lower bounds for mifare targets uid length */
#define UID_LEN_UPPER 7
#define UID_LEN_LOWER 4
@@ -38,6 +38,7 @@ along with
int nfc_transmit (nfc_context *context, const char *talerPayUrl, size_t
urlSize)
{
nfc_device *pnd = NULL;
+ nfc_target nt;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MEMORY LEAK? NFC OPEN?
@@ -49,7 +50,7 @@ int nfc_transmit (nfc_context *context, const char
*talerPayUrl, size_t urlSize)
return EXIT_FAILURE;
}
- // initialize device as reader
+ /* initialize device as reader */
if ( nfc_initiator_init (pnd) < 0 )
{
nfc_perror (pnd, "nfc_initiator_init");
@@ -60,9 +61,7 @@ int nfc_transmit (nfc_context *context, const char
*talerPayUrl, size_t urlSize)
printf ("Device %s opened: '%s'\n\n", nfc_device_get_name (pnd),
nfc_device_get_connstring (pnd) );
- nfc_target nt;
-
- // connect to a target device
+ /* connect to a target device */
if ( nfc_connect_target (pnd, &nt) )
{
nfc_close (pnd);
@@ -70,15 +69,15 @@ int nfc_transmit (nfc_context *context, const char
*talerPayUrl, size_t urlSize)
}
;
- // send the message to the wallet
+ /* send the message to the wallet */
if ( wallet_transmit (pnd, talerPayUrl, urlSize) )
{
- // the transmition failed, the target has to be reselected when using
MIFARE as defined in libnfc --> exit
+ /* the transmition failed, the target has to be reselected when using
MIFARE as defined in libnfc --> exit */
nfc_close (pnd);
return EXIT_FAILURE;
}
- // clean up
+ /* clean up */
nfc_initiator_deselect_target (pnd);
nfc_close (pnd);
@@ -87,16 +86,19 @@ int nfc_transmit (nfc_context *context, const char
*talerPayUrl, size_t urlSize)
int nfc_connect_target (nfc_device *pnd, nfc_target *nt)
{
+ /* ctr for how many tries to connect a target */
+ int ctr = 2;
+
const nfc_modulation nmMifare[] = { {
.nmt = NMT_ISO14443A,
.nbr = NBR_106,
} };
printf ("nfc_connect_target: trying to connect to target\n");
- int ctr = 2;
+
while ( ctr > 0 )
{
- // set uid lenght to zero ( in case of second selecting the length still
has the old value )
+ /* set uid lenght to zero ( in case of second selecting the length still
has the old value ) */
nt->nti.nai.szUidLen = 0;
if ( nfc_initiator_select_passive_target (pnd, nmMifare[0], NULL, 0, nt) <=
0 )
diff --git a/src/product.c b/src/product.c
index c9d921e..e355566 100644
--- a/src/product.c
+++ b/src/product.c
@@ -47,7 +47,8 @@ int product_init (ProductOrder *product, const char *currency)
return EXIT_FAILURE;
}
- // malloc for every string member with size 1, every other func just calls
realloc, because this struct gets used over and over again
+ /* malloc for every string member with size 1, every other func just calls
+ * realloc, because this struct gets used over and over again */
product->response = malloc (sizeof(TalerResponse) );
if ( ! product->response )
{
@@ -120,31 +121,38 @@ int product_set_pay_url (ProductOrder *product)
int product_set_paid_status (ProductOrder *product)
{
- json_error_t error;
- json_t *root = NULL;
- root = json_loads( product->response->string, JSON_DISABLE_EOF_CHECK,
&error );
- if( !root ){
- printf("taler_parse_json: %s\n", error.text );
- return EXIT_FAILURE;
- }
-
- // extract the boolean value of paid out of the json object
- int b = -1;
- if ( json_unpack( root, "{s:b}", JSON_PAID, &b ) < 0 ){
- printf("taler_parse_json: no value \"%s\" found!\n", JSON_PAID );
- json_decref( root );
- return EXIT_FAILURE;
- }
-
- json_decref(root);
-
- // set the paid status to true or false
- if( b == true || b == false ){
- product->paid = b;
- }else{
- printf( "product_set_paid_status: json parsing failed\n" );
- return EXIT_FAILURE;
- }
+ json_error_t error;
+ json_t *root = NULL;
+
+ /* variable to extract the boolean value out of json object */
+ int b = -1;
+
+ root = json_loads( product->response->string, JSON_DISABLE_EOF_CHECK,
&error);
+ if( !root )
+ {
+ printf("taler_parse_json: %s\n", error.text );
+ return EXIT_FAILURE;
+ }
+
+ /* extract the boolean value of paid out of the json object */
+ if ( json_unpack( root, "{s:b}", JSON_PAID, &b ) < 0 )
+ {
+ printf("taler_parse_json: no value \"%s\" found!\n", JSON_PAID );
+ json_decref( root );
+ return EXIT_FAILURE;
+ }
+
+ json_decref(root);
+
+ /* set the paid status to true or false */
+ if( b == true || b == false )
+ {
+ product->paid = b;
+ }else
+ {
+ printf( "product_set_paid_status: json parsing failed\n" );
+ return EXIT_FAILURE;
+ }
return EXIT_SUCCESS;
}
--
To stop receiving notification emails like this one, please contact
address@hidden.
- [taler-taler-mdb] 09/93: revisit build system, except for libnfc should work, (continued)
- [taler-taler-mdb] 09/93: revisit build system, except for libnfc should work, gnunet, 2019/11/18
- [taler-taler-mdb] 13/93: reindent code to coding style, gnunet, 2019/11/18
- [taler-taler-mdb] 16/93: merged jsonIntegrity, gnunet, 2019/11/18
- [taler-taler-mdb] 25/93: no curl here, gnunet, 2019/11/18
- [taler-taler-mdb] 21/93: product.h uncrustified, gnunet, 2019/11/18
- [taler-taler-mdb] 22/93: pseudo nonce, gnunet, 2019/11/18
- [taler-taler-mdb] 26/93: use check payment instead of poll payment, gnunet, 2019/11/18
- [taler-taler-mdb] 10/93: add bootstrap and uncrustify logic, gnunet, 2019/11/18
- [taler-taler-mdb] 17/93: merged jsonIntegrity, gnunet, 2019/11/18
- [taler-taler-mdb] 23/93: chaos monkey, gnunet, 2019/11/18
- [taler-taler-mdb] 15/93: fixes,
gnunet <=
- [taler-taler-mdb] 14/93: updated .gitignore, gnunet, 2019/11/18
- [taler-taler-mdb] 20/93: more implementations using GNUNETUtils, gnunet, 2019/11/18
- [taler-taler-mdb] 19/93: GNUnet logs added, -h option added, gnunet, 2019/11/18
- [taler-taler-mdb] 12/93: initial indenting, gnunet, 2019/11/18
- [taler-taler-mdb] 31/93: cleanup, gnunet, 2019/11/18
- [taler-taler-mdb] 33/93: typo, gnunet, 2019/11/18
- [taler-taler-mdb] 30/93: cleanup, gnunet, 2019/11/18
- [taler-taler-mdb] 24/93: use event loop, gnunet, 2019/11/18
- [taler-taler-mdb] 32/93: retry NFC failures more nicely, gnunet, 2019/11/18
- [taler-taler-mdb] 36/93: fixed delay when cancelling, new bugs detected marked with FIXME, gnunet, 2019/11/18