summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL2
-rw-r--r--NEWS9
-rw-r--r--doc/index.html4
-rw-r--r--doc/s6-dns-hosts-compile.html5
-rw-r--r--doc/upgrade.html7
-rw-r--r--package/deps.mak6
-rw-r--r--package/info2
-rw-r--r--src/clients/s6-dnsip.c13
-rw-r--r--src/clients/s6-dnsip4.c13
-rw-r--r--src/clients/s6-dnsip6.c13
-rw-r--r--src/clients/s6-dnsname.c9
-rw-r--r--src/include/s6-dns/s6dns.h5
-rw-r--r--src/libs6dns/s6dns_hosts_compile.c26
-rw-r--r--src/libs6dns/s6dns_hosts_compile.txt18
-rw-r--r--src/libs6dns/s6dns_init.c4
15 files changed, 71 insertions, 65 deletions
diff --git a/INSTALL b/INSTALL
index f7fbbd6..12604fc 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Build Instructions
- A POSIX-compliant C development environment
- GNU make version 3.81 or later
- - skalibs version 2.14.0.0 or later: https://skarnet.org/software/skalibs/
+ - skalibs version 2.14.0.1 or later: https://skarnet.org/software/skalibs/
This software will run on any operating system that implements
POSIX.1-2008, available at:
diff --git a/NEWS b/NEWS
index 8aa47f6..669b8ce 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,14 @@
Changelog for s6-dns.
+In 2.3.7.0
+----------
+
+ - New s6dns_init_options() function,
+to choose whether to support /etc/hosts or not.
+ - Properly ignore link-local addresses in /etc/hosts
+instead of erroring out on them.
+
+
In 2.3.6.0
----------
diff --git a/doc/index.html b/doc/index.html
index 1c3e2a2..1b5a7cb 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -58,7 +58,7 @@ to the s6 ecosystem.
<li> A POSIX-compliant system with a standard C development environment </li>
<li> GNU make, version 3.81 or later </li>
<li> <a href="//skarnet.org/software/skalibs/">skalibs</a> version
-2.14.0.0 or later. It's a build-time requirement. It's also a run-time
+2.14.0.1 or later. It's a build-time requirement. It's also a run-time
requirement if you link against the shared version of the skalibs library. </li>
</ul>
@@ -72,7 +72,7 @@ requirement if you link against the shared version of the skalibs library. </li>
<h3> Download </h3>
<ul>
- <li> The current released version of s6-dns is <a href="s6-dns-2.3.6.0.tar.gz">2.3.6.0</a>. </li>
+ <li> The current released version of s6-dns is <a href="s6-dns-2.3.7.0.tar.gz">2.3.7.0</a>. </li>
<li> Alternatively, you can checkout a copy of the
<a href="//git.skarnet.org/cgi-bin/cgit.cgi/s6-dns/">s6-dns
git repository</a>:
diff --git a/doc/s6-dns-hosts-compile.html b/doc/s6-dns-hosts-compile.html
index 537c025..2fecdc1 100644
--- a/doc/s6-dns-hosts-compile.html
+++ b/doc/s6-dns-hosts-compile.html
@@ -70,6 +70,11 @@ than <tt>/etc/hosts.cdb</tt>, they will not use <tt>/etc/hosts.cdb</tt> and will
perform the compilation step into a temporary file. So, remember to run
s6-dns-hosts-compile after modifying your <tt>/etc/hosts</tt> if you want to keep
the tiny performance improvement. </li>
+ <li> Some tools write link-local addresses in <tt>/etc/hosts</tt> i.e. IPv6 addresses
+followed by a <tt>%</tt> (percent) and a network interface name. This is nonstandard
+and unusable with the DNS protocol, which does not take interface names into
+account. <tt>s6-dns-hosts-compile</tt> will ignore such lines if they appear in
+your hosts file. </li>
</ul>
</body>
diff --git a/doc/upgrade.html b/doc/upgrade.html
index b6c1b67..db26b1c 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -18,6 +18,13 @@
<h1> What has changed in s6-dns </h1>
+<h2> in 2.3.7.0 </h2>
+
+<ul>
+ <li> <a href="//skarnet.org/software/skalibs/">skalibs</a>
+dependency bumped to 2.14.0.1. </li>
+</ul>
+
<h2> in 2.3.6.0 </h2>
<ul>
diff --git a/package/deps.mak b/package/deps.mak
index 400420e..459e13e 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -28,11 +28,11 @@ src/caches/shibari_whitelist_add6.o src/caches/shibari_whitelist_add6.lo: src/ca
src/caches/shibari_whitelist_ip4_match.o src/caches/shibari_whitelist_ip4_match.lo: src/caches/shibari_whitelist_ip4_match.c src/caches/shibari-internal.h
src/caches/shibari_whitelist_ip6_match.o src/caches/shibari_whitelist_ip6_match.lo: src/caches/shibari_whitelist_ip6_match.c src/caches/shibari-internal.h
src/caches/shibari_whitelist_read.o src/caches/shibari_whitelist_read.lo: src/caches/shibari_whitelist_read.c src/caches/shibari-internal.h
-src/clients/s6-dnsip.o src/clients/s6-dnsip.lo: src/clients/s6-dnsip.c src/include/s6-dns/hosts.h src/include/s6-dns/s6dns-rci.h src/include/s6-dns/s6dns-resolve.h
+src/clients/s6-dnsip.o src/clients/s6-dnsip.lo: src/clients/s6-dnsip.c src/include/s6-dns/s6dns.h
src/clients/s6-dnsip4-filter.o src/clients/s6-dnsip4-filter.lo: src/clients/s6-dnsip4-filter.c src/include/s6-dns/s6dns-constants.h src/include/s6-dns/s6dns-message.h src/clients/s6dns-generic-filter.h
-src/clients/s6-dnsip4.o src/clients/s6-dnsip4.lo: src/clients/s6-dnsip4.c src/include/s6-dns/hosts.h src/include/s6-dns/s6dns-rci.h src/include/s6-dns/s6dns-resolve.h
+src/clients/s6-dnsip4.o src/clients/s6-dnsip4.lo: src/clients/s6-dnsip4.c src/include/s6-dns/s6dns.h
src/clients/s6-dnsip6-filter.o src/clients/s6-dnsip6-filter.lo: src/clients/s6-dnsip6-filter.c src/include/s6-dns/s6dns-constants.h src/include/s6-dns/s6dns-message.h src/clients/s6dns-generic-filter.h
-src/clients/s6-dnsip6.o src/clients/s6-dnsip6.lo: src/clients/s6-dnsip6.c src/include/s6-dns/hosts.h src/include/s6-dns/s6dns-rci.h src/include/s6-dns/s6dns-resolve.h
+src/clients/s6-dnsip6.o src/clients/s6-dnsip6.lo: src/clients/s6-dnsip6.c src/include/s6-dns/s6dns.h
src/clients/s6-dnsmx.o src/clients/s6-dnsmx.lo: src/clients/s6-dnsmx.c src/include/s6-dns/s6dns.h
src/clients/s6-dnsname-filter.o src/clients/s6-dnsname-filter.lo: src/clients/s6-dnsname-filter.c src/include/s6-dns/s6dns-constants.h src/include/s6-dns/s6dns-domain.h src/include/s6-dns/s6dns-message.h src/clients/s6dns-generic-filter.h
src/clients/s6-dnsname.o src/clients/s6-dnsname.lo: src/clients/s6-dnsname.c src/include/s6-dns/s6dns.h
diff --git a/package/info b/package/info
index f17f611..debd059 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=s6-dns
-version=2.3.6.0
+version=2.3.7.0
category=web
package_macro_name=S6_DNS
diff --git a/src/clients/s6-dnsip.c b/src/clients/s6-dnsip.c
index 68ce62b..b0d724c 100644
--- a/src/clients/s6-dnsip.c
+++ b/src/clients/s6-dnsip.c
@@ -12,9 +12,7 @@
#include <skalibs/tai.h>
#include <skalibs/random.h>
-#include <s6-dns/s6dns-rci.h>
-#include <s6-dns/hosts.h>
-#include <s6-dns/s6dns-resolve.h>
+#include <s6-dns/s6dns.h>
#define USAGE "s6-dnsip [ -q ] [ -H | -h ] [ -r ] [ -t timeout ] domain"
#define dieusage() strerr_dieusage(100, USAGE)
@@ -54,13 +52,8 @@ int main (int argc, char const *const *argv)
if (t) tain_from_millisecs(&deadline, t) ; else deadline = tain_infinite_relative ;
tain_add_g(&deadline, &deadline) ;
- if (!s6dns_rci_init(&s6dns_rci_here, "/etc/resolv.conf"))
- strerr_diefu1sys(111, "initialize structures from /etc/resolv.conf") ;
- if (flaghosts)
- {
- flaghosts = s6dns_hosts_init(&s6dns_hosts_here, "/etc/hosts", "/etc/hosts.cdb", "/tmp/hosts.cdb") ;
- if (flaghosts == -1) strerr_diefu1sys(111, "initialize hosts database from /etc/hosts or /etc/hosts.cdb") ;
- }
+ if (!s6dns_init_options(flaghosts))
+ strerr_diefu1sys(111, "parse /etc/resolv.conf or /etc/hosts") ;
if (flaghosts)
{
diff --git a/src/clients/s6-dnsip4.c b/src/clients/s6-dnsip4.c
index 370c006..6112e14 100644
--- a/src/clients/s6-dnsip4.c
+++ b/src/clients/s6-dnsip4.c
@@ -11,9 +11,7 @@
#include <skalibs/tai.h>
#include <skalibs/random.h>
-#include <s6-dns/s6dns-rci.h>
-#include <s6-dns/hosts.h>
-#include <s6-dns/s6dns-resolve.h>
+#include <s6-dns/s6dns.h>
#define USAGE "s6-dnsip4 [ -q ] [ -H | -h ] [ -r ] [ -t timeout ] domain"
#define dieusage() strerr_dieusage(100, USAGE)
@@ -53,13 +51,8 @@ int main (int argc, char const *const *argv)
if (t) tain_from_millisecs(&deadline, t) ; else deadline = tain_infinite_relative ;
tain_add_g(&deadline, &deadline) ;
- if (!s6dns_rci_init(&s6dns_rci_here, "/etc/resolv.conf"))
- strerr_diefu1sys(111, "initialize structures from /etc/resolv.conf") ;
- if (flaghosts)
- {
- flaghosts = s6dns_hosts_init(&s6dns_hosts_here, "/etc/hosts", "/etc/hosts.cdb", "/tmp/hosts.cdb") ;
- if (flaghosts == -1) strerr_diefu1sys(111, "initialize hosts database from /etc/hosts or /etc/hosts.cdb") ;
- }
+ if (!s6dns_init_options(flaghosts))
+ strerr_diefu1sys(111, "parse from /etc/resolv.conf or /etc/hosts") ;
if (flaghosts)
{
diff --git a/src/clients/s6-dnsip6.c b/src/clients/s6-dnsip6.c
index 2fb2f6f..2a7ce8b 100644
--- a/src/clients/s6-dnsip6.c
+++ b/src/clients/s6-dnsip6.c
@@ -11,9 +11,7 @@
#include <skalibs/tai.h>
#include <skalibs/random.h>
-#include <s6-dns/s6dns-rci.h>
-#include <s6-dns/hosts.h>
-#include <s6-dns/s6dns-resolve.h>
+#include <s6-dns/s6dns.h>
#define USAGE "s6-dnsip6 [ -q ] [ -H | -h ] [ -r ] [ -t timeout ] domain"
#define dieusage() strerr_dieusage(100, USAGE)
@@ -53,13 +51,8 @@ int main (int argc, char const *const *argv)
if (t) tain_from_millisecs(&deadline, t) ; else deadline = tain_infinite_relative ;
tain_add_g(&deadline, &deadline) ;
- if (!s6dns_rci_init(&s6dns_rci_here, "/etc/resolv.conf"))
- strerr_diefu1sys(111, "initialize structures from /etc/resolv.conf") ;
- if (flaghosts)
- {
- flaghosts = s6dns_hosts_init(&s6dns_hosts_here, "/etc/hosts", "/etc/hosts.cdb", "/tmp/hosts.cdb") ;
- if (flaghosts == -1) strerr_diefu1sys(111, "initialize hosts database from /etc/hosts or /etc/hosts.cdb") ;
- }
+ if (!s6dns_init_options(flaghosts))
+ strerr_diefu1sys(111, "parse /etc/resolv.conf or /etc/hosts") ;
if (flaghosts)
{
diff --git a/src/clients/s6-dnsname.c b/src/clients/s6-dnsname.c
index 7c35f06..6531534 100644
--- a/src/clients/s6-dnsname.c
+++ b/src/clients/s6-dnsname.c
@@ -67,13 +67,8 @@ int main (int argc, char const *const *argv)
if (t) tain_from_millisecs(&deadline, t) ; else deadline = tain_infinite_relative ;
tain_add_g(&deadline, &deadline) ;
- if (!s6dns_rci_init(&s6dns_rci_here, "/etc/resolv.conf"))
- strerr_diefu1sys(111, "initialize structures from /etc/resolv.conf") ;
- if (flaghosts)
- {
- flaghosts = s6dns_hosts_init(&s6dns_hosts_here, "/etc/hosts", "/etc/hosts.cdb", "/tmp/hosts.cdb") ;
- if (flaghosts == -1) strerr_diefu1sys(111, "initialize hosts database from /etc/hosts or /etc/hosts.cdb") ;
- }
+ if (!s6dns_init_options(flaghosts))
+ strerr_diefu1sys(111, "parse /etc/resolv.conf or /etc/hosts") ;
if (flaghosts)
{
diff --git a/src/include/s6-dns/s6dns.h b/src/include/s6-dns/s6dns.h
index de8c085..e19ae8d 100644
--- a/src/include/s6-dns/s6dns.h
+++ b/src/include/s6-dns/s6dns.h
@@ -3,6 +3,8 @@
#ifndef S6DNS_H
#define S6DNS_H
+#include <stdint.h>
+
#include <s6-dns/s6dns-constants.h>
#include <s6-dns/s6dns-ip46.h>
#include <s6-dns/s6dns-domain.h>
@@ -13,7 +15,8 @@
#include <s6-dns/s6dns-fmt.h>
#include <s6-dns/hosts.h>
-extern int s6dns_init (void) ;
+#define s6dns_init() s6dns_init_options(0)
+extern int s6dns_init_options (uint32_t) ;
extern void s6dns_finish (void) ;
#endif
diff --git a/src/libs6dns/s6dns_hosts_compile.c b/src/libs6dns/s6dns_hosts_compile.c
index b57ffd3..0d537d7 100644
--- a/src/libs6dns/s6dns_hosts_compile.c
+++ b/src/libs6dns/s6dns_hosts_compile.c
@@ -144,20 +144,20 @@ static void *byipv6_dtok (uint32_t d, void *aux)
static inline uint8_t cclass (char c)
{
- static uint8_t const ctable[128] = "09999999913111999999999999999999199299999999945977777777776999999888888888888888888888888889999898888888888888888888888888899999" ;
+ static uint8_t const ctable[128] = "0999999991311199999999999999999919929:999999945977777777776999999888888888888888888888888889999898888888888888888888888888899999" ;
return c & 0x80 ? 9 : ctable[(uint8_t)c] - '0' ;
}
static int s6dns_hosts_parse (buffer *b, hostdata *hd)
{
- static uint8_t const table[6][10] =
+ static uint8_t const table[6][11] =
{
- { 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x0b, 0x12, 0x12, 0x12, 0x0b },
- { 0x0a, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
- { 0x2a, 0x23, 0x0b, 0x20, 0x0b, 0x12, 0x12, 0x12, 0x12, 0x0b },
- { 0x0a, 0x03, 0x01, 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x14, 0x0b },
- { 0x4a, 0xc4, 0x0b, 0x40, 0x14, 0x14, 0x0b, 0x14, 0x14, 0x0b },
- { 0x0a, 0x05, 0x01, 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x14, 0x0b }
+ { 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x0b, 0x12, 0x12, 0x12, 0x0b, 0x0b },
+ { 0x0a, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
+ { 0x2a, 0x23, 0x0b, 0x20, 0x0b, 0x12, 0x12, 0x12, 0x12, 0x0b, 0x21 },
+ { 0x0a, 0x03, 0x01, 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x14, 0x0b, 0x0b },
+ { 0x4a, 0xc4, 0x0b, 0x40, 0x14, 0x14, 0x0b, 0x14, 0x14, 0x0b, 0x0b },
+ { 0x0a, 0x05, 0x01, 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x14, 0x0b, 0x0b }
} ;
node_ip *node = 0 ;
size_t mark = hd->storage.len ;
@@ -177,6 +177,12 @@ static int s6dns_hosts_parse (buffer *b, hostdata *hd)
{
char ip[16] ;
if (!stralloc_0(&hd->storage)) goto err ;
+ if (state == 0x01) /* ignore link-local addresses */
+ {
+ if (!ip6_scan(hd->storage.s + mark, ip)) goto errill ;
+ hd->storage.len = mark ;
+ continue ;
+ }
if (ip6_scan(hd->storage.s + mark, ip))
{
uint32_t d ;
@@ -203,7 +209,7 @@ static int s6dns_hosts_parse (buffer *b, hostdata *hd)
flags &= ~1 ;
node = GENSETDYN_P(node_ip, &hd->ipv4, d) ;
}
- else goto err ;
+ else goto errill ;
hd->storage.len = mark ;
flags &= ~2 ;
}
@@ -268,6 +274,8 @@ static int s6dns_hosts_parse (buffer *b, hostdata *hd)
if (state > 0x0a) return (errno = EILSEQ, 0) ;
return 1 ;
+ errill:
+ errno = EILSEQ ;
err:
hostdata_free(hd) ;
return 0 ;
diff --git a/src/libs6dns/s6dns_hosts_compile.txt b/src/libs6dns/s6dns_hosts_compile.txt
index aa71b93..cbcac26 100644
--- a/src/libs6dns/s6dns_hosts_compile.txt
+++ b/src/libs6dns/s6dns_hosts_compile.txt
@@ -1,25 +1,25 @@
-class | 0 1 2 3 4 5 6 7 8 9
-st\ev | \0 space # \n - . : 0-9 alpha other
+class | 0 1 2 3 4 5 6 7 8 9 a
+st\ev | \0 space # \n - . : 0-9 alpha other %
START | p p p
-00 | END START COMMENT START X X IP IP IP X
+00 | END START COMMENT START X X IP IP IP X X
COMMENT |
-01 | END COMMENT COMMENT START COMMENT COMMENT COMMENT COMMENT COMMENT COMMENT
+01 | END COMMENT COMMENT START COMMENT COMMENT COMMENT COMMENT COMMENT COMMENT COMMENT
-IP | s s s p p p p
-02 | END IPDONE X START X IP IP IP IP X
+IP | s s s p p p p s
+02 | END IPDONE X START X IP IP IP IP X COMMENT
IPDONE | p
-03 | END IPDONE COMMENT START X X X X NAME X
+03 | END IPDONE COMMENT START X X X X NAME X X
NAME | f fn f p p p p
-04 | END NAMES X START NAME NAME X NAME NAME X
+04 | END NAMES X START NAME NAME X NAME NAME X X
NAMES | p
-05 | END NAMES COMMENT START X X X X NAME X
+05 | END NAMES COMMENT START X X X X NAME X X
END = 0a
X = 0b
diff --git a/src/libs6dns/s6dns_init.c b/src/libs6dns/s6dns_init.c
index 10dcbf5..5c8a25c 100644
--- a/src/libs6dns/s6dns_init.c
+++ b/src/libs6dns/s6dns_init.c
@@ -4,10 +4,10 @@
#include <s6-dns/hosts.h>
#include <s6-dns/s6dns.h>
-int s6dns_init (void)
+int s6dns_init_options (uint32_t options)
{
if (!s6dns_rci_init(&s6dns_rci_here, "/etc/resolv.conf")) return 0 ;
- if (s6dns_hosts_init(&s6dns_hosts_here, "/etc/hosts", "/etc/hosts.cdb", "/tmp/hosts.cdb") == -1) goto err ;
+ if (options & 1 && s6dns_hosts_init(&s6dns_hosts_here, "/etc/hosts", "/etc/hosts.cdb", "/tmp/hosts.cdb") == -1) goto err ;
return 1 ;
err: