static gs_error_t* _m1policy_update(gchar *action, gchar *ns,gboolean isprefix, container_id_t cid, gchar *type, gchar *exludesrv, gboolean checkonly, gchar ***result ) { GError *err=NULL; gs_error_t *hc_error = NULL; GSList *exclude = NULL; addr_info_t *m1addr; gs_grid_storage_t *hc; gchar ** hc_result = NULL; hc = gs_grid_storage_init(ns, &hc_error); if (!hc) return hc_error; m1addr = gs_resolve_meta1v2(hc,cid,NULL,0,exclude,&err); while (m1addr) { hc_result = meta1v2_remote_update_m1_policy(m1addr, &err, ns, ( isprefix ? cid : NULL), ( isprefix ? NULL: cid), type, action, checkonly, exludesrv, 300, 300); if ( err ) { if ( err->code < 100 || err->code > 500 ) { exclude=g_slist_prepend(exclude,m1addr); m1addr = gs_resolve_meta1v2(hc,cid,NULL,0,exclude,&err); } else { GRID_WARN("META1 request error (%d) : %s", err->code, err->message); GSERRORCAUSE(&hc_error, err, "Failed to apply Meta1 policy\n"); m1addr=NULL; } g_clear_error(&err); } else { break; } } gs_grid_storage_free(hc); if(exclude) { g_slist_foreach(exclude, addr_info_gclean, NULL); g_slist_free(exclude); } if(m1addr) g_free(m1addr); *result = hc_result; return hc_error; }
static status_t _get_container_user_properties(gs_grid_storage_t *hc, struct hc_url_s *url, char ***props, gs_error_t **gserr) { GError *gerr = NULL; gboolean rc; addr_info_t *m1 = NULL; GSList *excluded = NULL; gs_container_t *c = gs_get_container(hc, hc_url_get(url, HCURL_USER), 0, gserr); if(!c) return 0; for (;;) { m1 = gs_resolve_meta1v2(hc, hc_url_get_id(url), c->info.name, 1, &excluded, &gerr); if (!m1) { *gserr = gs_error_new(CODE_INTERNAL_ERROR, "No META1 found for [%s]", hc_url_get(url, HCURL_USER)); break; } rc = meta1v2_remote_reference_get_property (m1, &gerr, url, NULL, props); if (!rc) { excluded = g_slist_prepend(excluded, m1); m1=NULL; if (gerr) { if (CODE_IS_NETWORK_ERROR(gerr->code)) { g_error_free(gerr); gerr = NULL; } else { GSERRORCAUSE(gserr, gerr, "Cannot get container user properties"); break; } } } else { break; } } if (excluded) { g_slist_foreach(excluded, addr_info_gclean, NULL); g_slist_free(excluded); } if (m1) g_free(m1); gs_container_free(c); if (gerr) g_error_free(gerr); return rc; }