提交 2ebf593a 编写于 作者: E Eric Blake

virsh: report exit status of failed lxc-enter-namespace

'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: NEric Blake <eblake@redhat.com>
上级 730fc962
......@@ -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;
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册