
On Thu, Nov 29, 2012 at 01:16:09PM -0500, Eric Blake wrote:
To be able todo controlled shutdown/reboot of containers an
s/todo/to do/
API to talk to init via /dev/initctl is required. Fortunately this is quite straightforward to implement, and is supported by both sysvinit and systemd. Upstart support for /dev/initctl is unclear.
+++ b/src/util/virinitctl.c @@ -0,0 +1,161 @@
+ +/* These constants & struct definitions are taken from + * systemd, under terms of LGPLv2+ + * + * initreq.h Interface to talk to init through /dev/initctl. + * + * Copyright (C) 1995-2004 Miquel van Smoorenburg + */
Thankfully, compatible with our usage.
+ +#if defined(__FreeBSD_kernel__) +# define VIR_INITCTL_FIFO "/etc/.initctl" +#else +# define VIR_INITCTL_FIFO "/dev/initctl" +#endif + +#define VIR_INITCTL_MAGIC 0x03091969
Wonder if the original author of this code picked a birthdate. Gotta love the Easter eggs present in open source software :)
+ +/* + * Because of legacy interfaces, "runlevel" and "sleeptime" + * aren't in a separate struct in the union. + * + * The weird sizes are because init expects the whole + * struct to be 384 bytes. + */ +struct virInitctlRequest { + int magic; /* Magic number */
'int' is not necessarily 4 bytes; I would feel slightly more comfortable had upstream used int32_t. I know you are just copying code from an existing header (so don't change the struct itself), but wonder if we should at least add our own sanity checking:
verify(sizeof(virInitctlRequest)) == 384);
I'm just adding the verify, since I think that's the more important thing todo.
+ + if ((fd = open(path, O_WRONLY|O_NDELAY|O_CLOEXEC|O_NOCTTY)) < 0)
O_NDELAY is non-standard. I would spell it according to POSIX as O_NONBLOCK.
Yep, good point.
+typedef enum virInitctlRunLevel virInitctlRunLevel; +enum virInitctlRunLevel { + VIR_INITCTL_RUNLEVEL_POWEROFF = 0, + VIR_INITCTL_RUNLEVEL_1 = 1, + VIR_INITCTL_RUNLEVEL_2 = 2, + VIR_INITCTL_RUNLEVEL_3 = 3, + VIR_INITCTL_RUNLEVEL_4 = 4, + VIR_INITCTL_RUNLEVEL_5 = 5, + VIR_INITCTL_RUNLEVEL_REBOOT = 6,
Should you add VIR_INITCTL_RUNLEVEL_LAST, in case we ever expand this list?
Unlikely, but doesn't hurt to have a sentinal 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 :|