int dns_a4ptodn(const struct in_addr *addr, const char *tname, dnsc_t *dn, unsigned dnsiz) { dnsc_t *p; int r; if (!tname) return dns_a4todn(addr, NULL, dn, dnsiz); p = dns_a4todn_(addr, dn, dn + dnsiz); if (!p) return 0; r = dns_sptodn(tname, p, dnsiz - (p - dn)); return r != 0 ? r : dnsiz >= DNS_MAXDN ? -1 : 0; }
static int dns_interpolate_inaddr_arpa(char *buff, int len, const char *key, const char *ip) { const char *b, *e; char *o; unsigned char dn[DNS_MAXDN]; int il; struct { struct in_addr addr; struct in6_addr addr6; } a; /* This function takes a dot delimited string as input and * reverses the parts split on dot. */ (void)key; if (dns_pton(AF_INET, ip, &a.addr) > 0) { dns_a4todn(&a.addr, 0, dn, sizeof(dn)); dns_dntop(dn,buff,len); return strlen(buff); } else if (dns_pton(AF_INET6, ip, &a.addr6) > 0) { dns_a6todn(&a.addr6, 0, dn, sizeof(dn)); dns_dntop(dn,buff,len); return strlen(buff); } o = buff; il = strlen(ip); if(len <= il) { /* not enough room for ip and '\0' */ if(len > 0) buff[0] = '\0'; return 0; } e = ip + il; b = e - 1; while(b >= ip) { const char *term; while(b >= ip && *b != '.') b--; /* Rewind to previous part */ term = b + 1; /* term is one ahead, we went past it */ if(term != e) memcpy(o, term, e - term); /* no sense in copying nothing */ o += e - term; /* advance the term length */ e = b; b = e - 1; if(e >= ip) *o++ = '.'; /* we must be at . */ } *o = '\0'; assert((o - buff) == il); return o - buff; }