a61133163100d21871e3a2dcb9365d1486f6e9c4
[asterisk/asterisk.git] / include / asterisk / utils.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2006, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  * \brief Utility functions
21  */
22
23 #ifndef _ASTERISK_UTILS_H
24 #define _ASTERISK_UTILS_H
25
26 #include "asterisk/compat.h"
27
28 #include <stdlib.h>
29 #include <netinet/in.h>
30 #include <arpa/inet.h>  /* we want to override inet_ntoa */
31 #include <netdb.h>
32 #include <limits.h>
33
34 #include "asterisk/lock.h"
35 #include "asterisk/time.h"
36 #include "asterisk/strings.h"
37 #include "asterisk/logger.h"
38
39 /*! \note
40  \verbatim
41    Note:
42    It is very important to use only unsigned variables to hold
43    bit flags, as otherwise you can fall prey to the compiler's
44    sign-extension antics if you try to use the top two bits in
45    your variable.
46
47    The flag macros below use a set of compiler tricks to verify
48    that the caller is using an "unsigned int" variable to hold
49    the flags, and nothing else. If the caller uses any other
50    type of variable, a warning message similar to this:
51
52    warning: comparison of distinct pointer types lacks cast
53    will be generated.
54
55    The "dummy" variable below is used to make these comparisons.
56
57    Also note that at -O2 or above, this type-safety checking
58    does _not_ produce any additional object code at all.
59  \endverbatim
60 */
61
62 extern unsigned int __unsigned_int_flags_dummy;
63
64 #define ast_test_flag(p,flag)           ({ \
65                                         typeof ((p)->flags) __p = (p)->flags; \
66                                         typeof (__unsigned_int_flags_dummy) __x = 0; \
67                                         (void) (&__p == &__x); \
68                                         ((p)->flags & (flag)); \
69                                         })
70
71 #define ast_set_flag(p,flag)            do { \
72                                         typeof ((p)->flags) __p = (p)->flags; \
73                                         typeof (__unsigned_int_flags_dummy) __x = 0; \
74                                         (void) (&__p == &__x); \
75                                         ((p)->flags |= (flag)); \
76                                         } while(0)
77
78 #define ast_clear_flag(p,flag)          do { \
79                                         typeof ((p)->flags) __p = (p)->flags; \
80                                         typeof (__unsigned_int_flags_dummy) __x = 0; \
81                                         (void) (&__p == &__x); \
82                                         ((p)->flags &= ~(flag)); \
83                                         } while(0)
84
85 #define ast_copy_flags(dest,src,flagz)  do { \
86                                         typeof ((dest)->flags) __d = (dest)->flags; \
87                                         typeof ((src)->flags) __s = (src)->flags; \
88                                         typeof (__unsigned_int_flags_dummy) __x = 0; \
89                                         (void) (&__d == &__x); \
90                                         (void) (&__s == &__x); \
91                                         (dest)->flags &= ~(flagz); \
92                                         (dest)->flags |= ((src)->flags & (flagz)); \
93                                         } while (0)
94
95 #define ast_set2_flag(p,value,flag)     do { \
96                                         typeof ((p)->flags) __p = (p)->flags; \
97                                         typeof (__unsigned_int_flags_dummy) __x = 0; \
98                                         (void) (&__p == &__x); \
99                                         if (value) \
100                                                 (p)->flags |= (flag); \
101                                         else \
102                                                 (p)->flags &= ~(flag); \
103                                         } while (0)
104
105 /* Non-type checking variations for non-unsigned int flags.  You
106    should only use non-unsigned int flags where required by 
107    protocol etc and if you know what you're doing :)  */
108 #define ast_test_flag_nonstd(p,flag)            ({ \
109                                         ((p)->flags & (flag)); \
110                                         })
111
112 #define ast_set_flag_nonstd(p,flag)             do { \
113                                         ((p)->flags |= (flag)); \
114                                         } while(0)
115
116 #define ast_clear_flag_nonstd(p,flag)           do { \
117                                         ((p)->flags &= ~(flag)); \
118                                         } while(0)
119
120 #define ast_copy_flags_nonstd(dest,src,flagz)   do { \
121                                         (dest)->flags &= ~(flagz); \
122                                         (dest)->flags |= ((src)->flags & (flagz)); \
123                                         } while (0)
124
125 #define ast_set2_flag_nonstd(p,value,flag)      do { \
126                                         if (value) \
127                                                 (p)->flags |= (flag); \
128                                         else \
129                                                 (p)->flags &= ~(flag); \
130                                         } while (0)
131
132 #define AST_FLAGS_ALL UINT_MAX
133
134 struct ast_flags {
135         unsigned int flags;
136 };
137
138 struct ast_hostent {
139         struct hostent hp;
140         char buf[1024];
141 };
142
143 struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp);
144
145 /*! \brief Produces MD5 hash based on input string */
146 void ast_md5_hash(char *output, char *input);
147 /* ast_sha1_hash
148         \brief Produces SHA1 hash based on input string */
149 void ast_sha1_hash(char *output, char *input);
150
151 /*! \brief Encode string into Base 64 encoded string */
152 int ast_base64encode(char *dst, const unsigned char *src, int srclen, int max);
153 /*! \brief Decode Base 64 encoded string */
154 int ast_base64decode(unsigned char *dst, const char *src, int max);
155
156 /*! ast_uri_encode
157         \brief Turn text string to URI-encoded %XX version 
158         At this point, we're converting from ISO-8859-x (8-bit), not UTF8
159         as in the SIP protocol spec 
160         If doreserved == 1 we will convert reserved characters also.
161         RFC 2396, section 2.4
162         outbuf needs to have more memory allocated than the instring
163         to have room for the expansion. Every char that is converted
164         is replaced by three ASCII characters.
165         \param string   String to be converted
166         \param outbuf   Resulting encoded string
167         \param buflen   Size of output buffer
168         \param doreserved       Convert reserved characters
169 */
170 char *ast_uri_encode(const char *string, char *outbuf, int buflen, int doreserved);
171
172 /*!     \brief Decode URI, URN, URL (overwrite string)
173         \param s        String to be decoded 
174  */
175 void ast_uri_decode(char *s);
176
177 static force_inline void ast_slinear_saturated_add(short *input, short *value)
178 {
179         int res;
180
181         res = (int) *input + *value;
182         if (res > 32767)
183                 *input = 32767;
184         else if (res < -32767)
185                 *input = -32767;
186         else
187                 *input = (short) res;
188 }
189         
190 static force_inline void ast_slinear_saturated_multiply(short *input, short *value)
191 {
192         int res;
193
194         res = (int) *input * *value;
195         if (res > 32767)
196                 *input = 32767;
197         else if (res < -32767)
198                 *input = -32767;
199         else
200                 *input = (short) res;
201 }
202
203 static force_inline void ast_slinear_saturated_divide(short *input, short *value)
204 {
205         *input /= *value;
206 }
207
208 int test_for_thread_safety(void);
209
210 const char *ast_inet_ntoa(char *buf, int bufsiz, struct in_addr ia);
211
212 #ifdef inet_ntoa
213 #undef inet_ntoa
214 #endif
215 #define inet_ntoa __dont__use__inet_ntoa__use__ast_inet_ntoa__instead__
216
217 int ast_utils_init(void);
218 int ast_wait_for_input(int fd, int ms);
219
220 /*! \brief Compares the source address and port of two sockaddr_in */
221 static force_inline int inaddrcmp(const struct sockaddr_in *sin1, const struct sockaddr_in *sin2)
222 {
223         return ((sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) 
224                 || (sin1->sin_port != sin2->sin_port));
225 }
226
227 #define ast_pthread_create(a,b,c,d) ast_pthread_create_stack(a,b,c,d,0)
228 int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize);
229
230 /*!
231         \brief Process a string to find and replace characters
232         \param start The string to analyze
233         \param find The character to find
234         \param replace_with The character that will replace the one we are looking for
235 */
236 char *ast_process_quotes_and_slashes(char *start, char find, char replace_with);
237
238 #ifndef HAVE_GETLOADAVG
239 int getloadavg(double *list, int nelem);
240 #endif
241
242 #define AST_STACKSIZE 256 * 1024
243 #define AST_MAX_FILENAME_LEN    256     /*!< Maximum length of file names */
244 #define AST_MAX_SHELL_COMMAND   512     /*!< Maximum length of shell commands */
245
246 #ifdef linux
247 #define ast_random random
248 #else
249 long int ast_random(void);
250 #endif
251
252 /*!
253   \brief A wrapper for malloc()
254
255   ast_malloc() is a wrapper for malloc() that will generate an Asterisk log
256   message in the case that the allocation fails.
257
258   The argument and return value are the same as malloc()
259 */
260 #define ast_malloc(len) \
261         _ast_malloc((len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
262
263 AST_INLINE_API(
264 void *_ast_malloc(size_t len, const char *file, int lineno, const char *func),
265 {
266         void *p;
267
268         p = malloc(len);
269
270         if (!p)
271                 ast_log(LOG_ERROR, "Memory Allocation Failure - '%d' bytes in function %s at line %d of %s\n", (int)len, func, lineno, file);
272
273         return p;
274 }
275 )
276
277 /*!
278   \brief A wrapper for calloc()
279
280   ast_calloc() is a wrapper for calloc() that will generate an Asterisk log
281   message in the case that the allocation fails.
282
283   The arguments and return value are the same as calloc()
284 */
285 #define ast_calloc(num, len) \
286         _ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
287
288 AST_INLINE_API(
289 void *_ast_calloc(size_t num, size_t len, const char *file, int lineno, const char *func),
290 {
291         void *p;
292
293         p = calloc(num, len);
294
295         if (!p)
296                 ast_log(LOG_ERROR, "Memory Allocation Failure - '%d' bytes in function %s at line %d of %s\n", (int)len, func, lineno, file);
297
298         return p;
299 }
300 )
301
302 /*!
303   \brief A wrapper for realloc()
304
305   ast_realloc() is a wrapper for realloc() that will generate an Asterisk log
306   message in the case that the allocation fails.
307
308   The arguments and return value are the same as realloc()
309 */
310 #define ast_realloc(p, len) \
311         _ast_realloc((p), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
312
313 AST_INLINE_API(
314 void *_ast_realloc(void *p, size_t len, const char *file, int lineno, const char *func),
315 {
316         void *newp;
317
318         newp = realloc(p, len);
319
320         if (!newp)
321                 ast_log(LOG_ERROR, "Memory Allocation Failure - '%d' bytes in function %s at line %d of %s\n", (int)len, func, lineno, file);
322
323         return newp;
324 }
325 )
326
327 /*!
328   \brief A wrapper for strdup()
329
330   ast_strdup() is a wrapper for strdup() that will generate an Asterisk log
331   message in the case that the allocation fails.
332
333   ast_strdup(), unlike strdup(), can safely accept a NULL argument. If a NULL
334   argument is provided, ast_strdup will return NULL without generating any
335   kind of error log message.
336
337   The argument and return value are the same as strdup()
338 */
339 #define ast_strdup(str) \
340         _ast_strdup((str), __FILE__, __LINE__, __PRETTY_FUNCTION__)
341
342 AST_INLINE_API(
343 char *_ast_strdup(const char *str, const char *file, int lineno, const char *func),
344 {
345         char *newstr = NULL;
346
347         if (str) {
348                 newstr = strdup(str);
349
350                 if (!newstr)
351                         ast_log(LOG_ERROR, "Memory Allocation Failure - Could not duplicate '%s' in function %s at line %d of %s\n", str, func, lineno, file);
352         }
353
354         return newstr;
355 }
356 )
357
358 /*!
359   \brief A wrapper for strndup()
360
361   ast_strndup() is a wrapper for strndup() that will generate an Asterisk log
362   message in the case that the allocation fails.
363
364   ast_strndup(), unlike strndup(), can safely accept a NULL argument for the
365   string to duplicate. If a NULL argument is provided, ast_strdup will return  
366   NULL without generating any kind of error log message.
367
368   The arguments and return value are the same as strndup()
369 */
370 #define ast_strndup(str, len) \
371         _ast_strndup((str), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
372
373 AST_INLINE_API(
374 char *_ast_strndup(const char *str, size_t len, const char *file, int lineno, const char *func),
375 {
376         char *newstr = NULL;
377
378         if (str) {
379                 newstr = strndup(str, len);
380
381                 if (!newstr)
382                         ast_log(LOG_ERROR, "Memory Allocation Failure - Could not duplicate '%d' bytes of '%s' in function %s at line %d of %s\n", (int)len, str, func, lineno, file);
383         }
384
385         return newstr;
386 }
387 )
388
389 #if !defined(ast_strdupa) && defined(__GNUC__)
390 /*!
391   \brief duplicate a string in memory from the stack
392   \param s The string to duplicate
393
394   This macro will duplicate the given string.  It returns a pointer to the stack
395   allocatted memory for the new string.
396 */
397 #define ast_strdupa(s)                                                    \
398         (__extension__                                                    \
399         ({                                                                \
400                 const char *__old = (s);                                  \
401                 size_t __len = strlen(__old) + 1;                         \
402                 char *__new = __builtin_alloca(__len);                    \
403                 if (__builtin_expect(!__new, 0))                          \
404                         ast_log(LOG_ERROR, "Stack Allocation Error in"    \
405                                 "function '%s' at line '%d' of '%s'!\n",  \
406                                 __PRETTY_FUNCTION__, __LINE__, __FILE__); \
407                 else                                                      \
408                         memcpy (__new, __old, __len);                     \
409                 __new;                                                    \
410         }))
411 #endif
412
413 #endif /* _ASTERISK_UTILS_H */