summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2014-10-13 13:50:47 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2014-10-19 21:16:24 +0100
commit9e04ed8374746d9b069ecff9ecad499e5f10b9c4 (patch)
tree10db18b353f93be5d2280d6f917b06a0b9596100 /src
parent79d4d86add26e3ed27828e1ed4e069b6109607ed (diff)
src/types.c: Rewrite pap_addr (style)
Completely rework this function to make it much clearer. Also rename many of the surviving variables. No functional change. The following rune was helpful to me when preparing this patch: diff -bu <(git-show HEAD:src/types.c | perl -pe 's/\bstoreto\b/out/g; s/\bmax\b/cbyte_max/g; s/\boaddr\b/use_addr/; s/\bsalen\b/out_salen/g; s/\bstep\b/in_addrlen/g; s/\baf\b/out_af/g; s/\brrsz\b/out_rrsz/g; s/\brrty\b/in_rrty/g') src/types.c |less +/pap_addr Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Diffstat (limited to 'src')
-rw-r--r--src/types.c76
1 files changed, 36 insertions, 40 deletions
diff --git a/src/types.c b/src/types.c
index aa34c0a..ab97801 100644
--- a/src/types.c
+++ b/src/types.c
@@ -400,50 +400,46 @@ static unsigned addr_rrtypeflag(adns_rrtype type) {
* adns__qf_addr_cname set so that we know that we're in the fixup state.
*/
-static adns_status pap_addr(const parseinfo *pai, int rrty, size_t rrsz,
- int *cbyte_io, int max, adns_rr_addr *storeto) {
- const byte *dgram= pai->dgram;
- int af, addrlen, salen;
+static adns_status pap_addr(const parseinfo *pai, int in_rrty, size_t out_rrsz,
+ int *cbyte_io, int cbyte_max, adns_rr_addr *out) {
+ int in_addrlen;
+ int out_af, out_salen;
struct in6_addr v6map;
- const void *oaddr= dgram + *cbyte_io;
- int avail= max - *cbyte_io;
- int step= -1;
- void *addrp= 0;
-
- switch (rrty) {
- case adns_r_a:
- if ((pai->qu->flags & adns_qf_ipv6_mapv4) &&
- (pai->qu->answer->type & adns__qtf_bigaddr)) {
- if (avail < 4) return adns_s_invaliddata;
- memset(v6map.s6_addr + 0, 0x00, 10);
- memset(v6map.s6_addr + 10, 0xff, 2);
- memcpy(v6map.s6_addr + 12, oaddr, 4);
- oaddr= v6map.s6_addr; avail= sizeof(v6map.s6_addr);
- if (step < 0) step= 4;
- goto aaaa;
- }
- af= AF_INET; addrlen= 4;
- addrp= &storeto->addr.inet.sin_addr;
- salen= sizeof(storeto->addr.inet);
- break;
- case adns_r_aaaa:
- aaaa:
- af= AF_INET6; addrlen= 16;
- addrp= storeto->addr.inet6.sin6_addr.s6_addr;
- salen= sizeof(storeto->addr.inet6);
- break;
+
+ const void *use_addr= pai->dgram + *cbyte_io;
+
+ switch (in_rrty) {
+ case adns_r_a: in_addrlen= 4; out_af= AF_INET; break;
+ case adns_r_aaaa: in_addrlen= 16; out_af= AF_INET6; break;
+ default: abort();
}
- assert(addrp);
- assert(offsetof(adns_rr_addr, addr) + salen <= rrsz);
- if (addrlen < avail) return adns_s_invaliddata;
- if (step < 0) step= addrlen;
- *cbyte_io += step;
- memset(&storeto->addr, 0, salen);
- storeto->len= salen;
- storeto->addr.sa.sa_family= af;
- memcpy(addrp, oaddr, addrlen);
+ if ((*cbyte_io + in_addrlen) != cbyte_max) return adns_s_invaliddata;
+
+ if (out_af==AF_INET &&
+ (pai->qu->flags & adns_qf_ipv6_mapv4) &&
+ (pai->qu->answer->type & adns__qtf_bigaddr)) {
+ memset(v6map.s6_addr + 0, 0x00, 10);
+ memset(v6map.s6_addr + 10, 0xff, 2);
+ memcpy(v6map.s6_addr + 12, use_addr, 4);
+ use_addr= v6map.s6_addr;
+ out_af= AF_INET6;
+ }
+
+ switch (out_af) {
+ case AF_INET: out_salen= sizeof(out->addr.inet); break;
+ case AF_INET6: out_salen= sizeof(out->addr.inet6); break;
+ default: abort();
+ }
+
+ assert(offsetof(adns_rr_addr, addr) + out_salen <= out_rrsz);
+
+ memset(&out->addr, 0, out_salen);
+ out->len= out_salen;
+ out->addr.sa.sa_family= out_af;
+ adns__addr_inject(use_addr, &out->addr);
+ *cbyte_io += in_addrlen;
return adns_s_ok;
}