Compare commits

...
21 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
21 changed files with 619 additions and 292 deletions

No files matched your search

+43 -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
@@ -98,7 +137,7 @@ version 2.61
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
dhcp-script is not in use. Thanks to Antoaneta-Ecaterina
Ene for the patch.
Fix failure of TFTP over IPv4 on OpenBSD platform. Thanks
+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)."
+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);
+5 -3
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. */
@@ -424,7 +426,7 @@ struct listener {
struct iname {
char *name;
union mysockaddr addr;
int isloop, used;
int used;
struct iname *next;
};
@@ -732,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;
+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,
+11 -4
View File
@@ -310,12 +310,19 @@ void lease_update_file(time_t now)
/* do timed RAs and determine when the next is, also pings to potential SLAAC addresses */
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
+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)
+18 -1
View File
@@ -1250,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;
@@ -1393,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 */
+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;