diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2023-07-06 11:00:58 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2023-07-06 11:00:58 +0000 |
| commit | cfe4051aaffd4ff5e7a1b55b023840042896dbd6 (patch) | |
| tree | 254e4ba0b8d5e1fd2286ad562518f65aba5df07e /src/libs6dns/s6dns_hosts_ip_string.c | |
| parent | ad7f496c36025a4177e061bbf7d1205d38685316 (diff) | |
| download | s6-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.c | 36 |
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) ; +} |
