aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/utils/compat
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2014-11-06 14:40:52 +0100
committerMartin Willi <martin@revosec.ch>2014-11-21 12:02:08 +0100
commitaec3d5fb7fa4105acabd30f82a9461360cd3161b (patch)
tree2a614be51762b87775b8b59f3bb4f1a008987ef4 /src/libstrongswan/utils/compat
parentf65779dd0f8aecb850a32a8b1aa745984c684a18 (diff)
downloadstrongswan-aec3d5fb7fa4105acabd30f82a9461360cd3161b.tar.bz2
strongswan-aec3d5fb7fa4105acabd30f82a9461360cd3161b.tar.xz
apple: Wrap accept() and recvfrom() with poll(2) instead of select
Diffstat (limited to 'src/libstrongswan/utils/compat')
-rw-r--r--src/libstrongswan/utils/compat/apple.h16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/libstrongswan/utils/compat/apple.h b/src/libstrongswan/utils/compat/apple.h
index eb24d621d..06a7887e7 100644
--- a/src/libstrongswan/utils/compat/apple.h
+++ b/src/libstrongswan/utils/compat/apple.h
@@ -39,21 +39,27 @@
* calls to select(2).
*/
-#define WRAP_WITH_SELECT(func, socket, ...)\
- fd_set rfds; FD_ZERO(&rfds); FD_SET(socket, &rfds);\
- if (select(socket + 1, &rfds, NULL, NULL, NULL) <= 0) { return -1; }\
+#define WRAP_WITH_POLL(func, socket, ...) \
+ struct pollfd pfd = { \
+ .fd = socket, \
+ .events = POLLIN, \
+ }; \
+ if (poll(&pfd, 1, -1) <= 0) \
+ {\
+ return -1; \
+ }\
return func(socket, __VA_ARGS__)
static inline int cancellable_accept(int socket, struct sockaddr *address,
socklen_t *address_len)
{
- WRAP_WITH_SELECT(accept, socket, address, address_len);
+ WRAP_WITH_POLL(accept, socket, address, address_len);
}
#define accept cancellable_accept
static inline int cancellable_recvfrom(int socket, void *buffer, size_t length,
int flags, struct sockaddr *address, socklen_t *address_len)
{
- WRAP_WITH_SELECT(recvfrom, socket, buffer, length, flags, address, address_len);
+ WRAP_WITH_POLL(recvfrom, socket, buffer, length, flags, address, address_len);
}
#define recvfrom cancellable_recvfrom