On Tue, Sep 30, 2014 at 12:01:13PM -0500, Rick Harris wrote:
Newer versions of Debian use `/run/initctl` instead of
`/dev/initctl`. This
patch updates the code to search for the FIFO from a list of well-known
locations.
In the FreeBSD case, as before, we fall-back to the `/etc/.initctl` stub.
---
src/util/virinitctl.c | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/src/util/virinitctl.c b/src/util/virinitctl.c
index a6fda3b..c4b48d4 100644
--- a/src/util/virinitctl.c
+++ b/src/util/virinitctl.c
@@ -46,12 +46,6 @@
* Copyright (C) 1995-2004 Miquel van Smoorenburg
*/
-# if defined(__FreeBSD_kernel__)
-# define VIR_INITCTL_FIFO "/etc/.initctl"
-# else
-# define VIR_INITCTL_FIFO "/dev/initctl"
-# endif
-
# define VIR_INITCTL_MAGIC 0x03091969
# define VIR_INITCTL_CMD_START 0
# define VIR_INITCTL_CMD_RUNLVL 1
@@ -124,6 +118,13 @@ virInitctlSetRunLevel(virInitctlRunLevel level)
struct virInitctlRequest req;
int fd = -1;
int ret = -1;
+ const char *initctl_fifo = NULL;
+ size_t i = 0;
+ const char *initctl_fifos[] = {
+ "/run/initctl",
+ "/dev/initctl",
+ "/etc/.initctl",
+ };
So this means we will check the Linux paths on FreeBSD hosts and
vica-verca. I guess this ultimately doesn't really matter.
memset(&req, 0, sizeof(req));
@@ -133,22 +134,31 @@ virInitctlSetRunLevel(virInitctlRunLevel level)
/* Yes it is an 'int' field, but wants a numeric character. Go figure */
req.runlevel = '0' + level;
- if ((fd = open(VIR_INITCTL_FIFO,
- O_WRONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY)) < 0) {
- if (errno == ENOENT) {
- ret = 0;
+ for (i = 0; i < ARRAY_CARDINALITY(initctl_fifos); i++) {
+ initctl_fifo = initctl_fifos[i];
+
+ if ((fd = open(initctl_fifo,
+ O_WRONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY)) >= 0)
+ break;
+
+ if (errno != ENOENT) {
+ virReportSystemError(errno,
+ _("Cannot open init control %s"),
+ initctl_fifo);
goto cleanup;
}
- virReportSystemError(errno,
- _("Cannot open init control %s"),
- VIR_INITCTL_FIFO);
+ }
+
+ /* Ensure we found a valid initctl fifo */
+ if (fd < 0) {
+ ret = 0;
goto cleanup;
}
if (safewrite(fd, &req, sizeof(req)) != sizeof(req)) {
virReportSystemError(errno,
_("Failed to send request to init control %s"),
- VIR_INITCTL_FIFO);
+ initctl_fifo);
goto cleanup;
}
ACK, this looks sane to me.
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|