]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virsh: report exit status of failed lxc-enter-namespace
authorEric Blake <eblake@redhat.com>
Mon, 23 Dec 2013 16:32:45 +0000 (09:32 -0700)
committerEric Blake <eblake@redhat.com>
Mon, 3 Mar 2014 19:40:32 +0000 (12:40 -0700)
'virsh lxc-enter-namespace' does not have a way to reflect exit
status to the caller in single-command mode, but we might as well
at least report the exit status.  Prior to this patch,

$ virsh -c lxc:/// lxc-enter-namespace shell /bin/sh 'exit 3'; echo $?
1

now it gives some details:

$ virsh -c lxc:/// lxc-enter-namespace shell /bin/sh -c 'exit 3'; echo $?
error: internal error: Child process (31557) unexpected exit status 3
1

Also useful:

$ virsh -c lxc:/// lxc-enter-namespace shell /bin/sh -c 'kill $$'; echo $?
error: internal error: Child process (31585) unexpected fatal signal 15
1

* tools/virsh-domain.c (cmdLxcEnterNamespace): Avoid magic numbers.
Dispatch any error.
* tools/virsh.pod: Document that non-zero exit status is collapsed.

Signed-off-by: Eric Blake <eblake@redhat.com>
tools/virsh-domain.c
tools/virsh.pod

index eb8f519a9abb5f21afe0acb3802797594c32b459..1d3c5f03160a61708191e6b45ed61566fd1d3e0d 100644 (file)
@@ -8183,12 +8183,14 @@ cmdLxcEnterNamespace(vshControl *ctl, const vshCmd *cmd)
     if ((pid = virFork()) < 0)
         goto cleanup;
     if (pid == 0) {
+        int status;
+
         if (setlabel &&
             virDomainLxcEnterSecurityLabel(secmodel,
                                            seclabel,
                                            NULL,
                                            0) < 0)
-            _exit(255);
+            _exit(EXIT_CANCELED);
 
         if (virDomainLxcEnterNamespace(dom,
                                        nfdlist,
@@ -8196,27 +8198,28 @@ cmdLxcEnterNamespace(vshControl *ctl, const vshCmd *cmd)
                                        NULL,
                                        NULL,
                                        0) < 0)
-            _exit(255);
+            _exit(EXIT_CANCELED);
 
         /* Fork a second time because entering the
          * pid namespace only takes effect after fork
          */
         if ((pid = virFork()) < 0)
-            _exit(255);
+            _exit(EXIT_CANCELED);
         if (pid == 0) {
             execv(cmdargv[0], cmdargv);
-            _exit(255);
-        } else {
-            if (virProcessWait(pid, NULL, false) < 0)
-                _exit(255);
+            _exit(errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE);
         }
-        _exit(0);
+        if (virProcessWait(pid, &status, true) < 0)
+            _exit(EXIT_CANNOT_INVOKE);
+        virProcessExitWithStatus(status);
     } else {
         for (i = 0; i < nfdlist; i++)
             VIR_FORCE_CLOSE(fdlist[i]);
         VIR_FREE(fdlist);
-        if (virProcessWait(pid, NULL, false) < 0)
+        if (virProcessWait(pid, NULL, false) < 0) {
+            vshReportError(ctl);
             goto cleanup;
+        }
     }
 
     ret = true;
index ab9bdd9b29af33a962069b2d7ef71c13fe47b663..cafbb9a1c925838d3f4f2faa60a6d36472ffbad9 100644 (file)
@@ -3371,7 +3371,8 @@ Enter the namespace of I<domain> and execute the command C</path/to/binary>
 passing the requested args. The binary path is relative to the container
 root filesystem, not the host root filesystem. The binary will inherit the
 environment variables / console visible to virsh. This command only works
-when connected to the LXC hypervisor driver.
+when connected to the LXC hypervisor driver.  This command succeeds only
+if C</path/to/binary> has 0 exit status.
 
 =back
 
@@ -3486,7 +3487,7 @@ Alternatively report bugs to your software distributor / vendor.
 
 =head1 COPYRIGHT
 
-Copyright (C) 2005, 2007-2010 Red Hat, Inc., and the authors listed in the
+Copyright (C) 2005, 2007-2014 Red Hat, Inc., and the authors listed in the
 libvirt AUTHORS file.
 
 =head1 LICENSE