static GError * _resolve_m1_through_many_m0(gchar **urlv, const guint8 *prefix, gchar ***result) { GError *err; guint i, last; gchar *url; GRID_TRACE2("%s(%02X%02X)", __FUNCTION__, prefix[0], prefix[1]); for (last=g_strv_length(urlv); last ;last--) { /* pick a random URL */ i = rand() % last; url = urlv[i]; if (!(err = _resolve_m1_through_one_m0(url, prefix, result))) return NULL; if (err->code < 100) g_error_free(err); /* swap 'i' and 'last' */ urlv[i] = urlv[last-1]; urlv[last-1] = url; } return NEWERROR(500, "No META0 answered"); }
static GError * _resolve_m1_through_many_m0(gchar **urlv, const guint8 *prefix, gchar ***result) { guint i, last; gchar *url; GRID_TRACE2("%s(%02X%02X)", __FUNCTION__, prefix[0], prefix[1]); for (last=g_strv_length(urlv); last ;last--) { /* pick a random URL */ i = rand() % last; url = urlv[i]; GError *err = _resolve_m1_through_one_m0(url, prefix, result); EXTRA_ASSERT((err!=NULL) ^ (*result!=NULL)); if (!err) return NULL; if (!CODE_IS_NETWORK_ERROR(err->code)) return err; g_error_free(err); /* swap 'i' and 'last' */ urlv[i] = urlv[last-1]; urlv[last-1] = url; } return NEWERROR(CODE_INTERNAL_ERROR, "No META0 answered"); }