aboutsummaryrefslogtreecommitdiff
path: root/src/util/client_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/client_manager.c')
-rw-r--r--src/util/client_manager.c121
1 files changed, 79 insertions, 42 deletions
diff --git a/src/util/client_manager.c b/src/util/client_manager.c
index f334bb5b6..026837841 100644
--- a/src/util/client_manager.c
+++ b/src/util/client_manager.c
@@ -243,8 +243,10 @@ static void
243schedule_disconnect (void *cls) 243schedule_disconnect (void *cls)
244{ 244{
245 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls; 245 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls;
246
246 GNUNET_CLIENT_MANAGER_disconnect (mgr, GNUNET_NO, 247 GNUNET_CLIENT_MANAGER_disconnect (mgr, GNUNET_NO,
247 mgr->disconnect_cb, mgr->disconnect_cls); 248 mgr->disconnect_cb,
249 mgr->disconnect_cls);
248} 250}
249 251
250 252
@@ -263,9 +265,10 @@ schedule_disconnect (void *cls)
263static size_t 265static size_t
264send_next_message (void *cls, size_t buf_size, void *buf) 266send_next_message (void *cls, size_t buf_size, void *buf)
265{ 267{
266 LOG (GNUNET_ERROR_TYPE_DEBUG, "send_next_message()\n");
267 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls; 268 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls;
268 269
270 LOG (GNUNET_ERROR_TYPE_DEBUG,
271 "send_next_message()\n");
269 if (NULL == buf) 272 if (NULL == buf)
270 { 273 {
271 /* disconnected */ 274 /* disconnected */
@@ -282,7 +285,9 @@ send_next_message (void *cls, size_t buf_size, void *buf)
282 GNUNET_assert (size <= buf_size); 285 GNUNET_assert (size <= buf_size);
283 memcpy (buf, mqi->msg, size); 286 memcpy (buf, mqi->msg, size);
284 287
285 GNUNET_CONTAINER_DLL_remove (mgr->tmit_head, mgr->tmit_tail, mqi); 288 GNUNET_CONTAINER_DLL_remove (mgr->tmit_head,
289 mgr->tmit_tail,
290 mqi);
286 GNUNET_free (mqi->msg); 291 GNUNET_free (mqi->msg);
287 GNUNET_free (mqi); 292 GNUNET_free (mqi);
288 293
@@ -292,7 +297,7 @@ send_next_message (void *cls, size_t buf_size, void *buf)
292 } 297 }
293 else if (GNUNET_YES == mgr->is_disconnecting) 298 else if (GNUNET_YES == mgr->is_disconnecting)
294 { 299 {
295 GNUNET_SCHEDULER_add_now (&schedule_disconnect, mgr); 300 (void) GNUNET_SCHEDULER_add_now (&schedule_disconnect, mgr);
296 return size; 301 return size;
297 } 302 }
298 303
@@ -322,7 +327,8 @@ transmit_next (struct GNUNET_CLIENT_MANAGER_Connection *mgr)
322 { 327 {
323 if (GNUNET_YES == mgr->is_disconnecting) 328 if (GNUNET_YES == mgr->is_disconnecting)
324 GNUNET_CLIENT_MANAGER_disconnect (mgr, GNUNET_NO, 329 GNUNET_CLIENT_MANAGER_disconnect (mgr, GNUNET_NO,
325 mgr->disconnect_cb, mgr->disconnect_cls); 330 mgr->disconnect_cb,
331 mgr->disconnect_cls);
326 return; 332 return;
327 } 333 }
328 334
@@ -346,14 +352,15 @@ static void
346schedule_reconnect (void *cls) 352schedule_reconnect (void *cls)
347{ 353{
348 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls; 354 struct GNUNET_CLIENT_MANAGER_Connection *mgr = cls;
349 mgr->reconnect_task = NULL;
350 355
356 mgr->reconnect_task = NULL;
351 LOG (GNUNET_ERROR_TYPE_DEBUG, 357 LOG (GNUNET_ERROR_TYPE_DEBUG,
352 "Connecting to %s service.\n", mgr->service_name); 358 "Connecting to %s service.\n",
359 mgr->service_name);
353 GNUNET_assert (NULL == mgr->client); 360 GNUNET_assert (NULL == mgr->client);
354 mgr->client = GNUNET_CLIENT_connect (mgr->service_name, mgr->cfg); 361 mgr->client = GNUNET_CLIENT_connect (mgr->service_name,
362 mgr->cfg);
355 GNUNET_assert (NULL != mgr->client); 363 GNUNET_assert (NULL != mgr->client);
356
357 transmit_next (mgr); 364 transmit_next (mgr);
358} 365}
359 366
@@ -373,16 +380,17 @@ schedule_reconnect (void *cls)
373struct GNUNET_CLIENT_MANAGER_Connection * 380struct GNUNET_CLIENT_MANAGER_Connection *
374GNUNET_CLIENT_MANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, 381GNUNET_CLIENT_MANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
375 const char *service_name, 382 const char *service_name,
376 const struct 383 const struct GNUNET_CLIENT_MANAGER_MessageHandler *handlers)
377 GNUNET_CLIENT_MANAGER_MessageHandler *handlers)
378{ 384{
379 struct GNUNET_CLIENT_MANAGER_Connection * 385 struct GNUNET_CLIENT_MANAGER_Connection *mgr;
380 mgr = GNUNET_malloc (sizeof (*mgr)); 386
387 mgr = GNUNET_new (struct GNUNET_CLIENT_MANAGER_Connection);
381 mgr->cfg = cfg; 388 mgr->cfg = cfg;
382 mgr->service_name = service_name; 389 mgr->service_name = service_name;
383 mgr->handlers = handlers; 390 mgr->handlers = handlers;
384 mgr->reconnect_delay = GNUNET_TIME_UNIT_ZERO; 391 mgr->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
385 mgr->reconnect_task = GNUNET_SCHEDULER_add_now (&schedule_reconnect, mgr); 392 mgr->reconnect_task = GNUNET_SCHEDULER_add_now (&schedule_reconnect,
393 mgr);
386 return mgr; 394 return mgr;
387} 395}
388 396
@@ -405,7 +413,9 @@ GNUNET_CLIENT_MANAGER_disconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
405 GNUNET_ContinuationCallback disconnect_cb, 413 GNUNET_ContinuationCallback disconnect_cb,
406 void *cls) 414 void *cls)
407{ 415{
408 LOG (GNUNET_ERROR_TYPE_DEBUG, "Disconnecting (%d)\n", transmit_queue); 416 LOG (GNUNET_ERROR_TYPE_DEBUG,
417 "Disconnecting (%d)\n",
418 transmit_queue);
409 mgr->disconnect_cb = disconnect_cb; 419 mgr->disconnect_cb = disconnect_cb;
410 mgr->disconnect_cls = cls; 420 mgr->disconnect_cls = cls;
411 if (NULL != mgr->tmit_head) 421 if (NULL != mgr->tmit_head)
@@ -424,7 +434,7 @@ GNUNET_CLIENT_MANAGER_disconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
424 GNUNET_CLIENT_MANAGER_drop_queue (mgr); 434 GNUNET_CLIENT_MANAGER_drop_queue (mgr);
425 } 435 }
426 } 436 }
427 if (mgr->reconnect_task != NULL) 437 if (NULL != mgr->reconnect_task)
428 { 438 {
429 GNUNET_SCHEDULER_cancel (mgr->reconnect_task); 439 GNUNET_SCHEDULER_cancel (mgr->reconnect_task);
430 mgr->reconnect_task = NULL; 440 mgr->reconnect_task = NULL;
@@ -473,7 +483,9 @@ GNUNET_CLIENT_MANAGER_reconnect (struct GNUNET_CLIENT_MANAGER_Connection *mgr)
473 "Scheduling task to reconnect to service in %s.\n", 483 "Scheduling task to reconnect to service in %s.\n",
474 GNUNET_STRINGS_relative_time_to_string (mgr->reconnect_delay, GNUNET_YES)); 484 GNUNET_STRINGS_relative_time_to_string (mgr->reconnect_delay, GNUNET_YES));
475 mgr->reconnect_task = 485 mgr->reconnect_task =
476 GNUNET_SCHEDULER_add_delayed (mgr->reconnect_delay, &schedule_reconnect, mgr); 486 GNUNET_SCHEDULER_add_delayed (mgr->reconnect_delay,
487 &schedule_reconnect,
488 mgr);
477 mgr->reconnect_delay = GNUNET_TIME_STD_BACKOFF (mgr->reconnect_delay); 489 mgr->reconnect_delay = GNUNET_TIME_STD_BACKOFF (mgr->reconnect_delay);
478} 490}
479 491
@@ -491,9 +503,13 @@ void
491GNUNET_CLIENT_MANAGER_transmit (struct GNUNET_CLIENT_MANAGER_Connection *mgr, 503GNUNET_CLIENT_MANAGER_transmit (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
492 struct GNUNET_MessageHeader *msg) 504 struct GNUNET_MessageHeader *msg)
493{ 505{
494 struct MessageQueueItem *mqi = GNUNET_malloc (sizeof (*mqi)); 506 struct MessageQueueItem *mqi;
507
508 mqi = GNUNET_new (struct MessageQueueItem);
495 mqi->msg = GNUNET_copy_message (msg); 509 mqi->msg = GNUNET_copy_message (msg);
496 GNUNET_CONTAINER_DLL_insert_tail (mgr->tmit_head, mgr->tmit_tail, mqi); 510 GNUNET_CONTAINER_DLL_insert_tail (mgr->tmit_head,
511 mgr->tmit_tail,
512 mqi);
497 transmit_next (mgr); 513 transmit_next (mgr);
498} 514}
499 515
@@ -511,9 +527,13 @@ void
511GNUNET_CLIENT_MANAGER_transmit_now (struct GNUNET_CLIENT_MANAGER_Connection *mgr, 527GNUNET_CLIENT_MANAGER_transmit_now (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
512 struct GNUNET_MessageHeader *msg) 528 struct GNUNET_MessageHeader *msg)
513{ 529{
514 struct MessageQueueItem *mqi = GNUNET_malloc (sizeof (*mqi)); 530 struct MessageQueueItem *mqi;
531
532 mqi = GNUNET_new (struct MessageQueueItem);
515 mqi->msg = GNUNET_copy_message (msg); 533 mqi->msg = GNUNET_copy_message (msg);
516 GNUNET_CONTAINER_DLL_insert (mgr->tmit_head, mgr->tmit_tail, mqi); 534 GNUNET_CONTAINER_DLL_insert (mgr->tmit_head,
535 mgr->tmit_tail,
536 mqi);
517 transmit_next (mgr); 537 transmit_next (mgr);
518} 538}
519 539
@@ -527,7 +547,10 @@ GNUNET_CLIENT_MANAGER_transmit_now (struct GNUNET_CLIENT_MANAGER_Connection *mgr
527void 547void
528GNUNET_CLIENT_MANAGER_drop_queue (struct GNUNET_CLIENT_MANAGER_Connection *mgr) 548GNUNET_CLIENT_MANAGER_drop_queue (struct GNUNET_CLIENT_MANAGER_Connection *mgr)
529{ 549{
530 struct MessageQueueItem *cur, *next = mgr->tmit_head; 550 struct MessageQueueItem *cur;
551 struct MessageQueueItem *next;
552
553 next = mgr->tmit_head;
531 while (NULL != next) 554 while (NULL != next)
532 { 555 {
533 cur = next; 556 cur = next;
@@ -629,15 +652,14 @@ GNUNET_CLIENT_MANAGER_op_get_next_id (struct GNUNET_CLIENT_MANAGER_Connection *m
629 * @return Operation, or NULL if not found. 652 * @return Operation, or NULL if not found.
630 */ 653 */
631static struct OperationListItem * 654static struct OperationListItem *
632op_find (struct GNUNET_CLIENT_MANAGER_Connection *mgr, uint64_t op_id) 655op_find (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
656 uint64_t op_id)
633{ 657{
634 struct OperationListItem *op = mgr->op_head; 658 struct OperationListItem *op;
635 while (NULL != op) 659
636 { 660 for (op = mgr->op_head; NULL != op; op = op->next)
637 if (op->op_id == op_id) 661 if (op->op_id == op_id)
638 return op; 662 return op;
639 op = op->next;
640 }
641 return NULL; 663 return NULL;
642} 664}
643 665
@@ -691,17 +713,21 @@ GNUNET_CLIENT_MANAGER_op_add (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
691 GNUNET_ResultCallback result_cb, 713 GNUNET_ResultCallback result_cb,
692 void *cls) 714 void *cls)
693{ 715{
716 struct OperationListItem *op;
717
694 if (NULL == result_cb) 718 if (NULL == result_cb)
695 return 0; 719 return 0;
696 720 op = GNUNET_new (struct OperationListItem);
697 struct OperationListItem *op = GNUNET_malloc (sizeof (*op));
698 op->op_id = GNUNET_CLIENT_MANAGER_op_get_next_id (mgr); 721 op->op_id = GNUNET_CLIENT_MANAGER_op_get_next_id (mgr);
699 op->result_cb = result_cb; 722 op->result_cb = result_cb;
700 op->cls = cls; 723 op->cls = cls;
701 GNUNET_CONTAINER_DLL_insert_tail (mgr->op_head, mgr->op_tail, op); 724 GNUNET_CONTAINER_DLL_insert_tail (mgr->op_head,
702 725 mgr->op_tail,
726 op);
703 LOG (GNUNET_ERROR_TYPE_DEBUG, 727 LOG (GNUNET_ERROR_TYPE_DEBUG,
704 "%p Added operation #%" PRIu64 "\n", mgr, op->op_id); 728 "%p Added operation #%" PRIu64 "\n",
729 mgr,
730 op->op_id);
705 return op->op_id; 731 return op->op_id;
706} 732}
707 733
@@ -730,8 +756,11 @@ GNUNET_CLIENT_MANAGER_op_add (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
730 */ 756 */
731static int 757static int
732op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr, 758op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
733 uint64_t op_id, int64_t result_code, 759 uint64_t op_id,
734 const void *data, uint16_t data_size, uint8_t cancel) 760 int64_t result_code,
761 const void *data,
762 uint16_t data_size,
763 uint8_t cancel)
735{ 764{
736 if (0 == op_id) 765 if (0 == op_id)
737 return GNUNET_NO; 766 return GNUNET_NO;
@@ -744,11 +773,15 @@ op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
744 return GNUNET_NO; 773 return GNUNET_NO;
745 } 774 }
746 775
747 GNUNET_CONTAINER_DLL_remove (mgr->op_head, mgr->op_tail, op); 776 GNUNET_CONTAINER_DLL_remove (mgr->op_head,
748 777 mgr->op_tail,
749 if (GNUNET_YES != cancel && NULL != op->result_cb) 778 op);
750 op->result_cb (op->cls, result_code, data, data_size);
751 779
780 if ( (GNUNET_YES != cancel) &&
781 (NULL != op->result_cb) )
782 op->result_cb (op->cls,
783 result_code, data,
784 data_size);
752 GNUNET_free (op); 785 GNUNET_free (op);
753 return GNUNET_YES; 786 return GNUNET_YES;
754} 787}
@@ -773,8 +806,10 @@ op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
773 */ 806 */
774int 807int
775GNUNET_CLIENT_MANAGER_op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr, 808GNUNET_CLIENT_MANAGER_op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
776 uint64_t op_id, int64_t result_code, 809 uint64_t op_id,
777 const void *data, uint16_t data_size) 810 int64_t result_code,
811 const void *data,
812 uint16_t data_size)
778{ 813{
779 LOG (GNUNET_ERROR_TYPE_DEBUG, 814 LOG (GNUNET_ERROR_TYPE_DEBUG,
780 "%p Received result for operation #%" PRIu64 ": %" PRId64 " (size: %u)\n", 815 "%p Received result for operation #%" PRIu64 ": %" PRId64 " (size: %u)\n",
@@ -799,6 +834,8 @@ GNUNET_CLIENT_MANAGER_op_cancel (struct GNUNET_CLIENT_MANAGER_Connection *mgr,
799 uint64_t op_id) 834 uint64_t op_id)
800{ 835{
801 LOG (GNUNET_ERROR_TYPE_DEBUG, 836 LOG (GNUNET_ERROR_TYPE_DEBUG,
802 "%p Cancelling operation #%" PRIu64 "\n", mgr, op_id); 837 "%p Cancelling operation #%" PRIu64 "\n",
838 mgr,
839 op_id);
803 return op_result (mgr, op_id, 0, NULL, 0, GNUNET_YES); 840 return op_result (mgr, op_id, 0, NULL, 0, GNUNET_YES);
804} 841}