Compare commits

...
36 Commits
Author SHA1 Message Date
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
Simon Kelley 7f61b3ad59 Small SLAAC optimisation. 2012-04-29 16:01:28 +01:00
Simon Kelley a9ab732e35 reconfirm SLAAC addresses when DHCPv4 leases go though INIT_REBOOT state. 2012-04-29 16:01:28 +01:00
Simon Kelley 11263a462c isprint cast. 2012-04-29 16:01:28 +01:00
Simon Kelley 231d061b45 Tidy TXT record sanitising 2012-04-29 16:01:28 +01:00
Simon Kelley cdbee9a40b Find room to store key-id and digest-type in DS records.
->uid is now overloaded to store key length
2012-04-27 10:30:49 +01:00
Simon Kelley 7b4ad2eb34 Teach cache to store DS and DNSKEY records 2012-04-27 10:30:49 +01:00
Simon Kelley 19d69be220 CHANGELOG update. 2012-04-27 10:14:34 +01:00
Simon Kelley 04363607aa Fix tftp-over-IPv4 regression on OpenBSD. 2012-04-27 10:11:51 +01:00
Simon Kelley dcffad2a86 Ensure that the DBus DhcpLeaseUpdated events are generated. 2012-04-24 15:25:18 +01:00
Simon Kelley 6a69ab5ebd Fix error-handling problem in TFTP server. 2012-04-24 14:42:26 +01:00
Simon Kelley fc92ead0dd CHANGELOG typo. 2012-04-22 21:28:24 +01:00
27 changed files with 868 additions and 387 deletions

No files matched your search

