diff options
-rw-r--r-- | src/afb-api-ws.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/afb-api-ws.c b/src/afb-api-ws.c index 4d1f08c8..a56cfbef 100644 --- a/src/afb-api-ws.c +++ b/src/afb-api-ws.c @@ -46,6 +46,7 @@ #include "afb-evt.h" #include "afb-subcall.h" #include "verbose.h" +#include "sd-fds.h" struct api_ws_memo; struct api_ws_event; @@ -212,7 +213,9 @@ static struct api_ws *api_ws_make(const char *path) memcpy(api->path, path, length + 1); /* api name is at the end of the path */ - api->api = strrchr(api->path, '/'); + while (length && path[length - 1] != '/' && path[length - 1] != ':') + length = length - 1; + api->api = &api->path[length]; if (api->api == NULL || !afb_apis_is_valid_api_name(++api->api)) { errno = EINVAL; goto error2; @@ -314,21 +317,29 @@ static int api_ws_socket(const char *path, int server) { int fd, rc; - /* check for unix socket */ - if (0 == strncmp(path, "unix:", 5)) - fd = api_ws_socket_unix(path + 5, server); - else - fd = api_ws_socket_inet(path, server); - - if (fd >= 0) { - fcntl(fd, F_SETFD, FD_CLOEXEC); - fcntl(fd, F_SETFL, O_NONBLOCK); - if (server) { + /* check for systemd socket */ + if (0 == strncmp(path, "sd:", 3)) + fd = sd_fds_for(path + 3); + else { + /* check for unix socket */ + if (0 == strncmp(path, "unix:", 5)) + /* unix socket */ + fd = api_ws_socket_unix(path + 5, server); + else + /* inet socket */ + fd = api_ws_socket_inet(path, server); + + if (fd >= 0 && server) { rc = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &rc, sizeof rc); rc = listen(fd, 5); } } + /* configure the socket */ + if (fd >= 0) { + fcntl(fd, F_SETFD, FD_CLOEXEC); + fcntl(fd, F_SETFL, O_NONBLOCK); + } return fd; } |