[libvirt] [PATCH] build: fix build on platforms without ptsname_r
Eric Blake
eblake at redhat.com
Fri Nov 4 23:23:53 UTC 2011
On 11/03/2011 03:03 PM, Eric Blake wrote:
> MacOS lacks ptsname_r, and gnulib doesn't (yet) provide it.
> But we can avoid it altogether, by using gnulib openpty()
> instead. Note that we do _not_ want the pt_chown module;
> all systems that we currently port to can either properly do
> openpty() and/or grantpt(), or lack ptys altogether; we are
> not porting to any system that requires us to deal with the
> hassle of installing a setuid pt_chown helper just to satisfy
> gnulib's ability to provide openpty() on even more platforms.
>
> * .gnulib: Update to latest, for openpty fixes
> * bootstrap.conf (gnulib_modules): Add openpty, ttyname_r.
> (gnulib_tool_option_extras): Exclude pt_chown module.
> * src/util/util.c (virFileOpenTty): Rewrite in terms of openpty
> and ttyname_r.
> * src/util/util.h (virFileOpenTtyAt): Delete dead prototype.
> Reported by Justin Clift.
> ---
>
> I compile-tested this on Linux, but haven't yet tested this on
> MacOS, which is the driving force behind this patch. Meanwhile,
> it would be nice to run some LXC tests to ensure this all still
> works. I'm posting it now, to get the review started while I
> figure out how to run further tests.
I've now confirmed that this patch is sufficient to get compilation
working on FreeBSD 8.2; presumably, since MacOS is BSD-based, it will
also help compilation there (although I haven't yet been able to test that).
However, I also finally managed to test an LXC guest on Linux, and found
out this patch is incorrect:
> @@ -1177,47 +1179,65 @@ int virFileOpenTty(int *ttymaster,
> char **ttyName,
> int rawmode)
> {
> - int rc = -1;
> -
> - if ((*ttymaster = posix_openpt(O_RDWR|O_NOCTTY|O_NONBLOCK))< 0)
The old code set O_NONBLOCK on the master, but the new code fails to do
that, because openpty() lacks a flag argument. Furthermore, neither the
old nor new code was setting FD_CLOEXEC on the resulting fd; in general
a good thing to do in a multi-threaded app.
I've opened a glibc bug requesting that openpty be extended to give a
flags variant that could allow O_NONBLOCK and O_CLOEXEC. Meanwhile, I'm
working up a quick gnulib patch to provide the same functionality
(although gnulib will eventually want to match the glibc naming
convention, if Ulrich agrees to add it to glibc).
But getting a new interface in place is not a pre-req to 0.9.7; so for
now, I'll just post a v2 that sets the O_NONBLOCK flag properly.
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list