[libvirt] [PATCH 1/3] Add APIs for talking to init via /dev/initctl

Daniel P. Berrange berrange at redhat.com
Fri Nov 30 13:31:46 UTC 2012


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 :|




More information about the libvir-list mailing list