]>
git.ipfire.org Git - people/ms/dnsmasq.git/blob - src/network.c
1 /* dnsmasq is Copyright (c) 2000 - 2006 Simon Kelley
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; version 2 dated June, 1991.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
15 int iface_check(struct daemon
*daemon
, int family
, struct all_addr
*addr
, char *name
)
19 for (tmp
= daemon
->if_except
; tmp
; tmp
= tmp
->next
)
20 if (tmp
->name
&& (strcmp(tmp
->name
, name
) == 0))
23 if (daemon
->if_names
|| daemon
->if_addrs
)
25 for (tmp
= daemon
->if_names
; tmp
; tmp
= tmp
->next
)
26 if (tmp
->name
&& (strcmp(tmp
->name
, name
) == 0))
32 for (tmp
= daemon
->if_addrs
; tmp
; tmp
= tmp
->next
)
33 if (tmp
->addr
.sa
.sa_family
== family
)
35 if (family
== AF_INET
&&
36 tmp
->addr
.in
.sin_addr
.s_addr
== addr
->addr
.addr4
.s_addr
)
42 else if (family
== AF_INET6
&&
43 IN6_ARE_ADDR_EQUAL(&tmp
->addr
.in6
.sin6_addr
,
57 static int iface_allowed(struct daemon
*daemon
, struct irec
**irecp
, int if_index
,
58 union mysockaddr
*addr
, struct in_addr netmask
)
64 /* check whether the interface IP has been added already
65 we call this routine multiple times. */
66 for (iface
= *irecp
; iface
; iface
= iface
->next
)
67 if (sockaddr_isequal(&iface
->addr
, addr
))
70 #ifdef HAVE_LINUX_NETWORK
71 ifr
.ifr_ifindex
= if_index
;
74 if ((fd
= socket(PF_INET
, SOCK_DGRAM
, 0)) == -1 ||
75 #ifdef HAVE_LINUX_NETWORK
76 ioctl(fd
, SIOCGIFNAME
, &ifr
) == -1 ||
78 !if_indextoname(if_index
, ifr
.ifr_name
) ||
80 ioctl(fd
, SIOCGIFFLAGS
, &ifr
) == -1)
93 /* If we are restricting the set of interfaces to use, make
94 sure that loopback interfaces are in that set. */
95 if (daemon
->if_names
&& (ifr
.ifr_flags
& IFF_LOOPBACK
))
98 for (lo
= daemon
->if_names
; lo
; lo
= lo
->next
)
99 if (lo
->name
&& strcmp(lo
->name
, ifr
.ifr_name
) == 0)
105 if (!lo
&& (lo
= malloc(sizeof(struct iname
))))
107 lo
->name
= safe_malloc(strlen(ifr
.ifr_name
)+1);
108 strcpy(lo
->name
, ifr
.ifr_name
);
109 lo
->isloop
= lo
->used
= 1;
110 lo
->next
= daemon
->if_names
;
111 daemon
->if_names
= lo
;
115 if (addr
->sa
.sa_family
== AF_INET
&&
116 !iface_check(daemon
, AF_INET
, (struct all_addr
*)&addr
->in
.sin_addr
, ifr
.ifr_name
))
120 if (addr
->sa
.sa_family
== AF_INET6
&&
121 !iface_check(daemon
, AF_INET6
, (struct all_addr
*)&addr
->in6
.sin6_addr
, ifr
.ifr_name
))
126 if ((iface
= malloc(sizeof(struct irec
))))
129 iface
->netmask
= netmask
;
130 iface
->next
= *irecp
;
140 static int iface_allowed_v6(struct daemon
*daemon
, struct in6_addr
*local
,
141 int scope
, int if_index
, void *vparam
)
143 union mysockaddr addr
;
144 struct in_addr netmask
; /* dummy */
148 #ifdef HAVE_SOCKADDR_SA_LEN
149 addr
.in6
.sin6_len
= sizeof(addr
.in6
);
151 addr
.in6
.sin6_family
= AF_INET6
;
152 addr
.in6
.sin6_addr
= *local
;
153 addr
.in6
.sin6_port
= htons(daemon
->port
);
154 addr
.in6
.sin6_scope_id
= scope
;
155 addr
.in6
.sin6_flowinfo
= 0;
157 return iface_allowed(daemon
, (struct irec
**)vparam
, if_index
, &addr
, netmask
);
161 static int iface_allowed_v4(struct daemon
*daemon
, struct in_addr local
, int if_index
,
162 struct in_addr netmask
, struct in_addr broadcast
, void *vparam
)
164 union mysockaddr addr
;
166 #ifdef HAVE_SOCKADDR_SA_LEN
167 addr
.in
.sin_len
= sizeof(addr
.in
);
169 addr
.in
.sin_family
= AF_INET
;
170 addr
.in
.sin_addr
= broadcast
; /* warning */
171 addr
.in
.sin_addr
= local
;
172 addr
.in
.sin_port
= htons(daemon
->port
);
174 return iface_allowed(daemon
, (struct irec
**)vparam
, if_index
, &addr
, netmask
);
178 int enumerate_interfaces(struct daemon
*daemon
)
181 return iface_enumerate(daemon
, &daemon
->interfaces
, iface_allowed_v4
, iface_allowed_v6
);
183 return iface_enumerate(daemon
, &daemon
->interfaces
, iface_allowed_v4
, NULL
);
187 #if defined(HAVE_IPV6) && \
188 (defined(HAVE_LINUX_NETWORK) || \
189 (defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
190 static int create_ipv6_listener(struct listener
**link
, int port
)
192 union mysockaddr addr
;
193 int tcpfd
, fd
, flags
, save
;
197 addr
.in6
.sin6_family
= AF_INET6
;
198 addr
.in6
.sin6_addr
= in6addr_any
;
199 addr
.in6
.sin6_port
= htons(port
);
200 addr
.in6
.sin6_flowinfo
= 0;
201 addr
.in6
.sin6_scope_id
= 0;
202 #ifdef HAVE_SOCKADDR_SA_LEN
203 addr
.in6
.sin6_len
= sizeof(addr
.in6
);
206 /* No error of the kernel doesn't support IPv6 */
207 if ((fd
= socket(AF_INET6
, SOCK_DGRAM
, 0)) == -1)
208 return (errno
== EPROTONOSUPPORT
||
209 errno
== EAFNOSUPPORT
||
212 if ((tcpfd
= socket(AF_INET6
, SOCK_STREAM
, 0)) == -1)
220 if (setsockopt(fd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
)) == -1 ||
221 setsockopt(tcpfd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
)) == -1 ||
222 setsockopt(fd
, IPV6_LEVEL
, IPV6_V6ONLY
, &opt
, sizeof(opt
)) == -1 ||
223 setsockopt(tcpfd
, IPV6_LEVEL
, IPV6_V6ONLY
, &opt
, sizeof(opt
)) == -1 ||
224 (flags
= fcntl(fd
, F_GETFL
, 0)) == -1 ||
225 fcntl(fd
, F_SETFL
, flags
| O_NONBLOCK
) == -1 ||
226 (flags
= fcntl(tcpfd
, F_GETFL
, 0)) == -1 ||
227 fcntl(tcpfd
, F_SETFL
, flags
| O_NONBLOCK
) == -1 ||
228 #ifdef IPV6_RECVPKTINFO
229 setsockopt(fd
, IPV6_LEVEL
, IPV6_RECVPKTINFO
, &opt
, sizeof(opt
)) == -1 ||
231 setsockopt(fd
, IPV6_LEVEL
, IPV6_PKTINFO
, &opt
, sizeof(opt
)) == -1 ||
233 bind(tcpfd
, (struct sockaddr
*)&addr
, sa_len(&addr
)) == -1 ||
234 listen(tcpfd
, 5) == -1 ||
235 bind(fd
, (struct sockaddr
*)&addr
, sa_len(&addr
)) == -1)
244 l
= safe_malloc(sizeof(struct listener
));
247 l
->family
= AF_INET6
;
255 struct listener
*create_wildcard_listeners(int port
)
257 #if !(defined(HAVE_LINUX_NETWORK) || (defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
258 port
= 0; /* eliminate warning */
261 union mysockaddr addr
;
263 struct listener
*l
, *l6
= NULL
;
267 addr
.in
.sin_family
= AF_INET
;
268 addr
.in
.sin_addr
.s_addr
= INADDR_ANY
;
269 addr
.in
.sin_port
= htons(port
);
270 #ifdef HAVE_SOCKADDR_SA_LEN
271 addr
.in
.sin_len
= sizeof(struct sockaddr_in
);
274 if ((fd
= socket(AF_INET
, SOCK_DGRAM
, 0)) == -1)
277 if ((tcpfd
= socket(AF_INET
, SOCK_STREAM
, 0)) == -1)
283 if (setsockopt(tcpfd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
)) == -1 ||
284 bind(tcpfd
, (struct sockaddr
*)&addr
, sa_len(&addr
)) == -1 ||
285 listen(tcpfd
, 5) == -1 ||
286 (flags
= fcntl(tcpfd
, F_GETFL
, 0)) == -1 ||
287 fcntl(tcpfd
, F_SETFL
, flags
| O_NONBLOCK
) == -1 ||
289 !create_ipv6_listener(&l6
, port
) ||
291 setsockopt(fd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
)) == -1 ||
292 (flags
= fcntl(fd
, F_GETFL
, 0)) == -1 ||
293 fcntl(fd
, F_SETFL
, flags
| O_NONBLOCK
) == -1 ||
294 #if defined(HAVE_LINUX_NETWORK)
295 setsockopt(fd
, SOL_IP
, IP_PKTINFO
, &opt
, sizeof(opt
)) == -1 ||
296 #elif defined(IP_RECVDSTADDR) && defined(IP_RECVIF)
297 setsockopt(fd
, IPPROTO_IP
, IP_RECVDSTADDR
, &opt
, sizeof(opt
)) == -1 ||
298 setsockopt(fd
, IPPROTO_IP
, IP_RECVIF
, &opt
, sizeof(opt
)) == -1 ||
300 bind(fd
, (struct sockaddr
*)&addr
, sa_len(&addr
)) == -1)
307 l
= safe_malloc(sizeof(struct listener
));
318 struct listener
*create_bound_listeners(struct daemon
*daemon
)
321 struct listener
*listeners
= NULL
;
325 for (iface
= daemon
->interfaces
; iface
; iface
= iface
->next
)
327 struct listener
*new = safe_malloc(sizeof(struct listener
));
328 new->family
= iface
->addr
.sa
.sa_family
;
330 new->next
= listeners
;
331 if ((new->tcpfd
= socket(iface
->addr
.sa
.sa_family
, SOCK_STREAM
, 0)) == -1 ||
332 (new->fd
= socket(iface
->addr
.sa
.sa_family
, SOCK_DGRAM
, 0)) == -1 ||
333 setsockopt(new->fd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
)) == -1 ||
334 setsockopt(new->tcpfd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
)) == -1 ||
335 /* See Stevens 16.6 */
336 (flags
= fcntl(new->tcpfd
, F_GETFL
, 0)) == -1 ||
337 fcntl(new->tcpfd
, F_SETFL
, flags
| O_NONBLOCK
) == -1 ||
338 (flags
= fcntl(new->fd
, F_GETFL
, 0)) == -1 ||
339 fcntl(new->fd
, F_SETFL
, flags
| O_NONBLOCK
) == -1)
340 die(_("failed to create listening socket: %s"), NULL
);
343 if (iface
->addr
.sa
.sa_family
== AF_INET6
)
345 if (setsockopt(new->fd
, IPV6_LEVEL
, IPV6_V6ONLY
, &opt
, sizeof(opt
)) == -1 ||
346 setsockopt(new->tcpfd
, IPV6_LEVEL
, IPV6_V6ONLY
, &opt
, sizeof(opt
)) == -1)
347 die(_("failed to set IPV6 options on listening socket: %s"), NULL
);
351 if (bind(new->tcpfd
, &iface
->addr
.sa
, sa_len(&iface
->addr
)) == -1 ||
352 bind(new->fd
, &iface
->addr
.sa
, sa_len(&iface
->addr
)) == -1)
355 if (iface
->addr
.sa
.sa_family
== AF_INET6
&& errno
== ENODEV
)
364 prettyprint_addr(&iface
->addr
, daemon
->namebuff
);
365 die(_("failed to bind listening socket for %s: %s"),
372 if (listen(new->tcpfd
, 5) == -1)
373 die(_("failed to listen on socket: %s"), NULL
);
380 struct serverfd
*allocate_sfd(union mysockaddr
*addr
, struct serverfd
**sfds
)
382 struct serverfd
*sfd
;
385 /* may have a suitable one already */
386 for (sfd
= *sfds
; sfd
; sfd
= sfd
->next
)
387 if (sockaddr_isequal(&sfd
->source_addr
, addr
))
390 /* need to make a new one. */
391 errno
= ENOMEM
; /* in case malloc fails. */
392 if (!(sfd
= malloc(sizeof(struct serverfd
))))
395 if ((sfd
->fd
= socket(addr
->sa
.sa_family
, SOCK_DGRAM
, 0)) == -1)
401 if (bind(sfd
->fd
, (struct sockaddr
*)addr
, sa_len(addr
)) == -1 ||
402 (flags
= fcntl(sfd
->fd
, F_GETFL
, 0)) == -1 ||
403 fcntl(sfd
->fd
, F_SETFL
, flags
| O_NONBLOCK
) == -1)
405 int errsave
= errno
; /* save error from bind. */
412 sfd
->source_addr
= *addr
;
419 void check_servers(struct daemon
*daemon
)
422 struct server
*new, *tmp
, *ret
= NULL
;
425 /* forward table rules reference servers, so have to blow them away */
428 daemon
->last_server
= daemon
->srv_save
= NULL
;
430 for (new = daemon
->servers
; new; new = tmp
)
434 if (!(new->flags
& (SERV_LITERAL_ADDRESS
| SERV_NO_ADDR
)))
436 port
= prettyprint_addr(&new->addr
, daemon
->namebuff
);
438 for (iface
= daemon
->interfaces
; iface
; iface
= iface
->next
)
439 if (sockaddr_isequal(&new->addr
, &iface
->addr
))
443 syslog(LOG_WARNING
, _("ignoring nameserver %s - local interface"), daemon
->namebuff
);
448 /* Do we need a socket set? */
449 if (!new->sfd
&& !(new->sfd
= allocate_sfd(&new->source_addr
, &daemon
->sfds
)))
452 _("ignoring nameserver %s - cannot make/bind socket: %m"), daemon
->namebuff
);
458 /* reverse order - gets it right. */
462 if (new->flags
& (SERV_HAS_DOMAIN
| SERV_FOR_NODOTS
))
465 if (new->flags
& SERV_HAS_DOMAIN
)
466 s1
= _("domain"), s2
= new->domain
;
468 s1
= _("unqualified"), s2
= _("domains");
470 if (new->flags
& SERV_NO_ADDR
)
471 syslog(LOG_INFO
, _("using local addresses only for %s %s"), s1
, s2
);
472 else if (!(new->flags
& SERV_LITERAL_ADDRESS
))
473 syslog(LOG_INFO
, _("using nameserver %s#%d for %s %s"), daemon
->namebuff
, port
, s1
, s2
);
476 syslog(LOG_INFO
, _("using nameserver %s#%d"), daemon
->namebuff
, port
);
479 daemon
->servers
= ret
;
482 void reload_servers(char *fname
, struct daemon
*daemon
)
486 struct server
*old_servers
= NULL
;
487 struct server
*new_servers
= NULL
;
488 struct server
*serv
= daemon
->servers
;
490 /* move old servers to free list - we can reuse the memory
491 and not risk malloc if there are the same or fewer new servers.
492 Servers which were specced on the command line go to the new list. */
495 struct server
*tmp
= serv
->next
;
496 if (serv
->flags
& SERV_FROM_RESOLV
)
498 serv
->next
= old_servers
;
503 serv
->next
= new_servers
;
509 /* buff happens to be NAXDNAME long... */
510 f
= fopen(fname
, "r");
513 syslog(LOG_ERR
, _("failed to read %s: %m"), fname
);
517 syslog(LOG_INFO
, _("reading %s"), fname
);
518 while ((line
= fgets(daemon
->namebuff
, MAXDNAME
, f
)))
520 union mysockaddr addr
, source_addr
;
521 char *token
= strtok(line
, " \t\n\r");
524 if (!token
|| strcmp(token
, "nameserver") != 0)
526 if (!(token
= strtok(NULL
, " \t\n\r")))
530 if (inet_pton(AF_INET
, token
, &addr
.in
.sin_addr
) > 0)
532 if ((addr
.in
.sin_addr
.s_addr
= inet_addr(token
)) != (in_addr_t
) -1)
535 #ifdef HAVE_SOCKADDR_SA_LEN
536 source_addr
.in
.sin_len
= addr
.in
.sin_len
= sizeof(source_addr
.in
);
538 source_addr
.in
.sin_family
= addr
.in
.sin_family
= AF_INET
;
539 addr
.in
.sin_port
= htons(NAMESERVER_PORT
);
540 source_addr
.in
.sin_addr
.s_addr
= INADDR_ANY
;
541 source_addr
.in
.sin_port
= htons(daemon
->query_port
);
544 else if (inet_pton(AF_INET6
, token
, &addr
.in6
.sin6_addr
) > 0)
546 #ifdef HAVE_SOCKADDR_SA_LEN
547 source_addr
.in6
.sin6_len
= addr
.in6
.sin6_len
= sizeof(source_addr
.in6
);
549 source_addr
.in6
.sin6_family
= addr
.in6
.sin6_family
= AF_INET6
;
550 addr
.in6
.sin6_port
= htons(NAMESERVER_PORT
);
551 source_addr
.in6
.sin6_flowinfo
= addr
.in6
.sin6_flowinfo
= 0;
552 source_addr
.in6
.sin6_scope_id
= addr
.in6
.sin6_scope_id
= 0;
553 source_addr
.in6
.sin6_addr
= in6addr_any
;
554 source_addr
.in6
.sin6_port
= htons(daemon
->query_port
);
563 old_servers
= old_servers
->next
;
565 else if (!(serv
= malloc(sizeof (struct server
))))
568 /* this list is reverse ordered:
569 it gets reversed again in check_servers */
570 serv
->next
= new_servers
;
573 serv
->source_addr
= source_addr
;
576 serv
->flags
= SERV_FROM_RESOLV
;
582 /* Free any memory not used. */
585 struct server
*tmp
= old_servers
->next
;
590 daemon
->servers
= new_servers
;