diff options
Diffstat (limited to 'src/util/client.c')
-rw-r--r-- | src/util/client.c | 61 |
1 files changed, 20 insertions, 41 deletions
diff --git a/src/util/client.c b/src/util/client.c index 13c4062a5..171e9e957 100644 --- a/src/util/client.c +++ b/src/util/client.c | |||
@@ -151,11 +151,6 @@ struct GNUNET_CLIENT_Connection | |||
151 | struct GNUNET_CONNECTION_Handle *sock; | 151 | struct GNUNET_CONNECTION_Handle *sock; |
152 | 152 | ||
153 | /** | 153 | /** |
154 | * Our scheduler. | ||
155 | */ | ||
156 | struct GNUNET_SCHEDULER_Handle *sched; | ||
157 | |||
158 | /** | ||
159 | * Our configuration. | 154 | * Our configuration. |
160 | * FIXME: why do we DUP the configuration? Avoid this! | 155 | * FIXME: why do we DUP the configuration? Avoid this! |
161 | */ | 156 | */ |
@@ -262,15 +257,13 @@ struct GNUNET_CLIENT_Connection | |||
262 | /** | 257 | /** |
263 | * Try to connect to the service. | 258 | * Try to connect to the service. |
264 | * | 259 | * |
265 | * @param sched scheduler to use | ||
266 | * @param service_name name of service to connect to | 260 | * @param service_name name of service to connect to |
267 | * @param cfg configuration to use | 261 | * @param cfg configuration to use |
268 | * @param attempt counter used to alternate between IP and UNIX domain sockets | 262 | * @param attempt counter used to alternate between IP and UNIX domain sockets |
269 | * @return NULL on error | 263 | * @return NULL on error |
270 | */ | 264 | */ |
271 | static struct GNUNET_CONNECTION_Handle * | 265 | static struct GNUNET_CONNECTION_Handle * |
272 | do_connect (struct GNUNET_SCHEDULER_Handle *sched, | 266 | do_connect (const char *service_name, |
273 | const char *service_name, | ||
274 | const struct GNUNET_CONFIGURATION_Handle *cfg, | 267 | const struct GNUNET_CONFIGURATION_Handle *cfg, |
275 | unsigned int attempt) | 268 | unsigned int attempt) |
276 | { | 269 | { |
@@ -288,8 +281,7 @@ do_connect (struct GNUNET_SCHEDULER_Handle *sched, | |||
288 | service_name, | 281 | service_name, |
289 | "UNIXPATH", &unixpath)) | 282 | "UNIXPATH", &unixpath)) |
290 | { | 283 | { |
291 | sock = GNUNET_CONNECTION_create_from_connect_to_unixpath (sched, | 284 | sock = GNUNET_CONNECTION_create_from_connect_to_unixpath (cfg, |
292 | cfg, | ||
293 | unixpath); | 285 | unixpath); |
294 | GNUNET_free (unixpath); | 286 | GNUNET_free (unixpath); |
295 | if (sock != NULL) | 287 | if (sock != NULL) |
@@ -323,8 +315,7 @@ do_connect (struct GNUNET_SCHEDULER_Handle *sched, | |||
323 | service_name); | 315 | service_name); |
324 | return NULL; | 316 | return NULL; |
325 | } | 317 | } |
326 | sock = GNUNET_CONNECTION_create_from_connect (sched, | 318 | sock = GNUNET_CONNECTION_create_from_connect (cfg, |
327 | cfg, | ||
328 | hostname, | 319 | hostname, |
329 | port); | 320 | port); |
330 | GNUNET_free (hostname); | 321 | GNUNET_free (hostname); |
@@ -335,28 +326,24 @@ do_connect (struct GNUNET_SCHEDULER_Handle *sched, | |||
335 | /** | 326 | /** |
336 | * Get a connection with a service. | 327 | * Get a connection with a service. |
337 | * | 328 | * |
338 | * @param sched scheduler to use | ||
339 | * @param service_name name of the service | 329 | * @param service_name name of the service |
340 | * @param cfg configuration to use | 330 | * @param cfg configuration to use |
341 | * @return NULL on error (service unknown to configuration) | 331 | * @return NULL on error (service unknown to configuration) |
342 | */ | 332 | */ |
343 | struct GNUNET_CLIENT_Connection * | 333 | struct GNUNET_CLIENT_Connection * |
344 | GNUNET_CLIENT_connect (struct GNUNET_SCHEDULER_Handle *sched, | 334 | GNUNET_CLIENT_connect (const char *service_name, |
345 | const char *service_name, | ||
346 | const struct GNUNET_CONFIGURATION_Handle *cfg) | 335 | const struct GNUNET_CONFIGURATION_Handle *cfg) |
347 | { | 336 | { |
348 | struct GNUNET_CLIENT_Connection *ret; | 337 | struct GNUNET_CLIENT_Connection *ret; |
349 | struct GNUNET_CONNECTION_Handle *sock; | 338 | struct GNUNET_CONNECTION_Handle *sock; |
350 | 339 | ||
351 | sock = do_connect (sched, | 340 | sock = do_connect (service_name, |
352 | service_name, | ||
353 | cfg, 0); | 341 | cfg, 0); |
354 | if (sock == NULL) | 342 | if (sock == NULL) |
355 | return NULL; | 343 | return NULL; |
356 | ret = GNUNET_malloc (sizeof (struct GNUNET_CLIENT_Connection)); | 344 | ret = GNUNET_malloc (sizeof (struct GNUNET_CLIENT_Connection)); |
357 | ret->attempts = 1; | 345 | ret->attempts = 1; |
358 | ret->sock = sock; | 346 | ret->sock = sock; |
359 | ret->sched = sched; | ||
360 | ret->service_name = GNUNET_strdup (service_name); | 347 | ret->service_name = GNUNET_strdup (service_name); |
361 | ret->cfg = GNUNET_CONFIGURATION_dup (cfg); | 348 | ret->cfg = GNUNET_CONFIGURATION_dup (cfg); |
362 | ret->back_off = GNUNET_TIME_UNIT_MILLISECONDS; | 349 | ret->back_off = GNUNET_TIME_UNIT_MILLISECONDS; |
@@ -418,7 +405,7 @@ GNUNET_CLIENT_disconnect (struct GNUNET_CLIENT_Connection *sock, | |||
418 | GNUNET_CLIENT_notify_transmit_ready_cancel (sock->th); | 405 | GNUNET_CLIENT_notify_transmit_ready_cancel (sock->th); |
419 | if (sock->receive_task != GNUNET_SCHEDULER_NO_TASK) | 406 | if (sock->receive_task != GNUNET_SCHEDULER_NO_TASK) |
420 | { | 407 | { |
421 | GNUNET_SCHEDULER_cancel (sock->sched, sock->receive_task); | 408 | GNUNET_SCHEDULER_cancel (sock->receive_task); |
422 | sock->receive_task = GNUNET_SCHEDULER_NO_TASK; | 409 | sock->receive_task = GNUNET_SCHEDULER_NO_TASK; |
423 | } | 410 | } |
424 | GNUNET_array_grow (sock->received_buf, sock->received_size, 0); | 411 | GNUNET_array_grow (sock->received_buf, sock->received_size, 0); |
@@ -569,8 +556,7 @@ GNUNET_CLIENT_receive (struct GNUNET_CLIENT_Connection *sock, | |||
569 | sock->receive_timeout = GNUNET_TIME_relative_to_absolute (timeout); | 556 | sock->receive_timeout = GNUNET_TIME_relative_to_absolute (timeout); |
570 | if (GNUNET_YES == sock->msg_complete) | 557 | if (GNUNET_YES == sock->msg_complete) |
571 | { | 558 | { |
572 | sock->receive_task = GNUNET_SCHEDULER_add_after (sock->sched, | 559 | sock->receive_task = GNUNET_SCHEDULER_add_after (GNUNET_SCHEDULER_NO_TASK, |
573 | GNUNET_SCHEDULER_NO_TASK, | ||
574 | &receive_task, sock); | 560 | &receive_task, sock); |
575 | } | 561 | } |
576 | else | 562 | else |
@@ -588,11 +574,9 @@ GNUNET_CLIENT_receive (struct GNUNET_CLIENT_Connection *sock, | |||
588 | * Report service unavailable. | 574 | * Report service unavailable. |
589 | */ | 575 | */ |
590 | static void | 576 | static void |
591 | service_test_error (struct GNUNET_SCHEDULER_Handle *s, | 577 | service_test_error (GNUNET_SCHEDULER_Task task, void *task_cls) |
592 | GNUNET_SCHEDULER_Task task, void *task_cls) | ||
593 | { | 578 | { |
594 | GNUNET_SCHEDULER_add_continuation (s, | 579 | GNUNET_SCHEDULER_add_continuation (task, |
595 | task, | ||
596 | task_cls, | 580 | task_cls, |
597 | GNUNET_SCHEDULER_REASON_TIMEOUT); | 581 | GNUNET_SCHEDULER_REASON_TIMEOUT); |
598 | } | 582 | } |
@@ -617,14 +601,13 @@ confirm_handler (void *cls, const struct GNUNET_MessageHeader *msg) | |||
617 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 601 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
618 | "Received confirmation that service is running.\n"); | 602 | "Received confirmation that service is running.\n"); |
619 | #endif | 603 | #endif |
620 | GNUNET_SCHEDULER_add_continuation (conn->sched, | 604 | GNUNET_SCHEDULER_add_continuation (conn->test_cb, |
621 | conn->test_cb, | ||
622 | conn->test_cb_cls, | 605 | conn->test_cb_cls, |
623 | GNUNET_SCHEDULER_REASON_PREREQ_DONE); | 606 | GNUNET_SCHEDULER_REASON_PREREQ_DONE); |
624 | } | 607 | } |
625 | else | 608 | else |
626 | { | 609 | { |
627 | service_test_error (conn->sched, conn->test_cb, conn->test_cb_cls); | 610 | service_test_error (conn->test_cb, conn->test_cb_cls); |
628 | } | 611 | } |
629 | GNUNET_CLIENT_disconnect (conn, GNUNET_NO); | 612 | GNUNET_CLIENT_disconnect (conn, GNUNET_NO); |
630 | } | 613 | } |
@@ -642,7 +625,7 @@ write_test (void *cls, size_t size, void *buf) | |||
642 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 625 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
643 | _("Failure to transmit TEST request.\n")); | 626 | _("Failure to transmit TEST request.\n")); |
644 | #endif | 627 | #endif |
645 | service_test_error (conn->sched, conn->test_cb, conn->test_cb_cls); | 628 | service_test_error (conn->test_cb, conn->test_cb_cls); |
646 | GNUNET_CLIENT_disconnect (conn, GNUNET_NO); | 629 | GNUNET_CLIENT_disconnect (conn, GNUNET_NO); |
647 | return 0; /* client disconnected */ | 630 | return 0; /* client disconnected */ |
648 | } | 631 | } |
@@ -664,7 +647,6 @@ write_test (void *cls, size_t size, void *buf) | |||
664 | /** | 647 | /** |
665 | * Wait until the service is running. | 648 | * Wait until the service is running. |
666 | * | 649 | * |
667 | * @param sched scheduler to use | ||
668 | * @param service name of the service to wait for | 650 | * @param service name of the service to wait for |
669 | * @param cfg configuration to use | 651 | * @param cfg configuration to use |
670 | * @param timeout how long to wait at most in ms | 652 | * @param timeout how long to wait at most in ms |
@@ -674,8 +656,7 @@ write_test (void *cls, size_t size, void *buf) | |||
674 | * @param task_cls closure for task | 656 | * @param task_cls closure for task |
675 | */ | 657 | */ |
676 | void | 658 | void |
677 | GNUNET_CLIENT_service_test (struct GNUNET_SCHEDULER_Handle *sched, | 659 | GNUNET_CLIENT_service_test (const char *service, |
678 | const char *service, | ||
679 | const struct GNUNET_CONFIGURATION_Handle *cfg, | 660 | const struct GNUNET_CONFIGURATION_Handle *cfg, |
680 | struct GNUNET_TIME_Relative timeout, | 661 | struct GNUNET_TIME_Relative timeout, |
681 | GNUNET_SCHEDULER_Task task, void *task_cls) | 662 | GNUNET_SCHEDULER_Task task, void *task_cls) |
@@ -686,14 +667,14 @@ GNUNET_CLIENT_service_test (struct GNUNET_SCHEDULER_Handle *sched, | |||
686 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 667 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
687 | "Testing if service `%s' is running.\n", service); | 668 | "Testing if service `%s' is running.\n", service); |
688 | #endif | 669 | #endif |
689 | conn = GNUNET_CLIENT_connect (sched, service, cfg); | 670 | conn = GNUNET_CLIENT_connect (service, cfg); |
690 | if (conn == NULL) | 671 | if (conn == NULL) |
691 | { | 672 | { |
692 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 673 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
693 | _ | 674 | _ |
694 | ("Could not connect to service `%s', must not be running.\n"), | 675 | ("Could not connect to service `%s', must not be running.\n"), |
695 | service); | 676 | service); |
696 | service_test_error (sched, task, task_cls); | 677 | service_test_error (task, task_cls); |
697 | return; | 678 | return; |
698 | } | 679 | } |
699 | conn->test_cb = task; | 680 | conn->test_cb = task; |
@@ -709,7 +690,7 @@ GNUNET_CLIENT_service_test (struct GNUNET_SCHEDULER_Handle *sched, | |||
709 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 690 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
710 | _("Failure to transmit request to service `%s'\n"), | 691 | _("Failure to transmit request to service `%s'\n"), |
711 | service); | 692 | service); |
712 | service_test_error (sched, task, task_cls); | 693 | service_test_error (task, task_cls); |
713 | GNUNET_CLIENT_disconnect (conn, GNUNET_NO); | 694 | GNUNET_CLIENT_disconnect (conn, GNUNET_NO); |
714 | return; | 695 | return; |
715 | } | 696 | } |
@@ -791,7 +772,7 @@ client_notify (void *cls, size_t size, void *buf) | |||
791 | { | 772 | { |
792 | delay = GNUNET_TIME_absolute_get_remaining (th->timeout); | 773 | delay = GNUNET_TIME_absolute_get_remaining (th->timeout); |
793 | delay.rel_value /= 2; | 774 | delay.rel_value /= 2; |
794 | if ( (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & GNUNET_SCHEDULER_get_reason (th->sock->sched))) || | 775 | if ( (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & GNUNET_SCHEDULER_get_reason ())) || |
795 | (GNUNET_YES != th->auto_retry) || | 776 | (GNUNET_YES != th->auto_retry) || |
796 | (0 == --th->attempts_left) || | 777 | (0 == --th->attempts_left) || |
797 | (delay.rel_value < 1) ) | 778 | (delay.rel_value < 1) ) |
@@ -807,8 +788,7 @@ client_notify (void *cls, size_t size, void *buf) | |||
807 | } | 788 | } |
808 | /* auto-retry */ | 789 | /* auto-retry */ |
809 | GNUNET_CONNECTION_destroy (th->sock->sock, GNUNET_NO); | 790 | GNUNET_CONNECTION_destroy (th->sock->sock, GNUNET_NO); |
810 | th->sock->sock = do_connect (th->sock->sched, | 791 | th->sock->sock = do_connect (th->sock->service_name, |
811 | th->sock->service_name, | ||
812 | th->sock->cfg, | 792 | th->sock->cfg, |
813 | th->sock->attempts++); | 793 | th->sock->attempts++); |
814 | GNUNET_assert (NULL != th->sock->sock); | 794 | GNUNET_assert (NULL != th->sock->sock); |
@@ -824,8 +804,7 @@ client_notify (void *cls, size_t size, void *buf) | |||
824 | MAX_ATTEMPTS - th->attempts_left, | 804 | MAX_ATTEMPTS - th->attempts_left, |
825 | (unsigned long long) delay.rel_value); | 805 | (unsigned long long) delay.rel_value); |
826 | #endif | 806 | #endif |
827 | th->reconnect_task = GNUNET_SCHEDULER_add_delayed (th->sock->sched, | 807 | th->reconnect_task = GNUNET_SCHEDULER_add_delayed (delay, |
828 | delay, | ||
829 | &client_delayed_retry, | 808 | &client_delayed_retry, |
830 | th); | 809 | th); |
831 | th->sock->th = th; | 810 | th->sock->th = th; |
@@ -904,7 +883,7 @@ GNUNET_CLIENT_notify_transmit_ready_cancel (struct | |||
904 | if (th->reconnect_task != GNUNET_SCHEDULER_NO_TASK) | 883 | if (th->reconnect_task != GNUNET_SCHEDULER_NO_TASK) |
905 | { | 884 | { |
906 | GNUNET_break (NULL == th->th); | 885 | GNUNET_break (NULL == th->th); |
907 | GNUNET_SCHEDULER_cancel (th->sock->sched, th->reconnect_task); | 886 | GNUNET_SCHEDULER_cancel (th->reconnect_task); |
908 | th->reconnect_task = GNUNET_SCHEDULER_NO_TASK; | 887 | th->reconnect_task = GNUNET_SCHEDULER_NO_TASK; |
909 | } | 888 | } |
910 | else | 889 | else |