/** Update nameserver representation with current name/address pair. */ static void update_nsrep(struct kr_nsrep *ns, size_t pos, uint8_t *addr, size_t addr_len) { if (addr == NULL) { ns->addr[pos].ip.sa_family = AF_UNSPEC; return; } /* Rotate previous addresses to the right. */ memmove(ns->addr + pos + 1, ns->addr + pos, (KR_NSREP_MAXADDR - pos - 1) * sizeof(ns->addr[0])); switch(addr_len) { case sizeof(struct in_addr): ADDR_SET(ns->addr[pos].ip4.sin, AF_INET, addr, addr_len); break; case sizeof(struct in6_addr): ADDR_SET(ns->addr[pos].ip6.sin6, AF_INET6, addr, addr_len); break; default: assert(0); break; } }
/** Update nameserver representation with current name/address pair. */ static void update_nsrep(struct kr_nsrep *ns, const knot_dname_t *name, uint8_t *addr, unsigned score) { ns->name = name; ns->score = score; if (addr == NULL) { ns->addr.ip.sa_family = AF_UNSPEC; return; } size_t len = pack_obj_len(addr); void *addr_val = pack_obj_val(addr); switch(len) { case sizeof(struct in_addr): ADDR_SET(ns->addr.ip4.sin, AF_INET, addr_val, len); break; case sizeof(struct in6_addr): ADDR_SET(ns->addr.ip6.sin6, AF_INET6, addr_val, len); break; default: assert(0); break; } }