Skip to content

Commit

Permalink
expose if_nametoindex and if_indextoname for overriding
Browse files Browse the repository at this point in the history
  • Loading branch information
bradh352 committed Oct 8, 2024
1 parent fdc4916 commit 7b987c1
Show file tree
Hide file tree
Showing 12 changed files with 183 additions and 94 deletions.
29 changes: 28 additions & 1 deletion include/ares.h
Original file line number Diff line number Diff line change
Expand Up @@ -759,14 +759,39 @@ struct ares_socket_functions_ex {
* \param[in] flags ares_socket_bind_flags_t flags.
* \param[in] address Buffer containing address.
* \param[in] address_len Size of address buffer.
* \param[in] user_data Pointer provided to
* \param[in] user_data Pointer provided to
* ares_set_socket_functions_ex().
* \return 0 on success. -1 on error with an appropriate errno (or
* WSASetLastError()) set.
*/
int (*abind)(ares_socket_t sock, unsigned int flags,
const struct sockaddr *address, socklen_t address_len,
void *user_data);

/* Optional. Convert an interface name into the interface index. If this
* callback is not specified, then IPv6 Link-Local DNS servers cannot be used.
*
* \param[in] ifname Interface Name as NULL-terminated string.
* \param[in] user_data Pointer provided to
* ares_set_socket_functions_ex().
* \return 0 on failure, otherwise interface index.
*/
unsigned int (*aif_nametoindex)(const char *ifname, void *user_data);

/* Optional. Convert an interface index into the interface name. If this
* callback is not specified, then IPv6 Link-Local DNS servers cannot be used.
*
* \param[in] ifindex Interface index, must be > 0
* \param[in] ifname_buf Buffer to hold interface name. Must be at least
* IFNAMSIZ in length or 32 bytes if IFNAMSIZ isn't
* defined.
* \param[in] ifname_buf_len Size of ifname_buf for verification.
* \param[in] user_data Pointer provided to
* ares_set_socket_functions_ex().
* \return NULL on failure, otherwise pointer to provided ifname_buf
*/
const char *(*aif_indextoname)(unsigned int ifindex, char *ifname_buf,
size_t ifname_buf_len, void *user_data);
};

