aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6dns/s6dns_hosts_ip_string.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-07-06 11:00:58 +0000
committerLaurent Bercot <ska@appnovation.com>2023-07-06 11:00:58 +0000
commitcfe4051aaffd4ff5e7a1b55b023840042896dbd6 (patch)
tree254e4ba0b8d5e1fd2286ad562518f65aba5df07e /src/libs6dns/s6dns_hosts_ip_string.c
parentad7f496c36025a4177e061bbf7d1205d38685316 (diff)
downloads6-dns-cfe4051aaffd4ff5e7a1b55b023840042896dbd6.tar.gz
Add s6dns_hosts reading functions
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libs6dns/s6dns_hosts_ip_string.c')
-rw-r--r--src/libs6dns/s6dns_hosts_ip_string.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/libs6dns/s6dns_hosts_ip_string.c b/src/libs6dns/s6dns_hosts_ip_string.c
new file mode 100644
index 0000000..430f7d3
--- /dev/null
+++ b/src/libs6dns/s6dns_hosts_ip_string.c
@@ -0,0 +1,36 @@
+/* ISC license. */
+
+#include <errno.h>
+#include <string.h>
+
+#include <skalibs/cdb.h>
+#include <skalibs/stralloc.h>
+
+#include <s6-dns/s6dns-domain.h>
+#include <s6-dns/hosts.h>
+
+#include <skalibs/posixishard.h>
+
+extern int s6dns_hosts_ip_string_r (cdb const *c, char const *name, stralloc *sa, unsigned int flags)
+{
+ s6dns_domain_t d ;
+ int r ;
+ cdb_data data ;
+ if (!c->map) return 0 ;
+ if (!s6dns_domain_fromstring(&d, name, strlen(name))
+ || !s6dns_domain_noqualify(&d)) return -1 ;
+
+ {
+ char tmp[3 + d.len] ;
+ tmp[0] = flags & 2 ? 'u' : 'a' ;
+ tmp[1] = flags & 1 ? '6' : '4' ;
+ tmp[2] = ':' ;
+ memcpy(tmp + 3, d.s, d.len) ;
+ r = cdb_find(c, &data, tmp, 3 + d.len) ;
+ }
+ if (r <= 0) return r ;
+ if (!data.len) return 0 ;
+ if (data.len & (flags & 1 ? 15 : 3)) return (errno = EPROTO, -1) ;
+ if (!stralloc_catb(sa, data.s, data.len)) return -1 ;
+ return data.len >> (flags & 1 ? 4 : 2) ;
+}