>From bfebe7fc838f83065fea04cf27613fe89e962a3a Mon Sep 17 00:00:00 2001 From: Bignaux Ronan Date: Thu, 20 Sep 2012 15:09:31 +0200 Subject: [PATCH] add option to bind to a specific interface Signed-off-by: Bignaux Ronan --- daemon.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/daemon.c b/daemon.c index 4602b46..755fbd3 100644 --- a/daemon.c +++ b/daemon.c @@ -5,6 +5,10 @@ #include "strbuf.h" #include "string-list.h" +#ifdef SO_BINDTODEVICE +#include +#endif + #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 256 #endif @@ -31,7 +35,7 @@ static const char daemon_usage[] = " [--reuseaddr] [--pid-file=]\n" " [--(enable|disable|allow-override|forbid-override)=]\n" " [--access-hook=]\n" -" [--inetd | [--listen=] [--port=]\n" +" [--inetd | [--listen=] [--port=] [--bindtodev=]\n" " [--detach] [--user= [--group=]]\n" " [...]"; @@ -64,6 +68,7 @@ static char *hostname; static char *canon_hostname; static char *ip_address; static char *tcp_port; +static struct ifreq ifr; static void logreport(int priority, const char *err, va_list params) { @@ -875,6 +880,15 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis continue; } + if (ifr.ifr_name) { + if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, (void *) &ifr, + sizeof(ifr)) < 0) { + logerror("Could not set SO_BINDTODEVICE: %s", strerror(errno)); + close(sockfd); + continue; + } + } + #ifdef IPV6_V6ONLY if (ai->ai_family == AF_INET6) { int on = 1; @@ -1194,6 +1208,11 @@ int main(int argc, char **argv) continue; } } + if (!prefixcmp(arg, "--bindtodev=")) { + memset(&ifr, 0, sizeof(ifr)); + strncpy (ifr.ifr_name, arg + 12 ,IFNAMSIZ); + continue; + } if (!strcmp(arg, "--serve")) { serve_mode = 1; continue; -- 1.7.12