]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
lxc: Drop container stdio as late as possible
authorCole Robinson <crobinso@redhat.com>
Thu, 2 Jun 2011 15:01:36 +0000 (11:01 -0400)
committerCole Robinson <crobinso@redhat.com>
Tue, 7 Jun 2011 18:32:03 +0000 (14:32 -0400)
Makes it more likely we get useful error output in the logs

src/lxc/lxc_container.c

index 9ae93b5a82975ed57aaada5fc1d4c063a5f3b36f..173af076960383ef02907052283e49a5f9bfa583 100644 (file)
@@ -751,9 +751,9 @@ static int lxcContainerChild( void *data )
 {
     lxc_child_argv_t *argv = data;
     virDomainDefPtr vmDef = argv->config;
-    int ttyfd;
+    int ttyfd = -1;
     int ret = -1;
-    char *ttyPath;
+    char *ttyPath = NULL;
     virDomainFSDefPtr root;
     virCommandPtr cmd = NULL;
 
@@ -786,16 +786,8 @@ static int lxcContainerChild( void *data )
         virReportSystemError(errno,
                              _("Failed to open tty %s"),
                              ttyPath);
-        VIR_FREE(ttyPath);
         goto cleanup;
     }
-    VIR_FREE(ttyPath);
-
-    if (lxcContainerSetStdio(argv->monitor, ttyfd) < 0) {
-        VIR_FORCE_CLOSE(ttyfd);
-        goto cleanup;
-    }
-    VIR_FORCE_CLOSE(ttyfd);
 
     if (lxcContainerSetupMounts(vmDef, root) < 0)
         goto cleanup;
@@ -806,17 +798,28 @@ static int lxcContainerChild( void *data )
 
     /* rename and enable interfaces */
     if (lxcContainerRenameAndEnableInterfaces(argv->nveths,
-                                              argv->veths) < 0)
+                                              argv->veths) < 0) {
         goto cleanup;
+    }
 
     /* drop a set of root capabilities */
     if (lxcContainerDropCapabilities() < 0)
         goto cleanup;
 
-    /* this function will only return if an error occured */
-    ret = virCommandExec(cmd);
+    if (lxcContainerSetStdio(argv->monitor, ttyfd) < 0) {
+        goto cleanup;
+    }
 
+    ret = 0;
 cleanup:
+    VIR_FREE(ttyPath);
+    VIR_FORCE_CLOSE(ttyfd);
+
+    if (ret == 0) {
+        /* this function will only return if an error occured */
+        ret = virCommandExec(cmd);
+    }
+
     virCommandFree(cmd);
     return ret;
 }