diff --git a/src/dnsmasq.c b/src/dnsmasq.c index 878167c..6e44c12 100644 --- a/src/dnsmasq.c +++ b/src/dnsmasq.c @@ -58,6 +58,7 @@ int main (int argc, char **argv) char *bound_device = NULL; int did_bind = 0; struct server *serv; + char *netlink_warn; #endif #if defined(HAVE_DHCP) || defined(HAVE_DHCP6) struct dhcp_context *context; @@ -327,7 +328,7 @@ int main (int argc, char **argv) #endif #if defined(HAVE_LINUX_NETWORK) - netlink_init(); + netlink_warn = netlink_init(); #elif defined(HAVE_BSD_NETWORK) route_init(); #endif @@ -946,6 +947,9 @@ int main (int argc, char **argv) # ifdef HAVE_LINUX_NETWORK if (did_bind) my_syslog(MS_DHCP | LOG_INFO, _("DHCP, sockets bound exclusively to interface %s"), bound_device); + + if (netlink_warn) + my_syslog(LOG_WARNING, netlink_warn); # endif /* after dhcp_construct_contexts */ diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 68e6287..b877fbb 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -1450,7 +1450,7 @@ void clear_cache_and_reload(time_t now); /* netlink.c */ #ifdef HAVE_LINUX_NETWORK -void netlink_init(void); +char *netlink_init(void); void netlink_multicast(void); #endif diff --git a/src/netlink.c b/src/netlink.c index 3af54c4..8e8431f 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -49,7 +49,7 @@ static u32 netlink_pid; static void nl_async(struct nlmsghdr *h); -void netlink_init(void) +char *netlink_init(void) { struct sockaddr_nl addr; socklen_t slen = sizeof(addr); @@ -82,16 +82,21 @@ void netlink_init(void) } if (daemon->netlinkfd == -1 || - (daemon->kernel_version >= KERNEL_VERSION(2,6,30) && - setsockopt(daemon->netlinkfd, SOL_NETLINK, NETLINK_NO_ENOBUFS, &opt, sizeof(opt)) == -1) || getsockname(daemon->netlinkfd, (struct sockaddr *)&addr, &slen) == -1) die(_("cannot create netlink socket: %s"), NULL, EC_MISC); + /* save pid assigned by bind() and retrieved by getsockname() */ netlink_pid = addr.nl_pid; iov.iov_len = 100; iov.iov_base = safe_malloc(iov.iov_len); + + if (daemon->kernel_version >= KERNEL_VERSION(2,6,30) && + setsockopt(daemon->netlinkfd, SOL_NETLINK, NETLINK_NO_ENOBUFS, &opt, sizeof(opt)) == -1) + return _("warning: failed to set NETLINK_NO_ENOBUFS on netlink socket"); + + return NULL; } static ssize_t netlink_recv(void)