/* int * res_isourserver(ina) * looks up "ina" in _res.ns_addr_list[] * returns: * 0 : not found * >0 : found * author: * paul vixie, 29may94 */ int res_ourserver_p(const res_state statp, const struct sockaddr_in6 *inp) { int ns; if (inp->sin6_family == AF_INET) { struct sockaddr_in *in4p = (struct sockaddr_in *) inp; in_port_t port = in4p->sin_port; in_addr_t addr = in4p->sin_addr.s_addr; for (ns = 0; ns < statp->nscount; ns++) { const struct sockaddr_in *srv = (struct sockaddr_in *) get_nsaddr (statp, ns); if ((srv->sin_family == AF_INET) && (srv->sin_port == port) && (srv->sin_addr.s_addr == INADDR_ANY || srv->sin_addr.s_addr == addr)) return (1); } } else if (inp->sin6_family == AF_INET6) { for (ns = 0; ns < statp->nscount; ns++) { const struct sockaddr_in6 *srv = (struct sockaddr_in6 *) get_nsaddr (statp, ns); if ((srv->sin6_family == AF_INET6) && (srv->sin6_port == inp->sin6_port) && !(memcmp(&srv->sin6_addr, &in6addr_any, sizeof (struct in6_addr)) && memcmp(&srv->sin6_addr, &inp->sin6_addr, sizeof (struct in6_addr)))) return (1); } } return (0); }
/* int * res_isourserver(ina) * looks up "ina" in _resp->ns_addr_list[] * returns: * 0 : not found * >0 : found * author: * paul vixie, 29may94 */ int res_isourserver(const struct sockaddr_in *inp) { struct __res_state *_resp = _THREAD_PRIVATE(_res, _res, &_res); #ifdef INET6 const struct sockaddr_in6 *in6p = (const struct sockaddr_in6 *)inp; const struct sockaddr_in6 *srv6; #endif const struct sockaddr_in *srv; int ns, ret; ret = 0; switch (inp->sin_family) { #ifdef INET6 case AF_INET6: for (ns = 0; ns < _resp->nscount; ns++) { srv6 = (struct sockaddr_in6 *)get_nsaddr(ns); if (srv6->sin6_family == in6p->sin6_family && srv6->sin6_port == in6p->sin6_port && srv6->sin6_scope_id == in6p->sin6_scope_id && (IN6_IS_ADDR_UNSPECIFIED(&srv6->sin6_addr) || IN6_ARE_ADDR_EQUAL(&srv6->sin6_addr, &in6p->sin6_addr))) { ret++; break; } } break; #endif case AF_INET: for (ns = 0; ns < _resp->nscount; ns++) { srv = (struct sockaddr_in *)get_nsaddr(ns); if (srv->sin_family == inp->sin_family && srv->sin_port == inp->sin_port && (srv->sin_addr.s_addr == INADDR_ANY || srv->sin_addr.s_addr == inp->sin_addr.s_addr)) { ret++; break; } } break; } return (ret); }
/*% * looks up "ina" in _res.ns_addr_list[] * * returns: *\li 0 : not found *\li >0 : found * * author: *\li paul vixie, 29may94 */ int res_ourserver_p(const res_state statp, const struct sockaddr *sa) { const struct sockaddr_in *inp, *srv; const struct sockaddr_in6 *in6p, *srv6; int ns; switch (sa->sa_family) { case AF_INET: inp = (const struct sockaddr_in *)(const void *)sa; for (ns = 0; ns < statp->nscount; ns++) { srv = (struct sockaddr_in *)(void *)get_nsaddr(statp, (size_t)ns); if (srv->sin_family == inp->sin_family && srv->sin_port == inp->sin_port && (srv->sin_addr.s_addr == INADDR_ANY || srv->sin_addr.s_addr == inp->sin_addr.s_addr)) return (1); } break; case AF_INET6: if (EXT(statp).ext == NULL) break; in6p = (const struct sockaddr_in6 *)(const void *)sa; for (ns = 0; ns < statp->nscount; ns++) { srv6 = (struct sockaddr_in6 *)(void *)get_nsaddr(statp, (size_t)ns); if (srv6->sin6_family == in6p->sin6_family && srv6->sin6_port == in6p->sin6_port && #ifdef HAVE_SIN6_SCOPE_ID (srv6->sin6_scope_id == 0 || srv6->sin6_scope_id == in6p->sin6_scope_id) && #endif (IN6_IS_ADDR_UNSPECIFIED(&srv6->sin6_addr) || IN6_ARE_ADDR_EQUAL(&srv6->sin6_addr, &in6p->sin6_addr))) return (1); } break; default: break; } return (0); }