Wed Oct 28 13:31:10 2009

Asterisk developer's documentation


utils.h

Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2006, Digium, Inc.
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  *
00008  * See http://www.asterisk.org for more information about
00009  * the Asterisk project. Please do not directly contact
00010  * any of the maintainers of this project for assistance;
00011  * the project provides a web site, mailing lists and IRC
00012  * channels for your use.
00013  *
00014  * This program is free software, distributed under the terms of
00015  * the GNU General Public License Version 2. See the LICENSE file
00016  * at the top of the source tree.
00017  */
00018 
00019 /*! \file
00020  * \brief Utility functions
00021  */
00022 
00023 #ifndef _ASTERISK_UTILS_H
00024 #define _ASTERISK_UTILS_H
00025 
00026 #include "asterisk/network.h"
00027 
00028 #include <time.h> /* we want to override localtime_r */
00029 #include <unistd.h>
00030 #include <string.h>
00031 
00032 #include "asterisk/lock.h"
00033 #include "asterisk/time.h"
00034 #include "asterisk/logger.h"
00035 #include "asterisk/localtime.h"
00036 #include "asterisk/stringfields.h"
00037 
00038 /*!
00039 \note \verbatim
00040    Note:
00041    It is very important to use only unsigned variables to hold
00042    bit flags, as otherwise you can fall prey to the compiler's
00043    sign-extension antics if you try to use the top two bits in
00044    your variable.
00045 
00046    The flag macros below use a set of compiler tricks to verify
00047    that the caller is using an "unsigned int" variable to hold
00048    the flags, and nothing else. If the caller uses any other
00049    type of variable, a warning message similar to this:
00050 
00051    warning: comparison of distinct pointer types lacks cast
00052    will be generated.
00053 
00054    The "dummy" variable below is used to make these comparisons.
00055 
00056    Also note that at -O2 or above, this type-safety checking
00057    does _not_ produce any additional object code at all.
00058  \endverbatim
00059 */
00060 
00061 extern unsigned int __unsigned_int_flags_dummy;
00062 
00063 #define ast_test_flag(p,flag)       ({ \
00064                typeof ((p)->flags) __p = (p)->flags; \
00065                typeof (__unsigned_int_flags_dummy) __x = 0; \
00066                (void) (&__p == &__x); \
00067                ((p)->flags & (flag)); \
00068                })
00069 
00070 #define ast_set_flag(p,flag)     do { \
00071                typeof ((p)->flags) __p = (p)->flags; \
00072                typeof (__unsigned_int_flags_dummy) __x = 0; \
00073                (void) (&__p == &__x); \
00074                ((p)->flags |= (flag)); \
00075                } while(0)
00076 
00077 #define ast_clear_flag(p,flag)      do { \
00078                typeof ((p)->flags) __p = (p)->flags; \
00079                typeof (__unsigned_int_flags_dummy) __x = 0; \
00080                (void) (&__p == &__x); \
00081                ((p)->flags &= ~(flag)); \
00082                } while(0)
00083 
00084 #define ast_copy_flags(dest,src,flagz) do { \
00085                typeof ((dest)->flags) __d = (dest)->flags; \
00086                typeof ((src)->flags) __s = (src)->flags; \
00087                typeof (__unsigned_int_flags_dummy) __x = 0; \
00088                (void) (&__d == &__x); \
00089                (void) (&__s == &__x); \
00090                (dest)->flags &= ~(flagz); \
00091                (dest)->flags |= ((src)->flags & (flagz)); \
00092                } while (0)
00093 
00094 #define ast_set2_flag(p,value,flag) do { \
00095                typeof ((p)->flags) __p = (p)->flags; \
00096                typeof (__unsigned_int_flags_dummy) __x = 0; \
00097                (void) (&__p == &__x); \
00098                if (value) \
00099                   (p)->flags |= (flag); \
00100                else \
00101                   (p)->flags &= ~(flag); \
00102                } while (0)
00103 
00104 #define ast_set_flags_to(p,flag,value) do { \
00105                typeof ((p)->flags) __p = (p)->flags; \
00106                typeof (__unsigned_int_flags_dummy) __x = 0; \
00107                (void) (&__p == &__x); \
00108                (p)->flags &= ~(flag); \
00109                (p)->flags |= (value); \
00110                } while (0)
00111 
00112 
00113 /* The following 64-bit flag code can most likely be erased after app_dial
00114    is reorganized to either reduce the large number of options, or handle
00115    them in some other way. At the time of this writing, app_dial would be
00116    the only user of 64-bit option flags */
00117 
00118 extern uint64_t __unsigned_int_flags_dummy64;
00119 
00120 #define ast_test_flag64(p,flag)     ({ \
00121                typeof ((p)->flags) __p = (p)->flags; \
00122                typeof (__unsigned_int_flags_dummy64) __x = 0; \
00123                (void) (&__p == &__x); \
00124                ((p)->flags & (flag)); \
00125                })
00126 
00127 #define ast_set_flag64(p,flag)      do { \
00128                typeof ((p)->flags) __p = (p)->flags; \
00129                typeof (__unsigned_int_flags_dummy64) __x = 0; \
00130                (void) (&__p == &__x); \
00131                ((p)->flags |= (flag)); \
00132                } while(0)
00133 
00134 #define ast_clear_flag64(p,flag)       do { \
00135                typeof ((p)->flags) __p = (p)->flags; \
00136                typeof (__unsigned_int_flags_dummy64) __x = 0; \
00137                (void) (&__p == &__x); \
00138                ((p)->flags &= ~(flag)); \
00139                } while(0)
00140 
00141 #define ast_copy_flags64(dest,src,flagz)  do { \
00142                typeof ((dest)->flags) __d = (dest)->flags; \
00143                typeof ((src)->flags) __s = (src)->flags; \
00144                typeof (__unsigned_int_flags_dummy64) __x = 0; \
00145                (void) (&__d == &__x); \
00146                (void) (&__s == &__x); \
00147                (dest)->flags &= ~(flagz); \
00148                (dest)->flags |= ((src)->flags & (flagz)); \
00149                } while (0)
00150 
00151 #define ast_set2_flag64(p,value,flag)  do { \
00152                typeof ((p)->flags) __p = (p)->flags; \
00153                typeof (__unsigned_int_flags_dummy64) __x = 0; \
00154                (void) (&__p == &__x); \
00155                if (value) \
00156                   (p)->flags |= (flag); \
00157                else \
00158                   (p)->flags &= ~(flag); \
00159                } while (0)
00160 
00161 #define ast_set_flags_to64(p,flag,value)  do { \
00162                typeof ((p)->flags) __p = (p)->flags; \
00163                typeof (__unsigned_int_flags_dummy64) __x = 0; \
00164                (void) (&__p == &__x); \
00165                (p)->flags &= ~(flag); \
00166                (p)->flags |= (value); \
00167                } while (0)
00168 
00169 
00170 /* Non-type checking variations for non-unsigned int flags.  You
00171    should only use non-unsigned int flags where required by 
00172    protocol etc and if you know what you're doing :)  */
00173 #define ast_test_flag_nonstd(p,flag) \
00174                ((p)->flags & (flag))
00175 
00176 #define ast_set_flag_nonstd(p,flag)       do { \
00177                ((p)->flags |= (flag)); \
00178                } while(0)
00179 
00180 #define ast_clear_flag_nonstd(p,flag)     do { \
00181                ((p)->flags &= ~(flag)); \
00182                } while(0)
00183 
00184 #define ast_copy_flags_nonstd(dest,src,flagz)   do { \
00185                (dest)->flags &= ~(flagz); \
00186                (dest)->flags |= ((src)->flags & (flagz)); \
00187                } while (0)
00188 
00189 #define ast_set2_flag_nonstd(p,value,flag)   do { \
00190                if (value) \
00191                   (p)->flags |= (flag); \
00192                else \
00193                   (p)->flags &= ~(flag); \
00194                } while (0)
00195 
00196 #define AST_FLAGS_ALL UINT_MAX
00197 
00198 /*! \brief Structure used to handle boolean flags 
00199 */
00200 struct ast_flags {
00201    unsigned int flags;
00202 };
00203 
00204 /*! \brief Structure used to handle a large number of boolean flags == used only in app_dial?
00205 */
00206 struct ast_flags64 {
00207    uint64_t flags;
00208 };
00209 
00210 struct ast_hostent {
00211    struct hostent hp;
00212    char buf[1024];
00213 };
00214 
00215 /*! \brief Thread-safe gethostbyname function to use in Asterisk */
00216 struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp);
00217 
00218 /*!  \brief Produces MD5 hash based on input string */
00219 void ast_md5_hash(char *output, const char *input);
00220 /*! \brief Produces SHA1 hash based on input string */
00221 void ast_sha1_hash(char *output, const char *input);
00222 
00223 int ast_base64encode_full(char *dst, const unsigned char *src, int srclen, int max, int linebreaks);
00224 
00225 #undef MIN
00226 #define MIN(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a > __b) ? __b : __a);})
00227 #undef MAX
00228 #define MAX(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a < __b) ? __b : __a);})
00229 
00230 /*!
00231  * \brief Encode data in base64
00232  * \param dst the destination buffer
00233  * \param src the source data to be encoded
00234  * \param srclen the number of bytes present in the source buffer
00235  * \param max the maximum number of bytes to write into the destination
00236  *        buffer, *including* the terminating NULL character.
00237  */
00238 int ast_base64encode(char *dst, const unsigned char *src, int srclen, int max);
00239 
00240 /*!
00241  * \brief Decode data from base64
00242  * \param dst the destination buffer
00243  * \param src the source buffer
00244  * \param max The maximum number of bytes to write into the destination
00245  *            buffer.  Note that this function will not ensure that the
00246  *            destination buffer is NULL terminated.  So, in general,
00247  *            this parameter should be sizeof(dst) - 1.
00248  */
00249 int ast_base64decode(unsigned char *dst, const char *src, int max);
00250 
00251 /*!  \brief Turn text string to URI-encoded %XX version 
00252 
00253 \note    At this point, we're converting from ISO-8859-x (8-bit), not UTF8
00254    as in the SIP protocol spec 
00255    If doreserved == 1 we will convert reserved characters also.
00256    RFC 2396, section 2.4
00257    outbuf needs to have more memory allocated than the instring
00258    to have room for the expansion. Every char that is converted
00259    is replaced by three ASCII characters.
00260    \param string  String to be converted
00261    \param outbuf  Resulting encoded string
00262    \param buflen  Size of output buffer
00263    \param doreserved Convert reserved characters
00264 */
00265 
00266 char *ast_uri_encode(const char *string, char *outbuf, int buflen, int doreserved);
00267 
00268 /*!   \brief Decode URI, URN, URL (overwrite string)
00269    \param s String to be decoded 
00270  */
00271 void ast_uri_decode(char *s);
00272 
00273 static force_inline void ast_slinear_saturated_add(short *input, short *value)
00274 {
00275    int res;
00276 
00277    res = (int) *input + *value;
00278    if (res > 32767)
00279       *input = 32767;
00280    else if (res < -32767)
00281       *input = -32767;
00282    else
00283       *input = (short) res;
00284 }
00285 
00286 static force_inline void ast_slinear_saturated_subtract(short *input, short *value)
00287 {
00288    int res;
00289 
00290    res = (int) *input - *value;
00291    if (res > 32767)
00292       *input = 32767;
00293    else if (res < -32767)
00294       *input = -32767;
00295    else
00296       *input = (short) res;
00297 }
00298    
00299 static force_inline void ast_slinear_saturated_multiply(short *input, short *value)
00300 {
00301    int res;
00302 
00303    res = (int) *input * *value;
00304    if (res > 32767)
00305       *input = 32767;
00306    else if (res < -32767)
00307       *input = -32767;
00308    else
00309       *input = (short) res;
00310 }
00311 
00312 static force_inline void ast_slinear_saturated_divide(short *input, short *value)
00313 {
00314    *input /= *value;
00315 }
00316 
00317 #ifdef localtime_r
00318 #undef localtime_r
00319 #endif
00320 #define localtime_r __dont_use_localtime_r_use_ast_localtime_instead__
00321 
00322 int ast_utils_init(void);
00323 int ast_wait_for_input(int fd, int ms);
00324 
00325 /*!
00326    \brief Try to write string, but wait no more than ms milliseconds
00327    before timing out.
00328 
00329    \note If you are calling ast_carefulwrite, it is assumed that you are calling
00330    it on a file descriptor that _DOES_ have NONBLOCK set.  This way,
00331    there is only one system call made to do a write, unless we actually
00332    have a need to wait.  This way, we get better performance.
00333 */
00334 int ast_carefulwrite(int fd, char *s, int len, int timeoutms);
00335 
00336 /*!
00337  * \brief Write data to a file stream with a timeout
00338  *
00339  * \param f the file stream to write to
00340  * \param fd the file description to poll on to know when the file stream can
00341  *        be written to without blocking.
00342  * \param s the buffer to write from
00343  * \param len the number of bytes to write
00344  * \param timeoutms The maximum amount of time to block in this function trying
00345  *        to write, specified in milliseconds.
00346  *
00347  * \note This function assumes that the associated file stream has been set up
00348  *       as non-blocking.
00349  *
00350  * \retval 0 success
00351  * \retval -1 error
00352  */
00353 int ast_careful_fwrite(FILE *f, int fd, const char *s, size_t len, int timeoutms);
00354 
00355 /*
00356  * Thread management support (should be moved to lock.h or a different header)
00357  */
00358 
00359 #define AST_STACKSIZE (((sizeof(void *) * 8 * 8) - 16) * 1024)
00360 
00361 #if defined(LOW_MEMORY)
00362 #define AST_BACKGROUND_STACKSIZE (((sizeof(void *) * 8 * 2) - 16) * 1024)
00363 #else
00364 #define AST_BACKGROUND_STACKSIZE AST_STACKSIZE
00365 #endif
00366 
00367 void ast_register_thread(char *name);
00368 void ast_unregister_thread(void *id);
00369 
00370 int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *),
00371               void *data, size_t stacksize, const char *file, const char *caller,
00372               int line, const char *start_fn);
00373 
00374 int ast_pthread_create_detached_stack(pthread_t *thread, pthread_attr_t *attr, void*(*start_routine)(void *),
00375              void *data, size_t stacksize, const char *file, const char *caller,
00376              int line, const char *start_fn);
00377 
00378 #define ast_pthread_create(a, b, c, d)             \
00379    ast_pthread_create_stack(a, b, c, d,         \
00380       0, __FILE__, __FUNCTION__, __LINE__, #c)
00381 
00382 #define ast_pthread_create_detached(a, b, c, d)       \
00383    ast_pthread_create_detached_stack(a, b, c, d,      \
00384       0, __FILE__, __FUNCTION__, __LINE__, #c)
00385 
00386 #define ast_pthread_create_background(a, b, c, d)     \
00387    ast_pthread_create_stack(a, b, c, d,         \
00388       AST_BACKGROUND_STACKSIZE,        \
00389       __FILE__, __FUNCTION__, __LINE__, #c)
00390 
00391 #define ast_pthread_create_detached_background(a, b, c, d)  \
00392    ast_pthread_create_detached_stack(a, b, c, d,      \
00393       AST_BACKGROUND_STACKSIZE,        \
00394       __FILE__, __FUNCTION__, __LINE__, #c)
00395 
00396 /* End of thread management support */
00397 
00398 /*!
00399    \brief Process a string to find and replace characters
00400    \param start The string to analyze
00401    \param find The character to find
00402    \param replace_with The character that will replace the one we are looking for
00403 */
00404 char *ast_process_quotes_and_slashes(char *start, char find, char replace_with);
00405 
00406 long int ast_random(void);
00407 
00408 
00409 /*! 
00410  * \brief free() wrapper
00411  *
00412  * ast_free_ptr should be used when a function pointer for free() needs to be passed
00413  * as the argument to a function. Otherwise, astmm will cause seg faults.
00414  */
00415 #ifdef __AST_DEBUG_MALLOC
00416 static void ast_free_ptr(void *ptr) attribute_unused;
00417 static void ast_free_ptr(void *ptr)
00418 {
00419    ast_free(ptr);
00420 }
00421 #else
00422 #define ast_free free
00423 #define ast_free_ptr ast_free
00424 #endif
00425 
00426 #ifndef __AST_DEBUG_MALLOC
00427 
00428 #define MALLOC_FAILURE_MSG \
00429    ast_log(LOG_ERROR, "Memory Allocation Failure in function %s at line %d of %s\n", func, lineno, file);
00430 /*!
00431  * \brief A wrapper for malloc()
00432  *
00433  * ast_malloc() is a wrapper for malloc() that will generate an Asterisk log
00434  * message in the case that the allocation fails.
00435  *
00436  * The argument and return value are the same as malloc()
00437  */
00438 #define ast_malloc(len) \
00439    _ast_malloc((len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
00440 
00441 AST_INLINE_API(
00442 void * attribute_malloc _ast_malloc(size_t len, const char *file, int lineno, const char *func),
00443 {
00444    void *p;
00445 
00446    if (!(p = malloc(len)))
00447       MALLOC_FAILURE_MSG;
00448 
00449    return p;
00450 }
00451 )
00452 
00453 /*!
00454  * \brief A wrapper for calloc()
00455  *
00456  * ast_calloc() is a wrapper for calloc() that will generate an Asterisk log
00457  * message in the case that the allocation fails.
00458  *
00459  * The arguments and return value are the same as calloc()
00460  */
00461 #define ast_calloc(num, len) \
00462    _ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
00463 
00464 AST_INLINE_API(
00465 void * attribute_malloc _ast_calloc(size_t num, size_t len, const char *file, int lineno, const char *func),
00466 {
00467    void *p;
00468 
00469    if (!(p = calloc(num, len)))
00470       MALLOC_FAILURE_MSG;
00471 
00472    return p;
00473 }
00474 )
00475 
00476 /*!
00477  * \brief A wrapper for calloc() for use in cache pools
00478  *
00479  * ast_calloc_cache() is a wrapper for calloc() that will generate an Asterisk log
00480  * message in the case that the allocation fails. When memory debugging is in use,
00481  * the memory allocated by this function will be marked as 'cache' so it can be
00482  * distinguished from normal memory allocations.
00483  *
00484  * The arguments and return value are the same as calloc()
00485  */
00486 #define ast_calloc_cache(num, len) \
00487    _ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
00488 
00489 /*!
00490  * \brief A wrapper for realloc()
00491  *
00492  * ast_realloc() is a wrapper for realloc() that will generate an Asterisk log
00493  * message in the case that the allocation fails.
00494  *
00495  * The arguments and return value are the same as realloc()
00496  */
00497 #define ast_realloc(p, len) \
00498    _ast_realloc((p), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
00499 
00500 AST_INLINE_API(
00501 void * attribute_malloc _ast_realloc(void *p, size_t len, const char *file, int lineno, const char *func),
00502 {
00503    void *newp;
00504 
00505    if (!(newp = realloc(p, len)))
00506       MALLOC_FAILURE_MSG;
00507 
00508    return newp;
00509 }
00510 )
00511 
00512 /*!
00513  * \brief A wrapper for strdup()
00514  *
00515  * ast_strdup() is a wrapper for strdup() that will generate an Asterisk log
00516  * message in the case that the allocation fails.
00517  *
00518  * ast_strdup(), unlike strdup(), can safely accept a NULL argument. If a NULL
00519  * argument is provided, ast_strdup will return NULL without generating any
00520  * kind of error log message.
00521  *
00522  * The argument and return value are the same as strdup()
00523  */
00524 #define ast_strdup(str) \
00525    _ast_strdup((str), __FILE__, __LINE__, __PRETTY_FUNCTION__)
00526 
00527 AST_INLINE_API(
00528 char * attribute_malloc _ast_strdup(const char *str, const char *file, int lineno, const char *func),
00529 {
00530    char *newstr = NULL;
00531 
00532    if (str) {
00533       if (!(newstr = strdup(str)))
00534          MALLOC_FAILURE_MSG;
00535    }
00536 
00537    return newstr;
00538 }
00539 )
00540 
00541 /*!
00542  * \brief A wrapper for strndup()
00543  *
00544  * ast_strndup() is a wrapper for strndup() that will generate an Asterisk log
00545  * message in the case that the allocation fails.
00546  *
00547  * ast_strndup(), unlike strndup(), can safely accept a NULL argument for the
00548  * string to duplicate. If a NULL argument is provided, ast_strdup will return  
00549  * NULL without generating any kind of error log message.
00550  *
00551  * The arguments and return value are the same as strndup()
00552  */
00553 #define ast_strndup(str, len) \
00554    _ast_strndup((str), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
00555 
00556 AST_INLINE_API(
00557 char * attribute_malloc _ast_strndup(const char *str, size_t len, const char *file, int lineno, const char *func),
00558 {
00559    char *newstr = NULL;
00560 
00561    if (str) {
00562       if (!(newstr = strndup(str, len)))
00563          MALLOC_FAILURE_MSG;
00564    }
00565 
00566    return newstr;
00567 }
00568 )
00569 
00570 /*!
00571  * \brief A wrapper for asprintf()
00572  *
00573  * ast_asprintf() is a wrapper for asprintf() that will generate an Asterisk log
00574  * message in the case that the allocation fails.
00575  *
00576  * The arguments and return value are the same as asprintf()
00577  */
00578 #define ast_asprintf(ret, fmt, ...) \
00579    _ast_asprintf((ret), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, __VA_ARGS__)
00580 
00581 int __attribute__((format(printf, 5, 6)))
00582    _ast_asprintf(char **ret, const char *file, int lineno, const char *func, const char *fmt, ...);
00583 
00584 /*!
00585  * \brief A wrapper for vasprintf()
00586  *
00587  * ast_vasprintf() is a wrapper for vasprintf() that will generate an Asterisk log
00588  * message in the case that the allocation fails.
00589  *
00590  * The arguments and return value are the same as vasprintf()
00591  */
00592 #define ast_vasprintf(ret, fmt, ap) \
00593    _ast_vasprintf((ret), __FILE__, __LINE__, __PRETTY_FUNCTION__, (fmt), (ap))
00594 
00595 AST_INLINE_API(
00596 __attribute__((format(printf, 5, 0)))
00597 int _ast_vasprintf(char **ret, const char *file, int lineno, const char *func, const char *fmt, va_list ap),
00598 {
00599    int res;
00600 
00601    if ((res = vasprintf(ret, fmt, ap)) == -1)
00602       MALLOC_FAILURE_MSG;
00603 
00604    return res;
00605 }
00606 )
00607 
00608 #endif /* AST_DEBUG_MALLOC */
00609 
00610 #if !defined(ast_strdupa) && defined(__GNUC__)
00611 /*!
00612   \brief duplicate a string in memory from the stack
00613   \param s The string to duplicate
00614 
00615   This macro will duplicate the given string.  It returns a pointer to the stack
00616   allocatted memory for the new string.
00617 */
00618 #define ast_strdupa(s)                                                    \
00619    (__extension__                                                    \
00620    ({                                                                \
00621       const char *__old = (s);                                  \
00622       size_t __len = strlen(__old) + 1;                         \
00623       char *__new = __builtin_alloca(__len);                    \
00624       memcpy (__new, __old, __len);                             \
00625       __new;                                                    \
00626    }))
00627 #endif
00628 
00629 /*!
00630   \brief Disable PMTU discovery on a socket
00631   \param sock The socket to manipulate
00632   \return Nothing
00633 
00634   On Linux, UDP sockets default to sending packets with the Dont Fragment (DF)
00635   bit set. This is supposedly done to allow the application to do PMTU
00636   discovery, but Asterisk does not do this.
00637 
00638   Because of this, UDP packets sent by Asterisk that are larger than the MTU
00639   of any hop in the path will be lost. This function can be called on a socket
00640   to ensure that the DF bit will not be set.
00641  */
00642 void ast_enable_packet_fragmentation(int sock);
00643 
00644 /*!
00645   \brief Recursively create directory path
00646   \param path The directory path to create
00647   \param mode The permissions with which to try to create the directory
00648   \return 0 on success or an error code otherwise
00649 
00650   Creates a directory path, creating parent directories as needed.
00651  */
00652 int ast_mkdir(const char *path, int mode);
00653 
00654 #define ARRAY_LEN(a) (sizeof(a) / sizeof(0[a]))
00655 
00656 
00657 /* Definition for Digest authorization */
00658 struct ast_http_digest {
00659    AST_DECLARE_STRING_FIELDS(
00660       AST_STRING_FIELD(username);
00661       AST_STRING_FIELD(nonce);
00662       AST_STRING_FIELD(uri);
00663       AST_STRING_FIELD(realm);
00664       AST_STRING_FIELD(domain);
00665       AST_STRING_FIELD(response);
00666       AST_STRING_FIELD(cnonce);
00667       AST_STRING_FIELD(opaque);
00668       AST_STRING_FIELD(nc);
00669    );
00670    int qop;    /* Flag set to 1, if we send/recv qop="quth" */
00671 };
00672 
00673 /*!
00674  *\brief Parse digest authorization header.
00675  *\return Returns -1 if we have no auth or something wrong with digest.
00676  *\note This function may be used for Digest request and responce header.
00677  * request arg is set to nonzero, if we parse Digest Request.
00678  * pedantic arg can be set to nonzero if we need to do addition Digest check.
00679  */
00680 int ast_parse_digest(const char *digest, struct ast_http_digest *d, int request, int pedantic);
00681 
00682 
00683 #ifdef AST_DEVMODE
00684 #define ast_assert(a) _ast_assert(a, # a, __FILE__, __LINE__, __PRETTY_FUNCTION__)
00685 static void force_inline _ast_assert(int condition, const char *condition_str, 
00686    const char *file, int line, const char *function)
00687 {
00688    if (__builtin_expect(!condition, 1)) {
00689       /* Attempt to put it into the logger, but hope that at least someone saw the
00690        * message on stderr ... */
00691       ast_log(__LOG_ERROR, file, line, function, "FRACK!, Failed assertion %s (%d)\n",
00692          condition_str, condition);
00693       fprintf(stderr, "FRACK!, Failed assertion %s (%d) at line %d in %s of %s\n",
00694          condition_str, condition, line, function, file);
00695       /* Give the logger a chance to get the message out, just in case we abort(), or
00696        * Asterisk crashes due to whatever problem just happened after we exit ast_assert(). */
00697       usleep(1);
00698 #ifdef DO_CRASH
00699       abort();
00700       /* Just in case abort() doesn't work or something else super silly,
00701        * and for Qwell's amusement. */
00702       *((int*)0)=0;
00703 #endif
00704    }
00705 }
00706 #else
00707 #define ast_assert(a)
00708 #endif
00709 
00710 #include "asterisk/strings.h"
00711 
00712 /*!
00713  * \brief An Entity ID is essentially a MAC address, brief and unique 
00714  */
00715 struct ast_eid {
00716    unsigned char eid[6];
00717 } __attribute__((__packed__));
00718 
00719 /*!
00720  * \brief Global EID
00721  *
00722  * This is set in asterisk.conf, or determined automatically by taking the mac
00723  * address of an Ethernet interface on the system.
00724  */
00725 extern struct ast_eid ast_eid_default;
00726 
00727 /*!
00728  * \brief Fill in an ast_eid with the default eid of this machine
00729  * \since 1.6.1
00730  */
00731 void ast_set_default_eid(struct ast_eid *eid);
00732 
00733 /*!
00734  * /brief Convert an EID to a string
00735  * \since 1.6.1
00736  */
00737 char *ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid);
00738 
00739 /*!
00740  * \brief Convert a string into an EID
00741  *
00742  * This function expects an EID in the format:
00743  *    00:11:22:33:44:55
00744  *
00745  * \return 0 success, non-zero failure
00746  * \since 1.6.1
00747  */
00748 int ast_str_to_eid(struct ast_eid *eid, const char *s);
00749 
00750 /*!
00751  * \brief Compare two EIDs
00752  *
00753  * \return 0 if the two are the same, non-zero otherwise
00754  * \since 1.6.1
00755  */
00756 int ast_eid_cmp(const struct ast_eid *eid1, const struct ast_eid *eid2);
00757 
00758 #endif /* _ASTERISK_UTILS_H */

Generated on Wed Oct 28 13:31:10 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6