[libvirt] [re-send][PATCH 2/3] use WIFEXITED macro to see exit status of child

Eric Blake eblake at redhat.com
Tue Oct 9 03:05:34 UTC 2012


On 10/08/2012 08:51 PM, li guang wrote:
> 在 2012-10-08一的 20:05 -0600,Eric Blake写道:
>> On 10/08/2012 07:51 PM, liguang wrote:
>>> this usage was suggested by man-page of waitpid,
>>> returns  true  if  the  child terminated normally
>>
>> NACK.  virCommandRun already did this for you.
> 
> right, but not exactly, 
> virCommandRun will leave raw exit-status out of there,

Ah, after re-reading the code, so it does (I had thought we changed it
to guarantee a return of -1 on any !WIFEXITED() exit, and a sanitized
WEXITSTATUS() value, rather than making all the callers do that, but I
guess not).

> so if the waited-command exit with a code '1',
> then the caller of virCommandRun will see exit-status
> value 0x100, and report an odd '256' exit-status. 

That depends on your OS.  There are some systems out there where normal
exit is in the low-order rather than high-order byte.  But that's why we
have virProcessTranslateStatus(), to do the work correctly.

>>>      ret = virCommandRun(cmd, &exitstatus);
>>> -    if (ret == 0 && exitstatus != 0) {
>>> +    if (ret == 0 && WIFEXITED(exitstatus) == 0) {

You have a logic bug - the old code was checking for non-zero status,
and you switched it to check for zero status.

>>>          virReportError(VIR_ERR_HOOK_SCRIPT_FAILED,
>>>                         _("Hook script %s %s failed with error code %d"),
>>>                         path, drvstr, exitstatus);

This is not a correct error message - if you ever use WIFEXITED, you
must also use WEXITSTATUS, otherwise you have a mismatch.  And for this
particular error message, I think we are losing useful information; I
argue that we'd probably get a much better error message if we changed
this to let virCommandRun do ALL the work:

ret = virCommandRun(cmd, NULL);

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 617 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20121008/ddff0464/attachment-0001.sig>


More information about the libvir-list mailing list