From 5d0e19fcc1cea77a72647cf96c5d3d773e8ee277 Mon Sep 17 00:00:00 2001 From: Tomasz Torcz Date: Wed, 28 Nov 2012 13:37:07 +0100 Subject: iscsid: implement systemd-compatible socket activation --- usr/mgmt_ipc.c | 29 +++++++++++++++++++++++++++++ usr/mgmt_ipc.h | 1 + 2 files changed, 30 insertions(+) diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c index a1dafc9..87bd346 100644 --- a/usr/mgmt_ipc.c +++ b/usr/mgmt_ipc.c @@ -39,6 +39,7 @@ #define PEERUSER_MAX 64 #define EXTMSG_MAX (64 * 1024) +#define SD_SOCKET_FDS_START 3 int mgmt_ipc_listen(void) @@ -46,6 +47,12 @@ mgmt_ipc_listen(void) int fd, err, addr_len; struct sockaddr_un addr; + /* first check if we have fd handled by systemd */ + fd = mgmt_ipc_systemd(); + if (fd >= 0) + return fd; + + /* manually establish a socket */ fd = socket(AF_LOCAL, SOCK_STREAM, 0); if (fd < 0) { log_error("Can not create IPC socket"); @@ -73,6 +80,28 @@ mgmt_ipc_listen(void) return fd; } +int mgmt_ipc_systemd(void) +{ + const char *env; + + env = getenv("LISTEN_PID"); + + if (!env || (strtoul(env, NULL, 10) != getpid())) + return -EINVAL; + + env = getenv("LISTEN_FDS"); + + if (!env) + return -EINVAL; + + if (strtoul(env, NULL, 10) != 1) { + log_error("Did not receive exactly one IPC socket from systemd"); + return -EINVAL; + } + + return SD_SOCKET_FDS_START; +} + void mgmt_ipc_close(int fd) { diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h index 7d8ce72..55972ed 100644 --- a/usr/mgmt_ipc.h +++ b/usr/mgmt_ipc.h @@ -112,6 +112,7 @@ typedef int mgmt_ipc_fn_t(struct queue_task *); struct queue_task; void mgmt_ipc_write_rsp(struct queue_task *qtask, int err); int mgmt_ipc_listen(void); +int mgmt_ipc_systemd(void); void mgmt_ipc_close(int fd); void mgmt_ipc_handle(int accept_fd); -- 1.7.11.7