mirror of
https://frontier.innolan.net/rainlance/c-ares.git
synced 2025-10-05 15:09:47 +00:00
api: Add entrypoints to allow use of per-server ports
Add user-visible entrypoints ares_{get,set}_servers_ports(3), which take struct ares_addr_port_node rather than struct ares_addr_node. This structure includes a UDP and TCP port number; if this is set to zero, the channel-wide port values are used as before. Similarly, add a new ares_set_servers_ports_csv(3) entrypoint, which is analogous to ares_set_servers(3) except it doesn't ignore any specified port information; instead, any per-server specified port is used as both the UDP and TCP port for that server. The internal struct ares_addr is extended to hold the UDP/TCP ports, stored in network order, with the convention that a value of zero indicates that the channel-wide UDP/TCP port should be used. For the internal implementation of ares_dup(3), shift to use the _ports() version of the get/set functions, so port information is transferred correctly to the new channel. Update manpages, and add missing ares_set_servers_csv to the lists while we're at it
This commit is contained in:
@ -978,7 +978,11 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
||||
salen = sizeof(saddr.sa4);
|
||||
memset(sa, 0, salen);
|
||||
saddr.sa4.sin_family = AF_INET;
|
||||
saddr.sa4.sin_port = aresx_sitous(channel->tcp_port);
|
||||
if (server->addr.tcp_port) {
|
||||
saddr.sa4.sin_port = aresx_sitous(server->addr.tcp_port);
|
||||
} else {
|
||||
saddr.sa4.sin_port = aresx_sitous(channel->tcp_port);
|
||||
}
|
||||
memcpy(&saddr.sa4.sin_addr, &server->addr.addrV4,
|
||||
sizeof(server->addr.addrV4));
|
||||
break;
|
||||
@ -987,7 +991,11 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
||||
salen = sizeof(saddr.sa6);
|
||||
memset(sa, 0, salen);
|
||||
saddr.sa6.sin6_family = AF_INET6;
|
||||
saddr.sa6.sin6_port = aresx_sitous(channel->tcp_port);
|
||||
if (server->addr.tcp_port) {
|
||||
saddr.sa6.sin6_port = aresx_sitous(server->addr.tcp_port);
|
||||
} else {
|
||||
saddr.sa6.sin6_port = aresx_sitous(channel->tcp_port);
|
||||
}
|
||||
memcpy(&saddr.sa6.sin6_addr, &server->addr.addrV6,
|
||||
sizeof(server->addr.addrV6));
|
||||
break;
|
||||
@ -1070,7 +1078,11 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
||||
salen = sizeof(saddr.sa4);
|
||||
memset(sa, 0, salen);
|
||||
saddr.sa4.sin_family = AF_INET;
|
||||
saddr.sa4.sin_port = aresx_sitous(channel->udp_port);
|
||||
if (server->addr.udp_port) {
|
||||
saddr.sa4.sin_port = aresx_sitous(server->addr.udp_port);
|
||||
} else {
|
||||
saddr.sa4.sin_port = aresx_sitous(channel->udp_port);
|
||||
}
|
||||
memcpy(&saddr.sa4.sin_addr, &server->addr.addrV4,
|
||||
sizeof(server->addr.addrV4));
|
||||
break;
|
||||
@ -1079,7 +1091,11 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
||||
salen = sizeof(saddr.sa6);
|
||||
memset(sa, 0, salen);
|
||||
saddr.sa6.sin6_family = AF_INET6;
|
||||
saddr.sa6.sin6_port = aresx_sitous(channel->udp_port);
|
||||
if (server->addr.udp_port) {
|
||||
saddr.sa6.sin6_port = aresx_sitous(server->addr.udp_port);
|
||||
} else {
|
||||
saddr.sa6.sin6_port = aresx_sitous(channel->udp_port);
|
||||
}
|
||||
memcpy(&saddr.sa6.sin6_addr, &server->addr.addrV6,
|
||||
sizeof(server->addr.addrV6));
|
||||
break;
|
||||
|
Reference in New Issue
Block a user