+51 -4
View File
@@ -1,3 +1,42 @@
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.
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 +55,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 +107,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 +121,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
@@ -93,8 +132,16 @@ version 2.61
Give correct from-cache answers to explict CNAME queries. Give correct from-cache answers to explict CNAME queries.
Thanks to Rob Zwissler for spotting this. Thanks to Rob Zwissler for spotting this.
Add --dhcp-lowercase option. Thanks to Oliver Rath for the Add --tftp-lowercase option. Thanks to Oliver Rath for the
patch. patch.
Ensure that the DBus DhcpLeaseUpdated events are generated
when a lease goes through INIT_REBOOT state, even if the
dhcp-script is not in use. Thanks to Antoaneta-Ecaterina
Ene for the patch.
Fix failure of TFTP over IPv4 on OpenBSD platform. Thanks
to Brad Smith for spotting this.
version 2.60 version 2.60
+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
+26
View File
@@ -1,3 +1,29 @@
dnsmasq (2.63-1) unstable; urgency=low
* New upstream.
-- 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.
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
+8 -8
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)
@@ -115,7 +115,7 @@ binary-arch: checkroot
-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)/.
@@ -155,7 +155,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
+17
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 indivdual 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 availble
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
@@ -454,6 +465,12 @@ hosts files) or from DHCP. 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 for 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
+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)."
+85 -13
View File
@@ -25,6 +25,9 @@ static int cache_inserted = 0, cache_live_freed = 0, insert_error;
static union bigname *big_free = NULL; static union bigname *big_free = NULL;
static int bignames_left, hash_size; static int bignames_left, hash_size;
static int uid = 0; static int uid = 0;
#ifdef HAVE_DNSSEC
static struct keydata *keyblock_free = NULL;
#endif
/* type->string mapping: this is also used by the name-hash function as a mixing table. */ /* type->string mapping: this is also used by the name-hash function as a mixing table. */
static const struct { static const struct {
@@ -190,6 +193,10 @@ static void cache_free(struct crec *crecp)
big_free = crecp->name.bname; big_free = crecp->name.bname;
crecp->flags &= ~F_BIGNAME; crecp->flags &= ~F_BIGNAME;
} }
#ifdef HAVE_DNSSEC
else if (crecp->flags & (F_DNSKEY | F_DS))
keydata_free(crecp->addr.key.keydata);
#endif
} }
/* insert a new cache entry at the head of the list (youngest entry) */ /* insert a new cache entry at the head of the list (youngest entry) */
@@ -233,7 +240,11 @@ static int is_outdated_cname_pointer(struct crec *crecp)
if (!(crecp->flags & F_CNAME)) if (!(crecp->flags & F_CNAME))
return 0; return 0;
if (crecp->addr.cname.cache && crecp->addr.cname.uid == crecp->addr.cname.cache->uid) /* NB. record may be reused as DS or DNSKEY, where uid is
overloaded for something completely different */
if (crecp->addr.cname.cache &&
(crecp->addr.cname.cache->flags & (F_IPV4 | F_IPV6)) &&
crecp->addr.cname.uid == crecp->addr.cname.cache->uid)
return 0; return 0;
return 1; return 1;
@@ -280,7 +291,7 @@ static int cache_scan_free(char *name, struct all_addr *addr, time_t now, unsign
} }
} }
else if ((crecp->flags & F_FORWARD) && else if ((crecp->flags & F_FORWARD) &&
((flags & crecp->flags & (F_IPV4 | F_IPV6)) || ((crecp->flags | flags) & F_CNAME)) && ((flags & crecp->flags & F_TYPE) || ((crecp->flags | flags) & F_CNAME)) &&
hostname_isequal(cache_get_name(crecp), name)) hostname_isequal(cache_get_name(crecp), name))
{ {
if (crecp->flags & (F_HOSTS | F_DHCP)) if (crecp->flags & (F_HOSTS | F_DHCP))
@@ -360,7 +371,9 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
int freed_all = flags & F_REVERSE; int freed_all = flags & F_REVERSE;
int free_avail = 0; int free_avail = 0;
log_query(flags | F_UPSTREAM, name, addr, NULL); /* Don't log keys */
if (flags & (F_IPV4 | F_IPV6))
log_query(flags | F_UPSTREAM, name, addr, NULL);
/* if previous insertion failed give up now. */ /* if previous insertion failed give up now. */
if (insert_error) if (insert_error)
@@ -452,9 +465,7 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
if (addr) if (addr)
new->addr.addr = *addr; new->addr.addr = *addr;
else
new->addr.cname.cache = NULL;
new->ttd = now + (time_t)ttl; new->ttd = now + (time_t)ttl;
new->next = new_chain; new->next = new_chain;
new_chain = new; new_chain = new;
@@ -1150,22 +1161,35 @@ void dump_cache(time_t now)
if (!is_outdated_cname_pointer(cache)) if (!is_outdated_cname_pointer(cache))
a = cache_get_name(cache->addr.cname.cache); a = cache_get_name(cache->addr.cname.cache);
} }
#ifdef HAVE_IPV6 #ifdef HAVE_DNSSEC
else if (cache->flags & F_DNSKEY)
{
a = daemon->addrbuff;
sprintf(a, "%3u %u", cache->addr.key.algo, cache->uid);
}
else if (cache->flags & F_DS)
{
a = daemon->addrbuff;
sprintf(a, "%5u %3u %3u %u", cache->addr.key.flags_or_keyid,
cache->addr.key.algo, cache->addr.key.digest, cache->uid);
}
#endif
else else
{ {
a = daemon->addrbuff; a = daemon->addrbuff;
if (cache->flags & F_IPV4) if (cache->flags & F_IPV4)
inet_ntop(AF_INET, &cache->addr.addr, a, ADDRSTRLEN); inet_ntop(AF_INET, &cache->addr.addr, a, ADDRSTRLEN);
#ifdef HAVE_IPV6
else if (cache->flags & F_IPV6) else if (cache->flags & F_IPV6)
inet_ntop(AF_INET6, &cache->addr.addr, a, ADDRSTRLEN); inet_ntop(AF_INET6, &cache->addr.addr, a, ADDRSTRLEN);
}
#else
else
a = inet_ntoa(cache->addr.addr.addr.addr4);
#endif #endif
p += sprintf(p, "%-30.30s %s%s%s%s%s%s%s%s%s%s ", a, }
p += sprintf(p, "%-30.30s %s%s%s%s%s%s%s%s%s%s%s%s%s ", a,
cache->flags & F_IPV4 ? "4" : "", cache->flags & F_IPV4 ? "4" : "",
cache->flags & F_IPV6 ? "6" : "", cache->flags & F_IPV6 ? "6" : "",
cache->flags & F_DNSKEY ? "K" : "",
cache->flags & F_DS ? "S" : "",
cache->flags & F_CNAME ? "C" : "", cache->flags & F_CNAME ? "C" : "",
cache->flags & F_FORWARD ? "F" : " ", cache->flags & F_FORWARD ? "F" : " ",
cache->flags & F_REVERSE ? "R" : " ", cache->flags & F_REVERSE ? "R" : " ",
@@ -1173,7 +1197,8 @@ void dump_cache(time_t now)
cache->flags & F_DHCP ? "D" : " ", cache->flags & F_DHCP ? "D" : " ",
cache->flags & F_NEG ? "N" : " ", cache->flags & F_NEG ? "N" : " ",
cache->flags & F_NXDOMAIN ? "X" : " ", cache->flags & F_NXDOMAIN ? "X" : " ",
cache->flags & F_HOSTS ? "H" : " "); cache->flags & F_HOSTS ? "H" : " ",
cache->flags & F_DNSSECOK ? "V" : " ");
#ifdef HAVE_BROKEN_RTC #ifdef HAVE_BROKEN_RTC
p += sprintf(p, "%lu", cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now)); p += sprintf(p, "%lu", cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now));
#else #else
@@ -1287,3 +1312,50 @@ void log_query(unsigned int flags, char *name, struct all_addr *addr, char *arg)
my_syslog(LOG_INFO, "%s %s %s %s", source, name, verb, dest); my_syslog(LOG_INFO, "%s %s %s %s", source, name, verb, dest);
} }
#ifdef HAVE_DNSSEC
struct keydata *keydata_alloc(char *data, size_t len)
{
struct keydata *block, *ret = NULL;
struct keydata **prev = &ret;
while (len > 0)
{
if (keyblock_free)
{
block = keyblock_free;
keyblock_free = block->next;
}
else
block = whine_malloc(sizeof(struct keydata));
if (!block)
{
/* failed to alloc, free partial chain */
keydata_free(ret);
return NULL;
}
memcpy(block->key, data, len > KEYBLOCK_LEN ? KEYBLOCK_LEN : len);
data += KEYBLOCK_LEN;
len -= KEYBLOCK_LEN;
*prev = block;
prev = &block->next;
block->next = NULL;
}
return ret;
}
void keydata_free(struct keydata *blocks)
{
struct keydata *tmp;
if (blocks)
{
for (tmp = blocks; tmp->next; tmp = tmp->next);
tmp->next = keyblock_free;
keyblock_free = blocks;
}
}
#endif
+1
View File
@@ -18,6 +18,7 @@
#define MAX_PROCS 20 /* max no children for TCP requests */ #define MAX_PROCS 20 /* max no children for TCP requests */
#define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */ #define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
#define EDNS_PKTSZ 4096 /* default max EDNS.0 UDP packet from RFC5625 */ #define EDNS_PKTSZ 4096 /* default max EDNS.0 UDP packet from RFC5625 */
#define KEYBLOCK_LEN 140 /* choose to mininise fragmentation when storing DNSSEC keys */
#define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */ #define TIMEOUT 10 /* drop UDP queries after TIMEOUT seconds */
#define FORWARD_TEST 50 /* try all servers every 50 queries */ #define FORWARD_TEST 50 /* try all servers every 50 queries */
#define FORWARD_TIME 20 /* or 20 seconds */ #define FORWARD_TIME 20 /* or 20 seconds */
+3 -2
View File
@@ -407,10 +407,11 @@ static int join_multicast_worker(struct in6_addr *local, int prefix,
return 1; return 1;
/* weird libvirt-inspired access control */ /* weird libvirt-inspired access control */
for (context = daemon->dhcp6; context; context = context->next) for (context = daemon->ra_contexts ? daemon->ra_contexts : daemon->dhcp6;
context; context = context->next)
if (!context->interface || strcmp(context->interface, ifrn_name) == 0) if (!context->interface || strcmp(context->interface, ifrn_name) == 0)
break; break;
if (!context) if (!context)
return 1; return 1;
+1 -1
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));
+62 -25
View File
@@ -114,8 +114,16 @@ 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_CLVERBIND);
}
#endif #endif
#ifndef HAVE_TFTP #ifndef HAVE_TFTP
if (daemon->tftp_unlimited || daemon->tftp_interfaces) if (daemon->tftp_unlimited || daemon->tftp_interfaces)
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);
@@ -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 (daemon->tftp_unlimited || daemon->tftp_interfaces)
{
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)
@@ -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);
} }
} }
@@ -1209,13 +1250,9 @@ void clear_cache_and_reload(time_t now)
} }
#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 +1365,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 +1382,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);
+35 -8
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,8 @@ 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_LAST 40
/* 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. */
@@ -298,17 +300,30 @@ union bigname {
union bigname *next; /* freelist */ union bigname *next; /* freelist */
}; };
struct keydata {
struct keydata *next;
unsigned char key[KEYBLOCK_LEN];
};
struct crec { struct crec {
struct crec *next, *prev, *hash_next; struct crec *next, *prev, *hash_next;
time_t ttd; /* time to die */ /* union is 16 bytes when doing IPv6, 8 bytes on 32 bit machines without IPv6 */
int uid;
union { union {
struct all_addr addr; struct all_addr addr;
struct { struct {
struct crec *cache; struct crec *cache;
int uid; int uid;
} cname; } cname;
struct {
struct keydata *keydata;
unsigned char algo;
unsigned char digest; /* DS only */
unsigned short flags_or_keyid; /* flags for DNSKEY, keyid for DS */
} key;
} addr; } addr;
time_t ttd; /* time to die */
/* used as keylen if F_DS or F_DNSKEY, index to source for F_HOSTS */
int uid;
unsigned short flags; unsigned short flags;
union { union {
char sname[SMALLDNAME]; char sname[SMALLDNAME];
@@ -329,14 +344,21 @@ struct crec {
#define F_BIGNAME (1u<<9) #define F_BIGNAME (1u<<9)
#define F_NXDOMAIN (1u<<10) #define F_NXDOMAIN (1u<<10)
#define F_CNAME (1u<<11) #define F_CNAME (1u<<11)
#define F_NOERR (1u<<12) #define F_DNSKEY (1u<<12)
#define F_CONFIG (1u<<13) #define F_CONFIG (1u<<13)
#define F_DS (1u<<14)
#define F_DNSSECOK (1u<<15)
/* below here are only valid as args to log_query: cache /* below here are only valid as args to log_query: cache
entries are limited to 16 bits */ entries are limited to 16 bits */
#define F_UPSTREAM (1u<<16) #define F_UPSTREAM (1u<<16)
#define F_RRNAME (1u<<17) #define F_RRNAME (1u<<17)
#define F_SERVER (1u<<18) #define F_SERVER (1u<<18)
#define F_QUERY (1u<<19) #define F_QUERY (1u<<19)
#define F_NOERR (1u<<20)
/* composites */
#define F_TYPE (F_IPV4 | F_IPV6 | F_DNSKEY | F_DS) /* Only one may be set */
/* struct sockaddr is not large enough to hold any address, /* struct sockaddr is not large enough to hold any address,
@@ -404,7 +426,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;
}; };
@@ -712,7 +734,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;
@@ -839,6 +861,10 @@ char *get_domain(struct in_addr addr);
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
char *get_domain6(struct in6_addr *addr); char *get_domain6(struct in6_addr *addr);
#endif #endif
#ifdef HAVE_DNSSEC
struct keydata *keydata_alloc(char *data, size_t len);
void keydata_free(struct keydata *blocks);
#endif
/* rfc1035.c */ /* rfc1035.c */
unsigned int extract_request(struct dns_header *header, size_t qlen, unsigned int extract_request(struct dns_header *header, size_t qlen,
@@ -906,6 +932,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 */
@@ -976,7 +1003,7 @@ u64 lease_find_max_addr6(struct dhcp_context *context);
void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface); void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface);
#endif #endif
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr, void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now); unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now, int force);
void lease_set_hostname(struct dhcp_lease *lease, char *name, int auth, char *domain, char *config_domain); void lease_set_hostname(struct dhcp_lease *lease, char *name, int auth, char *domain, char *config_domain);
void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now); void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now); void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now);
@@ -1142,7 +1169,7 @@ void ra_start_unsolicted(time_t now, struct dhcp_context *context);
/* slaac.c */ /* slaac.c */
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
void build_subnet_map(void); void build_subnet_map(void);
void slaac_add_addrs(struct dhcp_lease *lease, time_t now); void slaac_add_addrs(struct dhcp_lease *lease, time_t now, int force);
time_t periodic_slaac(time_t now, struct dhcp_lease *leases); time_t periodic_slaac(time_t now, struct dhcp_lease *leases);
void slaac_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface, struct dhcp_lease *leases); void slaac_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface, struct dhcp_lease *leases);
void schedule_subnet_map(void); void schedule_subnet_map(void);
+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,
+20 -10
View File
@@ -98,7 +98,7 @@ void lease_init(time_t now)
hw_type = ARPHRD_ETHER; hw_type = ARPHRD_ETHER;
lease_set_hwaddr(lease, (unsigned char *)daemon->dhcp_buff2, (unsigned char *)daemon->packet, lease_set_hwaddr(lease, (unsigned char *)daemon->dhcp_buff2, (unsigned char *)daemon->packet,
hw_len, hw_type, clid_len, now); hw_len, hw_type, clid_len, now, 0);
if (strcmp(daemon->dhcp_buff, "*") != 0) if (strcmp(daemon->dhcp_buff, "*") != 0)
lease_set_hostname(lease, daemon->dhcp_buff, 0, get_domain(lease->addr), NULL); lease_set_hostname(lease, daemon->dhcp_buff, 0, get_domain(lease->addr), NULL);
@@ -119,7 +119,7 @@ void lease_init(time_t now)
if ((lease = lease6_allocate(&addr.addr.addr6, lease_type))) if ((lease = lease6_allocate(&addr.addr.addr6, lease_type)))
{ {
lease_set_hwaddr(lease, NULL, (unsigned char *)daemon->packet, 0, hw_type, clid_len, now); lease_set_hwaddr(lease, NULL, (unsigned char *)daemon->packet, 0, hw_type, clid_len, now, 0);
if (strcmp(daemon->dhcp_buff, "*") != 0) if (strcmp(daemon->dhcp_buff, "*") != 0)
lease_set_hostname(lease, daemon->dhcp_buff, 0, get_domain6((struct in6_addr *)lease->hwaddr), NULL); lease_set_hostname(lease, daemon->dhcp_buff, 0, get_domain6((struct in6_addr *)lease->hwaddr), NULL);
@@ -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
@@ -702,13 +709,16 @@ void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now)
} }
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr, void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now) unsigned char *clid, int hw_len, int hw_type, int clid_len,
time_t now, int force)
{ {
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
int change = 0; int change = force;
lease->flags |= LEASE_HAVE_HWADDR; lease->flags |= LEASE_HAVE_HWADDR;
#endif #endif
(void)force;
if (hw_len != lease->hwaddr_len || if (hw_len != lease->hwaddr_len ||
hw_type != lease->hwaddr_type || hw_type != lease->hwaddr_type ||
(hw_len != 0 && memcmp(lease->hwaddr, hwaddr, hw_len) != 0)) (hw_len != 0 && memcmp(lease->hwaddr, hwaddr, hw_len) != 0))
@@ -758,7 +768,7 @@ void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
if (change) if (change)
slaac_add_addrs(lease, now); slaac_add_addrs(lease, now, force);
#endif #endif
} }
@@ -886,7 +896,7 @@ void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now)
lease->flags |= LEASE_CHANGED; lease->flags |= LEASE_CHANGED;
#ifdef HAVE_DHCP6 #ifdef HAVE_DHCP6
slaac_add_addrs(lease, now); slaac_add_addrs(lease, now, 0);
#endif #endif
} }
+88 -61
View File
@@ -38,7 +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); static void nl_routechange(struct nlmsghdr *h);
void netlink_init(void) void netlink_init(void)
@@ -49,10 +49,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 +139,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 +185,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 +310,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,71 +318,83 @@ 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);
}
} }
static int nl_async(struct nlmsghdr *h)
{
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)
{
nl_routechange(h);
return 0;
}
else if (h->nlmsg_type == RTM_NEWADDR)
{
#ifdef HAVE_DHCP6
/* force RAs to sync new network and pick up new interfaces. */
if (daemon->ra_contexts)
{
schedule_subnet_map();
ra_start_unsolicted(dnsmasq_time(), NULL);
/* cause lease_update_file to run after we return, in case we were called from
iface_enumerate and can't re-enter it now */
send_alarm(0, 0);
}
return 1; /* clever bind mode - rescan */
}
#endif
return 0;
}
/* We arrange to receive netlink multicast messages whenever the network route is added. /* 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. 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 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 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) */ failing. */
static void nl_routechange(struct nlmsghdr *h) static void nl_routechange(struct nlmsghdr *h)
{ {
if (h->nlmsg_pid == 0 && h->nlmsg_type == RTM_NEWROUTE) 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 (daemon->srv_save)
{ {
struct rtmsg *rtm = NLMSG_DATA(h); if (daemon->srv_save->sfd)
int fd; fd = daemon->srv_save->sfd->fd;
else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
if (rtm->rtm_type != RTN_UNICAST || rtm->rtm_scope != RT_SCOPE_LINK) fd = daemon->rfd_save->fd;
else
return; return;
/* Force re-reading resolv file right now, for luck. */
daemon->last_resolv = 0;
#ifdef HAVE_DHCP6 while(sendto(fd, daemon->packet, daemon->packet_len, 0,
/* force RAs to sync new network and pick up new interfaces. */ &daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
if (daemon->ra_contexts)
{
schedule_subnet_map();
ra_start_unsolicted(dnsmasq_time(), NULL);
/* cause lease_update_file to run after we return, in case we were called from
iface_enumerate and can't re-enter it now */
send_alarm(0, 0);
}
#endif
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 #endif
+12 -14
View File
@@ -207,17 +207,14 @@ 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;
} }
@@ -350,6 +347,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 +356,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;
} }
@@ -546,7 +544,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, daemon->tftp_unlimited, dienow)))
{ {
new->iface = NULL; new->iface = NULL;
new->next = daemon->listeners; new->next = daemon->listeners;
+58 -4
View File
@@ -118,6 +118,8 @@ struct myoption {
#define LOPT_DUID 307 #define LOPT_DUID 307
#define LOPT_HOST_REC 308 #define LOPT_HOST_REC 308
#define LOPT_TFTP_LC 309 #define LOPT_TFTP_LC 309
#define LOPT_RR 310
#define LOPT_CLVERBIND 311
#ifdef HAVE_GETOPT_LONG #ifdef HAVE_GETOPT_LONG
static const struct option opts[] = static const struct option opts[] =
@@ -181,6 +183,7 @@ static const struct myoption opts[] =
{ "srv-host", 1, 0, 'W' }, { "srv-host", 1, 0, 'W' },
{ "localise-queries", 0, 0, 'y' }, { "localise-queries", 0, 0, 'y' },
{ "txt-record", 1, 0, 'Y' }, { "txt-record", 1, 0, 'Y' },
{ "dns-rr", 1, 0, LOPT_RR },
{ "enable-dbus", 0, 0, '1' }, { "enable-dbus", 0, 0, '1' },
{ "bootp-dynamic", 2, 0, '3' }, { "bootp-dynamic", 2, 0, '3' },
{ "dhcp-mac", 1, 0, '4' }, { "dhcp-mac", 1, 0, '4' },
@@ -241,6 +244,7 @@ static const struct myoption opts[] =
{ "enable-ra", 0, 0, LOPT_RA }, { "enable-ra", 0, 0, LOPT_RA },
{ "dhcp-duid", 1, 0, LOPT_DUID }, { "dhcp-duid", 1, 0, LOPT_DUID },
{ "host-record", 1, 0, LOPT_HOST_REC }, { "host-record", 1, 0, LOPT_HOST_REC },
{ "bind-dynamic", 0, 0, LOPT_CLVERBIND },
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };
@@ -339,7 +343,7 @@ static struct {
{ LOPT_NO_NAMES, ARG_DUP, "[=tag:<tag>]...", gettext_noop("Ignore hostnames provided by DHCP clients."), NULL }, { LOPT_NO_NAMES, ARG_DUP, "[=tag:<tag>]...", gettext_noop("Ignore hostnames provided by DHCP clients."), NULL },
{ LOPT_OVERRIDE, OPT_NO_OVERRIDE, NULL, gettext_noop("Do NOT reuse filename and server fields for extra DHCP options."), NULL }, { LOPT_OVERRIDE, OPT_NO_OVERRIDE, NULL, gettext_noop("Do NOT reuse filename and server fields for extra DHCP options."), NULL },
{ LOPT_TFTP, ARG_DUP, "[=<interface>]", gettext_noop("Enable integrated read-only TFTP server."), NULL }, { LOPT_TFTP, ARG_DUP, "[=<interface>]", gettext_noop("Enable integrated read-only TFTP server."), NULL },
{ LOPT_PREFIX, ARG_ONE, "<dir>[,<iface>]", gettext_noop("Export files by TFTP only from the specified subtree."), NULL }, { LOPT_PREFIX, ARG_DUP, "<dir>[,<iface>]", gettext_noop("Export files by TFTP only from the specified subtree."), NULL },
{ LOPT_APREF, OPT_TFTP_APREF, NULL, gettext_noop("Add client IP address to tftp-root."), NULL }, { LOPT_APREF, OPT_TFTP_APREF, NULL, gettext_noop("Add client IP address to tftp-root."), NULL },
{ LOPT_SECURE, OPT_TFTP_SECURE, NULL, gettext_noop("Allow access only to files owned by the user running dnsmasq."), NULL }, { LOPT_SECURE, OPT_TFTP_SECURE, NULL, gettext_noop("Allow access only to files owned by the user running dnsmasq."), NULL },
{ LOPT_TFTP_MAX, ARG_ONE, "<integer>", gettext_noop("Maximum number of conncurrent TFTP transfers (defaults to %s)."), "#" }, { LOPT_TFTP_MAX, ARG_ONE, "<integer>", gettext_noop("Maximum number of conncurrent TFTP transfers (defaults to %s)."), "#" },
@@ -371,6 +375,8 @@ static struct {
{ LOPT_RA, OPT_RA, NULL, gettext_noop("Send router-advertisements for interfaces doing DHCPv6"), NULL }, { LOPT_RA, OPT_RA, NULL, gettext_noop("Send router-advertisements for interfaces doing DHCPv6"), NULL },
{ LOPT_DUID, ARG_ONE, "<enterprise>,<duid>", gettext_noop("Specify DUID_EN-type DHCPv6 server DUID"), NULL }, { LOPT_DUID, ARG_ONE, "<enterprise>,<duid>", gettext_noop("Specify DUID_EN-type DHCPv6 server DUID"), NULL },
{ LOPT_HOST_REC, ARG_DUP, "<name>,<address>", gettext_noop("Specify host (A/AAAA and PTR) records"), NULL }, { LOPT_HOST_REC, ARG_DUP, "<name>,<address>", gettext_noop("Specify host (A/AAAA and PTR) records"), NULL },
{ LOPT_RR, ARG_DUP, "<name>,<RR-number>,[<data>]", gettext_noop("Specify arbitrary DNS resource record"), NULL },
{ LOPT_CLVERBIND, OPT_CLEVERBIND, NULL, gettext_noop("Bind to interfaces in use - check for new interfaces"), NULL},
{ 0, 0, NULL, NULL, NULL } { 0, 0, NULL, NULL, NULL }
}; };
@@ -1113,6 +1119,14 @@ void set_option_bool(unsigned int opt)
daemon->options2 |= 1u << (opt - 32); daemon->options2 |= 1u << (opt - 32);
} }
void reset_option_bool(unsigned int opt)
{
if (opt < 32)
daemon->options &= ~(1u << opt);
else
daemon->options2 &= ~(1u << (opt - 32));
}
static char *one_opt(int option, char *arg, char *gen_prob, int command_line) static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
{ {
int i; int i;
@@ -1567,7 +1581,7 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
/* new->name may be NULL if someone does /* new->name may be NULL if someone does
"interface=" to disable all interfaces except loop. */ "interface=" to disable all interfaces except loop. */
new->name = opt_string_alloc(arg); new->name = opt_string_alloc(arg);
new->isloop = new->used = 0; new->used = 0;
arg = comma; arg = comma;
} while (arg); } while (arg);
break; break;
@@ -1637,7 +1651,8 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
option = '?'; /* error */ option = '?'; /* error */
break; break;
} }
new->used = 0;
daemon->if_addrs = new; daemon->if_addrs = new;
arg = comma; arg = comma;
} while (arg); } while (arg);
@@ -2214,6 +2229,7 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
} }
if (len == -1) if (len == -1)
problem = _("bad hex constant"); problem = _("bad hex constant");
else if ((new->clid = opt_malloc(len))) else if ((new->clid = opt_malloc(len)))
{ {
@@ -2931,7 +2947,42 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
} }
break; break;
} }
case LOPT_RR: /* dns-rr */
{
struct txt_record *new;
size_t len;
char *data;
int val;
comma = split(arg);
data = split(comma);
new = opt_malloc(sizeof(struct txt_record));
new->next = daemon->rr;
daemon->rr = new;
if (!atoi_check(comma, &val) ||
!(new->name = canonicalise_opt(arg)) ||
(data && (len = parse_hex(data, (unsigned char *)data, -1, NULL, NULL)) == -1U))
{
problem = _("bad RR record");
break;
}
new->class = val;
new->len = 0;
if (data)
{
new->txt=opt_malloc(len);
new->len = len;
memcpy(new->txt, data, len);
}
break;
}
case 'Y': /* --txt-record */ case 'Y': /* --txt-record */
{ {
struct txt_record *new; struct txt_record *new;
@@ -3723,6 +3774,9 @@ void read_opts(int argc, char **argv, char *compile_opts)
if (testmode) if (testmode)
{ {
/* Can cause a call to die() */
check_dhcp_hosts(1);
fprintf(stderr, "dnsmasq: %s.\n", _("syntax check OK")); fprintf(stderr, "dnsmasq: %s.\n", _("syntax check OK"));
exit(0); exit(0);
} }
+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 -10
View File
@@ -158,7 +158,8 @@ void icmp6_packet(void)
return; return;
/* weird libvirt-inspired access control */ /* weird libvirt-inspired access control */
for (context = daemon->dhcp6; context; context = context->next) for (context = daemon->ra_contexts ? daemon->ra_contexts : daemon->dhcp6;
context; context = context->next)
if (!context->interface || strcmp(context->interface, interface) == 0) if (!context->interface || strcmp(context->interface, interface) == 0)
break; break;
@@ -179,7 +180,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 +319,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 +380,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 +387,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)
+33 -10
View File
@@ -699,15 +699,17 @@ static unsigned char *do_doctor(unsigned char *p, int count, struct dns_header *
unsigned char *p2 = p1; unsigned char *p2 = p1;
/* make counted string zero-term and sanitise */ /* make counted string zero-term and sanitise */
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
if (isprint(*(p2+1))) {
{ if (!isprint((int)*(p2+1)))
*p2 = *(p2+1); break;
p2++;
} *p2 = *(p2+1);
p2++;
}
*p2 = 0; *p2 = 0;
my_syslog(LOG_INFO, "reply %s is %s", name, p1); my_syslog(LOG_INFO, "reply %s is %s", name, p1);
/* restore */ /* restore */
memmove(p1 + 1, p1, len); memmove(p1 + 1, p1, i);
*p1 = len; *p1 = len;
p1 += len+1; p1 += len+1;
} }
@@ -936,10 +938,14 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
if (!cname_count--) if (!cname_count--)
return 0; /* looped CNAMES */ return 0; /* looped CNAMES */
newc = cache_insert(name, NULL, now, attl, F_CNAME | F_FORWARD); newc = cache_insert(name, NULL, now, attl, F_CNAME | F_FORWARD);
if (newc && cpp) if (newc)
{ {
cpp->addr.cname.cache = newc; newc->addr.cname.cache = NULL;
cpp->addr.cname.uid = newc->uid; if (cpp)
{
cpp->addr.cname.cache = newc;
cpp->addr.cname.uid = newc->uid;
}
} }
cpp = newc; cpp = newc;
@@ -1244,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;
@@ -1387,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 */
+46 -41
View File
@@ -483,7 +483,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
{ {
logaddr = &mess->yiaddr; logaddr = &mess->yiaddr;
lease_set_hwaddr(lease, mess->chaddr, NULL, mess->hlen, mess->htype, 0, now); lease_set_hwaddr(lease, mess->chaddr, NULL, mess->hlen, mess->htype, 0, now, 1);
if (hostname) if (hostname)
lease_set_hostname(lease, hostname, 1, get_domain(lease->addr), domain); lease_set_hostname(lease, hostname, 1, get_domain(lease->addr), domain);
/* infinite lease unless nailed in dhcp-host line. */ /* infinite lease unless nailed in dhcp-host line. */
@@ -1222,51 +1222,56 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
log_tags(tagif_netid, ntohl(mess->xid)); log_tags(tagif_netid, ntohl(mess->xid));
#ifdef HAVE_SCRIPT if (do_classes)
if (do_classes && daemon->lease_change_command)
{ {
struct dhcp_netid *n; /* pick up INIT-REBOOT events. */
if (mess->giaddr.s_addr)
lease->giaddr = mess->giaddr;
lease->flags |= LEASE_CHANGED; lease->flags |= LEASE_CHANGED;
free(lease->extradata);
lease->extradata = NULL;
lease->extradata_size = lease->extradata_len = 0;
add_extradata_opt(lease, option_find(mess, sz, OPTION_VENDOR_ID, 1));
add_extradata_opt(lease, option_find(mess, sz, OPTION_HOSTNAME, 1));
add_extradata_opt(lease, oui);
add_extradata_opt(lease, serial);
add_extradata_opt(lease, class);
/* space-concat tag set */
if (!tagif_netid)
add_extradata_opt(lease, NULL);
else
for (n = tagif_netid; n; n = n->next)
{
struct dhcp_netid *n1;
/* kill dupes */
for (n1 = n->next; n1; n1 = n1->next)
if (strcmp(n->net, n1->net) == 0)
break;
if (!n1)
lease_add_extradata(lease, (unsigned char *)n->net, strlen(n->net), n->next ? ' ' : 0);
}
if ((opt = option_find(mess, sz, OPTION_USER_CLASS, 1))) #ifdef HAVE_SCRIPT
if (daemon->lease_change_command)
{ {
int len = option_len(opt); struct dhcp_netid *n;
unsigned char *ucp = option_ptr(opt, 0);
/* If the user-class option started as counted strings, the first byte will be zero. */ if (mess->giaddr.s_addr)
if (len != 0 && ucp[0] == 0) lease->giaddr = mess->giaddr;
ucp++, len--;
lease_add_extradata(lease, ucp, len, 0); free(lease->extradata);
lease->extradata = NULL;
lease->extradata_size = lease->extradata_len = 0;
add_extradata_opt(lease, option_find(mess, sz, OPTION_VENDOR_ID, 1));
add_extradata_opt(lease, option_find(mess, sz, OPTION_HOSTNAME, 1));
add_extradata_opt(lease, oui);
add_extradata_opt(lease, serial);
add_extradata_opt(lease, class);
/* space-concat tag set */
if (!tagif_netid)
add_extradata_opt(lease, NULL);
else
for (n = tagif_netid; n; n = n->next)
{
struct dhcp_netid *n1;
/* kill dupes */
for (n1 = n->next; n1; n1 = n1->next)
if (strcmp(n->net, n1->net) == 0)
break;
if (!n1)
lease_add_extradata(lease, (unsigned char *)n->net, strlen(n->net), n->next ? ' ' : 0);
}
if ((opt = option_find(mess, sz, OPTION_USER_CLASS, 1)))
{
int len = option_len(opt);
unsigned char *ucp = option_ptr(opt, 0);
/* If the user-class option started as counted strings, the first byte will be zero. */
if (len != 0 && ucp[0] == 0)
ucp++, len--;
lease_add_extradata(lease, ucp, len, 0);
}
} }
}
#endif #endif
}
if (!hostname_auth && (client_hostname = host_from_dns(mess->yiaddr))) if (!hostname_auth && (client_hostname = host_from_dns(mess->yiaddr)))
{ {
@@ -1276,7 +1281,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
} }
time = calc_time(context, config, option_find(mess, sz, OPTION_LEASE_TIME, 4)); time = calc_time(context, config, option_find(mess, sz, OPTION_LEASE_TIME, 4));
lease_set_hwaddr(lease, mess->chaddr, clid, mess->hlen, mess->htype, clid_len, now); lease_set_hwaddr(lease, mess->chaddr, clid, mess->hlen, mess->htype, clid_len, now, do_classes);
/* if all the netids in the ignore_name list are present, ignore client-supplied name */ /* if all the netids in the ignore_name list are present, ignore client-supplied name */
if (!hostname_auth) if (!hostname_auth)
+1 -1
View File
@@ -637,7 +637,7 @@ static int dhcp6_no_relay(int msg_type, struct in6_addr *link_address, struct dh
if (lease) if (lease)
{ {
lease_set_expires(lease, lease_time, now); lease_set_expires(lease, lease_time, now);
lease_set_hwaddr(lease, NULL, clid, 0, iaid, clid_len, now); lease_set_hwaddr(lease, NULL, clid, 0, iaid, clid_len, now, 0);
lease_set_interface(lease, interface, now); lease_set_interface(lease, interface, now);
if (hostname && ia_type == OPTION6_IA_NA) if (hostname && ia_type == OPTION6_IA_NA)
{ {
+13 -1
View File
@@ -23,12 +23,14 @@
static int map_rebuild = 0; static int map_rebuild = 0;
static int ping_id = 0; static int ping_id = 0;
void slaac_add_addrs(struct dhcp_lease *lease, time_t now) void slaac_add_addrs(struct dhcp_lease *lease, time_t now, int force)
{ {
struct slaac_address *slaac, *old, **up; struct slaac_address *slaac, *old, **up;
struct dhcp_context *context; struct dhcp_context *context;
int dns_dirty = 0;
if (!(lease->flags & LEASE_HAVE_HWADDR) || if (!(lease->flags & LEASE_HAVE_HWADDR) ||
(lease->flags & (LEASE_TA | LEASE_NA)) ||
lease->last_interface == 0 || lease->last_interface == 0 ||
!lease->hostname) !lease->hostname)
return ; return ;
@@ -72,6 +74,13 @@ void slaac_add_addrs(struct dhcp_lease *lease, time_t now)
if (IN6_ARE_ADDR_EQUAL(&addr, &slaac->addr)) if (IN6_ARE_ADDR_EQUAL(&addr, &slaac->addr))
{ {
*up = slaac->next; *up = slaac->next;
/* recheck when DHCPv4 goes through init-reboot */
if (force)
{
slaac->ping_time = now;
slaac->backoff = 1;
dns_dirty = 1;
}
break; break;
} }
up = &slaac->next; up = &slaac->next;
@@ -95,6 +104,9 @@ void slaac_add_addrs(struct dhcp_lease *lease, time_t now)
} }
} }
if (old || dns_dirty)
lease_update_dns(1);
/* Free any no reused */ /* Free any no reused */
for (; old; old = slaac) for (; old; old = slaac)
{ {
+18 -10
View File
@@ -312,7 +312,10 @@ void tftp_request(struct listener *listen, time_t now)
!(filename = next(&p, end)) || !(filename = next(&p, end)) ||
!(mode = next(&p, end)) || !(mode = next(&p, end)) ||
(strcasecmp(mode, "octet") != 0 && strcasecmp(mode, "netascii") != 0)) (strcasecmp(mode, "octet") != 0 && strcasecmp(mode, "netascii") != 0))
len = tftp_err(ERR_ILL, packet, _("unsupported request from %s"), daemon->addrbuff); {
len = tftp_err(ERR_ILL, packet, _("unsupported request from %s"), daemon->addrbuff);
is_err = 1;
}
else else
{ {
if (strcasecmp(mode, "netascii") == 0) if (strcasecmp(mode, "netascii") == 0)
@@ -397,7 +400,7 @@ void tftp_request(struct listener *listen, time_t now)
} }
while (sendto(transfer->sockfd, packet, len, 0, while (sendto(transfer->sockfd, packet, len, 0,
(struct sockaddr *)&peer, sizeof(peer)) == -1 && errno == EINTR); (struct sockaddr *)&peer, sa_len(&peer)) == -1 && errno == EINTR);
if (is_err) if (is_err)
free_transfer(transfer); free_transfer(transfer);
@@ -505,12 +508,12 @@ void check_tftp_listeners(fd_set *rset, time_t now)
{ {
tmp = transfer->next; tmp = transfer->next;
prettyprint_addr(&transfer->peer, daemon->addrbuff);
if (FD_ISSET(transfer->sockfd, rset)) if (FD_ISSET(transfer->sockfd, rset))
{ {
/* we overwrote the buffer... */ /* we overwrote the buffer... */
daemon->srv_save = NULL; daemon->srv_save = NULL;
prettyprint_addr(&transfer->peer, daemon->addrbuff);
if ((len = recv(transfer->sockfd, daemon->packet, daemon->packet_buff_sz, 0)) >= (ssize_t)sizeof(struct ack)) if ((len = recv(transfer->sockfd, daemon->packet, daemon->packet_buff_sz, 0)) >= (ssize_t)sizeof(struct ack))
{ {
@@ -533,7 +536,7 @@ void check_tftp_listeners(fd_set *rset, time_t now)
err = ""; err = "";
else else
sanitise(err); sanitise(err);
my_syslog(MS_TFTP | LOG_ERR, _("error %d %s received from %s"), my_syslog(MS_TFTP | LOG_ERR, _("error %d %s received from %s"),
(int)ntohs(mess->block), err, (int)ntohs(mess->block), err,
daemon->addrbuff); daemon->addrbuff);
@@ -570,7 +573,7 @@ void check_tftp_listeners(fd_set *rset, time_t now)
if (len != 0) if (len != 0)
while(sendto(transfer->sockfd, daemon->packet, len, 0, while(sendto(transfer->sockfd, daemon->packet, len, 0,
(struct sockaddr *)&transfer->peer, sizeof(transfer->peer)) == -1 && errno == EINTR); (struct sockaddr *)&transfer->peer, sa_len(&transfer->peer)) == -1 && errno == EINTR);
if (endcon || len == 0) if (endcon || len == 0)
{ {
@@ -579,9 +582,14 @@ void check_tftp_listeners(fd_set *rset, time_t now)
my_syslog(MS_TFTP | LOG_INFO, endcon ? _("failed sending %s to %s") : _("sent %s to %s"), daemon->namebuff, daemon->addrbuff); my_syslog(MS_TFTP | LOG_INFO, endcon ? _("failed sending %s to %s") : _("sent %s to %s"), daemon->namebuff, daemon->addrbuff);
/* unlink */ /* unlink */
*up = tmp; *up = tmp;
/* put on queue to be sent to script and deleted */ if (endcon)
transfer->next = daemon->tftp_done_trans; free_transfer(transfer);
daemon->tftp_done_trans = transfer; else
{
/* put on queue to be sent to script and deleted */
transfer->next = daemon->tftp_done_trans;
daemon->tftp_done_trans = transfer;
}
continue; continue;
} }
} }
@@ -619,7 +627,7 @@ static void sanitise(char *buf)
{ {
unsigned char *q, *r; unsigned char *q, *r;
for (q = r = (unsigned char *)buf; *r; r++) for (q = r = (unsigned char *)buf; *r; r++)
if (isprint(*r)) if (isprint((int)*r))
*(q++) = *r; *(q++) = *r;
*q = 0; *q = 0;
+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;