On 04/05/16 23:08, Dave Reisner wrote: > On Wed, May 04, 2016 at 05:42:29PM +1000, Allan McRae wrote: >> The value EAGAIN is allowed by POSIX to be the same as EWOULDBLOCK, but this >> is >> not guaranteed. Thus on some systems (e.g. glibc Linux), we get a warning >> that >> the logical OR is being performed on two expressions of the same type. We can >> not get rid of this test in case any system defines these as unique values. >> >> Use a pragma block to prevent any gcc warning on these tests. >> >> Signed-off-by: Allan McRae <[email protected]> >> --- >> lib/libalpm/util.c | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c >> index 4a4847d..e105786 100644 >> --- a/lib/libalpm/util.c >> +++ b/lib/libalpm/util.c >> @@ -476,7 +476,11 @@ static int _alpm_chroot_write_to_child(alpm_handle_t >> *handle, int fd, >> /* write was successful, remove the written data from the >> buffer */ >> *buf_size -= nwrite; >> memmove(buf, buf + nwrite, *buf_size); >> + >> +/* EAGAIN may be the same value as EWOULDBLOCK (POSIX.1) - prevent GCC >> warning */ >> +#pragma GCC diagnostic ignored "-Wlogical-op" >> } else if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) { >> +#pragma GCC diagnostic pop > > Instead of repeating this pragma (and the comparison for that matter), > why not just wrap it in a separate function? Something like: > > int should_retry(int errnum) { > return errnum == EAGAIN > #if EAGAIN != EWOULDBLOCK > || errnum == EWOULDBLOCK > #endif > || errnum == EINTR; > } > > POSIX requires that constants in errno.h are defined as macros "and > which shall be suitable for use in #if pre-processing directives". >
Much better way of handling this. Thanks! A
