apple: Redefine some additional clashing Mach types
[strongswan.git] / src / libstrongswan / utils / compat / apple.h
1 /*
2 * Copyright (C) 2014 Martin Willi
3 * Copyright (C) 2014 revosec AG
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 /**
17 * @defgroup apple apple
18 * @{ @ingroup compat
19 */
20
21 #ifndef APPLE_H_
22 #define APPLE_H_
23
24 #include <poll.h>
25 #include <sys/socket.h>
26 #include <sys/select.h>
27
28 /* thread_create is a syscall used to create Mach kernel threads and although
29 * there are no errors or warnings during compilation or linkage the dynamic
30 * linker does not use our implementation, therefore we rename it here
31 */
32 #define thread_create(main, arg) strongswan_thread_create(main, arg)
33
34 /* Mach uses a semaphore_create() call, use a different name for ours */
35 #define semaphore_create(x) strongswan_semaphore_create(x)
36
37 /* Since OS X 10.10 XPC includes some additional conflicting Mach types */
38 #define host_t strongswan_host_t
39 #define processor_t strongswan_processor_t
40 #define task_t strongswan_task_t
41 #define thread_t strongswan_thread_t
42
43 /* forward declaration, see below */
44 static inline int precancellable_poll(struct pollfd fds[], nfds_t nfds,
45 int timeout);
46
47 /* on Mac OS X 10.5 several system calls we use are no cancellation points.
48 * fortunately, select isn't one of them, so we wrap some of the others with
49 * calls to select(2).
50 */
51
52 #define WRAP_WITH_POLL(func, socket, ...) \
53 struct pollfd pfd = { \
54 .fd = socket, \
55 .events = POLLIN, \
56 }; \
57 if (precancellable_poll(&pfd, 1, -1) <= 0) \
58 {\
59 return -1; \
60 }\
61 return func(socket, __VA_ARGS__)
62
63 static inline int cancellable_accept(int socket, struct sockaddr *address,
64 socklen_t *address_len)
65 {
66 WRAP_WITH_POLL(accept, socket, address, address_len);
67 }
68 #define accept cancellable_accept
69 static inline int cancellable_recvfrom(int socket, void *buffer, size_t length,
70 int flags, struct sockaddr *address, socklen_t *address_len)
71 {
72 WRAP_WITH_POLL(recvfrom, socket, buffer, length, flags, address, address_len);
73 }
74 #define recvfrom cancellable_recvfrom
75
76 #include <threading/thread.h>
77
78 /*
79 * While select() is a cancellation point, it seems that OS X does not honor
80 * pending cancellation points when entering the function. We manually test for
81 * and honor pending cancellation requests, but this obviously can't prevent
82 * some race conditions where the the cancellation happens after the check,
83 * but before the select.
84 */
85 static inline int precancellable_select(int nfds, fd_set *restrict readfds,
86 fd_set *restrict writefds, fd_set *restrict errorfds,
87 struct timeval *restrict timeout)
88 {
89 if (thread_cancelability(TRUE))
90 {
91 thread_cancellation_point();
92 }
93 else
94 {
95 thread_cancelability(FALSE);
96 }
97 return select(nfds, readfds, writefds, errorfds, timeout);
98 }
99 #define select precancellable_select
100
101 /*
102 * The same as to select(2) applies to poll(2)
103 */
104 static inline int precancellable_poll(struct pollfd fds[], nfds_t nfds,
105 int timeout)
106 {
107 if (thread_cancelability(TRUE))
108 {
109 thread_cancellation_point();
110 }
111 else
112 {
113 thread_cancelability(FALSE);
114 }
115 return poll(fds, nfds, timeout);
116 }
117 #define poll precancellable_poll
118
119 #endif /** APPLE_H_ @}*/