mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-04 13:48:30 +00:00
Compare commits
21
Commits
v2.61
..
v2.63test1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54dd393f39 | ||
|
|
4ce4f3779b | ||
|
|
8b3ae2fd43 | ||
|
|
ed55cb66e6 | ||
|
|
2cd9a0de1f | ||
|
|
c514ab9907 | ||
|
|
078a630bba | ||
|
|
43c271b07c | ||
|
|
24ce681e51 | ||
|
|
5ae34bf3c8 | ||
|
|
51931b888a | ||
|
|
9f7f3b1216 | ||
|
|
97c83bb05b | ||
|
|
8767ceecd4 | ||
|
|
18c63eff8f | ||
|
|
c64b7f6a78 | ||
|
|
068b4b51e3 | ||
|
|
919dd7cf14 | ||
|
|
f632e56793 | ||
|
|
2021c66251 | ||
|
|
8358e0f4b2 |
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Vendored
+26
@@ -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
@@ -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
|
||||
|
||||
Vendored
+8
-8
@@ -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
|
||||
|
||||
Vendored
+16
-14
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user