+static void configure_tcp(connection_t *c) {
+ int option;
+
+#ifdef O_NONBLOCK
+ int flags = fcntl(c->socket, F_GETFL);
+
+ if(fcntl(c->socket, F_SETFL, flags | O_NONBLOCK) < 0) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "fcntl for %s: %s", c->hostname, strerror(errno));
+ }
+#elif defined(WIN32)
+ unsigned long arg = 1;
+
+ if(ioctlsocket(c->socket, FIONBIO, &arg) != 0) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "ioctlsocket for %s: %d", c->hostname, sockstrerror(sockerrno));
+ }
+#endif
+
+#if defined(SOL_TCP) && defined(TCP_NODELAY)
+ option = 1;
+ setsockopt(c->socket, SOL_TCP, TCP_NODELAY, (void *)&option, sizeof option);
+#endif
+
+#if defined(SOL_IP) && defined(IP_TOS) && defined(IPTOS_LOWDELAY)
+ option = IPTOS_LOWDELAY;
+ setsockopt(c->socket, SOL_IP, IP_TOS, (void *)&option, sizeof option);
+#endif
+}
+
+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;
+}
+
+int setup_listen_socket(const sockaddr_t *sa) {