From 504877d15de6fffb18b6f0f286e6cda83fdd01b2 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 26 May 2014 14:48:10 +0100 Subject: [PATCH] WIP before no debug log --- src/addrfam.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/adns.h | 18 +++++++++++ src/general.c | 3 +- 3 files changed, 117 insertions(+), 1 deletion(-) diff --git a/src/addrfam.c b/src/addrfam.c index af14e67..3ae14c4 100644 --- a/src/addrfam.c +++ b/src/addrfam.c @@ -198,6 +198,103 @@ const void *adns__sockaddr_to_inaddr(const struct sockaddr *sa) } /* + * addr2text and text2addr + */ + +int adns__addr2text(adns_state ads /* 0 ok */, adns_query qu /* 0 ok */, + const struct sockaddr *sa, + char *addr_buffer, int *addr_buflen, + int *port_r) { + void *src; + int port; + + if (*addr_buflen < ADNS_ADDR2TEXT_BUFLEN) { + *addr_buflen = ADNS_ADDR2TEXT_BUFLEN; + return ENOSPC; + } + + switch (sa->sa_family) { + AF_CASES(af); + af_inet: src= &CSIN(sa)->sin_addr; port= SIN(sa)->sin_port; break; + af_inet6: src= &CSIN6(sa)->sin6_addr; port= SIN6(sa)->sin6_port; break; + default: return EAFNOSUPPORT; + } + + const char *ok= inet_ntop(sa->sa_family, src, addr_buffer, *addr_buflen); + assert(ok); + + if (sa->sa_family == AF_INET6) { + uint32_t scope = CSIN6(sa)->sin6_scope_id; + if (scope) { + scope = ntohl(scope); + int scopeoffset = strlen(addr_buffer); + int remain = *addr_buflen - scopeoffset, + int r = snprintf(addr_buffer + scopeoffset, remain, + "%%%"PRIu32"", scope); + assert(r < *addr_buflen - scopeoffset); + adns__debug(ads,-1,qu, "addr2text: converted scoped address %s", + addr_buffer); + } + } + + if (port_r) *port_r= ntohs(port); + return 0; +} + +int adns_addr2text(adns_state ads, + const struct sockaddr *sa, + char *addr_buffer, int *addr_buflen /* set iff ENOSPC */, + int *port_r) { + return adns__addr2text(ads,0, sa,addr_buffer,addr_buflen,port_r); +} + +static void text2addr_einval(adns_state ads, adns_query qu, + const char *addr, const char *problem) { + if (!ads) + char dumpbuf[ADNS_ADDR2TEXT_BUFLEN * 4]; + +} + +int adns__text2addr(adns_state ads /* 0 ok */, adns_query qu /* 0 ok */, + const char *addr, uint16_t port, struct sockaddr *sa, + socklen_t *salen /* set if OK or ENOSPC */) { + int af; + char copybuf[INET6_ADDRSTRLEN]; + char *parse; + + if (strchr(addr, ":")) { + + af= AF_INET6; + + const char *percent= strchr(addr, "%"); + if (percent) { + ptrdiff_t lhslen = percent - addr; + if (lhslen >= INET6_ADDRSTRLEN) { + adns__debug(ads,-1,qu, "text2addr: scoped addr lhs too long + return EINVAL; + } + memcpy(copy + +int adns_text2addr(adns_state ads /* may be 0! used for debug log only */, + const char *addr, int port, struct sockaddr *sa, + socklen_t *salen /* set if OK or ENOSPC */); + + + + assert(*addr_buflen > INET_ADDRSTRLEN && *addr_buflen > INET6_ADDRSTRLEN); + switch (sa->sa_family) { + AF_CASES(af); + af_inet: dst= &CSIN(sa)->sin_addr; port= CSIN(sa)->sin_port; break; + af_inet6: dst= &CSIN6(sa)->sin6_addr; port= CSIN6(sa)->sin6_port; break; + default: return EAFNOSUPPORT; + } + + inet_pton(sa->sa_family, + const struct sockaddr *sin = + + + +/* * Reverse-domain parsing and construction. */ diff --git a/src/adns.h b/src/adns.h index e5063b7..63a46e8 100644 --- a/src/adns.h +++ b/src/adns.h @@ -682,6 +682,24 @@ void adns_finish(adns_state ads); * they will be cancelled. */ +#define ADNS_ADDR2TEXT_BUFLEN (INET6_ADDRSTRLEN +1/*%*/ +9/*uint32*/ +1/*nul*/) + +int adns_addr2text(adns_state ads /* may be 0! used for debug log only */, + const struct sockaddr *sa, socklen_t salen, + char *addr_buffer, int *addr_buflen /* set iff ENOSPC */, + int *port_r); +int adns_text2addr(adns_state ads /* may be 0! used for debug log only */, + const char *addr, int port, struct sockaddr *sa, + socklen_t *salen /* set if OK or ENOSPC */); + /* These DO NOT return an adns_status. Instead, 0 on success, + * or an errno value on failure. Error values are: + * EAFNOSUPPORT addr2text only + * EINVAL addr has invalid syntax + * ENOSPC only if *buflen < _BUFLEN or *salen < sizeof(adns_sockaddr) + * ENXIO addr specifies a scope name and if_nametoindex failed + * port is always in host byte order and is simply copied to and + * from the appropriate sockaddr field (byteswapped as necessary). + */ void adns_forallqueries_begin(adns_state ads); adns_query adns_forallqueries_next(adns_state ads, void **context_r); diff --git a/src/general.c b/src/general.c index 7703254..92da47d 100644 --- a/src/general.c +++ b/src/general.c @@ -64,7 +64,8 @@ void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent, const char *bef, *aft; vbuf vb; - if (!ads->logfn || + if (!ads || + !ads->logfn || (!(ads->iflags & adns_if_debug) && (!prevent || (ads->iflags & prevent)))) return; -- 2.11.0