X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftestbed%2Ftestbed_api_services.c;h=2c9a90fd454133e378e23889e9ffae5b5b82e6bf;hb=d17a17ea785f91c18b5694eab3372c4e4564d95e;hp=c3375a9c7da0c8ccebaaa9d94a254a1ca974d0a0;hpb=58d35329939062c00b165a973ad236490678eca3;p=oweals%2Fgnunet.git diff --git a/src/testbed/testbed_api_services.c b/src/testbed/testbed_api_services.c index c3375a9c7..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 */ /** @@ -34,21 +34,20 @@ */ enum State { - /** - * Initial state - */ + /** + * Initial state + */ INIT, - /** - * The configuration request has been sent - */ + /** + * The configuration request has been sent + */ CFG_REQUEST_QUEUED, - /** - * connected to service - */ - SERVICE_CONNECTED, - + /** + * connected to service + */ + SERVICE_CONNECTED }; @@ -121,7 +120,6 @@ struct ServiceConnectData * State information */ enum State state; - }; @@ -136,32 +134,42 @@ 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; + const char *emsg; struct GNUNET_TESTBED_EventInformation info; uint16_t mtype; + c = data->peer->controller; mtype = ntohs (msg->type); - if (GNUNET_MESSAGE_TYPE_TESTBED_OPERATIONFAILEVENT == mtype) + emsg = NULL; + info.type = GNUNET_TESTBED_ET_OPERATION_FINISHED; + info.op = data->operation; + info.op_cls = data->op_cls; + if (GNUNET_MESSAGE_TYPE_TESTBED_OPERATION_FAIL_EVENT == 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->cfg = GNUNET_TESTBED_extract_config_ (msg); + GNUNET_assert (NULL == data->op_result); 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; 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); } @@ -181,12 +189,12 @@ opstart_service_connect (void *cls) GNUNET_assert (NULL != data); GNUNET_assert (NULL != data->peer); c = data->peer->controller; - op_id = c->operation_counter++; + op_id = GNUNET_TESTBED_get_next_op_id (c); msg = - GNUNET_TESTBED_generate_peergetconfig_msg_ (data->peer->unique_id, op_id); + 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); + GNUNET_TESTBED_forward_operation_msg_ (c, op_id, &msg->header, + &configuration_receiver, data); GNUNET_free (msg); data->state = CFG_REQUEST_QUEUED; } @@ -207,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); @@ -228,9 +238,9 @@ 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 @@ -244,18 +254,17 @@ oprelease_service_connect (void *cls) * @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_ServiceConnectCompletionCallback cb, - void *cb_cls, - 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; @@ -265,15 +274,18 @@ GNUNET_TESTBED_service_connect (void *op_cls, data->cb = cb; data->cb_cls = cb_cls; data->operation = - GNUNET_TESTBED_operation_create_ (data, &opstart_service_connect, - &oprelease_service_connect); + GNUNET_TESTBED_operation_create_ (data, &opstart_service_connect, + &oprelease_service_connect); GNUNET_TESTBED_operation_queue_insert_ (peer-> - controller->opq_parallel_service_connections, + 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 */