diff options
-rw-r--r-- | src/afb-api-ws.c | 7 | ||||
-rw-r--r-- | src/afb-stub-ws.c | 46 | ||||
-rw-r--r-- | src/afb-stub-ws.h | 9 |
3 files changed, 47 insertions, 15 deletions
diff --git a/src/afb-api-ws.c b/src/afb-api-ws.c index dba8d05b..07c8202f 100644 --- a/src/afb-api-ws.c +++ b/src/afb-api-ws.c @@ -226,9 +226,14 @@ int afb_api_ws_add_client(const char *path, struct afb_apiset *apiset) ERROR("can't setup client ws service to %s", apiws->path); goto error3; } + if (afb_stub_ws_client_add(stubws, apiset) < 0) { + ERROR("can't add the client to the apiset for service %s", apiws->path); + goto error4; + } free(apiws); return 0; - +error4: + afb_stub_ws_unref(stubws); error3: close(apiws->fd); error2: diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index 351b3320..ce68b441 100644 --- a/src/afb-stub-ws.c +++ b/src/afb-stub-ws.c @@ -144,7 +144,7 @@ struct server_describe uint32_t descid; }; -/******************* client description part for server *****************************/ +/******************* stub description for client or servers ******************/ struct afb_stub_ws { @@ -181,6 +181,9 @@ struct afb_stub_ws /* apiset */ struct afb_apiset *apiset; + /* on hangup callback */ + void (*on_hangup)(struct afb_stub_ws *); + /* the api name */ char apiname[1]; }; @@ -1205,6 +1208,8 @@ static void server_on_hangup(void *closure) if (stubws->fd >= 0) { close(stubws->fd); stubws->fd = -1; + if (stubws->on_hangup) + stubws->on_hangup(stubws); } /* release the client */ @@ -1272,19 +1277,7 @@ static struct afb_stub_ws *afb_stub_ws_create(int fd, const char *apiname, struc struct afb_stub_ws *afb_stub_ws_create_client(int fd, const char *apiname, struct afb_apiset *apiset) { - struct afb_api afb_api; - struct afb_stub_ws *stubws; - - stubws = afb_stub_ws_create(fd, apiname, apiset, &stub_ws_client_ws_itf); - if (stubws) { - afb_api.closure = stubws; - afb_api.itf = &ws_api_itf; - if (afb_apiset_add(apiset, stubws->apiname, afb_api) >= 0) - return stubws; - afb_stub_ws_unref(stubws); - } - return NULL; - + return afb_stub_ws_create(fd, apiname, apiset, &stub_ws_client_ws_itf); } struct afb_stub_ws *afb_stub_ws_create_server(int fd, const char *apiname, struct afb_apiset *apiset) @@ -1327,3 +1320,28 @@ void afb_stub_ws_addref(struct afb_stub_ws *stubws) __atomic_add_fetch(&stubws->refcount, 1, __ATOMIC_RELAXED); } +void afb_stub_ws_on_hangup(struct afb_stub_ws *stubws, void (*on_hangup)(struct afb_stub_ws*)) +{ + stubws->on_hangup = on_hangup; +} + +const char *afb_stub_ws_name(struct afb_stub_ws *stubws) +{ + return stubws->apiname; +} + +struct afb_api afb_stub_ws_client_api(struct afb_stub_ws *stubws) +{ + struct afb_api api; + + assert(!stubws->listener); /* check client */ + api.closure = stubws; + api.itf = &ws_api_itf; + return api; +} + +int afb_stub_ws_client_add(struct afb_stub_ws *stubws, struct afb_apiset *apiset) +{ + return afb_apiset_add(apiset, stubws->apiname, afb_stub_ws_client_api(stubws)); +} + diff --git a/src/afb-stub-ws.h b/src/afb-stub-ws.h index 33ab5b2f..4e07f982 100644 --- a/src/afb-stub-ws.h +++ b/src/afb-stub-ws.h @@ -20,6 +20,7 @@ struct afb_stub_ws; struct afb_apiset; +struct afb_api; extern struct afb_stub_ws *afb_stub_ws_create_client(int fd, const char *apiname, struct afb_apiset *apiset); @@ -29,3 +30,11 @@ extern void afb_stub_ws_unref(struct afb_stub_ws *stubws); extern void afb_stub_ws_addref(struct afb_stub_ws *stubws); +extern void afb_stub_ws_on_hangup(struct afb_stub_ws *stubws, void (*on_hangup)(struct afb_stub_ws*)); + +extern const char *afb_stub_ws_name(struct afb_stub_ws *stubws); + +extern struct afb_api afb_stub_ws_client_api(struct afb_stub_ws *stubws); + +extern int afb_stub_ws_client_add(struct afb_stub_ws *stubws, struct afb_apiset *apiset); + |