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:
parent
0c54f36553
commit
65f5e8fba4
1 changed files with 29 additions and 0 deletions
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue