/* * Called once all requests have been completed */ static void process_client_callback(struct resolv_query *query) { struct sockaddr *best_address = NULL; if (resolv_mode == MODE_IPV4_FIRST) { best_address = choose_ipv4_first(query); } else if (resolv_mode == MODE_IPV6_FIRST) { best_address = choose_ipv6_first(query); } else { best_address = choose_any(query); } query->client_cb(best_address, query->data); for (int i = 0; i < query->response_count; i++) ss_free(query->responses[i]); ss_free(query->responses); if (query->free_cb != NULL) query->free_cb(query->data); else ss_free(query->data); ss_free(query); }
static struct sockaddr * choose_ipv6_first(struct ResolvQuery *cb_data) { for (int i = 0; i < cb_data->response_count; i++) if (cb_data->responses[i]->sa_family == AF_INET6) { return cb_data->responses[i]; } return choose_any(cb_data); }
static struct sockaddr * choose_ipv6_first(struct resolv_query *query) { for (int i = 0; i < query->response_count; i++) if (query->responses[i]->sa_family == AF_INET6) { return query->responses[i]; } return choose_any(query); }
/* * Called once all queries have been completed */ static void process_client_callback(struct ResolvQuery *cb_data) { struct sockaddr *best_address = NULL; if (resolv_mode == MODE_IPV4_FIRST) { best_address = choose_ipv4_first(cb_data); } else if (resolv_mode == MODE_IPV6_FIRST) { best_address = choose_ipv6_first(cb_data); } else { best_address = choose_any(cb_data); } cb_data->client_cb(best_address, cb_data->client_cb_data); for (int i = 0; i < cb_data->response_count; i++) ss_free(cb_data->responses[i]); ss_free(cb_data->responses); if (cb_data->client_free_cb != NULL) { cb_data->client_free_cb(cb_data->client_cb_data); } ss_free(cb_data); }