afb-systemd: Integrate sd-fds features
[src/app-framework-binder.git] / src / afb-api-ws.c
index dffe126..7fbe5be 100644 (file)
 #include <systemd/sd-event.h>
 #include "afb-api.h"
 #include "afb-apiset.h"
-#include "afb-common.h"
+#include "afb-systemd.h"
 #include "afb-stub-ws.h"
 #include "verbose.h"
-#include "sd-fds.h"
 
 struct api_ws
 {
@@ -73,7 +72,7 @@ static struct api_ws *api_ws_make(const char *path)
        while (length && path[length - 1] != '/' && path[length - 1] != ':')
                length = length - 1;
        api->api = &api->path[length];
-       if (api->api == NULL || !afb_api_is_valid_name(api->api)) {
+       if (api->api == NULL || !afb_api_is_valid_name(api->api, 1)) {
                errno = EINVAL;
                goto error2;
        }
@@ -169,7 +168,6 @@ static int api_ws_socket_inet(const char *path, int server)
        }
        freeaddrinfo(rai);
        return -1;
-       
 }
 
 static int api_ws_socket(const char *path, int server)
@@ -178,7 +176,7 @@ static int api_ws_socket(const char *path, int server)
 
        /* check for systemd socket */
        if (0 == strncmp(path, "sd:", 3))
-               fd = sd_fds_for(path + 3);
+               fd = systemd_fds_for(path + 3);
        else {
                /* check for unix socket */
                if (0 == strncmp(path, "unix:", 5))
@@ -204,7 +202,7 @@ static int api_ws_socket(const char *path, int server)
 
 /**********************************************************************************/
 
-int afb_api_ws_add_client(const char *path, struct afb_apiset *apiset)
+int afb_api_ws_add_client(const char *path, struct afb_apiset *apiset, int strong)
 {
        struct api_ws *apiws;
        struct afb_stub_ws *stubws;
@@ -239,7 +237,17 @@ error3:
 error2:
        free(apiws);
 error:
-       return -1;
+       return -!!strong;
+}
+
+int afb_api_ws_add_client_strong(const char *path, struct afb_apiset *apiset)
+{
+       return afb_api_ws_add_client(path, apiset, 1);
+}
+
+int afb_api_ws_add_client_weak(const char *path, struct afb_apiset *apiset)
+{
+       return afb_api_ws_add_client(path, apiset, 0);
 }
 
 static int api_ws_server_accept_client(struct api_ws *apiws, int fd)
@@ -301,7 +309,7 @@ static int api_ws_server_connect(struct api_ws *apiws)
                ERROR("can't create socket %s", apiws->path);
        else {
                /* listen for service */
-               rc = sd_event_add_io(afb_common_get_event_loop(),
+               rc = sd_event_add_io(afb_systemd_get_event_loop(),
                                &apiws->listensrc, apiws->fd, EPOLLIN,
                                api_ws_server_listen_callback, apiws);
                if (rc >= 0)
@@ -318,7 +326,6 @@ int afb_api_ws_add_server(const char *path, struct afb_apiset *apiset)
 {
        int rc;
        struct api_ws *apiws;
-       struct afb_api api;
 
        /* creates the ws api object */
        apiws = api_ws_make(path);
@@ -326,7 +333,7 @@ int afb_api_ws_add_server(const char *path, struct afb_apiset *apiset)
                goto error;
 
        /* check api name */
-       if (afb_apiset_get(apiset, apiws->api, &api)) {
+       if (!afb_apiset_lookup(apiset, apiws->api, 1)) {
                ERROR("Can't provide ws-server for %s: API %s doesn't exist", path, apiws->api);
                goto error2;
        }