From: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
To: xen-devel@lists.xenproject.org
Cc: "Luis R. Rodriguez" <mcgrof@suse.com>
Subject: [PATCH v4 04/15] cxenstored: add support for systemd active sockets
Date: Tue, 29 Apr 2014 18:11:57 -0700 [thread overview]
Message-ID: <1398820328-15132-5-git-send-email-mcgrof@do-not-panic.com> (raw)
In-Reply-To: <1398820328-15132-1-git-send-email-mcgrof@do-not-panic.com>
From: "Luis R. Rodriguez" <mcgrof@suse.com>
This adds systemd socket activation support for the C xenstored.
Active sockets enable xenstored to be loaded only if required by a system
onto which Xen is installed on. Socket activation is handled by
systemd, once a port for a service which claims a socket is used
systemd will start the required services for it, on demand. For more
details on socket activation refer to Lennart's socket-activation
post regarding this [0].
Right now this code adds a no-op for this functionality, leaving the
enablement to be done later once systemd is properly hooked into
the build system. The socket activation is ordered in aligment with
the socket activation order passed on to systemd.
[0] http://0pointer.de/blog/projects/socket-activation2.html
Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
---
tools/xenstore/xs.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 125 insertions(+)
diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c
index f1d0f99..9bbf736 100644
--- a/tools/xenstore/xs.c
+++ b/tools/xenstore/xs.c
@@ -1,6 +1,7 @@
/*
Xen Store Daemon interface providing simple tree-like database.
Copyright (C) 2005 Rusty Russell IBM Corporation
+ Copyright (C) 2014 Luis R. Rodriguez <mcgrof@suse.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -34,6 +35,10 @@
#include <errno.h>
#include <config.h>
+#if defined(HAVE_SYSTEMD)
+#include <systemd/sd-daemon.h>
+#endif
+
#include "xenstore.h"
#include "list.h"
#include "utils.h"
@@ -182,11 +187,131 @@ int xs_fileno(struct xs_handle *h)
return h->watch_pipe[0];
}
+#if defined(HAVE_SYSTEMD)
+
+/* Conforms to what we should send sd_is_socket_unix() */
+struct xen_systemd_active_socket {
+ int fd;
+ int type;
+ int listening;
+ const char *path;
+ size_t length;
+};
+
+/*
+ * We list stdin, stdout and stderr simply for documentation purposes
+ * and to help our array size fit the number of expected sockets we
+ * as sd_listen_fds() will return 5 for example if you set the socket
+ * service with 2 sockets.
+ */
+static struct xen_systemd_active_socket xenstore_active_sockets[] = {
+ {
+ .fd = SD_LISTEN_FDS_START -3,
+ .type = 0,
+ .listening = 0,
+ .path = "stdin",
+ .length = 0,
+ },
+ {
+ .fd = SD_LISTEN_FDS_START - 2,
+ .type = 0,
+ .listening = 0,
+ .path = "stderr",
+ .length = 0,
+ },
+ {
+ .fd = SD_LISTEN_FDS_START - 1,
+ .type = 0,
+ .listening = 0,
+ .path = "stderr",
+ .length = 0,
+ },
+ {
+ .fd = SD_LISTEN_FDS_START,
+ .type = SOCK_STREAM,
+ .listening = 0,
+ .path = "/var/run/xenstored/socket",
+ .length = 0,
+ },
+ {
+ .fd = SD_LISTEN_FDS_START + 1,
+ .type = SOCK_STREAM,
+ .listening = 0,
+ .path = "/var/run/xenstored/socket_ro",
+ .length = 0,
+ },
+};
+
+static struct xen_systemd_active_socket *get_xen_active_socket(const char *connect_to)
+{
+ unsigned int i;
+
+ for (i=0; i<ARRAY_SIZE(xenstore_active_sockets); i++) {
+ if (!strcmp(connect_to, xenstore_active_sockets[i].path)) {
+ if (!xenstore_active_sockets[i].type)
+ return NULL;
+ return &xenstore_active_sockets[i];
+ }
+ }
+
+ return NULL;
+}
+
+static int xs_get_active_socket(const char *connect_to)
+{
+ int n, r;
+ struct xen_systemd_active_socket *active_socket;
+
+ active_socket = get_xen_active_socket(connect_to);
+ if (!active_socket)
+ return -1;
+
+ n = sd_listen_fds(0);
+ if (n <= 0)
+ return -1;
+ else if (n >= (ARRAY_SIZE(xenstore_active_sockets)))
+ return -1;
+
+ r = sd_is_socket_unix(active_socket->fd,
+ active_socket->type,
+ active_socket->listening,
+ active_socket->path,
+ active_socket->length);
+ if (r < 0)
+ return r;
+
+ return active_socket->fd;
+}
+
+/*
+ * If xenstored was built to depend on systemd libraries
+ * we assume you want all the bells and whistles with
+ * systemd.
+ */
+static int xs_active_socket_required(void)
+{
+ return 1;
+}
+#else
+static int xs_get_active_socket(const char *connect_to)
+{
+ return -1;
+}
+
+static int xs_active_socket_required(void)
+{
+ return 0;
+}
+#endif
+
static int get_socket(const char *connect_to)
{
struct sockaddr_un addr;
int sock, saved_errno, flags;
+ if (xs_active_socket_required())
+ return xs_get_active_socket(connect_to);
+
sock = socket(PF_UNIX, SOCK_STREAM, 0);
if (sock < 0)
return -1;
--
1.9.0
next prev parent reply other threads:[~2014-04-30 1:12 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-30 1:11 [PATCH v4 00/15] xen: add systemd support Luis R. Rodriguez
2014-04-30 1:11 ` [PATCH v4 01/15] xenstore: add support for a retry open limit on xenstored Luis R. Rodriguez
2014-05-07 15:03 ` Ian Campbell
2014-05-12 13:50 ` Ian Jackson
2014-05-12 14:18 ` Ian Campbell
2014-05-12 14:40 ` Jacek Konieczny
2014-05-12 15:37 ` Ian Jackson
2014-05-12 18:59 ` Luis R. Rodriguez
2014-05-13 21:33 ` Luis R. Rodriguez
2014-04-30 1:11 ` [PATCH v4 02/15] xencommons: use the retry limit instead of implementing our own timeout Luis R. Rodriguez
2014-04-30 9:33 ` Andrew Cooper
2014-04-30 16:36 ` Luis R. Rodriguez
2014-05-07 15:05 ` Ian Campbell
2014-04-30 1:11 ` [PATCH v4 03/15] xenstored: enable usage of config.h on both xenstored and oxenstored Luis R. Rodriguez
2014-05-07 15:06 ` Ian Campbell
2014-04-30 1:11 ` Luis R. Rodriguez [this message]
2014-05-07 15:18 ` [PATCH v4 04/15] cxenstored: add support for systemd active sockets Ian Campbell
2014-05-07 15:46 ` Ian Campbell
2014-05-13 22:17 ` Luis R. Rodriguez
2014-05-14 8:44 ` Ian Campbell
2014-05-15 1:50 ` Luis R. Rodriguez
2014-04-30 1:11 ` [PATCH v4 05/15] oxenstored: " Luis R. Rodriguez
2014-04-30 8:35 ` Dave Scott
2014-04-30 17:30 ` Luis R. Rodriguez
2014-05-01 10:21 ` Dave Scott
2014-04-30 9:27 ` Anil Madhavapeddy
2014-04-30 17:35 ` Luis R. Rodriguez
2014-05-01 9:16 ` Anil Madhavapeddy
2014-05-07 15:20 ` Ian Campbell
2014-05-12 19:09 ` Luis R. Rodriguez
2014-05-12 13:57 ` Ian Jackson
2014-05-12 18:11 ` Luis R. Rodriguez
2014-05-13 8:53 ` Ian Campbell
2014-04-30 1:11 ` [PATCH v4 06/15] tools/xendomains: make xl the default Luis R. Rodriguez
2014-04-30 7:02 ` Olaf Hering
2014-04-30 17:43 ` Luis R. Rodriguez
2014-05-07 15:21 ` Ian Campbell
2014-04-30 1:12 ` [PATCH v4 07/15] tools/xendomains: do space cleanups Luis R. Rodriguez
2014-04-30 1:12 ` [PATCH v4 08/15] tools/xendomains: move to libexec and use a smaller init helper Luis R. Rodriguez
2014-05-07 15:24 ` Ian Campbell
2014-05-13 22:21 ` Luis R. Rodriguez
2014-04-30 1:12 ` [PATCH v4 09/15] autoconf: xen: force a refresh with autoconf Luis R. Rodriguez
2014-05-07 15:25 ` Ian Campbell
2014-05-07 16:12 ` Roger Pau Monné
2014-05-07 16:21 ` Ian Campbell
2014-05-07 16:44 ` Roger Pau Monné
2014-05-07 18:28 ` Luis R. Rodriguez
2014-05-12 14:00 ` Ian Jackson
2014-05-12 18:14 ` Luis R. Rodriguez
2014-04-30 1:12 ` [PATCH v4 10/15] autoconf: update m4/pkg.m4 Luis R. Rodriguez
2014-05-07 15:28 ` Ian Campbell
2014-05-13 22:32 ` Luis R. Rodriguez
2014-05-07 16:17 ` Roger Pau Monné
2014-04-30 1:12 ` [PATCH v4 11/15] autoconf: xen: move standard variables to a generic place Luis R. Rodriguez
2014-04-30 6:52 ` Jan Beulich
[not found] ` <5360B9CB020000780000D9BB@suse.com>
2014-04-30 17:53 ` Luis R. Rodriguez
2014-05-02 8:12 ` Jan Beulich
2014-05-13 23:03 ` Luis R. Rodriguez
2014-04-30 1:12 ` [PATCH v4 12/15] autoconf: xen: peg the xenstored preference onto the top level config Luis R. Rodriguez
2014-05-07 15:32 ` Ian Campbell
2014-05-13 23:05 ` Luis R. Rodriguez
2014-04-30 1:12 ` [PATCH v4 13/15] systemd: add xen systemd service and module files Luis R. Rodriguez
2014-05-07 15:46 ` Ian Campbell
2014-05-12 18:22 ` Luis R. Rodriguez
2014-05-13 23:28 ` Luis R. Rodriguez
2014-05-12 14:11 ` Ian Jackson
2014-05-12 14:32 ` Jacek Konieczny
2014-05-12 15:36 ` Ian Jackson
2014-05-12 18:55 ` Luis R. Rodriguez
2014-05-12 18:46 ` Luis R. Rodriguez
2014-05-13 8:57 ` Ian Campbell
2014-04-30 1:12 ` [PATCH v4 14/15] autoconf: xen: add systemd support into the build system Luis R. Rodriguez
2014-05-07 16:40 ` Roger Pau Monné
2014-05-15 1:58 ` Luis R. Rodriguez
2014-05-15 9:02 ` Ian Campbell
2014-04-30 1:12 ` [PATCH v4 15/15] autoconf: xen: trigger an update with autogen.sh Luis R. Rodriguez
2014-05-07 15:47 ` Ian Campbell
2014-05-07 18:34 ` Luis R. Rodriguez
2014-05-08 8:42 ` Ian Campbell
2014-04-30 1:15 ` [PATCH v4 00/15] xen: add systemd support Luis R. Rodriguez
2014-05-07 15:18 ` Ian Campbell
2014-05-08 11:28 ` Anthony PERARD
2014-05-15 2:12 ` Luis R. Rodriguez
2014-05-15 6:14 ` Luis R. Rodriguez
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1398820328-15132-5-git-send-email-mcgrof@do-not-panic.com \
--to=mcgrof@do-not-panic.com \
--cc=mcgrof@suse.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).