aboutsummaryrefslogtreecommitdiff
path: root/src/util/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/client.c')
-rw-r--r--src/util/client.c61
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 */
271static struct GNUNET_CONNECTION_Handle * 265static struct GNUNET_CONNECTION_Handle *
272do_connect (struct GNUNET_SCHEDULER_Handle *sched, 266do_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 */
343struct GNUNET_CLIENT_Connection * 333struct GNUNET_CLIENT_Connection *
344GNUNET_CLIENT_connect (struct GNUNET_SCHEDULER_Handle *sched, 334GNUNET_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 */
590static void 576static void
591service_test_error (struct GNUNET_SCHEDULER_Handle *s, 577service_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 */
676void 658void
677GNUNET_CLIENT_service_test (struct GNUNET_SCHEDULER_Handle *sched, 659GNUNET_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