-static bool bind_to_interface(int sd) {
- char *iface;
-
-#if defined(SOL_SOCKET) && defined(SO_BINDTODEVICE)
- struct ifreq ifr;
- int status;
-#endif /* defined(SOL_SOCKET) && defined(SO_BINDTODEVICE) */
-
- if(!get_config_string (lookup_config (config_tree, "BindToInterface"), &iface))
- return true;
-
-#if defined(SOL_SOCKET) && defined(SO_BINDTODEVICE)
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_ifrn.ifrn_name, iface, IFNAMSIZ);
- ifr.ifr_ifrn.ifrn_name[IFNAMSIZ - 1] = 0;
-
- status = setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
- if(status) {
- logger(DEBUG_ALWAYS, LOG_ERR, "Can't bind to interface %s: %s", iface,
- strerror(errno));
- return false;
- }
-#else /* if !defined(SOL_SOCKET) || !defined(SO_BINDTODEVICE) */
- logger(DEBUG_ALWAYS, LOG_WARNING, "%s not supported on this platform", "BindToInterface");
-#endif
-
- 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;
- int option;
- char *iface;
-
- nfd = socket(sa->sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
-
- if(nfd < 0) {
- logger(DEBUG_STATUS, LOG_ERR, "Creating metasocket failed: %s", sockstrerror(sockerrno));
- return -1;
- }
-