Пример #1
0
void
gabble_jingle_info_take_stun_server (
    GabbleJingleInfo *self,
    gchar *stun_server,
    guint16 stun_port,
    gboolean is_fallback)
{
  GResolver *resolver;
  PendingStunServer *data;

  if (stun_server == NULL)
    return;

  if (!is_fallback)
    self->priv->get_stun_from_jingle = FALSE;

  resolver = g_resolver_get_default ();
  data = g_slice_new0 (PendingStunServer);

  DEBUG ("Resolving %s STUN server %s:%u",
      is_fallback ? "fallback" : "primary", stun_server, stun_port);
  data->factory = self;
  g_object_add_weak_pointer (G_OBJECT (self), (gpointer *) &data->factory);
  data->stun_server = stun_server;
  data->stun_port = stun_port;
  data->fallback = is_fallback;

  data->cancellable = g_cancellable_new ();
  g_object_weak_ref (G_OBJECT (self), (GWeakNotify)g_cancellable_cancel,
      data->cancellable);

  g_resolver_lookup_by_name_async (resolver, stun_server,
      data->cancellable, stun_server_resolved_cb, data);
}
Пример #2
0
static void
do_test1(GObject *sender, GAsyncResult *res, gpointer data) {
	GList *services = NULL;
	GError *error = NULL;
	GResolver *resolver;
	const char *servername = data;
	int port = 3478;

	services = g_resolver_lookup_service_finish(G_RESOLVER(sender),
			res, &error);
	if(error != NULL) {
		purple_debug_info("stun", "Failed to look up srv record : %s\n", error->message);

		g_error_free(error);
	} else {
		servername = g_srv_target_get_hostname((GSrvTarget *)services->data);
		port = g_srv_target_get_port((GSrvTarget *)services->data);
	}

	purple_debug_info("stun", "connecting to %s:%d\n", servername, port);

	resolver = g_resolver_get_default();
	g_resolver_lookup_by_name_async(resolver,
	                                servername,
	                                NULL,
	                                hbn_cb,
	                                GINT_TO_POINTER(port));
	g_object_unref(resolver);

	g_resolver_free_targets(services);
}
Пример #3
0
static void
address_enumerate_cb (GObject	   *object,
		      GAsyncResult *result,
		      gpointer	    user_data)
{
  GTask *task = user_data;
  GProxyAddressEnumeratorPrivate *priv = g_task_get_task_data (task);

  g_clear_error (&priv->last_error);
  priv->proxy_address =
    g_socket_address_enumerator_next_finish (priv->addr_enum,
					     result,
					     &priv->last_error);
  if (priv->proxy_address)
    {
      if (!priv->supports_hostname && !priv->dest_ips)
	{
	  GResolver *resolver;
	  resolver = g_resolver_get_default();
	  g_resolver_lookup_by_name_async (resolver,
					   priv->dest_hostname,
					   g_task_get_cancellable (task),
					   dest_hostname_lookup_cb,
					   task);
	  g_object_unref (resolver);
	  return;
	}

      return_result (task);
    }
  else
    next_proxy (task);
}
Пример #4
0
/**
 * soup_address_resolve_async:
 * @addr: a #SoupAddress
 * @async_context: (allow-none): the #GMainContext to call @callback from
 * @cancellable: a #GCancellable object, or %NULL
 * @callback: (scope async): callback to call with the result
 * @user_data: data for @callback
 *
 * Asynchronously resolves the missing half of @addr (its IP address
 * if it was created with soup_address_new(), or its hostname if it
 * was created with soup_address_new_from_sockaddr() or
 * soup_address_new_any().)
 *
 * If @cancellable is non-%NULL, it can be used to cancel the
 * resolution. @callback will still be invoked in this case, with a
 * status of %SOUP_STATUS_CANCELLED.
 *
 * It is safe to call this more than once on a given address, from the
 * same thread, with the same @async_context (and doing so will not
 * result in redundant DNS queries being made). But it is not safe to
 * call from multiple threads, or with different @async_contexts, or
 * mixed with calls to soup_address_resolve_sync().
 **/
