int nr_stun_transport_addr_check(nr_transport_addr* addr, UINT4 check) { if((check & NR_STUN_TRANSPORT_ADDR_CHECK_WILDCARD) && nr_transport_addr_is_wildcard(addr)) return(R_BAD_DATA); if ((check & NR_STUN_TRANSPORT_ADDR_CHECK_LOOPBACK) && nr_transport_addr_is_loopback(addr)) return(R_BAD_DATA); return(0); }
int nr_stun_remove_duplicate_addrs(nr_local_addr addrs[], int remove_loopback, int remove_link_local, int *count) { int r, _status; nr_local_addr *tmp = 0; int i; int n; tmp = RMALLOC(*count * sizeof(*tmp)); if (!tmp) ABORT(R_NO_MEMORY); n = 0; for (i = 0; i < *count; ++i) { if (nr_stun_is_duplicate_addr(tmp, n, &addrs[i])) { /* skip addrs[i], it's a duplicate */ } else if (remove_loopback && nr_transport_addr_is_loopback(&addrs[i].addr)) { /* skip addrs[i], it's a loopback */ } else if (remove_link_local && addrs[i].addr.ip_version == NR_IPV6 && nr_transport_addr_is_link_local(&addrs[i].addr)) { /* skip addrs[i], it's a link-local address */ } else { /* otherwise, copy it to the temporary array */ if ((r=nr_local_addr_copy(&tmp[n], &addrs[i]))) ABORT(r); ++n; } } *count = n; memset(addrs, 0, *count * sizeof(*addrs)); /* copy temporary array into passed in/out array */ for (i = 0; i < *count; ++i) { if ((r=nr_local_addr_copy(&addrs[i], &tmp[i]))) ABORT(r); } _status = 0; abort: RFREE(tmp); return _status; }