static void _proxy_enumerate_cb (GObject *object, GAsyncResult *result, gpointer user_data) { GError *error = NULL; GMainLoop *loop = user_data; GSocketAddressEnumerator *enumerator = G_SOCKET_ADDRESS_ENUMERATOR (object); GSocketAddress *sockaddr; sockaddr = g_socket_address_enumerator_next_finish (enumerator, result, &error); if (sockaddr) { print_proxy_address (sockaddr); g_socket_address_enumerator_next_async (enumerator, cancellable, _proxy_enumerate_cb, loop); g_object_unref (sockaddr); } else { if (error) print_and_free_error (error); g_main_loop_quit (loop); } }
static void on_address_next (GObject *object, GAsyncResult *result, gpointer user_data) { CockpitStream *self = user_data; GSocketConnection *connection; GSocketAddress *address; GError *error = NULL; GSocket *sock; address = g_socket_address_enumerator_next_finish (G_SOCKET_ADDRESS_ENUMERATOR (object), result, &error); if (error) { set_problem_from_error (self, "couldn't resolve", error); g_error_free (error); close_immediately (self, NULL); } else if (address) { sock = g_socket_new (g_socket_address_get_family (address), G_SOCKET_TYPE_STREAM, 0, &error); if (sock) { g_socket_set_blocking (sock, FALSE); connection = g_socket_connection_factory_create_connection (sock); g_object_unref (sock); g_socket_connection_connect_async (connection, address, NULL, on_socket_connect, g_object_ref (self)); } if (error) { g_debug ("%s: couldn't open socket: %s", self->priv->name, error->message); g_clear_error (&self->priv->connect_error); self->priv->connect_error = error; } g_object_unref (address); } else { if (self->priv->connect_error) { set_problem_from_error (self, "couldn't connect", self->priv->connect_error); close_immediately (self, NULL); } else { g_message ("%s: no addresses found", self->priv->name); close_immediately (self, "not-found"); } } g_object_unref (self); }
static void got_next_async (GObject *source, GAsyncResult *result, gpointer user_data) { GSocketAddressEnumerator *enumerator = G_SOCKET_ADDRESS_ENUMERATOR (source); GSocketAddress *sockaddr; GError *error = NULL; sockaddr = g_socket_address_enumerator_next_finish (enumerator, result, &error); if (sockaddr || error) print_connectable_sockaddr (sockaddr, error); if (sockaddr) do_async_connectable (enumerator); else { g_object_unref (enumerator); done_lookup (); } }