X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fset%2Fset_api.c;h=7a33b86eaeb8d210ada05c1ec7f1ff0db9d5fa25;hb=2f45a7c9691aa2670c8902618be5e8011428f0af;hp=343b5f8812887dca59d95d8ab95dac0873e1fab1;hpb=710e8923105dfcc38d8aefed19e6da670db9c440;p=oweals%2Fgnunet.git diff --git a/src/set/set_api.c b/src/set/set_api.c index 343b5f881..7a33b86ea 100644 --- a/src/set/set_api.c +++ b/src/set/set_api.c @@ -26,7 +26,6 @@ #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_protocols.h" -#include "gnunet_client_lib.h" #include "gnunet_set_service.h" #include "set.h" @@ -49,11 +48,6 @@ struct SetCopyRequest */ struct GNUNET_SET_Handle { - /** - * Client connected to the set service. - */ - struct GNUNET_CLIENT_Connection *client; - /** * Message queue for @e client. */ @@ -189,10 +183,6 @@ struct GNUNET_SET_OperationHandle */ struct GNUNET_SET_ListenHandle { - /** - * Connection to the service. - */ - struct GNUNET_CLIENT_Connection *client; /** * Message queue for the client. @@ -298,7 +288,7 @@ check_iter_element (void *cls, /* minimum size was already checked, everything else is OK! */ return GNUNET_OK; } - + /** * Handle element for iteration over the set. Notifies the @@ -313,7 +303,7 @@ check_iter_element (void *cls, { struct GNUNET_SET_Handle *set = cls; GNUNET_SET_ElementIterator iter = set->iterator; - struct GNUNET_SET_Element element; + struct GNUNET_SET_Element element; struct GNUNET_SET_IterAckMessage *ack_msg; struct GNUNET_MQ_Envelope *ev; uint16_t msize; @@ -392,6 +382,7 @@ handle_result (void *cls, struct GNUNET_SET_OperationHandle *oh; struct GNUNET_SET_Element e; enum GNUNET_SET_Status result_status; + int destroy_set; GNUNET_assert (NULL != set->mq); result_status = ntohs (msg->result_status); @@ -432,6 +423,11 @@ do_final: GNUNET_CONTAINER_DLL_remove (set->ops_head, set->ops_tail, oh); + /* Need to do this calculation _before_ the result callback, + as IF the application still has a valid set handle, it + may trigger destruction of the set during the callback. */ + destroy_set = (GNUNET_YES == set->destroy_requested) && + (NULL == set->ops_head); if (NULL != oh->result_cb) { oh->result_cb (oh->result_cls, @@ -443,8 +439,7 @@ do_final: LOG (GNUNET_ERROR_TYPE_DEBUG, "No callback for final status\n"); } - if ( (GNUNET_YES == set->destroy_requested) && - (NULL == set->ops_head) ) + if (destroy_set) GNUNET_SET_destroy (set); GNUNET_free (oh); return; @@ -534,7 +529,7 @@ handle_client_set_error (void *cls, { struct GNUNET_SET_Handle *set = cls; GNUNET_SET_ElementIterator iter = set->iterator; - + LOG (GNUNET_ERROR_TYPE_DEBUG, "Handling client set error %d\n", error); @@ -566,24 +561,24 @@ create_internal (const struct GNUNET_CONFIGURATION_Handle *cfg, enum GNUNET_SET_OperationType op, const uint32_t *cookie) { - GNUNET_MQ_hd_var_size (result, - GNUNET_MESSAGE_TYPE_SET_RESULT, - struct GNUNET_SET_ResultMessage); - GNUNET_MQ_hd_var_size (iter_element, - GNUNET_MESSAGE_TYPE_SET_ITER_ELEMENT, - struct GNUNET_SET_IterResponseMessage); - GNUNET_MQ_hd_fixed_size (iter_done, - GNUNET_MESSAGE_TYPE_SET_ITER_DONE, - struct GNUNET_MessageHeader); - GNUNET_MQ_hd_fixed_size (copy_lazy, - GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_RESPONSE, - struct GNUNET_SET_CopyLazyResponseMessage); struct GNUNET_SET_Handle *set = GNUNET_new (struct GNUNET_SET_Handle); struct GNUNET_MQ_MessageHandler mq_handlers[] = { - make_result_handler (set), - make_iter_element_handler (set), - make_iter_done_handler (set), - make_copy_lazy_handler (set), + GNUNET_MQ_hd_var_size (result, + GNUNET_MESSAGE_TYPE_SET_RESULT, + struct GNUNET_SET_ResultMessage, + set), + GNUNET_MQ_hd_var_size (iter_element, + GNUNET_MESSAGE_TYPE_SET_ITER_ELEMENT, + struct GNUNET_SET_IterResponseMessage, + set), + GNUNET_MQ_hd_fixed_size (iter_done, + GNUNET_MESSAGE_TYPE_SET_ITER_DONE, + struct GNUNET_MessageHeader, + set), + GNUNET_MQ_hd_fixed_size (copy_lazy, + GNUNET_MESSAGE_TYPE_SET_COPY_LAZY_RESPONSE, + struct GNUNET_SET_CopyLazyResponseMessage, + set), GNUNET_MQ_handler_end () }; struct GNUNET_MQ_Envelope *mqm; @@ -591,18 +586,16 @@ create_internal (const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SET_CopyLazyConnectMessage *copy_msg; set->cfg = cfg; - set->client = GNUNET_CLIENT_connect ("set", cfg); - if (NULL == set->client) + set->mq = GNUNET_CLIENT_connecT (cfg, + "set", + mq_handlers, + &handle_client_set_error, + set); + if (NULL == set->mq) { GNUNET_free (set); return NULL; } - set->mq = GNUNET_MQ_queue_for_connection_client (set->client, - mq_handlers, - &handle_client_set_error, - set); - GNUNET_assert (NULL != set->mq); - if (NULL == cookie) { LOG (GNUNET_ERROR_TYPE_DEBUG, @@ -676,9 +669,9 @@ GNUNET_SET_add_element (struct GNUNET_SET_Handle *set, mqm = GNUNET_MQ_msg_extra (msg, element->size, GNUNET_MESSAGE_TYPE_SET_ADD); msg->element_type = htons (element->element_type); - memcpy (&msg[1], - element->data, - element->size); + GNUNET_memcpy (&msg[1], + element->data, + element->size); GNUNET_MQ_notify_sent (mqm, cont, cont_cls); GNUNET_MQ_send (set->mq, mqm); @@ -718,9 +711,9 @@ GNUNET_SET_remove_element (struct GNUNET_SET_Handle *set, element->size, GNUNET_MESSAGE_TYPE_SET_REMOVE); msg->element_type = htons (element->element_type); - memcpy (&msg[1], - element->data, - element->size); + GNUNET_memcpy (&msg[1], + element->data, + element->size); GNUNET_MQ_notify_sent (mqm, cont, cont_cls); GNUNET_MQ_send (set->mq, mqm); @@ -750,11 +743,6 @@ GNUNET_SET_destroy (struct GNUNET_SET_Handle *set) } LOG (GNUNET_ERROR_TYPE_DEBUG, "Really destroying set\n"); - if (NULL != set->client) - { - GNUNET_CLIENT_disconnect (set->client); - set->client = NULL; - } if (NULL != set->mq) { GNUNET_MQ_destroy (set->mq); @@ -828,9 +816,12 @@ check_request (void *cls, { const struct GNUNET_MessageHeader *context_msg; + if (ntohs (msg->header.size) == sizeof (*msg)) + return GNUNET_OK; /* no context message is OK */ context_msg = GNUNET_MQ_extract_nested_mh (msg); if (NULL == context_msg) { + /* malformed context message is NOT ok */ GNUNET_break_op (0); return GNUNET_SYSERR; } @@ -893,8 +884,6 @@ handle_client_listener_error (void *cls, LOG (GNUNET_ERROR_TYPE_DEBUG, "Listener broke down (%d), re-connecting\n", (int) error); - GNUNET_CLIENT_disconnect (lh->client); - lh->client = NULL; GNUNET_MQ_destroy (lh->mq); lh->mq = NULL; lh->reconnect_task = GNUNET_SCHEDULER_add_delayed (lh->reconnect_backoff, @@ -911,32 +900,32 @@ handle_client_listener_error (void *cls, */ static void listen_connect (void *cls) -{ - GNUNET_MQ_hd_var_size (request, - GNUNET_MESSAGE_TYPE_SET_REQUEST, - struct GNUNET_SET_RequestMessage); +{ struct GNUNET_SET_ListenHandle *lh = cls; struct GNUNET_MQ_MessageHandler mq_handlers[] = { - make_request_handler (lh), + GNUNET_MQ_hd_var_size (request, + GNUNET_MESSAGE_TYPE_SET_REQUEST, + struct GNUNET_SET_RequestMessage, + lh), GNUNET_MQ_handler_end () }; struct GNUNET_MQ_Envelope *mqm; struct GNUNET_SET_ListenMessage *msg; lh->reconnect_task = NULL; - GNUNET_assert (NULL == lh->client); - lh->client = GNUNET_CLIENT_connect ("set", lh->cfg); - if (NULL == lh->client) - return; GNUNET_assert (NULL == lh->mq); - lh->mq = GNUNET_MQ_queue_for_connection_client (lh->client, - mq_handlers, - &handle_client_listener_error, - lh); + lh->mq = GNUNET_CLIENT_connecT (lh->cfg, + "set", + mq_handlers, + &handle_client_listener_error, + lh); + if (NULL == lh->mq) + return; mqm = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SET_LISTEN); msg->operation = htonl (lh->operation); msg->app_id = lh->app_id; - GNUNET_MQ_send (lh->mq, mqm); + GNUNET_MQ_send (lh->mq, + mqm); } @@ -969,7 +958,7 @@ GNUNET_SET_listen (const struct GNUNET_CONFIGURATION_Handle *cfg, lh->app_id = *app_id; lh->reconnect_backoff = GNUNET_TIME_UNIT_MILLISECONDS; listen_connect (lh); - if (NULL == lh->client) + if (NULL == lh->mq) { GNUNET_free (lh); return NULL; @@ -993,11 +982,6 @@ GNUNET_SET_listen_cancel (struct GNUNET_SET_ListenHandle *lh) GNUNET_MQ_destroy (lh->mq); lh->mq = NULL; } - if (NULL != lh->client) - { - GNUNET_CLIENT_disconnect (lh->client); - lh->client = NULL; - } if (NULL != lh->reconnect_task) { GNUNET_SCHEDULER_cancel (lh->reconnect_task); @@ -1155,8 +1139,9 @@ GNUNET_SET_element_dup (const struct GNUNET_SET_Element *element) copy->size = element->size; copy->element_type = element->element_type; copy->data = ©[1]; - memcpy ((void *) copy->data, element->data, copy->size); - + GNUNET_memcpy (©[1], + element->data, + copy->size); return copy; }