Line data Source code
1 : #include "fd_shred_dest_resolver.h" 2 : 3 : #include "../../util/net/fd_ip4.h" 4 : 5 : #include <string.h> 6 : 7 : void 8 : fd_shred_resolve_additional_destinations( char const endpoints[][ FD_HOSTPORT_BUF_MAX ], 9 : ulong endpoint_cnt, 10 : char const * config_key, 11 0 : fd_shred_dest_weighted_t * out ) { 12 0 : FD_TEST( endpoint_cnt<=FD_DNS_RESOLVE_PEERS_MAX ); 13 : 14 0 : char dns_peers[ FD_DNS_RESOLVE_PEERS_MAX ][ FD_HOSTPORT_BUF_MAX ]; 15 0 : uchar dns_idx [ FD_DNS_RESOLVE_PEERS_MAX ]; 16 0 : ulong dns_cnt = 0UL; 17 0 : for( ulong i=0UL; i<endpoint_cnt; i++ ) { 18 0 : char const * endpoint = endpoints[ i ]; 19 0 : char const * colon = strchr( endpoint, ':' ); 20 0 : if( FD_UNLIKELY( !colon || colon[ 1UL+strspn( colon+1, "0123456789" ) ] ) ) { 21 0 : FD_LOG_ERR(( "invalid [%s] entry \"%s\": expected host:port", config_key, endpoint )); 22 0 : } 23 : 24 0 : char hostname[ FD_FQDN_BUF_MAX ]; 25 0 : fd_dns_peer_parse( endpoint, config_key, hostname, &out[ i ].port, NULL ); 26 0 : out[ i ].port = fd_ushort_bswap( out[ i ].port ); 27 0 : if( FD_LIKELY( (ulong)(colon-endpoint)<=15UL && fd_cstr_to_ip4_addr( hostname, &out[ i ].ip4 ) ) ) continue; 28 : 29 0 : fd_memcpy( dns_peers[ dns_cnt ], endpoint, sizeof(dns_peers[ dns_cnt ]) ); 30 0 : dns_idx[ dns_cnt ] = (uchar)i; 31 0 : dns_cnt++; 32 0 : } 33 : 34 0 : if( !dns_cnt ) return; 35 : 36 0 : fd_ip4_port_t resolved[ FD_DNS_RESOLVE_PEERS_MAX ]; 37 0 : fd_dns_resolve_peers( dns_peers[ 0 ], sizeof(dns_peers[ 0 ]), dns_cnt, config_key, resolved ); 38 0 : for( ulong i=0UL; i<dns_cnt; i++ ) out[ dns_idx[ i ] ].ip4 = resolved[ i ].addr; 39 0 : }