oRTP  0.22.0
port.h
1 /*
2  The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
3  Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public
16  License along with this library; if not, write to the Free Software
17  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19 /* this file is responsible of the portability of the stack */
20 
21 #ifndef ORTP_PORT_H
22 #define ORTP_PORT_H
23 
24 
25 #if !defined(WIN32) && !defined(_WIN32_WCE)
26 /********************************/
27 /* definitions for UNIX flavour */
28 /********************************/
29 
30 #include <errno.h>
31 #include <sys/types.h>
32 #include <pthread.h>
33 #include <unistd.h>
34 #include <fcntl.h>
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include <stdarg.h>
38 #include <string.h>
39 
40 #ifdef __linux
41 #include <stdint.h>
42 #endif
43 
44 
45 #include <sys/types.h>
46 #include <sys/socket.h>
47 #include <netinet/in.h>
48 #if defined(_XOPEN_SOURCE_EXTENDED) || !defined(__hpux)
49 #include <arpa/inet.h>
50 #endif
51 
52 
53 
54 #include <sys/time.h>
55 
56 #ifdef ORTP_INET6
57 #include <netdb.h>
58 #endif
59 
60 typedef int ortp_socket_t;
61 typedef pthread_t ortp_thread_t;
62 typedef pthread_mutex_t ortp_mutex_t;
63 typedef pthread_cond_t ortp_cond_t;
64 
65 #ifdef __INTEL_COMPILER
66 #pragma warning(disable : 111) // statement is unreachable
67 #pragma warning(disable : 181) // argument is incompatible with corresponding format string conversion
68 #pragma warning(disable : 188) // enumerated type mixed with another type
69 #pragma warning(disable : 593) // variable "xxx" was set but never used
70 #pragma warning(disable : 810) // conversion from "int" to "unsigned short" may lose significant bits
71 #pragma warning(disable : 869) // parameter "xxx" was never referenced
72 #pragma warning(disable : 981) // operands are evaluated in unspecified order
73 #pragma warning(disable : 1418) // external function definition with no prior declaration
74 #pragma warning(disable : 1419) // external declaration in primary source file
75 #pragma warning(disable : 1469) // "cc" clobber ignored
76 #endif
77 
78 #define ORTP_PUBLIC
79 
80 #ifdef __cplusplus
81 extern "C"
82 {
83 #endif
84 
85 int __ortp_thread_join(ortp_thread_t thread, void **ptr);
86 int __ortp_thread_create(pthread_t *thread, pthread_attr_t *attr, void * (*routine)(void*), void *arg);
87 
88 #ifdef __cplusplus
89 }
90 #endif
91 
92 #define ortp_thread_create __ortp_thread_create
93 #define ortp_thread_join __ortp_thread_join
94 #define ortp_thread_exit pthread_exit
95 #define ortp_mutex_init pthread_mutex_init
96 #define ortp_mutex_lock pthread_mutex_lock
97 #define ortp_mutex_unlock pthread_mutex_unlock
98 #define ortp_mutex_destroy pthread_mutex_destroy
99 #define ortp_cond_init pthread_cond_init
100 #define ortp_cond_signal pthread_cond_signal
101 #define ortp_cond_broadcast pthread_cond_broadcast
102 #define ortp_cond_wait pthread_cond_wait
103 #define ortp_cond_destroy pthread_cond_destroy
104 
105 #define SOCKET_OPTION_VALUE void *
106 #define SOCKET_BUFFER void *
107 
108 #define getSocketError() strerror(errno)
109 #define getSocketErrorCode() (errno)
110 
111 #define ortp_log10f(x) log10f(x)
112 
113 
114 #else
115 /*********************************/
116 /* definitions for WIN32 flavour */
117 /*********************************/
118 
119 #include <stdio.h>
120 #include <stdlib.h>
121 #include <stdarg.h>
122 #include <winsock2.h>
123 #include <ws2tcpip.h>
124 
125 #ifdef _MSC_VER
126 #ifdef ORTP_EXPORTS
127 #define ORTP_PUBLIC __declspec(dllexport)
128 #else
129 #define ORTP_PUBLIC __declspec(dllimport)
130 #endif
131 #pragma push_macro("_WINSOCKAPI_")
132 #ifndef _WINSOCKAPI_
133 #define _WINSOCKAPI_
134 #endif
135 
136 #define strtok_r strtok_s
137 
138 typedef unsigned __int64 uint64_t;
139 typedef __int64 int64_t;
140 typedef unsigned short uint16_t;
141 typedef unsigned int uint32_t;
142 typedef int int32_t;
143 typedef unsigned char uint8_t;
144 typedef __int16 int16_t;
145 #else
146 #include <stdint.h> /*provided by mingw32*/
147 #include <io.h>
148 #define ORTP_PUBLIC
149 #endif
150 
151 #define vsnprintf _vsnprintf
152 #define srandom srand
153 #define random rand
154 
155 ORTP_PUBLIC char* strtok_r(char *str, const char *delim, char **nextp);
156 
157 
158 typedef SOCKET ortp_socket_t;
159 #ifdef WINAPI_FAMILY_PHONE_APP
160 typedef CONDITION_VARIABLE ortp_cond_t;
161 typedef SRWLOCK ortp_mutex_t;
162 #else
163 typedef HANDLE ortp_cond_t;
164 typedef HANDLE ortp_mutex_t;
165 #endif
166 typedef HANDLE ortp_thread_t;
167 
168 #define ortp_thread_create WIN_thread_create
169 #define ortp_thread_join WIN_thread_join
170 #define ortp_thread_exit(arg)
171 #define ortp_mutex_init WIN_mutex_init
172 #define ortp_mutex_lock WIN_mutex_lock
173 #define ortp_mutex_unlock WIN_mutex_unlock
174 #define ortp_mutex_destroy WIN_mutex_destroy
175 #define ortp_cond_init WIN_cond_init
176 #define ortp_cond_signal WIN_cond_signal
177 #define ortp_cond_broadcast WIN_cond_broadcast
178 #define ortp_cond_wait WIN_cond_wait
179 #define ortp_cond_destroy WIN_cond_destroy
180 
181 
182 #ifdef __cplusplus
183 extern "C"
184 {
185 #endif
186 
187 ORTP_PUBLIC int WIN_mutex_init(ortp_mutex_t *m, void *attr_unused);
188 ORTP_PUBLIC int WIN_mutex_lock(ortp_mutex_t *mutex);
189 ORTP_PUBLIC int WIN_mutex_unlock(ortp_mutex_t *mutex);
190 ORTP_PUBLIC int WIN_mutex_destroy(ortp_mutex_t *mutex);
191 ORTP_PUBLIC int WIN_thread_create(ortp_thread_t *t, void *attr_unused, void *(*func)(void*), void *arg);
192 ORTP_PUBLIC int WIN_thread_join(ortp_thread_t thread, void **unused);
193 ORTP_PUBLIC int WIN_cond_init(ortp_cond_t *cond, void *attr_unused);
194 ORTP_PUBLIC int WIN_cond_wait(ortp_cond_t * cond, ortp_mutex_t * mutex);
195 ORTP_PUBLIC int WIN_cond_signal(ortp_cond_t * cond);
196 ORTP_PUBLIC int WIN_cond_broadcast(ortp_cond_t * cond);
197 ORTP_PUBLIC int WIN_cond_destroy(ortp_cond_t * cond);
198 
199 #ifdef __cplusplus
200 }
201 #endif
202 
203 #define SOCKET_OPTION_VALUE char *
204 #define inline __inline
205 
206 #if defined(_WIN32_WCE)
207 
208 #define ortp_log10f(x) (float)log10 ((double)x)
209 
210 #ifdef assert
211  #undef assert
212 #endif /*assert*/
213 #define assert(exp) ((void)0)
214 
215 #ifdef errno
216  #undef errno
217 #endif /*errno*/
218 #define errno GetLastError()
219 #ifdef strerror
220  #undef strerror
221 #endif /*strerror*/
222 const char * ortp_strerror(DWORD value);
223 #define strerror ortp_strerror
224 
225 
226 #else /*_WIN32_WCE*/
227 
228 #define ortp_log10f(x) log10f(x)
229 
230 #endif
231 
232 ORTP_PUBLIC const char *getWinSocketError(int error);
233 #define getSocketErrorCode() WSAGetLastError()
234 #define getSocketError() getWinSocketError(WSAGetLastError())
235 
236 #define snprintf _snprintf
237 #define strcasecmp _stricmp
238 #define strncasecmp _strnicmp
239 
240 
241 #ifdef __cplusplus
242 extern "C"{
243 #endif
244 ORTP_PUBLIC int gettimeofday (struct timeval *tv, void* tz);
245 #ifdef _WORKAROUND_MINGW32_BUGS
246 char * WSAAPI gai_strerror(int errnum);
247 #endif
248 #ifdef __cplusplus
249 }
250 #endif
251 
252 #endif
253 
254 typedef unsigned char bool_t;
255 #undef TRUE
256 #undef FALSE
257 #define TRUE 1
258 #define FALSE 0
259 
260 typedef struct ortpTimeSpec{
261  int64_t tv_sec;
262  int64_t tv_nsec;
263 }ortpTimeSpec;
264 
265 #ifdef __cplusplus
266 extern "C"{
267 #endif
268 
269 ORTP_PUBLIC void* ortp_malloc(size_t sz);
270 ORTP_PUBLIC void ortp_free(void *ptr);
271 ORTP_PUBLIC void* ortp_realloc(void *ptr, size_t sz);
272 ORTP_PUBLIC void* ortp_malloc0(size_t sz);
273 ORTP_PUBLIC char * ortp_strdup(const char *tmp);
274 
275 /*override the allocator with this method, to be called BEFORE ortp_init()*/
276 typedef struct _OrtpMemoryFunctions{
277  void *(*malloc_fun)(size_t sz);
278  void *(*realloc_fun)(void *ptr, size_t sz);
279  void (*free_fun)(void *ptr);
281 
282 void ortp_set_memory_functions(OrtpMemoryFunctions *functions);
283 
284 #define ortp_new(type,count) (type*)ortp_malloc(sizeof(type)*(count))
285 #define ortp_new0(type,count) (type*)ortp_malloc0(sizeof(type)*(count))
286 
287 ORTP_PUBLIC int close_socket(ortp_socket_t sock);
288 ORTP_PUBLIC int set_non_blocking_socket(ortp_socket_t sock);
289 
290 ORTP_PUBLIC char *ortp_strndup(const char *str,int n);
291 ORTP_PUBLIC char *ortp_strdup_printf(const char *fmt,...);
292 ORTP_PUBLIC char *ortp_strdup_vprintf(const char *fmt, va_list ap);
293 
294 ORTP_PUBLIC int ortp_file_exist(const char *pathname);
295 
296 ORTP_PUBLIC void ortp_get_cur_time(ortpTimeSpec *ret);
297 
298 /* portable named pipes and shared memory*/
299 #if !defined(_WIN32_WCE)
300 #ifdef WIN32
301 typedef HANDLE ortp_pipe_t;
302 #define ORTP_PIPE_INVALID INVALID_HANDLE_VALUE
303 #else
304 typedef int ortp_pipe_t;
305 #define ORTP_PIPE_INVALID (-1)
306 #endif
307 
308 ORTP_PUBLIC ortp_pipe_t ortp_server_pipe_create(const char *name);
309 /*
310  * warning: on win32 ortp_server_pipe_accept_client() might return INVALID_HANDLE_VALUE without
311  * any specific error, this happens when ortp_server_pipe_close() is called on another pipe.
312  * This pipe api is not thread-safe.
313 */
314 ORTP_PUBLIC ortp_pipe_t ortp_server_pipe_accept_client(ortp_pipe_t server);
315 ORTP_PUBLIC int ortp_server_pipe_close(ortp_pipe_t spipe);
316 ORTP_PUBLIC int ortp_server_pipe_close_client(ortp_pipe_t client);
317 
318 ORTP_PUBLIC ortp_pipe_t ortp_client_pipe_connect(const char *name);
319 ORTP_PUBLIC int ortp_client_pipe_close(ortp_pipe_t sock);
320 
321 ORTP_PUBLIC int ortp_pipe_read(ortp_pipe_t p, uint8_t *buf, int len);
322 ORTP_PUBLIC int ortp_pipe_write(ortp_pipe_t p, const uint8_t *buf, int len);
323 
324 ORTP_PUBLIC void *ortp_shm_open(unsigned int keyid, int size, int create);
325 ORTP_PUBLIC void ortp_shm_close(void *memory);
326 
327 #endif
328 
329 #ifdef __cplusplus
330 }
331 
332 #endif
333 
334 
335 #if (defined(WIN32) || defined(_WIN32_WCE)) && !defined(ORTP_STATIC)
336 #ifdef ORTP_EXPORTS
337  #define ORTP_VAR_PUBLIC extern __declspec(dllexport)
338 #else
339  #define ORTP_VAR_PUBLIC __declspec(dllimport)
340 #endif
341 #else
342  #define ORTP_VAR_PUBLIC extern
343 #endif
344 
345 
346 /*define __ios when we are compiling for ios.
347  The TARGET_OS_IPHONE macro is stupid, it is defined to 0 when compiling on mac os x.
348 */
349 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE==1
350 #define __ios 1
351 #endif
352 
353 #endif
354 
355