X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftestbed%2Ftestbed_api_services.c;h=2c9a90fd454133e378e23889e9ffae5b5b82e6bf;hb=d17a17ea785f91c18b5694eab3372c4e4564d95e;hp=ea7b50def5c62a5f1ea7c5c92512b116dcedd148;hpb=4d299a3c4088f9e72244d4cbf513a77ec8b50328;p=oweals%2Fgnunet.git diff --git a/src/testbed/testbed_api_services.c b/src/testbed/testbed_api_services.c index ea7b50def..2c9a90fd4 100644 --- a/src/testbed/testbed_api_services.c +++ b/src/testbed/testbed_api_services.c @@ -1,21 +1,21 @@ /* This file is part of GNUnet - (C) 2008--2012 Christian Grothoff (and other contributing authors) + Copyright (C) 2008--2013 GNUnet e.V. - GNUnet 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 Foundation; either version 3, or (at your - option) any later version. + GNUnet 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 Foundation, either version 3 of the License, + or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + Affero General Public License for more details. - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + SPDX-License-Identifier: AGPL3.0-or-later */ /** @@ -33,26 +33,22 @@ * States for Service connect operations */ enum State - { - /** - * Initial state - */ - INIT, - - /** - * The configuration request has been sent - */ - CFG_REQUEST_QUEUED, +{ + /** + * Initial state + */ + INIT, - /** - * connected to service - */ - SERVICE_CONNECTED, + /** + * The configuration request has been sent + */ + CFG_REQUEST_QUEUED, - /** - * - */ - }; + /** + * connected to service + */ + SERVICE_CONNECTED +}; /** @@ -79,7 +75,7 @@ struct ServiceConnectData * Service name */ char *service_name; - + /** * Closure for operation event */ @@ -110,11 +106,20 @@ struct ServiceConnectData */ void *op_result; + /** + * The operation completion callback + */ + GNUNET_TESTBED_ServiceConnectCompletionCallback cb; + + /** + * The closure for operation completion callback + */ + void *cb_cls; + /** * State information */ enum State state; - }; @@ -125,30 +130,46 @@ struct ServiceConnectData * @param cls ServiceConnectData * @param msg message received, NULL on timeout or fatal error */ -static void -configuration_receiver (void *cls, - const struct GNUNET_MessageHeader *msg) +static void +configuration_receiver (void *cls, const struct GNUNET_MessageHeader *msg) { struct ServiceConnectData *data = cls; - const struct GNUNET_TESTBED_PeerConfigurationInformationMessage *imsg; - struct GNUNET_TESTBED_Controller *c; - struct GNUNET_TESTBED_EventInformation info; - - 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); + struct GNUNET_TESTBED_Controller *c; + const char *emsg; + struct GNUNET_TESTBED_EventInformation info; + uint16_t mtype; + + c = data->peer->controller; + 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; + info.op = data->operation; + info.op_cls = data->op_cls; + if (GNUNET_MESSAGE_TYPE_TESTBED_OPERATION_FAIL_EVENT == mtype) + { + 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; + } + data->cfg = GNUNET_TESTBED_extract_config_ (msg); + 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.pit = GNUNET_TESTBED_PIT_GENERIC; - info.details.operation_finished.op_result.generic = data->op_result; - c = data->peer->controller; + info.details.operation_finished.generic = data->op_result; data->state = SERVICE_CONNECTED; - if ((0 != (GNUNET_TESTBED_ET_OPERATION_FINISHED & c->event_mask)) - && (NULL != c->cc)) - c->cc (c->cc_cls, &info); + +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, emsg); } @@ -157,20 +178,20 @@ configuration_receiver (void *cls, * * @param cls the closure from GNUNET_TESTBED_operation_create_() */ -static void +static void opstart_service_connect (void *cls) { struct ServiceConnectData *data = cls; struct GNUNET_TESTBED_PeerGetConfigurationMessage *msg; - struct GNUNET_TESTBED_Controller *c; - uint64_t op_id; - + struct GNUNET_TESTBED_Controller *c; + uint64_t op_id; + GNUNET_assert (NULL != data); GNUNET_assert (NULL != data->peer); - c = data->peer->controller; - op_id = c->operation_counter++; - msg = GNUNET_TESTBED_generate_peergetconfig_msg_ (data->peer->unique_id, - op_id); + c = data->peer->controller; + op_id = GNUNET_TESTBED_get_next_op_id (c); + msg = + GNUNET_TESTBED_generate_peergetconfig_msg_ (data->peer->unique_id, op_id); data->opc = GNUNET_TESTBED_forward_operation_msg_ (c, op_id, &msg->header, &configuration_receiver, data); @@ -185,7 +206,7 @@ opstart_service_connect (void *cls) * * @param cls the closure from GNUNET_TESTBED_operation_create_() */ -static void +static void oprelease_service_connect (void *cls) { struct ServiceConnectData *data = cls; @@ -194,10 +215,12 @@ oprelease_service_connect (void *cls) { case INIT: break; + case CFG_REQUEST_QUEUED: GNUNET_assert (NULL != data->opc); GNUNET_TESTBED_forward_operation_msg_cancel_ (data->opc); break; + case SERVICE_CONNECTED: GNUNET_assert (NULL != data->cfg); GNUNET_CONFIGURATION_destroy (data->cfg); @@ -215,44 +238,54 @@ oprelease_service_connect (void *cls) * maintain connections with other systems. The actual service * handle is then returned via the 'op_result' member in the event * callback. The 'ca' callback is used to create the connection - * when the time is right; the 'da' callback will be used to + * when the time is right; the 'da' callback will be used to * destroy the connection (upon 'GNUNET_TESTBED_operation_done'). - * 'GNUNET_TESTBED_operation_cancel' can be used to abort this + * 'GNUNET_TESTBED_operation_done' can be used to abort this * operation until the event callback has been called. * * @param op_cls closure to pass in operation event * @param peer peer that runs the service * @param service_name name of the service to connect to + * @param cb the callback to call when this operation finishes + * @param cb_cls closure for the above callback * @param ca helper function to establish the connection * @param da helper function to close the connection * @param cada_cls closure for ca and da * @return handle for the operation */ struct GNUNET_TESTBED_Operation * -GNUNET_TESTBED_service_connect (void *op_cls, - struct GNUNET_TESTBED_Peer *peer, - const char *service_name, - GNUNET_TESTBED_ConnectAdapter ca, - GNUNET_TESTBED_DisconnectAdapter da, - void *cada_cls) +GNUNET_TESTBED_service_connect (void *op_cls, struct GNUNET_TESTBED_Peer *peer, + const char *service_name, + GNUNET_TESTBED_ServiceConnectCompletionCallback + cb, void *cb_cls, + GNUNET_TESTBED_ConnectAdapter ca, + GNUNET_TESTBED_DisconnectAdapter da, + void *cada_cls) { struct ServiceConnectData *data; - data = GNUNET_malloc (sizeof (struct ServiceConnectData)); + data = GNUNET_new (struct ServiceConnectData); data->ca = ca; data->da = da; data->cada_cls = cada_cls; data->op_cls = op_cls; data->peer = peer; data->state = INIT; - data->operation = + data->cb = cb; + data->cb_cls = cb_cls; + data->operation = GNUNET_TESTBED_operation_create_ (data, &opstart_service_connect, &oprelease_service_connect); - GNUNET_TESTBED_operation_queue_insert_ - (peer->controller->opq_parallel_service_connections, data->operation); - GNUNET_TESTBED_operation_queue_insert_ - (peer->controller->opq_parallel_operations, data->operation); - return data->operation; + GNUNET_TESTBED_operation_queue_insert_ (peer-> + controller-> + opq_parallel_service_connections, + data->operation); + GNUNET_TESTBED_operation_queue_insert_ (peer-> + controller->opq_parallel_operations, + data->operation); + GNUNET_TESTBED_operation_begin_wait_ (data->operation); + return data->operation; } + /* end of testbed_api_services.c */