aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arm/gnunet-service-arm.c2
-rw-r--r--src/dns/dnsstub.c3
-rw-r--r--src/gns/gnunet-dns2gns.c6
-rw-r--r--src/gns/gnunet-gns-proxy.c2
-rw-r--r--src/gns/gnunet-service-gns_resolver.c3
-rw-r--r--src/include/gnunet_network_lib.h10
-rw-r--r--src/nat/nat_test.c2
-rw-r--r--src/testing/testing.c3
-rw-r--r--src/transport/plugin_transport_udp.c4
-rw-r--r--src/transport/plugin_transport_unix.c2
-rw-r--r--src/util/client.c6
-rw-r--r--src/util/network.c5
-rw-r--r--src/util/server.c2
-rw-r--r--src/util/test_connection.c2
-rw-r--r--src/util/test_connection_addressing.c2
-rw-r--r--src/util/test_connection_receive_cancel.c2
-rw-r--r--src/util/test_connection_timeout.c2
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 */
143int 150int
144GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, 151GNUNET_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,
372int 372int
373GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, 373GNUNET_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}