diff options
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) ; +} |
