Пример #1
0
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;
}
Пример #2
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;
}