diff options
author | Richard Jones <rjones@redhat.com> | 2010-04-08 19:07:45 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2010-04-08 19:07:45 +0100 |
commit | e35debd642bea240609775610b68145dab0a634b (patch) | |
tree | 974a5924538888f46c4f4dec21a868f694c206a9 /src/guestfs.c | |
parent | dc5df3bfec706803e75a5f2454293db30e753249 (diff) | |
download | libguestfs-e35debd642bea240609775610b68145dab0a634b.tar.gz libguestfs-e35debd642bea240609775610b68145dab0a634b.tar.xz libguestfs-e35debd642bea240609775610b68145dab0a634b.zip |
If qemu dies during launch in "null vmchannel" mode, don't hang (RHBZ#579155).
Detect if qemu dies during launch by wait(2)-ing for it, and
then getting EOF on the qemu pipe. This was broken in null
vmchannel mode, causing a hang.
Diffstat (limited to 'src/guestfs.c')
-rw-r--r-- | src/guestfs.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/guestfs.c b/src/guestfs.c index d8c856a4..fe08cb56 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -2366,8 +2366,16 @@ accept_from_daemon (guestfs_h *g) int sock = -1; while (sock == -1) { + /* If the qemu process has died, clean up the zombie (RHBZ#579155). + * By partially polling in the select below we ensure that this + * function will be called eventually. + */ + waitpid (g->pid, NULL, WNOHANG); + rset2 = rset; - int r = select (max_fd+1, &rset2, NULL, NULL, NULL); + + struct timeval tv = { .tv_sec = 1, .tv_usec = 0 }; + int r = select (max_fd+1, &rset2, NULL, NULL, &tv); if (r == -1) { if (errno == EINTR || errno == EAGAIN) continue; |