summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2017-03-13 16:18:23 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2017-03-13 16:28:25 +0100
commite85e5d8ffe242f826b5f98e2834407b5d4c46690 (patch)
tree39a48653735a3bea22fcd2a48a080ee83e6838c4
parente2c431bcda7f057b4767c3e8142b9e0ca0d32bc6 (diff)
Integration of socket activation for services
The services provided using the option --ws-server can now be linked to socket activation of systemd. When afb-daemon is launched, the api to be provided by socket activation is declared by adding the option --ws-server=sd:APINAME Where APINAME is the name of the provided api. The binder looks to the prefix "sd:" to automatically use the "listen fd" of name APINAME for serving the api APINAME. In the socket activation unit the connection to this socket must be named using the directive FileDescriptorName as below: [socket] FileDescriptorName=APINAME ... Change-Id: I281e1a2b9fed3eac3bd0ee27b7f56df99df7bbd6 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r--src/afb-api-ws.c33
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;
}