X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fpeerinfo%2Fpeerinfo_api.c;h=a0cb5c5c4a94323aba029ffcdb1d79393d0e6006;hb=320c2d50b722eeffc50cd6db0c5361886ee750b0;hp=eca0825291dee7d20af4654c2ffed545985d8373;hpb=e51a4a958977b937f61f6e3041610b92662d5413;p=oweals%2Fgnunet.git diff --git a/src/peerinfo/peerinfo_api.c b/src/peerinfo/peerinfo_api.c index eca082529..a0cb5c5c4 100644 --- a/src/peerinfo/peerinfo_api.c +++ b/src/peerinfo/peerinfo_api.c @@ -90,11 +90,6 @@ struct GNUNET_PEERINFO_Handle */ const struct GNUNET_CONFIGURATION_Handle *cfg; - /** - * Our scheduler. - */ - struct GNUNET_SCHEDULER_Handle *sched; - /** * Connection to the service. */ @@ -127,25 +122,22 @@ struct GNUNET_PEERINFO_Handle /** * Connect to the peerinfo service. * - * @param sched scheduler to use * @param cfg configuration to use * @return NULL on error (configuration related, actual connection * establishment may happen asynchronously). */ struct GNUNET_PEERINFO_Handle * -GNUNET_PEERINFO_connect (struct GNUNET_SCHEDULER_Handle *sched, - const struct GNUNET_CONFIGURATION_Handle *cfg) +GNUNET_PEERINFO_connect (const struct GNUNET_CONFIGURATION_Handle *cfg) { struct GNUNET_CLIENT_Connection *client; struct GNUNET_PEERINFO_Handle *ret; - client = GNUNET_CLIENT_connect (sched, "peerinfo", cfg); + client = GNUNET_CLIENT_connect ("peerinfo", cfg); if (client == NULL) return NULL; ret = GNUNET_malloc (sizeof (struct GNUNET_PEERINFO_Handle)); ret->client = client; ret->cfg = cfg; - ret->sched = sched; return ret; } @@ -202,7 +194,8 @@ static void reconnect (struct GNUNET_PEERINFO_Handle *h) { GNUNET_CLIENT_disconnect (h->client, GNUNET_SYSERR); - h->client = GNUNET_CLIENT_connect (h->sched, "peerinfo", h->cfg); + h->th = NULL; + h->client = GNUNET_CLIENT_connect ("peerinfo", h->cfg); GNUNET_assert (h->client != NULL); } @@ -226,7 +219,7 @@ do_transmit (void *cls, size_t size, void *buf) h->th = NULL; if (buf == NULL) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, _("Failed to transmit message to `%s' service.\n"), "PEERINFO"); if (tqe != NULL) @@ -243,6 +236,10 @@ do_transmit (void *cls, size_t size, void *buf) } return 0; } + /* If it can be NULL above, it can be NULL here to... */ + if (tqe == NULL) + return 0; + ret = tqe->size; GNUNET_assert (size >= ret); memcpy (buf, &tqe[1], ret); @@ -276,11 +273,11 @@ trigger_transmit (struct GNUNET_PEERINFO_Handle *h) struct TransmissionQueueEntry *tqe; if (NULL == (tqe = h->tq_head)) - return; + return NULL; if (h->th != NULL) - return; + return NULL; if (h->in_receive == GNUNET_YES) - return; + return NULL; h->th = GNUNET_CLIENT_notify_transmit_ready (h->client, tqe->size, GNUNET_TIME_absolute_get_remaining (tqe->timeout), @@ -394,8 +391,7 @@ peerinfo_handler (void *cls, const struct GNUNET_MessageHeader *msg) reconnect (ic->h); trigger_transmit (ic->h); if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) - GNUNET_SCHEDULER_cancel (ic->h->sched, - ic->timeout_task); + GNUNET_SCHEDULER_cancel (ic->timeout_task); if (ic->callback != NULL) ic->callback (ic->callback_cls, NULL, NULL); GNUNET_free (ic); @@ -410,8 +406,7 @@ peerinfo_handler (void *cls, const struct GNUNET_MessageHeader *msg) #endif trigger_transmit (ic->h); if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) - GNUNET_SCHEDULER_cancel (ic->h->sched, - ic->timeout_task); + GNUNET_SCHEDULER_cancel (ic->timeout_task); if (ic->callback != NULL) ic->callback (ic->callback_cls, NULL, NULL); GNUNET_free (ic); @@ -425,14 +420,14 @@ peerinfo_handler (void *cls, const struct GNUNET_MessageHeader *msg) reconnect (ic->h); trigger_transmit (ic->h); if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) - GNUNET_SCHEDULER_cancel (ic->h->sched, - ic->timeout_task); + GNUNET_SCHEDULER_cancel (ic->timeout_task); if (ic->callback != NULL) ic->callback (ic->callback_cls, NULL, NULL); GNUNET_free (ic); return; } im = (const struct InfoMessage *) msg; + GNUNET_break (0 == ntohl (im->reserved)); hello = NULL; if (ms > sizeof (struct InfoMessage) + sizeof (struct GNUNET_MessageHeader)) { @@ -443,8 +438,7 @@ peerinfo_handler (void *cls, const struct GNUNET_MessageHeader *msg) reconnect (ic->h); trigger_transmit (ic->h); if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) - GNUNET_SCHEDULER_cancel (ic->h->sched, - ic->timeout_task); + GNUNET_SCHEDULER_cancel (ic->timeout_task); if (ic->callback != NULL) ic->callback (ic->callback_cls, NULL, NULL); GNUNET_free (ic); @@ -490,8 +484,7 @@ iterator_start_receive (void *cls, transmit_success); if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) { - GNUNET_SCHEDULER_cancel (ic->h->sched, - ic->timeout_task); + GNUNET_SCHEDULER_cancel (ic->timeout_task); ic->timeout_task = GNUNET_SCHEDULER_NO_TASK; } reconnect (ic->h); @@ -528,7 +521,7 @@ signal_timeout (void *cls, { struct GNUNET_PEERINFO_IteratorContext *ic = cls; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, _("Timeout transmitting iteration request to `%s' service.\n"), "PEERINFO"); ic->timeout_task = GNUNET_SCHEDULER_NO_TASK; @@ -536,11 +529,10 @@ signal_timeout (void *cls, GNUNET_CONTAINER_DLL_remove (ic->h->tq_head, ic->h->tq_tail, ic->tqe); + reconnect (ic->h); ic->callback (ic->callback_cls, NULL, NULL); ic->callback = NULL; - if (ic->in_receive) - return; - GNUNET_free (ic->tqe); + GNUNET_free_non_null (ic->tqe); GNUNET_free (ic); } @@ -559,8 +551,7 @@ signal_timeout (void *cls, * @param timeout how long to wait until timing out * @param callback the method to call for each peer * @param callback_cls closure for callback - * @return NULL on error (in this case, 'callback' is never called!), - * otherwise an iterator context + * @return iterator context */ struct GNUNET_PEERINFO_IteratorContext * GNUNET_PEERINFO_iterate (struct GNUNET_PEERINFO_Handle *h, @@ -608,8 +599,7 @@ GNUNET_PEERINFO_iterate (struct GNUNET_PEERINFO_Handle *h, ic->callback = callback; ic->callback_cls = callback_cls; ic->timeout = GNUNET_TIME_relative_to_absolute (timeout); - ic->timeout_task = GNUNET_SCHEDULER_add_delayed (h->sched, - timeout, + ic->timeout_task = GNUNET_SCHEDULER_add_delayed (timeout, &signal_timeout, ic); tqe->timeout = ic->timeout; @@ -636,8 +626,7 @@ GNUNET_PEERINFO_iterate_cancel (struct GNUNET_PEERINFO_IteratorContext *ic) { if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) { - GNUNET_SCHEDULER_cancel (ic->h->sched, - ic->timeout_task); + GNUNET_SCHEDULER_cancel (ic->timeout_task); ic->timeout_task = GNUNET_SCHEDULER_NO_TASK; } ic->callback = NULL;