afb-evt: Refactor processing of broadcasted events
[src/app-framework-binder.git] / src / afb-stub-ws.c
index 5dfacb7..4c6fafa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015-2018 "IoT.bzh"
+ * Copyright (C) 2015-2019 "IoT.bzh"
  * Author José Bollo <jose.bollo@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -145,7 +145,7 @@ struct afb_stub_ws
        uint8_t is_client;
 
        /* the api name */
-       char apiname[1];
+       char apiname[];
 };
 
 static struct afb_proto_ws *afb_stub_ws_create_proto(struct afb_stub_ws *stubws, struct fdev *fdev, uint8_t server);
@@ -266,6 +266,7 @@ static void client_api_call_cb(void * closure, struct afb_xreq *xreq)
                return;
        }
 
+       afb_xreq_unhooked_addref(xreq);
        rc = afb_proto_ws_client_call(
                        proto,
                        xreq->request.called_verb,
@@ -273,10 +274,10 @@ static void client_api_call_cb(void * closure, struct afb_xreq *xreq)
                        afb_session_uuid(xreq->context.session),
                        xreq,
                        xreq_on_behalf_cred_export(xreq));
-       if (rc >= 0)
-               afb_xreq_unhooked_addref(xreq);
-       else
+       if (rc < 0) {
                afb_xreq_reply(xreq, NULL, "internal", "can't send message");
+               afb_xreq_unhooked_unref(xreq);
+       }
 }
 
 static void client_on_description_cb(void *closure, struct json_object *data)
@@ -340,7 +341,7 @@ static void server_event_push_cb(void *closure, const char *event, int eventid,
        json_object_put(object);
 }
 
-static void server_event_broadcast_cb(void *closure, const char *event, int eventid, struct json_object *object)
+static void server_event_broadcast_cb(void *closure, const char *event, struct json_object *object)
 {
        struct afb_stub_ws *stubws = closure;
 
@@ -646,9 +647,9 @@ static void on_hangup(void *closure)
        }
 }
 
-static int enqueue_processing(void (*callback)(int signum, void* arg), void *arg)
+static int enqueue_processing(struct afb_proto_ws *proto, void (*callback)(int signum, void* arg), void *arg)
 {
-       return jobs_queue(NULL, 0, callback, arg);
+       return jobs_queue(proto, 0, callback, arg);
 }
 
 /*****************************************************/
@@ -672,7 +673,7 @@ static struct afb_stub_ws *afb_stub_ws_create(struct fdev *fdev, const char *api
 {
        struct afb_stub_ws *stubws;
 
-       stubws = calloc(1, sizeof *stubws + strlen(apiname));
+       stubws = calloc(1, sizeof *stubws + 1 + strlen(apiname));
        if (stubws == NULL)
                errno = ENOMEM;
        else {