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 nfd;
char *addrstr;
#endif
bind_to_interface(c->socket);
+ bind_to_address(c);
}
/* Connect */