Compare commits

...
45 Commits
Author SHA1 Message Date
Simon Kelley 132255b5da OpenBSD build fix. 2012-08-06 20:12:04 +01:00
Simon Kelley c4c0488ac6 Update french translation. 2012-08-06 20:09:15 +01:00
Simon Kelley a2ce6fcc91 Man page typos 2012-08-06 20:05:48 +01:00
Simon Kelley 12090548d2 Add debian/dnsmasq-base.conffiles 2012-08-06 20:00:58 +01:00
Simon Kelley 8223cb15e7 Update FAQ to cover --bind-dynamic. 2012-07-29 20:21:57 +01:00
Simon Kelley 4ba9b38cc5 Debian package: move /etc/dbus-1/system.d/dnsmasq.conf. 2012-07-29 17:07:48 +01:00
Simon Kelley 42243214b5 "w" multiplier in lease times. 2012-07-20 15:19:18 +01:00
Simon Kelley 23245c0cb2 RFC 4242 support. 2012-07-18 16:21:11 +01:00
Simon Kelley b271446f82 Typo. 2012-07-17 12:09:26 +01:00
Simon Kelley 611ebc5f1e Fix broken caching of CNAME chains. 2012-07-16 16:23:46 +01:00
Simon Kelley be0f45cdbc Typo fix. Thanks Wieland Hoffmann. 2012-07-16 13:35:25 +01:00
Simon Kelley 9b40cbf587 Fix FTBFS when TFTP disabled. 2012-07-13 19:58:26 +01:00
Simon Kelley c4a7f90ebb Config parsing error-handling update. 2012-07-12 20:52:12 +01:00
Simon Kelley 9609baee41 Merge branch 'access_control' 2012-07-10 15:06:34 +01:00
Simon Kelley 395eb71931 Better log message when dhcp hosts|opts file cannot be read. 2012-07-06 22:07:05 +01:00
Simon Kelley 8bc4cecee6 Remove libvirt-inspired but never used access control features. 2012-07-03 21:04:11 +01:00
Simon Kelley 6b617c0d15 Logging library in Android build scaffold. 2012-06-29 22:11:26 +01:00
Simon Kelley 55d290a3bf Handle pid-file location in Android. 2012-06-29 20:58:32 +01:00
Simon Kelley e17b4b3871 Fix build-failure with -DNO_DHCP6. 2012-06-28 21:44:30 +01:00
Simon Kelley 236e072cab Typo in BSD-only code. 2012-06-26 21:33:01 +01:00
Simon Kelley 05ff1ed7cc Man page update. 2012-06-26 16:58:12 +01:00
Simon Kelley 2b5bae9a8f Fall back from --bind-dynamic to --bind-interfaces in BSD, rather than quitting. 2012-06-26 16:55:23 +01:00
Simon Kelley 39f1b8e73d Better logging of socket-creation errors. 2012-06-20 20:04:27 +01:00
Simon Kelley af576b56c2 Tidy up - no functional change. 2012-06-20 14:17:04 +01:00
Simon Kelley 54dd393f39 Add --bind-dynamic 2012-06-20 11:23:38 +01:00
Simon Kelley 4ce4f3779b Fix un-initialised "used" field in --listen-address structure.
Also remove unused "isloop" field.
2012-06-14 11:50:45 +01:00
Simon Kelley 8b3ae2fd43 Check tftp-root exists and is accessible at startup. 2012-06-13 13:43:49 +01:00
Simon Kelley ed55cb66e6 Correct listener logic when no TFTP and no-interface listen address. 2012-06-12 21:56:29 +01:00
Simon Kelley 2cd9a0de1f Debian systemd startup fixes for resolvconf integration. 2012-06-11 21:56:10 +01:00
Simon Kelley c514ab9907 Update Debian changelog. 2012-06-07 15:35:08 +01:00
Simon Kelley 078a630bba Do duplicate dhcp-host address check in --test mode. 2012-06-07 13:56:23 +01:00
Simon Kelley 43c271b07c Debian package build - pass calculated LDFLAGS to make. 2012-06-07 10:02:53 +01:00
Simon Kelley 24ce681e51 Add instructions/patches for dbus activation to contrib/systemd. 2012-06-04 21:40:11 +01:00
Simon Kelley 5ae34bf3c8 Fix RA when interface has more than one address on the same network. 2012-06-04 21:14:03 +01:00
Simon Kelley 51931b888a Fix access control when DHCPv6 but no RA in use. 2012-05-29 17:06:02 +01:00
Simon Kelley 9f7f3b1216 Add --dns-rr option. 2012-05-28 21:39:57 +01:00
Simon Kelley 97c83bb05b Use dpkg-buildflags in Debian rules file. 2012-05-28 18:21:59 +01:00
Simon Kelley 8767ceecd4 Make libvirt-style access control work when only doing RA. 2012-05-21 20:54:19 +01:00
Simon Kelley 18c63eff8f Fix non-response to router-solicitations when
router-advertisement configured, but DHCPv6 not
configured.
2012-05-21 14:34:15 +01:00
Simon Kelley c64b7f6a78 Fix is_same_net6 - bugged if prefix length not divisible by 8. 2012-05-18 10:19:59 +01:00
Simon Kelley 068b4b51e3 Bump Debian version. 2012-05-12 15:25:33 +01:00
Simon Kelley 919dd7cf14 Fixed missing periodic-ras in some configurations. 2012-05-12 15:23:09 +01:00
Simon Kelley f632e56793 Cope with router-solicit packets without valid source address. 2012-05-12 15:05:34 +01:00
Simon Kelley 2021c66251 code-size tweak 2012-05-07 16:43:21 +01:00
Simon Kelley 8358e0f4b2 Update German translation and fix CHANGELOG typos. Sorry, Conrad! 2012-04-29 21:53:09 +01:00
33 changed files with 1223 additions and 995 deletions

No files matched your search

