- afb_subcall(&svcreq->context, api, verb, args, callback, closure, (struct afb_req){ .itf = &afb_svc_req_itf, .closure = svcreq });
+ struct afb_svc *svc = closure;
+ struct svc_req *svcreq;
+ struct json_object *resu;
+ int rc;
+
+ HOOK(callsync, svc, api, verb, args);
+
+ /* allocates the request */
+ svcreq = svcreq_create(svc, api, verb, args);
+ if (svcreq == NULL) {
+ ERROR("out of memory");
+ errno = ENOMEM;
+ json_object_put(args);
+ resu = afb_msg_json_internal_error();
+ rc = -1;
+ } else {
+ /* initialises the request */
+ svcreq->jobloop = NULL;
+ svcreq->callback = NULL;
+ svcreq->result = NULL;
+ svcreq->status = 0;
+ svcreq->async = 0;
+ afb_xreq_addref(&svcreq->xreq);
+ rc = jobs_enter(NULL, 0, svcreq_sync_enter, svcreq);
+ if (rc >= 0)
+ rc = svcreq->status;
+ resu = (rc >= 0 || svcreq->result) ? svcreq->result : afb_msg_json_internal_error();
+ afb_xreq_unref(&svcreq->xreq);
+ }
+ HOOK(callsync_result, svc, rc, resu);
+ if (result)
+ *result = resu;
+ else
+ json_object_put(resu);
+ return rc;