void ni_server_trace_interface_nduseropt_events(ni_netdev_t *dev, ni_event_t event) { ni_ipv6_devinfo_t *ipv6 = dev->ipv6; if (!ni_debug_guard(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS)) return; switch (event) { case NI_EVENT_RDNSS_UPDATE: if (ipv6 && ipv6->radv.rdnss) { ni_ipv6_ra_rdnss_t *rdnss; char buf[32] = {'\0'}; const char *rainfo; rainfo = ipv6->radv.managed_addr ? "managed" : ipv6->radv.other_config ? "config" : "unmanaged"; for (rdnss = ipv6->radv.rdnss; rdnss; rdnss = rdnss->next) { ni_stringbuf_t lft = NI_STRINGBUF_INIT_BUFFER(buf); ni_trace("%s: update IPv6 RA<%s> RDNSS<%s>[%s]", dev->name, rainfo, ni_sockaddr_print(&rdnss->server), ni_lifetime_print_valid(&lft, rdnss->lifetime)); ni_stringbuf_destroy(&lft); } } break; case NI_EVENT_DNSSL_UPDATE: if (ipv6 && ipv6->radv.dnssl) { ni_ipv6_ra_dnssl_t *dnssl; char buf[32] = {'\0'}; const char *rainfo; rainfo = ipv6->radv.managed_addr ? "managed" : ipv6->radv.other_config ? "config" : "unmanaged"; for (dnssl = ipv6->radv.dnssl; dnssl; dnssl = dnssl->next) { ni_stringbuf_t lft = NI_STRINGBUF_INIT_BUFFER(buf); ni_trace("%s: update IPv6 RA<%s> DNSSL<%s>[%s]", dev->name, rainfo, dnssl->domain, ni_lifetime_print_valid(&lft, dnssl->lifetime)); ni_stringbuf_destroy(&lft); } } break; default: ni_debug_verbose(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS, "%s: IPv6 RA %s event: ", dev->name, ni_event_type_to_name(event)); break; } }
void ni_server_trace_interface_prefix_events(ni_netdev_t *dev, ni_event_t event, const ni_ipv6_ra_pinfo_t *pi) { char vbuf[32] = {'\0'}, pbuf[32] = {'\0'}; ni_stringbuf_t vlft = NI_STRINGBUF_INIT_BUFFER(vbuf); ni_stringbuf_t plft = NI_STRINGBUF_INIT_BUFFER(pbuf); ni_debug_verbose(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS, "%s: %s IPv6 RA<%s> Prefix<%s/%u %s,%s>[%s,%s]", dev->name, (event == NI_EVENT_PREFIX_UPDATE ? "update" : "delete"), (dev->ipv6 && dev->ipv6->radv.managed_addr ? "managed" : (dev->ipv6 && dev->ipv6->radv.other_config ? "config" : "unmanaged")), ni_sockaddr_print(&pi->prefix), pi->length, (pi->on_link ? "onlink" : "not-onlink"), (pi->autoconf ? "autoconf" : "no-autoconf"), ni_lifetime_print_valid(&vlft, pi->valid_lft), ni_lifetime_print_preferred(&plft, pi->preferred_lft)); ni_stringbuf_destroy(&vlft); ni_stringbuf_destroy(&plft); }
/* * Expand an XML entity. * For now, we support &<number>; as well as symbolic entities * lt gt amp */ ni_bool_t xml_expand_entity(xml_reader_t *xr, ni_stringbuf_t *res) { char temp[128]; ni_stringbuf_t entity = NI_STRINGBUF_INIT_BUFFER(temp); int cc, expanded; while ((cc = xml_getc(xr)) != ';') { if (cc == EOF) { xml_parse_error(xr, "Unexpenced EOF in entity"); return FALSE; } if (isspace(cc)) continue; if (entity.len + sizeof(char) >= entity.size) { xml_parse_error(xr, "Entity is too long"); return FALSE; } ni_stringbuf_putc(&entity, cc); } if (ni_string_empty(entity.string)) { xml_parse_error(xr, "Empty entity &;"); return FALSE; } if (!strcasecmp(entity.string, "lt")) expanded = '<'; else if (!strcasecmp(entity.string, "gt")) expanded = '>'; else if (!strcasecmp(entity.string, "amp")) expanded = '&'; else { const char *es = entity.string; if (*es == '#') { expanded = strtoul(es + 1, (char **) &es, 0); if (*es == '\0') goto good; } xml_parse_error(xr, "Cannot expand unknown entity &%s;", entity.string); return FALSE; } good: ni_stringbuf_putc(res, expanded); return TRUE; }