- 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;
+ 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);
+ *result = afb_msg_json_internal_error();
+ rc = 0;
+ } else {
+ /* initialises the request */
+ svcreq->jobloop = NULL;
+ svcreq->callback = NULL;
+ svcreq->result = NULL;
+ svcreq->iserror = 1;
+ afb_xreq_addref(&svcreq->xreq);
+ rc = jobs_enter(NULL, 0, svcreq_sync_enter, svcreq);
+ rc = rc >= 0 && !svcreq->iserror;
+ *result = (rc || svcreq->result) ? svcreq->result : afb_msg_json_internal_error();
+ afb_xreq_unref(&svcreq->xreq);
+ }
+ HOOK(callsync_result, svc, rc, *result);
+ return rc;