#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"
*/
struct GNUNET_SET_Handle
{
- /**
- * Client connected to the set service.
- */
- struct GNUNET_CLIENT_Connection *client;
-
/**
* Message queue for @e client.
*/
*/
struct GNUNET_SET_ListenHandle
{
- /**
- * Connection to the service.
- */
- struct GNUNET_CLIENT_Connection *client;
/**
* Message queue for the client.
/* minimum size was already checked, everything else is OK! */
return GNUNET_OK;
}
-
+
/**
* Handle element for iteration over the set. Notifies the
{
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;
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);
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,
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;
{
struct GNUNET_SET_Handle *set = cls;
GNUNET_SET_ElementIterator iter = set->iterator;
-
+
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Handling client set error %d\n",
error);
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;
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,
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);
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);
}
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);
{
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;
}
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,
*/
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);
}
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;
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);
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;
}