libosip  5.3.0
osip_port.h
1 /*
2  The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)
3  Copyright (C) 2001-2020 Aymeric MOIZARD amoizard@antisip.com
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 
20 #ifndef _OSIP_PORT_H_
21 #define _OSIP_PORT_H_
22 
23 #include <stdio.h>
24 
25 /* on android, va_list is only defined if stdarg.h is included before */
26 /* on other platform, it doesn't harm to have it */
27 #if defined(HAVE_STDARG_H)
28 #include <stdarg.h>
29 #else
30 #if defined(HAVE_VARARGS_H)
31 #include <varargs.h>
32 #else
33 #include <stdarg.h>
34 #endif
35 #endif
36 
37 #if defined(__VXWORKS_OS__)
38 /* VxWorks lacks support for snprintf */
39 int osip_vsnprintf(char *buf, int max, const char *fmt, va_list ap);
40 int osip_snprintf(char *buf, int max, const char *fmt, ...);
41 
42 #define snprintf osip_snprintf
43 #define vsnprintf osip_vsnprintf
44 #endif
45 
46 #include <osipparser2/osip_const.h>
47 
48 #include <osipparser2/osip_list.h>
49 
50 #define SIP_SYNTAX_ERROR (-1)
51 #define SIP_NETWORK_ERROR (-2)
52 #define SIP_ECONNREFUSED (-3)
53 #define SIP_RESSOURCE_ERROR (-4)
54 #define SIP_GLOBAL_ERROR (-5)
55 
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
59 
60 /**************************/
61 /* MALLOC redirections */
62 /**************************/
63 
64 #if !defined(WIN32) && !defined(_WIN32_WCE)
65 
66 #ifndef MINISIZE
67 typedef void *osip_malloc_func_t(size_t size);
68 typedef void osip_free_func_t(void *ptr);
69 typedef void *osip_realloc_func_t(void *ptr, size_t size);
70 
71 extern osip_malloc_func_t *osip_malloc_func;
72 extern osip_realloc_func_t *osip_realloc_func;
73 extern osip_free_func_t *osip_free_func;
74 
75 void osip_set_allocators(osip_malloc_func_t *malloc_func, osip_realloc_func_t *realloc_func, osip_free_func_t *free_func);
76 #endif
77 
78 #ifdef DEBUG_MEM
79 
80 void *_osip_malloc(size_t size, char *file, unsigned short line);
81 void _osip_free(void *ptr);
82 void *_osip_realloc(void *ptr, size_t size, char *file, unsigned short line);
83 
84 #ifndef osip_malloc
85 #define osip_malloc(S) _osip_malloc(S, __FILE__, __LINE__)
86 #endif
87 #ifndef osip_realloc
88 #define osip_realloc(P, S) _osip_realloc(P, S, __FILE__, __LINE__)
89 #endif
90 #ifndef osip_free
91 #define osip_free(P) \
92  { \
93  if (P != NULL) { \
94  _osip_free(P); \
95  } \
96  }
97 #endif
98 
99 #else
100 
101 #ifndef MINISIZE
102 #ifndef osip_malloc
103 #define osip_malloc(S) (osip_malloc_func ? osip_malloc_func(S) : malloc(S))
104 #endif
105 #ifndef osip_realloc
106 #define osip_realloc(P, S) (osip_realloc_func ? osip_realloc_func(P, S) : realloc(P, S))
107 #endif
108 #ifndef osip_free
109 #define osip_free(P) \
110  { \
111  if (P != NULL) { \
112  if (osip_free_func) \
113  osip_free_func(P); \
114  else \
115  free(P); \
116  } \
117  }
118 #endif
119 
120 #else
121 /* MINISIZE code */
122 #ifndef osip_malloc
123 #define osip_malloc(S) malloc(S)
124 #endif
125 #ifndef osip_realloc
126 #define osip_realloc(P, S) realloc(P, S)
127 #endif
128 #ifndef osip_free
129 #define osip_free(P) \
130  { \
131  if (P != NULL) { \
132  free(P); \
133  } \
134  }
135 #endif
136 
137 #endif
138 
139 #endif
140 
141 #else
142 
143 /* Check for memory leaks */
144 #if defined(_DEBUG) && defined(WIN32)
145 #define OSIP_MEMORY_DEBUG
146 #endif
147 
148 #ifdef OSIP_MEMORY_DEBUG
149 /* for windows test purpose */
150 #ifndef osip_malloc
151 #define osip_malloc(S) _osip_malloc(S, __FILE__, __LINE__)
152 #endif
153 #ifndef osip_realloc
154 #define osip_realloc(P, S) _osip_realloc(P, S, __FILE__, __LINE__)
155 #endif
156 #ifndef osip_free
157 #define osip_free(P) \
158  { \
159  if (P != NULL) { \
160  _osip_free(P); \
161  } \
162  }
163 #endif
164 
165 void *_osip_malloc(size_t size, char *file, unsigned short line);
166 void _osip_free(void *ptr);
167 void *_osip_realloc(void *ptr, size_t size, char *file, unsigned short line);
168 #else
169 void *osip_malloc(size_t size);
170 void *osip_realloc(void *, size_t size);
171 void osip_free(void *);
172 #endif
173 
174 #endif
175 
176 #if defined(WIN32) && !defined(__GNUC__)
177 #define alloca _alloca
178 #endif
179 
180 /**************************/
181 /* RANDOM number support */
182 /**************************/
183 
184 unsigned int osip_build_random_number(void);
185 
186 /**************************/
187 /* TIMER support */
188 /**************************/
189 
190 #define SP " \0"
191 
192 void osip_usleep(int useconds);
193 
194 #ifndef MINISIZE
195 int osip_atoi(const char *number);
196 int osip_strcasecmp(const char *s1, const char *s2);
197 int osip_strncasecmp(const char *s1, const char *s2, size_t len);
198 
199 #else
200 #define osip_atoi atoi
201 #define osip_strcasecmp strcasecmp
202 #define osip_strncasecmp strncasecmp
203 #endif
204 
205 char *osip_strcasestr(const char *haystack, const char *needle);
206 
207 /**************************/
208 /* STRING support */
209 /**************************/
210 
211 char *osip_strncpy(char *dest, const char *src, size_t length);
212 char *osip_strdup(const char *ch);
213 char *osip_strdup_without_quote(const char *ch);
214 int osip_tolower(char *word);
215 int osip_clrspace(char *word);
216 int __osip_set_next_token(char **dest, char *buf, int end_separator, char **next);
217 /* find the next unescaped quote and return its index. */
218 const char *__osip_quote_find(const char *qstring);
219 char *osip_enquote(const char *s);
220 void osip_dequote(char *s);
221 
222 unsigned long osip_hash(const char *str);
223 char *osip_str_append(char *dst, const char *src);
224 char *osip_strn_append(char *dst, const char *src, size_t len);
225 char *osip_clrncpy(char *dst, const char *src, size_t len);
226 
227 /**************************/
228 /* LOG&DEBUG support */
229 /**************************/
230 
231 #define LOG_TRUE 1
232 #define LOG_FALSE 0
233 /* levels */
234 typedef enum _trace_level {
235  TRACE_LEVEL0 = 0,
236 #define OSIP_FATAL TRACE_LEVEL0
237  TRACE_LEVEL1 = 1,
238 #define OSIP_BUG TRACE_LEVEL1
239  TRACE_LEVEL2 = 2,
240 #define OSIP_ERROR TRACE_LEVEL2
241  TRACE_LEVEL3 = 3,
242 #define OSIP_WARNING TRACE_LEVEL3
243  TRACE_LEVEL4 = 4,
244 #define OSIP_INFO1 TRACE_LEVEL4
245  TRACE_LEVEL5 = 5,
246 #define OSIP_INFO2 TRACE_LEVEL5
247  TRACE_LEVEL6 = 6,
248 #define OSIP_INFO3 TRACE_LEVEL6
249  TRACE_LEVEL7 = 7,
250 #define OSIP_INFO4 TRACE_LEVEL7
251  END_TRACE_LEVEL = 8
252 } osip_trace_level_t;
253 
254 typedef void osip_trace_func_t(const char *fi, int li, osip_trace_level_t level, const char *chfr, va_list ap);
255 
256 /* these are defined in all cases, but are empty when oSIP is compiled
257  without trace */
258 void osip_trace_initialize_func(osip_trace_level_t level, osip_trace_func_t *func);
259 void osip_trace_initialize_syslog(osip_trace_level_t level, char *ident);
260 int osip_trace_initialize(osip_trace_level_t level, FILE *file);
261 void osip_trace_enable_until_level(osip_trace_level_t level);
262 void osip_trace_enable_level(osip_trace_level_t level);
263 void osip_trace_disable_level(osip_trace_level_t level);
264 int osip_is_trace_level_activate(osip_trace_level_t level);
265 
266 #ifndef ENABLE_TRACE
267 
268 #define TRACE_INITIALIZE(level, file) \
269  do { \
270  } while (0)
271 #define TRACE_ENABLE_LEVEL(level) \
272  do { \
273  } while (0)
274 #define TRACE_DISABLE_LEVEL(level) \
275  do { \
276  } while (0)
277 #define IS_TRACE_LEVEL_ACTIVATE(level) (-1)
278 
279 #else
280 
281 #define TRACE_INITIALIZE(level, file) osip_trace_initialize(level, file)
282 #define TRACE_ENABLE_LEVEL(level) osip_trace_enable_level(level)
283 #define TRACE_DISABLE_LEVEL(level) osip_trace_disable_level(level)
284 #define IS_TRACE_LEVEL_ACTIVATE(level) osip_is_trace_level_activate(level)
285 
286 #endif
287 
288 /* log facility. */
289 /* if f is NULL, current default log file is used. */
290 /* INPUT: level | level of the trace */
291 /* INPUT: f | use f instead of default log file */
292 /* INPUT: chfr | format string for next args */
293 int osip_trace(const char *fi, int li, osip_trace_level_t level, FILE *f, const char *chfr, ...);
294 
295 #ifdef ENABLE_TRACE
296 #define OSIP_TRACE(P) P
297 #else
298 #define OSIP_TRACE(P) \
299  do { \
300  } while (0)
301 #endif
302 
303 #define REMOVE_ELEMENT(first_element, element) \
304  if (element->parent == NULL) { \
305  first_element = element->next; \
306  if (first_element != NULL) \
307  first_element->parent = NULL; \
308  } else { \
309  element->parent->next = element->next; \
310  if (element->next != NULL) \
311  element->next->parent = element->parent; \
312  element->next = NULL; \
313  element->parent = NULL; \
314  }
315 
316 #define ADD_ELEMENT(first_element, element) \
317  if (first_element == NULL) { \
318  first_element = element; \
319  element->next = NULL; \
320  element->parent = NULL; \
321  } else { \
322  element->next = first_element; \
323  element->parent = NULL; \
324  element->next->parent = element; \
325  first_element = element; \
326  }
327 
328 #define APPEND_ELEMENT(type_of_element_t, first_element, element) \
329  if (first_element == NULL) { \
330  first_element = element; \
331  element->next = NULL; /* useless */ \
332  element->parent = NULL; /* useless */ \
333  } else { \
334  type_of_element_t *f; \
335  for (f = first_element; f->next != NULL; f = f->next) { \
336  } \
337  f->next = element; \
338  element->parent = f; \
339  element->next = NULL; \
340  }
341 
342 const char *osip_strerror(int err);
343 
344 #ifdef __cplusplus
345 }
346 #endif
347 #define OSIP_SUCCESS 0
348 #define OSIP_UNDEFINED_ERROR -1
349 #define OSIP_BADPARAMETER -2
350 #define OSIP_WRONG_STATE -3
351 #define OSIP_NOMEM -4
352 #define OSIP_SYNTAXERROR -5
353 #define OSIP_NOTFOUND -6
354 #define OSIP_API_NOT_INITIALIZED -7
355 #define OSIP_NO_NETWORK -10
356 #define OSIP_PORT_BUSY -11
357 #define OSIP_UNKNOWN_HOST -12
358 #define OSIP_DISK_FULL -30
359 #define OSIP_NO_RIGHTS -31
360 #define OSIP_FILE_NOT_EXIST -32
361 #define OSIP_TIMEOUT -50
362 #define OSIP_TOOMUCHCALL -51
363 #define OSIP_WRONG_FORMAT -52
364 #define OSIP_NOCOMMONCODEC -53
365 #define OSIP_RETRY_LIMIT -60
366 #endif /* _PORT_H_ */
oSIP list Routines