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

Reply via email to