/**
* Message handlers to use for all clients.
*/
- const struct GNUNET_MQ_MessageHandler *handlers;
+ struct GNUNET_MQ_MessageHandler *handlers;
/**
* Closure for @e task.
GNUNET_SCHEDULER_add_shutdown (&service_shutdown,
sh);
GNUNET_SERVICE_resume (sh);
+
+ if (-1 != sh->ready_confirm_fd)
+ {
+ GNUNET_break (1 == WRITE (sh->ready_confirm_fd, ".", 1));
+ GNUNET_break (0 == CLOSE (sh->ready_confirm_fd));
+ sh->ready_confirm_fd = -1;
+ }
+
if (NULL != sh->service_init_cb)
sh->service_init_cb (sh->cb_cls,
sh->cfg,
sh->connect_cb = connect_cb;
sh->disconnect_cb = disconnect_cb;
sh->cb_cls = cls;
- sh->handlers = handlers;
+ if (NULL != handlers)
+ {
+ unsigned int i;
+
+ for (i=0;NULL != handlers[i].cb; i++) ;
+ sh->handlers = GNUNET_new_array (i + 1,
+ struct GNUNET_MQ_MessageHandler);
+ GNUNET_memcpy (sh->handlers,
+ handlers,
+ i * sizeof (struct GNUNET_MQ_MessageHandler));
+ }
if (GNUNET_OK != setup_service (sh))
{
+ GNUNET_free (sh->handlers);
GNUNET_free (sh);
return NULL;
}
+ GNUNET_SERVICE_resume (sh);
return sh;
}
void
GNUNET_SERVICE_stoP (struct GNUNET_SERVICE_Handle *srv)
{
+ struct GNUNET_SERVICE_Client *client;
+
+ GNUNET_SERVICE_suspend (srv);
+ while (NULL != (client = srv->clients_head))
+ GNUNET_SERVICE_client_drop (client);
teardown_service (srv);
+ GNUNET_free (srv->handlers);
GNUNET_free (srv);
}
sh.connect_cb = connect_cb;
sh.disconnect_cb = disconnect_cb;
sh.cb_cls = cls;
- sh.handlers = handlers;
+ if (NULL != handlers)
+ {
+ unsigned int i;
+
+ for (i=0;NULL != handlers[i].cb; i++) ;
+ sh.handlers = GNUNET_new_array (i + 1,
+ struct GNUNET_MQ_MessageHandler);
+ GNUNET_memcpy (sh.handlers,
+ handlers,
+ i * sizeof (struct GNUNET_MQ_MessageHandler));
+ }
sh.service_name = service_name;
/* setup subsystems */
}
#endif
teardown_service (&sh);
-
+ GNUNET_free (sh.handlers);
GNUNET_SPEEDUP_stop_ ();
GNUNET_CONFIGURATION_destroy (cfg);
GNUNET_free_non_null (logfile);
return;
}
}
+ if (0 == client->msg_pos)
+ {
+ GNUNET_MQ_impl_send_in_flight (client->mq);
+ }
client->msg_pos += ret;
if (left > ret)
{
{
struct GNUNET_SERVICE_Client *client = impl_state;
- GNUNET_assert (0); // not implemented
- // FIXME: stop transmission! (must be possible, otherwise
- // we must have told MQ that the message was sent!)
+ GNUNET_assert (0 == client->msg_pos);
+ client->msg = NULL;
+ GNUNET_SCHEDULER_cancel (client->send_task);
+ client->send_task = NULL;
}
client);
client->mst = GNUNET_MST_create (&service_client_mst_cb,
client);
- client->user_context = sh->connect_cb (sh->cb_cls,
- client,
- client->mq);
+ if (NULL != sh->connect_cb)
+ client->user_context = sh->connect_cb (sh->cb_cls,
+ client,
+ client->mq);
GNUNET_MQ_set_handlers_closure (client->mq,
client->user_context);
client->recv_task
GNUNET_CONTAINER_DLL_remove (sh->clients_head,
sh->clients_tail,
c);
- sh->disconnect_cb (sh->cb_cls,
- c,
- c->user_context);
+ if (NULL != sh->disconnect_cb)
+ sh->disconnect_cb (sh->cb_cls,
+ c,
+ c->user_context);
if (NULL != c->warn_task)
{
GNUNET_SCHEDULER_cancel (c->warn_task);