X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fguestfs.c;h=fe08cb56ffee46430171e41703e108c5f240d8be;hb=c3a68961859a617f7c574c528d0f8ac1fdbb53e1;hp=e235fdcdd84b62a08349764bec415a86f45ca883;hpb=977edb3185fe8f0cc01840227ac6d3ea1785d3c9;p=libguestfs.git diff --git a/src/guestfs.c b/src/guestfs.c index e235fdc..fe08cb5 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -1405,6 +1405,7 @@ guestfs__launch (guestfs_h *g) "libguestfs: warning: unexpected connection from UID %d to port %d\n", uid, null_vmchannel_sock); close (sock); + sock = -1; continue; } } @@ -1499,7 +1500,7 @@ guestfs__launch (guestfs_h *g) close (wfd[1]); close (rfd[0]); } - kill (g->pid, 9); + if (g->pid > 0) kill (g->pid, 9); if (g->recoverypid > 0) kill (g->recoverypid, 9); waitpid (g->pid, NULL, 0); if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0); @@ -1847,7 +1848,7 @@ guestfs__kill_subprocess (guestfs_h *g) if (g->verbose) fprintf (stderr, "sending SIGTERM to process %d\n", g->pid); - kill (g->pid, SIGTERM); + if (g->pid > 0) kill (g->pid, SIGTERM); if (g->recoverypid > 0) kill (g->recoverypid, 9); return 0; @@ -1998,7 +1999,7 @@ child_cleanup (guestfs_h *g) if (g->verbose) fprintf (stderr, "child_cleanup: %p: child process died\n", g); - /*kill (g->pid, SIGTERM);*/ + /*if (g->pid > 0) kill (g->pid, SIGTERM);*/ if (g->recoverypid > 0) kill (g->recoverypid, 9); waitpid (g->pid, NULL, 0); if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0); @@ -2365,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;