struct _GResolv {
gint ref_count;
+ int result_family;
+
guint next_lookup_id;
GQueue *lookup_queue;
GQueue *query_queue;
resolv->ref_count = 1;
+ resolv->result_family = AF_UNSPEC;
+
resolv->next_lookup_id = 1;
resolv->query_queue = g_queue_new();
lookup->result_data = user_data;
lookup->id = resolv->next_lookup_id++;
- if (add_query(lookup, hostname, ns_t_a)) {
- g_free(lookup);
- return -EIO;
+ if (resolv->result_family != AF_INET6) {
+ if (add_query(lookup, hostname, ns_t_a)) {
+ g_free(lookup);
+ return -EIO;
+ }
}
- if (add_query(lookup, hostname, ns_t_aaaa)) {
- destroy_query(lookup->ipv4_query);
- g_queue_remove(resolv->query_queue, lookup->ipv4_query);
- g_free(lookup);
- return -EIO;
+ if (resolv->result_family != AF_INET) {
+ if (add_query(lookup, hostname, ns_t_aaaa)) {
+ if (resolv->result_family != AF_INET6) {
+ destroy_query(lookup->ipv4_query);
+ g_queue_remove(resolv->query_queue,
+ lookup->ipv4_query);
+ }
+
+ g_free(lookup);
+ return -EIO;
+ }
}
g_queue_push_tail(resolv->lookup_queue, lookup);
return TRUE;
}
+
+gboolean g_resolv_set_address_family(GResolv *resolv, int family)
+{
+ if (resolv == NULL)
+ return FALSE;
+
+ if (family != AF_UNSPEC && family != AF_INET && family != AF_INET6)
+ return FALSE;
+
+ resolv->result_family = family;
+
+ return TRUE;
+}