[libvirt] [PATCH] virsh: change wexitstatus order to allow compilation on mac osx

Eric Blake eblake at redhat.com
Wed Sep 15 18:18:56 UTC 2010


[adding bug-gnulib; replies can drop libvir-list]

>>> - if (command_ret != WEXITSTATUS (0)) {
>>> + if (WEXITSTATUS(command_ret) != 0) {
>>
>> ACK. By the way, what was the compilation failure?
>
> Thanks, pushed. The compilation failure was:
>
> virsh.c:8605: error: lvalue required as unary '&' operand
>
> Which seems weird, but this patch really did fix it. :)

Aha - the darwin <sys/wait.h> contains:

#if defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE)
#define _W_INT(i)       (i)
#else
#define _W_INT(w)       (*(int *)&(w))  /* convert union wait to int */
#define WCOREFLAG       0200
#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
...
#if __DARWIN_UNIX03
#define WEXITSTATUS(x)  ((_W_INT(x) >> 8) & 0x000000ff)
#else /* !__DARWIN_UNIX03 */
#define WEXITSTATUS(x)  (_W_INT(x) >> 8)
#endif /* !__DARWIN_UNIX03 */
...
union wait {
         int     w_status;               /* used in syscall */
         /*
          * Terminated process status.
          */
         struct {
#if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN
                 unsigned int    w_Termsig:7,    /* termination signal */
                                 w_Coredump:1,   /* core dump indicator */
                                 w_Retcode:8,    /* exit code if 
w_termsig==0 */
                                 w_Filler:16;    /* upper bits filler */
#endif
#if __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN
                 unsigned int    w_Filler:16,    /* upper bits filler */
                                 w_Retcode:8,    /* exit code if 
w_termsig==0 */
                                 w_Coredump:1,   /* core dump indicator */
                                 w_Termsig:7;    /* termination signal */
#endif
         } w_T;
         /*
          * Stopped process status.  Returned
          * only for traced children unless requested
          * with the WUNTRACED option bit.
          */
         struct {
#if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN
                 unsigned int    w_Stopval:8,    /* == W_STOPPED if 
stopped */
                                 w_Stopsig:8,    /* signal that stopped 
us */
                                 w_Filler:16;    /* upper bits filler */
#endif
#if __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN
                 unsigned int    w_Filler:16,    /* upper bits filler */
                                 w_Stopsig:8,    /* signal that stopped 
us */
                                 w_Stopval:8;    /* == W_STOPPED if 
stopped */
#endif
         } w_S;
};


Obviously, the Darwin folks are (mistakenly) assuming that you would 
only ever use WEXITSTATUS with a 'union wait' lvalue; in which case, 
(*(int*)&(0)) is indeed invalid C (notice that they do the right thing 
if you request POSIX compliance with _POSIX_C_SOURCE, but since gnulib 
[rightfully] wants to expose and take advantage of system extensions, we 
can't define _POSIX_C_SOURCE).  Since WEXITSTATUS should be usable on 
constants; it is a bug in their headers, and one that Gnulib should be 
able to work around.

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list