static gboolean meta1_dispatch_v2_SRV_UNLINK(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { gchar **urlv = NULL; GError *err; gchar *srvtype = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_TYPENAME); struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), srvtype); (void) ignored; if (!srvtype) reply->send_error(CODE_BAD_REQUEST, NEWERROR(CODE_BAD_REQUEST, "Missing srvtype")); else if (NULL != (err = metautils_message_extract_body_strv(reply->request, &urlv))) reply->send_error(CODE_BAD_REQUEST, err); else if (NULL != (err = meta1_backend_services_unlink(m1, url, srvtype, urlv))) reply->send_error(0, err); else reply->send_reply(CODE_FINAL_OK, "OK"); if (urlv) g_strfreev (urlv); oio_url_clean (url); g_free0 (srvtype); return TRUE; }
void sqlx_name_fill (struct sqlx_name_mutable_s *n, struct oio_url_s *url, const char *srvtype, gint64 seq) { EXTRA_ASSERT (n != NULL); EXTRA_ASSERT (url != NULL); EXTRA_ASSERT (srvtype != NULL); const gchar *subtype = oio_url_get (url, OIOURL_TYPE); n->ns = g_strdup(oio_url_get (url, OIOURL_NS)); if (!strcmp(srvtype, NAME_SRVTYPE_META0)) { n->base = g_strdup (oio_url_get (url, OIOURL_NS)); } else if (!strcmp(srvtype, NAME_SRVTYPE_META1)) { n->base = g_strndup (oio_url_get(url, OIOURL_HEXID), 4); } else { n->base = g_strdup_printf ("%s.%"G_GINT64_FORMAT, oio_url_get (url, OIOURL_HEXID), seq); } if (subtype && 0 != strcmp(subtype, OIOURL_DEFAULT_TYPE)) n->type = g_strdup_printf ("%s.%s", srvtype, subtype); else n->type = g_strdup (srvtype); }
static gboolean meta1_dispatch_v2_SRV_RENEW(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { struct oio_url_s *url = metautils_message_extract_url (reply->request); gboolean ac = metautils_message_extract_flag(reply->request, NAME_MSGKEY_AUTOCREATE, FALSE); gboolean dryrun = metautils_message_extract_flag(reply->request, NAME_MSGKEY_DRYRUN, FALSE); gchar *srvtype = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_TYPENAME); reply->subject("%s|%s|%s|%d", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), srvtype, dryrun); (void) ignored; gchar **result = NULL; GError *err = meta1_backend_services_poll(m1, url, srvtype, ac, dryrun, &result); if (NULL != err) reply->send_error(0, err); else { reply->add_body(marshall_stringv_and_clean(&result)); reply->send_reply(CODE_FINAL_OK, "OK"); } if (result) g_strfreev (result); oio_url_clean(url); g_free0 (srvtype); return TRUE; }
static gboolean meta1_dispatch_v2_PROPDEL(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored UNUSED) { struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); gchar **keys = NULL; gsize length = 0; void *body = metautils_message_get_BODY(reply->request, &length); GError *err = STRV_decode_buffer(body, length, &keys); if (NULL != err) reply->send_error(CODE_BAD_REQUEST, err); else { err = meta1_backend_del_container_properties(m1, url, keys); if (err) reply->send_error(0, err); else reply->send_reply(CODE_FINAL_OK, "OK"); g_strfreev (keys); } oio_url_clean (url); return TRUE; }
static gboolean meta1_dispatch_v2_USERCREATE(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored UNUSED) { struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); gsize length = 0; void *body = metautils_message_get_BODY(reply->request, &length); gchar **properties = NULL; GError *err = KV_decode_buffer(body, length, &properties); if (NULL != err) { reply->send_error(0, err); return TRUE; } err = meta1_backend_user_create(m1, url, properties); g_strfreev(properties); if (NULL != err) reply->send_error(0, err); else reply->send_reply(CODE_FINAL_OK, "Created"); oio_url_clean (url); return TRUE; }
static gboolean meta1_dispatch_v2_PROPGET(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { GError *err; gchar **strv = NULL, **result = NULL; struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); (void) ignored; if (NULL != (err = metautils_message_extract_body_strv(reply->request, &strv))) reply->send_error(CODE_BAD_REQUEST, err); else if (NULL != (err = meta1_backend_get_container_properties(m1, url, strv, &result))) reply->send_error(0, err); else { reply->add_body(marshall_stringv_and_clean(&result)); reply->send_reply(CODE_FINAL_OK, "OK"); } if (strv) g_strfreev (strv); if (result) g_strfreev (result); oio_url_clean (url); return TRUE; }
static gboolean meta1_dispatch_v2_SRV_UNLINK(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored UNUSED) { gchar *srvtype = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_TYPENAME); struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), srvtype); if (!srvtype) reply->send_error(CODE_BAD_REQUEST, NEWERROR(CODE_BAD_REQUEST, "Missing srvtype")); else { gsize length = 0; void *body = metautils_message_get_BODY(reply->request, &length); gchar **urlv = NULL; GError *err = STRV_decode_buffer(body, length, &urlv); if (NULL != err) reply->send_error(CODE_BAD_REQUEST, err); else { err = meta1_backend_services_unlink(m1, url, srvtype, urlv); if (NULL != err) reply->send_error(0, err); else reply->send_reply(CODE_FINAL_OK, "OK"); g_strfreev (urlv); } } oio_url_clean (url); g_free0 (srvtype); return TRUE; }
static gboolean meta1_dispatch_v2_SRV_FORCE(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored UNUSED) { struct oio_url_s *url = metautils_message_extract_url (reply->request); gboolean ac = metautils_message_extract_flag (reply->request, NAME_MSGKEY_AUTOCREATE, FALSE); gboolean force = metautils_message_extract_flag (reply->request, NAME_MSGKEY_FORCE, FALSE); reply->subject("%s|%s|?", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); gchar *m1url = NULL; GError *err = metautils_message_extract_body_string(reply->request, &m1url); if (NULL != err) reply->send_error(CODE_BAD_REQUEST, err); else { reply->subject("%s|%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), m1url); err = meta1_backend_services_set(m1, url, m1url, ac, force); g_free0 (m1url); if (NULL != err) reply->send_error(0, err); else reply->send_reply(200, "OK"); } oio_url_clean (url); return TRUE; }
static gboolean meta1_dispatch_v2_SRVRELINK(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { GError *err = NULL; gchar *replaced = NULL, *kept = NULL, **newset = NULL; struct oio_url_s *url = NULL; (void) ignored; url = metautils_message_extract_url (reply->request); kept = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_OLD); replaced = metautils_message_extract_string_copy (reply->request, NAME_MSGKEY_NOTIN); gboolean dryrun = metautils_message_extract_flag (reply->request, NAME_MSGKEY_DRYRUN, FALSE); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); if (!url) { reply->send_error (0, NEWERROR(CODE_BAD_REQUEST, "Missing field (%s)", "url")); } else { err = meta1_backend_services_relink (m1, url, kept, replaced, dryrun, &newset); if (NULL != err) { reply->send_error (0, err); } else { reply->add_body(marshall_stringv_and_clean(&newset)); reply->send_reply (CODE_FINAL_OK, "OK"); } } oio_url_pclean (&url); g_free0 (kept); g_free0 (replaced); if (newset) g_strfreev (newset); return TRUE; }
static enum http_rc_e handler_action (struct http_request_s *rq, struct http_reply_ctx_s *rp) { // Get a request id for the current request const gchar *reqid = g_tree_lookup (rq->tree_headers, PROXYD_HEADER_REQID); if (reqid) oio_ext_set_reqid(reqid); else oio_ext_set_random_reqid(); // Then parse the request to find a handler struct oio_url_s *url = NULL; struct oio_requri_s ruri = {NULL, NULL, NULL, NULL}; oio_requri_parse (rq->req_uri, &ruri); struct path_matching_s **matchings = _metacd_match (rq->cmd, ruri.path); GRID_TRACE2("URI path[%s] query[%s] fragment[%s] matches[%u]", ruri.path, ruri.query, ruri.fragment, g_strv_length((gchar**)matchings)); GQuark gq_count = gq_count_unexpected; GQuark gq_time = gq_time_unexpected; enum http_rc_e rc; if (!*matchings) { rp->set_content_type ("application/json"); rp->set_body_gstr (g_string_new("{\"status\":404,\"message\":\"No handler found\"}")); rp->set_status (HTTP_CODE_NOT_FOUND, "No handler found"); rp->finalize (); rc = HTTPRC_DONE; } else { struct req_args_s args = {0}; args.req_uri = &ruri; args.matchings = matchings; args.rq = rq; args.rp = rp; args.url = url = _metacd_load_url (&args); rp->subject(oio_url_get(url, OIOURL_HEXID)); gq_count = (*matchings)->last->gq_count; gq_time = (*matchings)->last->gq_time; GRID_TRACE("%s %s URL %s", __FUNCTION__, ruri.path, oio_url_get(args.url, OIOURL_WHOLE)); req_handler_f handler = (*matchings)->last->u; rc = (*handler) (&args); } gint64 spent = oio_ext_monotonic_time () - rq->client->time.evt_in; network_server_stat_push4 (rq->client->server, TRUE, gq_count, 1, gq_count_all, 1, gq_time, spent, gq_time_all, spent); path_matching_cleanv (matchings); oio_requri_clear (&ruri); oio_url_pclean (&url); oio_ext_set_reqid (NULL); return rc; }
static GString * _curl_reference_url (struct oio_url_s *u, const char *action) { GString *hu = _curl_url_prefix_reference (u); g_string_append_printf (hu, "/%s/%s/reference/%s", PROXYD_PREFIX, oio_url_get(u, OIOURL_NS), action); _append (hu, '?', "acct", oio_url_get (u, OIOURL_ACCOUNT)); _append (hu, '&', "ref", oio_url_get (u, OIOURL_USER)); return hu; }
static GString * _curl_content_url (struct oio_url_s *u, const char *action) { GString *hu = _curl_url_prefix_containers (u); g_string_append_printf (hu, "/%s/%s/content/%s", PROXYD_PREFIX, oio_url_get(u, OIOURL_NS), action); _append (hu, '?', "acct", oio_url_get (u, OIOURL_ACCOUNT)); _append (hu, '&', "ref", oio_url_get (u, OIOURL_USER)); _append_type (u, hu); _append (hu, '&', "path", oio_url_get (u, OIOURL_PATH)); return hu; }
static int _meta2_filter_check_ns_name(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply, int optional) { (void) reply; TRACE_FILTER(); const struct meta2_backend_s *backend = meta2_filter_ctx_get_backend(ctx); const char *req_ns = oio_url_get(meta2_filter_ctx_get_url(ctx), OIOURL_NS); if (!backend || !backend->ns_name[0]) { GRID_DEBUG("Missing information for namespace checking"); meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_INTERNAL_ERROR, "Missing backend information, cannot check namespace")); return FILTER_KO; } if (!req_ns) { if (optional) return FILTER_OK; GRID_DEBUG("Missing namespace name in request"); meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_BAD_REQUEST, "Bad Request: Missing namespace name information")); return FILTER_KO; } if (0 != g_ascii_strcasecmp(backend->ns_name, req_ns)) { meta2_filter_ctx_set_error(ctx, NEWERROR(CODE_BAD_REQUEST, "Request namespace [%s] does not match server namespace [%s]", req_ns, backend->ns_name)); return FILTER_KO; } return FILTER_OK; }
gboolean m1b_check_ns_url (struct meta1_backend_s *m1, struct oio_url_s *url) { if (!url) return FALSE; return m1b_check_ns (m1, oio_url_get (url, OIOURL_NS)); }
static GError * __notify_services(struct meta1_backend_s *m1, struct sqlx_sqlite3_s *sq3, struct oio_url_s *url) { if (!m1->notifier) return NULL; struct meta1_service_url_s **services = NULL; GError *err = __get_container_all_services(sq3, url, NULL, &services); if (!err) { struct meta1_service_url_s **services2 = expand_urlv(services); GString *notif = g_string_sized_new(128); g_string_append (notif, "{\"event\":\""NAME_SRVTYPE_META1".account.services\""); g_string_append_printf (notif, ",\"when\":%"G_GINT64_FORMAT, oio_ext_real_time()); g_string_append (notif, ",\"data\":{"); g_string_append_printf (notif, "\"url\":\"%s\"", oio_url_get(url, OIOURL_WHOLE)); g_string_append (notif, ",\"services\":["); if (services2) { for (struct meta1_service_url_s **svc = services2; *svc ; svc++) { if (svc != services2) // not at the beginning g_string_append(notif, ","); meta1_service_url_encode_json(notif, *svc); } } g_string_append(notif, "]}}"); oio_events_queue__send (m1->notifier, g_string_free(notif, FALSE)); meta1_service_url_cleanv(services2); meta1_service_url_cleanv(services); } return err; }
GError * meta2_backend_has_container(struct meta2_backend_s *m2, struct oio_url_s *url) { GError *err = NULL; EXTRA_ASSERT(m2 != NULL); EXTRA_ASSERT(url != NULL); GRID_DEBUG("HAS(%s)", oio_url_get(url, OIOURL_WHOLE)); struct sqlx_name_mutable_s n; sqlx_name_fill (&n, url, NAME_SRVTYPE_META2, 1); err = sqlx_repository_has_base(m2->backend.repo, sqlx_name_mutable_to_const(&n)); sqlx_name_clean (&n); if (NULL != err) { g_prefix_error(&err, "File error: "); return err; } struct sqlx_sqlite3_s *sq3 = NULL; err = m2b_open(m2, url, M2V2_OPEN_LOCAL, &sq3); if (NULL == err) { if (!sqlx_admin_has(sq3, META2_INIT_FLAG)) err = NEWERROR(CODE_CONTAINER_NOTFOUND, "Container created but not initiated"); m2b_close(sq3); } return err; }
static int _meta2_filter_check_ns_name(struct gridd_filter_ctx_s *ctx, struct gridd_reply_ctx_s *reply, int optional) { (void) reply; TRACE_FILTER(); const struct meta2_backend_s *backend = meta2_filter_ctx_get_backend(ctx); const char *req_ns = oio_url_get(meta2_filter_ctx_get_url(ctx), OIOURL_NS); if (!backend || !backend->ns_name[0]) { GRID_DEBUG("Missing information for namespace checking"); meta2_filter_ctx_set_error(ctx, SYSERR("backend not ready")); return FILTER_KO; } if (!req_ns) { if (optional) return FILTER_OK; GRID_DEBUG("Missing namespace name in request"); meta2_filter_ctx_set_error(ctx, BADREQ("No namespace")); return FILTER_KO; } if (0 != g_ascii_strcasecmp(backend->ns_name, req_ns)) { meta2_filter_ctx_set_error(ctx, BADNS()); return FILTER_KO; } return FILTER_OK; }
static gboolean meta1_dispatch_v2_USERDESTROY(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored UNUSED) { struct oio_url_s *url = metautils_message_extract_url (reply->request); gboolean force = metautils_message_extract_flag(reply->request, NAME_MSGKEY_FORCE, FALSE); reply->subject("%s|%s|%d", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID), force); GError *err = meta1_backend_user_destroy(m1, url, force); if (NULL != err) reply->send_error(0, err); else reply->send_reply(CODE_FINAL_OK, "OK"); oio_url_clean (url); return TRUE; }
static GString * _append_type (struct oio_url_s *u, GString *hu) { const char *type = oio_url_get (u, OIOURL_TYPE); if (type && *type) _append (hu, '&', "type", type); return hu; }
static gboolean meta1_dispatch_v2_USERCREATE(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { (void) ignored; struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); GError *err = meta1_backend_user_create(m1, url); if (NULL != err) reply->send_error(0, err); else reply->send_reply(CODE_FINAL_OK, "Created"); oio_url_clean (url); return TRUE; }
static gboolean meta1_dispatch_v2_USERINFO(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored UNUSED) { struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); gchar **info = NULL; GError *err = meta1_backend_user_info(m1, url, &info); if (NULL != err) reply->send_error(0, err); else { reply->add_body(encode_and_clean(STRV_encode_gba, info)); reply->send_reply(CODE_FINAL_OK, "OK"); } oio_url_clean (url); return TRUE; }
static void _append_url (GString *gs, struct oio_url_s *url) { void _append (const char *n, const char *v) { if (v) g_string_append_printf (gs, "\"%s\":\"%s\"", n, v); else g_string_append_printf (gs, "\"%s\":null", n); } _append ("ns", oio_url_get(url, OIOURL_NS)); g_string_append_c (gs, ','); _append ("account", oio_url_get(url, OIOURL_ACCOUNT)); g_string_append_c (gs, ','); _append ("user", oio_url_get(url, OIOURL_USER)); g_string_append_c (gs, ','); _append ("type", oio_url_get(url, OIOURL_TYPE)); g_string_append_c (gs, ','); _append ("id", oio_url_get(url, OIOURL_HEXID)); }
static gboolean meta1_dispatch_v2_SRV_ALLONM1(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored UNUSED) { struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); reply->send_reply(CODE_TEMPORARY, "Received"); gchar **result = NULL; GError *err = meta1_backend_services_all(m1, url, &result); if (NULL != err) reply->send_error(0, err); else { reply->add_body(encode_and_clean(STRV_encode_gba, result)); reply->send_reply(CODE_FINAL_OK, "OK"); } oio_url_clean (url); return TRUE; }
static void _get_meta2_realtype (struct req_args_s *args, gchar *d, gsize dlen, const char *prefix) { const char *type = oio_url_get (args->url, OIOURL_TYPE); if (type && *type) { g_snprintf(d, dlen, "%s%s.%s", prefix, NAME_SRVTYPE_META2, type); } else { g_snprintf(d, dlen, "%s%s", prefix, NAME_SRVTYPE_META2); } }
static void _test_url (guint idx, struct oio_url_s *u, struct test_data_s *td) { (void) idx; _test_field (td->whole, u, OIOURL_WHOLE); _test_field (td->ns, u, OIOURL_NS); _test_field (td->account, u, OIOURL_ACCOUNT); _test_field (td->ref, u, OIOURL_USER); _test_field (td->type, u, OIOURL_TYPE); _test_field (td->path, u, OIOURL_PATH); if (td->hexa) { g_assert (oio_url_has (u, OIOURL_HEXID)); g_assert (NULL != oio_url_get_id (u)); g_assert (!g_ascii_strcasecmp (oio_url_get (u, OIOURL_HEXID), td->hexa)); } else { g_assert (!oio_url_has (u, OIOURL_HEXID)); g_assert (NULL == oio_url_get_id (u)); g_assert (NULL == oio_url_get (u, OIOURL_HEXID)); } }
static void cli_action(void) { /* Use the client to get a sqlx service */ GRID_DEBUG("Locating [%s] CID[%s]", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); gchar **srvurlv = NULL; GError *err = hc_resolve_reference_service(resolver, url, type, &srvurlv); if (err != NULL) { GRID_ERROR("Services resolution error: (%d) %s", err->code, err->message); grid_main_set_status(1); return; } if (!srvurlv || !*srvurlv) { GRID_ERROR("Services resolution error: (%d) %s", 0, "No service found"); grid_main_set_status(1); return; } for (gchar **s=srvurlv; *s ;s++) GRID_DEBUG("Located [%s]", *s); gint rc = 0; for (gchar **s=srvurlv; !rc && *s ;s++) { struct meta1_service_url_s *surl; if (!(surl = meta1_unpack_url(*s))) g_printerr("Invalid service URL from meta1 [%s]\n", *s); else { if (!g_ascii_strcasecmp("destroy", query[0])) { rc = do_destroy2(surl); } else { rc = do_queryv(surl); } g_free(surl); } } g_strfreev(srvurlv); }
void sqlx_name_fill_type_asis (struct sqlx_name_mutable_s *n, struct oio_url_s *url, const char *srvtype, gint64 seq) { EXTRA_ASSERT (n != NULL); EXTRA_ASSERT (url != NULL); EXTRA_ASSERT (srvtype != NULL); n->ns = g_strdup(oio_url_get (url, OIOURL_NS)); if (!strcmp(srvtype, NAME_SRVTYPE_META0)) { n->base = g_strdup (oio_url_get (url, OIOURL_NS)); } else if (!strcmp(srvtype, NAME_SRVTYPE_META1)) { n->base = g_strndup (oio_url_get(url, OIOURL_HEXID), 4); } else { n->base = g_strdup_printf ("%s.%"G_GINT64_FORMAT, oio_url_get (url, OIOURL_HEXID), seq); } n->type = g_strdup (srvtype); }
static void _test_field (const char *v, struct oio_url_s *u, enum oio_url_field_e f) { const char *found = oio_url_get (u, f); if (v) { g_assert (oio_url_has (u, f)); g_assert (!strcmp (v, found)); } else { g_assert (!oio_url_has (u, f)); g_assert (NULL == found); } }
static gboolean meta1_dispatch_v2_SRV_CONFIG(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { GError *err; gchar *m1url = NULL; struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); (void) ignored; if (NULL != (err = metautils_message_extract_body_string(reply->request, &m1url))) reply->send_error(CODE_BAD_REQUEST, err); else if (NULL != (err = meta1_backend_services_config(m1, url, m1url))) reply->send_error(0, err); else reply->send_reply(CODE_FINAL_OK, "OK"); g_free0 (m1url); oio_url_clean (url); return TRUE; }
static gboolean meta1_dispatch_v2_USERINFO(struct gridd_reply_ctx_s *reply, struct meta1_backend_s *m1, gpointer ignored) { GError *err; gchar **info = NULL; struct oio_url_s *url = metautils_message_extract_url (reply->request); reply->subject("%s|%s", oio_url_get(url, OIOURL_WHOLE), oio_url_get(url, OIOURL_HEXID)); (void) ignored; if (NULL != (err = meta1_backend_user_info(m1, url, &info))) reply->send_error(0, err); else { reply->add_body(marshall_stringv_and_clean(&info)); reply->send_reply(CODE_FINAL_OK, "OK"); } if (info) g_strfreev (info); oio_url_clean (url); return TRUE; }