static void do_lookup_by_name (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable) { const char *hostname = task_data; struct addrinfo *res = NULL; GList *addresses; gint retval; retval = getaddrinfo (hostname, NULL, &addrinfo_hints, &res); if (retval == 0) { struct addrinfo *ai; GSocketAddress *sockaddr; GInetAddress *addr; addresses = NULL; for (ai = res; ai; ai = ai->ai_next) { sockaddr = g_socket_address_new_from_native (ai->ai_addr, ai->ai_addrlen); if (!sockaddr || !G_IS_INET_SOCKET_ADDRESS (sockaddr)) continue; addr = g_object_ref (g_inet_socket_address_get_address ((GInetSocketAddress *)sockaddr)); addresses = g_list_prepend (addresses, addr); g_object_unref (sockaddr); } if (addresses != NULL) { addresses = g_list_reverse (addresses); g_task_return_pointer (task, addresses, (GDestroyNotify)g_resolver_free_addresses); } else { /* All addresses failed to be converted to GSocketAddresses. */ g_task_return_new_error (task, G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND, _("Error resolving '%s': %s"), hostname, _("No valid addresses were found")); } } else { g_task_return_new_error (task, G_RESOLVER_ERROR, g_resolver_error_from_addrinfo_error (retval), _("Error resolving '%s': %s"), hostname, gai_strerror (retval)); } if (res) freeaddrinfo (res); }
static void do_lookup_by_address (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable) { GInetAddress *address = task_data; struct sockaddr_storage sockaddr; gsize sockaddr_size; GSocketAddress *gsockaddr; gchar name[NI_MAXHOST]; gint retval; gsockaddr = g_inet_socket_address_new (address, 0); g_socket_address_to_native (gsockaddr, (struct sockaddr *)&sockaddr, sizeof (sockaddr), NULL); sockaddr_size = g_socket_address_get_native_size (gsockaddr); g_object_unref (gsockaddr); retval = getnameinfo ((struct sockaddr *)&sockaddr, sockaddr_size, name, sizeof (name), NULL, 0, NI_NAMEREQD); if (retval == 0) g_task_return_pointer (task, g_strdup (name), g_free); else { gchar *phys; phys = g_inet_address_to_string (address); g_task_return_new_error (task, G_RESOLVER_ERROR, g_resolver_error_from_addrinfo_error (retval), _("Error reverse-resolving “%s”: %s"), phys ? phys : "(unknown)", gai_strerror (retval)); g_free (phys); } }