+static void xreq_hooked_subcall_req_reply_cb(void *closure, int status, struct json_object *result)
+{
+ struct subcall *subcall = closure;
+
+ afb_hook_xreq_subcall_req_result(subcall->caller, status, result);
+ subcall->hooked.callback2(subcall->hooked.closure, status, result, to_req(subcall->caller));
+}
+
+static void xreq_hooked_subcall_req_cb(void *closure, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*, struct afb_req), void *cb_closure)
+{
+ struct afb_xreq *xreq = closure;
+ struct subcall *subcall;
+
+ afb_hook_xreq_subcall_req(xreq, api, verb, args);
+ subcall = subcall_alloc(xreq, api, verb, args);
+ if (subcall == NULL) {
+ if (callback)
+ callback(cb_closure, 1, afb_msg_json_internal_error(), to_req(xreq));
+ json_object_put(args);
+ } else {
+ subcall->callback = xreq_hooked_subcall_req_reply_cb;
+ subcall->closure = subcall;
+ subcall->hooked.callback2 = callback;
+ subcall->hooked.closure = cb_closure;
+ subcall_process(subcall);
+ }
+}
+