aboutsummaryrefslogtreecommitdiff
path: root/src/util/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/connection.c')
-rw-r--r--src/util/connection.c184
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 */
511static void 509static void receive_again (void *cls,
512receive_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 */
624static void 622static void transmit_ready (void *cls,
625transmit_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
634connect_fail_continuation (struct GNUNET_CONNECTION_Handle *h) 632connect_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
697connect_success_continuation (struct GNUNET_CONNECTION_Handle *h) 694connect_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 */
806static void 802static void
807try_connect_using_address (void *cls, 803try_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 */
897struct GNUNET_CONNECTION_Handle * 893struct GNUNET_CONNECTION_Handle *
898GNUNET_CONNECTION_create_from_connect (const struct 894GNUNET_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 */
1262void 1258void
1263GNUNET_CONNECTION_receive (struct GNUNET_CONNECTION_Handle *sock, 1259GNUNET_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);
1558RETRY: 1554RETRY:
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 */
1627struct GNUNET_CONNECTION_TransmitHandle * 1622struct GNUNET_CONNECTION_TransmitHandle *
1628GNUNET_CONNECTION_notify_transmit_ready (struct GNUNET_CONNECTION_Handle 1623GNUNET_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}