[libvirt] [PATCH v2 1/8] util: abstract parsing of passed FDs into virGetListenFDs()

Martin Kletzander mkletzan at redhat.com
Tue Jul 22 15:32:11 UTC 2014


On Wed, Jul 16, 2014 at 08:29:55PM +0200, Martin Kletzander wrote:
>Since not only systemd can do this (we'll be doing it as well few
>patches later), change 'systemd' to 'caller' and fix LISTEN_FDS to
>LISTEN_PID where applicable.
>
>Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>---
> src/libvirt_private.syms  |  1 +
> src/locking/lock_daemon.c | 45 ++++-------------------------------------
> src/util/virutil.c        | 51 +++++++++++++++++++++++++++++++++++++++++++++++
> src/util/virutil.h        |  2 ++
> 4 files changed, 58 insertions(+), 41 deletions(-)
>
[...]
>diff --git a/src/util/virutil.c b/src/util/virutil.c
>index 95d1ff9..6f3f411 100644
>--- a/src/util/virutil.c
>+++ b/src/util/virutil.c
>@@ -2227,3 +2227,54 @@ void virUpdateSelfLastChanged(const char *path)
>         selfLastChanged = sb.st_ctime;
>     }
> }
>+
>+/*
>+ * virGetListenFDs:
>+ *
>+ * Parse LISTEN_PID and LISTEN_FDS passed from caller.
>+ *
>+ * Returns number of passed FDs.
>+ */
>+unsigned int
>+virGetListenFDs(void)
>+{
>+    const char *pidstr;
>+    const char *fdstr;
>+    unsigned long long procid;
>+    unsigned int nfds;
>+
>+    VIR_DEBUG("Setting up networking from caller");
>+
>+    if (!(pidstr = virGetEnvAllowSUID("LISTEN_PID"))) {
>+        VIR_DEBUG("No LISTEN_PID from caller");
>+        return 0;
>+    }
>+
>+    if (virStrToLong_ull(pidstr, NULL, 10, &procid) < 0) {
>+        VIR_DEBUG("Malformed LISTEN_PID from caller %s", pidstr);
>+        return 0;
>+    }
>+
>+    if ((pid_t)procid != getpid()) {
>+        VIR_DEBUG("LISTEN_PID %s is not for us %llu",
>+                  pidstr, (unsigned long long)getpid());
>+        return 0;
>+    }
>+
>+    if (!(fdstr = virGetEnvAllowSUID("LISTEN_FDS"))) {
>+        VIR_DEBUG("No LISTEN_FDS from caller");
>+        return 0;
>+    }
>+
>+    if (virStrToLong_ui(fdstr, NULL, 10, &nfds) < 0) {
>+        VIR_DEBUG("Malformed LISTEN_FDS from caller %s", fdstr);
>+        return 0;
>+    }
>+
>+    unsetenv("LISTEN_PID");
>+    unsetenv("LISTEN_FDS");
>+
>+    VIR_DEBUG("Got %u file descriptors", nfds);
>+
>+    return nfds;
>+}

Note (not just) to self (but also reviewers): This function should
probably set O_CLOEXEC flag on all the passed FDs, but I just realized
that now and am not sure whether this was already done in virtlockd or
not.

Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140722/bba1280d/attachment-0001.sig>


More information about the libvir-list mailing list