oRTP 0.16.1
|
00001 /* 00002 The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack. 00003 Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Lesser General Public 00007 License as published by the Free Software Foundation; either 00008 version 2.1 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Lesser General Public License for more details. 00014 00015 You should have received a copy of the GNU Lesser General Public 00016 License along with this library; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 */ 00019 /* this file is responsible of the portability of the stack */ 00020 00021 #ifndef ORTP_PORT_H 00022 #define ORTP_PORT_H 00023 00024 00025 #if !defined(WIN32) && !defined(_WIN32_WCE) 00026 /********************************/ 00027 /* definitions for UNIX flavour */ 00028 /********************************/ 00029 00030 #include <errno.h> 00031 #include <sys/types.h> 00032 #include <pthread.h> 00033 #include <unistd.h> 00034 #include <fcntl.h> 00035 #include <stdlib.h> 00036 #include <stdio.h> 00037 #include <stdarg.h> 00038 #include <string.h> 00039 00040 #ifdef __linux 00041 #include <stdint.h> 00042 #endif 00043 00044 00045 #include <sys/types.h> 00046 #include <sys/socket.h> 00047 #include <netinet/in.h> 00048 #if defined(_XOPEN_SOURCE_EXTENDED) || !defined(__hpux) 00049 #include <arpa/inet.h> 00050 #endif 00051 00052 00053 00054 #include <sys/time.h> 00055 00056 #ifdef ORTP_INET6 00057 #include <netdb.h> 00058 #endif 00059 00060 typedef int ortp_socket_t; 00061 typedef pthread_t ortp_thread_t; 00062 typedef pthread_mutex_t ortp_mutex_t; 00063 typedef pthread_cond_t ortp_cond_t; 00064 00065 #ifdef __INTEL_COMPILER 00066 #pragma warning(disable : 111) // statement is unreachable 00067 #pragma warning(disable : 181) // argument is incompatible with corresponding format string conversion 00068 #pragma warning(disable : 188) // enumerated type mixed with another type 00069 #pragma warning(disable : 593) // variable "xxx" was set but never used 00070 #pragma warning(disable : 810) // conversion from "int" to "unsigned short" may lose significant bits 00071 #pragma warning(disable : 869) // parameter "xxx" was never referenced 00072 #pragma warning(disable : 981) // operands are evaluated in unspecified order 00073 #pragma warning(disable : 1418) // external function definition with no prior declaration 00074 #pragma warning(disable : 1419) // external declaration in primary source file 00075 #pragma warning(disable : 1469) // "cc" clobber ignored 00076 #endif 00077 00078 int __ortp_thread_join(ortp_thread_t thread, void **ptr); 00079 int __ortp_thread_create(pthread_t *thread, pthread_attr_t *attr, void * (*routine)(void*), void *arg); 00080 #define ortp_thread_create __ortp_thread_create 00081 #define ortp_thread_join __ortp_thread_join 00082 #define ortp_thread_exit pthread_exit 00083 #define ortp_mutex_init pthread_mutex_init 00084 #define ortp_mutex_lock pthread_mutex_lock 00085 #define ortp_mutex_unlock pthread_mutex_unlock 00086 #define ortp_mutex_destroy pthread_mutex_destroy 00087 #define ortp_cond_init pthread_cond_init 00088 #define ortp_cond_signal pthread_cond_signal 00089 #define ortp_cond_broadcast pthread_cond_broadcast 00090 #define ortp_cond_wait pthread_cond_wait 00091 #define ortp_cond_destroy pthread_cond_destroy 00092 00093 #define SOCKET_OPTION_VALUE void * 00094 #define SOCKET_BUFFER void * 00095 00096 #define getSocketError() strerror(errno) 00097 #define getSocketErrorCode() (errno) 00098 00099 #else 00100 /*********************************/ 00101 /* definitions for WIN32 flavour */ 00102 /*********************************/ 00103 00104 #include <stdio.h> 00105 #include <stdlib.h> 00106 #include <stdarg.h> 00107 #include <winsock2.h> 00108 #include <ws2tcpip.h> 00109 00110 00111 #ifdef _MSC_VER 00112 #pragma push_macro("_WINSOCKAPI_") 00113 #ifndef _WINSOCKAPI_ 00114 #define _WINSOCKAPI_ 00115 #endif 00116 00117 typedef unsigned __int64 uint64_t; 00118 typedef __int64 int64_t; 00119 typedef unsigned short uint16_t; 00120 typedef unsigned int uint32_t; 00121 typedef int int32_t; 00122 typedef unsigned char uint8_t; 00123 typedef __int16 int16_t; 00124 #else 00125 #include <stdint.h> /*provided by mingw32*/ 00126 #endif 00127 00128 #define vsnprintf _vsnprintf 00129 #define srandom srand 00130 #define random rand 00131 00132 00133 typedef SOCKET ortp_socket_t; 00134 typedef HANDLE ortp_cond_t; 00135 typedef HANDLE ortp_mutex_t; 00136 typedef HANDLE ortp_thread_t; 00137 00138 #define ortp_thread_create WIN_thread_create 00139 #define ortp_thread_join WIN_thread_join 00140 #define ortp_thread_exit(arg) 00141 #define ortp_mutex_init WIN_mutex_init 00142 #define ortp_mutex_lock WIN_mutex_lock 00143 #define ortp_mutex_unlock WIN_mutex_unlock 00144 #define ortp_mutex_destroy WIN_mutex_destroy 00145 #define ortp_cond_init WIN_cond_init 00146 #define ortp_cond_signal WIN_cond_signal 00147 #define ortp_cond_broadcast WIN_cond_broadcast 00148 #define ortp_cond_wait WIN_cond_wait 00149 #define ortp_cond_destroy WIN_cond_destroy 00150 00151 00152 #ifdef __cplusplus 00153 extern "C" 00154 { 00155 #endif 00156 00157 int WIN_mutex_init(ortp_mutex_t *m, void *attr_unused); 00158 int WIN_mutex_lock(ortp_mutex_t *mutex); 00159 int WIN_mutex_unlock(ortp_mutex_t *mutex); 00160 int WIN_mutex_destroy(ortp_mutex_t *mutex); 00161 int WIN_thread_create(ortp_thread_t *t, void *attr_unused, void *(*func)(void*), void *arg); 00162 int WIN_thread_join(ortp_thread_t thread, void **unused); 00163 int WIN_cond_init(ortp_cond_t *cond, void *attr_unused); 00164 int WIN_cond_wait(ortp_cond_t * cond, ortp_mutex_t * mutex); 00165 int WIN_cond_signal(ortp_cond_t * cond); 00166 int WIN_cond_broadcast(ortp_cond_t * cond); 00167 int WIN_cond_destroy(ortp_cond_t * cond); 00168 00169 #ifdef __cplusplus 00170 } 00171 #endif 00172 00173 #define SOCKET_OPTION_VALUE char * 00174 #define inline __inline 00175 00176 const char *getWinSocketError(int error); 00177 #define getSocketErrorCode() WSAGetLastError() 00178 #define getSocketError() getWinSocketError(WSAGetLastError()) 00179 00180 #define snprintf _snprintf 00181 #define strcasecmp _stricmp 00182 00183 #if 0 00184 struct timeval { 00185 long tv_sec; /* seconds */ 00186 long tv_usec; /* and microseconds */ 00187 }; 00188 #endif 00189 00190 int gettimeofday (struct timeval *tv, void* tz); 00191 #ifdef _WORKAROUND_MINGW32_BUGS 00192 char * WSAAPI gai_strerror(int errnum); 00193 #endif 00194 00195 00196 #endif 00197 00198 typedef unsigned char bool_t; 00199 #undef TRUE 00200 #undef FALSE 00201 #define TRUE 1 00202 #define FALSE 0 00203 00204 #ifdef __cplusplus 00205 extern "C"{ 00206 #endif 00207 00208 void* ortp_malloc(size_t sz); 00209 void ortp_free(void *ptr); 00210 void* ortp_realloc(void *ptr, size_t sz); 00211 void* ortp_malloc0(size_t sz); 00212 char * ortp_strdup(const char *tmp); 00213 00214 /*override the allocator with this method, to be called BEFORE ortp_init()*/ 00215 typedef struct _OrtpMemoryFunctions{ 00216 void *(*malloc_fun)(size_t sz); 00217 void *(*realloc_fun)(void *ptr, size_t sz); 00218 void (*free_fun)(void *ptr); 00219 }OrtpMemoryFunctions; 00220 00221 void ortp_set_memory_functions(OrtpMemoryFunctions *functions); 00222 00223 #define ortp_new(type,count) ortp_malloc(sizeof(type)*(count)) 00224 #define ortp_new0(type,count) ortp_malloc0(sizeof(type)*(count)) 00225 00226 int close_socket(ortp_socket_t sock); 00227 int set_non_blocking_socket(ortp_socket_t sock); 00228 00229 char *ortp_strndup(const char *str,int n); 00230 char *ortp_strdup_printf(const char *fmt,...); 00231 char *ortp_strdup_vprintf(const char *fmt, va_list ap); 00232 00233 /* portable named pipes */ 00234 #ifdef WIN32 00235 typedef HANDLE ortp_pipe_t; 00236 #define ORTP_PIPE_INVALID INVALID_HANDLE_VALUE 00237 #else 00238 typedef int ortp_pipe_t; 00239 #define ORTP_PIPE_INVALID (-1) 00240 #endif 00241 00242 ortp_pipe_t ortp_server_pipe_create(const char *name); 00243 /* 00244 * warning: on win32 ortp_server_pipe_accept_client() might return INVALID_HANDLE_VALUE without 00245 * any specific error, this happens when ortp_server_pipe_close() is called on another pipe. 00246 * This pipe api is not thread-safe. 00247 */ 00248 ortp_pipe_t ortp_server_pipe_accept_client(ortp_pipe_t server); 00249 int ortp_server_pipe_close(ortp_pipe_t spipe); 00250 int ortp_server_pipe_close_client(ortp_pipe_t client); 00251 00252 ortp_pipe_t ortp_client_pipe_connect(const char *name); 00253 int ortp_client_pipe_close(ortp_pipe_t sock); 00254 00255 int ortp_pipe_read(ortp_pipe_t p, uint8_t *buf, int len); 00256 int ortp_pipe_write(ortp_pipe_t p, const uint8_t *buf, int len); 00257 00258 00259 #ifdef __cplusplus 00260 } 00261 #endif 00262 00263 00264 #if (defined(WIN32) || defined(_WIN32_WCE)) && !defined(ORTP_STATIC) 00265 #ifdef ORTP_EXPORTS 00266 #define VAR_DECLSPEC __declspec(dllexport) 00267 #else 00268 #define VAR_DECLSPEC __declspec(dllimport) 00269 #endif 00270 #else 00271 #define VAR_DECLSPEC extern 00272 #endif 00273 00274 00275 #endif 00276 00277