]> git.meshlink.io Git - catta/commitdiff
work around lack of fcntl on Windows
authorSven M. Hallberg <pesco@khjk.org>
Fri, 29 Aug 2014 18:31:44 +0000 (20:31 +0200)
committerSven M. Hallberg <pesco@khjk.org>
Fri, 29 Aug 2014 18:53:29 +0000 (20:53 +0200)
configure.ac
src/fdutil.c

index 401a9ae1f28cf999a5d74ebd1646da377220aa5d..696903e91cab32b218d38147578a821a189e6f74 100644 (file)
@@ -282,7 +282,7 @@ AC_CHECK_HEADERS([arpa/inet.h fcntl.h netinet/in.h sys/ioctl.h sys/socket.h sys/
 
 # Checks for library functions.
 AC_FUNC_SELECT_ARGTYPES
-AC_CHECK_FUNCS([gethostname select socket uname strcasecmp gettimeofday strncasecmp strlcpy])
+AC_CHECK_FUNCS([gethostname select socket uname strcasecmp gettimeofday strncasecmp strlcpy fcntl])
 
 AC_FUNC_CHOWN
 AC_FUNC_STAT
index c483ce8de1e4859a7d2c366246d938ed0dc8d393..ca5f65b8f2bed79f12393ae513bc9716e48f3269 100644 (file)
 
 #include <sys/select.h>
 #include <unistd.h>
-#include <fcntl.h>
 #include <assert.h>
 
+#ifdef HAVE_FCNTL
+#include <fcntl.h>
+#else
+#include <sys/ioctl.h>
+#endif
+
 #include "fdutil.h"
 
 int catta_set_cloexec(int fd) {
@@ -33,6 +38,7 @@ int catta_set_cloexec(int fd) {
 
     assert(fd >= 0);
 
+#if defined(HAVE_FCNTL)
     if ((n = fcntl(fd, F_GETFD)) < 0)
         return -1;
 
@@ -40,6 +46,15 @@ int catta_set_cloexec(int fd) {
         return 0;
 
     return fcntl(fd, F_SETFD, n|FD_CLOEXEC);
+#elif defined(_WIN32)
+    (void)n;
+    if(!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0))
+        return -1;
+    return 0;
+#else
+    (void)n;
+    return -1;
+#endif
 }
 
 int catta_set_nonblock(int fd) {
@@ -47,6 +62,7 @@ int catta_set_nonblock(int fd) {
 
     assert(fd >= 0);
 
+#ifdef HAVE_FCNTL
     if ((n = fcntl(fd, F_GETFL)) < 0)
         return -1;
 
@@ -54,6 +70,10 @@ int catta_set_nonblock(int fd) {
         return 0;
 
     return fcntl(fd, F_SETFL, n|O_NONBLOCK);
+#else
+    n = 1;
+    return ioctl(fd, FIONBIO, &n);
+#endif
 }
 
 int catta_wait_for_write(int fd) {