]> xenbits.xensource.com Git - libvirt.git/commitdiff
Avoid zombies with remote tunnels
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 18 Sep 2007 03:08:49 +0000 (03:08 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 18 Sep 2007 03:08:49 +0000 (03:08 +0000)
ChangeLog
src/remote_internal.c

index 2ceefeb3de733c3a577b81e2964426d5ff2b8938..4ecdc0e506dcf5e74786727a7c57ed21c5150c6c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        * src/qemu_conf.c: Fix handling of <boot> tag for network PXE
index 3506ca0bf15eb411d2d5450e011e37fffdb58481..21d6ee6723b88e0c014887d6d950156944846cee 100644 (file)
@@ -62,6 +62,7 @@
 struct private_data {
     int magic;                  /* Should be MAGIC or DEAD. */
     int sock;                   /* Socket. */
+    pid_t pid;                  /* PID of tunnel process */
     int uses_tls;               /* TLS enabled on socket? */
     gnutls_session_t session;   /* GnuTLS session (if uses_tls != 0). */
     char *type;                 /* Cached return from remoteType. */
@@ -578,7 +579,7 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str
 
         /*FALLTHROUGH*/
     case trans_ext: {
-        int pid;
+        pid_t pid;
         int sv[2];
 
         /* 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. */
         close (sv[1]);
         priv->sock = sv[0];
+        priv->pid = pid;
     }
     } /* switch (transport) */
 
@@ -646,6 +648,14 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str
             gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
         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. */
     xmlFreeURI (uri);
@@ -1170,6 +1180,15 @@ doRemoteClose (virConnectPtr conn, struct private_data *priv)
         gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
     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. */
     if (priv->type) free (priv->type);