diff options
author | Jim Meyering <meyering@fb.com> | 2015-05-09 10:57:54 -0700 |
---|---|---|
committer | Jim Meyering <meyering@fb.com> | 2015-05-09 22:49:07 -0700 |
commit | aa7f31fc4a3f4d0c99086660d5ff008c559d657b (patch) | |
tree | 7aa9cd1d8bc4d1300e90039a8de93cc61c1fd064 | |
parent | e981643ae3e57affdf3f4f6aa8bf53cf06433f17 (diff) | |
download | coreutils-aa7f31fc4a3f4d0c99086660d5ff008c559d657b.tar.xz |
build: avoid a warning form gcc's new -Wlogical-op
Without this change, very recent gcc (e.g., version 6.0.0 20150509)
would print the following when configured with --enable-gcc-warnings:
src/copy.c:165:30: error: logical 'or' of equal expressions \
[-Werror=logical-op]
&& (errno == EOPNOTSUPP || errno == ENOTSUP || errno == ENOSYS))
^
* src/system.h (is_ENOTSUP): New function.
* src/copy.c (punch_hole): Use it.
* src/ls.c (errno_unsupported, gobble_file): Use it.
-rw-r--r-- | src/copy.c | 3 | ||||
-rw-r--r-- | src/ls.c | 7 | ||||
-rw-r--r-- | src/system.h | 14 |
3 files changed, 17 insertions, 7 deletions
diff --git a/src/copy.c b/src/copy.c index b93c53313..3af42957a 100644 --- a/src/copy.c +++ b/src/copy.c @@ -161,8 +161,7 @@ punch_hole (int fd, off_t offset, off_t length) # if defined FALLOC_FL_PUNCH_HOLE && defined FALLOC_FL_KEEP_SIZE ret = fallocate (fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset, length); - if (ret < 0 - && (errno == EOPNOTSUPP || errno == ENOTSUP || errno == ENOSYS)) + if (ret < 0 && (is_ENOTSUP (errno) || errno == ENOSYS)) ret = 0; # endif #endif @@ -2828,10 +2828,7 @@ clear_files (void) static bool errno_unsupported (int err) { - return (err == EINVAL - || err == ENOSYS - || err == ENOTSUP - || err == EOPNOTSUPP); + return (err == EINVAL || err == ENOSYS || is_ENOTSUP (err)); } /* Cache *getfilecon failure, when it's trivial to do so. @@ -3069,7 +3066,7 @@ gobble_file (char const *name, enum filetype type, ino_t inode, ls fail just because the file (even a command line argument) isn't on the right type of file system. I.e., a getfilecon failure isn't in the same class as a stat failure. */ - if (errno == ENOTSUP || errno == EOPNOTSUPP || errno == ENODATA) + if (is_ENOTSUP (errno) || errno == ENODATA) err = 0; } diff --git a/src/system.h b/src/system.h index c55f6d8bd..0e25bc414 100644 --- a/src/system.h +++ b/src/system.h @@ -695,3 +695,17 @@ stzncpy (char *restrict dest, char const *restrict src, size_t len) in selinux.h before libselinux-2.3 (May 2014). When version >= 2.3 is ubiquitous remove this function. */ static inline char * se_const (char const * sctx) { return (char *) sctx; } + +/* Return true if ERR is ENOTSUP or EOPNOTSUPP, otherwise false. + This wrapper function avoids the redundant 'or'd comparison on + systems like Linux for which they have the same value. It also + avoids the gcc warning to that effect. */ +static inline bool +is_ENOTSUP (int err) +{ + return err == EOPNOTSUPP +#if ENOTSUP != EOPNOTSUPP + || err == ENOTSUP +#endif + ; +} |