diff options
-rw-r--r-- | src/arm/gnunet-service-arm.c | 2 | ||||
-rw-r--r-- | src/dns/dnsstub.c | 3 | ||||
-rw-r--r-- | src/gns/gnunet-dns2gns.c | 6 | ||||
-rw-r--r-- | src/gns/gnunet-gns-proxy.c | 2 | ||||
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 3 | ||||
-rw-r--r-- | src/include/gnunet_network_lib.h | 10 | ||||
-rw-r--r-- | src/nat/nat_test.c | 2 | ||||
-rw-r--r-- | src/testing/testing.c | 3 | ||||
-rw-r--r-- | src/transport/plugin_transport_udp.c | 4 | ||||
-rw-r--r-- | src/transport/plugin_transport_unix.c | 2 | ||||
-rw-r--r-- | src/util/client.c | 6 | ||||
-rw-r--r-- | src/util/network.c | 5 | ||||
-rw-r--r-- | src/util/server.c | 2 | ||||
-rw-r--r-- | src/util/test_connection.c | 2 | ||||
-rw-r--r-- | src/util/test_connection_addressing.c | 2 | ||||
-rw-r--r-- | src/util/test_connection_receive_cancel.c | 2 | ||||
-rw-r--r-- | src/util/test_connection_timeout.c | 2 |
17 files changed, 36 insertions, 22 deletions
diff --git a/src/arm/gnunet-service-arm.c b/src/arm/gnunet-service-arm.c index 974e983bb..2eb870719 100644 --- a/src/arm/gnunet-service-arm.c +++ b/src/arm/gnunet-service-arm.c | |||
@@ -617,7 +617,7 @@ create_listen_socket (struct sockaddr *sa, socklen_t addr_len, | |||
617 | #endif | 617 | #endif |
618 | 618 | ||
619 | if (GNUNET_NETWORK_socket_bind | 619 | if (GNUNET_NETWORK_socket_bind |
620 | (sock, (const struct sockaddr *) sa, addr_len) != GNUNET_OK) | 620 | (sock, (const struct sockaddr *) sa, addr_len, 0) != GNUNET_OK) |
621 | { | 621 | { |
622 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 622 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
623 | _ | 623 | _ |
diff --git a/src/dns/dnsstub.c b/src/dns/dnsstub.c index c755aff16..3b30d3e63 100644 --- a/src/dns/dnsstub.c +++ b/src/dns/dnsstub.c | |||
@@ -169,7 +169,8 @@ open_socket (int af) | |||
169 | sa->sa_family = af; | 169 | sa->sa_family = af; |
170 | if (GNUNET_OK != GNUNET_NETWORK_socket_bind (ret, | 170 | if (GNUNET_OK != GNUNET_NETWORK_socket_bind (ret, |
171 | sa, | 171 | sa, |
172 | alen)) | 172 | alen, |
173 | 0)) | ||
173 | { | 174 | { |
174 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 175 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
175 | _("Could not bind to any port: %s\n"), | 176 | _("Could not bind to any port: %s\n"), |
diff --git a/src/gns/gnunet-dns2gns.c b/src/gns/gnunet-dns2gns.c index 835010357..ec64f0730 100644 --- a/src/gns/gnunet-dns2gns.c +++ b/src/gns/gnunet-dns2gns.c | |||
@@ -608,7 +608,8 @@ run (void *cls, char *const *args, const char *cfgfile, | |||
608 | if (GNUNET_OK != | 608 | if (GNUNET_OK != |
609 | GNUNET_NETWORK_socket_bind (listen_socket4, | 609 | GNUNET_NETWORK_socket_bind (listen_socket4, |
610 | (struct sockaddr *) &v4, | 610 | (struct sockaddr *) &v4, |
611 | sizeof (v4))) | 611 | sizeof (v4), |
612 | 0)) | ||
612 | { | 613 | { |
613 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); | 614 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); |
614 | GNUNET_NETWORK_socket_close (listen_socket4); | 615 | GNUNET_NETWORK_socket_close (listen_socket4); |
@@ -631,7 +632,8 @@ run (void *cls, char *const *args, const char *cfgfile, | |||
631 | if (GNUNET_OK != | 632 | if (GNUNET_OK != |
632 | GNUNET_NETWORK_socket_bind (listen_socket6, | 633 | GNUNET_NETWORK_socket_bind (listen_socket6, |
633 | (struct sockaddr *) &v6, | 634 | (struct sockaddr *) &v6, |
634 | sizeof (v6))) | 635 | sizeof (v6), |
636 | 0)) | ||
635 | { | 637 | { |
636 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); | 638 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); |
637 | GNUNET_NETWORK_socket_close (listen_socket6); | 639 | GNUNET_NETWORK_socket_close (listen_socket6); |
diff --git a/src/gns/gnunet-gns-proxy.c b/src/gns/gnunet-gns-proxy.c index 0135fea34..106089ddb 100644 --- a/src/gns/gnunet-gns-proxy.c +++ b/src/gns/gnunet-gns-proxy.c | |||
@@ -3378,7 +3378,7 @@ run (void *cls, char *const *args, const char *cfgfile, | |||
3378 | if ((NULL == lsock) || | 3378 | if ((NULL == lsock) || |
3379 | (GNUNET_OK != | 3379 | (GNUNET_OK != |
3380 | GNUNET_NETWORK_socket_bind (lsock, (const struct sockaddr *) &sa, | 3380 | GNUNET_NETWORK_socket_bind (lsock, (const struct sockaddr *) &sa, |
3381 | sizeof (sa)))) | 3381 | sizeof (sa), 0))) |
3382 | { | 3382 | { |
3383 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 3383 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
3384 | "Failed to create listen socket bound to `%s'", | 3384 | "Failed to create listen socket bound to `%s'", |
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index f20cd24c9..f3040749a 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c | |||
@@ -1748,7 +1748,8 @@ resolve_record_dns (struct ResolverHandle *rh, | |||
1748 | sa->sa_family = AF_INET; | 1748 | sa->sa_family = AF_INET; |
1749 | if (GNUNET_OK != GNUNET_NETWORK_socket_bind (rh->dns_sock, | 1749 | if (GNUNET_OK != GNUNET_NETWORK_socket_bind (rh->dns_sock, |
1750 | sa, | 1750 | sa, |
1751 | sizeof (struct sockaddr_in))) | 1751 | sizeof (struct sockaddr_in), |
1752 | 0)) | ||
1752 | { | 1753 | { |
1753 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1754 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1754 | "GNS_PHASE_REC_DNS-%llu: Error binding UDP socket for DNS lookup!\n", | 1755 | "GNS_PHASE_REC_DNS-%llu: Error binding UDP socket for DNS lookup!\n", |
diff --git a/src/include/gnunet_network_lib.h b/src/include/gnunet_network_lib.h index 1ff397e86..1627058c5 100644 --- a/src/include/gnunet_network_lib.h +++ b/src/include/gnunet_network_lib.h | |||
@@ -133,17 +133,25 @@ GNUNET_NETWORK_socket_set_blocking (struct GNUNET_NETWORK_Handle *fd, | |||
133 | 133 | ||
134 | 134 | ||
135 | /** | 135 | /** |
136 | * Fail to bind if an address is already in use. | ||
137 | */ | ||
138 | #define GNUNET_BIND_EXCLUSIVE 0x01 | ||
139 | |||
140 | |||
141 | /** | ||
136 | * Bind to a connected socket | 142 | * Bind to a connected socket |
137 | * | 143 | * |
138 | * @param desc socket to bind | 144 | * @param desc socket to bind |
139 | * @param address address to be bound | 145 | * @param address address to be bound |
140 | * @param address_len length of address | 146 | * @param address_len length of address |
147 | * @param flags flags affecting bind behaviour | ||
141 | * @return GNUNET_OK on success, GNUNET_SYSERR otherwise | 148 | * @return GNUNET_OK on success, GNUNET_SYSERR otherwise |
142 | */ | 149 | */ |
143 | int | 150 | int |
144 | GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, | 151 | GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, |
145 | const struct sockaddr *address, | 152 | const struct sockaddr *address, |
146 | socklen_t address_len); | 153 | socklen_t address_len, |
154 | int flags); | ||
147 | 155 | ||
148 | /** | 156 | /** |
149 | * Close a socket. | 157 | * Close a socket. |
diff --git a/src/nat/nat_test.c b/src/nat/nat_test.c index 387a68d8f..0c1d59a87 100644 --- a/src/nat/nat_test.c +++ b/src/nat/nat_test.c | |||
@@ -404,7 +404,7 @@ GNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
404 | if ((ret->lsock == NULL) || | 404 | if ((ret->lsock == NULL) || |
405 | (GNUNET_OK != | 405 | (GNUNET_OK != |
406 | GNUNET_NETWORK_socket_bind (ret->lsock, (const struct sockaddr *) &sa, | 406 | GNUNET_NETWORK_socket_bind (ret->lsock, (const struct sockaddr *) &sa, |
407 | sizeof (sa)))) | 407 | sizeof (sa), 0))) |
408 | { | 408 | { |
409 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 409 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
410 | _ | 410 | _ |
diff --git a/src/testing/testing.c b/src/testing/testing.c index f268c38d1..d73d5ece3 100644 --- a/src/testing/testing.c +++ b/src/testing/testing.c | |||
@@ -635,7 +635,8 @@ GNUNET_TESTING_reserve_port (struct GNUNET_TESTING_System *system, | |||
635 | continue; | 635 | continue; |
636 | bind_status = GNUNET_NETWORK_socket_bind (socket, | 636 | bind_status = GNUNET_NETWORK_socket_bind (socket, |
637 | ai->ai_addr, | 637 | ai->ai_addr, |
638 | ai->ai_addrlen); | 638 | ai->ai_addrlen, |
639 | 0); | ||
639 | GNUNET_NETWORK_socket_close (socket); | 640 | GNUNET_NETWORK_socket_close (socket); |
640 | if (GNUNET_OK != bind_status) | 641 | if (GNUNET_OK != bind_status) |
641 | break; | 642 | break; |
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c index c1511889b..fa90d16c1 100644 --- a/src/transport/plugin_transport_udp.c +++ b/src/transport/plugin_transport_udp.c | |||
@@ -2545,7 +2545,7 @@ setup_sockets (struct Plugin *plugin, | |||
2545 | GNUNET_a2s (serverAddr, addrlen)); | 2545 | GNUNET_a2s (serverAddr, addrlen)); |
2546 | /* binding */ | 2546 | /* binding */ |
2547 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv6, | 2547 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv6, |
2548 | serverAddr, addrlen)) | 2548 | serverAddr, addrlen, 0)) |
2549 | break; | 2549 | break; |
2550 | eno = errno; | 2550 | eno = errno; |
2551 | if (0 != plugin->port) | 2551 | if (0 != plugin->port) |
@@ -2622,7 +2622,7 @@ setup_sockets (struct Plugin *plugin, | |||
2622 | 2622 | ||
2623 | /* binding */ | 2623 | /* binding */ |
2624 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv4, | 2624 | if (GNUNET_OK == GNUNET_NETWORK_socket_bind (plugin->sockv4, |
2625 | serverAddr, addrlen)) | 2625 | serverAddr, addrlen, 0)) |
2626 | break; | 2626 | break; |
2627 | eno = errno; | 2627 | eno = errno; |
2628 | if (0 != plugin->port) | 2628 | if (0 != plugin->port) |
diff --git a/src/transport/plugin_transport_unix.c b/src/transport/plugin_transport_unix.c index 81aa9cb94..064a91663 100644 --- a/src/transport/plugin_transport_unix.c +++ b/src/transport/plugin_transport_unix.c | |||
@@ -1150,7 +1150,7 @@ unix_transport_server_start (void *cls) | |||
1150 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); | 1150 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); |
1151 | return GNUNET_SYSERR; | 1151 | return GNUNET_SYSERR; |
1152 | } | 1152 | } |
1153 | if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, serverAddr, addrlen) | 1153 | if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, serverAddr, addrlen, 0) |
1154 | != GNUNET_OK) | 1154 | != GNUNET_OK) |
1155 | { | 1155 | { |
1156 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); | 1156 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); |
diff --git a/src/util/client.c b/src/util/client.c index 73b912cc6..b1ceede87 100644 --- a/src/util/client.c +++ b/src/util/client.c | |||
@@ -863,7 +863,7 @@ GNUNET_CLIENT_service_test (const char *service, | |||
863 | #endif | 863 | #endif |
864 | if (GNUNET_OK != | 864 | if (GNUNET_OK != |
865 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) &s_un, | 865 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) &s_un, |
866 | slen)) | 866 | slen, GNUNET_BIND_EXCLUSIVE)) |
867 | { | 867 | { |
868 | /* failed to bind => service must be running */ | 868 | /* failed to bind => service must be running */ |
869 | GNUNET_free (unixpath); | 869 | GNUNET_free (unixpath); |
@@ -913,7 +913,7 @@ GNUNET_CLIENT_service_test (const char *service, | |||
913 | { | 913 | { |
914 | if (GNUNET_OK != | 914 | if (GNUNET_OK != |
915 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) &s_in, | 915 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) &s_in, |
916 | sizeof (s_in))) | 916 | sizeof (s_in), GNUNET_BIND_EXCLUSIVE)) |
917 | { | 917 | { |
918 | /* failed to bind => service must be running */ | 918 | /* failed to bind => service must be running */ |
919 | GNUNET_free (hostname); | 919 | GNUNET_free (hostname); |
@@ -946,7 +946,7 @@ GNUNET_CLIENT_service_test (const char *service, | |||
946 | { | 946 | { |
947 | if (GNUNET_OK != | 947 | if (GNUNET_OK != |
948 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) &s_in6, | 948 | GNUNET_NETWORK_socket_bind (sock, (const struct sockaddr *) &s_in6, |
949 | sizeof (s_in6))) | 949 | sizeof (s_in6), GNUNET_BIND_EXCLUSIVE)) |
950 | { | 950 | { |
951 | /* failed to bind => service must be running */ | 951 | /* failed to bind => service must be running */ |
952 | GNUNET_free (hostname); | 952 | GNUNET_free (hostname); |
diff --git a/src/util/network.c b/src/util/network.c index 659b89c0c..ff0d0d03c 100644 --- a/src/util/network.c +++ b/src/util/network.c | |||
@@ -372,7 +372,8 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc, | |||
372 | int | 372 | int |
373 | GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, | 373 | GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, |
374 | const struct sockaddr *address, | 374 | const struct sockaddr *address, |
375 | socklen_t address_len) | 375 | socklen_t address_len, |
376 | int flags) | ||
376 | { | 377 | { |
377 | int ret; | 378 | int ret; |
378 | 379 | ||
@@ -392,7 +393,7 @@ GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, | |||
392 | #endif | 393 | #endif |
393 | #ifndef LINUX | 394 | #ifndef LINUX |
394 | #ifndef MINGW | 395 | #ifndef MINGW |
395 | if (address->sa_family == AF_UNIX) | 396 | if (address->sa_family == AF_UNIX && (flags & GNUNET_BIND_EXCLUSIVE) == 0) |
396 | { | 397 | { |
397 | const struct sockaddr_un *un = (const struct sockaddr_un *) address; | 398 | const struct sockaddr_un *un = (const struct sockaddr_un *) address; |
398 | 399 | ||
diff --git a/src/util/server.c b/src/util/server.c index 2c3533d6f..f62bf8539 100644 --- a/src/util/server.c +++ b/src/util/server.c | |||
@@ -422,7 +422,7 @@ open_listen_socket (const struct sockaddr *serverAddr, socklen_t socklen) | |||
422 | return NULL; | 422 | return NULL; |
423 | } | 423 | } |
424 | /* bind the socket */ | 424 | /* bind the socket */ |
425 | if (GNUNET_OK != GNUNET_NETWORK_socket_bind (sock, serverAddr, socklen)) | 425 | if (GNUNET_OK != GNUNET_NETWORK_socket_bind (sock, serverAddr, socklen, 0)) |
426 | { | 426 | { |
427 | eno = errno; | 427 | eno = errno; |
428 | if (EADDRINUSE != errno) | 428 | if (EADDRINUSE != errno) |
diff --git a/src/util/test_connection.c b/src/util/test_connection.c index e129c80ea..1ba20498f 100644 --- a/src/util/test_connection.c +++ b/src/util/test_connection.c | |||
@@ -67,7 +67,7 @@ open_listen_socket () | |||
67 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); | 67 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); |
68 | GNUNET_assert (GNUNET_NETWORK_socket_bind | 68 | GNUNET_assert (GNUNET_NETWORK_socket_bind |
69 | (desc, (const struct sockaddr *) &sa, | 69 | (desc, (const struct sockaddr *) &sa, |
70 | sizeof (sa)) == GNUNET_OK); | 70 | sizeof (sa), 0) == GNUNET_OK); |
71 | GNUNET_NETWORK_socket_listen (desc, 5); | 71 | GNUNET_NETWORK_socket_listen (desc, 5); |
72 | return desc; | 72 | return desc; |
73 | } | 73 | } |
diff --git a/src/util/test_connection_addressing.c b/src/util/test_connection_addressing.c index e5c8edeeb..eeb610dd1 100644 --- a/src/util/test_connection_addressing.c +++ b/src/util/test_connection_addressing.c | |||
@@ -68,7 +68,7 @@ open_listen_socket () | |||
68 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); | 68 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); |
69 | if (GNUNET_OK != | 69 | if (GNUNET_OK != |
70 | GNUNET_NETWORK_socket_bind (desc, (const struct sockaddr *) &sa, | 70 | GNUNET_NETWORK_socket_bind (desc, (const struct sockaddr *) &sa, |
71 | sizeof (sa))) | 71 | sizeof (sa), 0)) |
72 | { | 72 | { |
73 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, | 73 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, |
74 | "bind"); | 74 | "bind"); |
diff --git a/src/util/test_connection_receive_cancel.c b/src/util/test_connection_receive_cancel.c index 90490343c..99905e232 100644 --- a/src/util/test_connection_receive_cancel.c +++ b/src/util/test_connection_receive_cancel.c | |||
@@ -66,7 +66,7 @@ open_listen_socket () | |||
66 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); | 66 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); |
67 | GNUNET_assert (GNUNET_NETWORK_socket_bind | 67 | GNUNET_assert (GNUNET_NETWORK_socket_bind |
68 | (desc, (const struct sockaddr *) &sa, | 68 | (desc, (const struct sockaddr *) &sa, |
69 | sizeof (sa)) == GNUNET_OK); | 69 | sizeof (sa), 0) == GNUNET_OK); |
70 | GNUNET_NETWORK_socket_listen (desc, 5); | 70 | GNUNET_NETWORK_socket_listen (desc, 5); |
71 | return desc; | 71 | return desc; |
72 | } | 72 | } |
diff --git a/src/util/test_connection_timeout.c b/src/util/test_connection_timeout.c index 8d3f775b5..6608e18db 100644 --- a/src/util/test_connection_timeout.c +++ b/src/util/test_connection_timeout.c | |||
@@ -63,7 +63,7 @@ open_listen_socket () | |||
63 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); | 63 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "setsockopt"); |
64 | GNUNET_assert (GNUNET_NETWORK_socket_bind | 64 | GNUNET_assert (GNUNET_NETWORK_socket_bind |
65 | (desc, (const struct sockaddr *) &sa, | 65 | (desc, (const struct sockaddr *) &sa, |
66 | sizeof (sa)) == GNUNET_OK); | 66 | sizeof (sa), 0) == GNUNET_OK); |
67 | GNUNET_NETWORK_socket_listen (desc, 5); | 67 | GNUNET_NETWORK_socket_listen (desc, 5); |
68 | return desc; | 68 | return desc; |
69 | } | 69 | } |