diff options
Diffstat (limited to 'src/util/client_manager.c')
-rw-r--r-- | src/util/client_manager.c | 121 |
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 | |||
243 | schedule_disconnect (void *cls) | 243 | schedule_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) | |||
263 | static size_t | 265 | static size_t |
264 | send_next_message (void *cls, size_t buf_size, void *buf) | 266 | send_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 | |||
346 | schedule_reconnect (void *cls) | 352 | schedule_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) | |||
373 | struct GNUNET_CLIENT_MANAGER_Connection * | 380 | struct GNUNET_CLIENT_MANAGER_Connection * |
374 | GNUNET_CLIENT_MANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, | 381 | GNUNET_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 | |||
491 | GNUNET_CLIENT_MANAGER_transmit (struct GNUNET_CLIENT_MANAGER_Connection *mgr, | 503 | GNUNET_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 | |||
511 | GNUNET_CLIENT_MANAGER_transmit_now (struct GNUNET_CLIENT_MANAGER_Connection *mgr, | 527 | GNUNET_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 | |||
527 | void | 547 | void |
528 | GNUNET_CLIENT_MANAGER_drop_queue (struct GNUNET_CLIENT_MANAGER_Connection *mgr) | 548 | GNUNET_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 | */ |
631 | static struct OperationListItem * | 654 | static struct OperationListItem * |
632 | op_find (struct GNUNET_CLIENT_MANAGER_Connection *mgr, uint64_t op_id) | 655 | op_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 | */ |
731 | static int | 757 | static int |
732 | op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr, | 758 | op_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 | */ |
774 | int | 807 | int |
775 | GNUNET_CLIENT_MANAGER_op_result (struct GNUNET_CLIENT_MANAGER_Connection *mgr, | 808 | GNUNET_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 | } |