mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-13 17:00:49 +00:00
Compare commits
16
Commits
v2.91test1
...
v2.91test4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5ef6c8c24f | ||
|
|
7c348a0b73 | ||
|
|
d578da0665 | ||
|
|
8949ef44b4 | ||
|
|
3ac11cdd98 | ||
|
|
5d49fa112d | ||
|
|
d29d19e654 | ||
|
|
49ea7db74e | ||
|
|
fcb40ee73d | ||
|
|
0f437b3b5e | ||
|
|
8a5fe8ce6b | ||
|
|
2a664c03db | ||
|
|
4902807879 | ||
|
|
742af6e4b9 | ||
|
|
3eb008c36d | ||
|
|
32248ebd5b |
No files matched your search
@@ -102,9 +102,7 @@ clean : mostly_clean
|
|||||||
rm -f core */core
|
rm -f core */core
|
||||||
rm -f *~ contrib/*/*~ */*~
|
rm -f *~ contrib/*/*~ */*~
|
||||||
|
|
||||||
install : all install-common
|
install : all
|
||||||
|
|
||||||
install-common :
|
|
||||||
$(INSTALL) -d $(DESTDIR)$(BINDIR)
|
$(INSTALL) -d $(DESTDIR)$(BINDIR)
|
||||||
$(INSTALL) -d $(DESTDIR)$(MANDIR)/man8
|
$(INSTALL) -d $(DESTDIR)$(MANDIR)/man8
|
||||||
$(INSTALL) -m 644 $(MAN)/dnsmasq.8 $(DESTDIR)$(MANDIR)/man8
|
$(INSTALL) -m 644 $(MAN)/dnsmasq.8 $(DESTDIR)$(MANDIR)/man8
|
||||||
@@ -121,7 +119,11 @@ all-i18n : $(BUILDDIR)
|
|||||||
cd $(top) && cd $(BUILDDIR) && $(MAKE) top="$(top)" -f $(top)/Makefile $${f%.po}.mo; \
|
cd $(top) && cd $(BUILDDIR) && $(MAKE) top="$(top)" -f $(top)/Makefile $${f%.po}.mo; \
|
||||||
done
|
done
|
||||||
|
|
||||||
install-i18n : all-i18n install-common
|
install-i18n : all-i18n
|
||||||
|
$(INSTALL) -d $(DESTDIR)$(BINDIR)
|
||||||
|
$(INSTALL) -d $(DESTDIR)$(MANDIR)/man8
|
||||||
|
$(INSTALL) -m 644 $(MAN)/dnsmasq.8 $(DESTDIR)$(MANDIR)/man8
|
||||||
|
$(INSTALL) -m 755 $(BUILDDIR)/dnsmasq $(DESTDIR)$(BINDIR)
|
||||||
cd $(BUILDDIR); $(top)/bld/install-mo $(DESTDIR)$(LOCALEDIR) $(INSTALL)
|
cd $(BUILDDIR); $(top)/bld/install-mo $(DESTDIR)$(LOCALEDIR) $(INSTALL)
|
||||||
cd $(MAN); ../bld/install-man $(DESTDIR)$(MANDIR) $(INSTALL)
|
cd $(MAN); ../bld/install-man $(DESTDIR)$(MANDIR) $(INSTALL)
|
||||||
|
|
||||||
|
|||||||
+1
-1
Submodule debian updated: 83e05da879...05f03dca94.
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This revised version is (C) Copyright by
|
# This revised version is (C) Copyright by
|
||||||
# Matthias Andree <matthias.andree@gmx.de>, 2010 - 2021.
|
# Matthias Andree <matthias.andree@gmx.de>, 2010 - 2021.
|
||||||
# Conrad Kostecki <conrad@kostecki.com>, 2014 - 2022.
|
# Conrad Kostecki <conrad@kostecki.com>, 2014 - 2024.
|
||||||
# It is subject to the GNU General Public License v2,
|
# It is subject to the GNU General Public License v2,
|
||||||
# or at your option, any later version.
|
# or at your option, any later version.
|
||||||
#
|
#
|
||||||
@@ -10,10 +10,10 @@
|
|||||||
# Simon Kelley <simon@thekelleys.org.uk>, 2005.
|
# Simon Kelley <simon@thekelleys.org.uk>, 2005.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: dnsmasq 2.88\n"
|
"Project-Id-Version: dnsmasq 2.91\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-03-20 00:00+0000\n"
|
"POT-Creation-Date: 2021-03-20 00:00+0000\n"
|
||||||
"PO-Revision-Date: 2022-11-17 20:08+0100\n"
|
"PO-Revision-Date: 2024-12-23 22:36+0100\n"
|
||||||
"Last-Translator: Conrad Kostecki <conrad@kostecki.com>\n"
|
"Last-Translator: Conrad Kostecki <conrad@kostecki.com>\n"
|
||||||
"Language-Team: German <de@li.org>\n"
|
"Language-Team: German <de@li.org>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
@@ -21,7 +21,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Generator: Poedit 3.2\n"
|
"X-Generator: Poedit 3.5\n"
|
||||||
|
|
||||||
#: cache.c:652
|
#: cache.c:652
|
||||||
msgid "Internal error in cache."
|
msgid "Internal error in cache."
|
||||||
@@ -43,9 +43,9 @@ msgid "bad name at %s line %d"
|
|||||||
msgstr "Fehlerhafter Name in %s Zeile %d"
|
msgstr "Fehlerhafter Name in %s Zeile %d"
|
||||||
|
|
||||||
#: cache.c:1265
|
#: cache.c:1265
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "read %s - %d names"
|
msgid "read %s - %d names"
|
||||||
msgstr "%s gelesen - %d Adressen"
|
msgstr "%s gelesen - %d Namen"
|
||||||
|
|
||||||
#: cache.c:1381
|
#: cache.c:1381
|
||||||
msgid "cleared cache"
|
msgid "cleared cache"
|
||||||
@@ -84,7 +84,7 @@ msgstr "weitergeleitete Anfragen %u, lokal beantwortete Anfragen %u"
|
|||||||
#: cache.c:1766
|
#: cache.c:1766
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "queries answered from stale cache %u"
|
msgid "queries answered from stale cache %u"
|
||||||
msgstr ""
|
msgstr "Anfragen beantwortet vom veralteten Cache %u"
|
||||||
|
|
||||||
#: cache.c:1768
|
#: cache.c:1768
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -92,9 +92,9 @@ msgid "queries for authoritative zones %u"
|
|||||||
msgstr "Anfragen nach autoritativen Zonen %u"
|
msgstr "Anfragen nach autoritativen Zonen %u"
|
||||||
|
|
||||||
#: cache.c:1796
|
#: cache.c:1796
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "server %s#%d: queries sent %u, retried %u, failed %u, nxdomain replies %u, avg. latency %ums"
|
msgid "server %s#%d: queries sent %u, retried %u, failed %u, nxdomain replies %u, avg. latency %ums"
|
||||||
msgstr "Server %s#%d: Anfragen gesendet %u, erneut versucht oder fehlgeschlagen %u"
|
msgstr "Server %s#%d: Anfragen gesendet %u, erneut versucht %u, fehlgeschlagen %u, nxdomain-Antworten %u, durchschnittliche Latenz %ums"
|
||||||
|
|
||||||
#: util.c:51
|
#: util.c:51
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -120,14 +120,14 @@ msgid "failed to allocate %d bytes"
|
|||||||
msgstr "Konnte %d Bytes nicht belegen"
|
msgstr "Konnte %d Bytes nicht belegen"
|
||||||
|
|
||||||
#: util.c:344
|
#: util.c:344
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "failed to reallocate %d bytes"
|
msgid "failed to reallocate %d bytes"
|
||||||
msgstr "Konnte %d Bytes nicht belegen"
|
msgstr "Konnte %d Bytes nicht allozieren"
|
||||||
|
|
||||||
#: util.c:465
|
#: util.c:465
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "cannot read monotonic clock: %s"
|
msgid "cannot read monotonic clock: %s"
|
||||||
msgstr "kann Netlink-Socket nicht erzeugen: %s"
|
msgstr "monotone Uhr kann nicht gelesen werden: %s"
|
||||||
|
|
||||||
# @Simon: not perfect but I cannot get nearer right now.
|
# @Simon: not perfect but I cannot get nearer right now.
|
||||||
#: util.c:579
|
#: util.c:579
|
||||||
@@ -188,11 +188,11 @@ msgstr "Unberechtigte DNS-Anfragen von Windows-Rechnern nicht weiterleiten."
|
|||||||
|
|
||||||
#: option.c:404
|
#: option.c:404
|
||||||
msgid "Don't include IPv4 addresses in DNS answers."
|
msgid "Don't include IPv4 addresses in DNS answers."
|
||||||
msgstr ""
|
msgstr "Keine IPv4-Adressen in DNS-Antworten inkludieren."
|
||||||
|
|
||||||
#: option.c:405
|
#: option.c:405
|
||||||
msgid "Don't include IPv6 addresses in DNS answers."
|
msgid "Don't include IPv6 addresses in DNS answers."
|
||||||
msgstr ""
|
msgstr "Keine IPv6-Adressen in DNS-Antworten inkludieren."
|
||||||
|
|
||||||
#: option.c:406
|
#: option.c:406
|
||||||
msgid "Enable DHCP in the range given with lease duration."
|
msgid "Enable DHCP in the range given with lease duration."
|
||||||
@@ -313,7 +313,7 @@ msgstr "Fehlerhafte Suchergebnisse NICHT zwischenspeichern."
|
|||||||
|
|
||||||
#: option.c:434
|
#: option.c:434
|
||||||
msgid "Use expired cache data for faster reply."
|
msgid "Use expired cache data for faster reply."
|
||||||
msgstr ""
|
msgstr "Verwende abgelaufene Cachedaten für schnellere Antwort."
|
||||||
|
|
||||||
#: option.c:435
|
#: option.c:435
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -347,7 +347,7 @@ msgstr "Ausgehenden Port für DNS-Anfragen an vorgelagerte Server erzwingen."
|
|||||||
|
|
||||||
#: option.c:442
|
#: option.c:442
|
||||||
msgid "Set maximum number of random originating ports for a query."
|
msgid "Set maximum number of random originating ports for a query."
|
||||||
msgstr ""
|
msgstr "Setze die maximale Anzahl zufälliger Ursprungsports für eine Abfrage."
|
||||||
|
|
||||||
#: option.c:443
|
#: option.c:443
|
||||||
msgid "Do NOT read resolv.conf."
|
msgid "Do NOT read resolv.conf."
|
||||||
@@ -404,7 +404,7 @@ msgstr "Spezifiziere untere Gültigkeitsdauergrenze für Zwischenspeicher."
|
|||||||
|
|
||||||
#: option.c:456
|
#: option.c:456
|
||||||
msgid "Retry DNS queries after this many milliseconds."
|
msgid "Retry DNS queries after this many milliseconds."
|
||||||
msgstr ""
|
msgstr "DNS-Abfragen nach so vielen Millisekunden wiederholen."
|
||||||
|
|
||||||
#: option.c:457
|
#: option.c:457
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -520,7 +520,7 @@ msgstr "Konfiguration aus allen Dateien in diesem Verzeichnis lesen."
|
|||||||
|
|
||||||
#: option.c:484
|
#: option.c:484
|
||||||
msgid "Execute file and read configuration from stdin."
|
msgid "Execute file and read configuration from stdin."
|
||||||
msgstr ""
|
msgstr "Führe Datei aus und lese die Konfiguration aus stdin."
|
||||||
|
|
||||||
#: option.c:485
|
#: option.c:485
|
||||||
msgid "Log to this syslog facility or file. (defaults to DAEMON)"
|
msgid "Log to this syslog facility or file. (defaults to DAEMON)"
|
||||||
@@ -680,7 +680,7 @@ msgstr "Anfragende MAC-Adresse in die weiterleitende DNS-Anfrage einfügen."
|
|||||||
|
|
||||||
#: option.c:523
|
#: option.c:523
|
||||||
msgid "Strip MAC information from queries."
|
msgid "Strip MAC information from queries."
|
||||||
msgstr ""
|
msgstr "Entferne die MAC-Information von Abfragen."
|
||||||
|
|
||||||
#: option.c:524
|
#: option.c:524
|
||||||
msgid "Add specified IP subnet to forwarded DNS queries."
|
msgid "Add specified IP subnet to forwarded DNS queries."
|
||||||
@@ -688,7 +688,7 @@ msgstr "Füge spezifiziertes IP-Subnetz an weitergeleiteten DNS-Anfragen hinzu."
|
|||||||
|
|
||||||
#: option.c:525
|
#: option.c:525
|
||||||
msgid "Strip ECS information from queries."
|
msgid "Strip ECS information from queries."
|
||||||
msgstr ""
|
msgstr "Entferne die ECS-Information von Abfragen."
|
||||||
|
|
||||||
#: option.c:526
|
#: option.c:526
|
||||||
msgid "Add client identification to forwarded DNS queries."
|
msgid "Add client identification to forwarded DNS queries."
|
||||||
@@ -773,9 +773,8 @@ msgid "Specify ipsets to which matching domains should be added"
|
|||||||
msgstr "Spezifiziere IPSets, zu denen passende Domains hinzugefügt werden sollen"
|
msgstr "Spezifiziere IPSets, zu denen passende Domains hinzugefügt werden sollen"
|
||||||
|
|
||||||
#: option.c:546
|
#: option.c:546
|
||||||
#, fuzzy
|
|
||||||
msgid "Specify nftables sets to which matching domains should be added"
|
msgid "Specify nftables sets to which matching domains should be added"
|
||||||
msgstr "Spezifiziere IPSets, zu denen passende Domains hinzugefügt werden sollen"
|
msgstr "Geben Sie nftables sets an, zu denen passende Domänen hinzugefügt werden sollen"
|
||||||
|
|
||||||
#: option.c:547
|
#: option.c:547
|
||||||
msgid "Enable filtering of DNS queries with connection-track marks."
|
msgid "Enable filtering of DNS queries with connection-track marks."
|
||||||
@@ -880,7 +879,7 @@ msgstr "Protokolliere kein Routine-TFTP."
|
|||||||
|
|
||||||
#: option.c:572
|
#: option.c:572
|
||||||
msgid "Suppress round-robin ordering of DNS records."
|
msgid "Suppress round-robin ordering of DNS records."
|
||||||
msgstr ""
|
msgstr "Unterdrückt die Round-Robin-Sortierung von DNS-Einträgen."
|
||||||
|
|
||||||
#: option.c:802
|
#: option.c:802
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -915,11 +914,11 @@ msgstr "Schnittstellenbindung nicht unterstützt"
|
|||||||
|
|
||||||
#: option.c:955
|
#: option.c:955
|
||||||
msgid "Cannot resolve server name"
|
msgid "Cannot resolve server name"
|
||||||
msgstr ""
|
msgstr "Servername kann nicht aufgelöst werden"
|
||||||
|
|
||||||
#: option.c:991
|
#: option.c:991
|
||||||
msgid "cannot use IPv4 server address with IPv6 source address"
|
msgid "cannot use IPv4 server address with IPv6 source address"
|
||||||
msgstr ""
|
msgstr "IPv4-Serveradresse kann nicht mit IPv6-Quelladresse verwendet werden"
|
||||||
|
|
||||||
#: option.c:997 option.c:1043
|
#: option.c:997 option.c:1043
|
||||||
msgid "interface can only be specified once"
|
msgid "interface can only be specified once"
|
||||||
@@ -931,21 +930,19 @@ msgstr "Fehlerhafter Schnittestellenname"
|
|||||||
|
|
||||||
#: option.c:1037
|
#: option.c:1037
|
||||||
msgid "cannot use IPv6 server address with IPv4 source address"
|
msgid "cannot use IPv6 server address with IPv4 source address"
|
||||||
msgstr ""
|
msgstr "IPv6-Serveradresse kann nicht mit IPv4-Quelladresse verwendet werden"
|
||||||
|
|
||||||
#: option.c:1124
|
#: option.c:1124
|
||||||
#, fuzzy
|
|
||||||
msgid "bad IPv4 prefix length"
|
msgid "bad IPv4 prefix length"
|
||||||
msgstr "fehlerhafte Präfixlänge"
|
msgstr "ungültige IPv4-Präfixlänge"
|
||||||
|
|
||||||
#: option.c:1155 option.c:1165 option.c:1240 option.c:1250 option.c:5360
|
#: option.c:1155 option.c:1165 option.c:1240 option.c:1250 option.c:5360
|
||||||
msgid "error"
|
msgid "error"
|
||||||
msgstr "Fehler"
|
msgstr "Fehler"
|
||||||
|
|
||||||
#: option.c:1207
|
#: option.c:1207
|
||||||
#, fuzzy
|
|
||||||
msgid "bad IPv6 prefix length"
|
msgid "bad IPv6 prefix length"
|
||||||
msgstr "fehlerhafte Präfixlänge"
|
msgstr "ungültige IPv6-Präfixlänge"
|
||||||
|
|
||||||
#: option.c:1467
|
#: option.c:1467
|
||||||
msgid "inappropriate vendor:"
|
msgid "inappropriate vendor:"
|
||||||
@@ -1034,7 +1031,6 @@ msgid "recompile with HAVE_LUASCRIPT defined to enable Lua scripts"
|
|||||||
msgstr "Neuübersetzung mit HAVE_LUASCRIPT nötig, um benutzerdefinierte Lua-Skripte auszuführen"
|
msgstr "Neuübersetzung mit HAVE_LUASCRIPT nötig, um benutzerdefinierte Lua-Skripte auszuführen"
|
||||||
|
|
||||||
#: option.c:2447
|
#: option.c:2447
|
||||||
#, fuzzy
|
|
||||||
msgid "invalid auth-zone"
|
msgid "invalid auth-zone"
|
||||||
msgstr "unzulässiger Alias-Bereich"
|
msgstr "unzulässiger Alias-Bereich"
|
||||||
|
|
||||||
@@ -1059,9 +1055,8 @@ msgid "recompile with HAVE_IPSET defined to enable ipset directives"
|
|||||||
msgstr "Neuübersetzung mit HAVE_IPSET nötig, um IPSet-Direktiven zu aktivieren"
|
msgstr "Neuübersetzung mit HAVE_IPSET nötig, um IPSet-Direktiven zu aktivieren"
|
||||||
|
|
||||||
#: option.c:3117
|
#: option.c:3117
|
||||||
#, fuzzy
|
|
||||||
msgid "recompile with HAVE_NFTSET defined to enable nftset directives"
|
msgid "recompile with HAVE_NFTSET defined to enable nftset directives"
|
||||||
msgstr "Neuübersetzung mit HAVE_IPSET nötig, um IPSet-Direktiven zu aktivieren"
|
msgstr "Neukompilieren mit definiertem HAVE_NFTSET, um NFTSET-Direktiven zu aktivieren"
|
||||||
|
|
||||||
#: option.c:3192 option.c:3210
|
#: option.c:3192 option.c:3210
|
||||||
msgid "recompile with HAVE_CONNTRACK defined to enable connmark-allowlist directives"
|
msgid "recompile with HAVE_CONNTRACK defined to enable connmark-allowlist directives"
|
||||||
@@ -1259,7 +1254,7 @@ msgstr "unzulässige Option"
|
|||||||
#: option.c:5363
|
#: option.c:5363
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid " in output from %s"
|
msgid " in output from %s"
|
||||||
msgstr ""
|
msgstr " in der Ausgabe von %s"
|
||||||
|
|
||||||
#: option.c:5365
|
#: option.c:5365
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1272,9 +1267,9 @@ msgid "read %s"
|
|||||||
msgstr "%s gelesen"
|
msgstr "%s gelesen"
|
||||||
|
|
||||||
#: option.c:5446
|
#: option.c:5446
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "cannot execute %s: %s"
|
msgid "cannot execute %s: %s"
|
||||||
msgstr "kann %s nicht erstellen: %s"
|
msgstr "kann %s nicht ausführen: %s"
|
||||||
|
|
||||||
#: option.c:5454 option.c:5615 tftp.c:790
|
#: option.c:5454 option.c:5615 tftp.c:790
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1282,14 +1277,14 @@ msgid "cannot read %s: %s"
|
|||||||
msgstr "kann %s nicht lesen: %s"
|
msgstr "kann %s nicht lesen: %s"
|
||||||
|
|
||||||
#: option.c:5473
|
#: option.c:5473
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "error executing %s: %s"
|
msgid "error executing %s: %s"
|
||||||
msgstr "konnte %s nicht ausführen: %s"
|
msgstr "Fehler bei der Ausführung von %s: %s"
|
||||||
|
|
||||||
#: option.c:5476
|
#: option.c:5476
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s returns non-zero error code"
|
msgid "%s returns non-zero error code"
|
||||||
msgstr ""
|
msgstr "%s gibt einen Fehlercode ungleich Null zurück"
|
||||||
|
|
||||||
#: option.c:5775
|
#: option.c:5775
|
||||||
msgid "junk found in command line"
|
msgid "junk found in command line"
|
||||||
@@ -1399,14 +1394,14 @@ msgid "reducing DNS packet size for nameserver %s to %d"
|
|||||||
msgstr "Reduziere die DNS-Paketgröße für Nameserver %s auf %d"
|
msgstr "Reduziere die DNS-Paketgröße für Nameserver %s auf %d"
|
||||||
|
|
||||||
#: forward.c:1565
|
#: forward.c:1565
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "ignoring query from non-local network %s (logged only once)"
|
msgid "ignoring query from non-local network %s (logged only once)"
|
||||||
msgstr "Ignoriere Anfrage von auswärtigem Netzwerk"
|
msgstr "Ignoriere Abfrage von nicht-lokalen Netzwerk %s (Nur einmal protokolliert)"
|
||||||
|
|
||||||
#: forward.c:2139
|
#: forward.c:2139
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "ignoring query from non-local network %s"
|
msgid "ignoring query from non-local network %s"
|
||||||
msgstr "Ignoriere Anfrage von auswärtigem Netzwerk"
|
msgstr "Ignoriere Abfrage von nicht-lokalen Netzwerk %s"
|
||||||
|
|
||||||
#: forward.c:2501
|
#: forward.c:2501
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1488,7 +1483,7 @@ msgstr "ignoriere Namensserver %s - kann Socket nicht erzeugen/binden: %s"
|
|||||||
|
|
||||||
#: network.c:1643
|
#: network.c:1643
|
||||||
msgid "more servers are defined but not logged"
|
msgid "more servers are defined but not logged"
|
||||||
msgstr ""
|
msgstr "mehr Server sind definiert aber nicht protokolliert"
|
||||||
|
|
||||||
#: network.c:1654
|
#: network.c:1654
|
||||||
msgid "(no DNSSEC)"
|
msgid "(no DNSSEC)"
|
||||||
@@ -1605,7 +1600,7 @@ msgstr "max_port darf nicht kleiner als min_port sein"
|
|||||||
|
|
||||||
#: dnsmasq.c:271
|
#: dnsmasq.c:271
|
||||||
msgid "port_limit must not be larger than available port range"
|
msgid "port_limit must not be larger than available port range"
|
||||||
msgstr ""
|
msgstr "port_limit darf nicht größer als der verfügbare Portbereich sein"
|
||||||
|
|
||||||
#: dnsmasq.c:278
|
#: dnsmasq.c:278
|
||||||
msgid "--auth-server required when an auth zone is defined."
|
msgid "--auth-server required when an auth zone is defined."
|
||||||
@@ -1810,9 +1805,9 @@ msgid "restricting maximum simultaneous TFTP transfers to %d"
|
|||||||
msgstr "Begrenze gleichzeitige TFTP-Übertragungen auf maximal %d"
|
msgstr "Begrenze gleichzeitige TFTP-Übertragungen auf maximal %d"
|
||||||
|
|
||||||
#: dnsmasq.c:1095
|
#: dnsmasq.c:1095
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "error binding DHCP socket to device %s"
|
msgid "error binding DHCP socket to device %s"
|
||||||
msgstr "Fehler beim Senden des DHCP-Pakets an %s: %s"
|
msgstr "Fehler beim Binden des DHCP-Sockets an Gerät %s"
|
||||||
|
|
||||||
#: dnsmasq.c:1229
|
#: dnsmasq.c:1229
|
||||||
msgid "connected to system DBus"
|
msgid "connected to system DBus"
|
||||||
@@ -1981,19 +1976,19 @@ msgid "read %s - %d addresses"
|
|||||||
msgstr "%s gelesen - %d Adressen"
|
msgstr "%s gelesen - %d Adressen"
|
||||||
|
|
||||||
#: dhcp.c:1136
|
#: dhcp.c:1136
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "Cannot broadcast DHCP relay via interface %s"
|
msgid "Cannot broadcast DHCP relay via interface %s"
|
||||||
msgstr "Kann nicht zum DHCPv6 Server multicasten ohne korrekte Schnittstelle"
|
msgstr "DHCP-Relay kann nicht über die Schnittstelle %s gesendet werden"
|
||||||
|
|
||||||
#: dhcp.c:1160
|
#: dhcp.c:1160
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "broadcast via %s"
|
msgid "broadcast via %s"
|
||||||
msgstr ""
|
msgstr "broadcast via %s"
|
||||||
|
|
||||||
#: dhcp.c:1163 rfc3315.c:2219
|
#: dhcp.c:1163 rfc3315.c:2219
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "DHCP relay at %s -> %s"
|
msgid "DHCP relay at %s -> %s"
|
||||||
msgstr "DHCP Relais %s -> %s"
|
msgstr "DHCP-Relay bei %s -> %s"
|
||||||
|
|
||||||
#: lease.c:64
|
#: lease.c:64
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2405,14 +2400,14 @@ msgid "release received"
|
|||||||
msgstr "Freigabe empfangen"
|
msgstr "Freigabe empfangen"
|
||||||
|
|
||||||
#: rfc3315.c:2200
|
#: rfc3315.c:2200
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "Cannot multicast DHCP relay via interface %s"
|
msgid "Cannot multicast DHCP relay via interface %s"
|
||||||
msgstr "Kann nicht zum DHCPv6 Server multicasten ohne korrekte Schnittstelle"
|
msgstr "Multicast-DHCP-Relay über Schnittstelle %s nicht möglich"
|
||||||
|
|
||||||
#: rfc3315.c:2216
|
#: rfc3315.c:2216
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "multicast via %s"
|
msgid "multicast via %s"
|
||||||
msgstr ""
|
msgstr "multicast via %s"
|
||||||
|
|
||||||
#: dhcp-common.c:187
|
#: dhcp-common.c:187
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2484,9 +2479,9 @@ msgid "router advertisement on %s%s"
|
|||||||
msgstr "Router-Advertisment auf %s%s"
|
msgstr "Router-Advertisment auf %s%s"
|
||||||
|
|
||||||
#: dhcp-common.c:1043
|
#: dhcp-common.c:1043
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "DHCP relay from %s via %s"
|
msgid "DHCP relay from %s via %s"
|
||||||
msgstr "DHCP Weiterleitung von %s nach %s"
|
msgstr "DHCP-Relay von %s über %s"
|
||||||
|
|
||||||
#: dhcp-common.c:1045
|
#: dhcp-common.c:1045
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2621,9 +2616,9 @@ msgid "Insecure DS reply received for %s, check domain configuration and upstrea
|
|||||||
msgstr "Unsichere DS-Antwort für %s, bitte Domainkonfiguration und Upstream DNS-Server für DNSSEC-Unterstützung überprüfen"
|
msgstr "Unsichere DS-Antwort für %s, bitte Domainkonfiguration und Upstream DNS-Server für DNSSEC-Unterstützung überprüfen"
|
||||||
|
|
||||||
#: blockdata.c:55
|
#: blockdata.c:55
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "pool memory in use %zu, max %zu, allocated %zu"
|
msgid "pool memory in use %zu, max %zu, allocated %zu"
|
||||||
msgstr "Speicherpool in Benutzung %u, Max %u, zugewiesen %u"
|
msgstr "Speicherpool in Benutzung %zu, Max %zu, zugewiesen %zu"
|
||||||
|
|
||||||
#: tables.c:61
|
#: tables.c:61
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2695,24 +2690,23 @@ msgid "bad dynamic directory %s: %s"
|
|||||||
msgstr "fehlerhaftes dynamisches Verzeichnis %s: %s"
|
msgstr "fehlerhaftes dynamisches Verzeichnis %s: %s"
|
||||||
|
|
||||||
#: inotify.c:186
|
#: inotify.c:186
|
||||||
#, fuzzy
|
|
||||||
msgid "not a directory"
|
msgid "not a directory"
|
||||||
msgstr "Kann auf Verzeichnis %s nicht zugreifen: %s"
|
msgstr "ist kein Verzeichnis"
|
||||||
|
|
||||||
#: inotify.c:299
|
#: inotify.c:299
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "inotify: %s removed"
|
msgid "inotify: %s removed"
|
||||||
msgstr ""
|
msgstr "inotify: %s entfernt"
|
||||||
|
|
||||||
#: inotify.c:301
|
#: inotify.c:301
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "inotify: %s new or modified"
|
msgid "inotify: %s new or modified"
|
||||||
msgstr "inotify, neue oder geänderte Datei %s"
|
msgstr "inotify: %s neu oder modifiziert"
|
||||||
|
|
||||||
#: inotify.c:309
|
#: inotify.c:309
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "inotify: flushed %u names read from %s"
|
msgid "inotify: flushed %u names read from %s"
|
||||||
msgstr ""
|
msgstr "inotify: %u Namen gelöscht, aus %s gelesen"
|
||||||
|
|
||||||
#: dump.c:68
|
#: dump.c:68
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2729,14 +2723,14 @@ msgid "failed to write packet dump"
|
|||||||
msgstr "schreiben des Paketmitschnitts fehlgeschlagen"
|
msgstr "schreiben des Paketmitschnitts fehlgeschlagen"
|
||||||
|
|
||||||
#: dump.c:289
|
#: dump.c:289
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "%u dumping packet %u mask 0x%04x"
|
msgid "%u dumping packet %u mask 0x%04x"
|
||||||
msgstr "Lade UDP Paket %u Maske 0x%04x ab"
|
msgstr "%u dumpe Paket %u Maske 0x%04x"
|
||||||
|
|
||||||
#: dump.c:291
|
#: dump.c:291
|
||||||
#, fuzzy, c-format
|
#, c-format
|
||||||
msgid "dumping packet %u mask 0x%04x"
|
msgid "dumping packet %u mask 0x%04x"
|
||||||
msgstr "Lade UDP Paket %u Maske 0x%04x ab"
|
msgstr "Dumpe Packet %u Make 0x%04x"
|
||||||
|
|
||||||
#: ubus.c:79
|
#: ubus.c:79
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2770,9 +2764,8 @@ msgid "Failed to create SHA-256 hash object"
|
|||||||
msgstr "Kann SHA-256-Hash-Objekt nicht erstellen"
|
msgstr "Kann SHA-256-Hash-Objekt nicht erstellen"
|
||||||
|
|
||||||
#: nftset.c:35
|
#: nftset.c:35
|
||||||
#, fuzzy
|
|
||||||
msgid "failed to create nftset context"
|
msgid "failed to create nftset context"
|
||||||
msgstr "konnte IPset-Kontroll-Socket nicht erzeugen: %s"
|
msgstr "Fehler beim Erstellen des NFTSET-Kontexts"
|
||||||
|
|
||||||
#~ msgid "bad IPv4 prefix"
|
#~ msgid "bad IPv4 prefix"
|
||||||
#~ msgstr "fehlerhaftes IPv4-Präfix"
|
#~ msgstr "fehlerhaftes IPv4-Präfix"
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ struct arp_record {
|
|||||||
static struct arp_record *arps = NULL, *old = NULL, *freelist = NULL;
|
static struct arp_record *arps = NULL, *old = NULL, *freelist = NULL;
|
||||||
static time_t last = 0;
|
static time_t last = 0;
|
||||||
|
|
||||||
static int filter_mac(int family, char *addrp, char *mac, size_t maclen, void *parmv)
|
static int filter_mac(int family, void *addrp, char *mac, size_t maclen, void *parmv)
|
||||||
{
|
{
|
||||||
struct arp_record *arp;
|
struct arp_record *arp;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -193,7 +193,7 @@ void *blockdata_retrieve(struct blockdata *block, size_t len, void *data)
|
|||||||
{
|
{
|
||||||
size_t blen;
|
size_t blen;
|
||||||
struct blockdata *b;
|
struct blockdata *b;
|
||||||
void *new, *d;
|
uint8_t *new, *d;
|
||||||
|
|
||||||
static unsigned int buff_len = 0;
|
static unsigned int buff_len = 0;
|
||||||
static unsigned char *buff = NULL;
|
static unsigned char *buff = NULL;
|
||||||
|
|||||||
@@ -100,14 +100,14 @@ int arp_enumerate(void *parm, callback_t callback)
|
|||||||
#endif /* defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) */
|
#endif /* defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) */
|
||||||
|
|
||||||
|
|
||||||
int iface_enumerate(int family, void *parm, int (*callback)())
|
int iface_enumerate(int family, void *parm, callback_t callback)
|
||||||
{
|
{
|
||||||
struct ifaddrs *head, *addrs;
|
struct ifaddrs *head, *addrs;
|
||||||
int errsave, fd = -1, ret = 0;
|
int errsave, fd = -1, ret = 0;
|
||||||
|
|
||||||
if (family == AF_UNSPEC)
|
if (family == AF_UNSPEC)
|
||||||
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
|
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
|
||||||
return arp_enumerate(parm, callback.af_unspec);
|
return arp_enumerate(parm, callback);
|
||||||
#else
|
#else
|
||||||
return 0; /* need code for Solaris and MacOS*/
|
return 0; /* need code for Solaris and MacOS*/
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ static const struct {
|
|||||||
{ 63, "ZONEMD" }, /* Message Digest Over Zone Data [RFC8976] ZONEMD/zonemd-completed-template 2018-12-12*/
|
{ 63, "ZONEMD" }, /* Message Digest Over Zone Data [RFC8976] ZONEMD/zonemd-completed-template 2018-12-12*/
|
||||||
{ 64, "SVCB" }, /* Service Binding [draft-ietf-dnsop-svcb-https-00] SVCB/svcb-completed-template 2020-06-30*/
|
{ 64, "SVCB" }, /* Service Binding [draft-ietf-dnsop-svcb-https-00] SVCB/svcb-completed-template 2020-06-30*/
|
||||||
{ 65, "HTTPS" }, /* HTTPS Binding [draft-ietf-dnsop-svcb-https-00] HTTPS/https-completed-template 2020-06-30*/
|
{ 65, "HTTPS" }, /* HTTPS Binding [draft-ietf-dnsop-svcb-https-00] HTTPS/https-completed-template 2020-06-30*/
|
||||||
|
{ 66, "DSYNC" }, /* Endpoint discovery for delegation synchronization [draft-ietf-dnsop-generalized-notify-03] DSYNC/dsync-completed-template 2024-12-10 */
|
||||||
{ 99, "SPF" }, /* [RFC7208] */
|
{ 99, "SPF" }, /* [RFC7208] */
|
||||||
{ 100, "UINFO" }, /* [IANA-Reserved] */
|
{ 100, "UINFO" }, /* [IANA-Reserved] */
|
||||||
{ 101, "UID" }, /* [IANA-Reserved] */
|
{ 101, "UID" }, /* [IANA-Reserved] */
|
||||||
@@ -112,6 +113,7 @@ static const struct {
|
|||||||
{ 107, "LP" }, /* [RFC6742] ILNP/lp-completed-template */
|
{ 107, "LP" }, /* [RFC6742] ILNP/lp-completed-template */
|
||||||
{ 108, "EUI48" }, /* an EUI-48 address [RFC7043] EUI48/eui48-completed-template 2013-03-27*/
|
{ 108, "EUI48" }, /* an EUI-48 address [RFC7043] EUI48/eui48-completed-template 2013-03-27*/
|
||||||
{ 109, "EUI64" }, /* an EUI-64 address [RFC7043] EUI64/eui64-completed-template 2013-03-27*/
|
{ 109, "EUI64" }, /* an EUI-64 address [RFC7043] EUI64/eui64-completed-template 2013-03-27*/
|
||||||
|
{ 128, "NXNAME" }, /* NXDOMAIN indicator for Compact Denial of Existence https://www.iana.org/go/draft-ietf-dnsop-compact-denial-of-existence-04 */
|
||||||
{ 249, "TKEY" }, /* Transaction Key [RFC2930] */
|
{ 249, "TKEY" }, /* Transaction Key [RFC2930] */
|
||||||
{ 250, "TSIG" }, /* Transaction Signature [RFC8945] */
|
{ 250, "TSIG" }, /* Transaction Signature [RFC8945] */
|
||||||
{ 251, "IXFR" }, /* incremental transfer [RFC1995] */
|
{ 251, "IXFR" }, /* incremental transfer [RFC1995] */
|
||||||
@@ -125,6 +127,9 @@ static const struct {
|
|||||||
{ 259, "DOA" }, /* Digital Object Architecture [draft-durand-doa-over-dns] DOA/doa-completed-template 2017-08-30*/
|
{ 259, "DOA" }, /* Digital Object Architecture [draft-durand-doa-over-dns] DOA/doa-completed-template 2017-08-30*/
|
||||||
{ 260, "AMTRELAY" }, /* Automatic Multicast Tunneling Relay [RFC8777] AMTRELAY/amtrelay-completed-template 2019-02-06*/
|
{ 260, "AMTRELAY" }, /* Automatic Multicast Tunneling Relay [RFC8777] AMTRELAY/amtrelay-completed-template 2019-02-06*/
|
||||||
{ 261, "RESINFO" }, /* Resolver Information as Key/Value Pairs https://datatracker.ietf.org/doc/draft-ietf-add-resolver-info/06/ */
|
{ 261, "RESINFO" }, /* Resolver Information as Key/Value Pairs https://datatracker.ietf.org/doc/draft-ietf-add-resolver-info/06/ */
|
||||||
|
{ 262, "WALLET" }, /* Public wallet address https://www.iana.org/assignments/dns-parameters/WALLET/wallet-completed-template */
|
||||||
|
{ 263, "CLA" }, /* BP Convergence Layer Adapter https://www.iana.org/go/draft-johnson-dns-ipn-cla-07 */
|
||||||
|
{ 264, "IPN" }, /* BP Node Number https://www.iana.org/go/draft-johnson-dns-ipn-cla-07 */
|
||||||
{ 32768, "TA" }, /* DNSSEC Trust Authorities [Sam_Weiler][http://cameo.library.cmu.edu/][ Deploying DNSSEC Without a Signed Root. Technical Report 1999-19, Information Networking Institute, Carnegie Mellon University, April 2004.] 2005-12-13*/
|
{ 32768, "TA" }, /* DNSSEC Trust Authorities [Sam_Weiler][http://cameo.library.cmu.edu/][ Deploying DNSSEC Without a Signed Root. Technical Report 1999-19, Information Networking Institute, Carnegie Mellon University, April 2004.] 2005-12-13*/
|
||||||
{ 32769, "DLV" }, /* DNSSEC Lookaside Validation (OBSOLETE) [RFC8749][RFC4431] */
|
{ 32769, "DLV" }, /* DNSSEC Lookaside Validation (OBSOLETE) [RFC8749][RFC4431] */
|
||||||
};
|
};
|
||||||
|
|||||||
+6
-3
@@ -339,7 +339,7 @@ union all_addr {
|
|||||||
struct datablock {
|
struct datablock {
|
||||||
unsigned short rrtype;
|
unsigned short rrtype;
|
||||||
unsigned char datalen; /* also length of SOA in negative records. */
|
unsigned char datalen; /* also length of SOA in negative records. */
|
||||||
char data[];
|
char data[1];
|
||||||
} rrdata;
|
} rrdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1125,7 +1125,10 @@ struct tftp_prefix {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct dhcp_relay {
|
struct dhcp_relay {
|
||||||
union all_addr local, server;
|
union {
|
||||||
|
struct in_addr addr4;
|
||||||
|
struct in6_addr addr6;
|
||||||
|
} local, server;
|
||||||
char *interface; /* Allowable interface for replies from server, and dest for IPv6 multicast */
|
char *interface; /* Allowable interface for replies from server, and dest for IPv6 multicast */
|
||||||
int iface_index; /* working - interface in which requests arrived, for return */
|
int iface_index; /* working - interface in which requests arrived, for return */
|
||||||
int port; /* Port of relay we forward to. */
|
int port; /* Port of relay we forward to. */
|
||||||
@@ -1664,7 +1667,7 @@ void route_sock(void);
|
|||||||
|
|
||||||
/* bpf.c or netlink.c */
|
/* bpf.c or netlink.c */
|
||||||
typedef union {
|
typedef union {
|
||||||
int (*af_unspec)(int family, char *addrp, char *mac, size_t maclen, void *parmv);
|
int (*af_unspec)(int family, void *addrp, char *mac, size_t maclen, void *parmv);
|
||||||
int (*af_inet)(struct in_addr local, int if_index, char *label, struct in_addr netmask, struct in_addr broadcast, void *vparam);
|
int (*af_inet)(struct in_addr local, int if_index, char *label, struct in_addr netmask, struct in_addr broadcast, void *vparam);
|
||||||
int (*af_inet6)(struct in6_addr *local, int prefix, int scope, int if_index, int flags, unsigned int preferred, unsigned int valid, void *vparam);
|
int (*af_inet6)(struct in6_addr *local, int prefix, int scope, int if_index, int flags, unsigned int preferred, unsigned int valid, void *vparam);
|
||||||
int (*af_local)(int index, unsigned int type, char *mac, size_t maclen, void *parm);
|
int (*af_local)(int index, unsigned int type, char *mac, size_t maclen, void *parm);
|
||||||
|
|||||||
+1
-1
@@ -491,7 +491,7 @@ static size_t add_umbrella_opt(struct dns_header *header, size_t plen, unsigned
|
|||||||
{
|
{
|
||||||
*cacheable = 0;
|
*cacheable = 0;
|
||||||
|
|
||||||
struct umbrella_opt opt = {{"ODNS"}, UMBRELLA_VERSION, 0, {}};
|
struct umbrella_opt opt = {{"ODNS"}, UMBRELLA_VERSION, 0, {0}};
|
||||||
u8 *u = &opt.fields[0];
|
u8 *u = &opt.fields[0];
|
||||||
int family = source->sa.sa_family;
|
int family = source->sa.sa_family;
|
||||||
int size = family == AF_INET ? INADDRSZ : IN6ADDRSZ;
|
int size = family == AF_INET ? INADDRSZ : IN6ADDRSZ;
|
||||||
|
|||||||
+108
-148
@@ -1227,15 +1227,19 @@ void reply_query(int fd, time_t now)
|
|||||||
#ifdef HAVE_DNSSEC
|
#ifdef HAVE_DNSSEC
|
||||||
if (option_bool(OPT_DNSSEC_VALID))
|
if (option_bool(OPT_DNSSEC_VALID))
|
||||||
{
|
{
|
||||||
/* Clear this in case we don't call dnssec_validate() below */
|
if ((forward->sentto->flags & SERV_DO_DNSSEC) && !(forward->flags & FREC_CHECKING_DISABLED))
|
||||||
memset(daemon->rr_status, 0, sizeof(*daemon->rr_status) * daemon->rr_status_sz);
|
{
|
||||||
|
|
||||||
if ((forward->sentto->flags & SERV_DO_DNSSEC) &&
|
|
||||||
!(forward->flags & FREC_CHECKING_DISABLED))
|
|
||||||
dnssec_validate(forward, header, n, STAT_OK, now);
|
dnssec_validate(forward, header, n, STAT_OK, now);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If dnssec_validate() not called, rr_status{} is not valid
|
||||||
|
Clear it so we don't erroneously mark RRs as secure using stale data from
|
||||||
|
previous queries. */
|
||||||
|
memset(daemon->rr_status, 0, sizeof(*daemon->rr_status) * daemon->rr_status_sz);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return_reply(now, forward, header, n, STAT_OK);
|
return_reply(now, forward, header, n, STAT_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1451,10 +1455,16 @@ void receive_query(struct listener *listen, time_t now)
|
|||||||
size_t m;
|
size_t m;
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
int if_index = 0, auth_dns = 0, do_bit = 0, have_pseudoheader = 0;
|
int if_index = 0, auth_dns = 0, do_bit = 0, have_pseudoheader = 0;
|
||||||
|
int stale = 0, filtered = 0, ede = EDE_UNSET, do_forward = 0;
|
||||||
|
int metric, ad_reqd, fd;
|
||||||
|
struct blockdata *saved_question = NULL;
|
||||||
#ifdef HAVE_CONNTRACK
|
#ifdef HAVE_CONNTRACK
|
||||||
unsigned int mark = 0;
|
unsigned int mark = 0;
|
||||||
int have_mark = 0;
|
int have_mark = 0;
|
||||||
int is_single_query = 0, allowed = 1;
|
int allowed = 1;
|
||||||
|
# ifdef HAVE_UBUS
|
||||||
|
int report = 0;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
int local_auth = 0;
|
int local_auth = 0;
|
||||||
@@ -1701,10 +1711,6 @@ void receive_query(struct listener *listen, time_t now)
|
|||||||
log_query_mysockaddr(F_QUERY | F_FORWARD, daemon->namebuff,
|
log_query_mysockaddr(F_QUERY | F_FORWARD, daemon->namebuff,
|
||||||
&source_addr, auth_dns ? "auth" : "query", type);
|
&source_addr, auth_dns ? "auth" : "query", type);
|
||||||
|
|
||||||
#ifdef HAVE_CONNTRACK
|
|
||||||
is_single_query = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
/* find queries for zones we're authoritative for, and answer them directly */
|
/* find queries for zones we're authoritative for, and answer them directly */
|
||||||
if (!auth_dns && !option_bool(OPT_LOCALISE))
|
if (!auth_dns && !option_bool(OPT_LOCALISE))
|
||||||
@@ -1746,86 +1752,70 @@ void receive_query(struct listener *listen, time_t now)
|
|||||||
udp_size = PACKETSZ; /* Sanity check - can't reduce below default. RFC 6891 6.2.3 */
|
udp_size = PACKETSZ; /* Sanity check - can't reduce below default. RFC 6891 6.2.3 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ad_reqd = do_bit;
|
||||||
|
/* RFC 6840 5.7 */
|
||||||
|
if (header->hb4 & HB4_AD)
|
||||||
|
ad_reqd = 1;
|
||||||
|
|
||||||
|
fd = listen->fd;
|
||||||
|
|
||||||
#ifdef HAVE_CONNTRACK
|
#ifdef HAVE_CONNTRACK
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
if (!auth_dns || local_auth)
|
if (!auth_dns || local_auth)
|
||||||
#endif
|
#endif
|
||||||
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
||||||
allowed = is_query_allowed_for_mark((u32)mark, is_single_query ? daemon->namebuff : NULL);
|
allowed = is_query_allowed_for_mark((u32)mark, daemon->namebuff);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (0);
|
if (0);
|
||||||
#ifdef HAVE_CONNTRACK
|
#ifdef HAVE_CONNTRACK
|
||||||
else if (!allowed)
|
else if (!allowed)
|
||||||
{
|
{
|
||||||
u16 swap = htons(EDE_BLOCKED);
|
ede = EDE_BLOCKED;
|
||||||
|
m = answer_disallowed(header, (size_t)n, (u32)mark, daemon->namebuff);
|
||||||
m = answer_disallowed(header, (size_t)n, (u32)mark, is_single_query ? daemon->namebuff : NULL);
|
metric = METRIC_DNS_LOCAL_ANSWERED;
|
||||||
|
|
||||||
if (have_pseudoheader && m != 0)
|
|
||||||
m = add_pseudoheader(header, m, ((unsigned char *) header) + daemon->edns_pktsz,
|
|
||||||
EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
|
|
||||||
|
|
||||||
if (m >= 1)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_DUMPFILE
|
|
||||||
dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd);
|
|
||||||
#endif
|
|
||||||
send_from(listen->fd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND),
|
|
||||||
(char *)header, m, &source_addr, &dst_addr, if_index);
|
|
||||||
daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
else if (auth_dns)
|
else if (auth_dns)
|
||||||
{
|
{
|
||||||
m = answer_auth(header, ((char *) header) + udp_size, (size_t)n, now, &source_addr, local_auth);
|
m = answer_auth(header, ((char *) header) + udp_size, (size_t)n, now, &source_addr, local_auth);
|
||||||
if (m >= 1)
|
metric = METRIC_DNS_AUTH_ANSWERED;
|
||||||
{
|
|
||||||
if (have_pseudoheader)
|
|
||||||
m = add_pseudoheader(header, m, ((unsigned char *) header) + udp_size,
|
|
||||||
0, NULL, 0, do_bit, 0);
|
|
||||||
|
|
||||||
#ifdef HAVE_DUMPFILE
|
|
||||||
dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd);
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
||||||
if (local_auth)
|
if (local_auth)
|
||||||
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
report = 1;
|
||||||
report_addresses(header, m, mark);
|
|
||||||
#endif
|
#endif
|
||||||
send_from(listen->fd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND),
|
|
||||||
(char *)header, m, &source_addr, &dst_addr, if_index);
|
|
||||||
daemon->metrics[METRIC_DNS_AUTH_ANSWERED]++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int stale, filtered;
|
saved_question = blockdata_alloc((char *) header, (size_t)n);
|
||||||
int ad_reqd = do_bit;
|
|
||||||
int fd = listen->fd;
|
|
||||||
struct blockdata *saved_question = blockdata_alloc((char *) header, (size_t)n);
|
|
||||||
|
|
||||||
/* RFC 6840 5.7 */
|
|
||||||
if (header->hb4 & HB4_AD)
|
|
||||||
ad_reqd = 1;
|
|
||||||
|
|
||||||
m = answer_request(header, ((char *) header) + udp_size, (size_t)n,
|
m = answer_request(header, ((char *) header) + udp_size, (size_t)n,
|
||||||
dst_addr_4, netmask, now, ad_reqd, do_bit, &stale, &filtered);
|
dst_addr_4, netmask, now, ad_reqd, do_bit, &stale, &filtered);
|
||||||
|
|
||||||
if (m >= 1)
|
metric = stale ? METRIC_DNS_STALE_ANSWERED : METRIC_DNS_LOCAL_ANSWERED;
|
||||||
|
|
||||||
|
if (m == 0)
|
||||||
|
do_forward = 1;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (have_pseudoheader)
|
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
||||||
{
|
report = 1;
|
||||||
int ede = EDE_UNSET;
|
#endif
|
||||||
|
|
||||||
if (filtered)
|
if (filtered)
|
||||||
ede = EDE_FILTERED;
|
ede = EDE_FILTERED;
|
||||||
else if (stale)
|
else if (stale)
|
||||||
ede = EDE_STALE;
|
ede = EDE_STALE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m != 0)
|
||||||
|
{
|
||||||
|
if (have_pseudoheader)
|
||||||
|
{
|
||||||
if (ede != EDE_UNSET)
|
if (ede != EDE_UNSET)
|
||||||
{
|
{
|
||||||
u16 swap = htons(ede);
|
u16 swap = htons(ede);
|
||||||
@@ -1841,22 +1831,22 @@ void receive_query(struct listener *listen, time_t now)
|
|||||||
#ifdef HAVE_DUMPFILE
|
#ifdef HAVE_DUMPFILE
|
||||||
dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd);
|
dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
|
||||||
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
if (report)
|
||||||
report_addresses(header, m, mark);
|
report_addresses(header, m, mark);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
send_from(listen->fd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND),
|
send_from(listen->fd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND),
|
||||||
(char *)header, m, &source_addr, &dst_addr, if_index);
|
(char *)header, m, &source_addr, &dst_addr, if_index);
|
||||||
daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]++;
|
|
||||||
if (stale)
|
daemon->metrics[metric]++;
|
||||||
daemon->metrics[METRIC_DNS_STALE_ANSWERED]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stale)
|
if (stale)
|
||||||
{
|
{
|
||||||
/* We answered with stale cache data, so forward the query anyway to
|
/* We answered with stale cache data, so forward the query anyway to
|
||||||
refresh that. */
|
refresh that. */
|
||||||
m = 0;
|
do_forward = 1;
|
||||||
|
|
||||||
/* Don't mark the query with the source in this case. */
|
/* Don't mark the query with the source in this case. */
|
||||||
daemon->log_source_addr = NULL;
|
daemon->log_source_addr = NULL;
|
||||||
@@ -1865,26 +1855,26 @@ void receive_query(struct listener *listen, time_t now)
|
|||||||
when it comes back. */
|
when it comes back. */
|
||||||
fd = -1;
|
fd = -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (saved_question)
|
if (do_forward && saved_question)
|
||||||
{
|
|
||||||
if (m == 0)
|
|
||||||
{
|
{
|
||||||
/* Get the question back, since it may have been mangled by answer_request() */
|
/* Get the question back, since it may have been mangled by answer_request() */
|
||||||
blockdata_retrieve(saved_question, (size_t)n, (void *)header);
|
blockdata_retrieve(saved_question, (size_t)n, (void *)header);
|
||||||
blockdata_free(saved_question);
|
blockdata_free(saved_question);
|
||||||
|
saved_question = NULL;
|
||||||
|
|
||||||
if (forward_query(fd, &source_addr, &dst_addr, if_index, header, (size_t)n,
|
if (forward_query(fd, &source_addr, &dst_addr, if_index, header, (size_t)n,
|
||||||
udp_size, now, NULL, ad_reqd, do_bit, 0))
|
udp_size, now, NULL, ad_reqd, do_bit, 0))
|
||||||
daemon->metrics[METRIC_DNS_QUERIES_FORWARDED]++;
|
daemon->metrics[METRIC_DNS_QUERIES_FORWARDED]++;
|
||||||
else
|
else
|
||||||
daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]++;
|
daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]++;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
blockdata_free(saved_question);
|
blockdata_free(saved_question);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Send query in packet, qsize to a server determined by first,last,start and
|
/* Send query in packet, qsize to a server determined by first,last,start and
|
||||||
get the reply. return reply size. */
|
get the reply. return reply size. */
|
||||||
static ssize_t tcp_talk(int first, int last, int start, unsigned char *packet, size_t qsize,
|
static ssize_t tcp_talk(int first, int last, int start, unsigned char *packet, size_t qsize,
|
||||||
@@ -2215,19 +2205,17 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
union mysockaddr *local_addr, struct in_addr netmask, int auth_dns)
|
union mysockaddr *local_addr, struct in_addr netmask, int auth_dns)
|
||||||
{
|
{
|
||||||
size_t size = 0, saved_size = 0;
|
size_t size = 0, saved_size = 0;
|
||||||
int norebind;
|
int norebind = 0;
|
||||||
#ifdef HAVE_CONNTRACK
|
#ifdef HAVE_CONNTRACK
|
||||||
int is_single_query = 0, allowed = 1;
|
int allowed = 1;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
int local_auth = 0;
|
int local_auth = 0;
|
||||||
#endif
|
#endif
|
||||||
int checking_disabled, do_bit, added_pheader = 0, have_pseudoheader = 0;
|
int checking_disabled, do_bit = 0, ad_reqd = 0, added_pheader = 0, have_pseudoheader = 0;
|
||||||
int cacheable, no_cache_dnssec = 0, cache_secure = 0, bogusanswer = 0;
|
|
||||||
size_t m;
|
|
||||||
struct blockdata *saved_question = NULL;
|
struct blockdata *saved_question = NULL;
|
||||||
unsigned short qtype;
|
unsigned short qtype;
|
||||||
unsigned int gotname;
|
unsigned int gotname = 0;
|
||||||
/* Max TCP packet + slop + size */
|
/* Max TCP packet + slop + size */
|
||||||
unsigned char *packet = whine_malloc(65536 + MAXDNAME + RRFIXEDSZ + sizeof(u16));
|
unsigned char *packet = whine_malloc(65536 + MAXDNAME + RRFIXEDSZ + sizeof(u16));
|
||||||
unsigned char *payload = &packet[2];
|
unsigned char *payload = &packet[2];
|
||||||
@@ -2243,8 +2231,7 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
unsigned char *pheader;
|
unsigned char *pheader;
|
||||||
unsigned int mark = 0;
|
unsigned int mark = 0;
|
||||||
int have_mark = 0;
|
int have_mark = 0;
|
||||||
int first, last, filtered, stale, do_stale = 0;
|
int first, last, filtered, do_stale = 0;
|
||||||
unsigned int flags = 0;
|
|
||||||
|
|
||||||
if (!packet || getpeername(confd, (struct sockaddr *)&peer_addr, &peer_len) == -1)
|
if (!packet || getpeername(confd, (struct sockaddr *)&peer_addr, &peer_len) == -1)
|
||||||
return packet;
|
return packet;
|
||||||
@@ -2297,9 +2284,12 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
int ede = EDE_UNSET;
|
int stale = 0, ede = EDE_UNSET;
|
||||||
|
size_t m = 0;
|
||||||
stale = 0;
|
unsigned int flags = 0;
|
||||||
|
#ifdef HAVE_AUTH
|
||||||
|
struct auth_zone *zone;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!do_stale)
|
if (!do_stale)
|
||||||
{
|
{
|
||||||
@@ -2310,7 +2300,6 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
!(size = ntohs(tcp_len)) ||
|
!(size = ntohs(tcp_len)) ||
|
||||||
!read_write(confd, payload, size, RW_READ))
|
!read_write(confd, payload, size, RW_READ))
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
if (size < (int)sizeof(struct dns_header))
|
if (size < (int)sizeof(struct dns_header))
|
||||||
continue;
|
continue;
|
||||||
@@ -2327,29 +2316,22 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
daemon->log_display_id = -(++daemon->log_id);
|
daemon->log_display_id = -(++daemon->log_id);
|
||||||
daemon->log_source_addr = &peer_addr;
|
daemon->log_source_addr = &peer_addr;
|
||||||
|
|
||||||
/* save state of "cd" flag in query */
|
|
||||||
if ((checking_disabled = header->hb4 & HB4_CD))
|
|
||||||
no_cache_dnssec = 1;
|
|
||||||
|
|
||||||
if (OPCODE(header) != QUERY)
|
if (OPCODE(header) != QUERY)
|
||||||
{
|
{
|
||||||
log_query_mysockaddr(F_QUERY | F_FORWARD, "opcode", &peer_addr, "non-query", 0);
|
log_query_mysockaddr(F_QUERY | F_FORWARD, "opcode", &peer_addr, "non-query", 0);
|
||||||
gotname = 0;
|
gotname = 0;
|
||||||
m = 0;
|
|
||||||
flags = F_RCODE;
|
flags = F_RCODE;
|
||||||
}
|
}
|
||||||
else if ((gotname = extract_request(header, (unsigned int)size, daemon->namebuff, &qtype)))
|
else if (!(gotname = extract_request(header, (unsigned int)size, daemon->namebuff, &qtype)))
|
||||||
|
ede = EDE_INVALID_DATA;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
#ifdef HAVE_AUTH
|
if (saved_question)
|
||||||
struct auth_zone *zone;
|
blockdata_free(saved_question);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_CONNTRACK
|
saved_question = blockdata_alloc((char *)header, (size_t)size);
|
||||||
is_single_query = 1;
|
saved_size = size;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!do_stale)
|
|
||||||
{
|
|
||||||
log_query_mysockaddr(F_QUERY | F_FORWARD, daemon->namebuff,
|
log_query_mysockaddr(F_QUERY | F_FORWARD, daemon->namebuff,
|
||||||
&peer_addr, auth_dns ? "auth" : "query", qtype);
|
&peer_addr, auth_dns ? "auth" : "query", qtype);
|
||||||
|
|
||||||
@@ -2364,7 +2346,6 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
norebind = domain_no_rebind(daemon->namebuff);
|
norebind = domain_no_rebind(daemon->namebuff);
|
||||||
|
|
||||||
@@ -2377,101 +2358,77 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
|
|
||||||
if (find_pseudoheader(header, (size_t)size, NULL, &pheader, NULL, NULL))
|
if (find_pseudoheader(header, (size_t)size, NULL, &pheader, NULL, NULL))
|
||||||
{
|
{
|
||||||
unsigned short flags;
|
unsigned short ede_flags;
|
||||||
|
|
||||||
have_pseudoheader = 1;
|
have_pseudoheader = 1;
|
||||||
pheader += 4; /* udp_size, ext_rcode */
|
pheader += 4; /* udp_size, ext_rcode */
|
||||||
GETSHORT(flags, pheader);
|
GETSHORT(ede_flags, pheader);
|
||||||
|
|
||||||
if (flags & 0x8000)
|
if (ede_flags & 0x8000)
|
||||||
do_bit = 1; /* do bit */
|
do_bit = 1; /* do bit */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ad_reqd = do_bit;
|
||||||
|
/* RFC 6840 5.7 */
|
||||||
|
if (header->hb4 & HB4_AD)
|
||||||
|
ad_reqd = 1;
|
||||||
|
|
||||||
#ifdef HAVE_CONNTRACK
|
#ifdef HAVE_CONNTRACK
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
if (!auth_dns || local_auth)
|
if (!auth_dns || local_auth)
|
||||||
#endif
|
#endif
|
||||||
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
||||||
allowed = is_query_allowed_for_mark((u32)mark, is_single_query ? daemon->namebuff : NULL);
|
allowed = is_query_allowed_for_mark((u32)mark, daemon->namebuff);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (0);
|
if (0);
|
||||||
#ifdef HAVE_CONNTRACK
|
#ifdef HAVE_CONNTRACK
|
||||||
else if (!allowed)
|
else if (!allowed)
|
||||||
{
|
{
|
||||||
u16 swap = htons(EDE_BLOCKED);
|
ede = EDE_BLOCKED;
|
||||||
|
m = answer_disallowed(header, size, (u32)mark, daemon->namebuff);
|
||||||
m = answer_disallowed(header, size, (u32)mark, is_single_query ? daemon->namebuff : NULL);
|
|
||||||
|
|
||||||
if (have_pseudoheader && m != 0)
|
|
||||||
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536,
|
|
||||||
EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
else if (auth_dns)
|
else if (auth_dns)
|
||||||
{
|
|
||||||
m = answer_auth(header, ((char *) header) + 65536, (size_t)size, now, &peer_addr, local_auth);
|
m = answer_auth(header, ((char *) header) + 65536, (size_t)size, now, &peer_addr, local_auth);
|
||||||
if (m >= 1 && have_pseudoheader)
|
|
||||||
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536,
|
|
||||||
0, NULL, 0, do_bit, 0);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
{
|
|
||||||
int ad_reqd = do_bit;
|
|
||||||
/* RFC 6840 5.7 */
|
|
||||||
if (header->hb4 & HB4_AD)
|
|
||||||
ad_reqd = 1;
|
|
||||||
|
|
||||||
if (do_stale)
|
|
||||||
m = 0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (saved_question)
|
|
||||||
blockdata_free(saved_question);
|
|
||||||
|
|
||||||
saved_question = blockdata_alloc((char *)header, (size_t)size);
|
|
||||||
saved_size = size;
|
|
||||||
|
|
||||||
/* m > 0 if answered from cache */
|
|
||||||
m = answer_request(header, ((char *) header) + 65536, (size_t)size,
|
m = answer_request(header, ((char *) header) + 65536, (size_t)size,
|
||||||
dst_addr_4, netmask, now, ad_reqd, do_bit, &stale, &filtered);
|
dst_addr_4, netmask, now, ad_reqd, do_bit, &stale, &filtered);
|
||||||
|
}
|
||||||
if (m >= 1 && have_pseudoheader)
|
|
||||||
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536,
|
|
||||||
0, NULL, 0, do_bit, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do this by steam now we're not in the select() loop */
|
/* Do this by steam now we're not in the select() loop */
|
||||||
check_log_writer(1);
|
check_log_writer(1);
|
||||||
|
|
||||||
if (m == 0 && saved_question)
|
if (m == 0 && ede == EDE_UNSET && saved_question)
|
||||||
{
|
{
|
||||||
struct server *master;
|
struct server *master;
|
||||||
int start;
|
int start;
|
||||||
|
int cacheable, no_cache_dnssec = 0, cache_secure = 0, bogusanswer = 0;
|
||||||
|
|
||||||
blockdata_retrieve(saved_question, (size_t)saved_size, header);
|
blockdata_retrieve(saved_question, (size_t)saved_size, header);
|
||||||
size = saved_size;
|
size = saved_size;
|
||||||
|
|
||||||
|
/* save state of "cd" flag in query */
|
||||||
|
if ((checking_disabled = header->hb4 & HB4_CD))
|
||||||
|
no_cache_dnssec = 1;
|
||||||
|
|
||||||
if (lookup_domain(daemon->namebuff, gotname, &first, &last))
|
if (lookup_domain(daemon->namebuff, gotname, &first, &last))
|
||||||
flags = is_local_answer(now, first, daemon->namebuff);
|
flags = is_local_answer(now, first, daemon->namebuff);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
/* No configured servers */
|
|
||||||
ede = EDE_NOT_READY;
|
ede = EDE_NOT_READY;
|
||||||
flags = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!flags && ede == EDE_UNSET)
|
||||||
|
{
|
||||||
/* don't forward A or AAAA queries for simple names, except the empty name */
|
/* don't forward A or AAAA queries for simple names, except the empty name */
|
||||||
if (!flags &&
|
if (option_bool(OPT_NODOTS_LOCAL) &&
|
||||||
option_bool(OPT_NODOTS_LOCAL) &&
|
|
||||||
(gotname & (F_IPV4 | F_IPV6)) &&
|
(gotname & (F_IPV4 | F_IPV6)) &&
|
||||||
!strchr(daemon->namebuff, '.') &&
|
!strchr(daemon->namebuff, '.') &&
|
||||||
strlen(daemon->namebuff) != 0)
|
strlen(daemon->namebuff) != 0)
|
||||||
flags = check_for_local_domain(daemon->namebuff, now) ? F_NOERR : F_NXDOMAIN;
|
flags = check_for_local_domain(daemon->namebuff, now) ? F_NOERR : F_NXDOMAIN;
|
||||||
|
else
|
||||||
if (!flags && ede != EDE_NOT_READY)
|
|
||||||
{
|
{
|
||||||
master = daemon->serverarray[first];
|
master = daemon->serverarray[first];
|
||||||
|
|
||||||
@@ -2501,11 +2458,9 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
|
|
||||||
/* Loop round available servers until we succeed in connecting to one. */
|
/* Loop round available servers until we succeed in connecting to one. */
|
||||||
if ((m = tcp_talk(first, last, start, packet, size, have_mark, mark, &serv)) == 0)
|
if ((m = tcp_talk(first, last, start, packet, size, have_mark, mark, &serv)) == 0)
|
||||||
{
|
|
||||||
ede = EDE_NETERR;
|
ede = EDE_NETERR;
|
||||||
break;
|
else
|
||||||
}
|
{
|
||||||
|
|
||||||
/* get query name again for logging - may have been overwritten */
|
/* get query name again for logging - may have been overwritten */
|
||||||
if (!(gotname = extract_request(header, (unsigned int)size, daemon->namebuff, &qtype)))
|
if (!(gotname = extract_request(header, (unsigned int)size, daemon->namebuff, &qtype)))
|
||||||
strcpy(daemon->namebuff, "query");
|
strcpy(daemon->namebuff, "query");
|
||||||
@@ -2561,6 +2516,7 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* restore CD bit to the value in the query */
|
/* restore CD bit to the value in the query */
|
||||||
if (checking_disabled)
|
if (checking_disabled)
|
||||||
header->hb4 |= HB4_CD;
|
header->hb4 |= HB4_CD;
|
||||||
@@ -2575,6 +2531,9 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
m = process_reply(header, now, serv, (unsigned int)m,
|
m = process_reply(header, now, serv, (unsigned int)m,
|
||||||
option_bool(OPT_NO_REBIND) && !norebind, no_cache_dnssec, cache_secure, bogusanswer,
|
option_bool(OPT_NO_REBIND) && !norebind, no_cache_dnssec, cache_secure, bogusanswer,
|
||||||
ad_reqd, do_bit, added_pheader, &peer_addr, ((unsigned char *)header) + 65536, ede);
|
ad_reqd, do_bit, added_pheader, &peer_addr, ((unsigned char *)header) + 65536, ede);
|
||||||
|
|
||||||
|
/* process_reply() adds pheader itself */
|
||||||
|
have_pseudoheader = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2590,10 +2549,8 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
((char *) header) + 65536, first, last, ede)))
|
((char *) header) + 65536, first, last, ede)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else if (ede == EDE_UNSET)
|
||||||
{
|
{
|
||||||
ede = EDE_UNSET;
|
|
||||||
|
|
||||||
if (filtered)
|
if (filtered)
|
||||||
ede = EDE_FILTERED;
|
ede = EDE_FILTERED;
|
||||||
else if (stale)
|
else if (stale)
|
||||||
@@ -2621,6 +2578,7 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
if (option_bool(OPT_CMARK_ALST_EN) && have_mark && ((u32)mark & daemon->allowlist_mask))
|
||||||
report_addresses(header, m, mark);
|
report_addresses(header, m, mark);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!read_write(confd, packet, m + sizeof(u16), RW_WRITE))
|
if (!read_write(confd, packet, m + sizeof(u16), RW_WRITE))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2633,6 +2591,8 @@ unsigned char *tcp_request(int confd, time_t now,
|
|||||||
shutdown(confd, SHUT_RDWR);
|
shutdown(confd, SHUT_RDWR);
|
||||||
close(confd);
|
close(confd);
|
||||||
do_stale = 1;
|
do_stale = 1;
|
||||||
|
/* Don't mark the query with the source when refreshing stale data. */
|
||||||
|
daemon->log_source_addr = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3094,7 +3054,7 @@ static struct frec *lookup_frec(char *target, int class, int rrtype, int id, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send query packet again, if we can. */
|
/* Send query packet again, if we can. */
|
||||||
void resend_query()
|
void resend_query(void)
|
||||||
{
|
{
|
||||||
if (daemon->srv_save)
|
if (daemon->srv_save)
|
||||||
server_send(daemon->srv_save, daemon->fd_save,
|
server_send(daemon->srv_save, daemon->fd_save,
|
||||||
|
|||||||
+4
-4
@@ -75,11 +75,11 @@ static char *buffer;
|
|||||||
|
|
||||||
static inline void add_attr(struct nlmsghdr *nlh, uint16_t type, size_t len, const void *data)
|
static inline void add_attr(struct nlmsghdr *nlh, uint16_t type, size_t len, const void *data)
|
||||||
{
|
{
|
||||||
struct my_nlattr *attr = (void *)nlh + NL_ALIGN(nlh->nlmsg_len);
|
struct my_nlattr *attr = (struct my_nlattr *)((u8 *)nlh + NL_ALIGN(nlh->nlmsg_len));
|
||||||
uint16_t payload_len = NL_ALIGN(sizeof(struct my_nlattr)) + len;
|
uint16_t payload_len = NL_ALIGN(sizeof(struct my_nlattr)) + len;
|
||||||
attr->nla_type = type;
|
attr->nla_type = type;
|
||||||
attr->nla_len = payload_len;
|
attr->nla_len = payload_len;
|
||||||
memcpy((void *)attr + NL_ALIGN(sizeof(struct my_nlattr)), data, len);
|
memcpy((u8 *)attr + NL_ALIGN(sizeof(struct my_nlattr)), data, len);
|
||||||
nlh->nlmsg_len += NL_ALIGN(payload_len);
|
nlh->nlmsg_len += NL_ALIGN(payload_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,8 +138,8 @@ static int new_add_to_ipset(const char *setname, const union all_addr *ipaddr, i
|
|||||||
add_attr(nlh,
|
add_attr(nlh,
|
||||||
(af == AF_INET ? IPSET_ATTR_IPADDR_IPV4 : IPSET_ATTR_IPADDR_IPV6) | NLA_F_NET_BYTEORDER,
|
(af == AF_INET ? IPSET_ATTR_IPADDR_IPV4 : IPSET_ATTR_IPADDR_IPV6) | NLA_F_NET_BYTEORDER,
|
||||||
addrsz, ipaddr);
|
addrsz, ipaddr);
|
||||||
nested[1]->nla_len = (void *)buffer + NL_ALIGN(nlh->nlmsg_len) - (void *)nested[1];
|
nested[1]->nla_len = (u8 *)buffer + NL_ALIGN(nlh->nlmsg_len) - (u8 *)nested[1];
|
||||||
nested[0]->nla_len = (void *)buffer + NL_ALIGN(nlh->nlmsg_len) - (void *)nested[0];
|
nested[0]->nla_len = (u8 *)buffer + NL_ALIGN(nlh->nlmsg_len) - (u8 *)nested[0];
|
||||||
|
|
||||||
while (retry_send(sendto(ipset_sock, buffer, nlh->nlmsg_len, 0,
|
while (retry_send(sendto(ipset_sock, buffer, nlh->nlmsg_len, 0,
|
||||||
(struct sockaddr *)&snl, sizeof(snl))));
|
(struct sockaddr *)&snl, sizeof(snl))));
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@
|
|||||||
#ifdef HAVE_LOOP
|
#ifdef HAVE_LOOP
|
||||||
static ssize_t loop_make_probe(u32 uid);
|
static ssize_t loop_make_probe(u32 uid);
|
||||||
|
|
||||||
void loop_send_probes()
|
void loop_send_probes(void)
|
||||||
{
|
{
|
||||||
struct server *serv;
|
struct server *serv;
|
||||||
struct randfd_list *rfds = NULL;
|
struct randfd_list *rfds = NULL;
|
||||||
|
|||||||
+1
-1
@@ -647,7 +647,7 @@ static int iface_allowed_v4(struct in_addr local, int if_index, char *label,
|
|||||||
/*
|
/*
|
||||||
* Clean old interfaces no longer found.
|
* Clean old interfaces no longer found.
|
||||||
*/
|
*/
|
||||||
static void clean_interfaces()
|
static void clean_interfaces(void)
|
||||||
{
|
{
|
||||||
struct irec *iface;
|
struct irec *iface;
|
||||||
struct irec **up = &daemon->interfaces;
|
struct irec **up = &daemon->interfaces;
|
||||||
|
|||||||
+1
-1
@@ -4161,7 +4161,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
}
|
}
|
||||||
else if (strcmp(arg, "ignore") == 0)
|
else if (strcmp(arg, "ignore") == 0)
|
||||||
new->flags |= CONFIG_DISABLE;
|
new->flags |= CONFIG_DISABLE;
|
||||||
if (new->hostname)
|
else if (new->hostname)
|
||||||
{
|
{
|
||||||
dhcp_config_free(new);
|
dhcp_config_free(new);
|
||||||
ret_err(_("DHCP host has multiple names"));
|
ret_err(_("DHCP host has multiple names"));
|
||||||
|
|||||||
+6
-6
@@ -23,7 +23,7 @@ static size_t outpacket_counter;
|
|||||||
|
|
||||||
void end_opt6(int container)
|
void end_opt6(int container)
|
||||||
{
|
{
|
||||||
void *p = daemon->outpacket.iov_base + container + 2;
|
uint8_t *p = (uint8_t *)daemon->outpacket.iov_base + container + 2;
|
||||||
u16 len = outpacket_counter - container - 4 ;
|
u16 len = outpacket_counter - container - 4 ;
|
||||||
|
|
||||||
PUTSHORT(len, p);
|
PUTSHORT(len, p);
|
||||||
@@ -50,11 +50,11 @@ int save_counter(int newval)
|
|||||||
|
|
||||||
void *expand(size_t headroom)
|
void *expand(size_t headroom)
|
||||||
{
|
{
|
||||||
void *ret;
|
uint8_t *ret;
|
||||||
|
|
||||||
if (expand_buf(&daemon->outpacket, outpacket_counter + headroom))
|
if (expand_buf(&daemon->outpacket, outpacket_counter + headroom))
|
||||||
{
|
{
|
||||||
ret = daemon->outpacket.iov_base + outpacket_counter;
|
ret = (uint8_t *)daemon->outpacket.iov_base + outpacket_counter;
|
||||||
outpacket_counter += headroom;
|
outpacket_counter += headroom;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,7 @@ void *expand(size_t headroom)
|
|||||||
int new_opt6(int opt)
|
int new_opt6(int opt)
|
||||||
{
|
{
|
||||||
int ret = outpacket_counter;
|
int ret = outpacket_counter;
|
||||||
void *p;
|
unsigned char *p;
|
||||||
|
|
||||||
if ((p = expand(4)))
|
if ((p = expand(4)))
|
||||||
{
|
{
|
||||||
@@ -88,7 +88,7 @@ void *put_opt6(void *data, size_t len)
|
|||||||
|
|
||||||
void put_opt6_long(unsigned int val)
|
void put_opt6_long(unsigned int val)
|
||||||
{
|
{
|
||||||
void *p;
|
unsigned char *p;
|
||||||
|
|
||||||
if ((p = expand(4)))
|
if ((p = expand(4)))
|
||||||
PUTLONG(val, p);
|
PUTLONG(val, p);
|
||||||
@@ -96,7 +96,7 @@ void put_opt6_long(unsigned int val)
|
|||||||
|
|
||||||
void put_opt6_short(unsigned int val)
|
void put_opt6_short(unsigned int val)
|
||||||
{
|
{
|
||||||
void *p;
|
uint8_t *p;
|
||||||
|
|
||||||
if ((p = expand(2)))
|
if ((p = expand(2)))
|
||||||
PUTSHORT(val, p);
|
PUTSHORT(val, p);
|
||||||
|
|||||||
+12
-12
@@ -39,8 +39,8 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|||||||
static void log6_opts(int nest, unsigned int xid, void *start_opts, void *end_opts);
|
static void log6_opts(int nest, unsigned int xid, void *start_opts, void *end_opts);
|
||||||
static void log6_packet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
static void log6_packet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
||||||
static void log6_quiet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
static void log6_quiet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
||||||
static void *opt6_find (void *opts, void *end, unsigned int search, unsigned int minsize);
|
static void *opt6_find (uint8_t *opts, uint8_t *end, unsigned int search, unsigned int minsize);
|
||||||
static void *opt6_next(void *opts, void *end);
|
static void *opt6_next(uint8_t *opts, uint8_t *end);
|
||||||
static unsigned int opt6_uint(unsigned char *opt, int offset, int size);
|
static unsigned int opt6_uint(unsigned char *opt, int offset, int size);
|
||||||
static void get_context_tag(struct state *state, struct dhcp_context *context);
|
static void get_context_tag(struct state *state, struct dhcp_context *context);
|
||||||
static int check_ia(struct state *state, void *opt, void **endp, void **ia_option);
|
static int check_ia(struct state *state, void *opt, void **endp, void **ia_option);
|
||||||
@@ -61,11 +61,11 @@ static void calculate_times(struct dhcp_context *context, unsigned int *min_time
|
|||||||
|
|
||||||
#define opt6_len(opt) ((int)(opt6_uint(opt, -2, 2)))
|
#define opt6_len(opt) ((int)(opt6_uint(opt, -2, 2)))
|
||||||
#define opt6_type(opt) (opt6_uint(opt, -4, 2))
|
#define opt6_type(opt) (opt6_uint(opt, -4, 2))
|
||||||
#define opt6_ptr(opt, i) ((void *)&(((unsigned char *)(opt))[4+(i)]))
|
#define opt6_ptr(opt, i) ((void *)&(((uint8_t *)(opt))[4+(i)]))
|
||||||
|
|
||||||
#define opt6_user_vendor_ptr(opt, i) ((void *)&(((unsigned char *)(opt))[2+(i)]))
|
#define opt6_user_vendor_ptr(opt, i) ((void *)&(((uint8_t *)(opt))[2+(i)]))
|
||||||
#define opt6_user_vendor_len(opt) ((int)(opt6_uint(opt, -4, 2)))
|
#define opt6_user_vendor_len(opt) ((int)(opt6_uint(opt, -4, 2)))
|
||||||
#define opt6_user_vendor_next(opt, end) (opt6_next(((void *) opt) - 2, end))
|
#define opt6_user_vendor_next(opt, end) (opt6_next(((uint8_t *) opt) - 2, end))
|
||||||
|
|
||||||
|
|
||||||
unsigned short dhcp6_reply(struct dhcp_context *context, int interface, char *iface_name,
|
unsigned short dhcp6_reply(struct dhcp_context *context, int interface, char *iface_name,
|
||||||
@@ -107,11 +107,11 @@ unsigned short dhcp6_reply(struct dhcp_context *context, int interface, char *if
|
|||||||
static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz,
|
static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz,
|
||||||
struct in6_addr *client_addr, int is_unicast, time_t now)
|
struct in6_addr *client_addr, int is_unicast, time_t now)
|
||||||
{
|
{
|
||||||
void *end = inbuff + sz;
|
uint8_t *end = inbuff + sz;
|
||||||
void *opts = inbuff + 34;
|
uint8_t *opts = inbuff + 34;
|
||||||
int msg_type = *inbuff;
|
int msg_type = *inbuff;
|
||||||
unsigned char *outmsgtypep;
|
unsigned char *outmsgtypep;
|
||||||
void *opt;
|
uint8_t *opt;
|
||||||
struct dhcp_vendor *vendor;
|
struct dhcp_vendor *vendor;
|
||||||
|
|
||||||
/* if not an encapsulated relayed message, just do the stuff */
|
/* if not an encapsulated relayed message, just do the stuff */
|
||||||
@@ -232,7 +232,7 @@ static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t
|
|||||||
|
|
||||||
for (opt = opts; opt; opt = opt6_next(opt, end))
|
for (opt = opts; opt; opt = opt6_next(opt, end))
|
||||||
{
|
{
|
||||||
if (opt6_ptr(opt, 0) + opt6_len(opt) > end)
|
if ((uint8_t *)opt6_ptr(opt, 0) + opt6_len(opt) > end)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Don't copy MAC address into reply. */
|
/* Don't copy MAC address into reply. */
|
||||||
@@ -1307,7 +1307,7 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|||||||
reallocated. */
|
reallocated. */
|
||||||
((unsigned char *)(daemon->outpacket.iov_base))[start_msg] = outmsgtype;
|
((unsigned char *)(daemon->outpacket.iov_base))[start_msg] = outmsgtype;
|
||||||
|
|
||||||
log6_opts(0, state->xid, daemon->outpacket.iov_base + start_opts, daemon->outpacket.iov_base + save_counter(-1));
|
log6_opts(0, state->xid, (uint8_t *)daemon->outpacket.iov_base + start_opts, (uint8_t *)daemon->outpacket.iov_base + save_counter(-1));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@@ -2093,7 +2093,7 @@ static void log6_packet(struct state *state, char *type, struct in6_addr *addr,
|
|||||||
string ? string : "");
|
string ? string : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *opt6_find (void *opts, void *end, unsigned int search, unsigned int minsize)
|
static void *opt6_find (uint8_t *opts, uint8_t *end, unsigned int search, unsigned int minsize)
|
||||||
{
|
{
|
||||||
u16 opt, opt_len;
|
u16 opt, opt_len;
|
||||||
void *start;
|
void *start;
|
||||||
@@ -2120,7 +2120,7 @@ static void *opt6_find (void *opts, void *end, unsigned int search, unsigned int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *opt6_next(void *opts, void *end)
|
static void *opt6_next(uint8_t *opts, uint8_t *end)
|
||||||
{
|
{
|
||||||
u16 opt_len;
|
u16 opt_len;
|
||||||
|
|
||||||
|
|||||||
+17
-3
@@ -41,7 +41,7 @@ static u32 in[12];
|
|||||||
static u32 out[8];
|
static u32 out[8];
|
||||||
static int outleft = 0;
|
static int outleft = 0;
|
||||||
|
|
||||||
void rand_init()
|
void rand_init(void)
|
||||||
{
|
{
|
||||||
int fd = open(RANDFILE, O_RDONLY);
|
int fd = open(RANDFILE, O_RDONLY);
|
||||||
|
|
||||||
@@ -810,11 +810,25 @@ void close_fds(long max_fd, int spare1, int spare2, int spare3)
|
|||||||
{
|
{
|
||||||
/* On Linux, use the /proc/ filesystem to find which files
|
/* On Linux, use the /proc/ filesystem to find which files
|
||||||
are actually open, rather than iterate over the whole space,
|
are actually open, rather than iterate over the whole space,
|
||||||
for efficiency reasons. If this fails we drop back to the dumb code. */
|
for efficiency reasons.
|
||||||
|
|
||||||
|
On *BSD, the same facility is found at /dev/fd.
|
||||||
|
|
||||||
|
If this fails we drop back to the dumb code.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_LINUX_NETWORK
|
#ifdef HAVE_LINUX_NETWORK
|
||||||
|
#define FDESCFS "/proc/self/fd"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_BSD_NETWORK
|
||||||
|
#define FDESCFS "/dev/fd"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FDESCFS
|
||||||
DIR *d;
|
DIR *d;
|
||||||
|
|
||||||
if ((d = opendir("/proc/self/fd")))
|
if ((d = opendir(FDESCFS)))
|
||||||
{
|
{
|
||||||
struct dirent *de;
|
struct dirent *de;
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user