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