static guint resolve_sync_internal (SoupAddress *addr, GCancellable *cancellable, GError **error) { SoupAddressPrivate *priv = SOUP_ADDRESS_GET_PRIVATE (addr); GResolver *resolver; guint status; GError *my_err = NULL; resolver = g_resolver_get_default (); /* We could optimize this to avoid multiple lookups the same * way _resolve_async does, but we don't currently. So, first * lock the mutex to ensure we have a consistent view of * priv->sockaddr and priv->name, unlock it around the * blocking op, and then re-lock it to modify @addr. */ g_mutex_lock (&priv->lock); if (priv->name && !priv->sockaddr) maybe_resolve_ip (addr); if (!priv->sockaddr) { GList *addrs; g_mutex_unlock (&priv->lock); addrs = g_resolver_lookup_by_name (resolver, priv->name, cancellable, &my_err); g_mutex_lock (&priv->lock); status = update_addrs (addr, addrs, my_err); g_resolver_free_addresses (addrs); } else if (!priv->name) { GInetAddress *gia; char *name; g_mutex_unlock (&priv->lock); gia = soup_address_make_inet_address (addr); name = g_resolver_lookup_by_address (resolver, gia, cancellable, &my_err); g_object_unref (gia); g_mutex_lock (&priv->lock); status = update_name (addr, name, my_err); g_free (name); } else status = SOUP_STATUS_OK; g_mutex_unlock (&priv->lock); if (my_err) g_propagate_error (error, my_err); g_object_unref (resolver); return status; }
static VALUE rg_lookup_by_address(int argc, VALUE *argv, VALUE self) { VALUE address, cancellable; GError *error = NULL; gchar *hostname; rb_scan_args(argc, argv, "11", &address, &cancellable); hostname = g_resolver_lookup_by_address(_SELF(self), RVAL2GINETADDRESS(address), RVAL2GCANCELLABLE(cancellable), &error); if (hostname == NULL) rbgio_raise_error(error); return CSTR2RVAL_FREE(hostname); }
static void lookup_one_sync (const char *arg) { GError *error = NULL; if (strchr (arg, '/')) { GList *targets; /* service/protocol/domain */ char **parts = g_strsplit (arg, "/", 3); if (!parts || !parts[2]) usage (); targets = g_resolver_lookup_service (resolver, parts[0], parts[1], parts[2], cancellable, &error); print_resolved_service (arg, targets, error); } else if (g_hostname_is_ip_address (arg)) { GInetAddress *addr = g_inet_address_new_from_string (arg); char *name; name = g_resolver_lookup_by_address (resolver, addr, cancellable, &error); print_resolved_name (arg, name, error); g_object_unref (addr); } else { GList *addresses; addresses = g_resolver_lookup_by_name (resolver, arg, cancellable, &error); print_resolved_addresses (arg, addresses, error); } }