Avoid zombies with remote tunnels

This commit is contained in:
Daniel P. Berrange 2007-09-18 03:08:49 +00:00
parent 63dc047468
commit 2384225b8b
2 changed files with 25 additions and 1 deletions

View File

@ -1,3 +1,8 @@
Mon Sep 17 23:04:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* src/remote_internal.c: Track child pid and do waitpid to clean
up zombies if running over a tunnel
Thu Sep 13 17:58:00 EST 2007 Daniel P. Berrange <berrange@redhat.com> Thu Sep 13 17:58:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* src/qemu_conf.c: Fix handling of <boot> tag for network PXE * src/qemu_conf.c: Fix handling of <boot> tag for network PXE

View File

@ -62,6 +62,7 @@
struct private_data { struct private_data {
int magic; /* Should be MAGIC or DEAD. */ int magic; /* Should be MAGIC or DEAD. */
int sock; /* Socket. */ int sock; /* Socket. */
pid_t pid; /* PID of tunnel process */
int uses_tls; /* TLS enabled on socket? */ int uses_tls; /* TLS enabled on socket? */
gnutls_session_t session; /* GnuTLS session (if uses_tls != 0). */ gnutls_session_t session; /* GnuTLS session (if uses_tls != 0). */
char *type; /* Cached return from remoteType. */ char *type; /* Cached return from remoteType. */
@ -578,7 +579,7 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str
/*FALLTHROUGH*/ /*FALLTHROUGH*/
case trans_ext: { case trans_ext: {
int pid; pid_t pid;
int sv[2]; int sv[2];
/* Fork off the external process. Use socketpair to create a private /* Fork off the external process. Use socketpair to create a private
@ -617,6 +618,7 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str
/* Parent continues here. */ /* Parent continues here. */
close (sv[1]); close (sv[1]);
priv->sock = sv[0]; priv->sock = sv[0];
priv->pid = pid;
} }
} /* switch (transport) */ } /* switch (transport) */
@ -646,6 +648,14 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str
gnutls_bye (priv->session, GNUTLS_SHUT_RDWR); gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
close (priv->sock); close (priv->sock);
} }
if (priv->pid > 0) {
pid_t reap;
do {
reap = waitpid(priv->pid, NULL, 0);
if (reap == -1 && errno == EINTR)
continue;
} while (reap != -1 && reap != priv->pid);
}
/* Free up the URL and strings. */ /* Free up the URL and strings. */
xmlFreeURI (uri); xmlFreeURI (uri);
@ -1170,6 +1180,15 @@ doRemoteClose (virConnectPtr conn, struct private_data *priv)
gnutls_bye (priv->session, GNUTLS_SHUT_RDWR); gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
close (priv->sock); close (priv->sock);
if (priv->pid > 0) {
pid_t reap;
do {
reap = waitpid(priv->pid, NULL, 0);
if (reap == -1 && errno == EINTR)
continue;
} while (reap != -1 && reap != priv->pid);
}
/* See comment for remoteType. */ /* See comment for remoteType. */
if (priv->type) free (priv->type); if (priv->type) free (priv->type);