Compare commits

...
32 Commits
Author SHA1 Message Date
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 844 additions and 378 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
Re-write interface discovery code on *BSD to use
getifaddrs. This is more portable, more straightforward,
@@ -16,7 +55,7 @@ version 2.61
Explicity send DHCPv6 replies to the correct port, instead
of relying on clients to send requests with the correct
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.
Send a preference value of 255 in DHCPv6 replies when
@@ -68,7 +107,7 @@ version 2.61
renumbering at least possible.
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,
using the settings provided for DHCP options
@@ -82,7 +121,7 @@ version 2.61
name. Thanks to Ben Winslow for finding this.
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
interface work. This is only available on Linux; it's not
supported on other platforms. Thanks to Vishvananda Ishaya
@@ -93,8 +132,16 @@ version 2.61
Give correct from-cache answers to explict CNAME queries.
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.
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
+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
* New upstream.
Vendored
+21
View File
@@ -259,6 +259,27 @@ case "$1" in
dump-stats)
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
exit 3
+8 -8
View File
@@ -11,14 +11,14 @@
package=dnsmasq-base
# policy manual, section 10.1
ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS = -g -O0 -Wall -W
else
CFLAGS = -g -O2 -Wall -W
endif
CFLAGS = $(shell export DEB_BUILD_OPTIONS=$(DEB_BUILD_OPTIONS); dpkg-buildflags --get CFLAGS)
CFLAGS += $(shell dpkg-buildflags --get CPPFLAGS)
CFLAGS += -Wall -W
LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS)
COPTS =
TARGET = install-i18n
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/var/run \
-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)))
install -m 644 doc.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/bin \
-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 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
+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.
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
# upstream to run dnsmasq as an isolated user that does not run any other
# processes, owns no files and has no shell. The default 'nobody' user has a
# shell and might be used for other processes.
# It also adds the command-line flags
# --keep-in-foreground --pid-file --enable-dbus
# to disable writing a pid-file (not needed with systemd) and
# enable DBus by default because we use DBus activation.
#
# Debian-specific: add /etc/dnsmasq.d to config search path (with the exception
# of .dpkg-*). Packages such as libvirt leave config files there.
#
# --pid-file without argument disables writing a PIDfile, we don't need one.
ExecStart=/usr/sbin/dnsmasq -k \
--enable-dbus \
--user=dnsmasq \
-7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new \
--pid-file
ExecStart=/etc/init.d/dnsmasq systemd-exec
# The systemd-*-resolvconf functions configure (and deconfigure)
# resolvconf to work with the dnsmasq DNS server. They're called liek
# this to get correct error handling (ie don't start-resolvconf if the
# dnsmasq daemon fails to start.
ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf
ExecStop=/etc/init.d/dnsmasq systemd-stop-resolvconf
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
dnsmasq which provide DHCP service to run in the same machine.
.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.
.TP
.B \-y, --localise-queries
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
@@ -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
is permissable to have more than one cname pointing to the same target.
.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>
Return a DNS record associating the name with the primary address on
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"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-06-18 12:24+0100\n"
"PO-Revision-Date: 2010-05-24 16:29+0200\n"
"Last-Translator: Matthias Andree <matthias.andree@gmx.de>\n"
"PO-Revision-Date: 2012-04-05 17:54+0100\n"
"Last-Translator: Conrad Kostecki <ConiKost@gmx.de>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -25,17 +25,20 @@ msgstr ""
msgid "failed to load names from %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
msgid "bad address at %s line %d"
msgstr "Fehlerhafte Adresse in %s Zeile %d"
#: cache.c:846 dhcp.c:871
#: cache.c:846
#: dhcp.c:871
#, c-format
msgid "bad name at %s line %d"
msgstr "Fehlerhafter Name in %s Zeile %d"
#: cache.c:853 dhcp.c:946
#: cache.c:853
#: dhcp.c:946
#, c-format
msgid "read %s - %d addresses"
msgstr "%s gelesen - %d Adressen"
@@ -47,7 +50,7 @@ msgstr "Cache geleert"
#: cache.c:953
#, c-format
msgid "No IPv4 address found for %s"
msgstr ""
msgstr "Keine IPv4-Adresse für %s gefunden"
#: cache.c:1005
#, c-format
@@ -88,7 +91,8 @@ msgstr "Konnte den Zufallszahlengenerator nicht initialisieren: %s"
msgid "failed to allocate memory"
msgstr "Konnte Speicher nicht belegen"
#: util.c:227 option.c:717
#: util.c:227
#: option.c:717
msgid "could not get memory"
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."
#: option.c:268
#, fuzzy
msgid "Read DHCP host specs from file."
msgstr "DHCP-Host-Angaben aus Datei lesen"
msgstr "DHCP-Host-Angaben aus Datei lesen."
#: option.c:269
#, fuzzy
msgid "Read DHCP option specs from file."
msgstr "DHCP-Optionen aus Datei lesen"
msgstr "DHCP-Optionen aus Datei lesen."
#: option.c:270
#, fuzzy
msgid "Evaluate conditional tag expression."
msgstr "Auswertung eines Ausdrucks bedingter Marken"
msgstr "Auswertung eines Ausdrucks bedingter Marken."
#: option.c:271
#, 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."
#: option.c:304
#, fuzzy
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."
@@ -414,17 +414,14 @@ msgid "Disable ICMP echo address checking in the DHCP server."
msgstr "ICMP-Echo-Adressprüfung im DHCP-Server abschalten."
#: option.c:325
#, fuzzy
msgid "Shell script to run on DHCP lease creation and destruction."
msgstr "Skript, das bei Erzeugung/Löschung einer DHCP-Lease laufen soll."
#: option.c:326
#, fuzzy
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
#, fuzzy
msgid "Run lease-change scripts as this user."
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."
#: option.c:346
#, fuzzy
msgid "Inhibit DNS-rebind protection on this domain."
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
#: option.c:353
#, fuzzy
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
msgid "Use these DHCP relays as full proxies."
@@ -560,28 +555,27 @@ msgstr "Konfigurationssyntax prüfen."
#: option.c:359
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
#, fuzzy
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
msgid "Attempt to allocate sequential IP addresses to DHCP clients."
msgstr ""
msgstr "Versuche sequenzielle IP-Adressen an DHCP-Klienten zu vergeben."
#: option.c:362
msgid "Copy connection-track mark from queries to upstream connections."
msgstr ""
msgstr "Kopiere \"connection-track mark\" von Anfragen nach Upstream-Verbindungen."
#: option.c:363
msgid "Allow DHCP clients to do their own DDNS updates."
msgstr ""
msgstr "Erlaube DHCP-Klienten ihre eigenen DDNS-Updates durchzuführen."
#: option.c:364
msgid "Send router-advertisements for interfaces doing DHCPv6"
msgstr ""
msgstr "Sende \"Router-Advertisments\" für Netzwerkschnittstellen, welche DHCPv6 nutzen"
#: option.c:782
#, c-format
@@ -608,13 +602,13 @@ msgid "Known DHCP options:\n"
msgstr "Bekannte DHCP-Optionen:\n"
#: option.c:838
#, fuzzy, c-format
#, c-format
msgid "Known DHCPv6 options:\n"
msgstr "Bekannte DHCP-Optionen:\n"
msgstr "Bekannte DHCPv6-Optionen:\n"
#: option.c:973
msgid "unsupported encapsulation for IPv6 option"
msgstr ""
msgstr "Nicht unterstützte Verkapselung für eine IPv6-Option"
#: option.c:1001
msgid "bad dhcp-option"
@@ -624,10 +618,11 @@ msgstr "Fehlerhafte DHCP-Option"
msgid "bad IP address"
msgstr "Fehlerhafte IP-Adresse"
#: option.c:1071 option.c:1177 option.c:2511
#, fuzzy
#: option.c:1071
#: option.c:1177
#: option.c:2511
msgid "bad IPv6 address"
msgstr "Fehlerhafte IP-Adresse"
msgstr "Fehlerhafte IPv6-Adresse"
#: option.c:1205
msgid "bad domain in dhcp-option"
@@ -649,23 +644,25 @@ msgstr "unzulässig wiederholte Markierung"
msgid "illegal repeated keyword"
msgstr "unzulässig wiederholtes Schlüsselwort"
#: option.c:1452 option.c:3536
#: option.c:1452
#: option.c:3536
#, c-format
msgid "cannot access directory %s: %s"
msgstr "Kann auf Verzeichnis %s nicht zugreifen: %s"
#: option.c:1483 tftp.c:464
#: option.c:1483
#: tftp.c:464
#, c-format
msgid "cannot access %s: %s"
msgstr "Kann auf %s nicht zugreifen: %s"
#: option.c:1512
msgid "setting log facility is not possible under Android"
msgstr ""
msgstr "Die Einstellung Protokolliereinrichtung kann unter Android nicht gesetzt werden"
#: option.c:1521
msgid "bad log facility"
msgstr ""
msgstr "Falsche Protokolliereinrichtung"
#: option.c:1570
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"
#: option.c:1607
#, fuzzy
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"
msgstr "unzulässiger Port"
#: option.c:2015 option.c:2046
#: option.c:2015
#: option.c:2046
msgid "interface binding not supported"
msgstr "Schnittstellenbindung nicht unterstützt"
#: option.c:2026 option.c:3088
#: option.c:2026
#: option.c:3088
msgid "bad interface name"
msgstr "unzulässiger Schnittestellenname"
@@ -726,20 +725,20 @@ msgstr "inkonsistenter DHCP-Bereich"
#: option.c:2374
msgid "prefix must be at least 64"
msgstr ""
msgstr "Der Prefix muss mindestens 64 sein"
#: option.c:2378
#, fuzzy
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"
msgstr ""
msgstr "Falscher Hexwert"
#: option.c:2503
msgid "cannot match tags in --dhcp-host"
msgstr ""
msgstr "Kann die Tags in --dhcp-host nicht abgleichen"
#: option.c:2583
msgid "bad DHCP host name"
@@ -749,7 +748,8 @@ msgstr "unzulässiger DHCP-Hostname"
msgid "bad 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"
msgstr "unzulässige Portnummer"
@@ -826,19 +826,21 @@ msgstr "Fehler"
msgid "%s at line %d of %%s"
msgstr "%s in Zeile %d von %%s"
#: option.c:3491 tftp.c:627
#: option.c:3491
#: tftp.c:627
#, c-format
msgid "cannot read %s: %s"
msgstr "kann %s nicht lesen: %s"
#: option.c:3657 option.c:3693
#: option.c:3657
#: option.c:3693
#, c-format
msgid "read %s"
msgstr "%s gelesen"
#: option.c:3745
msgid "junk found in command line"
msgstr ""
msgstr "Mist in der Kommandozeile gefunden"
#: option.c:3780
#, c-format
@@ -846,12 +848,12 @@ msgid "Dnsmasq version %s %s\n"
msgstr "Dnsmasq Version %s %s\n"
#: option.c:3781
#, fuzzy, c-format
#, c-format
msgid ""
"Compile time options: %s\n"
"\n"
msgstr ""
"Übersetzungs-Optionen %s\n"
"Kompilierungs-Optionen %s\n"
"\n"
#: option.c:3782
@@ -863,12 +865,12 @@ msgstr "Für diese Software wird ABSOLUT KEINE GARANTIE gewährt.\n"
#: option.c:3783
#, c-format
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
#, c-format
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
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."
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
msgid "failed to read %s: %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"
#: option.c:3920
#, fuzzy
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
msgid "syntax check OK"
msgstr "Syntaxprüfung OK"
#: forward.c:113
#, fuzzy, c-format
#, c-format
msgid "failed to send packet: %s"
msgstr "konnte Socket nicht zum Empfang einrichten: %s"
msgstr "Fehlgeschlagen, folgendes Paket zu senden: %s"
#: forward.c:474
#, c-format
@@ -931,9 +934,9 @@ msgid "possible DNS-rebind attack detected: %s"
msgstr "möglichen DNS-Rebind-Angriff entdeckt: %s"
#: network.c:355
#, fuzzy, c-format
#, c-format
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
#, 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
#: network.c:785
msgid "unqualified"
msgstr ""
msgstr "unqualifiziert"
#: network.c:785
msgid "names"
msgstr ""
msgstr "Namen"
#: network.c:787
msgid "default"
msgstr ""
msgstr "Standard"
#: network.c:789
msgid "domain"
msgstr ""
msgstr "Domain"
#: network.c:792
#, c-format
msgid "using local addresses only for %s %s"
msgstr ""
msgstr "Benutze lokale Adressen nur für %s %s"
#: network.c:794
#, c-format
msgid "using standard nameservers for %s %s"
msgstr ""
msgstr "Benutze standard Namensserver für %s %s"
#: network.c:796
#, c-format
msgid "using nameserver %s#%d for %s %s"
msgstr ""
msgstr "Benutze Namensserver %s#%d für %s %s"
#: network.c:799
#, c-format
msgid "using nameserver %s#%d(via %s)"
msgstr ""
msgstr "Benutze Namensserver %s#%d(via %s)"
#: network.c:801
#, c-format
msgid "using nameserver %s#%d"
msgstr ""
msgstr "Benutze Namensserver %s#%d"
#: dnsmasq.c:123
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
msgid "Cannot use --conntrack AND --query-port"
msgstr ""
msgstr "Kann nicht --conntrack UND --query-port einsetzen"
#: dnsmasq.c:131
#, fuzzy
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
msgid "asychronous logging is not available under Solaris"
msgstr "asynchrone Protokollierung unter Solaris nicht verfügbar"
#: dnsmasq.c:141
#, fuzzy
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
#, c-format
@@ -1029,7 +1030,8 @@ msgstr "unbekannte Schnittstelle %s"
msgid "no interface with address %s"
msgstr "keine Schnittstelle mit Adresse %s"
#: dnsmasq.c:220 dnsmasq.c:770
#: dnsmasq.c:220
#: dnsmasq.c:770
#, c-format
msgid "DBus error: %s"
msgstr "DBus-Fehler: %s"
@@ -1062,7 +1064,7 @@ msgstr "gestartet, Version %s, Cachegröße %d"
#: dnsmasq.c:485
#, c-format
msgid "started, version %s cache disabled"
msgstr ""
msgstr "Gestartet, Version %s Cache deaktiviert"
#: dnsmasq.c:487
#, c-format
@@ -1106,7 +1108,7 @@ msgstr "asynchrone Protokollierung eingeschaltet, Warteschlange fasst %d Nachric
#: dnsmasq.c:524
msgid "IPv6 router advertisement enabled"
msgstr ""
msgstr "IPv6-Router-Advertisement aktiviert"
#: dnsmasq.c:554
#, 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"
#: dnsmasq.c:556
#, fuzzy, c-format
#, c-format
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
#, 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"
#: dnsmasq.c:588
msgid "root is "
msgstr ""
msgstr "Wurzel ist"
#: dnsmasq.c:588
msgid "enabled"
msgstr ""
msgstr "Aktiviert"
#: dnsmasq.c:590
msgid "secure mode"
msgstr ""
msgstr "sicherer Modus"
#: dnsmasq.c:616
#, c-format
@@ -1181,24 +1183,24 @@ msgid "failed to open pidfile %s: %s"
msgstr "kann die Prozessidentifikations-(PID)-Datei %s nicht öffnen: %s"
#: dnsmasq.c:930
#, fuzzy, c-format
#, c-format
msgid "cannot open log %s: %s"
msgstr "kann %s nicht öffnen: %s"
msgstr "Kann Logdatei %s nicht öffnen: %s"
#: dnsmasq.c:933
#, fuzzy, c-format
#, c-format
msgid "failed to load Lua script: %s"
msgstr "konnte %s nicht lesen: %s"
msgstr "Konnte Lua-Script nicht laden: %s"
#: dnsmasq.c:1002
#, fuzzy, c-format
#, c-format
msgid "script process killed by signal %d"
msgstr "Tochterprozess durch Signal %d zerstört"
msgstr "Scriptprozess durch Signal %d getötet"
#: dnsmasq.c:1006
#, fuzzy, c-format
#, c-format
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
#, c-format
@@ -1309,22 +1311,23 @@ msgstr "Ignoriere Domäne %s für DHCP-Hostnamen %s"
#: rfc2131.c:337
#, c-format
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
msgid "with subnet selector"
msgstr ""
msgstr "mit Subnetz-Wähler"
#: rfc2131.c:338
msgid "via"
msgstr ""
msgstr "via"
#: rfc2131.c:350
#, c-format
msgid "%u available DHCP subnet: %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
msgid "%u available DHCP range: %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
#: rfc2131.c:382
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"
msgstr ""
msgstr "ignoriert"
#: rfc2131.c:438 rfc2131.c:1179
#: rfc2131.c:438
#: rfc2131.c:1179
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"
msgstr ""
msgstr "Keine Adresse verfügbar"
#: rfc2131.c:459 rfc2131.c:1142
#: rfc2131.c:459
#: rfc2131.c:1142
msgid "wrong network"
msgstr ""
msgstr "Falsches Netzwerk"
#: rfc2131.c:474
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"
msgstr ""
msgstr "Keine Leases übrig"
#: rfc2131.c:564 rfc3315.c:362
#: rfc2131.c:564
#: rfc3315.c:362
#, c-format
msgid "%u client provides name: %s"
msgstr "%u Klient stellt Name bereit: %s"
@@ -1377,7 +1387,8 @@ msgstr "%u Benutzerklasse: %s"
msgid "PXE BIS not supported"
msgstr "PXE BIS nicht unterstützt"
#: rfc2131.c:911 rfc3315.c:1098
#: rfc2131.c:911
#: rfc3315.c:1098
#, c-format
msgid "disabling DHCP static address %s for %s"
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
#: rfc2131.c:932
msgid "unknown lease"
msgstr ""
msgstr "Unbekannter Lease"
#: rfc2131.c:964 rfc3315.c:556
#: rfc2131.c:964
#: rfc3315.c:556
#, c-format
msgid "not using configured address %s because it is leased to %s"
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"
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
msgid "not using configured address %s because it was previously declined"
msgstr "benutze konfigurierte Adresse %s nicht, weil sie zuvor abgelehnt wurde"
# FIXME: do not assemble
#: rfc2131.c:993 rfc2131.c:1185
#: rfc2131.c:993
#: rfc2131.c:1185
msgid "no unique-id"
msgstr ""
msgstr "Keine eindeutige ID"
#: rfc2131.c:1080
msgid "wrong server-ID"
msgstr ""
msgstr "Falsche Server-ID"
#: rfc2131.c:1099
msgid "wrong address"
msgstr ""
msgstr "Falsche Adresse"
#: rfc2131.c:1117
msgid "lease not found"
msgstr ""
msgstr "Lease nicht gefunden"
#: rfc2131.c:1150
msgid "address not available"
msgstr ""
msgstr "Adresse nicht verfügbar"
#: rfc2131.c:1161
msgid "static lease available"
msgstr ""
msgstr "Statischer Lease verfügbar"
#: rfc2131.c:1165
msgid "address reserved"
msgstr ""
msgstr "Adresse reserviert"
#: rfc2131.c:1173
#, c-format
@@ -1465,7 +1479,8 @@ msgstr "kann DHCP/BOOTP-Opition %d nicht setzen: kein Platz mehr im Paket"
msgid "PXE menu too large"
msgstr "PXE-Menüeintrag zu groß"
#: rfc2131.c:2117 rfc3315.c:1294
#: rfc2131.c:2117
#: rfc3315.c:1294
#, c-format
msgid "%u requested options: %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
msgid "lease() function missing in Lua script"
msgstr ""
msgstr "Die Funktion lease() fehlt im Lua-Script"
#: tftp.c:285
msgid "unable to get free port for TFTP"
@@ -1557,37 +1572,37 @@ msgstr "Start fehlgeschlagen"
#: conntrack.c:65
#, c-format
msgid "Conntrack connection mark retrieval failed: %s"
msgstr ""
msgstr "\"Conntrack connection mark\"-Abruf fehlgeschlagen: %s"
#: dhcp6.c:46
#, fuzzy, c-format
#, c-format
msgid "cannot create DHCPv6 socket: %s"
msgstr "kann DHCP-Socket nicht erzeugen: %s"
msgstr "Kann DHCPv6-Socket nicht erzeugen: %s"
#: dhcp6.c:57
#, fuzzy, c-format
#, c-format
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
#, c-format
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
#, c-format
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
#, fuzzy, c-format
#, c-format
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
#, c-format
msgid "Ignoring duplicate dhcp-option %d"
msgstr ""
msgstr "Ignoriere doppelt vorhandene DHCP-Option %d"
#: dhcp-common.c:208
#, 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"
#: dhcp-common.c:443
#, fuzzy, c-format
#, c-format
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
#, fuzzy, c-format
#, c-format
msgid "cannot create ICMPv6 socket: %s"
msgstr "kann DHCP-Socket nicht erzeugen: %s"
msgstr "Kann ICMPv6-Socket nicht erzeugen: %s"
#, fuzzy
#~ 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 int bignames_left, hash_size;
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. */
static const struct {
@@ -190,6 +193,10 @@ static void cache_free(struct crec *crecp)
big_free = crecp->name.bname;
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) */
@@ -233,7 +240,11 @@ static int is_outdated_cname_pointer(struct crec *crecp)
if (!(crecp->flags & F_CNAME))
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 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) &&
((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))
{
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 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 (insert_error)
@@ -452,9 +465,7 @@ struct crec *cache_insert(char *name, struct all_addr *addr,
if (addr)
new->addr.addr = *addr;
else
new->addr.cname.cache = NULL;
new->ttd = now + (time_t)ttl;
new->next = new_chain;
new_chain = new;
@@ -1150,22 +1161,35 @@ void dump_cache(time_t now)
if (!is_outdated_cname_pointer(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
{
a = daemon->addrbuff;
if (cache->flags & F_IPV4)
inet_ntop(AF_INET, &cache->addr.addr, a, ADDRSTRLEN);
#ifdef HAVE_IPV6
else if (cache->flags & F_IPV6)
inet_ntop(AF_INET6, &cache->addr.addr, a, ADDRSTRLEN);
}
#else
else
a = inet_ntoa(cache->addr.addr.addr.addr4);
#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_IPV6 ? "6" : "",
cache->flags & F_DNSKEY ? "K" : "",
cache->flags & F_DS ? "S" : "",
cache->flags & F_CNAME ? "C" : "",
cache->flags & F_FORWARD ? "F" : " ",
cache->flags & F_REVERSE ? "R" : " ",
@@ -1173,7 +1197,8 @@ void dump_cache(time_t now)
cache->flags & F_DHCP ? "D" : " ",
cache->flags & F_NEG ? "N" : " ",
cache->flags & F_NXDOMAIN ? "X" : " ",
cache->flags & F_HOSTS ? "H" : " ");
cache->flags & F_HOSTS ? "H" : " ",
cache->flags & F_DNSSECOK ? "V" : " ");
#ifdef HAVE_BROKEN_RTC
p += sprintf(p, "%lu", cache->flags & F_IMMORTAL ? 0: (unsigned long)(cache->ttd - now));
#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);
}
#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 CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
#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 FORWARD_TEST 50 /* try all servers every 50 queries */
#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;
/* 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)
break;
if (!context)
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
instance binding port 67. That's OK if they serve different networks.
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
int rc = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &oneopt, sizeof(oneopt));
+56 -24
View File
@@ -114,6 +114,9 @@ int main (int argc, char **argv)
set_option_bool(OPT_NOWILD);
}
# endif
if (option_bool(OPT_CLEVERBIND))
die(_("--bind-dynamic not available on this platform"), NULL, EC_BADCONF);
#endif
#ifndef HAVE_TFTP
@@ -185,6 +188,9 @@ int main (int argc, char **argv)
#ifdef HAVE_LINUX_NETWORK
/* After lease_init */
netlink_init();
if (option_bool(OPT_NOWILD) && option_bool(OPT_CLEVERBIND))
die(_("cannot set --bind-interfaces and --bind-dynamic"), NULL, EC_BADCONF);
#endif
#ifdef HAVE_DHCP6
@@ -202,13 +208,14 @@ int main (int argc, char **argv)
if (!enumerate_interfaces())
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);
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
if (if_tmp->name && !if_tmp->used)
die(_("unknown interface %s"), if_tmp->name, EC_BADNET);
if (!option_bool(OPT_CLEVERBIND))
for (if_tmp = daemon->if_names; if_tmp; if_tmp = if_tmp->next)
if (if_tmp->name && !if_tmp->used)
die(_("unknown interface %s"), if_tmp->name, EC_BADNET);
#if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP)
/* after enumerate_interfaces() */
@@ -425,8 +432,9 @@ int main (int argc, char **argv)
#if defined(HAVE_LINUX_NETWORK)
/* 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
ports because of DAD, we need CAP_NET_BIND_SERVICE too. */
if (is_dad_listeners())
ports because of DAD, or we're doing it dynamically,
we need CAP_NET_BIND_SERVICE too. */
if (is_dad_listeners() || option_bool(OPT_CLEVERBIND))
data->effective = data->permitted = data->inheritable =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) |
(1 << CAP_SETUID) | (1 << CAP_NET_BIND_SERVICE);
@@ -474,7 +482,7 @@ int main (int argc, char **argv)
}
#ifdef HAVE_LINUX_NETWORK
if (is_dad_listeners())
if (is_dad_listeners() || option_bool(OPT_CLEVERBIND))
data->effective = data->permitted =
(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) | (1 << CAP_NET_BIND_SERVICE);
else
@@ -498,6 +506,34 @@ int main (int argc, char **argv)
prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
#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)
my_syslog(LOG_INFO, _("started, version %s DNS disabled"), VERSION);
else if (daemon->cachesize != 0)
@@ -849,14 +885,11 @@ int main (int argc, char **argv)
}
#ifdef HAVE_DHCP6
if (daemon->dhcp6)
{
if (FD_ISSET(daemon->dhcp6fd, &rset))
dhcp6_packet(now);
if (daemon->dhcp6 && FD_ISSET(daemon->dhcp6fd, &rset))
dhcp6_packet(now);
if (daemon->ra_contexts && FD_ISSET(daemon->icmp6fd, &rset))
icmp6_packet();
}
if (daemon->ra_contexts && FD_ISSET(daemon->icmp6fd, &rset))
icmp6_packet();
#endif
# ifdef HAVE_SCRIPT
@@ -998,6 +1031,9 @@ static void fatal_event(struct event_desc *ev, char *msg)
case EVENT_LUA_ERR:
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 +1245,9 @@ void clear_cache_and_reload(time_t now)
}
#ifdef HAVE_DHCP6
else if (daemon->ra_contexts)
{
/* Not doing DHCP, so no lease system, manage
alarms for ra only */
time_t next_event = periodic_ra(now);
if (next_event != 0)
alarm((unsigned)difftime(next_event, now));
}
/* Not doing DHCP, so no lease system, manage
alarms for ra only */
send_alarm(periodic_ra(now), now);
#endif
#endif
}
@@ -1328,7 +1360,7 @@ static void check_dns_listeners(fd_set *set, time_t now)
getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) == -1)
continue;
if (option_bool(OPT_NOWILD))
if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
iface = listener->iface; /* May be NULL */
else
{
@@ -1345,7 +1377,7 @@ static void check_dns_listeners(fd_set *set, time_t now)
break;
}
if (!iface && !option_bool(OPT_NOWILD))
if (!iface && !(option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND)))
{
shutdown(confd, SHUT_RDWR);
close(confd);
+34 -8
View File
@@ -159,6 +159,7 @@ struct event_desc {
#define EVENT_LOG_ERR 17
#define EVENT_FORK_ERR 18
#define EVENT_LUA_ERR 19
#define EVENT_TFTP_ERR 20
/* Exit codes. */
#define EC_GOOD 0
@@ -218,7 +219,8 @@ struct event_desc {
#define OPT_FQDN_UPDATE 36
#define OPT_RA 37
#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
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 */
};
struct keydata {
struct keydata *next;
unsigned char key[KEYBLOCK_LEN];
};
struct crec {
struct crec *next, *prev, *hash_next;
time_t ttd; /* time to die */
int uid;
/* union is 16 bytes when doing IPv6, 8 bytes on 32 bit machines without IPv6 */
union {
struct all_addr addr;
struct {
struct crec *cache;
int uid;
} 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;
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;
union {
char sname[SMALLDNAME];
@@ -329,14 +344,21 @@ struct crec {
#define F_BIGNAME (1u<<9)
#define F_NXDOMAIN (1u<<10)
#define F_CNAME (1u<<11)
#define F_NOERR (1u<<12)
#define F_DNSKEY (1u<<12)
#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
entries are limited to 16 bits */
#define F_UPSTREAM (1u<<16)
#define F_RRNAME (1u<<17)
#define F_SERVER (1u<<18)
#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,
@@ -404,7 +426,7 @@ struct listener {
struct iname {
char *name;
union mysockaddr addr;
int isloop, used;
int used;
struct iname *next;
};
@@ -712,7 +734,7 @@ extern struct daemon {
time_t last_resolv;
struct mx_srv_record *mxnames;
struct naptr *naptr;
struct txt_record *txt;
struct txt_record *txt, *rr;
struct ptr_record *ptr;
struct host_record *host_records, *host_records_tail;
struct cname *cnames;
@@ -839,6 +861,10 @@ char *get_domain(struct in_addr addr);
#ifdef HAVE_IPV6
char *get_domain6(struct in6_addr *addr);
#endif
#ifdef HAVE_DNSSEC
struct keydata *keydata_alloc(char *data, size_t len);
void keydata_free(struct keydata *blocks);
#endif
/* rfc1035.c */
unsigned int extract_request(struct dns_header *header, size_t qlen,
@@ -976,7 +1002,7 @@ u64 lease_find_max_addr6(struct dhcp_context *context);
void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface);
#endif
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_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now);
@@ -1142,7 +1168,7 @@ void ra_start_unsolicted(time_t now, struct dhcp_context *context);
/* slaac.c */
#ifdef HAVE_DHCP6
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);
void slaac_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface, struct dhcp_lease *leases);
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)
{
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;
@@ -624,7 +624,7 @@ void reply_query(int fd, int family, time_t now)
{
header->id = htons(forward->orig_id);
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);
}
free_frec(forward); /* cancel */
@@ -819,8 +819,8 @@ void receive_query(struct listener *listen, time_t now)
dst_addr_4, netmask, now);
if (m >= 1)
{
send_from(listen->fd, option_bool(OPT_NOWILD), (char *)header,
m, &source_addr, &dst_addr, if_index);
send_from(listen->fd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND),
(char *)header, m, &source_addr, &dst_addr, if_index);
daemon->local_answer++;
}
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;
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)
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)))
{
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)
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 */
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)
next_event = ra_event;
if ((event = periodic_ra(now)) != 0)
{
if (next_event == 0 || difftime(next_event, event) > 0.0)
next_event = event;
}
}
#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,
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
int change = 0;
int change = force;
lease->flags |= LEASE_HAVE_HWADDR;
#endif
(void)force;
if (hw_len != lease->hwaddr_len ||
hw_type != lease->hwaddr_type ||
(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
if (change)
slaac_add_addrs(lease, now);
slaac_add_addrs(lease, now, force);
#endif
}
@@ -886,7 +896,7 @@ void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now)
lease->flags |= LEASE_CHANGED;
#ifdef HAVE_DHCP6
slaac_add_addrs(lease, now);
slaac_add_addrs(lease, now, 0);
#endif
}
+88 -61
View File
@@ -38,7 +38,7 @@
static struct iovec iov;
static u32 netlink_pid;
static void nl_err(struct nlmsghdr *h);
static int nl_async(struct nlmsghdr *h);
static void nl_routechange(struct nlmsghdr *h);
void netlink_init(void)
@@ -49,10 +49,13 @@ void netlink_init(void)
addr.nl_family = AF_NETLINK;
addr.nl_pad = 0;
addr.nl_pid = 0; /* autobind */
#ifdef HAVE_IPV6
addr.nl_groups = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
#else
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
/* 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;
ssize_t len;
static unsigned int seq = 0;
int callback_ok = 1;
int callback_ok = 1, newaddr = 0;
struct {
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))
if (h->nlmsg_seq != seq || h->nlmsg_pid != netlink_pid)
nl_routechange(h); /* May be multicast arriving async */
else if (h->nlmsg_type == NLMSG_ERROR)
nl_err(h);
if (h->nlmsg_seq != seq || h->nlmsg_pid != netlink_pid || h->nlmsg_type == NLMSG_ERROR)
{
/* May be multicast arriving async */
if (nl_async(h))
newaddr = 1;
}
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)
{
struct ifaddrmsg *ifa = NLMSG_DATA(h);
@@ -295,7 +310,7 @@ void netlink_multicast(void)
{
ssize_t len;
struct nlmsghdr *h;
int flags;
int flags, newaddr = 0;
/* don't risk blocking reading netlink messages here. */
if ((flags = fcntl(daemon->netlinkfd, F_GETFL)) == -1 ||
@@ -303,71 +318,83 @@ void netlink_multicast(void)
return;
if ((len = netlink_recv()) != -1)
{
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
if (h->nlmsg_type == NLMSG_ERROR)
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);
for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
if (nl_async(h))
newaddr = 1;
if (err->error != 0)
my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error)));
/* restore non-blocking status */
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 !!option_bool(OPT_CLEVERBIND); /* clever bind mode - rescan */
}
#endif
return 0;
}
/* We arrange to receive netlink multicast messages whenever the network route is added.
If this happens and we still have a DNS packet in the buffer, we re-send it.
This helps on DoD links, where frequently the packet which triggers dialling is
a DNS query, which then gets lost. By re-sending, we can avoid the lookup
failing. Note that we only accept these messages from the kernel (pid == 0) */
failing. */
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);
int fd;
if (rtm->rtm_type != RTN_UNICAST || rtm->rtm_scope != RT_SCOPE_LINK)
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;
/* Force re-reading resolv file right now, for luck. */
daemon->last_resolv = 0;
#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);
}
#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());
}
while(sendto(fd, daemon->packet, daemon->packet_len, 0,
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
}
}
#endif
+3 -6
View File
@@ -207,17 +207,14 @@ static int iface_allowed(struct irec **irecp, int if_index,
struct iname *lo;
for (lo = daemon->if_names; lo; lo = lo->next)
if (lo->name && strcmp(lo->name, ifr.ifr_name) == 0)
{
lo->isloop = 1;
break;
}
break;
if (!lo &&
(lo = whine_malloc(sizeof(struct iname))) &&
(lo->name = whine_malloc(strlen(ifr.ifr_name)+1)))
{
strcpy(lo->name, ifr.ifr_name);
lo->isloop = lo->used = 1;
lo->used = 1;
lo->next = daemon->if_names;
daemon->if_names = lo;
}
@@ -546,7 +543,7 @@ void create_bound_listeners(int dienow)
for (if_tmp = daemon->if_addrs; if_tmp; if_tmp = if_tmp->next)
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->next = daemon->listeners;
+50 -4
View File
@@ -118,6 +118,8 @@ struct myoption {
#define LOPT_DUID 307
#define LOPT_HOST_REC 308
#define LOPT_TFTP_LC 309
#define LOPT_RR 310
#define LOPT_CLVERBIND 311
#ifdef HAVE_GETOPT_LONG
static const struct option opts[] =
@@ -181,6 +183,7 @@ static const struct myoption opts[] =
{ "srv-host", 1, 0, 'W' },
{ "localise-queries", 0, 0, 'y' },
{ "txt-record", 1, 0, 'Y' },
{ "dns-rr", 1, 0, LOPT_RR },
{ "enable-dbus", 0, 0, '1' },
{ "bootp-dynamic", 2, 0, '3' },
{ "dhcp-mac", 1, 0, '4' },
@@ -241,6 +244,7 @@ static const struct myoption opts[] =
{ "enable-ra", 0, 0, LOPT_RA },
{ "dhcp-duid", 1, 0, LOPT_DUID },
{ "host-record", 1, 0, LOPT_HOST_REC },
{ "bind-dynamic", 0, 0, LOPT_CLVERBIND },
{ 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_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_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_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)."), "#" },
@@ -371,6 +375,8 @@ static struct {
{ 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_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 }
};
@@ -1567,7 +1573,7 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
/* new->name may be NULL if someone does
"interface=" to disable all interfaces except loop. */
new->name = opt_string_alloc(arg);
new->isloop = new->used = 0;
new->used = 0;
arg = comma;
} while (arg);
break;
@@ -1637,7 +1643,8 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
option = '?'; /* error */
break;
}
new->used = 0;
daemon->if_addrs = new;
arg = comma;
} while (arg);
@@ -2214,6 +2221,7 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
}
if (len == -1)
problem = _("bad hex constant");
else if ((new->clid = opt_malloc(len)))
{
@@ -2931,7 +2939,42 @@ static char *one_opt(int option, char *arg, char *gen_prob, int command_line)
}
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 */
{
struct txt_record *new;
@@ -3723,6 +3766,9 @@ void read_opts(int argc, char **argv, char *compile_opts)
if (testmode)
{
/* Can cause a call to die() */
check_dhcp_hosts(1);
fprintf(stderr, "dnsmasq: %s.\n", _("syntax check OK"));
exit(0);
}
+1 -1
View File
@@ -14,7 +14,7 @@
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"
struct ping_packet {
+14 -10
View File
@@ -158,7 +158,8 @@ void icmp6_packet(void)
return;
/* 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)
break;
@@ -179,7 +180,8 @@ void icmp6_packet(void)
}
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;
}
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),
(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)
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 */
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;
}
/* 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 (!param->first)
context->ra_time = 0;
context->flags |= CONTEXT_RA_DONE;
do_prefix = 1;
}
param->first = 0;
param->found_context = 1;
}
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;
/* make counted string zero-term and sanitise */
for (i = 0; i < len; i++)
if (isprint(*(p2+1)))
{
*p2 = *(p2+1);
p2++;
}
{
if (!isprint((int)*(p2+1)))
break;
*p2 = *(p2+1);
p2++;
}
*p2 = 0;
my_syslog(LOG_INFO, "reply %s is %s", name, p1);
/* restore */
memmove(p1 + 1, p1, len);
memmove(p1 + 1, p1, i);
*p1 = len;
p1 += len+1;
}
@@ -936,10 +938,14 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
if (!cname_count--)
return 0; /* looped CNAMES */
newc = cache_insert(name, NULL, now, attl, F_CNAME | F_FORWARD);
if (newc && cpp)
if (newc)
{
cpp->addr.cname.cache = newc;
cpp->addr.cname.uid = newc->uid;
newc->addr.cname.cache = NULL;
if (cpp)
{
cpp->addr.cname.cache = newc;
cpp->addr.cname.uid = newc->uid;
}
}
cpp = newc;
@@ -1244,7 +1250,8 @@ static int add_resource_record(struct dns_header *header, char *limit, int *trun
case 't':
usval = va_arg(ap, int);
sval = va_arg(ap, char *);
memcpy(p, sval, usval);
if (usval != 0)
memcpy(p, sval, usval);
p += usval;
break;
@@ -1387,6 +1394,22 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
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)
{
/* 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;
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)
lease_set_hostname(lease, hostname, 1, get_domain(lease->addr), domain);
/* 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));
#ifdef HAVE_SCRIPT
if (do_classes && daemon->lease_change_command)
if (do_classes)
{
struct dhcp_netid *n;
if (mess->giaddr.s_addr)
lease->giaddr = mess->giaddr;
/* pick up INIT-REBOOT events. */
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);
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);
struct dhcp_netid *n;
if (mess->giaddr.s_addr)
lease->giaddr = mess->giaddr;
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
}
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));
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 (!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)
{
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);
if (hostname && ia_type == OPTION6_IA_NA)
{
+13 -1
View File
@@ -23,12 +23,14 @@
static int map_rebuild = 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 dhcp_context *context;
int dns_dirty = 0;
if (!(lease->flags & LEASE_HAVE_HWADDR) ||
(lease->flags & (LEASE_TA | LEASE_NA)) ||
lease->last_interface == 0 ||
!lease->hostname)
return ;
@@ -72,6 +74,13 @@ void slaac_add_addrs(struct dhcp_lease *lease, time_t now)
if (IN6_ARE_ADDR_EQUAL(&addr, &slaac->addr))
{
*up = slaac->next;
/* recheck when DHCPv4 goes through init-reboot */
if (force)
{
slaac->ping_time = now;
slaac->backoff = 1;
dns_dirty = 1;
}
break;
}
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 */
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)) ||
!(mode = next(&p, end)) ||
(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
{
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,
(struct sockaddr *)&peer, sizeof(peer)) == -1 && errno == EINTR);
(struct sockaddr *)&peer, sa_len(&peer)) == -1 && errno == EINTR);
if (is_err)
free_transfer(transfer);
@@ -505,12 +508,12 @@ void check_tftp_listeners(fd_set *rset, time_t now)
{
tmp = transfer->next;
prettyprint_addr(&transfer->peer, daemon->addrbuff);
if (FD_ISSET(transfer->sockfd, rset))
{
/* we overwrote the buffer... */
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))
{
@@ -533,7 +536,7 @@ void check_tftp_listeners(fd_set *rset, time_t now)
err = "";
else
sanitise(err);
my_syslog(MS_TFTP | LOG_ERR, _("error %d %s received from %s"),
(int)ntohs(mess->block), err,
daemon->addrbuff);
@@ -570,7 +573,7 @@ void check_tftp_listeners(fd_set *rset, time_t now)
if (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)
{
@@ -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);
/* unlink */
*up = tmp;
/* put on queue to be sent to script and deleted */
transfer->next = daemon->tftp_done_trans;
daemon->tftp_done_trans = transfer;
if (endcon)
free_transfer(transfer);
else
{
/* put on queue to be sent to script and deleted */
transfer->next = daemon->tftp_done_trans;
daemon->tftp_done_trans = transfer;
}
continue;
}
}
@@ -619,7 +627,7 @@ static void sanitise(char *buf)
{
unsigned char *q, *r;
for (q = r = (unsigned char *)buf; *r; r++)
if (isprint(*r))
if (isprint((int)*r))
*(q++) = *r;
*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;
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 0;
@@ -426,7 +426,7 @@ int parse_hex(char *in, unsigned char *out, int 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))
return -1;
@@ -444,12 +444,29 @@ int parse_hex(char *in, unsigned char *out, int maxlen,
else
{
*r = 0;
mask = mask << 1;
if (strcmp(in, "*") == 0)
mask |= 1;
{
mask = (mask << 1) | 1;
i++;
}
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;