From 7666505af72b1ca0b568f1c8a053a506dda64d95 Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Sun, 9 Sep 2012 14:20:50 +0000 Subject: error reporting in service_connect --- src/testbed/gnunet-service-testbed.c | 2 +- src/testbed/testbed_api.c | 29 +++++++++++++++++++++++++++++ src/testbed/testbed_api.h | 13 +++++++++++++ src/testbed/testbed_api_services.c | 26 +++++++++++++++++++------- 4 files changed, 62 insertions(+), 8 deletions(-) (limited to 'src/testbed') diff --git a/src/testbed/gnunet-service-testbed.c b/src/testbed/gnunet-service-testbed.c index 3438d6794..1bc1683c8 100644 --- a/src/testbed/gnunet-service-testbed.c +++ b/src/testbed/gnunet-service-testbed.c @@ -930,7 +930,7 @@ lcf_proc_cc (void *cls, const char *emsg) } return; -registration_error: + registration_error: LOG (GNUNET_ERROR_TYPE_WARNING, "Host registration failed with message: %s\n", emsg); lcf->state = FINISHED; diff --git a/src/testbed/testbed_api.c b/src/testbed/testbed_api.c index 9171ce947..fcbff7004 100644 --- a/src/testbed/testbed_api.c +++ b/src/testbed/testbed_api.c @@ -1758,4 +1758,33 @@ GNUNET_TESTBED_get_config_from_peerinfo_msg_ (const struct return cfg; } + +/** + * Checks the integrity of the OpeationFailureEventMessage and if good returns + * the error message it contains. + * + * @param msg the OperationFailureEventMessage + * @return the error message + */ +const char * +GNUNET_TESTBED_parse_error_string_ (const struct + GNUNET_TESTBED_OperationFailureEventMessage + *msg) +{ + uint16_t msize; + const char *emsg; + + msize = ntohs (msg->header.size); + if (sizeof (struct GNUNET_TESTBED_OperationFailureEventMessage) == msize) + return NULL; + msize -= sizeof (struct GNUNET_TESTBED_OperationFailureEventMessage); + emsg = (const char *) &msg[1]; + if ('\0' != emsg[msize]) + { + GNUNET_break (0); + return NULL; + } + return emsg; +} + /* end of testbed_api.c */ diff --git a/src/testbed/testbed_api.h b/src/testbed/testbed_api.h index 06ab6d504..a021e2130 100644 --- a/src/testbed/testbed_api.h +++ b/src/testbed/testbed_api.h @@ -398,5 +398,18 @@ GNUNET_TESTBED_get_config_from_peerinfo_msg_ (const struct GNUNET_TESTBED_PeerConfigurationInformationMessage *msg); + +/** + * Checks the integrity of the OpeationFailureEventMessage and if good returns + * the error message it contains. + * + * @param msg the OperationFailureEventMessage + * @return the error message + */ +const char * +GNUNET_TESTBED_parse_error_string_ (const struct + GNUNET_TESTBED_OperationFailureEventMessage + *msg); + #endif /* end of testbed_api.h */ diff --git a/src/testbed/testbed_api_services.c b/src/testbed/testbed_api_services.c index c3375a9c7..62bafb724 100644 --- a/src/testbed/testbed_api_services.c +++ b/src/testbed/testbed_api_services.c @@ -138,30 +138,42 @@ configuration_receiver (void *cls, const struct GNUNET_MessageHeader *msg) struct ServiceConnectData *data = cls; const struct GNUNET_TESTBED_PeerConfigurationInformationMessage *imsg; struct GNUNET_TESTBED_Controller *c; + const char *emsg; struct GNUNET_TESTBED_EventInformation info; uint16_t mtype; mtype = ntohs (msg->type); + emsg = NULL; + info.type = GNUNET_TESTBED_ET_OPERATION_FINISHED; + info.details.operation_finished.operation = data->operation; + info.details.operation_finished.op_cls = data->op_cls; if (GNUNET_MESSAGE_TYPE_TESTBED_OPERATIONFAILEVENT == mtype) { - GNUNET_assert (0); /* FIXME: Add notification for failure */ - } + emsg = GNUNET_TESTBED_parse_error_string_ ((const struct + GNUNET_TESTBED_OperationFailureEventMessage + *) msg); + if (NULL == emsg) + emsg = "Unknown error"; + info.details.operation_finished.emsg = emsg; + info.details.operation_finished.generic = NULL; + goto call_cb; + } imsg = (const struct GNUNET_TESTBED_PeerConfigurationInformationMessage *) msg; data->cfg = GNUNET_TESTBED_get_config_from_peerinfo_msg_ (imsg); - data->op_result = data->ca (data->cada_cls, data->cfg); - info.type = GNUNET_TESTBED_ET_OPERATION_FINISHED; - info.details.operation_finished.operation = data->operation; - info.details.operation_finished.op_cls = data->op_cls; + GNUNET_assert (NULL == data->op_result); + data->op_result = data->ca (data->cada_cls, data->cfg); info.details.operation_finished.emsg = NULL; info.details.operation_finished.generic = data->op_result; c = data->peer->controller; data->state = SERVICE_CONNECTED; + + call_cb: if ((0 != (GNUNET_TESTBED_ET_OPERATION_FINISHED & c->event_mask)) && (NULL != c->cc)) c->cc (c->cc_cls, &info); if (NULL != data->cb) - data->cb (data->cb_cls, data->operation, data->op_result, NULL); + data->cb (data->cb_cls, data->operation, data->op_result, emsg); } -- cgit v1.2.3