GCancellable *ekg_connection_starter_run( ekg_connection_starter_t cs, GSocketClient *sock, ekg_connection_callback_t callback, ekg_connection_failure_callback_t failure_callback, gpointer priv_data) { cs->callback = callback; cs->failure_callback = failure_callback; cs->priv_data = priv_data; cs->cancellable = g_cancellable_new(); cs->current_server = cs->servers; if (cs->bind_hostname) { GResolver *res = g_resolver_get_default(); GList *addrs; GError *err = NULL; addrs = g_resolver_lookup_by_name( res, cs->bind_hostname, NULL, &err); if (!addrs) { /* XXX: delay calling that */ failed_async_connect(sock, err, cs); g_error_free(err); return cs->cancellable; } g_socket_client_set_local_address(sock, g_inet_socket_address_new( G_INET_ADDRESS(g_list_nth_data(addrs, 0)), 0)); g_resolver_free_addresses(addrs); g_object_unref(res); } /* if we have the domain name, try SRV lookup first */ if (cs->domain) { g_assert(cs->service); /* fallback to domainname lookup if 'servers' not set */ if (!cs->servers || !cs->servers[0]) ekg_connection_starter_set_servers(cs, cs->domain); debug_function("ekg_connection_start(), trying _%s._tcp.%s\n", cs->service, cs->domain); g_socket_client_connect_to_service_async( sock, cs->domain, cs->service, cs->cancellable, done_async_connect, cs); } else /* otherwise, just begin with servers */ g_assert(setup_async_connect(sock, cs)); return cs->cancellable; }
static VALUE rg_connect_to_service_async(int argc, VALUE *argv, VALUE self) { VALUE rbdomain, rbservice, rbcancellable, block; GCancellable *cancellable; const gchar *domain; const gchar *service; rb_scan_args(argc, argv, "21&", &domain, &service, &rbcancellable, &block); domain = RVAL2CSTR(rbdomain); service = RVAL2CSTR(rbservice); cancellable = RVAL2GCANCELLABLE(rbcancellable); SAVE_BLOCK(block); g_socket_client_connect_to_service_async(_SELF(self), domain, service, cancellable, rbgio_async_ready_callback, (gpointer)block); return self; }