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; }
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; }
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; }