apple: Use precancelable poll() to wrap accept/recvmsg calls
authorMartin Willi <martin@revosec.ch>
Fri, 12 Dec 2014 11:05:24 +0000 (12:05 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 12 Dec 2014 11:08:34 +0000 (12:08 +0100)
To make accept/recvmsg cancelable, we wrap them with poll. As poll itself
does not honor pending cancellations when entering the function, we use our
variant that checks for pending cancellation requests before entering poll().

src/libstrongswan/utils/compat/apple.h

index 06a7887..77e0722 100644 (file)
 /* Mach uses a semaphore_create() call, use a different name for ours */
 #define semaphore_create(x) strongswan_semaphore_create(x)
 
+/* forward declaration, see below */
+static inline int precancellable_poll(struct pollfd fds[], nfds_t nfds,
+                                                                         int timeout);
+
 /* on Mac OS X 10.5 several system calls we use are no cancellation points.
  * fortunately, select isn't one of them, so we wrap some of the others with
  * calls to select(2).
@@ -44,7 +48,7 @@
                .fd = socket, \
                .events = POLLIN, \
        }; \
-       if (poll(&pfd, 1, -1) <= 0) \
+       if (precancellable_poll(&pfd, 1, -1) <= 0) \
        {\
                return -1; \
        }\