Bind outgoing sockets again.

Commit cff5a84 removed the feature of binding outgoing TCP sockets to a local
address. We now call bind() again, but only if there is exactly one listening
socket with the same address family as the destination address of the outgoing
socket.
This commit is contained in:
Guus Sliepen 2013-08-18 23:55:40 +02:00
parent 0c54f36553
commit 65f5e8fba4

View file

@ -113,6 +113,34 @@ static bool bind_to_interface(int sd) {
return true; return true;
} }
static bool bind_to_address(connection_t *c) {
int s = -1;
for(int i = 0; i < listen_sockets; i++) {
if(listen_socket[i].sa.sa.sa_family != c->address.sa.sa_family)
continue;
if(s >= 0)
return false;
s = i;
}
if(s < 0)
return false;
sockaddr_t sa = listen_socket[s].sa;
if(sa.sa.sa_family == AF_INET)
sa.in.sin_port = 0;
else if(sa.sa.sa_family == AF_INET6)
sa.in6.sin6_port = 0;
if(bind(c->socket, &sa.sa, SALEN(sa.sa))) {
logger(DEBUG_CONNECTIONS, LOG_WARNING, "Can't bind outgoing socket: %s", strerror(errno));
return false;
}
return true;
}
int setup_listen_socket(const sockaddr_t *sa) { int setup_listen_socket(const sockaddr_t *sa) {
int nfd; int nfd;
char *addrstr; char *addrstr;
@ -481,6 +509,7 @@ begin:
#endif #endif
bind_to_interface(c->socket); bind_to_interface(c->socket);
bind_to_address(c);
} }
/* Connect */ /* Connect */