
[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@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org