mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-29 17:33:09 +00:00
Avoid zombies with remote tunnels
This commit is contained in:
parent
63dc047468
commit
2384225b8b
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user