/*! Override the native socket functions for the OS with the provided set.
Expand All @@ -780,6 +805,8 @@ struct ares_socket_functions_ex {
* past the life of this call.
* \param[in] user_data User data thunk which will be passed to each call of
* the registered callbacks.
* \return ARES_SUCCESS on success, or another error code such as ARES_EFORMERR
* on misuse.
*/
CARES_EXTERN ares_status_t ares_set_socket_functions_ex(
ares_channel_t *channel, const struct ares_socket_functions_ex *funcs,
Expand Down
2 changes: 1 addition & 1 deletion src/lib/ares_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ static ares_status_t init_by_defaults(ares_channel_t *channel)
addr.family = AF_INET;
addr.addr.addr4.s_addr = htonl(INADDR_LOOPBACK);

rc = ares_sconfig_append(&sconfig, &addr, 0, 0, NULL);
rc = ares_sconfig_append(channel, &sconfig, &addr, 0, 0, NULL);
if (rc != ARES_SUCCESS) {
goto error; /* LCOV_EXCL_LINE: OutOfMemory */
}
Expand Down
22 changes: 12 additions & 10 deletions src/lib/ares_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -391,10 +391,12 @@ ares_status_t ares_init_by_environment(ares_sysconfig_t *sysconfig);
ares_status_t ares_init_sysconfig_files(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig);
#ifdef __APPLE__
ares_status_t ares_init_sysconfig_macos(ares_sysconfig_t *sysconfig);
ares_status_t ares_init_sysconfig_macos(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig);
#endif
#ifdef USE_WINSOCK
ares_status_t ares_init_sysconfig_windows(ares_sysconfig_t *sysconfig);
ares_status_t ares_init_sysconfig_windows(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig);
#endif

ares_status_t ares_parse_sortlist(struct apattern **sortlist, size_t *nsort,
Expand Down Expand Up @@ -452,14 +454,14 @@ ares_status_t ares_addrinfo_localhost(const char *name, unsigned short port,
ares_status_t ares_servers_update(ares_channel_t *channel,
ares_llist_t *server_list,
ares_bool_t user_specified);
ares_status_t ares_sconfig_append(ares_llist_t **sconfig,
const struct ares_addr *addr,
unsigned short udp_port,
unsigned short tcp_port,
const char *ll_iface);
ares_status_t ares_sconfig_append_fromstr(ares_llist_t **sconfig,
const char *str,
ares_bool_t ignore_invalid);
ares_status_t
ares_sconfig_append(const ares_channel_t *channel, ares_llist_t **sconfig,
const struct ares_addr *addr, unsigned short udp_port,
unsigned short tcp_port, const char *ll_iface);
ares_status_t ares_sconfig_append_fromstr(const ares_channel_t *channel,
ares_llist_t **sconfig,
const char *str,
ares_bool_t ignore_invalid);
ares_status_t ares_in_addr_to_sconfig_llist(const struct in_addr *servers,
size_t nservers,
ares_llist_t **llist);
Expand Down
23 changes: 21 additions & 2 deletions src/lib/ares_set_socket_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,21 @@ static int default_abind(ares_socket_t sock, unsigned int flags,
return bind(sock, address, address_len);
}

static unsigned int default_aif_nametoindex(const char *ifname, void *user_data)
{
(void)user_data;
return ares_os_if_nametoindex(ifname);
}

static const char *default_aif_indextoname(unsigned int ifindex,
char *ifname_buf,
size_t ifname_buf_len,
void *user_data)
{
(void)user_data;
return ares_os_if_indextoname(ifindex, ifname_buf, ifname_buf_len);
}

static const struct ares_socket_functions_ex default_socket_functions = {
1,
ARES_SOCKFUNC_FLAG_NONBLOCKING,
Expand All @@ -432,7 +447,9 @@ static const struct ares_socket_functions_ex default_socket_functions = {
default_arecvfrom,
default_asendto,
default_agetsockname,
default_abind
default_abind,
default_aif_nametoindex,
default_aif_indextoname
};

void ares_set_socket_functions_default(ares_channel_t *channel)
Expand Down Expand Up @@ -550,7 +567,9 @@ static const struct ares_socket_functions_ex legacy_socket_functions = {
legacycb_arecvfrom,
legacycb_asendto,
NULL, /* agetsockname */
NULL /* abind */
NULL, /* abind */
NULL, /* aif_nametoindex */
NULL /* aif_indextoname */
};

void ares_set_socket_functions(ares_channel_t *channel,
Expand Down
59 changes: 34 additions & 25 deletions src/lib/ares_sysconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@


#if defined(__MVS__)
static ares_status_t ares_init_sysconfig_mvs(ares_sysconfig_t *sysconfig)
static ares_status_t ares_init_sysconfig_mvs(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig)
{
struct __res_state *res = 0;
size_t count4;
Expand Down Expand Up @@ -98,9 +99,9 @@ static ares_status_t ares_init_sysconfig_mvs(ares_sysconfig_t *sysconfig)
addr.addr.addr4.s_addr = addr_in->sin_addr.s_addr;
addr.family = AF_INET;

status =
ares_sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port),
htons(addr_in->sin_port), NULL);
status = ares_sconfig_append(channel, &sysconfig->sconfig, &addr,
htons(addr_in->sin_port),
htons(addr_in->sin_port), NULL);

if (status != ARES_SUCCESS) {
return status;
Expand All @@ -115,9 +116,9 @@ static ares_status_t ares_init_sysconfig_mvs(ares_sysconfig_t *sysconfig)
memcpy(&(addr.addr.addr6), &(addr_in->sin6_addr),
sizeof(addr_in->sin6_addr));

status =
ares_sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port),
htons(addr_in->sin_port), NULL);
status = ares_sconfig_append(channel, &sysconfig->sconfig, &addr,
htons(addr_in->sin_port),
htons(addr_in->sin_port), NULL);

if (status != ARES_SUCCESS) {
return status;
Expand All @@ -129,7 +130,8 @@ static ares_status_t ares_init_sysconfig_mvs(ares_sysconfig_t *sysconfig)
#endif

#if defined(__riscos__)
static ares_status_t ares_init_sysconfig_riscos(ares_sysconfig_t *sysconfig)
static ares_status_t ares_init_sysconfig_riscos(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig)
{
char *line;
ares_status_t status = ARES_SUCCESS;
Expand All @@ -152,7 +154,8 @@ static ares_status_t ares_init_sysconfig_riscos(ares_sysconfig_t *sysconfig)
if (space) {
*space = '\0';
}
status = ares_sconfig_append_fromstr(&sysconfig->sconfig, pos, ARES_TRUE);
status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, pos,
ARES_TRUE);
if (status != ARES_SUCCESS) {
break;
}
Expand All @@ -167,7 +170,8 @@ static ares_status_t ares_init_sysconfig_riscos(ares_sysconfig_t *sysconfig)
#endif

#if defined(WATT32)
static ares_status_t ares_init_sysconfig_watt32(ares_sysconfig_t *sysconfig)
static ares_status_t ares_init_sysconfig_watt32(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig)
{
size_t i;
ares_status_t status;
Expand All @@ -180,7 +184,8 @@ static ares_status_t ares_init_sysconfig_watt32(ares_sysconfig_t *sysconfig)
addr.family = AF_INET;
addr.addr.addr4.s_addr = htonl(def_nameservers[i]);

status = ares_sconfig_append(&sysconfig->sconfig, &addr, 0, 0, NULL);
status =
ares_sconfig_append(channel, &sysconfig->sconfig, &addr, 0, 0, NULL);

if (status != ARES_SUCCESS) {
return status;
Expand All @@ -192,7 +197,8 @@ static ares_status_t ares_init_sysconfig_watt32(ares_sysconfig_t *sysconfig)
#endif

#if defined(ANDROID) || defined(__ANDROID__)
static ares_status_t ares_init_sysconfig_android(ares_sysconfig_t *sysconfig)
static ares_status_t ares_init_sysconfig_android(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig)
{
size_t i;
char **dns_servers;
Expand All @@ -209,8 +215,8 @@ static ares_status_t ares_init_sysconfig_android(ares_sysconfig_t *sysconfig)
dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers);
if (dns_servers != NULL) {
for (i = 0; i < num_servers; i++) {
status = ares_sconfig_append_fromstr(&sysconfig->sconfig, dns_servers[i],
ARES_TRUE);
status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig,
dns_servers[i], ARES_TRUE);
if (status != ARES_SUCCESS) {
return status;
}
Expand Down Expand Up @@ -241,8 +247,8 @@ static ares_status_t ares_init_sysconfig_android(ares_sysconfig_t *sysconfig)
if (__system_property_get(propname, propvalue) < 1) {
break;
}
status =
ares_sconfig_append_fromstr(&sysconfig->sconfig, propvalue, ARES_TRUE);
status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig,
propvalue, ARES_TRUE);
if (status != ARES_SUCCESS) {
return status;
}
Expand All @@ -255,7 +261,9 @@ static ares_status_t ares_init_sysconfig_android(ares_sysconfig_t *sysconfig)
#endif

#if defined(CARES_USE_LIBRESOLV)
static ares_status_t ares_init_sysconfig_libresolv(ares_sysconfig_t *sysconfig)
static ares_status_t
ares_init_sysconfig_libresolv(const ares_channel_t *channel,
ares_sysconfig_t *sysconfig)
{
struct __res_state res;
ares_status_t status = ARES_SUCCESS;
Expand Down Expand Up @@ -343,7 +351,8 @@ static ares_status_t ares_init_sysconfig_libresolv(ares_sysconfig_t *sysconfig)
goto done;
}

status = ares_sconfig_append_fromstr(&sysconfig->sconfig, ipstr, ARES_TRUE);
status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, ipstr,
ARES_TRUE);

ares_free(ipstr);
if (status != ARES_SUCCESS) {
Expand Down Expand Up @@ -494,19 +503,19 @@ ares_status_t ares_init_by_sysconfig(ares_channel_t *channel)
sysconfig.ndots = 1; /* Default value if not otherwise set */

#if defined(USE_WINSOCK)
status = ares_init_sysconfig_windows(&sysconfig);
status = ares_init_sysconfig_windows(channel, &sysconfig);
#elif defined(__MVS__)
status = ares_init_sysconfig_mvs(&sysconfig);
status = ares_init_sysconfig_mvs(channel, &sysconfig);
#elif defined(__riscos__)
status = ares_init_sysconfig_riscos(&sysconfig);
status = ares_init_sysconfig_riscos(channel, &sysconfig);
#elif defined(WATT32)
status = ares_init_sysconfig_watt32(&sysconfig);
status = ares_init_sysconfig_watt32(channel, &sysconfig);
#elif defined(ANDROID) || defined(__ANDROID__)
status = ares_init_sysconfig_android(&sysconfig);
status = ares_init_sysconfig_android(channel, &sysconfig);
#elif defined(__APPLE__)
status = ares_init_sysconfig_macos(&sysconfig);
status = ares_init_sysconfig_macos(channel, &sysconfig);
#elif defined(CARES_USE_LIBRESOLV)
status = ares_init_sysconfig_libresolv(&sysconfig);
status = ares_init_sysconfig_libresolv(channel, &sysconfig);
#else
status = ares_init_sysconfig_files(channel, &sysconfig);
#endif
Expand Down
Loading

0 comments on commit 7b987c1

Please sign in to comment.