libbb: make ndelay_no/off a bit more clever. +14 bytes
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 23 Jan 2011 23:29:55 +0000 (00:29 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 23 Jan 2011 23:29:55 +0000 (00:29 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/libbb.h
libbb/xfuncs.c

index 55510316b07fa04156974cedf65a71f7f011ffc5..6e37b8d04578b7fc8084925d79592ea41ce80fd4 100644 (file)
@@ -348,9 +348,9 @@ extern char *bb_get_last_path_component_strip(char *path) FAST_FUNC;
 /* "abc/def/" -> "" and it never modifies 'path' */
 extern char *bb_get_last_path_component_nostrip(const char *path) FAST_FUNC;
 
-int ndelay_on(int fd) FAST_FUNC;
-int ndelay_off(int fd) FAST_FUNC;
-int close_on_exec_on(int fd) FAST_FUNC;
+void ndelay_on(int fd) FAST_FUNC;
+void ndelay_off(int fd) FAST_FUNC;
+void close_on_exec_on(int fd) FAST_FUNC;
 void xdup2(int, int) FAST_FUNC;
 void xmove_fd(int, int) FAST_FUNC;
 
index a02a504b0c889002714529537556d06ce2efd6db..23f27516f633c2178f2b00b24e13aec5c9c2d357 100644 (file)
 #include "libbb.h"
 
 /* Turn on nonblocking I/O on a fd */
-int FAST_FUNC ndelay_on(int fd)
+void FAST_FUNC ndelay_on(int fd)
 {
-       return fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
+       int flags = fcntl(fd, F_GETFL);
+       if (flags & O_NONBLOCK)
+               return;
+       fcntl(fd, F_SETFL, flags | O_NONBLOCK);
 }
 
-int FAST_FUNC ndelay_off(int fd)
+void FAST_FUNC ndelay_off(int fd)
 {
-       return fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK);
+       int flags = fcntl(fd, F_GETFL);
+       if (!(flags & O_NONBLOCK))
+               return;
+       fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
 }
 
-int FAST_FUNC close_on_exec_on(int fd)
+void FAST_FUNC close_on_exec_on(int fd)
 {
-       return fcntl(fd, F_SETFD, FD_CLOEXEC);
+       fcntl(fd, F_SETFD, FD_CLOEXEC);
 }
 
 char* FAST_FUNC strncpy_IFNAMSIZ(char *dst, const char *src)