+71 -4
View File
@@ -1,3 +1,70 @@
version 2.63
Do duplicate dhcp-host address check in --test mode.
Check that tftp-root directories are accessible before
start-up. Thanks to Daniel Veillard for the initial patch.
Allow more than one --tfp-root flag. The per-interface
stuff is pointless without that.
Add --bind-dynamic. A hybrid mode between the default and
--bind-interfaces which copes with dynamically created
interfaces.
A couple of fixes to the build system for Android. Thanks
to Metin Kaya for the patches.
Remove the interface:<interface> argument in --dhcp-range, and
the interface argument to --enable-tftp. These were a
still-born attempt to allow automatic isolated
configuration by libvirt, but have never (to my knowledge)
been used, had very strange semantics, and have been
superceded by other mechanisms.
Fixed bug logging filenames when duplicate dhcp-host
addresses are found. Thanks to John Hanks for the patch.
Fix regression in 2.61 which broke caching of CNAME
chains. Thanks to Atul Gupta for the bug report.
Allow the target of a --cname flag to be another --cname.
Teach DHCPv6 about the RFC 4242 information-refresh-time
option, and add parsing if the minutes, hours and days
format for options. Thanks to Francois-Xavier Le Bail for
the suggestion.
Allow "w" (for week) as multiplier in lease times, as well
as seconds, minutes, hours and days. Álvaro Gámez Machado
spotted the ommission.
Update French translation. Thanks to Gildas Le Nadan.
version 2.62
Update German translation. Thanks to Conrad Kostecki.
Cope with router-solict packets wich don't have a valid
source address. Thanks to Vladislav Grishenko for the patch.
Fixed bug which caused missing periodic router
advertisements with some configurations. Thanks to
Vladislav Grishenko for the patch.
Fixed bug which broke DHCPv6/RA with prefix lengths
which are not divisible by 8. Thanks to Andre Coetzee
for spotting this.
Fix non-response to router-solicitations when
router-advertisement configured, but DHCPv6 not
configured. Thanks to Marien Zwart for the patch.
Add --dns-rr, to allow arbitrary DNS resource records.
Fixed bug which broke RA scheduling when an interface had
two addresses in the same network. Thanks to Jim Bos for
his help nailing this.
version 2.61 version 2.61
Re-write interface discovery code on *BSD to use Re-write interface discovery code on *BSD to use
getifaddrs. This is more portable, more straightforward, getifaddrs. This is more portable, more straightforward,
@@ -16,7 +83,7 @@ version 2.61
Explicity send DHCPv6 replies to the correct port, instead Explicity send DHCPv6 replies to the correct port, instead
of relying on clients to send requests with the correct of relying on clients to send requests with the correct
source address, since at least one client in the wild gets source address, since at least one client in the wild gets
this wrong. Thanks to Conrda Kostecki for help tracking this wrong. Thanks to Conrad Kostecki for help tracking
this down. this down.
Send a preference value of 255 in DHCPv6 replies when Send a preference value of 255 in DHCPv6 replies when
@@ -68,7 +135,7 @@ version 2.61
renumbering at least possible. renumbering at least possible.
Fix bug in address6_available() which caused DHCPv6 lease Fix bug in address6_available() which caused DHCPv6 lease
aquistion to fail if more than one dhcp-range in use. aquisition to fail if more than one dhcp-range in use.
Provide RDNSS and DNSSL data in router advertisements, Provide RDNSS and DNSSL data in router advertisements,
using the settings provided for DHCP options using the settings provided for DHCP options
@@ -82,7 +149,7 @@ version 2.61
name. Thanks to Ben Winslow for finding this. name. Thanks to Ben Winslow for finding this.
Call SO_BINDTODEVICE on the DHCP socket(s) when doing DHCP Call SO_BINDTODEVICE on the DHCP socket(s) when doing DHCP
on exacly one interface and --bind-interfaces is set. This on exactly one interface and --bind-interfaces is set. This
makes the OpenStack use-case of one dnsmasq per virtual makes the OpenStack use-case of one dnsmasq per virtual
interface work. This is only available on Linux; it's not interface work. This is only available on Linux; it's not
supported on other platforms. Thanks to Vishvananda Ishaya supported on other platforms. Thanks to Vishvananda Ishaya
@@ -98,7 +165,7 @@ version 2.61
Ensure that the DBus DhcpLeaseUpdated events are generated Ensure that the DBus DhcpLeaseUpdated events are generated
when a lease goes through INIT_REBOOT state, even if the when a lease goes through INIT_REBOOT state, even if the
dhcp-script is not in use. thanks to Antoaneta-Ecaterina dhcp-script is not in use. Thanks to Antoaneta-Ecaterina
Ene for the patch. Ene for the patch.
Fix failure of TFTP over IPv4 on OpenBSD platform. Thanks Fix failure of TFTP over IPv4 on OpenBSD platform. Thanks
+61 -44
View File
@@ -236,53 +236,70 @@ Q: What network types are supported by the DHCP server?
A: Ethernet (and 802.11 wireless) are supported on all platforms. On A: Ethernet (and 802.11 wireless) are supported on all platforms. On
Linux all network types (including FireWire) are supported. Linux all network types (including FireWire) are supported.
Q: What is this strange "bind-interface" option? Q: What are these strange "bind-interface" and "bind-dynamic" options?
A: The DNS spec says that the reply to a DNS query must come from the A: Dnsmasq from v2.63 can operate in one of three different "networking
same address it was sent to. The traditional way to write an UDP modes". This is unfortunate as it requires users configuring dnsmasq
server to do this is to find all of the addresses belonging to the to take into account some rather bizzare contraints and select the
machine (ie all the interfaces on the machine) and then create a mode which best fits the requirements of a particular installation.
socket for each interface which is bound to the address of the The origin of these are deficiencies in the Unix networking
interface. Then when a packet is sent to address A, it is received model and APIs and each mode has different advantages and
on the socket bound to address A and when the reply is also sent problems. Just to add to the confusion, not all modes are available on
via that socket, the source address is set to A by the kernel and all platforms (due the to lack of supporting network APIs).To further
everything works. This is the how dnsmasq works when add to the confusion, the rules for the DHCP subsystem on dnsmasq are
"bind-interfaces" is set, with the obvious extension that is misses different to the rules for the DNS and TFTP subsystems.
out creating sockets for some interfaces depending on the
--interface, --address and --except-interface flags. The
disadvantage of this approach is that it breaks if interfaces don't
exist or are not configured when the daemon starts and does the
socket creation step. In a hotplug-aware world this is a real
problem.
The alternative approach is to have only one socket, which is bound The three modes are "wildcard", "bind-interfaces" and "bind-dynamic".
to the correct port and the wildcard IP address (0.0.0.0). That
socket will receive _all_ packets sent to port 53, no matter what
destination address they have. This solves the problem of
interfaces which are created or reconfigured after daemon
start-up. To make this work is more complicated because of the
"reply source address" problem. When a UDP packet is sent by a
socket bound to 0.0.0.0 its source address will be set to the
address of one of the machine's interfaces, but which one is not
determined and can vary depending on the OS being run. To get round
this it is neccessary to use a scary advanced API to determine the
address to which a query was sent, and force that to be the source
address in the reply. For IPv4 this stuff in non-portable and quite
often not even available (It's different between FreeBSD 5.x and
Linux, for instance, and FreeBSD 4.x, Linux 2.0.x and OpenBSD don't
have it at all.) Hence "bind-interfaces" has to always be available
as a fall back. For IPv6 the API is standard and universally
available.
It could be argued that if the --interface or --address flags are In "wildcard" mode, dnsmasq binds the wildcard IP address (0.0.0.0 or
used then binding interfaces is more appropriate, but using ::). This allows it to recieve all the packets sent to the server on
wildcard binding means that dnsmasq will quite happily start up the relevant port. Access control (--interface, --except-interface,
after being told to use interfaces which don't exist, but which are --listen-address, etc) is implemented by dnsmasq: it queries the
created later. Wildcard binding breaks the scenario when dnsmasq is kernel to determine the interface on which a packet was recieved and
listening on one interface and another server (most probably BIND) the address to which it was sent, and applies the configured
is listening on another. It's not possible for BIND to bind to an rules. Wildcard mode is the default if neither of the other modes are
(address,port) pair when dnsmasq has bound (wildcard,port), hence specified.
the ability to explicitly turn off wildcard binding.
In "bind-interfaces" mode, dnsmasq runs through all the network
interfaces available when it starts, finds the set of IP addresses on
those interfaces, filters that set using the access control
configuration, and then binds the set of IP addresses. Only packets
sent to the allowed addresses are delivered by the kernel to dnsmasq.
In "bind-dynamic" mode, access control filtering is done both by
binding individual IP addresses, as for bind-interfaces, and by
inspecting individual packets on arrival as for wildcard mode. In
addition, dnsmasq notices when new interfaces appear or new addresses
appear on existing interfaces, and the resulting IP addresses are
bound automatically without having to restart dnsmasq.
The mode chosen has four different effects: co-existence with other
servers, semantics of --interface access control, effect of new
interfaces, and legality of --interface specifications for
non-existent inferfaces. We will deal with these in order.
A dnsmasq instance running in wildcard mode precludes a machine from
running a second instance of dnsmasq or any other DNS, TFTP or DHCP
server. Attempts to do so will fail with an "address in use" error.
Dnsmasq running in --bind-interfaces or bind-dynamic mode allow other
instances of dnsmasq or other servers, as long as no two servers are
configured to listen on the same interface address.
The semantics of --interface varies subtly between wildcard or
bind-dynamic mode and bind-interfaces mode. The situation where this
matters is a request which arrives via one interface (A), but with a
destination address of a second interface (B) and when dnsmasq is
configured to listen only on B. In wildcard or bind-dynamic mode, such
a request will be ignored, in bind-interfaces mode, it will be
accepted.
The creation of new network interfaces after dnsmasq starts is ignored
by dnsmasq when in --bind-interfaces mode. In wildcard or bind-dynamic
mode, such interfaces are handled normally.
A --interface specification for a non-existent interface is a fatal
error at start-up when in --bind-interfaces mode, by just generates a
warning in wildcard or bind-dynamic mode.
Q: Why doesn't Kerberos work/why can't I get sensible answers to Q: Why doesn't Kerberos work/why can't I get sensible answers to
queries for SRV records. queries for SRV records.
+2
View File
@@ -17,4 +17,6 @@ LOCAL_C_INCLUDES := external/dnsmasq/src
LOCAL_CFLAGS := -O2 -g -W -Wall -D__ANDROID__ -DNO_IPV6 -DNO_TFTP -DNO_SCRIPT LOCAL_CFLAGS := -O2 -g -W -Wall -D__ANDROID__ -DNO_IPV6 -DNO_TFTP -DNO_SCRIPT
LOCAL_SYSTEM_SHARED_LIBRARIES := libc libcutils LOCAL_SYSTEM_SHARED_LIBRARIES := libc libcutils
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)
+57
View File
@@ -0,0 +1,57 @@
To: dnsmasq-discuss@lists.thekelleys.org.uk
From: Alex Elsayed <eternaleye+usenet@gmail.com>
Date: Tue, 15 May 2012 01:53:54 -0700
Subject: [Dnsmasq-discuss] [PATCH] Support dbus activation
Introduce dbus service file and turn dbus on in the systemd
unit.
Note to packagers:
To add support for dbus activation, you must install the dbus
service file (dbus/uk.org.thekelleys.dnsmasq.service) into
$DATADIR/dbus-1/system-services.
---
contrib/systemd/dnsmasq.service | 2 +-
dbus/uk.org.thekelleys.dnsmasq.service | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
create mode 100644 dbus/uk.org.thekelleys.dnsmasq.service
diff --git a/contrib/systemd/dnsmasq.service
b/contrib/systemd/dnsmasq.service
index a27fe6d..4a784d3 100644
--- a/contrib/systemd/dnsmasq.service
+++ b/contrib/systemd/dnsmasq.service
@@ -5,7 +5,7 @@ Description=A lightweight DHCP and caching DNS server
Type=dbus
BusName=uk.org.thekelleys.dnsmasq
ExecStartPre=/usr/sbin/dnsmasq --test
-ExecStart=/usr/sbin/dnsmasq -k
+ExecStart=/usr/sbin/dnsmasq -k -1
ExecReload=/bin/kill -HUP $MAINPID
[Install]
diff --git a/dbus/uk.org.thekelleys.dnsmasq.service
b/dbus/uk.org.thekelleys.dnsmasq.service
new file mode 100644
index 0000000..f5fe98d
--- /dev/null
+++ b/dbus/uk.org.thekelleys.dnsmasq.service
@@ -0,0 +1,7 @@
+[D-BUS Service]
+Name=uk.org.thekelleys.dnsmasq
+Exec=/usr/sbin/dnsmasq -k -1
+User=root
+SystemdService=dnsmasq.service
+
+
--
1.7.10.2
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
+27
View File
@@ -1,3 +1,30 @@
dnsmasq (2.63-1) unstable; urgency=low
* New upstream.
* Move /etc/dbus-1/system.d/dnsmasq.conf from dnsmasq to dnsmasq-base.
-- Simon Kelley <simon@thekelleys.org.uk> Mon, 11 Jun 2012 21:55:35 +0000
dnsmasq (2.62-3) unstable; urgency=low
* Do resolvconf and /etc/default startup logic when
starting with systemd. (closes: #675854)
-- Simon Kelley <simon@thekelleys.org.uk> Mon, 11 Jun 2012 21:50:11 +0000
dnsmasq (2.62-2) unstable; urgency=low
* Pass LDFLAGS to make to get hardening in linker.
-- Simon Kelley <simon@thekelleys.org.uk> Thu, 7 Jun 2012 09:53:43 +0000
dnsmasq (2.62-1) unstable; urgency=low
* New upstream.
* Use dpkg-buildflags. (Enables hardening).
-- Simon Kelley <simon@thekelleys.org.uk> Sat, 12 May 2012 15:25:23 +0000
dnsmasq (2.61-1) unstable; urgency=low dnsmasq (2.61-1) unstable; urgency=low
* New upstream. * New upstream.
-1
View File
@@ -2,5 +2,4 @@
/etc/default/dnsmasq /etc/default/dnsmasq
/etc/dnsmasq.conf /etc/dnsmasq.conf
/etc/resolvconf/update.d/dnsmasq /etc/resolvconf/update.d/dnsmasq
/etc/dbus-1/system.d/dnsmasq.conf
/etc/insserv.conf.d/dnsmasq /etc/insserv.conf.d/dnsmasq
+2 -1
View File
@@ -23,7 +23,8 @@ Description: Small caching DNS proxy and DHCP/TFTP server
Package: dnsmasq-base Package: dnsmasq-base
Architecture: any Architecture: any
Depends: ${shlibs:Depends} Depends: ${shlibs:Depends}
Conflicts: dnsmasq (<<2.41) Breaks: dnsmasq (<< 2.62-3)
Replaces: dnsmasq (<< 2.62-3)
Description: Small caching DNS proxy and DHCP/TFTP server Description: Small caching DNS proxy and DHCP/TFTP server
This package contains the dnsmasq executable and documentation, but This package contains the dnsmasq executable and documentation, but
not the infrastructure required to run it as a system daemon. For not the infrastructure required to run it as a system daemon. For
+1
View File
@@ -0,0 +1 @@
/etc/dbus-1/system.d/dnsmasq.conf
Vendored
+21
View File
@@ -259,6 +259,27 @@ case "$1" in
dump-stats) dump-stats)
kill -s USR1 `cat /var/run/dnsmasq/$NAME.pid` kill -s USR1 `cat /var/run/dnsmasq/$NAME.pid`
;; ;;
systemd-start-resolvconf)
start_resolvconf
;;
systemd-stop-resolvconf)
stop_resolvconf
;;
systemd-exec)
# --pid-file without argument disables writing a PIDfile, we don't need one with sytemd.
# Enable DBus by default because we use DBus activation with systemd.
exec $DAEMON --keep-in-foreground --pid-file --enable-dbus \
${MAILHOSTNAME:+ -m $MAILHOSTNAME} \
${MAILTARGET:+ -t $MAILTARGET} \
${DNSMASQ_USER:+ -u $DNSMASQ_USER} \
${DNSMASQ_INTERFACES:+ $DNSMASQ_INTERFACES} \
${DHCP_LEASE:+ -l $DHCP_LEASE} \
${DOMAIN_SUFFIX:+ -s $DOMAIN_SUFFIX} \
${RESOLV_CONF:+ -r $RESOLV_CONF} \
${CACHESIZE:+ -c $CACHESIZE} \
${CONFIG_DIR:+ -7 $CONFIG_DIR} \
${DNSMASQ_OPTS:+ $DNSMASQ_OPTS}
;;
*) *)
echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|dump-stats|status}" >&2 echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|dump-stats|status}" >&2
exit 3 exit 3
+11 -10
View File
@@ -11,14 +11,14 @@
package=dnsmasq-base package=dnsmasq-base
# policy manual, section 10.1 CFLAGS = $(shell export DEB_BUILD_OPTIONS=$(DEB_BUILD_OPTIONS); dpkg-buildflags --get CFLAGS)
ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += $(shell dpkg-buildflags --get CPPFLAGS)
CFLAGS = -g -O0 -Wall -W CFLAGS += -Wall -W
else
CFLAGS = -g -O2 -Wall -W LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS)
endif
COPTS = COPTS =
TARGET = install-i18n TARGET = install-i18n
DEB_BUILD_ARCH_OS := $(shell dpkg-architecture -qDEB_BUILD_ARCH_OS) DEB_BUILD_ARCH_OS := $(shell dpkg-architecture -qDEB_BUILD_ARCH_OS)
@@ -85,7 +85,6 @@ binary-indep: checkroot
-d debian/daemon/etc/resolvconf/update.d \ -d debian/daemon/etc/resolvconf/update.d \
-d debian/daemon/usr/lib/resolvconf/dpkg-event.d \ -d debian/daemon/usr/lib/resolvconf/dpkg-event.d \
-d debian/daemon/etc/default \ -d debian/daemon/etc/default \
-d debian/daemon/etc/dbus-1/system.d \
-d debian/daemon/lib/systemd/system \ -d debian/daemon/lib/systemd/system \
-d debian/daemon/etc/insserv.conf.d -d debian/daemon/etc/insserv.conf.d
install -m 644 debian/conffiles debian/daemon/DEBIAN install -m 644 debian/conffiles debian/daemon/DEBIAN
@@ -96,7 +95,6 @@ binary-indep: checkroot
install -m 644 debian/default debian/daemon/etc/default/dnsmasq install -m 644 debian/default debian/daemon/etc/default/dnsmasq
install -m 644 dnsmasq.conf.example debian/daemon/etc/dnsmasq.conf install -m 644 dnsmasq.conf.example debian/daemon/etc/dnsmasq.conf
install -m 644 debian/readme.dnsmasq.d debian/daemon/etc/dnsmasq.d/README install -m 644 debian/readme.dnsmasq.d debian/daemon/etc/dnsmasq.d/README
install -m 644 debian/dbus.conf debian/daemon/etc/dbus-1/system.d/dnsmasq.conf
install -m 644 debian/systemd.service debian/daemon/lib/systemd/system/dnsmasq.service install -m 644 debian/systemd.service debian/daemon/lib/systemd/system/dnsmasq.service
install -m 644 debian/insserv debian/daemon/etc/insserv.conf.d/dnsmasq install -m 644 debian/insserv debian/daemon/etc/insserv.conf.d/dnsmasq
ln -s $(package) debian/daemon/usr/share/doc/dnsmasq ln -s $(package) debian/daemon/usr/share/doc/dnsmasq
@@ -111,11 +109,12 @@ binary-arch: checkroot
rm -rf debian/base rm -rf debian/base
install -m 755 \ install -m 755 \
-d debian/base/DEBIAN \ -d debian/base/DEBIAN \
-d debian/base/etc/dbus-1/system.d \
-d debian/base/usr/share/doc/$(package) \ -d debian/base/usr/share/doc/$(package) \
-d debian/base/usr/share/doc/$(package)/examples \ -d debian/base/usr/share/doc/$(package)/examples \
-d debian/base/var/run \ -d debian/base/var/run \
-d debian/base/var/lib/misc -d debian/base/var/lib/misc
make $(TARGET) PREFIX=/usr DESTDIR=`pwd`/debian/base CFLAGS="$(CFLAGS)" COPTS="$(COPTS)" CC=gcc make $(TARGET) PREFIX=/usr DESTDIR=`pwd`/debian/base CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" COPTS="$(COPTS)" CC=gcc
ifeq (,$(findstring nodocs,$(DEB_BUILD_OPTIONS))) ifeq (,$(findstring nodocs,$(DEB_BUILD_OPTIONS)))
install -m 644 doc.html debian/base/usr/share/doc/$(package)/. install -m 644 doc.html debian/base/usr/share/doc/$(package)/.
install -m 644 setup.html debian/base/usr/share/doc/$(package)/. install -m 644 setup.html debian/base/usr/share/doc/$(package)/.
@@ -129,10 +128,12 @@ ifeq (,$(findstring nodocs,$(DEB_BUILD_OPTIONS)))
install -m 644 dbus/DBus-interface debian/base/usr/share/doc/$(package)/. install -m 644 dbus/DBus-interface debian/base/usr/share/doc/$(package)/.
gzip -9 debian/base/usr/share/doc/$(package)/DBus-interface gzip -9 debian/base/usr/share/doc/$(package)/DBus-interface
endif endif
install -m 644 debian/dnsmasq-base.conffiles debian/base/DEBIAN/conffiles
install -m 644 debian/changelog debian/base/usr/share/doc/$(package)/changelog.Debian install -m 644 debian/changelog debian/base/usr/share/doc/$(package)/changelog.Debian
gzip -9 debian/base/usr/share/doc/$(package)/changelog.Debian gzip -9 debian/base/usr/share/doc/$(package)/changelog.Debian
install -m 644 debian/readme debian/base/usr/share/doc/$(package)/README.Debian install -m 644 debian/readme debian/base/usr/share/doc/$(package)/README.Debian
install -m 644 debian/copyright debian/base/usr/share/doc/$(package)/copyright install -m 644 debian/copyright debian/base/usr/share/doc/$(package)/copyright
install -m 644 debian/dbus.conf debian/base/etc/dbus-1/system.d/dnsmasq.conf
gzip -9 debian/base/usr/share/man/man8/dnsmasq.8 gzip -9 debian/base/usr/share/man/man8/dnsmasq.8
for f in debian/base/usr/share/man/*; do \ for f in debian/base/usr/share/man/*; do \
if [ -f $$f/man8/dnsmasq.8 ]; then \ if [ -f $$f/man8/dnsmasq.8 ]; then \
@@ -155,7 +156,7 @@ ifeq ($(DEB_BUILD_ARCH_OS),linux)
-d debian/utils/usr/share/man/man1 \ -d debian/utils/usr/share/man/man1 \
-d debian/utils/usr/bin \ -d debian/utils/usr/bin \
-d debian/utils/usr/share/doc/dnsmasq-utils -d debian/utils/usr/share/doc/dnsmasq-utils
make -C contrib/wrt PREFIX=/usr DESTDIR=`pwd`/debian/utils CFLAGS="$(CFLAGS)" COPTS="$(COPTS)" CC=gcc make -C contrib/wrt PREFIX=/usr DESTDIR=`pwd`/debian/utils CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" COPTS="$(COPTS)" CC=gcc
install -m 755 contrib/wrt/dhcp_release debian/utils/usr/bin/dhcp_release install -m 755 contrib/wrt/dhcp_release debian/utils/usr/bin/dhcp_release
install -m 644 contrib/wrt/dhcp_release.1 debian/utils/usr/share/man/man1/dhcp_release.1 install -m 644 contrib/wrt/dhcp_release.1 debian/utils/usr/share/man/man1/dhcp_release.1
gzip -9 debian/utils/usr/share/man/man1/dhcp_release.1 gzip -9 debian/utils/usr/share/man/man1/dhcp_release.1
+16 -14
View File
@@ -8,22 +8,24 @@ BusName=uk.org.thekelleys.dnsmasq
# Test the config file and refuse starting if it is not valid. # Test the config file and refuse starting if it is not valid.
ExecStartPre=/usr/sbin/dnsmasq --test ExecStartPre=/usr/sbin/dnsmasq --test
# Enable DBus by default because we use DBus activation. # We run dnsmasq via the /etc/init.d/dnsmasq script which acts as a
# wrapper picking up extra configuration files and then execs dnsmasq
# itself, when called with the "systemd-exec" function.
# #
# Drop privileges and become the 'dnsmasq' user. It is recommended by dnsmasq # It also adds the command-line flags
# upstream to run dnsmasq as an isolated user that does not run any other # --keep-in-foreground --pid-file --enable-dbus
# processes, owns no files and has no shell. The default 'nobody' user has a # to disable writing a pid-file (not needed with systemd) and
# shell and might be used for other processes. # enable DBus by default because we use DBus activation.
# #
# Debian-specific: add /etc/dnsmasq.d to config search path (with the exception ExecStart=/etc/init.d/dnsmasq systemd-exec
# of .dpkg-*). Packages such as libvirt leave config files there.
# # The systemd-*-resolvconf functions configure (and deconfigure)
# --pid-file without argument disables writing a PIDfile, we don't need one. # resolvconf to work with the dnsmasq DNS server. They're called liek
ExecStart=/usr/sbin/dnsmasq -k \ # this to get correct error handling (ie don't start-resolvconf if the
--enable-dbus \ # dnsmasq daemon fails to start.
--user=dnsmasq \ ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf
-7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new \ ExecStop=/etc/init.d/dnsmasq systemd-stop-resolvconf
--pid-file
ExecReload=/bin/kill -HUP $MAINPID ExecReload=/bin/kill -HUP $MAINPID
+4 -1
View File
@@ -326,6 +326,9 @@
# dnsmasq and another. # dnsmasq and another.
#dhcp-option=option6:dns-server,[::],[1234::88] #dhcp-option=option6:dns-server,[::],[1234::88]
# Ask client to poll for option changes every six hours. (RFC4242)
#dhcp-option=option6:information-refresh-time,6h
# Set the NTP time server address to be the same machine as # Set the NTP time server address to be the same machine as
# is running dnsmasq # is running dnsmasq
#dhcp-option=42,0.0.0.0 #dhcp-option=42,0.0.0.0
@@ -522,7 +525,7 @@
# If you want to disable negative caching, uncomment this. # If you want to disable negative caching, uncomment this.
#no-negcache #no-negcache
# Normally responses which come form /etc/hosts and the DHCP lease # Normally responses which come from /etc/hosts and the DHCP lease
# file have Time-To-Live set as zero, which conventionally means # file have Time-To-Live set as zero, which conventionally means
# do not cache further. If you are happy to trade lower load on the # do not cache further. If you are happy to trade lower load on the
# server for potentially stale date, you can set a time-to-live (in # server for potentially stale date, you can set a time-to-live (in
+24 -54
View File
@@ -204,6 +204,17 @@ running another nameserver (or another instance of dnsmasq) on the
same machine. Setting this option also enables multiple instances of same machine. Setting this option also enables multiple instances of
dnsmasq which provide DHCP service to run in the same machine. dnsmasq which provide DHCP service to run in the same machine.
.TP .TP
.B --bind-dynamic
Enable a network mode which is a hybrid between
.B --bind-interfaces
and the default. Dnsmasq binds the address of individual interfaces,
allowing multiple dnsmasq instances, but if new interfaces or
addresses appear, it automatically listens on those (subject to any
access-control configuration). This makes dynamically created
interfaces work in the same way as the default. Implementing this
option requires non-standard networking APIs and it is only available
under Linux. On other platforms it falls-back to --bind-interfaces mode.
.TP
.B \-y, --localise-queries .B \-y, --localise-queries
Return answers to DNS queries from /etc/hosts which depend on the interface over which the query was Return answers to DNS queries from /etc/hosts which depend on the interface over which the query was
received. If a name in /etc/hosts has more than one address associated with received. If a name in /etc/hosts has more than one address associated with
@@ -450,10 +461,18 @@ Return an NAPTR DNS record, as specified in RFC3403.
Return a CNAME record which indicates that <cname> is really Return a CNAME record which indicates that <cname> is really
<target>. There are significant limitations on the target; it must be a <target>. There are significant limitations on the target; it must be a
DNS name which is known to dnsmasq from /etc/hosts (or additional DNS name which is known to dnsmasq from /etc/hosts (or additional
hosts files) or from DHCP. If the target does not satisfy this hosts files), from DHCP or from another
.B --cname.
If the target does not satisfy this
criteria, the whole cname is ignored. The cname must be unique, but it criteria, the whole cname is ignored. The cname must be unique, but it
is permissable to have more than one cname pointing to the same target. is permissable to have more than one cname pointing to the same target.
.TP .TP
.B --dns-rr=<name>,<RR-number>,[<hex data>]
Return an arbitrary DNS Resource Record. The number is the type of the
record (which is always in the C_IN class). The value of the record is
given by the hex data, which may be of the form 01:23:45 or 01 23 45 or
012345 or any mixture of these.
.TP
.B --interface-name=<name>,<interface> .B --interface-name=<name>,<interface>
Return a DNS record associating the name with the primary address on Return a DNS record associating the name with the primary address on
the given interface. This flag specifies an A record for the given the given interface. This flag specifies an A record for the given
@@ -512,9 +531,9 @@ compiled in and the kernel must have conntrack support
included and configured. This option cannot be combined with included and configured. This option cannot be combined with
--query-port. --query-port.
.TP .TP
.B \-F, --dhcp-range=[interface:<interface>,][tag:<tag>[,tag:<tag>],][set:<tag],]<start-addr>[,<end-addr>][,<mode>][,<netmask>[,<broadcast>]][,<lease time>] .B \-F, --dhcp-range=[tag:<tag>[,tag:<tag>],][set:<tag],]<start-addr>[,<end-addr>][,<mode>][,<netmask>[,<broadcast>]][,<lease time>]
.TP .TP
.B \-F, --dhcp-range=[interface:<interface>,][tag:<tag>[,tag:<tag>],][set:<tag],]<start-IPv6addr>[,<end-IPv6addr>][,<mode>][,<prefix-len>][,<lease time>] .B \-F, --dhcp-range=[tag:<tag>[,tag:<tag>],][set:<tag],]<start-IPv6addr>[,<end-IPv6addr>][,<mode>][,<prefix-len>][,<lease time>]
Enable the DHCP server. Addresses will be given out from the range Enable the DHCP server. Addresses will be given out from the range
<start-addr> to <end-addr> and from statically defined addresses given <start-addr> to <end-addr> and from statically defined addresses given
@@ -607,8 +626,6 @@ can be combined with
and and
.B slaac. .B slaac.
The interface:<interface name> section is not normally used. See the
NOTES section for details of this.
.TP .TP
.B \-G, --dhcp-host=[<hwaddr>][,id:<client_id>|*][,set:<tag>][,<ipaddr>][,<hostname>][,<lease_time>][,ignore] .B \-G, --dhcp-host=[<hwaddr>][,id:<client_id>|*][,set:<tag>][,<ipaddr>][,<hostname>][,<lease_time>][,ignore]
Specify per host parameters for the DHCP server. This allows a machine Specify per host parameters for the DHCP server. This allows a machine
@@ -1352,12 +1369,11 @@ the relevant link-local address of the machine running dnsmasq is sent
as recursive DNS server. If provided, the DHCPv6 options dns-server and as recursive DNS server. If provided, the DHCPv6 options dns-server and
domain-search are used for RDNSS and DNSSL. domain-search are used for RDNSS and DNSSL.
.TP .TP
.B --enable-tftp[=<interface>] .B --enable-tftp
Enable the TFTP server function. This is deliberately limited to that Enable the TFTP server function. This is deliberately limited to that
needed to net-boot a client. Only reading is allowed; the tsize and needed to net-boot a client. Only reading is allowed; the tsize and
blksize extensions are supported (tsize is only supported in octet blksize extensions are supported (tsize is only supported in octet
mode). See NOTES section for use of the interface argument. mode).
.TP .TP
.B --tftp-root=<directory>[,<interface>] .B --tftp-root=<directory>[,<interface>]
Look for files to transfer using TFTP relative to the given Look for files to transfer using TFTP relative to the given
@@ -1621,52 +1637,6 @@ parameter in a BOOTP request is used as a tag,
as is the tag "bootp", allowing some control over the options returned to as is the tag "bootp", allowing some control over the options returned to
different classes of hosts. different classes of hosts.
.B dhcp-range
may have an interface name supplied as
"interface:<interface-name>". The semantics if this are as follows:
For DHCP, if any other dhcp-range exists _without_ an interface name,
then the interface name is ignored and and dnsmasq behaves as if the
interface parts did not exist, otherwise DHCP is only provided to
interfaces mentioned in dhcp-range
declarations. For DNS, if there are no
.B --interface
or
.B --listen-address
flags, behaviour is unchanged by the interface part. If either of
these flags are present, the interfaces mentioned in
dhcp-ranges are added to the set which get DNS service.
Similarly,
.B enable-tftp
may take an interface name, which enables TFTP only for a particular
interface, ignoring
.B --interface
or
.B --listen-address
flags. In addition
.B --tftp-secure
and
.B --tftp-unique-root
and
.B --tftp-no-blocksize
are ignored for requests from such interfaces. (A
.B --tftp-root
directive giving a root path and an interface should be
provided too.)
These rules may seem odd at first sight, but they
allow a single line of the form "dhcp-range=interface:virt0,192.168.0.4,192.168.0.200"
to be added to dnsmasq configuration which then supplies
DHCP and DNS services to that interface, without affecting
what services are supplied to other interfaces and irrespective of
the existance or lack of "interface=<interface>"
lines elsewhere in the dnsmasq configuration.
"enable-tftp=virt0" and "tftp-root=<root>,virt0" do the same job for TFTP.
The idea is
that such a line can be added automatically by libvirt
or equivalent systems, without disturbing any manual
configuration.
.SH EXIT CODES .SH EXIT CODES
.PP .PP
0 - Dnsmasq successfully forked into the background, or terminated 0 - Dnsmasq successfully forked into the background, or terminated
+34 -55
View File
@@ -232,6 +232,18 @@ autre serveur de nom (ou une autre instance de Dnsmasq) tourne sur la même
machine. Utiliser cette option permet également d'avoir plusieurs instances de machine. Utiliser cette option permet également d'avoir plusieurs instances de
Dnsmasq fournissant un service DHCP sur la même machine. Dnsmasq fournissant un service DHCP sur la même machine.
.TP .TP
.B --bind-dynamic
Autorise un mode réseau intermédiaire entre
.B --bind-interfaces
et le mode par défaut. Dnsmasq s'associe à une seule interface, ce qui permet
plusieurs instances de dnsmasq, mais si une interface ou adresse apparaissent,
il se mettra automatiquement à écouter sur celles-ci (les règles de contrôle
d'accès s'appliquent).
De fait, les interfaces créées dynamiquement fonctionnent de la même façon que
dans le comportement par défaut. Ce fonctionnement nécessite des APIs réseau
non standard et n'est disponible que sous Linux. Sur les autres plateformes,
le fonctionnement est celui du mode --bind-interfaces.
.TP
.B \-y, --localise-queries .B \-y, --localise-queries
Retourne des réponses aux requêtes DNS dépendantes de l'interface sur laquelle Retourne des réponses aux requêtes DNS dépendantes de l'interface sur laquelle
la requête a été reçue, à partir du fichier /etc/hosts. Si un nom dans la requête a été reçue, à partir du fichier /etc/hosts. Si un nom dans
@@ -532,9 +544,17 @@ Retourne un enregistrement de type NAPTR, tel que spécifié dans le RFC3403.
Retourne un enregistrement de type CNAME qui indique que <cname> est en Retourne un enregistrement de type CNAME qui indique que <cname> est en
réalité <cible>. Il existe des contraintes significatives sur la valeur réalité <cible>. Il existe des contraintes significatives sur la valeur
de cible; il doit s'agir d'un nom DNS qui est connu de dnsmasq via /etc/hosts de cible; il doit s'agir d'un nom DNS qui est connu de dnsmasq via /etc/hosts
(ou un fichier hôtes additionnel) ou via DHCP. Si une cible ne satisfait (ou un fichier hôtes additionnel), ou via DHCP, ou par un autre
pas ces critères, le CNAME est ignoré. Le CNAME doit être unique, mais .B --cname.
il est autorisé d'avoir plus d'un CNAME pointant vers la même cible. Si une cible ne satisfait pas ces critères, le CNAME est ignoré. Le CNAME
doit être unique, mais il est autorisé d'avoir plus d'un CNAME pointant
vers la même cible.
.TP
.B --dns-rr=<nom>,<numéro-RR>,[<données hexadécimales>]
Retourne un enregistrement DNS arbitraire. Le numéro correspond au type
d'enregistrement (qui est toujours de la classe C_IN). La valeur de
l'enregistrement est donnée dans les données hexadécimales, qui peuvent
être de la forme 01:23:45, 01 23 45,+012345 ou n'importe quelle combinaison.
.TP .TP
.B --interface-name=<nom>,<interface> .B --interface-name=<nom>,<interface>
Définit un entregistrement DNS associant le nom avec l'adresse primaire sur Définit un entregistrement DNS associant le nom avec l'adresse primaire sur
@@ -601,9 +621,9 @@ avec le support conntrack, le noyau doit également inclure conntrack et être
configuré pour cela. Cette option ne peut pas être combinée avec configuré pour cela. Cette option ne peut pas être combinée avec
--query-port. --query-port.
.TP .TP
.B \-F, --dhcp-range=[interface:<interface>,][tag:<label>[,tag:<label>],][set:<label>],]<adresse de début>[,<adresse de fin>][,<mode>][,<masque de réseau>[,<broadcast>]][,<durée de bail>] .B \-F, --dhcp-range=[tag:<label>[,tag:<label>],][set:<label>],]<adresse de début>[,<adresse de fin>][,<mode>][,<masque de réseau>[,<broadcast>]][,<durée de bail>]
.TP .TP
.B \-F, --dhcp-range=[interface:<interface>,][tag:<label>[,tag:<label>],][set:<label>],]<addresse IPv6 de début>[,<adresse IPv6 de fin>][,<mode>][,<longueur de préfixe>][,<durée de bail>] .B \-F, --dhcp-range=[tag:<label>[,tag:<label>],][set:<label>],]<addresse IPv6 de début>[,<adresse IPv6 de fin>][,<mode>][,<longueur de préfixe>][,<durée de bail>]
Active le serveur DHCP. Les adresses seront données dans la plage comprise entre Active le serveur DHCP. Les adresses seront données dans la plage comprise entre
<adresse de début> et <adresse de fin> et à partir des adresses définies <adresse de début> et <adresse de fin> et à partir des adresses définies
statiquement dans l'option statiquement dans l'option
@@ -705,8 +725,6 @@ peut-être combiné avec
et et
.B slaac. .B slaac.
La section interface:<nom d'interface> n'est normalement pas utilisée. Se
référer aux indications de la section NOTES pour plus de détail à ce sujet.
.TP .TP
.B \-G, --dhcp-host=[<adresse matérielle>][,id:<identifiant client>|*][,set:<label>][,<adresse IP>][,<nom d'hôte>][,<durée de bail>][,ignore] .B \-G, --dhcp-host=[<adresse matérielle>][,id:<identifiant client>|*][,set:<label>][,<adresse IP>][,<nom d'hôte>][,<durée de bail>][,ignore]
Spécifie les paramètres DHCP relatifs à un hôte. Cela permet à une machine Spécifie les paramètres DHCP relatifs à un hôte. Cela permet à une machine
@@ -1517,12 +1535,11 @@ dnsmasq est spécifiée comme DNS récursif. Si elles sont fournies, les
options dns-server et domain-search sont utilisées respectivement pour RDNSS et options dns-server et domain-search sont utilisées respectivement pour RDNSS et
DNSSL. DNSSL.
.TP .TP
.B --enable-tftp[=<interface>] .B --enable-tftp
Active la fonction serveur TFTP. Celui-ci est de manière délibérée limité aux Active la fonction serveur TFTP. Celui-ci est de manière délibérée limité aux
fonctions nécessaires au démarrage par le réseau ("net-boot") d'un client. Seul fonctions nécessaires au démarrage par le réseau ("net-boot") d'un client. Seul
un accès en lecture est possible; les extensions tsize et blksize sont supportées un accès en lecture est possible; les extensions tsize et blksize sont supportées
(tsize est seulement supporté en mode octet). Voir dans la section NOTES les (tsize est seulement supporté en mode octet).
informations relatives à la spécification de l'interface.
.TP .TP
.B --tftp-root=<répertoire>[,<interface>] .B --tftp-root=<répertoire>[,<interface>]
Les fichiers à fournir dans les transferts TFTP seront cherchés en prenant le Les fichiers à fournir dans les transferts TFTP seront cherchés en prenant le
@@ -1560,6 +1577,13 @@ Sans cela, en effet, l'accès de tous les fichiers du serveur pour lequel le
droit de lecture pour tout le monde est positionné ("world-readable") devient droit de lecture pour tout le monde est positionné ("world-readable") devient
possible par n'importe quel hôte sur le réseau. possible par n'importe quel hôte sur le réseau.
.TP .TP
.B --tftp-lowercase
Converti les noms de fichiers des requêtes TFTP en minuscules. Cela est utile
pour les requêtes effectuées depuis les machines Windows, dont les systèmes
de fichiers sont insensibles à la casse et pour lesquels la détermination
de la casse est parfois un peu aléatoire. A noter que le serveur tftp de
dnsmasq converti systématiquement les "\\" en "/" dans les noms de fichiers.
.TP
.B --tftp-max=<connexions> .B --tftp-max=<connexions>
Définit le nombre maximum de connexions TFTP simultanées autorisées. La valeur Définit le nombre maximum de connexions TFTP simultanées autorisées. La valeur
par défaut est de 50. Lorsqu'un grand nombre de connexions TFTP est spécifié, par défaut est de 50. Lorsqu'un grand nombre de connexions TFTP est spécifié,
@@ -1823,51 +1847,6 @@ supprime la nécessité des associations statiques). Le paramètre
que le label "bootp", permettant un certain contrôle sur les options retournées que le label "bootp", permettant un certain contrôle sur les options retournées
aux différentes classes d'hôtes. aux différentes classes d'hôtes.
Il est possible de spécifier un nom d'interface à
.B dhcp-range
sous la forme "interface:<nom d'interface>". La sémantique est comme suit :
Pour le DHCP, s'il existe une autre valeur de dhcp-range pour laquelle
_aucun_ nom d'interface n'est donné, alors le nom d'interface est ignoré
et dnsmasq se comporte comme si la partie spécifiant l'interface n'existait
pas, sinon le service DHCP n'est fourni qu'aux interfaces mentionnées dans
les déclarations dhcp-range. Pour le DNS, si il n'y a pas d'option
.B --interface
ou
.B --listen-address
, alors le comportement n'est pas impacté par la spécification d'interface. Si
l'une ou l'autre de ces options est présente, alors les interfaces mentionnées
dans les plages d'adresses dhcp-range sont rajoutées à la liste de celles
où le service DNS est assuré.
De manière similaire,
.B enable-tftp
peut prendre un nom d'interface, ce qui active le TFTP pour cette seule
interface, en ignorant les options
.B --interface
ou
.B --listen-address
De plus,
.B --tftp-secure
,
.B --tftp-unique-root
et
.B --tftp-no-blocksize
sont ignorées pour les requêtes sur de telles interfaces. (une directive
.B --tftp-root
donnant le chemin de la racine et une interface doit-être fournie).
Ces règles peuvent paraître étrange à première vue, mais elles permettent
d'ajouter à la configuration de dnsmasq des lignes de configuration de la
forme "dhcp-range=interface:virt0,192.168.0.4,192.168.0.200" afin de fournir
un service DHCP et DNS sur cette interface, sans pour autant affecter les
services fournis sur d'autres interfaces, malgré l'absence de paramètres
"interface=<interface>" sur les autres lignes de configuration.
"enable-tftp=virt0" et "tftp-root=<root>,virt0" effectuent la même chose pour
TFTP.
L'idée de tout cela est de permettre l'addition de telles lignes
automatiquement par libvirt ou un système équivalent, sans perturbation
d'une configuration manuelle existant par ailleurs.
.SH CODES DE SORTIE .SH CODES DE SORTIE
.PP .PP
0 - Dnsmasq s'est correctement lancé en tâche de fond, ou alors s'est 0 - Dnsmasq s'est correctement lancé en tâche de fond, ou alors s'est
+154 -139
View File
@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: dnsmasq 2.53rc1\n" "Project-Id-Version: dnsmasq 2.53rc1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-06-18 12:24+0100\n" "POT-Creation-Date: 2009-06-18 12:24+0100\n"
"PO-Revision-Date: 2010-05-24 16:29+0200\n" "PO-Revision-Date: 2012-04-05 17:54+0100\n"
"Last-Translator: Matthias Andree <matthias.andree@gmx.de>\n" "Last-Translator: Conrad Kostecki <ConiKost@gmx.de>\n"
"Language-Team: German <de@li.org>\n" "Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -25,17 +25,20 @@ msgstr ""
msgid "failed to load names from %s: %s" msgid "failed to load names from %s: %s"
msgstr "Fehler beim Laden der Namen von %s: %s" msgstr "Fehler beim Laden der Namen von %s: %s"
#: cache.c:797 dhcp.c:855 #: cache.c:797
#: dhcp.c:855
#, c-format #, c-format
msgid "bad address at %s line %d" msgid "bad address at %s line %d"
msgstr "Fehlerhafte Adresse in %s Zeile %d" msgstr "Fehlerhafte Adresse in %s Zeile %d"
#: cache.c:846 dhcp.c:871 #: cache.c:846
#: dhcp.c:871
#, c-format #, c-format
msgid "bad name at %s line %d" msgid "bad name at %s line %d"
msgstr "Fehlerhafter Name in %s Zeile %d" msgstr "Fehlerhafter Name in %s Zeile %d"
#: cache.c:853 dhcp.c:946 #: cache.c:853
#: dhcp.c:946
#, c-format #, c-format
msgid "read %s - %d addresses" msgid "read %s - %d addresses"
msgstr "%s gelesen - %d Adressen" msgstr "%s gelesen - %d Adressen"
@@ -47,7 +50,7 @@ msgstr "Cache geleert"
#: cache.c:953 #: cache.c:953
#, c-format #, c-format
msgid "No IPv4 address found for %s" msgid "No IPv4 address found for %s"
msgstr "" msgstr "Keine IPv4-Adresse für %s gefunden"
#: cache.c:1005 #: cache.c:1005
#, c-format #, c-format
@@ -88,7 +91,8 @@ msgstr "Konnte den Zufallszahlengenerator nicht initialisieren: %s"
msgid "failed to allocate memory" msgid "failed to allocate memory"
msgstr "Konnte Speicher nicht belegen" msgstr "Konnte Speicher nicht belegen"
#: util.c:227 option.c:717 #: util.c:227
#: option.c:717
msgid "could not get memory" msgid "could not get memory"
msgstr "Speicher nicht verfügbar" msgstr "Speicher nicht verfügbar"
@@ -171,19 +175,16 @@ msgid "Set address or hostname for a specified machine."
msgstr "Adresse oder Hostnamen für einen angegebenen Computer setzen." msgstr "Adresse oder Hostnamen für einen angegebenen Computer setzen."
#: option.c:268 #: option.c:268
#, fuzzy
msgid "Read DHCP host specs from file." msgid "Read DHCP host specs from file."
msgstr "DHCP-Host-Angaben aus Datei lesen" msgstr "DHCP-Host-Angaben aus Datei lesen."
#: option.c:269 #: option.c:269
#, fuzzy
msgid "Read DHCP option specs from file." msgid "Read DHCP option specs from file."
msgstr "DHCP-Optionen aus Datei lesen" msgstr "DHCP-Optionen aus Datei lesen."
#: option.c:270 #: option.c:270
#, fuzzy
msgid "Evaluate conditional tag expression." msgid "Evaluate conditional tag expression."
msgstr "Auswertung eines Ausdrucks bedingter Marken" msgstr "Auswertung eines Ausdrucks bedingter Marken."
#: option.c:271 #: option.c:271
#, c-format #, c-format
@@ -325,7 +326,6 @@ msgid "Specify time-to-live in seconds for negative caching."
msgstr "Gültigkeitsdauer in Sekunden für Caching negativer Ergebnisse festlegen." msgstr "Gültigkeitsdauer in Sekunden für Caching negativer Ergebnisse festlegen."
#: option.c:304 #: option.c:304
#, fuzzy
msgid "Specify time-to-live in seconds for maximum TTL to send to clients." msgid "Specify time-to-live in seconds for maximum TTL to send to clients."
msgstr "Gültigkeitsdauer in Sekunden für Caching negativer Ergebnisse festlegen." msgstr "Gültigkeitsdauer in Sekunden für Caching negativer Ergebnisse festlegen."
@@ -414,17 +414,14 @@ msgid "Disable ICMP echo address checking in the DHCP server."
msgstr "ICMP-Echo-Adressprüfung im DHCP-Server abschalten." msgstr "ICMP-Echo-Adressprüfung im DHCP-Server abschalten."
#: option.c:325 #: option.c:325
#, fuzzy
msgid "Shell script to run on DHCP lease creation and destruction." msgid "Shell script to run on DHCP lease creation and destruction."
msgstr "Skript, das bei Erzeugung/Löschung einer DHCP-Lease laufen soll." msgstr "Skript, das bei Erzeugung/Löschung einer DHCP-Lease laufen soll."
#: option.c:326 #: option.c:326
#, fuzzy
msgid "Lua script to run on DHCP lease creation and destruction." msgid "Lua script to run on DHCP lease creation and destruction."
msgstr "Skript, das bei Erzeugung/Löschung einer DHCP-Lease laufen soll." msgstr "Lua-Skript, welches bei Erzeugung/Löschung eines DHCP-Leases laufen soll."
#: option.c:327 #: option.c:327
#, fuzzy
msgid "Run lease-change scripts as this user." msgid "Run lease-change scripts as this user."
msgstr "Lease-Änderungs-Skript mit den Rechten dieses Nutzers ausführen." msgstr "Lease-Änderungs-Skript mit den Rechten dieses Nutzers ausführen."
@@ -504,7 +501,6 @@ msgid "Allow rebinding of 127.0.0.0/8, for RBL servers."
msgstr "Auflösung zu 127.0.0.0/8 erlauben, für RBL-Server." msgstr "Auflösung zu 127.0.0.0/8 erlauben, für RBL-Server."
#: option.c:346 #: option.c:346
#, fuzzy
msgid "Inhibit DNS-rebind protection on this domain." msgid "Inhibit DNS-rebind protection on this domain."
msgstr "DNS-Rebind-Schutz für diese Domäne sperren." msgstr "DNS-Rebind-Schutz für diese Domäne sperren."
@@ -534,9 +530,8 @@ msgstr "Für DHCP-Klienten nur vollständig bestimmte Domänennamen benutzen."
# FIXME: probably typo in original message. -- MA # FIXME: probably typo in original message. -- MA
#: option.c:353 #: option.c:353
#, fuzzy
msgid "Generate hostnames based on MAC address for nameless clients." msgid "Generate hostnames based on MAC address for nameless clients."
msgstr "Für namenlose Klienten die Hostnamen MAC-basiert erzeugen." msgstr "Generiere Hostnamen auf Basis der MAC-Adresse für namenlose Klienten."
#: option.c:354 #: option.c:354
msgid "Use these DHCP relays as full proxies." msgid "Use these DHCP relays as full proxies."
@@ -560,28 +555,27 @@ msgstr "Konfigurationssyntax prüfen."
#: option.c:359 #: option.c:359
msgid "Add requestor's MAC address to forwarded DNS queries." msgid "Add requestor's MAC address to forwarded DNS queries."
msgstr "" msgstr "Anfragende MAC-Adresse in die weiterleitende DNS-Anfrage einfügen"
#: option.c:360 #: option.c:360
#, fuzzy
msgid "Proxy DNSSEC validation results from upstream nameservers." msgid "Proxy DNSSEC validation results from upstream nameservers."
msgstr "IPv4-Adressen von vorgelagerten Servern übersetzen." msgstr "Proxy-DNSSEC-Validierung-Ergebnisse von Upstream-Namensservern."
#: option.c:361 #: option.c:361
msgid "Attempt to allocate sequential IP addresses to DHCP clients." msgid "Attempt to allocate sequential IP addresses to DHCP clients."
msgstr "" msgstr "Versuche sequenzielle IP-Adressen an DHCP-Klienten zu vergeben."
#: option.c:362 #: option.c:362
msgid "Copy connection-track mark from queries to upstream connections." msgid "Copy connection-track mark from queries to upstream connections."
msgstr "" msgstr "Kopiere \"connection-track mark\" von Anfragen nach Upstream-Verbindungen."
#: option.c:363 #: option.c:363
msgid "Allow DHCP clients to do their own DDNS updates." msgid "Allow DHCP clients to do their own DDNS updates."
msgstr "" msgstr "Erlaube DHCP-Klienten ihre eigenen DDNS-Updates durchzuführen."
#: option.c:364 #: option.c:364
msgid "Send router-advertisements for interfaces doing DHCPv6" msgid "Send router-advertisements for interfaces doing DHCPv6"
msgstr "" msgstr "Sende \"Router-Advertisments\" für Netzwerkschnittstellen, welche DHCPv6 nutzen"
#: option.c:782 #: option.c:782
#, c-format #, c-format
@@ -608,13 +602,13 @@ msgid "Known DHCP options:\n"
msgstr "Bekannte DHCP-Optionen:\n" msgstr "Bekannte DHCP-Optionen:\n"
#: option.c:838 #: option.c:838
#, fuzzy, c-format #, c-format
msgid "Known DHCPv6 options:\n" msgid "Known DHCPv6 options:\n"
msgstr "Bekannte DHCP-Optionen:\n" msgstr "Bekannte DHCPv6-Optionen:\n"
#: option.c:973 #: option.c:973
msgid "unsupported encapsulation for IPv6 option" msgid "unsupported encapsulation for IPv6 option"
msgstr "" msgstr "Nicht unterstützte Verkapselung für eine IPv6-Option"
#: option.c:1001 #: option.c:1001
msgid "bad dhcp-option" msgid "bad dhcp-option"
@@ -624,10 +618,11 @@ msgstr "Fehlerhafte DHCP-Option"
msgid "bad IP address" msgid "bad IP address"
msgstr "Fehlerhafte IP-Adresse" msgstr "Fehlerhafte IP-Adresse"
#: option.c:1071 option.c:1177 option.c:2511 #: option.c:1071
#, fuzzy #: option.c:1177
#: option.c:2511
msgid "bad IPv6 address" msgid "bad IPv6 address"
msgstr "Fehlerhafte IP-Adresse" msgstr "Fehlerhafte IPv6-Adresse"
#: option.c:1205 #: option.c:1205
msgid "bad domain in dhcp-option" msgid "bad domain in dhcp-option"
@@ -649,23 +644,25 @@ msgstr "unzulässig wiederholte Markierung"
msgid "illegal repeated keyword" msgid "illegal repeated keyword"
msgstr "unzulässig wiederholtes Schlüsselwort" msgstr "unzulässig wiederholtes Schlüsselwort"
#: option.c:1452 option.c:3536 #: option.c:1452
#: option.c:3536
#, c-format #, c-format
msgid "cannot access directory %s: %s" msgid "cannot access directory %s: %s"
msgstr "Kann auf Verzeichnis %s nicht zugreifen: %s" msgstr "Kann auf Verzeichnis %s nicht zugreifen: %s"
#: option.c:1483 tftp.c:464 #: option.c:1483
#: tftp.c:464
#, c-format #, c-format
msgid "cannot access %s: %s" msgid "cannot access %s: %s"
msgstr "Kann auf %s nicht zugreifen: %s" msgstr "Kann auf %s nicht zugreifen: %s"
#: option.c:1512 #: option.c:1512
msgid "setting log facility is not possible under Android" msgid "setting log facility is not possible under Android"
msgstr "" msgstr "Die Einstellung Protokolliereinrichtung kann unter Android nicht gesetzt werden"
#: option.c:1521 #: option.c:1521
msgid "bad log facility" msgid "bad log facility"
msgstr "" msgstr "Falsche Protokolliereinrichtung"
#: option.c:1570 #: option.c:1570
msgid "bad MX preference" msgid "bad MX preference"
@@ -688,19 +685,21 @@ msgid "recompile with HAVE_SCRIPT defined to enable lease-change scripts"
msgstr "Neuübersetzung mit HAVE_SCRIPT nötig, um Lease-Änderungs-Skripte auszuführen" msgstr "Neuübersetzung mit HAVE_SCRIPT nötig, um Lease-Änderungs-Skripte auszuführen"
#: option.c:1607 #: option.c:1607
#, fuzzy
msgid "recompile with HAVE_LUASCRIPT defined to enable Lua scripts" msgid "recompile with HAVE_LUASCRIPT defined to enable Lua scripts"
msgstr "Neuübersetzung mit HAVE_SCRIPT nötig, um Lease-Änderungs-Skripte auszuführen" msgstr "Um Benutzerdefinierte Lua-Scripte zu ermöglichen, muss mit HAVE_LUASCRIPT neu kompiliert werden"
#: option.c:1988 option.c:1992 #: option.c:1988
#: option.c:1992
msgid "bad port" msgid "bad port"
msgstr "unzulässiger Port" msgstr "unzulässiger Port"
#: option.c:2015 option.c:2046 #: option.c:2015
#: option.c:2046
msgid "interface binding not supported" msgid "interface binding not supported"
msgstr "Schnittstellenbindung nicht unterstützt" msgstr "Schnittstellenbindung nicht unterstützt"
#: option.c:2026 option.c:3088 #: option.c:2026
#: option.c:3088
msgid "bad interface name" msgid "bad interface name"
msgstr "unzulässiger Schnittestellenname" msgstr "unzulässiger Schnittestellenname"
@@ -726,20 +725,20 @@ msgstr "inkonsistenter DHCP-Bereich"
#: option.c:2374 #: option.c:2374
msgid "prefix must be at least 64" msgid "prefix must be at least 64"
msgstr "" msgstr "Der Prefix muss mindestens 64 sein"
#: option.c:2378 #: option.c:2378
#, fuzzy
msgid "inconsistent DHCPv6 range" msgid "inconsistent DHCPv6 range"
msgstr "inkonsistenter DHCP-Bereich" msgstr "Inkonsistenter DHCPv6-Bereich"
#: option.c:2481 option.c:2521 #: option.c:2481
#: option.c:2521
msgid "bad hex constant" msgid "bad hex constant"
msgstr "" msgstr "Falscher Hexwert"
#: option.c:2503 #: option.c:2503
msgid "cannot match tags in --dhcp-host" msgid "cannot match tags in --dhcp-host"
msgstr "" msgstr "Kann die Tags in --dhcp-host nicht abgleichen"
#: option.c:2583 #: option.c:2583
msgid "bad DHCP host name" msgid "bad DHCP host name"
@@ -749,7 +748,8 @@ msgstr "unzulässiger DHCP-Hostname"
msgid "bad tag-if" msgid "bad tag-if"
msgstr "unzulässige bedingte Marke (tag-if)" msgstr "unzulässige bedingte Marke (tag-if)"
#: option.c:2973 option.c:3258 #: option.c:2973
#: option.c:3258
msgid "invalid port number" msgid "invalid port number"
msgstr "unzulässige Portnummer" msgstr "unzulässige Portnummer"
@@ -826,19 +826,21 @@ msgstr "Fehler"
msgid "%s at line %d of %%s" msgid "%s at line %d of %%s"
msgstr "%s in Zeile %d von %%s" msgstr "%s in Zeile %d von %%s"
#: option.c:3491 tftp.c:627 #: option.c:3491
#: tftp.c:627
#, c-format #, c-format
msgid "cannot read %s: %s" msgid "cannot read %s: %s"
msgstr "kann %s nicht lesen: %s" msgstr "kann %s nicht lesen: %s"
#: option.c:3657 option.c:3693 #: option.c:3657
#: option.c:3693
#, c-format #, c-format
msgid "read %s" msgid "read %s"
msgstr "%s gelesen" msgstr "%s gelesen"
#: option.c:3745 #: option.c:3745
msgid "junk found in command line" msgid "junk found in command line"
msgstr "" msgstr "Mist in der Kommandozeile gefunden"
#: option.c:3780 #: option.c:3780
#, c-format #, c-format
@@ -846,12 +848,12 @@ msgid "Dnsmasq version %s %s\n"
msgstr "Dnsmasq Version %s %s\n" msgstr "Dnsmasq Version %s %s\n"
#: option.c:3781 #: option.c:3781
#, fuzzy, c-format #, c-format
msgid "" msgid ""
"Compile time options: %s\n" "Compile time options: %s\n"
"\n" "\n"
msgstr "" msgstr ""
"Übersetzungs-Optionen %s\n" "Kompilierungs-Optionen %s\n"
"\n" "\n"
#: option.c:3782 #: option.c:3782
@@ -863,12 +865,12 @@ msgstr "Für diese Software wird ABSOLUT KEINE GARANTIE gewährt.\n"
#: option.c:3783 #: option.c:3783
#, c-format #, c-format
msgid "Dnsmasq is free software, and you are welcome to redistribute it\n" msgid "Dnsmasq is free software, and you are welcome to redistribute it\n"
msgstr "" msgstr "Dnsmasq ist freie Software, und du bist willkommen es weiter zu verteilen\n"
#: option.c:3784 #: option.c:3784
#, c-format #, c-format
msgid "under the terms of the GNU General Public License, version 2 or 3.\n" msgid "under the terms of the GNU General Public License, version 2 or 3.\n"
msgstr "" msgstr "unter den Bedingungen der GNU General Public Lizenz, Version 2 oder 3.\n"
#: option.c:3795 #: option.c:3795
msgid "try --help" msgid "try --help"
@@ -896,7 +898,9 @@ msgstr "mit -n/--no-poll ist nur eine resolv.conf-Datei zulässig."
msgid "must have exactly one resolv.conf to read domain from." msgid "must have exactly one resolv.conf to read domain from."
msgstr "Um die Domäne zu lesen, muss genau eine resolv.conf-Datei verwendet werden." msgstr "Um die Domäne zu lesen, muss genau eine resolv.conf-Datei verwendet werden."
#: option.c:3882 network.c:822 dhcp.c:804 #: option.c:3882
#: network.c:822
#: dhcp.c:804
#, c-format #, c-format
msgid "failed to read %s: %s" msgid "failed to read %s: %s"
msgstr "konnte %s nicht lesen: %s" msgstr "konnte %s nicht lesen: %s"
@@ -907,18 +911,17 @@ msgid "no search directive found in %s"
msgstr "keine \"search\"-Anweisung in %s gefunden" msgstr "keine \"search\"-Anweisung in %s gefunden"
#: option.c:3920 #: option.c:3920
#, fuzzy
msgid "there must be a default domain when --dhcp-fqdn is set" msgid "there must be a default domain when --dhcp-fqdn is set"
msgstr "für --dhcp-fqdn muss eine Domäne vorausgewählt werden" msgstr "Es muss eine standard Domain gesetzt sein, wenn --dhcp-fqdn gesetzt ist"
#: option.c:3924 #: option.c:3924
msgid "syntax check OK" msgid "syntax check OK"
msgstr "Syntaxprüfung OK" msgstr "Syntaxprüfung OK"
#: forward.c:113 #: forward.c:113
#, fuzzy, c-format #, c-format
msgid "failed to send packet: %s" msgid "failed to send packet: %s"
msgstr "konnte Socket nicht zum Empfang einrichten: %s" msgstr "Fehlgeschlagen, folgendes Paket zu senden: %s"
#: forward.c:474 #: forward.c:474
#, c-format #, c-format
@@ -931,9 +934,9 @@ msgid "possible DNS-rebind attack detected: %s"
msgstr "möglichen DNS-Rebind-Angriff entdeckt: %s" msgstr "möglichen DNS-Rebind-Angriff entdeckt: %s"
#: network.c:355 #: network.c:355
#, fuzzy, c-format #, c-format
msgid "failed to create listening socket for %s: %s" msgid "failed to create listening socket for %s: %s"
msgstr "Konnte Empfangs-Socket nicht erzeugen: %s" msgstr "Konnte Empfangs-Socket für %s: %s nicht erzeugen"
#: network.c:720 #: network.c:720
#, c-format #, c-format
@@ -953,44 +956,44 @@ msgstr "ignoriere Namensserver %s - kann Socket nicht erzeugen/binden: %s"
# FIXME: this isn't translatable - always provide full strings, do not assemble yourself! -- MA # FIXME: this isn't translatable - always provide full strings, do not assemble yourself! -- MA
#: network.c:785 #: network.c:785
msgid "unqualified" msgid "unqualified"
msgstr "" msgstr "unqualifiziert"
#: network.c:785 #: network.c:785
msgid "names" msgid "names"
msgstr "" msgstr "Namen"
#: network.c:787 #: network.c:787
msgid "default" msgid "default"
msgstr "" msgstr "Standard"
#: network.c:789 #: network.c:789
msgid "domain" msgid "domain"
msgstr "" msgstr "Domain"
#: network.c:792 #: network.c:792
#, c-format #, c-format
msgid "using local addresses only for %s %s" msgid "using local addresses only for %s %s"
msgstr "" msgstr "Benutze lokale Adressen nur für %s %s"
#: network.c:794 #: network.c:794
#, c-format #, c-format
msgid "using standard nameservers for %s %s" msgid "using standard nameservers for %s %s"
msgstr "" msgstr "Benutze standard Namensserver für %s %s"
#: network.c:796 #: network.c:796
#, c-format #, c-format
msgid "using nameserver %s#%d for %s %s" msgid "using nameserver %s#%d for %s %s"
msgstr "" msgstr "Benutze Namensserver %s#%d für %s %s"
#: network.c:799 #: network.c:799
#, c-format #, c-format
msgid "using nameserver %s#%d(via %s)" msgid "using nameserver %s#%d(via %s)"
msgstr "" msgstr "Benutze Namensserver %s#%d(via %s)"
#: network.c:801 #: network.c:801
#, c-format #, c-format
msgid "using nameserver %s#%d" msgid "using nameserver %s#%d"
msgstr "" msgstr "Benutze Namensserver %s#%d"
#: dnsmasq.c:123 #: dnsmasq.c:123
msgid "TFTP server not available: set HAVE_TFTP in src/config.h" msgid "TFTP server not available: set HAVE_TFTP in src/config.h"
@@ -998,21 +1001,19 @@ msgstr "TFTP-Server nicht verfügbar, setzen Sie HAVE_TFTP in src/config.h"
#: dnsmasq.c:128 #: dnsmasq.c:128
msgid "Cannot use --conntrack AND --query-port" msgid "Cannot use --conntrack AND --query-port"
msgstr "" msgstr "Kann nicht --conntrack UND --query-port einsetzen"
#: dnsmasq.c:131 #: dnsmasq.c:131
#, fuzzy
msgid "Conntrack support not available: set HAVE_CONNTRACK in src/config.h" msgid "Conntrack support not available: set HAVE_CONNTRACK in src/config.h"
msgstr "TFTP-Server nicht verfügbar, setzen Sie HAVE_TFTP in src/config.h" msgstr "Conntrack-Unterstützung nicht verfügbar: setze HAVE_CONNTRACK in src/config.h"
#: dnsmasq.c:136 #: dnsmasq.c:136
msgid "asychronous logging is not available under Solaris" msgid "asychronous logging is not available under Solaris"
msgstr "asynchrone Protokollierung unter Solaris nicht verfügbar" msgstr "asynchrone Protokollierung unter Solaris nicht verfügbar"
#: dnsmasq.c:141 #: dnsmasq.c:141
#, fuzzy
msgid "asychronous logging is not available under Android" msgid "asychronous logging is not available under Android"
msgstr "asynchrone Protokollierung unter Solaris nicht verfügbar" msgstr "Asynchrone Protokollierung unter Android nicht verfügbar"
#: dnsmasq.c:190 #: dnsmasq.c:190
#, c-format #, c-format
@@ -1029,7 +1030,8 @@ msgstr "unbekannte Schnittstelle %s"
msgid "no interface with address %s" msgid "no interface with address %s"
msgstr "keine Schnittstelle mit Adresse %s" msgstr "keine Schnittstelle mit Adresse %s"
#: dnsmasq.c:220 dnsmasq.c:770 #: dnsmasq.c:220
#: dnsmasq.c:770
#, c-format #, c-format
msgid "DBus error: %s" msgid "DBus error: %s"
msgstr "DBus-Fehler: %s" msgstr "DBus-Fehler: %s"
@@ -1062,7 +1064,7 @@ msgstr "gestartet, Version %s, Cachegröße %d"
#: dnsmasq.c:485 #: dnsmasq.c:485
#, c-format #, c-format
msgid "started, version %s cache disabled" msgid "started, version %s cache disabled"
msgstr "" msgstr "Gestartet, Version %s Cache deaktiviert"
#: dnsmasq.c:487 #: dnsmasq.c:487
#, c-format #, c-format
@@ -1106,7 +1108,7 @@ msgstr "asynchrone Protokollierung eingeschaltet, Warteschlange fasst %d Nachric
#: dnsmasq.c:524 #: dnsmasq.c:524
msgid "IPv6 router advertisement enabled" msgid "IPv6 router advertisement enabled"
msgstr "" msgstr "IPv6-Router-Advertisement aktiviert"
#: dnsmasq.c:554 #: dnsmasq.c:554
#, c-format #, c-format
@@ -1114,9 +1116,9 @@ msgid "DHCP, static leases only on %.0s%s, lease time %s"
msgstr "DHCP, nur statische Leases auf %.0s%s, Lease-Zeit %s" msgstr "DHCP, nur statische Leases auf %.0s%s, Lease-Zeit %s"
#: dnsmasq.c:556 #: dnsmasq.c:556
#, fuzzy, c-format #, c-format
msgid "router advertisement only on %.0s%s, lifetime %s" msgid "router advertisement only on %.0s%s, lifetime %s"
msgstr "DHCP, nur statische Leases auf %.0s%s, Lease-Zeit %s" msgstr "Router-Advertisment nur auf %.0s%s, Lebenszeit %s"
#: dnsmasq.c:558 #: dnsmasq.c:558
#, c-format #, c-format
@@ -1131,15 +1133,15 @@ msgstr "DHCP, IP-Bereich %s - %s, Lease-Zeit %s "
# FIXME: this and the next few must be full strings to be translatable - do not assemble in code" # FIXME: this and the next few must be full strings to be translatable - do not assemble in code"
#: dnsmasq.c:588 #: dnsmasq.c:588
msgid "root is " msgid "root is "
msgstr "" msgstr "Wurzel ist"
#: dnsmasq.c:588 #: dnsmasq.c:588
msgid "enabled" msgid "enabled"
msgstr "" msgstr "Aktiviert"
#: dnsmasq.c:590 #: dnsmasq.c:590
msgid "secure mode" msgid "secure mode"
msgstr "" msgstr "sicherer Modus"
#: dnsmasq.c:616 #: dnsmasq.c:616
#, c-format #, c-format
@@ -1181,24 +1183,24 @@ msgid "failed to open pidfile %s: %s"
msgstr "kann die Prozessidentifikations-(PID)-Datei %s nicht öffnen: %s" msgstr "kann die Prozessidentifikations-(PID)-Datei %s nicht öffnen: %s"
#: dnsmasq.c:930 #: dnsmasq.c:930
#, fuzzy, c-format #, c-format
msgid "cannot open log %s: %s" msgid "cannot open log %s: %s"
msgstr "kann %s nicht öffnen: %s" msgstr "Kann Logdatei %s nicht öffnen: %s"
#: dnsmasq.c:933 #: dnsmasq.c:933
#, fuzzy, c-format #, c-format
msgid "failed to load Lua script: %s" msgid "failed to load Lua script: %s"
msgstr "konnte %s nicht lesen: %s" msgstr "Konnte Lua-Script nicht laden: %s"
#: dnsmasq.c:1002 #: dnsmasq.c:1002
#, fuzzy, c-format #, c-format
msgid "script process killed by signal %d" msgid "script process killed by signal %d"
msgstr "Tochterprozess durch Signal %d zerstört" msgstr "Scriptprozess durch Signal %d getötet"
#: dnsmasq.c:1006 #: dnsmasq.c:1006
#, fuzzy, c-format #, c-format
msgid "script process exited with status %d" msgid "script process exited with status %d"
msgstr "Tochterprozess beendete sich mit Status %d" msgstr "Scriptprozess hat sich mit Status %d beendet"
#: dnsmasq.c:1010 #: dnsmasq.c:1010
#, c-format #, c-format
@@ -1309,22 +1311,23 @@ msgstr "Ignoriere Domäne %s für DHCP-Hostnamen %s"
#: rfc2131.c:337 #: rfc2131.c:337
#, c-format #, c-format
msgid "no address range available for DHCP request %s %s" msgid "no address range available for DHCP request %s %s"
msgstr "" msgstr "Kein verfügbarer DHCP-Bereich für Anfrage %s %s"
#: rfc2131.c:338 #: rfc2131.c:338
msgid "with subnet selector" msgid "with subnet selector"
msgstr "" msgstr "mit Subnetz-Wähler"
#: rfc2131.c:338 #: rfc2131.c:338
msgid "via" msgid "via"
msgstr "" msgstr "via"
#: rfc2131.c:350 #: rfc2131.c:350
#, c-format #, c-format
msgid "%u available DHCP subnet: %s/%s" msgid "%u available DHCP subnet: %s/%s"
msgstr "%u verfügbare(s) DHCP-Subnetz: %s/%s" msgstr "%u verfügbare(s) DHCP-Subnetz: %s/%s"
#: rfc2131.c:353 rfc3315.c:209 #: rfc2131.c:353
#: rfc3315.c:209
#, c-format #, c-format
msgid "%u available DHCP range: %s -- %s" msgid "%u available DHCP range: %s -- %s"
msgstr "%u verfügbare(r) DHCP-Bereich: %s - %s" msgstr "%u verfügbare(r) DHCP-Bereich: %s - %s"
@@ -1332,33 +1335,40 @@ msgstr "%u verfügbare(r) DHCP-Bereich: %s - %s"
# FIXME: do not programmatically assemble strings - untranslatable # FIXME: do not programmatically assemble strings - untranslatable
#: rfc2131.c:382 #: rfc2131.c:382
msgid "disabled" msgid "disabled"
msgstr "" msgstr "deaktiviert"
#: rfc2131.c:423 rfc2131.c:941 rfc2131.c:1341 #: rfc2131.c:423
#: rfc2131.c:941
#: rfc2131.c:1341
msgid "ignored" msgid "ignored"
msgstr "" msgstr "ignoriert"
#: rfc2131.c:438 rfc2131.c:1179 #: rfc2131.c:438
#: rfc2131.c:1179
msgid "address in use" msgid "address in use"
msgstr "" msgstr "Adresse in Nutzung"
#: rfc2131.c:452 rfc2131.c:995 #: rfc2131.c:452
#: rfc2131.c:995
msgid "no address available" msgid "no address available"
msgstr "" msgstr "Keine Adresse verfügbar"
#: rfc2131.c:459 rfc2131.c:1142 #: rfc2131.c:459
#: rfc2131.c:1142
msgid "wrong network" msgid "wrong network"
msgstr "" msgstr "Falsches Netzwerk"
#: rfc2131.c:474 #: rfc2131.c:474
msgid "no address configured" msgid "no address configured"
msgstr "" msgstr "Keine Adresse konfiguriert"
#: rfc2131.c:480 rfc2131.c:1192 #: rfc2131.c:480
#: rfc2131.c:1192
msgid "no leases left" msgid "no leases left"
msgstr "" msgstr "Keine Leases übrig"
#: rfc2131.c:564 rfc3315.c:362 #: rfc2131.c:564
#: rfc3315.c:362
#, c-format #, c-format
msgid "%u client provides name: %s" msgid "%u client provides name: %s"
msgstr "%u Klient stellt Name bereit: %s" msgstr "%u Klient stellt Name bereit: %s"
@@ -1377,7 +1387,8 @@ msgstr "%u Benutzerklasse: %s"
msgid "PXE BIS not supported" msgid "PXE BIS not supported"
msgstr "PXE BIS nicht unterstützt" msgstr "PXE BIS nicht unterstützt"
#: rfc2131.c:911 rfc3315.c:1098 #: rfc2131.c:911
#: rfc3315.c:1098
#, c-format #, c-format
msgid "disabling DHCP static address %s for %s" msgid "disabling DHCP static address %s for %s"
msgstr "schalte statische DHCP-Adresse %s für %s ab" msgstr "schalte statische DHCP-Adresse %s für %s ab"
@@ -1385,9 +1396,10 @@ msgstr "schalte statische DHCP-Adresse %s für %s ab"
# FIXME: do not assemble # FIXME: do not assemble
#: rfc2131.c:932 #: rfc2131.c:932
msgid "unknown lease" msgid "unknown lease"
msgstr "" msgstr "Unbekannter Lease"
#: rfc2131.c:964 rfc3315.c:556 #: rfc2131.c:964
#: rfc3315.c:556
#, c-format #, c-format
msgid "not using configured address %s because it is leased to %s" msgid "not using configured address %s because it is leased to %s"
msgstr "benutze konfigurierte Adresse %s nicht, weil sie an %s verleast ist" msgstr "benutze konfigurierte Adresse %s nicht, weil sie an %s verleast ist"
@@ -1397,39 +1409,41 @@ msgstr "benutze konfigurierte Adresse %s nicht, weil sie an %s verleast ist"
msgid "not using configured address %s because it is in use by the server or relay" msgid "not using configured address %s because it is in use by the server or relay"
msgstr "benutze konfigurierte Adresse %s nicht, weil sie von Server/Relais verwendet wird" msgstr "benutze konfigurierte Adresse %s nicht, weil sie von Server/Relais verwendet wird"
#: rfc2131.c:977 rfc3315.c:560 #: rfc2131.c:977
#: rfc3315.c:560
#, c-format #, c-format
msgid "not using configured address %s because it was previously declined" msgid "not using configured address %s because it was previously declined"
msgstr "benutze konfigurierte Adresse %s nicht, weil sie zuvor abgelehnt wurde" msgstr "benutze konfigurierte Adresse %s nicht, weil sie zuvor abgelehnt wurde"
# FIXME: do not assemble # FIXME: do not assemble
#: rfc2131.c:993 rfc2131.c:1185 #: rfc2131.c:993
#: rfc2131.c:1185
msgid "no unique-id" msgid "no unique-id"
msgstr "" msgstr "Keine eindeutige ID"
#: rfc2131.c:1080 #: rfc2131.c:1080
msgid "wrong server-ID" msgid "wrong server-ID"
msgstr "" msgstr "Falsche Server-ID"
#: rfc2131.c:1099 #: rfc2131.c:1099
msgid "wrong address" msgid "wrong address"
msgstr "" msgstr "Falsche Adresse"
#: rfc2131.c:1117 #: rfc2131.c:1117
msgid "lease not found" msgid "lease not found"
msgstr "" msgstr "Lease nicht gefunden"
#: rfc2131.c:1150 #: rfc2131.c:1150
msgid "address not available" msgid "address not available"
msgstr "" msgstr "Adresse nicht verfügbar"
#: rfc2131.c:1161 #: rfc2131.c:1161
msgid "static lease available" msgid "static lease available"
msgstr "" msgstr "Statischer Lease verfügbar"
#: rfc2131.c:1165 #: rfc2131.c:1165
msgid "address reserved" msgid "address reserved"
msgstr "" msgstr "Adresse reserviert"
#: rfc2131.c:1173 #: rfc2131.c:1173
#, c-format #, c-format
@@ -1465,7 +1479,8 @@ msgstr "kann DHCP/BOOTP-Opition %d nicht setzen: kein Platz mehr im Paket"
msgid "PXE menu too large" msgid "PXE menu too large"
msgstr "PXE-Menüeintrag zu groß" msgstr "PXE-Menüeintrag zu groß"
#: rfc2131.c:2117 rfc3315.c:1294 #: rfc2131.c:2117
#: rfc3315.c:1294
#, c-format #, c-format
msgid "%u requested options: %s" msgid "%u requested options: %s"
msgstr "%u angeforderte Optionen: %s" msgstr "%u angeforderte Optionen: %s"
@@ -1509,7 +1524,7 @@ msgstr "DHCP-Anfrage für nicht unterstützen Hardwaretyp (%d) auf %s empfangen"
#: helper.c:140 #: helper.c:140
msgid "lease() function missing in Lua script" msgid "lease() function missing in Lua script"
msgstr "" msgstr "Die Funktion lease() fehlt im Lua-Script"
#: tftp.c:285 #: tftp.c:285
msgid "unable to get free port for TFTP" msgid "unable to get free port for TFTP"
@@ -1557,37 +1572,37 @@ msgstr "Start fehlgeschlagen"
#: conntrack.c:65 #: conntrack.c:65
#, c-format #, c-format
msgid "Conntrack connection mark retrieval failed: %s" msgid "Conntrack connection mark retrieval failed: %s"
msgstr "" msgstr "\"Conntrack connection mark\"-Abruf fehlgeschlagen: %s"
#: dhcp6.c:46 #: dhcp6.c:46
#, fuzzy, c-format #, c-format
msgid "cannot create DHCPv6 socket: %s" msgid "cannot create DHCPv6 socket: %s"
msgstr "kann DHCP-Socket nicht erzeugen: %s" msgstr "Kann DHCPv6-Socket nicht erzeugen: %s"
#: dhcp6.c:57 #: dhcp6.c:57
#, fuzzy, c-format #, c-format
msgid "failed to bind DHCPv6 server socket: %s" msgid "failed to bind DHCPv6 server socket: %s"
msgstr "kann nicht an DHCP-Server-Socket binden: %s" msgstr "Kann nicht an DHCPv6-Server-Socket binden: %s"
#: rfc3315.c:94 #: rfc3315.c:94
#, c-format #, c-format
msgid "no address range available for DHCPv6 request from relay at %s" msgid "no address range available for DHCPv6 request from relay at %s"
msgstr "" msgstr "Kein Adressbereich verfügbar für die DHCPv6-Anfrage vom Relay bei %s"
#: rfc3315.c:103 #: rfc3315.c:103
#, c-format #, c-format
msgid "no address range available for DHCPv6 request via %s" msgid "no address range available for DHCPv6 request via %s"
msgstr "" msgstr "Kein Adressbereich verfügbar für die DHCPv6-Anfrage via %s"
#: rfc3315.c:206 #: rfc3315.c:206
#, fuzzy, c-format #, c-format
msgid "%u available DHCPv6 subnet: %s/%d" msgid "%u available DHCPv6 subnet: %s/%d"
msgstr "%u verfügbare(s) DHCP-Subnetz: %s/%s" msgstr "%u verfügbare(s) DHCPv6-Subnetz: %s/%d"
#: dhcp-common.c:138 #: dhcp-common.c:138
#, c-format #, c-format
msgid "Ignoring duplicate dhcp-option %d" msgid "Ignoring duplicate dhcp-option %d"
msgstr "" msgstr "Ignoriere doppelt vorhandene DHCP-Option %d"
#: dhcp-common.c:208 #: dhcp-common.c:208
#, c-format #, c-format
@@ -1615,14 +1630,14 @@ msgid "duplicate IP address %s (%s) in dhcp-config directive"
msgstr "doppelte IP-Adresse %s (%s) in \"dhcp-config\"-Anweisung" msgstr "doppelte IP-Adresse %s (%s) in \"dhcp-config\"-Anweisung"
#: dhcp-common.c:443 #: dhcp-common.c:443
#, fuzzy, c-format #, c-format
msgid "failed to join DHCPv6 multicast group: %s" msgid "failed to join DHCPv6 multicast group: %s"
msgstr "kann nicht an DHCP-Server-Socket binden: %s" msgstr "Konnte DHCPv6-Multicast-Gruppe nicht beitreten: %s"
#: radv.c:76 #: radv.c:76
#, fuzzy, c-format #, c-format
msgid "cannot create ICMPv6 socket: %s" msgid "cannot create ICMPv6 socket: %s"
msgstr "kann DHCP-Socket nicht erzeugen: %s" msgstr "Kann ICMPv6-Socket nicht erzeugen: %s"
#, fuzzy #, fuzzy
#~ msgid "Specify path to Lua script (no default)." #~ msgid "Specify path to Lua script (no default)."
+1
View File
@@ -20,6 +20,7 @@
#include <ifaddrs.h> #include <ifaddrs.h>
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
#include <sys/param.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <net/route.h> #include <net/route.h>
#include <net/if_dl.h> #include <net/if_dl.h>
+51 -37
View File
@@ -243,7 +243,7 @@ static int is_outdated_cname_pointer(struct crec *crecp)
/* NB. record may be reused as DS or DNSKEY, where uid is /* NB. record may be reused as DS or DNSKEY, where uid is
overloaded for something completely different */ overloaded for something completely different */
if (crecp->addr.cname.cache && if (crecp->addr.cname.cache &&
(crecp->addr.cname.cache->flags & (F_IPV4 | F_IPV6)) && (crecp->addr.cname.cache->flags & (F_IPV4 | F_IPV6 | F_CNAME)) &&
crecp->addr.cname.uid == crecp->addr.cname.cache->uid) crecp->addr.cname.uid == crecp->addr.cname.cache->uid)
return 0; return 0;
@@ -645,13 +645,29 @@ struct crec *cache_find_by_addr(struct crec *crecp, struct all_addr *addr,
return NULL; return NULL;
} }
static void add_hosts_cname(struct crec *target)
{
struct crec *crec;
struct cname *a;
for (a = daemon->cnames; a; a = a->next)
if (hostname_isequal(cache_get_name(target), a->target) &&
(crec = whine_malloc(sizeof(struct crec))))
{
crec->flags = F_FORWARD | F_IMMORTAL | F_NAMEP | F_HOSTS | F_CNAME;
crec->name.namep = a->alias;
crec->addr.cname.cache = target;
crec->addr.cname.uid = target->uid;
cache_hash(crec);
add_hosts_cname(crec); /* handle chains */
}
}
static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrlen, static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrlen,
int index, struct crec **rhash, int hashsz) int index, struct crec **rhash, int hashsz)
{ {
struct crec *lookup = cache_find_by_name(NULL, cache_get_name(cache), 0, cache->flags & (F_IPV4 | F_IPV6)); struct crec *lookup = cache_find_by_name(NULL, cache_get_name(cache), 0, cache->flags & (F_IPV4 | F_IPV6));
int i, nameexists = 0; int i, nameexists = 0;
struct cname *a;
unsigned int j; unsigned int j;
/* Remove duplicates in hosts files. */ /* Remove duplicates in hosts files. */
@@ -702,16 +718,7 @@ static void add_hosts_entry(struct crec *cache, struct all_addr *addr, int addrl
/* don't need to do alias stuff for second and subsequent addresses. */ /* don't need to do alias stuff for second and subsequent addresses. */
if (!nameexists) if (!nameexists)
for (a = daemon->cnames; a; a = a->next) add_hosts_cname(cache);
if (hostname_isequal(cache_get_name(cache), a->target) &&
(lookup = whine_malloc(sizeof(struct crec))))
{
lookup->flags = F_FORWARD | F_IMMORTAL | F_NAMEP | F_HOSTS | F_CNAME;
lookup->name.namep = a->alias;
lookup->addr.cname.cache = cache;
lookup->addr.cname.uid = index;
cache_hash(lookup);
}
} }
static int eatspace(FILE *f) static int eatspace(FILE *f)
@@ -1003,13 +1010,41 @@ void cache_unhash_dhcp(void)
up = &cache->hash_next; up = &cache->hash_next;
} }
static void add_dhcp_cname(struct crec *target, time_t ttd)
{
struct crec *aliasc;
struct cname *a;
for (a = daemon->cnames; a; a = a->next)
if (hostname_isequal(cache_get_name(target), a->target))
{
if ((aliasc = dhcp_spare))
dhcp_spare = dhcp_spare->next;
else /* need new one */
aliasc = whine_malloc(sizeof(struct crec));
if (aliasc)
{
aliasc->flags = F_FORWARD | F_NAMEP | F_DHCP | F_CNAME;
if (ttd == 0)
aliasc->flags |= F_IMMORTAL;
else
aliasc->ttd = ttd;
aliasc->name.namep = a->alias;
aliasc->addr.cname.cache = target;
aliasc->addr.cname.uid = target->uid;
cache_hash(aliasc);
add_dhcp_cname(aliasc, ttd);
}
}
}
void cache_add_dhcp_entry(char *host_name, int prot, void cache_add_dhcp_entry(char *host_name, int prot,
struct all_addr *host_address, time_t ttd) struct all_addr *host_address, time_t ttd)
{ {
struct crec *crec = NULL, *aliasc; struct crec *crec = NULL;
unsigned short flags = F_IPV4; unsigned short flags = F_IPV4;
int in_hosts = 0; int in_hosts = 0;
struct cname *a;
size_t addrlen = sizeof(struct in_addr); size_t addrlen = sizeof(struct in_addr);
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
@@ -1030,7 +1065,6 @@ void cache_add_dhcp_entry(char *host_name, int prot,
inet_ntop(prot, host_address, daemon->addrbuff, ADDRSTRLEN); inet_ntop(prot, host_address, daemon->addrbuff, ADDRSTRLEN);
if (crec->flags & F_CNAME) if (crec->flags & F_CNAME)
my_syslog(MS_DHCP | LOG_WARNING, my_syslog(MS_DHCP | LOG_WARNING,
_("%s is a CNAME, not giving it to the DHCP lease of %s"), _("%s is a CNAME, not giving it to the DHCP lease of %s"),
host_name, daemon->addrbuff); host_name, daemon->addrbuff);
@@ -1083,27 +1117,7 @@ void cache_add_dhcp_entry(char *host_name, int prot,
crec->uid = uid++; crec->uid = uid++;
cache_hash(crec); cache_hash(crec);
for (a = daemon->cnames; a; a = a->next) add_dhcp_cname(crec, ttd);
if (hostname_isequal(host_name, a->target))
{
if ((aliasc = dhcp_spare))
dhcp_spare = dhcp_spare->next;
else /* need new one */
aliasc = whine_malloc(sizeof(struct crec));
if (aliasc)
{
aliasc->flags = F_FORWARD | F_NAMEP | F_DHCP | F_CNAME;
if (ttd == 0)
aliasc->flags |= F_IMMORTAL;
else
aliasc->ttd = ttd;
aliasc->name.namep = a->alias;
aliasc->addr.cname.cache = crec;
aliasc->addr.cname.uid = crec->uid;
cache_hash(aliasc);
}
}
} }
} }
#endif #endif
+7 -2
View File
@@ -33,7 +33,6 @@
#define SMALLDNAME 40 /* most domain names are smaller than this */ #define SMALLDNAME 40 /* most domain names are smaller than this */
#define HOSTSFILE "/etc/hosts" #define HOSTSFILE "/etc/hosts"
#define ETHERSFILE "/etc/ethers" #define ETHERSFILE "/etc/ethers"
#define RUNFILE "/var/run/dnsmasq.pid"
#define DEFLEASE 3600 /* default lease time, 1 hour */ #define DEFLEASE 3600 /* default lease time, 1 hour */
#define CHUSER "nobody" #define CHUSER "nobody"
#define CHGRP "dip" #define CHGRP "dip"
@@ -158,7 +157,13 @@ RESOLVFILE
# endif # endif
#endif #endif
#ifndef RUNFILE
# if defined(__ANDROID__)
# define RUNFILE "/data/dnsmasq.pid"
# else
# define RUNFILE "/var/run/dnsmasq.pid"
# endif
#endif
/* platform dependent options: these are determined automatically below /* platform dependent options: these are determined automatically below
+9 -48
View File
@@ -246,40 +246,6 @@ int match_bytes(struct dhcp_opt *o, unsigned char *p, int len)
return 0; return 0;
} }
void check_dhcp_hosts(int fatal)
{
/* If the same IP appears in more than one host config, then DISCOVER
for one of the hosts will get the address, but REQUEST will be NAKed,
since the address is reserved by the other one -> protocol loop.
Also check that FQDNs match the domain we are using. */
struct dhcp_config *configs, *cp;
for (configs = daemon->dhcp_conf; configs; configs = configs->next)
{
char *domain;
if ((configs->flags & DHOPT_BANK) || fatal)
{
for (cp = configs->next; cp; cp = cp->next)
if ((configs->flags & cp->flags & CONFIG_ADDR) && configs->addr.s_addr == cp->addr.s_addr)
{
if (fatal)
die(_("duplicate IP address %s in dhcp-config directive."),
inet_ntoa(cp->addr), EC_BADCONF);
else
my_syslog(MS_DHCP | LOG_ERR, _("duplicate IP address %s in %s."),
inet_ntoa(cp->addr), daemon->dhcp_hosts_file);
configs->flags &= ~CONFIG_ADDR;
}
/* split off domain part */
if ((configs->flags & CONFIG_NAME) && (domain = strip_hostname(configs->hostname)))
configs->domain = domain;
}
}
}
void dhcp_update_configs(struct dhcp_config *configs) void dhcp_update_configs(struct dhcp_config *configs)
{ {
/* Some people like to keep all static IP addresses in /etc/hosts. /* Some people like to keep all static IP addresses in /etc/hosts.
@@ -372,7 +338,6 @@ static int join_multicast_worker(struct in6_addr *local, int prefix,
char ifrn_name[IFNAMSIZ]; char ifrn_name[IFNAMSIZ];
struct ipv6_mreq mreq; struct ipv6_mreq mreq;
int fd, i, max = *((int *)vparam); int fd, i, max = *((int *)vparam);
struct dhcp_context *context;
struct iname *tmp; struct iname *tmp;
(void)prefix; (void)prefix;
@@ -406,14 +371,6 @@ static int join_multicast_worker(struct in6_addr *local, int prefix,
if (tmp->name && (strcmp(tmp->name, ifrn_name) == 0)) if (tmp->name && (strcmp(tmp->name, ifrn_name) == 0))
return 1; return 1;
/* weird libvirt-inspired access control */
for (context = daemon->dhcp6; context; context = context->next)
if (!context->interface || strcmp(context->interface, ifrn_name) == 0)
break;
if (!context)
return 1;
mreq.ipv6mr_interface = if_index; mreq.ipv6mr_interface = if_index;
inet_pton(AF_INET6, ALL_RELAY_AGENTS_AND_SERVERS, &mreq.ipv6mr_multiaddr); inet_pton(AF_INET6, ALL_RELAY_AGENTS_AND_SERVERS, &mreq.ipv6mr_multiaddr);
@@ -530,15 +487,15 @@ static const struct opttab_t {
{ "x-windows-fs", 48, OT_ADDR_LIST }, { "x-windows-fs", 48, OT_ADDR_LIST },
{ "x-windows-dm", 49, OT_ADDR_LIST }, { "x-windows-dm", 49, OT_ADDR_LIST },
{ "requested-address", 50, OT_INTERNAL | OT_ADDR_LIST }, { "requested-address", 50, OT_INTERNAL | OT_ADDR_LIST },
{ "lease-time", 51, OT_INTERNAL | OT_DEC }, { "lease-time", 51, OT_INTERNAL | OT_TIME },
{ "option-overload", 52, OT_INTERNAL }, { "option-overload", 52, OT_INTERNAL },
{ "message-type", 53, OT_INTERNAL | OT_DEC }, { "message-type", 53, OT_INTERNAL | OT_DEC },
{ "server-identifier", 54, OT_INTERNAL | OT_ADDR_LIST }, { "server-identifier", 54, OT_INTERNAL | OT_ADDR_LIST },
{ "parameter-request", 55, OT_INTERNAL }, { "parameter-request", 55, OT_INTERNAL },
{ "message", 56, OT_INTERNAL }, { "message", 56, OT_INTERNAL },
{ "max-message-size", 57, OT_INTERNAL }, { "max-message-size", 57, OT_INTERNAL },
{ "T1", 58, OT_INTERNAL | OT_DEC}, { "T1", 58, OT_INTERNAL | OT_TIME},
{ "T2", 59, OT_INTERNAL | OT_DEC}, { "T2", 59, OT_INTERNAL | OT_TIME},
{ "vendor-class", 60, 0 }, { "vendor-class", 60, 0 },
{ "client-id", 61, OT_INTERNAL }, { "client-id", 61, OT_INTERNAL },
{ "nis+-domain", 64, OT_NAME }, { "nis+-domain", 64, OT_NAME },
@@ -589,6 +546,7 @@ static const struct opttab_t opttab6[] = {
{ "nis-domain", 29, OT_RFC1035_NAME }, { "nis-domain", 29, OT_RFC1035_NAME },
{ "nis+-domain", 30, OT_RFC1035_NAME }, { "nis+-domain", 30, OT_RFC1035_NAME },
{ "sntp-server", 31, OT_ADDR_LIST }, { "sntp-server", 31, OT_ADDR_LIST },
{ "information-refresh-time", 32, OT_TIME },
{ "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME }, { "FQDN", 39, OT_INTERNAL | OT_RFC1035_NAME },
{ "ntp-server", 56, OT_ADDR_LIST }, { "ntp-server", 56, OT_ADDR_LIST },
{ "bootfile-url", 59, OT_NAME }, { "bootfile-url", 59, OT_NAME },
@@ -753,14 +711,17 @@ char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len,
} }
} }
#endif #endif
else if ((ot[o].size & OT_DEC) && opt_len != 0) else if ((ot[o].size & (OT_DEC | OT_TIME)) && opt_len != 0)
{ {
unsigned int dec = 0; unsigned int dec = 0;
for (i = 0; i < opt_len; i++) for (i = 0; i < opt_len; i++)
dec = (dec << 8) | val[i]; dec = (dec << 8) | val[i];
sprintf(buf, "%u", dec); if (ot[o].size & OT_TIME)
prettyprint_time(buf, dec);
else
sprintf(buf, "%u", dec);
} }
else else
nodecode = 1; nodecode = 1;
+3 -13
View File
@@ -66,7 +66,7 @@ static int make_fd(int port)
/* When bind-interfaces is set, there might be more than one dnmsasq /* When bind-interfaces is set, there might be more than one dnmsasq
instance binding port 67. That's OK if they serve different networks. instance binding port 67. That's OK if they serve different networks.
Need to set REUSEADDR to make this posible, or REUSEPORT on *BSD. */ Need to set REUSEADDR to make this posible, or REUSEPORT on *BSD. */
if (option_bool(OPT_NOWILD)) if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
{ {
#ifdef SO_REUSEPORT #ifdef SO_REUSEPORT
int rc = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &oneopt, sizeof(oneopt)); int rc = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &oneopt, sizeof(oneopt));
@@ -116,9 +116,7 @@ void dhcp_init(void)
/* Make BPF raw send socket */ /* Make BPF raw send socket */
init_bpf(); init_bpf();
#endif #endif
check_dhcp_hosts(1);
} }
void dhcp_packet(time_t now, int pxe_fd) void dhcp_packet(time_t now, int pxe_fd)
@@ -257,14 +255,6 @@ void dhcp_packet(time_t now, int pxe_fd)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
return; return;
/* weird libvirt-inspired access control */
for (context = daemon->dhcp; context; context = context->next)
if (!context->interface || strcmp(context->interface, ifr.ifr_name) == 0)
break;
if (!context)
return;
/* unlinked contexts are marked by context->current == context */ /* unlinked contexts are marked by context->current == context */
for (context = daemon->dhcp; context; context = context->next) for (context = daemon->dhcp; context; context = context->next)
context->current = context; context->current = context;
@@ -277,7 +267,7 @@ void dhcp_packet(time_t now, int pxe_fd)
/* If we failed to match the primary address of the interface, see if we've got a --listen-address /* If we failed to match the primary address of the interface, see if we've got a --listen-address
for a secondary */ for a secondary */
struct match_param match; struct match_param match;
match.matched = 0; match.matched = 0;
match.ind = iface_index; match.ind = iface_index;
-8
View File
@@ -111,14 +111,6 @@ void dhcp6_packet(time_t now)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0)) if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
return; return;
/* weird libvirt-inspired access control */
for (context = daemon->dhcp6; context; context = context->next)
if (!context->interface || strcmp(context->interface, ifr.ifr_name) == 0)
break;
if (!context)
return;
/* unlinked contexts are marked by context->current == context */ /* unlinked contexts are marked by context->current == context */
for (context = daemon->dhcp6; context; context = context->next) for (context = daemon->dhcp6; context; context = context->next)
{ {
+64 -28
View File
@@ -114,10 +114,18 @@ int main (int argc, char **argv)
set_option_bool(OPT_NOWILD); set_option_bool(OPT_NOWILD);
} }
# endif # endif
/* -- bind-dynamic not supported on !Linux, fall back to --bind-interfaces */
if (option_bool(OPT_CLEVERBIND))
{
bind_fallback = 1;
set_option_bool(OPT_NOWILD);
reset_option_bool(OPT_CLEVERBIND);
}
#endif #endif
#ifndef HAVE_TFTP #ifndef HAVE_TFTP
if (daemon->tftp_unlimited || daemon->tftp_interfaces) if (option_bool(OPT_TFTP))
die(_("TFTP server not available: set HAVE_TFTP in src/config.h"), NULL, EC_BADCONF); die(_("TFTP server not available: set HAVE_TFTP in src/config.h"), NULL, EC_BADCONF);
#endif #endif
@@ -185,6 +193,9 @@ int main (int argc, char **argv)
#ifdef HAVE_LINUX_NETWORK #ifdef HAVE_LINUX_NETWORK
/* After lease_init */ /* After lease_init */
netlink_init(); netlink_init();
if (option_bool(OPT_NOWILD) && option_bool(OPT_CLEVERBIND))
die(_("cannot set --bind-interfaces and --bind-dynamic"), NULL, EC_BADCONF);
#endif #endif
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
@@ -202,13 +213,14 @@ int main (int argc, char **argv)
if (!enumerate_interfaces()) if (!enumerate_interfaces())
die(_("failed to find list of interfaces: %s"), NULL, EC_MISC); die(_("failed to find list of interfaces: %s"), NULL, EC_MISC);
if (option_bool(OPT_NOWILD)) if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
{ {
create_bound_listeners(1); create_bound_listeners(1);
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next) if (!option_bool(OPT_CLEVERBIND))
if (if_tmp->name && !if_tmp->used) for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
die(_("unknown interface %s"), if_tmp->name, EC_BADNET); if (if_tmp->name && !if_tmp->used)
die(_("unknown interface %s"), if_tmp->name, EC_BADNET);
#if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP) #if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP)
/* after enumerate_interfaces() */ /* after enumerate_interfaces() */
@@ -425,8 +437,9 @@ int main (int argc, char **argv)
#if defined(HAVE_LINUX_NETWORK) #if defined(HAVE_LINUX_NETWORK)
/* On linux, we keep CAP_NETADMIN (for ARP-injection) and /* On linux, we keep CAP_NETADMIN (for ARP-injection) and
CAP_NET_RAW (for icmp) if we're doing dhcp. If we have yet to bind CAP_NET_RAW (for icmp) if we're doing dhcp. If we have yet to bind
ports because of DAD, we need CAP_NET_BIND_SERVICE too. */ ports because of DAD, or we're doing it dynamically,
if (is_dad_listeners()) we need CAP_NET_BIND_SERVICE too. */
if (is_dad_listeners() || option_bool(OPT_CLEVERBIND))
data->effective = data->permitted = data->inheritable = data->effective = data->permitted = data->inheritable =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) | (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) |
(1 << CAP_SETUID) | (1 << CAP_NET_BIND_SERVICE); (1 << CAP_SETUID) | (1 << CAP_NET_BIND_SERVICE);
@@ -474,7 +487,7 @@ int main (int argc, char **argv)
} }
#ifdef HAVE_LINUX_NETWORK #ifdef HAVE_LINUX_NETWORK
if (is_dad_listeners()) if (is_dad_listeners() || option_bool(OPT_CLEVERBIND))
data->effective = data->permitted = data->effective = data->permitted =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) | (1 << CAP_NET_BIND_SERVICE); (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) | (1 << CAP_NET_BIND_SERVICE);
else else
@@ -498,6 +511,34 @@ int main (int argc, char **argv)
prctl(PR_SET_DUMPABLE, 1, 0, 0, 0); prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
#endif #endif
#ifdef HAVE_TFTP
if (option_bool(OPT_TFTP))
{
DIR *dir;
struct tftp_prefix *p;
if (daemon->tftp_prefix)
{
if (!((dir = opendir(daemon->tftp_prefix))))
{
send_event(err_pipe[1], EVENT_TFTP_ERR, errno, daemon->tftp_prefix);
_exit(0);
}
closedir(dir);
}
for (p = daemon->if_prefix; p; p = p->next)
{
if (!((dir = opendir(p->prefix))))
{
send_event(err_pipe[1], EVENT_TFTP_ERR, errno, p->prefix);
_exit(0);
}
closedir(dir);
}
}
#endif
if (daemon->port == 0) if (daemon->port == 0)
my_syslog(LOG_INFO, _("started, version %s DNS disabled"), VERSION); my_syslog(LOG_INFO, _("started, version %s DNS disabled"), VERSION);
else if (daemon->cachesize != 0) else if (daemon->cachesize != 0)
@@ -627,7 +668,7 @@ int main (int argc, char **argv)
#ifdef HAVE_TFTP #ifdef HAVE_TFTP
if (daemon->tftp_unlimited || daemon->tftp_interfaces) if (option_bool(OPT_TFTP))
{ {
#ifdef FD_SETSIZE #ifdef FD_SETSIZE
if (FD_SETSIZE < (unsigned)max_fd) if (FD_SETSIZE < (unsigned)max_fd)
@@ -849,14 +890,11 @@ int main (int argc, char **argv)
} }
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
if (daemon->dhcp6) if (daemon->dhcp6 && FD_ISSET(daemon->dhcp6fd, &rset))
{ dhcp6_packet(now);
if (FD_ISSET(daemon->dhcp6fd, &rset))
dhcp6_packet(now);
if (daemon->ra_contexts && FD_ISSET(daemon->icmp6fd, &rset)) if (daemon->ra_contexts && FD_ISSET(daemon->icmp6fd, &rset))
icmp6_packet(); icmp6_packet();
}
#endif #endif
# ifdef HAVE_SCRIPT # ifdef HAVE_SCRIPT
@@ -998,6 +1036,9 @@ static void fatal_event(struct event_desc *ev, char *msg)
case EVENT_LUA_ERR: case EVENT_LUA_ERR:
die(_("failed to load Lua script: %s"), msg, EC_MISC); die(_("failed to load Lua script: %s"), msg, EC_MISC);
case EVENT_TFTP_ERR:
die(_("TFTP directory %s inaccessible: %s"), msg, EC_FILE);
} }
} }
@@ -1202,20 +1243,15 @@ void clear_cache_and_reload(time_t now)
dhcp_read_ethers(); dhcp_read_ethers();
reread_dhcp(); reread_dhcp();
dhcp_update_configs(daemon->dhcp_conf); dhcp_update_configs(daemon->dhcp_conf);
check_dhcp_hosts(0);
lease_update_from_configs(); lease_update_from_configs();
lease_update_file(now); lease_update_file(now);
lease_update_dns(1); lease_update_dns(1);
} }
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
else if (daemon->ra_contexts) else if (daemon->ra_contexts)
{ /* Not doing DHCP, so no lease system, manage
/* Not doing DHCP, so no lease system, manage alarms for ra only */
alarms for ra only */ send_alarm(periodic_ra(now), now);
time_t next_event = periodic_ra(now);
if (next_event != 0)
alarm((unsigned)difftime(next_event, now));
}
#endif #endif
#endif #endif
} }
@@ -1328,7 +1364,7 @@ static void check_dns_listeners(fd_set *set, time_t now)
getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) == -1) getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) == -1)
continue; continue;
if (option_bool(OPT_NOWILD)) if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
iface = listener->iface; /* May be NULL */ iface = listener->iface; /* May be NULL */
else else
{ {
@@ -1345,7 +1381,7 @@ static void check_dns_listeners(fd_set *set, time_t now)
break; break;
} }
if (!iface && !option_bool(OPT_NOWILD)) if (!iface && !(option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND)))
{ {
shutdown(confd, SHUT_RDWR); shutdown(confd, SHUT_RDWR);
close(confd); close(confd);
+8 -13
View File
@@ -159,6 +159,7 @@ struct event_desc {
#define EVENT_LOG_ERR 17 #define EVENT_LOG_ERR 17
#define EVENT_FORK_ERR 18 #define EVENT_FORK_ERR 18
#define EVENT_LUA_ERR 19 #define EVENT_LUA_ERR 19
#define EVENT_TFTP_ERR 20
/* Exit codes. */ /* Exit codes. */
#define EC_GOOD 0 #define EC_GOOD 0
@@ -218,7 +219,9 @@ struct event_desc {
#define OPT_FQDN_UPDATE 36 #define OPT_FQDN_UPDATE 36
#define OPT_RA 37 #define OPT_RA 37
#define OPT_TFTP_LC 38 #define OPT_TFTP_LC 38
#define OPT_LAST 39 #define OPT_CLEVERBIND 39
#define OPT_TFTP 40
#define OPT_LAST 41
/* extra flags for my_syslog, we use a couple of facilities since they are known /* extra flags for my_syslog, we use a couple of facilities since they are known
not to occupy the same bits as priorities, no matter how syslog.h is set up. */ not to occupy the same bits as priorities, no matter how syslog.h is set up. */
@@ -424,7 +427,7 @@ struct listener {
struct iname { struct iname {
char *name; char *name;
union mysockaddr addr; union mysockaddr addr;
int isloop, used; int used;
struct iname *next; struct iname *next;
}; };
@@ -472,7 +475,7 @@ struct frec {
#define OT_NAME 0x1000 #define OT_NAME 0x1000
#define OT_CSTRING 0x0800 #define OT_CSTRING 0x0800
#define OT_DEC 0x0400 #define OT_DEC 0x0400
#define OT_TIME 0x0200
/* actions in the daemon->helper RPC */ /* actions in the daemon->helper RPC */
#define ACTION_DEL 1 #define ACTION_DEL 1
@@ -662,7 +665,6 @@ struct dhcp_context {
time_t ra_time; time_t ra_time;
#endif #endif
int flags; int flags;
char *interface;
struct dhcp_netid netid, *filter; struct dhcp_netid netid, *filter;
struct dhcp_context *next, *current; struct dhcp_context *next, *current;
}; };
@@ -710,11 +712,6 @@ struct addr_list {
struct addr_list *next; struct addr_list *next;
}; };
struct interface_list {
char *interface;
struct interface_list *next;
};
struct tftp_prefix { struct tftp_prefix {
char *interface; char *interface;
char *prefix; char *prefix;
@@ -732,7 +729,7 @@ extern struct daemon {
time_t last_resolv; time_t last_resolv;
struct mx_srv_record *mxnames; struct mx_srv_record *mxnames;
struct naptr *naptr; struct naptr *naptr;
struct txt_record *txt; struct txt_record *txt, *rr;
struct ptr_record *ptr; struct ptr_record *ptr;
struct host_record *host_records, *host_records_tail; struct host_record *host_records, *host_records_tail;
struct cname *cnames; struct cname *cnames;
@@ -778,8 +775,6 @@ extern struct daemon {
unsigned short edns_pktsz; unsigned short edns_pktsz;
char *tftp_prefix; char *tftp_prefix;
struct tftp_prefix *if_prefix; /* per-interface TFTP prefixes */ struct tftp_prefix *if_prefix; /* per-interface TFTP prefixes */
struct interface_list *tftp_interfaces; /* interfaces for limited TFTP service */
int tftp_unlimited;
unsigned int duid_enterprise, duid_config_len; unsigned int duid_enterprise, duid_config_len;
unsigned char *duid_config; unsigned char *duid_config;
@@ -930,6 +925,7 @@ char *option_string(int prot, unsigned int opt, unsigned char *val,
int opt_len, char *buf, int buf_len); int opt_len, char *buf, int buf_len);
void reread_dhcp(void); void reread_dhcp(void);
void set_option_bool(unsigned int opt); void set_option_bool(unsigned int opt);
void reset_option_bool(unsigned int opt);
struct hostsfile *expand_filelist(struct hostsfile *list); struct hostsfile *expand_filelist(struct hostsfile *list);
/* forward.c */ /* forward.c */
@@ -1127,7 +1123,6 @@ char *strip_hostname(char *hostname);
void log_tags(struct dhcp_netid *netid, u32 xid); void log_tags(struct dhcp_netid *netid, u32 xid);
int match_bytes(struct dhcp_opt *o, unsigned char *p, int len); int match_bytes(struct dhcp_opt *o, unsigned char *p, int len);
void dhcp_update_configs(struct dhcp_config *configs); void dhcp_update_configs(struct dhcp_config *configs);
void check_dhcp_hosts(int fatal);
void display_opts(void); void display_opts(void);
u16 lookup_dhcp_opt(int prot, char *name); u16 lookup_dhcp_opt(int prot, char *name);
u16 lookup_dhcp_len(int prot, u16 val); u16 lookup_dhcp_len(int prot, u16 val);
+4 -4
View File
@@ -436,7 +436,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
if (udpfd != -1) if (udpfd != -1)
{ {
plen = setup_reply(header, plen, addrp, flags, daemon->local_ttl); plen = setup_reply(header, plen, addrp, flags, daemon->local_ttl);
send_from(udpfd, option_bool(OPT_NOWILD), (char *)header, plen, udpaddr, dst_addr, dst_iface); send_from(udpfd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND), (char *)header, plen, udpaddr, dst_addr, dst_iface);
} }
return 0; return 0;
@@ -624,7 +624,7 @@ void reply_query(int fd, int family, time_t now)
{ {
header->id = htons(forward->orig_id); header->id = htons(forward->orig_id);
header->hb4 |= HB4_RA; /* recursion if available */ header->hb4 |= HB4_RA; /* recursion if available */
send_from(forward->fd, option_bool(OPT_NOWILD), daemon->packet, nn, send_from(forward->fd, option_bool(OPT_NOWILD) || option_bool (OPT_CLEVERBIND), daemon->packet, nn,
&forward->source, &forward->dest, forward->iface); &forward->source, &forward->dest, forward->iface);
} }
free_frec(forward); /* cancel */ free_frec(forward); /* cancel */
@@ -819,8 +819,8 @@ void receive_query(struct listener *listen, time_t now)
dst_addr_4, netmask, now); dst_addr_4, netmask, now);
if (m >= 1) if (m >= 1)
{ {
send_from(listen->fd, option_bool(OPT_NOWILD), (char *)header, send_from(listen->fd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND),
m, &source_addr, &dst_addr, if_index); (char *)header, m, &source_addr, &dst_addr, if_index);
daemon->local_answer++; daemon->local_answer++;
} }
else if (forward_query(listen->fd, &source_addr, &dst_addr, if_index, else if (forward_query(listen->fd, &source_addr, &dst_addr, if_index,
+11 -4
View File
@@ -310,12 +310,19 @@ void lease_update_file(time_t now)
/* do timed RAs and determine when the next is, also pings to potential SLAAC addresses */ /* do timed RAs and determine when the next is, also pings to potential SLAAC addresses */
if (daemon->ra_contexts) if (daemon->ra_contexts)
{ {
time_t ra_event = periodic_slaac(now, leases); time_t event;
next_event = periodic_ra(now); if ((event = periodic_slaac(now, leases)) != 0)
{
if (next_event == 0 || difftime(next_event, event) > 0.0)
next_event = event;
}
if (next_event == 0 || difftime(next_event, ra_event) > 0.0) if ((event = periodic_ra(now)) != 0)
next_event = ra_event; {
if (next_event == 0 || difftime(next_event, event) > 0.0)
next_event = event;
}
} }
#endif #endif
+79 -58
View File
@@ -38,8 +38,7 @@
static struct iovec iov; static struct iovec iov;
static u32 netlink_pid; static u32 netlink_pid;
static void nl_err(struct nlmsghdr *h); static int nl_async(struct nlmsghdr *h);
static void nl_routechange(struct nlmsghdr *h);
void netlink_init(void) void netlink_init(void)
{ {
@@ -49,10 +48,13 @@ void netlink_init(void)
addr.nl_family = AF_NETLINK; addr.nl_family = AF_NETLINK;
addr.nl_pad = 0; addr.nl_pad = 0;
addr.nl_pid = 0; /* autobind */ addr.nl_pid = 0; /* autobind */
#ifdef HAVE_IPV6
addr.nl_groups = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
#else
addr.nl_groups = RTMGRP_IPV4_ROUTE; addr.nl_groups = RTMGRP_IPV4_ROUTE;
if (option_bool(OPT_CLEVERBIND))
addr.nl_groups |= RTMGRP_IPV4_IFADDR;
#ifdef HAVE_IPV6
addr.nl_groups |= RTMGRP_IPV6_ROUTE;
if (daemon->ra_contexts || option_bool(OPT_CLEVERBIND))
addr.nl_groups |= RTMGRP_IPV6_IFADDR;
#endif #endif
/* May not be able to have permission to set multicast groups don't die in that case */ /* May not be able to have permission to set multicast groups don't die in that case */
@@ -136,7 +138,7 @@ int iface_enumerate(int family, void *parm, int (*callback)())
struct nlmsghdr *h; struct nlmsghdr *h;
ssize_t len; ssize_t len;
static unsigned int seq = 0; static unsigned int seq = 0;
int callback_ok = 1; int callback_ok = 1, newaddr = 0;
struct { struct {
struct nlmsghdr nlh; struct nlmsghdr nlh;
@@ -182,12 +184,24 @@ int iface_enumerate(int family, void *parm, int (*callback)())
} }
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len)) for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
if (h->nlmsg_seq != seq || h->nlmsg_pid != netlink_pid) if (h->nlmsg_seq != seq || h->nlmsg_pid != netlink_pid || h->nlmsg_type == NLMSG_ERROR)
nl_routechange(h); /* May be multicast arriving async */ {
else if (h->nlmsg_type == NLMSG_ERROR) /* May be multicast arriving async */
nl_err(h); if (nl_async(h) && option_bool(OPT_CLEVERBIND))
newaddr = 1;
}
else if (h->nlmsg_type == NLMSG_DONE) else if (h->nlmsg_type == NLMSG_DONE)
return callback_ok; {
/* handle async new interface address arrivals, these have to be done
after we complete as we're not re-entrant */
if (newaddr)
{
enumerate_interfaces();
create_bound_listeners(0);
}
return callback_ok;
}
else if (h->nlmsg_type == RTM_NEWADDR && family != AF_UNSPEC && family != AF_LOCAL) else if (h->nlmsg_type == RTM_NEWADDR && family != AF_UNSPEC && family != AF_LOCAL)
{ {
struct ifaddrmsg *ifa = NLMSG_DATA(h); struct ifaddrmsg *ifa = NLMSG_DATA(h);
@@ -295,7 +309,7 @@ void netlink_multicast(void)
{ {
ssize_t len; ssize_t len;
struct nlmsghdr *h; struct nlmsghdr *h;
int flags; int flags, newaddr = 0;
/* don't risk blocking reading netlink messages here. */ /* don't risk blocking reading netlink messages here. */
if ((flags = fcntl(daemon->netlinkfd, F_GETFL)) == -1 || if ((flags = fcntl(daemon->netlinkfd, F_GETFL)) == -1 ||
@@ -303,45 +317,62 @@ void netlink_multicast(void)
return; return;
if ((len = netlink_recv()) != -1) if ((len = netlink_recv()) != -1)
{ for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len)) if (nl_async(h) && option_bool(OPT_CLEVERBIND))
if (h->nlmsg_type == NLMSG_ERROR) newaddr = 1;
nl_err(h);
else
nl_routechange(h);
}
/* restore non-blocking status */
fcntl(daemon->netlinkfd, F_SETFL, flags);
}
static void nl_err(struct nlmsghdr *h)
{
struct nlmsgerr *err = NLMSG_DATA(h);
if (err->error != 0) /* restore non-blocking status */
my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error))); fcntl(daemon->netlinkfd, F_SETFL, flags);
if (newaddr)
{
enumerate_interfaces();
create_bound_listeners(0);
}
} }
/* We arrange to receive netlink multicast messages whenever the network route is added. static int nl_async(struct nlmsghdr *h)
If this happens and we still have a DNS packet in the buffer, we re-send it.
This helps on DoD links, where frequently the packet which triggers dialling is
a DNS query, which then gets lost. By re-sending, we can avoid the lookup
failing. Note that we only accept these messages from the kernel (pid == 0) */
static void nl_routechange(struct nlmsghdr *h)
{ {
if (h->nlmsg_pid == 0 && h->nlmsg_type == RTM_NEWROUTE) if (h->nlmsg_type == NLMSG_ERROR)
{ {
struct nlmsgerr *err = NLMSG_DATA(h);
my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error)));
return 0;
}
else if (h->nlmsg_pid == 0 && h->nlmsg_type == RTM_NEWROUTE)
{
/* We arrange to receive netlink multicast messages whenever the network route is added.
If this happens and we still have a DNS packet in the buffer, we re-send it.
This helps on DoD links, where frequently the packet which triggers dialling is
a DNS query, which then gets lost. By re-sending, we can avoid the lookup
failing. */
struct rtmsg *rtm = NLMSG_DATA(h); struct rtmsg *rtm = NLMSG_DATA(h);
int fd;
if (rtm->rtm_type != RTN_UNICAST || rtm->rtm_scope != RT_SCOPE_LINK)
return;
/* Force re-reading resolv file right now, for luck. */
daemon->last_resolv = 0;
if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
{
/* Force re-reading resolv file right now, for luck. */
daemon->last_resolv = 0;
if (daemon->srv_save)
{
int fd;
if (daemon->srv_save->sfd)
fd = daemon->srv_save->sfd->fd;
else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
fd = daemon->rfd_save->fd;
else
return 0;
while(sendto(fd, daemon->packet, daemon->packet_len, 0,
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
}
}
return 0;
}
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
else if (h->nlmsg_type == RTM_NEWADDR)
{
/* force RAs to sync new network and pick up new interfaces. */ /* force RAs to sync new network and pick up new interfaces. */
if (daemon->ra_contexts) if (daemon->ra_contexts)
{ {
@@ -351,23 +382,13 @@ static void nl_routechange(struct nlmsghdr *h)
iface_enumerate and can't re-enter it now */ iface_enumerate and can't re-enter it now */
send_alarm(0, 0); send_alarm(0, 0);
} }
#endif return 1; /* clever bind mode - rescan */
if (daemon->srv_save)
{
if (daemon->srv_save->sfd)
fd = daemon->srv_save->sfd->fd;
else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
fd = daemon->rfd_save->fd;
else
return;
while(sendto(fd, daemon->packet, daemon->packet_len, 0,
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
}
} }
#endif
return 0;
} }
#endif #endif
+32 -57
View File
@@ -117,18 +117,8 @@ int iface_check(int family, struct all_addr *addr, char *name)
if (daemon->if_names || daemon->if_addrs) if (daemon->if_names || daemon->if_addrs)
{ {
#ifdef HAVE_DHCP
struct dhcp_context *range;
#endif
ret = 0; ret = 0;
#ifdef HAVE_DHCP
for (range = daemon->dhcp; range; range = range->next)
if (range->interface && strcmp(range->interface, name) == 0)
ret = 1;
#endif
for (tmp = daemon->if_names; tmp; tmp = tmp->next) for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0)) if (tmp->name && (strcmp(tmp->name, name) == 0))
ret = tmp->used = 1; ret = tmp->used = 1;
@@ -161,12 +151,11 @@ static int iface_allowed(struct irec **irecp, int if_index,
struct irec *iface; struct irec *iface;
int fd, mtu = 0, loopback; int fd, mtu = 0, loopback;
struct ifreq ifr; struct ifreq ifr;
int tftp_ok = daemon->tftp_unlimited; int tftp_ok = !!option_bool(OPT_TFTP);
int dhcp_ok = 1; int dhcp_ok = 1;
#ifdef HAVE_DHCP #ifdef HAVE_DHCP
struct iname *tmp; struct iname *tmp;
#endif #endif
struct interface_list *ir = NULL;
/* check whether the interface IP has been added already /* check whether the interface IP has been added already
we call this routine multiple times. */ we call this routine multiple times. */
@@ -207,53 +196,38 @@ static int iface_allowed(struct irec **irecp, int if_index,
struct iname *lo; struct iname *lo;
for (lo = daemon->if_names; lo; lo = lo->next) for (lo = daemon->if_names; lo; lo = lo->next)
if (lo->name && strcmp(lo->name, ifr.ifr_name) == 0) if (lo->name && strcmp(lo->name, ifr.ifr_name) == 0)
{ break;
lo->isloop = 1;
break;
}
if (!lo && if (!lo &&
(lo = whine_malloc(sizeof(struct iname))) && (lo = whine_malloc(sizeof(struct iname))) &&
(lo->name = whine_malloc(strlen(ifr.ifr_name)+1))) (lo->name = whine_malloc(strlen(ifr.ifr_name)+1)))
{ {
strcpy(lo->name, ifr.ifr_name); strcpy(lo->name, ifr.ifr_name);
lo->isloop = lo->used = 1; lo->used = 1;
lo->next = daemon->if_names; lo->next = daemon->if_names;
daemon->if_names = lo; daemon->if_names = lo;
} }
} }
#ifdef HAVE_TFTP if (addr->sa.sa_family == AF_INET &&
/* implement wierd TFTP service rules */ !iface_check(AF_INET, (struct all_addr *)&addr->in.sin_addr, ifr.ifr_name))
for (ir = daemon->tftp_interfaces; ir; ir = ir->next) return 1;
if (strcmp(ir->interface, ifr.ifr_name) == 0)
#ifdef HAVE_DHCP
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
{ {
tftp_ok = 1; tftp_ok = 0;
break; dhcp_ok = 0;
} }
#endif #endif
if (!ir)
{
if (addr->sa.sa_family == AF_INET &&
!iface_check(AF_INET, (struct all_addr *)&addr->in.sin_addr, ifr.ifr_name))
return 1;
#ifdef HAVE_DHCP
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, ifr.ifr_name) == 0))
{
tftp_ok = 0;
dhcp_ok = 0;
}
#endif
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
if (addr->sa.sa_family == AF_INET6 && if (addr->sa.sa_family == AF_INET6 &&
!iface_check(AF_INET6, (struct all_addr *)&addr->in6.sin6_addr, ifr.ifr_name)) !iface_check(AF_INET6, (struct all_addr *)&addr->in6.sin6_addr, ifr.ifr_name))
return 1; return 1;
#endif #endif
}
/* add to list */ /* add to list */
if ((iface = whine_malloc(sizeof(struct irec)))) if ((iface = whine_malloc(sizeof(struct irec))))
@@ -350,6 +324,7 @@ static int make_sock(union mysockaddr *addr, int type, int dienow)
if ((fd = socket(family, type, 0)) == -1) if ((fd = socket(family, type, 0)) == -1)
{ {
int port; int port;
char *s;
/* No error if the kernel just doesn't support this IP flavour */ /* No error if the kernel just doesn't support this IP flavour */
if (errno == EPROTONOSUPPORT || if (errno == EPROTONOSUPPORT ||
@@ -358,15 +333,15 @@ static int make_sock(union mysockaddr *addr, int type, int dienow)
return -1; return -1;
err: err:
port = prettyprint_addr(addr, daemon->addrbuff);
if (!option_bool(OPT_NOWILD) && !option_bool(OPT_CLEVERBIND))
sprintf(daemon->addrbuff, "port %d", port);
s = _("failed to create listening socket for %s: %s");
if (dienow) if (dienow)
{ die(s, daemon->addrbuff, EC_BADNET);
port = prettyprint_addr(addr, daemon->namebuff);
if (!option_bool(OPT_NOWILD)) my_syslog(LOG_ERR, s, daemon->addrbuff, strerror(errno));
sprintf(daemon->namebuff, "port %d", port);
die(_("failed to create listening socket for %s: %s"),
daemon->namebuff, EC_BADNET);
}
return -1; return -1;
} }
@@ -487,8 +462,7 @@ static struct listener *create_listeners(union mysockaddr *addr, int do_tftp, in
void create_wildcard_listeners(void) void create_wildcard_listeners(void)
{ {
union mysockaddr addr; union mysockaddr addr;
struct listener *l; struct listener *l, *l6;
int tftp_enabled = daemon->tftp_unlimited || daemon->tftp_interfaces;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
#ifdef HAVE_SOCKADDR_SA_LEN #ifdef HAVE_SOCKADDR_SA_LEN
@@ -498,7 +472,7 @@ void create_wildcard_listeners(void)
addr.in.sin_addr.s_addr = INADDR_ANY; addr.in.sin_addr.s_addr = INADDR_ANY;
addr.in.sin_port = htons(daemon->port); addr.in.sin_port = htons(daemon->port);
l = create_listeners(&addr, tftp_enabled, 1); l = create_listeners(&addr, !!option_bool(OPT_TFTP), 1);
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
@@ -508,11 +482,12 @@ void create_wildcard_listeners(void)
addr.in6.sin6_family = AF_INET6; addr.in6.sin6_family = AF_INET6;
addr.in6.sin6_addr = in6addr_any; addr.in6.sin6_addr = in6addr_any;
addr.in6.sin6_port = htons(daemon->port); addr.in6.sin6_port = htons(daemon->port);
l6 = create_listeners(&addr, !!option_bool(OPT_TFTP), 1);
if (l) if (l)
l->next = create_listeners(&addr, tftp_enabled, 1); l->next = l6;
else else
l = create_listeners(&addr, tftp_enabled, 1); l = l6;
#endif #endif
daemon->listeners = l; daemon->listeners = l;
@@ -546,7 +521,7 @@ void create_bound_listeners(int dienow)
for (if_tmp = daemon->if_addrs; if_tmp; if_tmp = if_tmp->next) for (if_tmp = daemon->if_addrs; if_tmp; if_tmp = if_tmp->next)
if (!if_tmp->used && if (!if_tmp->used &&
(new = create_listeners(&if_tmp->addr, 1, dienow))) (new = create_listeners(&if_tmp->addr, !!option_bool(OPT_TFTP), dienow)))
{ {
new->iface = NULL; new->iface = NULL;
new->next = daemon->listeners; new->next = daemon->listeners;
+400 -343
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -14,7 +14,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define ALL_HOSTS "FF02::1" #define ALL_NODES "FF02::1"
#define ALL_ROUTERS "FF02::2" #define ALL_ROUTERS "FF02::2"
struct ping_packet { struct ping_packet {
+14 -17
View File
@@ -119,7 +119,6 @@ void icmp6_packet(void)
struct sockaddr_in6 from; struct sockaddr_in6 from;
unsigned char *packet; unsigned char *packet;
struct iname *tmp; struct iname *tmp;
struct dhcp_context *context;
/* Note: use outpacket for input buffer */ /* Note: use outpacket for input buffer */
msg.msg_control = control_u.control6; msg.msg_control = control_u.control6;
@@ -157,14 +156,9 @@ void icmp6_packet(void)
if (tmp->name && (strcmp(tmp->name, interface) == 0)) if (tmp->name && (strcmp(tmp->name, interface) == 0))
return; return;
/* weird libvirt-inspired access control */ if (packet[1] != 0)
for (context = daemon->dhcp6; context; context = context->next)
if (!context->interface || strcmp(context->interface, interface) == 0)
break;
if (!context || packet[1] != 0)
return; return;
if (packet[0] == ICMP6_ECHO_REPLY) if (packet[0] == ICMP6_ECHO_REPLY)
lease_ping_reply(&from.sin6_addr, packet, interface); lease_ping_reply(&from.sin6_addr, packet, interface);
else if (packet[0] == ND_ROUTER_SOLICIT) else if (packet[0] == ND_ROUTER_SOLICIT)
@@ -179,7 +173,8 @@ void icmp6_packet(void)
} }
my_syslog(MS_DHCP | LOG_INFO, "RTR-SOLICIT(%s) %s", interface, mac); my_syslog(MS_DHCP | LOG_INFO, "RTR-SOLICIT(%s) %s", interface, mac);
send_ra(if_index, interface, &from.sin6_addr); /* source address may not be valid in solicit request. */
send_ra(if_index, interface, !IN6_IS_ADDR_UNSPECIFIED(&from.sin6_addr) ? &from.sin6_addr : NULL);
} }
} }
@@ -317,7 +312,7 @@ static void send_ra(int iface, char *iface_name, struct in6_addr *dest)
addr.sin6_scope_id = iface; addr.sin6_scope_id = iface;
} }
else else
inet_pton(AF_INET6, ALL_HOSTS, &addr.sin6_addr); inet_pton(AF_INET6, ALL_NODES, &addr.sin6_addr);
send_from(daemon->icmp6fd, 0, daemon->outpacket.iov_base, save_counter(0), send_from(daemon->icmp6fd, 0, daemon->outpacket.iov_base, save_counter(0),
(union mysockaddr *)&addr, (struct all_addr *)&parm.link_local, iface); (union mysockaddr *)&addr, (struct all_addr *)&parm.link_local, iface);
@@ -378,13 +373,6 @@ static int add_prefixes(struct in6_addr *local, int prefix,
if (context->flags & CONTEXT_DEPRECATE) if (context->flags & CONTEXT_DEPRECATE)
deprecate = 1; deprecate = 1;
/* subsequent prefixes on the same interface
and subsequent instances of this prefix don't need timers */
if (!param->first)
context->ra_time = 0;
param->first = 0;
param->found_context = 1;
/* collect dhcp-range tags */ /* collect dhcp-range tags */
if (context->netid.next == &context->netid && context->netid.net) if (context->netid.next == &context->netid && context->netid.net)
{ {
@@ -392,11 +380,20 @@ static int add_prefixes(struct in6_addr *local, int prefix,
param->tags = &context->netid; param->tags = &context->netid;
} }
/* subsequent prefixes on the same interface
and subsequent instances of this prefix don't need timers.
Be careful not to find the same prefix twice with different
addresses. */
if (!(context->flags & CONTEXT_RA_DONE)) if (!(context->flags & CONTEXT_RA_DONE))
{ {
if (!param->first)
context->ra_time = 0;
context->flags |= CONTEXT_RA_DONE; context->flags |= CONTEXT_RA_DONE;
do_prefix = 1; do_prefix = 1;
} }
param->first = 0;
param->found_context = 1;
} }
if (do_prefix) if (do_prefix)
+18 -1
View File
@@ -1250,7 +1250,8 @@ static int add_resource_record(struct dns_header *header, char *limit, int *trun
case 't': case 't':
usval = va_arg(ap, int); usval = va_arg(ap, int);
sval = va_arg(ap, char *); sval = va_arg(ap, char *);
memcpy(p, sval, usval); if (usval != 0)
memcpy(p, sval, usval);
p += usval; p += usval;
break; break;
@@ -1393,6 +1394,22 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
if (qclass == C_IN) if (qclass == C_IN)
{ {
struct txt_record *t;
for (t = daemon->rr; t; t = t->next)
if ((t->class == qtype || qtype == T_ANY) && hostname_isequal(name, t->name))
{
ans = 1;
if (!dryrun)
{
log_query(F_CONFIG | F_RRNAME, name, NULL, "<RR>");
if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
daemon->local_ttl, NULL,
t->class, C_IN, "t", t->len, t->txt))
anscount ++;
}
}
if (qtype == T_PTR || qtype == T_ANY) if (qtype == T_PTR || qtype == T_ANY)
{ {
/* see if it's w.z.y.z.in-addr.arpa format */ /* see if it's w.z.y.z.in-addr.arpa format */
+13 -32
View File
@@ -18,7 +18,7 @@
#ifdef HAVE_TFTP #ifdef HAVE_TFTP
static struct tftp_file *check_tftp_fileperm(ssize_t *len, char *prefix, int special); static struct tftp_file *check_tftp_fileperm(ssize_t *len, char *prefix);
static void free_transfer(struct tftp_transfer *transfer); static void free_transfer(struct tftp_transfer *transfer);
static ssize_t tftp_err(int err, char *packet, char *mess, char *file); static ssize_t tftp_err(int err, char *packet, char *mess, char *file);
static ssize_t tftp_err_oops(char *packet, char *file); static ssize_t tftp_err_oops(char *packet, char *file);
@@ -48,7 +48,7 @@ void tftp_request(struct listener *listen, time_t now)
struct msghdr msg; struct msghdr msg;
struct iovec iov; struct iovec iov;
struct ifreq ifr; struct ifreq ifr;
int is_err = 1, if_index = 0, mtu = 0, special = 0; int is_err = 1, if_index = 0, mtu = 0;
#ifdef HAVE_DHCP #ifdef HAVE_DHCP
struct iname *tmp; struct iname *tmp;
#endif #endif
@@ -61,7 +61,6 @@ void tftp_request(struct listener *listen, time_t now)
char *name = NULL; char *name = NULL;
char *prefix = daemon->tftp_prefix; char *prefix = daemon->tftp_prefix;
struct tftp_prefix *pref; struct tftp_prefix *pref;
struct interface_list *ir;
union { union {
struct cmsghdr align; /* this ensures alignment */ struct cmsghdr align; /* this ensures alignment */
@@ -115,7 +114,6 @@ void tftp_request(struct listener *listen, time_t now)
{ {
struct cmsghdr *cmptr; struct cmsghdr *cmptr;
int check; int check;
struct interface_list *ir;
if (msg.msg_controllen < sizeof(struct cmsghdr)) if (msg.msg_controllen < sizeof(struct cmsghdr))
return; return;
@@ -200,24 +198,13 @@ void tftp_request(struct listener *listen, time_t now)
#endif #endif
check = iface_check(AF_INET, (struct all_addr *)&addr.in.sin_addr, name); check = iface_check(AF_INET, (struct all_addr *)&addr.in.sin_addr, name);
/* wierd TFTP service override */
for (ir = daemon->tftp_interfaces; ir; ir = ir->next)
if (strcmp(ir->interface, name) == 0)
break;
if (!ir)
{
if (!daemon->tftp_unlimited || !check)
return;
#ifdef HAVE_DHCP #ifdef HAVE_DHCP
/* allowed interfaces are the same as for DHCP */ /* allowed interfaces are the same as for DHCP */
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next) for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0)) if (tmp->name && (strcmp(tmp->name, name) == 0))
return; return;
#endif #endif
}
strncpy(ifr.ifr_name, name, IF_NAMESIZE); strncpy(ifr.ifr_name, name, IF_NAMESIZE);
if (ioctl(listen->tftpfd, SIOCGIFMTU, &ifr) != -1) if (ioctl(listen->tftpfd, SIOCGIFMTU, &ifr) != -1)
mtu = ifr.ifr_mtu; mtu = ifr.ifr_mtu;
@@ -228,12 +215,7 @@ void tftp_request(struct listener *listen, time_t now)
/* check for per-interface prefix */ /* check for per-interface prefix */
for (pref = daemon->if_prefix; pref; pref = pref->next) for (pref = daemon->if_prefix; pref; pref = pref->next)
if (strcmp(pref->interface, name) == 0) if (strcmp(pref->interface, name) == 0)
prefix = pref->prefix; prefix = pref->prefix;
/* wierd TFTP interfaces disable special options. */
for (ir = daemon->tftp_interfaces; ir; ir = ir->next)
if (strcmp(ir->interface, name) == 0)
special = 1;
} }
if (listen->family == AF_INET) if (listen->family == AF_INET)
@@ -325,8 +307,7 @@ void tftp_request(struct listener *listen, time_t now)
{ {
if (strcasecmp(opt, "blksize") == 0) if (strcasecmp(opt, "blksize") == 0)
{ {
if ((opt = next(&p, end)) && if ((opt = next(&p, end)) && !option_bool(OPT_TFTP_NOBLOCK))
(special || !option_bool(OPT_TFTP_NOBLOCK)))
{ {
transfer->blocksize = atoi(opt); transfer->blocksize = atoi(opt);
if (transfer->blocksize < 1) if (transfer->blocksize < 1)
@@ -363,7 +344,7 @@ void tftp_request(struct listener *listen, time_t now)
if (prefix[strlen(prefix)-1] != '/') if (prefix[strlen(prefix)-1] != '/')
strncat(daemon->namebuff, "/", (MAXDNAME-1) - strlen(daemon->namebuff)); strncat(daemon->namebuff, "/", (MAXDNAME-1) - strlen(daemon->namebuff));
if (!special && option_bool(OPT_TFTP_APREF)) if (option_bool(OPT_TFTP_APREF))
{ {
size_t oldlen = strlen(daemon->namebuff); size_t oldlen = strlen(daemon->namebuff);
struct stat statbuf; struct stat statbuf;
@@ -390,7 +371,7 @@ void tftp_request(struct listener *listen, time_t now)
strncat(daemon->namebuff, filename, (MAXDNAME-1) - strlen(daemon->namebuff)); strncat(daemon->namebuff, filename, (MAXDNAME-1) - strlen(daemon->namebuff));
/* check permissions and open file */ /* check permissions and open file */
if ((transfer->file = check_tftp_fileperm(&len, prefix, special))) if ((transfer->file = check_tftp_fileperm(&len, prefix)))
{ {
if ((len = get_block(packet, transfer)) == -1) if ((len = get_block(packet, transfer)) == -1)
len = tftp_err_oops(packet, daemon->namebuff); len = tftp_err_oops(packet, daemon->namebuff);
@@ -411,7 +392,7 @@ void tftp_request(struct listener *listen, time_t now)
} }
} }
static struct tftp_file *check_tftp_fileperm(ssize_t *len, char *prefix, int special) static struct tftp_file *check_tftp_fileperm(ssize_t *len, char *prefix)
{ {
char *packet = daemon->packet, *namebuff = daemon->namebuff; char *packet = daemon->packet, *namebuff = daemon->namebuff;
struct tftp_file *file; struct tftp_file *file;
@@ -448,7 +429,7 @@ static struct tftp_file *check_tftp_fileperm(ssize_t *len, char *prefix, int spe
goto perm; goto perm;
} }
/* in secure mode, must be owned by user running dnsmasq */ /* in secure mode, must be owned by user running dnsmasq */
else if (!special && option_bool(OPT_TFTP_SECURE) && uid != statbuf.st_uid) else if (option_bool(OPT_TFTP_SECURE) && uid != statbuf.st_uid)
goto perm; goto perm;
/* If we're doing many tranfers from the same file, only /* If we're doing many tranfers from the same file, only
+23 -6
View File
@@ -330,7 +330,7 @@ int is_same_net6(struct in6_addr *a, struct in6_addr *b, int prefixlen)
return 0; return 0;
if (pfbits == 0 || if (pfbits == 0 ||
(a->s6_addr[pfbytes] >> (8 - pfbits) != b->s6_addr[pfbytes] >> (8 - pfbits))) (a->s6_addr[pfbytes] >> (8 - pfbits) == b->s6_addr[pfbytes] >> (8 - pfbits)))
return 1; return 1;
return 0; return 0;
@@ -426,7 +426,7 @@ int parse_hex(char *in, unsigned char *out, int maxlen,
while (maxlen == -1 || i < maxlen) while (maxlen == -1 || i < maxlen)
{ {
for (r = in; *r != 0 && *r != ':' && *r != '-'; r++) for (r = in; *r != 0 && *r != ':' && *r != '-' && *r != ' '; r++)
if (*r != '*' && !isxdigit((unsigned char)*r)) if (*r != '*' && !isxdigit((unsigned char)*r))
return -1; return -1;
@@ -444,12 +444,29 @@ int parse_hex(char *in, unsigned char *out, int maxlen,
else else
{ {
*r = 0; *r = 0;
mask = mask << 1;
if (strcmp(in, "*") == 0) if (strcmp(in, "*") == 0)
mask |= 1; {
mask = (mask << 1) | 1;
i++;
}
else else
out[i] = strtol(in, NULL, 16); {
i++; int j, bytes = (1 + (r - in))/2;
for (j = 0; j < bytes; j++)
{
char sav;
if (j < bytes - 1)
{
sav = in[(j+1)*2];
in[(j+1)*2] = 0;
}
out[i] = strtol(&in[j*2], NULL, 16);
mask = mask << 1;
i++;
if (j < bytes - 1)
in[(j+1)*2] = sav;
}
}
} }
} }
in = r+1; in = r+1;