diff options
Diffstat (limited to 'src/util/connection.c')
-rw-r--r-- | src/util/connection.c | 184 |
1 files changed, 89 insertions, 95 deletions
diff --git a/src/util/connection.c b/src/util/connection.c index 1ac1b2304..39cb1dde2 100644 --- a/src/util/connection.c +++ b/src/util/connection.c | |||
@@ -425,9 +425,8 @@ GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access, | |||
425 | /* largely traditional GNU/Linux */ | 425 | /* largely traditional GNU/Linux */ |
426 | olen = sizeof (uc); | 426 | olen = sizeof (uc); |
427 | if ((0 == | 427 | if ((0 == |
428 | getsockopt (GNUNET_NETWORK_get_fd (sock), | 428 | getsockopt (GNUNET_NETWORK_get_fd (sock), SOL_SOCKET, SO_PEERCRED, &uc, |
429 | SOL_SOCKET, SO_PEERCRED, &uc, &olen)) && | 429 | &olen)) && (olen == sizeof (uc))) |
430 | (olen == sizeof (uc))) | ||
431 | { | 430 | { |
432 | gc.uid = uc.uid; | 431 | gc.uid = uc.uid; |
433 | gc.gid = uc.gid; | 432 | gc.gid = uc.gid; |
@@ -455,8 +454,8 @@ GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access, | |||
455 | (GNUNET_YES != (aret = access (access_cls, gcp, uaddr, addrlen)))) | 454 | (GNUNET_YES != (aret = access (access_cls, gcp, uaddr, addrlen)))) |
456 | { | 455 | { |
457 | if (aret == GNUNET_NO) | 456 | if (aret == GNUNET_NO) |
458 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 457 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Access denied to `%s'\n"), |
459 | _("Access denied to `%s'\n"), GNUNET_a2s (uaddr, addrlen)); | 458 | GNUNET_a2s (uaddr, addrlen)); |
460 | GNUNET_break (GNUNET_OK == | 459 | GNUNET_break (GNUNET_OK == |
461 | GNUNET_NETWORK_socket_shutdown (sock, SHUT_RDWR)); | 460 | GNUNET_NETWORK_socket_shutdown (sock, SHUT_RDWR)); |
462 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock)); | 461 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock)); |
@@ -470,8 +469,7 @@ GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access, | |||
470 | ret->addrlen = addrlen; | 469 | ret->addrlen = addrlen; |
471 | ret->sock = sock; | 470 | ret->sock = sock; |
472 | #if DEBUG_CONNECTION | 471 | #if DEBUG_CONNECTION |
473 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 472 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Accepting connection from `%s': %p\n"), |
474 | _("Accepting connection from `%s': %p\n"), | ||
475 | GNUNET_a2s (uaddr, addrlen), ret); | 473 | GNUNET_a2s (uaddr, addrlen), ret); |
476 | #endif | 474 | #endif |
477 | return ret; | 475 | return ret; |
@@ -508,8 +506,8 @@ GNUNET_CONNECTION_get_address (struct GNUNET_CONNECTION_Handle *sock, | |||
508 | * @param cls our connection handle | 506 | * @param cls our connection handle |
509 | * @param tc task context describing why we are here | 507 | * @param tc task context describing why we are here |
510 | */ | 508 | */ |
511 | static void | 509 | static void receive_again (void *cls, |
512 | receive_again (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc); | 510 | const struct GNUNET_SCHEDULER_TaskContext *tc); |
513 | 511 | ||
514 | 512 | ||
515 | /** | 513 | /** |
@@ -544,9 +542,9 @@ destroy_continuation (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
544 | "Destroy waits for write_task to be done (%p)\n", sock); | 542 | "Destroy waits for write_task to be done (%p)\n", sock); |
545 | #endif | 543 | #endif |
546 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->destroy_task); | 544 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->destroy_task); |
547 | sock->destroy_task | 545 | sock->destroy_task = |
548 | = GNUNET_SCHEDULER_add_after (sock->write_task, | 546 | GNUNET_SCHEDULER_add_after (sock->write_task, &destroy_continuation, |
549 | &destroy_continuation, sock); | 547 | sock); |
550 | return; | 548 | return; |
551 | } | 549 | } |
552 | if (0 != (sock->ccs & COCO_RECEIVE_AGAIN)) | 550 | if (0 != (sock->ccs & COCO_RECEIVE_AGAIN)) |
@@ -569,9 +567,9 @@ destroy_continuation (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
569 | if (sock->read_task != GNUNET_SCHEDULER_NO_TASK) | 567 | if (sock->read_task != GNUNET_SCHEDULER_NO_TASK) |
570 | { | 568 | { |
571 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->destroy_task); | 569 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->destroy_task); |
572 | sock->destroy_task | 570 | sock->destroy_task = |
573 | = GNUNET_SCHEDULER_add_after (sock->read_task, | 571 | GNUNET_SCHEDULER_add_after (sock->read_task, &destroy_continuation, |
574 | &destroy_continuation, sock); | 572 | sock); |
575 | return; | 573 | return; |
576 | } | 574 | } |
577 | #if DEBUG_CONNECTION | 575 | #if DEBUG_CONNECTION |
@@ -604,8 +602,8 @@ destroy_continuation (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
604 | GNUNET_free_non_null (sock->hostname); | 602 | GNUNET_free_non_null (sock->hostname); |
605 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->destroy_task); | 603 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->destroy_task); |
606 | #if DEBUG_CONNECTION | 604 | #if DEBUG_CONNECTION |
607 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 605 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Freeing memory of connection %p.\n", |
608 | "Freeing memory of connection %p.\n", sock); | 606 | sock); |
609 | #endif | 607 | #endif |
610 | GNUNET_free (sock->write_buffer); | 608 | GNUNET_free (sock->write_buffer); |
611 | GNUNET_free (sock); | 609 | GNUNET_free (sock); |
@@ -621,8 +619,8 @@ destroy_continuation (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
621 | * @param cls our connection handle | 619 | * @param cls our connection handle |
622 | * @param tc task context describing why we are here | 620 | * @param tc task context describing why we are here |
623 | */ | 621 | */ |
624 | static void | 622 | static void transmit_ready (void *cls, |
625 | transmit_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc); | 623 | const struct GNUNET_SCHEDULER_TaskContext *tc); |
626 | 624 | ||
627 | 625 | ||
628 | /** | 626 | /** |
@@ -634,11 +632,10 @@ static void | |||
634 | connect_fail_continuation (struct GNUNET_CONNECTION_Handle *h) | 632 | connect_fail_continuation (struct GNUNET_CONNECTION_Handle *h) |
635 | { | 633 | { |
636 | #if DEBUG_CONNECTION | 634 | #if DEBUG_CONNECTION |
637 | GNUNET_log ((0 != strncmp (h->hostname, | 635 | GNUNET_log ((0 != |
638 | "localhost:", | 636 | strncmp (h->hostname, "localhost:", |
639 | 10)) | 637 | 10)) ? GNUNET_ERROR_TYPE_INFO : |
640 | ? GNUNET_ERROR_TYPE_INFO | 638 | GNUNET_ERROR_TYPE_WARNING, |
641 | : GNUNET_ERROR_TYPE_WARNING, | ||
642 | _ | 639 | _ |
643 | ("Failed to establish TCP connection to `%s:%u', no further addresses to try.\n"), | 640 | ("Failed to establish TCP connection to `%s:%u', no further addresses to try.\n"), |
644 | h->hostname, h->port); | 641 | h->hostname, h->port); |
@@ -697,8 +694,7 @@ static void | |||
697 | connect_success_continuation (struct GNUNET_CONNECTION_Handle *h) | 694 | connect_success_continuation (struct GNUNET_CONNECTION_Handle *h) |
698 | { | 695 | { |
699 | #if DEBUG_CONNECTION | 696 | #if DEBUG_CONNECTION |
700 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 697 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connection to `%s' succeeded! (%p)\n", |
701 | "Connection to `%s' succeeded! (%p)\n", | ||
702 | GNUNET_a2s (h->addr, h->addrlen), h); | 698 | GNUNET_a2s (h->addr, h->addrlen), h); |
703 | #endif | 699 | #endif |
704 | /* trigger jobs that waited for the connection */ | 700 | /* trigger jobs that waited for the connection */ |
@@ -767,8 +763,8 @@ connect_probe_continuation (void *cls, | |||
767 | error = 0; | 763 | error = 0; |
768 | if ((0 == (tc->reason & GNUNET_SCHEDULER_REASON_WRITE_READY)) || | 764 | if ((0 == (tc->reason & GNUNET_SCHEDULER_REASON_WRITE_READY)) || |
769 | (GNUNET_OK != | 765 | (GNUNET_OK != |
770 | GNUNET_NETWORK_socket_getsockopt (ap->sock, SOL_SOCKET, SO_ERROR, | 766 | GNUNET_NETWORK_socket_getsockopt (ap->sock, SOL_SOCKET, SO_ERROR, &error, |
771 | &error, &len)) || (error != 0)) | 767 | &len)) || (error != 0)) |
772 | { | 768 | { |
773 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ap->sock)); | 769 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ap->sock)); |
774 | GNUNET_free (ap); | 770 | GNUNET_free (ap); |
@@ -804,8 +800,8 @@ connect_probe_continuation (void *cls, | |||
804 | * @param addrlen length of addr | 800 | * @param addrlen length of addr |
805 | */ | 801 | */ |
806 | static void | 802 | static void |
807 | try_connect_using_address (void *cls, | 803 | try_connect_using_address (void *cls, const struct sockaddr *addr, |
808 | const struct sockaddr *addr, socklen_t addrlen) | 804 | socklen_t addrlen) |
809 | { | 805 | { |
810 | struct GNUNET_CONNECTION_Handle *h = cls; | 806 | struct GNUNET_CONNECTION_Handle *h = cls; |
811 | struct AddressProbe *ap; | 807 | struct AddressProbe *ap; |
@@ -824,8 +820,8 @@ try_connect_using_address (void *cls, | |||
824 | /* try to connect */ | 820 | /* try to connect */ |
825 | #if DEBUG_CONNECTION | 821 | #if DEBUG_CONNECTION |
826 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 822 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
827 | "Trying to connect using address `%s:%u/%s:%u'\n", | 823 | "Trying to connect using address `%s:%u/%s:%u'\n", h->hostname, |
828 | h->hostname, h->port, GNUNET_a2s (addr, addrlen), h->port); | 824 | h->port, GNUNET_a2s (addr, addrlen), h->port); |
829 | #endif | 825 | #endif |
830 | ap = GNUNET_malloc (sizeof (struct AddressProbe) + addrlen); | 826 | ap = GNUNET_malloc (sizeof (struct AddressProbe) + addrlen); |
831 | ap->addr = (const struct sockaddr *) &ap[1]; | 827 | ap->addr = (const struct sockaddr *) &ap[1]; |
@@ -853,13 +849,11 @@ try_connect_using_address (void *cls, | |||
853 | return; /* not supported by OS */ | 849 | return; /* not supported by OS */ |
854 | } | 850 | } |
855 | #if DEBUG_CONNECTION | 851 | #if DEBUG_CONNECTION |
856 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 852 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Trying to connect to `%s' (%p)\n"), |
857 | _("Trying to connect to `%s' (%p)\n"), | ||
858 | GNUNET_a2s (ap->addr, ap->addrlen), h); | 853 | GNUNET_a2s (ap->addr, ap->addrlen), h); |
859 | #endif | 854 | #endif |
860 | if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (ap->sock, | 855 | if ((GNUNET_OK != |
861 | ap->addr, | 856 | GNUNET_NETWORK_socket_connect (ap->sock, ap->addr, ap->addrlen)) && |
862 | ap->addrlen)) && | ||
863 | (errno != EINPROGRESS)) | 857 | (errno != EINPROGRESS)) |
864 | { | 858 | { |
865 | /* maybe refused / unsupported address, try next */ | 859 | /* maybe refused / unsupported address, try next */ |
@@ -871,13 +865,15 @@ try_connect_using_address (void *cls, | |||
871 | GNUNET_CONTAINER_DLL_insert (h->ap_head, h->ap_tail, ap); | 865 | GNUNET_CONTAINER_DLL_insert (h->ap_head, h->ap_tail, ap); |
872 | delay = GNUNET_CONNECTION_CONNECT_RETRY_TIMEOUT; | 866 | delay = GNUNET_CONNECTION_CONNECT_RETRY_TIMEOUT; |
873 | if (h->nth.notify_ready != NULL) | 867 | if (h->nth.notify_ready != NULL) |
874 | delay = GNUNET_TIME_relative_min (delay, | 868 | delay = |
875 | GNUNET_TIME_absolute_get_remaining | 869 | GNUNET_TIME_relative_min (delay, |
876 | (h->nth.transmit_timeout)); | 870 | GNUNET_TIME_absolute_get_remaining (h->nth. |
871 | transmit_timeout)); | ||
877 | if (h->receiver != NULL) | 872 | if (h->receiver != NULL) |
878 | delay = GNUNET_TIME_relative_min (delay, | 873 | delay = |
879 | GNUNET_TIME_absolute_get_remaining | 874 | GNUNET_TIME_relative_min (delay, |
880 | (h->receive_timeout)); | 875 | GNUNET_TIME_absolute_get_remaining (h-> |
876 | receive_timeout)); | ||
881 | ap->task = | 877 | ap->task = |
882 | GNUNET_SCHEDULER_add_write_net (delay, ap->sock, | 878 | GNUNET_SCHEDULER_add_write_net (delay, ap->sock, |
883 | &connect_probe_continuation, ap); | 879 | &connect_probe_continuation, ap); |
@@ -895,9 +891,9 @@ try_connect_using_address (void *cls, | |||
895 | * @return the socket handle | 891 | * @return the socket handle |
896 | */ | 892 | */ |
897 | struct GNUNET_CONNECTION_Handle * | 893 | struct GNUNET_CONNECTION_Handle * |
898 | GNUNET_CONNECTION_create_from_connect (const struct | 894 | GNUNET_CONNECTION_create_from_connect (const struct GNUNET_CONFIGURATION_Handle |
899 | GNUNET_CONFIGURATION_Handle *cfg, | 895 | *cfg, const char *hostname, |
900 | const char *hostname, uint16_t port) | 896 | uint16_t port) |
901 | { | 897 | { |
902 | struct GNUNET_CONNECTION_Handle *ret; | 898 | struct GNUNET_CONNECTION_Handle *ret; |
903 | 899 | ||
@@ -908,10 +904,10 @@ GNUNET_CONNECTION_create_from_connect (const struct | |||
908 | ret->write_buffer = GNUNET_malloc (ret->write_buffer_size); | 904 | ret->write_buffer = GNUNET_malloc (ret->write_buffer_size); |
909 | ret->port = port; | 905 | ret->port = port; |
910 | ret->hostname = GNUNET_strdup (hostname); | 906 | ret->hostname = GNUNET_strdup (hostname); |
911 | ret->dns_active = GNUNET_RESOLVER_ip_get (ret->hostname, | 907 | ret->dns_active = |
912 | AF_UNSPEC, | 908 | GNUNET_RESOLVER_ip_get (ret->hostname, AF_UNSPEC, |
913 | GNUNET_CONNECTION_CONNECT_RETRY_TIMEOUT, | 909 | GNUNET_CONNECTION_CONNECT_RETRY_TIMEOUT, |
914 | &try_connect_using_address, ret); | 910 | &try_connect_using_address, ret); |
915 | return ret; | 911 | return ret; |
916 | } | 912 | } |
917 | 913 | ||
@@ -966,8 +962,8 @@ GNUNET_CONNECTION_create_from_connect_to_unixpath (const struct | |||
966 | GNUNET_free (ret); | 962 | GNUNET_free (ret); |
967 | return NULL; | 963 | return NULL; |
968 | } | 964 | } |
969 | if (GNUNET_OK != GNUNET_NETWORK_socket_connect (ret->sock, | 965 | if (GNUNET_OK != |
970 | ret->addr, ret->addrlen)) | 966 | GNUNET_NETWORK_socket_connect (ret->sock, ret->addr, ret->addrlen)) |
971 | { | 967 | { |
972 | /* Just return; we expect everything to work eventually so don't fail HARD */ | 968 | /* Just return; we expect everything to work eventually so don't fail HARD */ |
973 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ret->sock)); | 969 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ret->sock)); |
@@ -1004,18 +1000,18 @@ GNUNET_CONNECTION_create_from_sockaddr (int af_family, | |||
1004 | s = GNUNET_NETWORK_socket_create (af_family, SOCK_STREAM, 0); | 1000 | s = GNUNET_NETWORK_socket_create (af_family, SOCK_STREAM, 0); |
1005 | if (s == NULL) | 1001 | if (s == NULL) |
1006 | { | 1002 | { |
1007 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING | | 1003 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, |
1008 | GNUNET_ERROR_TYPE_BULK, "socket"); | 1004 | "socket"); |
1009 | return NULL; | 1005 | return NULL; |
1010 | } | 1006 | } |
1011 | if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (s, serv_addr, addrlen)) | 1007 | if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (s, serv_addr, addrlen)) && |
1012 | && (errno != EINPROGRESS)) | 1008 | (errno != EINPROGRESS)) |
1013 | { | 1009 | { |
1014 | /* maybe refused / unsupported address, try next */ | 1010 | /* maybe refused / unsupported address, try next */ |
1015 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_INFO, "connect"); | 1011 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_INFO, "connect"); |
1016 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 1012 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
1017 | _("Attempt to connect to `%s' failed\n"), | 1013 | _("Attempt to connect to `%s' failed\n"), GNUNET_a2s (serv_addr, |
1018 | GNUNET_a2s (serv_addr, addrlen)); | 1014 | addrlen)); |
1019 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (s)); | 1015 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (s)); |
1020 | return NULL; | 1016 | return NULL; |
1021 | } | 1017 | } |
@@ -1024,8 +1020,7 @@ GNUNET_CONNECTION_create_from_sockaddr (int af_family, | |||
1024 | memcpy (ret->addr, serv_addr, addrlen); | 1020 | memcpy (ret->addr, serv_addr, addrlen); |
1025 | ret->addrlen = addrlen; | 1021 | ret->addrlen = addrlen; |
1026 | #if DEBUG_CONNECTION | 1022 | #if DEBUG_CONNECTION |
1027 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 1023 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Trying to connect to `%s' (%p)\n"), |
1028 | _("Trying to connect to `%s' (%p)\n"), | ||
1029 | GNUNET_a2s (serv_addr, addrlen), ret); | 1024 | GNUNET_a2s (serv_addr, addrlen), ret); |
1030 | #endif | 1025 | #endif |
1031 | return ret; | 1026 | return ret; |
@@ -1157,8 +1152,9 @@ receive_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
1157 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1152 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1158 | "Receive from `%s' encounters error: time out by %llums... (%p)\n", | 1153 | "Receive from `%s' encounters error: time out by %llums... (%p)\n", |
1159 | GNUNET_a2s (sh->addr, sh->addrlen), | 1154 | GNUNET_a2s (sh->addr, sh->addrlen), |
1160 | GNUNET_TIME_absolute_get_duration (sh->receive_timeout). | 1155 | GNUNET_TIME_absolute_get_duration (sh-> |
1161 | rel_value, sh); | 1156 | receive_timeout).rel_value, |
1157 | sh); | ||
1162 | #endif | 1158 | #endif |
1163 | signal_timeout (sh); | 1159 | signal_timeout (sh); |
1164 | return; | 1160 | return; |
@@ -1181,8 +1177,8 @@ RETRY: | |||
1181 | if (errno == EINTR) | 1177 | if (errno == EINTR) |
1182 | goto RETRY; | 1178 | goto RETRY; |
1183 | #if DEBUG_CONNECTION | 1179 | #if DEBUG_CONNECTION |
1184 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1180 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Error receiving: %s\n", |
1185 | "Error receiving: %s\n", STRERROR (errno)); | 1181 | STRERROR (errno)); |
1186 | #endif | 1182 | #endif |
1187 | signal_error (sh, errno); | 1183 | signal_error (sh, errno); |
1188 | return; | 1184 | return; |
@@ -1190,8 +1186,8 @@ RETRY: | |||
1190 | #if DEBUG_CONNECTION | 1186 | #if DEBUG_CONNECTION |
1191 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1187 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1192 | "receive_ready read %u/%u bytes from `%s' (%p)!\n", | 1188 | "receive_ready read %u/%u bytes from `%s' (%p)!\n", |
1193 | (unsigned int) ret, | 1189 | (unsigned int) ret, sh->max, GNUNET_a2s (sh->addr, sh->addrlen), |
1194 | sh->max, GNUNET_a2s (sh->addr, sh->addrlen), sh); | 1190 | sh); |
1195 | #endif | 1191 | #endif |
1196 | GNUNET_assert (NULL != (receiver = sh->receiver)); | 1192 | GNUNET_assert (NULL != (receiver = sh->receiver)); |
1197 | sh->receiver = NULL; | 1193 | sh->receiver = NULL; |
@@ -1260,8 +1256,7 @@ receive_again (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
1260 | * @param receiver_cls closure for receiver | 1256 | * @param receiver_cls closure for receiver |
1261 | */ | 1257 | */ |
1262 | void | 1258 | void |
1263 | GNUNET_CONNECTION_receive (struct GNUNET_CONNECTION_Handle *sock, | 1259 | GNUNET_CONNECTION_receive (struct GNUNET_CONNECTION_Handle *sock, size_t max, |
1264 | size_t max, | ||
1265 | struct GNUNET_TIME_Relative timeout, | 1260 | struct GNUNET_TIME_Relative timeout, |
1266 | GNUNET_CONNECTION_Receiver receiver, | 1261 | GNUNET_CONNECTION_Receiver receiver, |
1267 | void *receiver_cls) | 1262 | void *receiver_cls) |
@@ -1358,15 +1353,16 @@ process_notify (struct GNUNET_CONNECTION_Handle *sock) | |||
1358 | if (sock->write_buffer_size - sock->write_buffer_off < size) | 1353 | if (sock->write_buffer_size - sock->write_buffer_off < size) |
1359 | { | 1354 | { |
1360 | /* need to compact */ | 1355 | /* need to compact */ |
1361 | memmove (sock->write_buffer, | 1356 | memmove (sock->write_buffer, &sock->write_buffer[sock->write_buffer_pos], |
1362 | &sock->write_buffer[sock->write_buffer_pos], used); | 1357 | used); |
1363 | sock->write_buffer_off -= sock->write_buffer_pos; | 1358 | sock->write_buffer_off -= sock->write_buffer_pos; |
1364 | sock->write_buffer_pos = 0; | 1359 | sock->write_buffer_pos = 0; |
1365 | } | 1360 | } |
1366 | avail = sock->write_buffer_size - sock->write_buffer_off; | 1361 | avail = sock->write_buffer_size - sock->write_buffer_off; |
1367 | GNUNET_assert (avail >= size); | 1362 | GNUNET_assert (avail >= size); |
1368 | size = notify (sock->nth.notify_ready_cls, | 1363 | size = |
1369 | avail, &sock->write_buffer[sock->write_buffer_off]); | 1364 | notify (sock->nth.notify_ready_cls, avail, |
1365 | &sock->write_buffer[sock->write_buffer_off]); | ||
1370 | GNUNET_assert (size <= avail); | 1366 | GNUNET_assert (size <= avail); |
1371 | sock->write_buffer_off += size; | 1367 | sock->write_buffer_off += size; |
1372 | return GNUNET_YES; | 1368 | return GNUNET_YES; |
@@ -1397,8 +1393,8 @@ transmit_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
1397 | #if DEBUG_CONNECTION | 1393 | #if DEBUG_CONNECTION |
1398 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1394 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1399 | "Transmit to `%s:%u/%s' fails, time out reached (%p).\n", | 1395 | "Transmit to `%s:%u/%s' fails, time out reached (%p).\n", |
1400 | sock->hostname, | 1396 | sock->hostname, sock->port, GNUNET_a2s (sock->addr, |
1401 | sock->port, GNUNET_a2s (sock->addr, sock->addrlen), sock); | 1397 | sock->addrlen), sock); |
1402 | #endif | 1398 | #endif |
1403 | GNUNET_assert (0 != (sock->ccs & COCO_TRANSMIT_READY)); | 1399 | GNUNET_assert (0 != (sock->ccs & COCO_TRANSMIT_READY)); |
1404 | sock->ccs -= COCO_TRANSMIT_READY; /* remove request */ | 1400 | sock->ccs -= COCO_TRANSMIT_READY; /* remove request */ |
@@ -1541,8 +1537,8 @@ transmit_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
1541 | if ((sock->nth.notify_ready != NULL) && | 1537 | if ((sock->nth.notify_ready != NULL) && |
1542 | (sock->write_buffer_size < sock->nth.notify_size)) | 1538 | (sock->write_buffer_size < sock->nth.notify_size)) |
1543 | { | 1539 | { |
1544 | sock->write_buffer = GNUNET_realloc (sock->write_buffer, | 1540 | sock->write_buffer = |
1545 | sock->nth.notify_size); | 1541 | GNUNET_realloc (sock->write_buffer, sock->nth.notify_size); |
1546 | sock->write_buffer_size = sock->nth.notify_size; | 1542 | sock->write_buffer_size = sock->nth.notify_size; |
1547 | } | 1543 | } |
1548 | process_notify (sock); | 1544 | process_notify (sock); |
@@ -1556,9 +1552,10 @@ transmit_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
1556 | GNUNET_assert (have + sock->write_buffer_pos <= sock->write_buffer_size); | 1552 | GNUNET_assert (have + sock->write_buffer_pos <= sock->write_buffer_size); |
1557 | GNUNET_assert (sock->write_buffer_pos <= sock->write_buffer_size); | 1553 | GNUNET_assert (sock->write_buffer_pos <= sock->write_buffer_size); |
1558 | RETRY: | 1554 | RETRY: |
1559 | ret = GNUNET_NETWORK_socket_send (sock->sock, | 1555 | ret = |
1560 | &sock->write_buffer[sock->write_buffer_pos], | 1556 | GNUNET_NETWORK_socket_send (sock->sock, |
1561 | have); | 1557 | &sock->write_buffer[sock->write_buffer_pos], |
1558 | have); | ||
1562 | if (ret == -1) | 1559 | if (ret == -1) |
1563 | { | 1560 | { |
1564 | if (errno == EINTR) | 1561 | if (errno == EINTR) |
@@ -1566,8 +1563,7 @@ RETRY: | |||
1566 | #if 0 | 1563 | #if 0 |
1567 | int en = errno; | 1564 | int en = errno; |
1568 | 1565 | ||
1569 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 1566 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Failed to send to `%s': %s\n"), |
1570 | _("Failed to send to `%s': %s\n"), | ||
1571 | GNUNET_a2s (sock->addr, sock->addrlen), STRERROR (en)); | 1567 | GNUNET_a2s (sock->addr, sock->addrlen), STRERROR (en)); |
1572 | #endif | 1568 | #endif |
1573 | #if DEBUG_CONNECTION | 1569 | #if DEBUG_CONNECTION |
@@ -1579,8 +1575,8 @@ RETRY: | |||
1579 | #if DEBUG_CONNECTION | 1575 | #if DEBUG_CONNECTION |
1580 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1576 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1581 | "transmit_ready transmitted %u/%u bytes to `%s' (%p)\n", | 1577 | "transmit_ready transmitted %u/%u bytes to `%s' (%p)\n", |
1582 | (unsigned int) ret, | 1578 | (unsigned int) ret, have, GNUNET_a2s (sock->addr, sock->addrlen), |
1583 | have, GNUNET_a2s (sock->addr, sock->addrlen), sock); | 1579 | sock); |
1584 | #endif | 1580 | #endif |
1585 | sock->write_buffer_pos += ret; | 1581 | sock->write_buffer_pos += ret; |
1586 | if (sock->write_buffer_pos == sock->write_buffer_off) | 1582 | if (sock->write_buffer_pos == sock->write_buffer_off) |
@@ -1601,9 +1597,8 @@ SCHEDULE_WRITE: | |||
1601 | GNUNET_assert ((sock->nth.notify_ready != NULL) || (have > 0)); | 1597 | GNUNET_assert ((sock->nth.notify_ready != NULL) || (have > 0)); |
1602 | if (sock->write_task == GNUNET_SCHEDULER_NO_TASK) | 1598 | if (sock->write_task == GNUNET_SCHEDULER_NO_TASK) |
1603 | sock->write_task = | 1599 | sock->write_task = |
1604 | GNUNET_SCHEDULER_add_write_net ((sock->nth.notify_ready == NULL) | 1600 | GNUNET_SCHEDULER_add_write_net ((sock->nth.notify_ready == |
1605 | ? GNUNET_TIME_UNIT_FOREVER_REL | 1601 | NULL) ? GNUNET_TIME_UNIT_FOREVER_REL : |
1606 | : | ||
1607 | GNUNET_TIME_absolute_get_remaining | 1602 | GNUNET_TIME_absolute_get_remaining |
1608 | (sock->nth.transmit_timeout), | 1603 | (sock->nth.transmit_timeout), |
1609 | sock->sock, &transmit_ready, sock); | 1604 | sock->sock, &transmit_ready, sock); |
@@ -1625,8 +1620,8 @@ SCHEDULE_WRITE: | |||
1625 | * NULL if we are already going to notify someone else (busy) | 1620 | * NULL if we are already going to notify someone else (busy) |
1626 | */ | 1621 | */ |
1627 | struct GNUNET_CONNECTION_TransmitHandle * | 1622 | struct GNUNET_CONNECTION_TransmitHandle * |
1628 | GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle | 1623 | GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle *sock, |
1629 | *sock, size_t size, | 1624 | size_t size, |
1630 | struct GNUNET_TIME_Relative timeout, | 1625 | struct GNUNET_TIME_Relative timeout, |
1631 | GNUNET_CONNECTION_TransmitReadyNotify | 1626 | GNUNET_CONNECTION_TransmitReadyNotify |
1632 | notify, void *notify_cls) | 1627 | notify, void *notify_cls) |
@@ -1647,8 +1642,8 @@ GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle | |||
1647 | sock->nth.notify_size = size; | 1642 | sock->nth.notify_size = size; |
1648 | sock->nth.transmit_timeout = GNUNET_TIME_relative_to_absolute (timeout); | 1643 | sock->nth.transmit_timeout = GNUNET_TIME_relative_to_absolute (timeout); |
1649 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->nth.timeout_task); | 1644 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == sock->nth.timeout_task); |
1650 | if ((sock->sock == NULL) && | 1645 | if ((sock->sock == NULL) && (sock->ap_head == NULL) && |
1651 | (sock->ap_head == NULL) && (sock->dns_active == NULL)) | 1646 | (sock->dns_active == NULL)) |
1652 | { | 1647 | { |
1653 | if (sock->write_task != GNUNET_SCHEDULER_NO_TASK) | 1648 | if (sock->write_task != GNUNET_SCHEDULER_NO_TASK) |
1654 | GNUNET_SCHEDULER_cancel (sock->write_task); | 1649 | GNUNET_SCHEDULER_cancel (sock->write_task); |
@@ -1660,8 +1655,8 @@ GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle | |||
1660 | if (sock->sock != NULL) | 1655 | if (sock->sock != NULL) |
1661 | { | 1656 | { |
1662 | #if DEBUG_CONNECTION | 1657 | #if DEBUG_CONNECTION |
1663 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1658 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Scheduling transmit_ready (%p).\n", |
1664 | "Scheduling transmit_ready (%p).\n", sock); | 1659 | sock); |
1665 | #endif | 1660 | #endif |
1666 | sock->write_task = | 1661 | sock->write_task = |
1667 | GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_absolute_get_remaining | 1662 | GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_absolute_get_remaining |
@@ -1676,9 +1671,8 @@ GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle | |||
1676 | sock); | 1671 | sock); |
1677 | #endif | 1672 | #endif |
1678 | sock->ccs |= COCO_TRANSMIT_READY; | 1673 | sock->ccs |= COCO_TRANSMIT_READY; |
1679 | sock->nth.timeout_task = GNUNET_SCHEDULER_add_delayed (timeout, | 1674 | sock->nth.timeout_task = |
1680 | &transmit_timeout, | 1675 | GNUNET_SCHEDULER_add_delayed (timeout, &transmit_timeout, sock); |
1681 | sock); | ||
1682 | } | 1676 | } |
1683 | return &sock->nth; | 1677 | return &sock->nth; |
1684 | } | 1678 | } |