static
GPtrArray*
build_meta0_cache (struct resolver_direct_s *r, GError **err)
{
	GSList *m0_list=NULL;
	GPtrArray *array=NULL;

	/*now call the meta0 reference*/
	if (!(m0_list = meta0_remote_get_meta1_all (&(r->meta0), r->timeout.m0.op, err)))
	{
		gchar str_addr[128];
		memset(str_addr, 0x00, sizeof(str_addr));
		addr_info_to_string(&(r->meta0), str_addr, sizeof(str_addr));
		GSETERROR (err,"META0 error : Cannot get the reference from %s", str_addr);
		WARN ("Cannot get the META0 reference from %s", str_addr);
		return NULL;
	}

	array = meta0_utils_list_to_array(m0_list); 

	g_slist_foreach (m0_list, meta0_info_gclean, NULL);
	g_slist_free (m0_list);

	return array;
}
Exemple #2
0
static GString*
_m0_mapping_from_m1_list(GSList *m1_list)
{
	gboolean first = TRUE;
	GString *out = g_string_sized_new(65536 * 20);
	GPtrArray *array = meta0_utils_list_to_array(m1_list);

	g_string_append_c(out, '{');
	for (guint i = 0; i < array->len; i++) {
		gchar **v;
		if ((v = array->pdata[i]) != NULL) {
			if (!first)
				g_string_append_c(out, ',');
			guint16 p = i;
			gboolean first2 = TRUE;
			g_string_append_printf(out, "\"%04X\":[", p);
			for (gchar **m1 = v; m1 && *m1; m1++) {
				if (!first2)
					g_string_append_c(out, ',');
				first2 = FALSE;
				g_string_append_printf(out, "\"%s\"", *m1);
			}
			g_string_append_c(out, ']');
			first = FALSE;
		}
	}
	g_string_append_c(out, '}');

	meta0_utils_array_clean(array);
	return out;
}
Exemple #3
0
static GError*
_cache_load_from_m0(struct meta1_prefixes_set_s *m1ps,
		const gchar *ns_name,
		const struct addr_info_s *local_addr,
		struct addr_info_s *m0_addr,
		GArray **updated_prefixes,
		gboolean *meta0_ok)
{
	GError *err = NULL;
	GSList *m0info_list = NULL;

	EXTRA_ASSERT(m1ps != NULL);
	GRID_TRACE2("%s(%p,%s,%p,%p)", __FUNCTION__, m1ps, ns_name, local_addr,
			m0_addr);

	(void)ns_name;
	gchar m0[STRLEN_ADDRINFO];
	grid_addrinfo_to_string (m0_addr, m0, sizeof(m0));
	err = meta0_remote_get_meta1_all(m0, &m0info_list);
	if (err) {
		g_prefix_error(&err, "Remote error: ");
		return err;
	}
	if (!m0info_list) {
		GRID_DEBUG("META0 has no prefix configured!");
		return NULL;
	}

	*meta0_ok = TRUE;
	guint8 *cache = _cache_from_m0l(m0info_list, local_addr);
	GPtrArray *by_prefix = meta0_utils_list_to_array(m0info_list);

	g_mutex_lock(&m1ps->lock);
	GRID_DEBUG("Got %u prefixes from M0, %u in place",
			by_prefix->len, m1ps->by_prefix ? m1ps->by_prefix->len : 0);

	if ( m1ps->by_prefix ) {
		guint prefix;
		*updated_prefixes = g_array_new(FALSE, FALSE, sizeof(guint16));
		for( prefix=0 ; prefix <65536 ;prefix++) {
			if ( _cache_is_managed(m1ps->cache,(guint8 *)&prefix) != _cache_is_managed( cache,(guint8 *)&prefix)) {
				g_array_append_vals(*updated_prefixes, &prefix, 1);
			}
		}
	}

	SWAP_PTR(m1ps->by_prefix, by_prefix);
	SWAP_PTR(m1ps->cache, cache);
	g_mutex_unlock(&m1ps->lock);

	if (by_prefix)
		meta0_utils_array_clean(by_prefix);
	by_prefix = NULL;

	if (cache)
		g_free(cache);
	cache = NULL;

	g_slist_foreach(m0info_list, meta0_info_gclean, NULL);
	g_slist_free(m0info_list);
	return NULL;
}