void
soup_address_resolve_async (SoupAddress *addr, GMainContext *async_context,
			    GCancellable *cancellable,
			    SoupAddressCallback callback, gpointer user_data)
{
	SoupAddressPrivate *priv;
	SoupAddressResolveAsyncData *res_data;
	GResolver *resolver;
	gboolean already_started;

	g_return_if_fail (SOUP_IS_ADDRESS (addr));
	priv = SOUP_ADDRESS_GET_PRIVATE (addr);
	g_return_if_fail (priv->name || priv->sockaddr);

	/* We don't need to do locking here because the async case is
	 * not intended to be thread-safe.
	 */

	if (priv->name && priv->sockaddr && !callback)
		return;

	res_data = g_slice_new0 (SoupAddressResolveAsyncData);
	res_data->callback = callback;
	res_data->callback_data = user_data;

	already_started = priv->async_lookups != NULL;
	priv->async_lookups = g_slist_prepend (priv->async_lookups, res_data);

	if (already_started)
		return;

	g_object_ref (addr);

	if (priv->name && priv->sockaddr) {
		soup_add_completion (async_context, idle_complete_resolve, addr);
		return;
	}

	resolver = g_resolver_get_default ();
	if (async_context)
		g_main_context_push_thread_default (async_context);

	if (priv->name) {
		g_resolver_lookup_by_name_async (resolver, priv->name,
						 cancellable,
						 lookup_resolved, addr);
	} else {
		GInetAddress *gia;

		gia = soup_address_make_inet_address (addr);
		g_resolver_lookup_by_address_async (resolver, gia,
						    cancellable,
						    lookup_resolved, addr);
		g_object_unref (gia);
	}

	if (async_context)
		g_main_context_pop_thread_default (async_context);
	g_object_unref (resolver);
}
Пример #5
0
static void http_redirector_init(const gchar * desturl)
{
	char host[128];
	sscanf(desturl,"http://%128[^/^:]",host);
	redirector_ip = inet_addr(host);
	if (redirector_ip == INADDR_NONE)
	{
		g_debug(_("host in the url is not an ipv4 address, will do async dns lookup"));
		GResolver * dns =  g_resolver_get_default();
		g_resolver_lookup_by_name_async(dns,host,NULL,redirector_host_resove_by_dns,dns);
	}
	sprintf((char*) httphead, (char*) httphead_t, desturl, desturl);
}
Пример #6
0
static VALUE
rg_lookup_by_name_async(int argc, VALUE *argv, VALUE self)
{
        VALUE rbhostname, rbcancellable, block;
        const gchar *hostname;
        GCancellable *cancellable;

        rb_scan_args(argc, argv, "11&", &hostname, &rbcancellable, &block);
        hostname = RVAL2CSTR(rbhostname);
        cancellable = RVAL2GCANCELLABLE(rbcancellable);
        SAVE_BLOCK(block);
        g_resolver_lookup_by_name_async(_SELF(self),
                                        hostname,
                                        cancellable,
                                        rbgio_async_ready_callback,
                                        (gpointer)block);

        return self;
}
Пример #7
0
static void
start_async_lookups (char **argv, int argc)
{
  int i;

  for (i = 0; i < argc; i++)
    {
      if (strchr (argv[i], '/'))
	{
	  /* service/protocol/domain */
	  char **parts = g_strsplit (argv[i], "/", 3);

	  if (!parts || !parts[2])
	    usage ();

	  g_resolver_lookup_service_async (resolver,
					   parts[0], parts[1], parts[2],
					   cancellable,
					   lookup_service_callback, argv[i]);
	}
      else if (g_hostname_is_ip_address (argv[i]))
	{
          GInetAddress *addr = g_inet_address_new_from_string (argv[i]);

	  g_resolver_lookup_by_address_async (resolver, addr, cancellable,
                                              lookup_by_addr_callback, argv[i]);
	  g_object_unref (addr);
	}
      else
	{
	  g_resolver_lookup_by_name_async (resolver, argv[i], cancellable,
                                           lookup_by_name_callback,
                                           argv[i]);
	}

      /* Stress-test the reloading code */
      g_signal_emit_by_name (resolver, "reload");
    }
}
Пример #8
0
void
do_dns (session *sess, char *nick, char *host,
		const message_tags_data *tags_data)
{
	GResolver *res = g_resolver_get_default ();
	GInetAddress *addr;
	char *po;

	po = strrchr (host, '@');
	if (po)
		host = po + 1;

	if (nick)
		EMIT_SIGNAL_TIMESTAMP (XP_TE_RESOLVINGUSER, sess, tags_data->timestamp, nick, host);

	PrintTextf (sess, _("Looking up %s..."), host);

	addr = g_inet_address_new_from_string (host);
	if (addr)
		g_resolver_lookup_by_address_async (res, addr, NULL, dns_addr_callback, sess);
	else
		g_resolver_lookup_by_name_async (res, host, NULL, dns_name_callback, sess);
}
Пример #9
0
struct sipe_dns_query *sipe_backend_dns_query_a(SIPE_UNUSED_PARAMETER struct sipe_core_public *sipe_public,
        const gchar *hostname,
        guint port,
        sipe_dns_resolved_cb callback,
        gpointer data)
{
    struct sipe_dns_query *query = g_new0(struct sipe_dns_query, 1);
    GResolver *resolver          = g_resolver_get_default();

    SIPE_DEBUG_INFO("sipe_backend_dns_query_a: %s", hostname);

    query->callback  = callback;
    query->extradata = data;
    query->port      = port;
    query->cancel    = g_cancellable_new();
    g_resolver_lookup_by_name_async(resolver,
                                    hostname,
                                    query->cancel,
                                    dns_a_response,
                                    query);

    g_object_unref(resolver);
    return(query);
}
Пример #10
0
G_MODULE_EXPORT gchar * g_module_check_init(GModule *module)
{
	gboolean	enable;
	GError * err=NULL;
	gchar * url;

	enable = g_key_file_get_boolean(gkeyfile,GROUP_NAME,"enable",&err);

	if(err)
	{
		enable = TRUE;
		g_error_free(err);
		g_message("%s","[http_redirect]:[enable] not specified, default to enable");
		err = NULL;
	}

	if (!enable)
	{
		return "[http_redirect]:[enable=false], user disabled me";
	}

	url = g_key_file_get_string(gkeyfile, GROUP_NAME, "url", NULL);

	if(!url)
	{
		return "[http_redirect]:[url] not defined, please define one";
	}

	http_redirector_init(url);

	gchar *  ips = g_key_file_get_string(gkeyfile,GROUP_NAME,"whitelist",&err);


	if(err)
	{
		g_error_free(err);
	}else
	{
		GResolver * dns =  g_resolver_get_default();

		void resove_host_by_dns(GObject *source_object, GAsyncResult *res,gpointer user_data)
		{
			GList * hosts = g_resolver_lookup_by_name_finish(G_RESOLVER(source_object),res,NULL);

			if(hosts)
			{
				GList * it = g_list_first(hosts);

				do
				{
					GInetAddress * addr = (GInetAddress*)(it->data);
					if(g_inet_address_get_native_size(addr)==4)
					{
						in_addr_t ip;
						memcpy(&ip,g_inet_address_to_bytes(addr),4);
						whiteip = g_list_prepend(whiteip,GUINT_TO_POINTER(ip));
						g_message(_("%s's DNS result : %s"),(char*)user_data,g_inet_address_to_string(addr));
					}
				}while(( it = g_list_next(it)));
				g_resolver_free_addresses(hosts);
			}
			g_object_unref(source_object);
			g_free(user_data);
		}
		gchar *ptr;

		gchar * one_host =strtok_r(ips," \t",&ptr);


		while( one_host )
		{
			in_addr_t ip = inet_addr(one_host);
			if (ip == INADDR_NONE)
			{
				g_object_ref(dns);

				g_debug(_("host %s is not an ipv4 address, will do async dns lookup"),one_host);

				g_resolver_lookup_by_name_async(dns,one_host,NULL,resove_host_by_dns,g_strdup(one_host));
			}else
			{
				whiteip = g_list_prepend(whiteip,GUINT_TO_POINTER(ip));
			}
			one_host = strtok_r(NULL," \t",&ptr);
		}
		g_object_unref(dns);
	}