diff options
-rw-r--r-- | src/system/fd_util.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/system/fd_util.c b/src/system/fd_util.c index 17976a5ee..b4a7032e6 100644 --- a/src/system/fd_util.c +++ b/src/system/fd_util.c @@ -58,15 +58,17 @@ static int fd_mask_flags(int fd, int and_mask, int xor_mask) { - int ret; - assert(fd >= 0); - ret = fcntl(fd, F_GETFD, 0); - if (ret < 0) - return ret; + const int old_flags = fcntl(fd, F_GETFD, 0); + if (old_flags < 0) + return old_flags; + + const int new_flags = (old_flags & and_mask) ^ xor_mask; + if (new_flags == old_flags) + return old_flags; - return fcntl(fd, F_SETFD, (ret & and_mask) ^ xor_mask); + return fcntl(fd, F_SETFD, new_flags); } #endif /* !WIN32 */ |