]> git.ipfire.org Git - thirdparty/libvirt.git/commit
util: make it easier to grab only regular command exit
authorEric Blake <eblake@redhat.com>
Thu, 20 Feb 2014 00:32:19 +0000 (17:32 -0700)
committerEric Blake <eblake@redhat.com>
Mon, 3 Mar 2014 19:40:32 +0000 (12:40 -0700)
commitb9dd878ff8a03a605865d347e01c0b80b0ee7798
tree0813b3c404008532ca657a43a6d9c10a5d1e32d0
parentc72e76c3d967c82628e9878284c2df96b2629808
util: make it easier to grab only regular command exit

Auditing all callers of virCommandRun and virCommandWait that
passed a non-NULL pointer for exit status turned up some
interesting observations.  Many callers were merely passing
a pointer to avoid the overall command dying, but without
caring what the exit status was - but these callers would
be better off treating a child death by signal as an abnormal
exit.  Other callers were actually acting on the status, but
not all of them remembered to filter by WIFEXITED and convert
with WEXITSTATUS; depending on the platform, this can result
in a status being reported as 256 times too big.  And among
those that correctly parse the output, it gets rather verbose.
Finally, there were the callers that explicitly checked that
the status was 0, and gave their own message, but with fewer
details than what virCommand gives for free.

So the best idea is to move the complexity out of callers and
into virCommand - by default, we return the actual exit status
already cleaned through WEXITSTATUS and treat signals as a
failed command; but the few callers that care can ask for raw
status and act on it themselves.

* src/util/vircommand.h (virCommandRawStatus): New prototype.
* src/libvirt_private.syms (util/command.h): Export it.
* docs/internals/command.html.in: Document it.
* src/util/vircommand.c (virCommandRawStatus): New function.
(virCommandWait): Adjust semantics.
* tests/commandtest.c (test1): Test it.
* daemon/remote.c (remoteDispatchAuthPolkit): Adjust callers.
* src/access/viraccessdriverpolkit.c (virAccessDriverPolkitCheck):
Likewise.
* src/fdstream.c (virFDStreamCloseInt): Likewise.
* src/lxc/lxc_process.c (virLXCProcessStart): Likewise.
* src/qemu/qemu_command.c (qemuCreateInBridgePortWithHelper):
Likewise.
* src/xen/xen_driver.c (xenUnifiedXendProbe): Simplify.
* tests/reconnect.c (mymain): Likewise.
* tests/statstest.c (mymain): Likewise.
* src/bhyve/bhyve_process.c (virBhyveProcessStart)
(virBhyveProcessStop): Don't overwrite virCommand error.
* src/libvirt.c (virConnectAuthGainPolkit): Likewise.
* src/openvz/openvz_driver.c (openvzDomainGetBarrierLimit)
(openvzDomainSetBarrierLimit): Likewise.
* src/util/virebtables.c (virEbTablesOnceInit): Likewise.
* src/util/viriptables.c (virIpTablesOnceInit): Likewise.
* src/util/virnetdevveth.c (virNetDevVethCreate): Fix debug
message.
* src/qemu/qemu_capabilities.c (virQEMUCapsInitQMP): Add comment.
* src/storage/storage_backend_iscsi.c
(virStorageBackendISCSINodeUpdate): Likewise.

Signed-off-by: Eric Blake <eblake@redhat.com>
21 files changed:
daemon/remote.c
docs/internals/command.html.in
src/access/viraccessdriverpolkit.c
src/bhyve/bhyve_process.c
src/fdstream.c
src/libvirt.c
src/libvirt_private.syms
src/lxc/lxc_process.c
src/openvz/openvz_driver.c
src/qemu/qemu_capabilities.c
src/qemu/qemu_command.c
src/storage/storage_backend_iscsi.c
src/util/vircommand.c
src/util/vircommand.h
src/util/virebtables.c
src/util/viriptables.c
src/util/virnetdevveth.c
src/xen/xen_driver.c
tests/commandtest.c
tests/reconnect.c
tests/statstest.c