Merge "res_pjsip_mwi.c: Fix null pointer crash"
[asterisk/asterisk.git] / utils / extconf.c
index 08465c4..1be739c 100644 (file)
@@ -1,4 +1,4 @@
-/*  
+/*
  * Asterisk -- An open source telephony toolkit.
  *
  * Copyright (C) 2006, Digium, Inc.
  */
 
 
-/*
- *
+/*!
+ * \file
  * A condensation of the pbx_config stuff, to read into exensions.conf, and provide an interface to the data there,
  * for operations outside of asterisk. A huge, awful hack.
  *
  */
+
+/*!
+ * \li \ref extconf.c uses the configuration file \ref extconfig.conf and \ref extensions.conf and \ref asterisk.conf
+ * \addtogroup configuration_file Configuration Files
+ */
+
+/*!
+ * \page extconfig.conf extconfig.conf
+ * \verbinclude extconfig.conf.sample
+ */
+
+/*!
+ * \page extensions.conf extensions.conf
+ * \verbinclude extensions.conf.sample
+ */
+
+/*** MODULEINFO
+       <support_level>extended</support_level>
+ ***/
+
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 #undef DEBUG_THREADS
@@ -49,6 +70,7 @@
 #include <pthread.h>
 #include <netdb.h>
 #include <sys/param.h>
+#include <signal.h>
 
 static void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__((format(printf, 5, 6)));
 void ast_verbose(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
@@ -64,7 +86,7 @@ void ast_verbose(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
 #endif
 
 #define AST_API_MODULE  1 /* gimme the inline defs! */
-struct ast_channel 
+struct ast_channel
 {
        char x; /* basically empty! */
 };
@@ -74,6 +96,7 @@ struct ast_channel
 #include "asterisk/inline_api.h"
 #include "asterisk/endian.h"
 #include "asterisk/ast_expr.h"
+#include "asterisk/extconf.h"
 
 /* logger.h */
 
@@ -89,7 +112,7 @@ struct ast_channel
 #define VERBOSE_PREFIX_3 "    -- "
 #define VERBOSE_PREFIX_4 "       > "
 
-void ast_backtrace(void);
+void ast_log_backtrace(void);
 
 void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt, ...)
        __attribute__((format(printf, 5, 6)));
@@ -97,9 +120,6 @@ void ast_queue_log(const char *queuename, const char *callid, const char *agent,
 /* IN CONFLICT: void ast_verbose(const char *fmt, ...)
    __attribute__((format(printf, 1, 2))); */
 
-int ast_register_verbose(void (*verboser)(const char *string));
-int ast_unregister_verbose(void (*verboser)(const char *string));
-
 void ast_console_puts(const char *string);
 
 #define _A_ __FILE__, __LINE__, __PRETTY_FUNCTION__
@@ -147,6 +167,7 @@ void ast_console_puts(const char *string);
 #define LOG_DTMF    __LOG_DTMF, _A_
 
 /* lock.h */
+#define _ASTERISK_LOCK_H /* A small indication that this is horribly wrong. */
 
 #ifndef        HAVE_MTX_PROFILE
 #define        __MTX_PROF(a)   return pthread_mutex_lock((a))
@@ -221,7 +242,7 @@ static void __attribute__((constructor)) init_empty_mutex(void)
 
 static inline int __ast_pthread_mutex_init_attr(const char *filename, int lineno, const char *func,
                                                const char *mutex_name, ast_mutex_t *t,
-                                               pthread_mutexattr_t *attr) 
+                                               pthread_mutexattr_t *attr)
 {
 #ifdef AST_MUTEX_INIT_W_CONSTRUCTORS
        int canlog = strcmp(filename, "logger.c");
@@ -440,159 +461,14 @@ static inline int __ast_pthread_mutex_unlock(const char *filename, int lineno, c
        }
 
        if ((res = pthread_mutex_unlock(&t->mutex))) {
-               __ast_mutex_logger("%s line %d (%s): Error releasing mutex: %s\n", 
-                                  filename, lineno, func, strerror(res));
-               DO_THREAD_CRASH;
-       }
-
-       return res;
-}
-
-static inline int __ast_cond_init(const char *filename, int lineno, const char *func,
-                                 const char *cond_name, ast_cond_t *cond, pthread_condattr_t *cond_attr)
-{
-       return pthread_cond_init(cond, cond_attr);
-}
-
-static inline int __ast_cond_signal(const char *filename, int lineno, const char *func,
-                                   const char *cond_name, ast_cond_t *cond)
-{
-       return pthread_cond_signal(cond);
-}
-
-static inline int __ast_cond_broadcast(const char *filename, int lineno, const char *func,
-                                      const char *cond_name, ast_cond_t *cond)
-{
-       return pthread_cond_broadcast(cond);
-}
-
-static inline int __ast_cond_destroy(const char *filename, int lineno, const char *func,
-                                    const char *cond_name, ast_cond_t *cond)
-{
-       return pthread_cond_destroy(cond);
-}
-
-static inline int __ast_cond_wait(const char *filename, int lineno, const char *func,
-                                 const char *cond_name, const char *mutex_name,
-                                 ast_cond_t *cond, ast_mutex_t *t)
-{
-       int res;
-       int canlog = strcmp(filename, "logger.c");
-
-#ifdef AST_MUTEX_INIT_W_CONSTRUCTORS
-       if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
-               __ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized.\n",
-                                  filename, lineno, func, mutex_name);
-       }
-#endif
-
-       if (t->reentrancy && (t->thread[t->reentrancy-1] != pthread_self())) {
-               __ast_mutex_logger("%s line %d (%s): attempted unlock mutex '%s' without owning it!\n",
-                                  filename, lineno, func, mutex_name);
-               __ast_mutex_logger("%s line %d (%s): '%s' was locked here.\n",
-                                  t->file[t->reentrancy-1], t->lineno[t->reentrancy-1], t->func[t->reentrancy-1], mutex_name);
-               DO_THREAD_CRASH;
-       }
-
-       if (--t->reentrancy < 0) {
-               __ast_mutex_logger("%s line %d (%s): mutex '%s' freed more times than we've locked!\n",
-                                  filename, lineno, func, mutex_name);
-               t->reentrancy = 0;
-       }
-
-       if (t->reentrancy < AST_MAX_REENTRANCY) {
-               t->file[t->reentrancy] = NULL;
-               t->lineno[t->reentrancy] = 0;
-               t->func[t->reentrancy] = NULL;
-               t->thread[t->reentrancy] = 0;
-       }
-
-       if ((res = pthread_cond_wait(cond, &t->mutex))) {
-               __ast_mutex_logger("%s line %d (%s): Error waiting on condition mutex '%s'\n", 
+               __ast_mutex_logger("%s line %d (%s): Error releasing mutex: %s\n",
                                   filename, lineno, func, strerror(res));
                DO_THREAD_CRASH;
-       } else {
-               if (t->reentrancy < AST_MAX_REENTRANCY) {
-                       t->file[t->reentrancy] = filename;
-                       t->lineno[t->reentrancy] = lineno;
-                       t->func[t->reentrancy] = func;
-                       t->thread[t->reentrancy] = pthread_self();
-                       t->reentrancy++;
-               } else {
-                       __ast_mutex_logger("%s line %d (%s): '%s' really deep reentrancy!\n",
-                                                          filename, lineno, func, mutex_name);
-               }
        }
 
        return res;
 }
 
-static inline int __ast_cond_timedwait(const char *filename, int lineno, const char *func,
-                                      const char *cond_name, const char *mutex_name, ast_cond_t *cond,
-                                      ast_mutex_t *t, const struct timespec *abstime)
-{
-       int res;
-       int canlog = strcmp(filename, "logger.c");
-
-#ifdef AST_MUTEX_INIT_W_CONSTRUCTORS
-       if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
-               __ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized.\n",
-                                  filename, lineno, func, mutex_name);
-       }
-#endif
-
-       if (t->reentrancy && (t->thread[t->reentrancy-1] != pthread_self())) {
-               __ast_mutex_logger("%s line %d (%s): attempted unlock mutex '%s' without owning it!\n",
-                                  filename, lineno, func, mutex_name);
-               __ast_mutex_logger("%s line %d (%s): '%s' was locked here.\n",
-                                  t->file[t->reentrancy-1], t->lineno[t->reentrancy-1], t->func[t->reentrancy-1], mutex_name);
-               DO_THREAD_CRASH;
-       }
-
-       if (--t->reentrancy < 0) {
-               __ast_mutex_logger("%s line %d (%s): mutex '%s' freed more times than we've locked!\n",
-                                  filename, lineno, func, mutex_name);
-               t->reentrancy = 0;
-       }
-
-       if (t->reentrancy < AST_MAX_REENTRANCY) {
-               t->file[t->reentrancy] = NULL;
-               t->lineno[t->reentrancy] = 0;
-               t->func[t->reentrancy] = NULL;
-               t->thread[t->reentrancy] = 0;
-       }
-
-       if ((res = pthread_cond_timedwait(cond, &t->mutex, abstime)) && (res != ETIMEDOUT)) {
-               __ast_mutex_logger("%s line %d (%s): Error waiting on condition mutex '%s'\n", 
-                                  filename, lineno, func, strerror(res));
-               DO_THREAD_CRASH;
-       } else {
-               if (t->reentrancy < AST_MAX_REENTRANCY) {
-                       t->file[t->reentrancy] = filename;
-                       t->lineno[t->reentrancy] = lineno;
-                       t->func[t->reentrancy] = func;
-                       t->thread[t->reentrancy] = pthread_self();
-                       t->reentrancy++;
-               } else {
-                       __ast_mutex_logger("%s line %d (%s): '%s' really deep reentrancy!\n",
-                                                          filename, lineno, func, mutex_name);
-               }
-       }
-
-       return res;
-}
-
-#define ast_mutex_destroy(a) __ast_pthread_mutex_destroy(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)
-#define ast_mutex_lock(a) __ast_pthread_mutex_lock(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)
-#define ast_mutex_unlock(a) __ast_pthread_mutex_unlock(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)
-#define ast_mutex_trylock(a) __ast_pthread_mutex_trylock(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)
-#define ast_cond_init(cond, attr) __ast_cond_init(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond, attr)
-#define ast_cond_destroy(cond) __ast_cond_destroy(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond)
-#define ast_cond_signal(cond) __ast_cond_signal(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond)
-#define ast_cond_broadcast(cond) __ast_cond_broadcast(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond)
-#define ast_cond_wait(cond, mutex) __ast_cond_wait(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, #mutex, cond, mutex)
-#define ast_cond_timedwait(cond, mutex, time) __ast_cond_timedwait(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, #mutex, cond, mutex, time)
-
 #else /* !DEBUG_THREADS */
 
 
@@ -612,58 +488,8 @@ static inline int ast_mutex_init(ast_mutex_t *pmutex)
 
 #define ast_pthread_mutex_init(pmutex,a) pthread_mutex_init(pmutex,a)
 
-static inline int ast_mutex_unlock(ast_mutex_t *pmutex)
-{
-       return pthread_mutex_unlock(pmutex);
-}
-
-static inline int ast_mutex_destroy(ast_mutex_t *pmutex)
-{
-       return pthread_mutex_destroy(pmutex);
-}
-
-static inline int ast_mutex_lock(ast_mutex_t *pmutex)
-{
-       __MTX_PROF(pmutex);
-}
-
-static inline int ast_mutex_trylock(ast_mutex_t *pmutex)
-{
-       return pthread_mutex_trylock(pmutex);
-}
-
 typedef pthread_cond_t ast_cond_t;
 
-static inline int ast_cond_init(ast_cond_t *cond, pthread_condattr_t *cond_attr)
-{
-       return pthread_cond_init(cond, cond_attr);
-}
-
-static inline int ast_cond_signal(ast_cond_t *cond)
-{
-       return pthread_cond_signal(cond);
-}
-
-static inline int ast_cond_broadcast(ast_cond_t *cond)
-{
-       return pthread_cond_broadcast(cond);
-}
-
-static inline int ast_cond_destroy(ast_cond_t *cond)
-{
-       return pthread_cond_destroy(cond);
-}
-
-static inline int ast_cond_wait(ast_cond_t *cond, ast_mutex_t *t)
-{
-       return pthread_cond_wait(cond, t);
-}
-
-static inline int ast_cond_timedwait(ast_cond_t *cond, ast_mutex_t *t, const struct timespec *abstime)
-{
-       return pthread_cond_timedwait(cond, t, abstime);
-}
-
 #endif /* !DEBUG_THREADS */
 
 #if defined(AST_MUTEX_INIT_W_CONSTRUCTORS)
@@ -674,30 +500,16 @@ static inline int ast_cond_timedwait(ast_cond_t *cond, ast_mutex_t *t, const str
 static void  __attribute__((constructor)) init_##mutex(void) \
 { \
        ast_mutex_init(&mutex); \
-} \
-static void  __attribute__((destructor)) fini_##mutex(void) \
-{ \
-       ast_mutex_destroy(&mutex); \
 }
 #else /* !AST_MUTEX_INIT_W_CONSTRUCTORS */
-/* By default, use static initialization of mutexes. */ 
+/* By default, use static initialization of mutexes. */
 #define __AST_MUTEX_DEFINE(scope, mutex) \
        scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE
 #endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
 
 #define pthread_mutex_t use_ast_mutex_t_instead_of_pthread_mutex_t
-#define pthread_mutex_lock use_ast_mutex_lock_instead_of_pthread_mutex_lock
-#define pthread_mutex_unlock use_ast_mutex_unlock_instead_of_pthread_mutex_unlock
-#define pthread_mutex_trylock use_ast_mutex_trylock_instead_of_pthread_mutex_trylock
 #define pthread_mutex_init use_ast_mutex_init_instead_of_pthread_mutex_init
-#define pthread_mutex_destroy use_ast_mutex_destroy_instead_of_pthread_mutex_destroy
 #define pthread_cond_t use_ast_cond_t_instead_of_pthread_cond_t
-#define pthread_cond_init use_ast_cond_init_instead_of_pthread_cond_init
-#define pthread_cond_destroy use_ast_cond_destroy_instead_of_pthread_cond_destroy
-#define pthread_cond_signal use_ast_cond_signal_instead_of_pthread_cond_signal
-#define pthread_cond_broadcast use_ast_cond_broadcast_instead_of_pthread_cond_broadcast
-#define pthread_cond_wait use_ast_cond_wait_instead_of_pthread_cond_wait
-#define pthread_cond_timedwait use_ast_cond_timedwait_instead_of_pthread_cond_timedwait
 
 #define AST_MUTEX_DEFINE_STATIC(mutex) __AST_MUTEX_DEFINE(static, mutex)
 
@@ -739,21 +551,11 @@ static inline int ast_rwlock_rdlock(ast_rwlock_t *prwlock)
        return pthread_rwlock_rdlock(prwlock);
 }
 
-static inline int ast_rwlock_tryrdlock(ast_rwlock_t *prwlock)
-{
-       return pthread_rwlock_tryrdlock(prwlock);
-}
-
 static inline int ast_rwlock_wrlock(ast_rwlock_t *prwlock)
 {
        return pthread_rwlock_wrlock(prwlock);
 }
 
-static inline int ast_rwlock_trywrlock(ast_rwlock_t *prwlock)
-{
-       return pthread_rwlock_trywrlock(prwlock);
-}
-
 /* Statically declared read/write locks */
 
 #ifndef HAVE_PTHREAD_RWLOCK_INITIALIZER
@@ -813,7 +615,7 @@ AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v),
 {
        __asm __volatile (
        "       lock   xaddl   %0, %1 ;        "
-       : "+r" (v),                     /* 0 (result) */   
+       : "+r" (v),                     /* 0 (result) */
          "=m" (*p)                     /* 1 */
        : "m" (*p));                    /* 2 */
        return (v);
@@ -857,18 +659,7 @@ AST_INLINE_API(int ast_atomic_dec_and_test(volatile int *p),
 })
 #endif
 
-#ifndef DEBUG_CHANNEL_LOCKS
-/*! \brief Lock a channel. If DEBUG_CHANNEL_LOCKS is defined 
-       in the Makefile, print relevant output for debugging */
-#define ast_channel_lock(x)            ast_mutex_lock(&x->lock)
-/*! \brief Unlock a channel. If DEBUG_CHANNEL_LOCKS is defined 
-       in the Makefile, print relevant output for debugging */
-#define ast_channel_unlock(x)          ast_mutex_unlock(&x->lock)
-/*! \brief Try locking a channel. If DEBUG_CHANNEL_LOCKS is defined 
-       in the Makefile, print relevant output for debugging */
-#define ast_channel_trylock(x)         ast_mutex_trylock(&x->lock)
-#else
-
+#ifdef DEBUG_CHANNEL_LOCKS
 /*! \brief Lock AST channel (and print debugging output)
 \note You need to enable DEBUG_CHANNEL_LOCKS for this function */
 int ast_channel_lock(struct ast_channel *chan);
@@ -893,57 +684,19 @@ int ast_channel_trylock(struct ast_channel *chan);
 #define ast_free free
 #define ast_free_ptr free
 
-#define MALLOC_FAILURE_MSG \
-       ast_log(LOG_ERROR, "Memory Allocation Failure in function %s at line %d of %s\n", func, lineno, file);
-
-/*!
- * \brief A wrapper for malloc()
- *
- * ast_malloc() is a wrapper for malloc() that will generate an Asterisk log
- * message in the case that the allocation fails.
- *
- * The argument and return value are the same as malloc()
- */
-#define ast_malloc(len) \
-       _ast_malloc((len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-
-#define ast_calloc(num, len) \
-       _ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-
-#define ast_calloc_cache(num, len) \
-       _ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-
-#define ast_realloc(p, len) \
-       _ast_realloc((p), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-
-#define ast_strdup(str) \
-       _ast_strdup((str), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-
-#define ast_strndup(str, len) \
-       _ast_strndup((str), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
-
-#define ast_asprintf(ret, fmt, ...) \
-       _ast_asprintf((ret), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, __VA_ARGS__)
-
-#define ast_vasprintf(ret, fmt, ap) \
-       _ast_vasprintf((ret), __FILE__, __LINE__, __PRETTY_FUNCTION__, (fmt), (ap))
-
-
-static unsigned int __unsigned_int_flags_dummy;
-
 struct ast_flags {  /* stolen from utils.h */
        unsigned int flags;
 };
 #define ast_test_flag(p,flag)          ({ \
                                        typeof ((p)->flags) __p = (p)->flags; \
-                                       typeof (__unsigned_int_flags_dummy) __x = 0; \
+                                       unsigned int __x = 0; \
                                        (void) (&__p == &__x); \
                                        ((p)->flags & (flag)); \
                                        })
 
 #define ast_set2_flag(p,value,flag)    do { \
                                        typeof ((p)->flags) __p = (p)->flags; \
-                                       typeof (__unsigned_int_flags_dummy) __x = 0; \
+                                       unsigned int __x = 0; \
                                        (void) (&__p == &__x); \
                                        if (value) \
                                                (p)->flags |= (flag); \
@@ -955,6 +708,7 @@ struct ast_flags {  /* stolen from utils.h */
 
 #define MALLOC_FAILURE_MSG \
        ast_log(LOG_ERROR, "Memory Allocation Failure in function %s at line %d of %s\n", func, lineno, file);
+
 /*!
  * \brief A wrapper for malloc()
  *
@@ -964,10 +718,10 @@ struct ast_flags {  /* stolen from utils.h */
  * The argument and return value are the same as malloc()
  */
 #define ast_malloc(len) \
-       _ast_malloc((len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+       __ast_malloc((len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 AST_INLINE_API(
-void * attribute_malloc _ast_malloc(size_t len, const char *file, int lineno, const char *func),
+void * attribute_malloc __ast_malloc(size_t len, const char *file, int lineno, const char *func),
 {
        void *p;
 
@@ -987,10 +741,10 @@ void * attribute_malloc _ast_malloc(size_t len, const char *file, int lineno, co
  * The arguments and return value are the same as calloc()
  */
 #define ast_calloc(num, len) \
-       _ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+       __ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 AST_INLINE_API(
-void * attribute_malloc _ast_calloc(size_t num, size_t len, const char *file, int lineno, const char *func),
+void * attribute_malloc __ast_calloc(size_t num, size_t len, const char *file, int lineno, const char *func),
 {
        void *p;
 
@@ -1012,7 +766,7 @@ void * attribute_malloc _ast_calloc(size_t num, size_t len, const char *file, in
  * The arguments and return value are the same as calloc()
  */
 #define ast_calloc_cache(num, len) \
-       _ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+       __ast_calloc((num), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 /*!
  * \brief A wrapper for realloc()
@@ -1023,10 +777,10 @@ void * attribute_malloc _ast_calloc(size_t num, size_t len, const char *file, in
  * The arguments and return value are the same as realloc()
  */
 #define ast_realloc(p, len) \
-       _ast_realloc((p), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+       __ast_realloc((p), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 AST_INLINE_API(
-void * attribute_malloc _ast_realloc(void *p, size_t len, const char *file, int lineno, const char *func),
+void * attribute_malloc __ast_realloc(void *p, size_t len, const char *file, int lineno, const char *func),
 {
        void *newp;
 
@@ -1050,10 +804,10 @@ void * attribute_malloc _ast_realloc(void *p, size_t len, const char *file, int
  * The argument and return value are the same as strdup()
  */
 #define ast_strdup(str) \
-       _ast_strdup((str), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+       __ast_strdup((str), __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 AST_INLINE_API(
-char * attribute_malloc _ast_strdup(const char *str, const char *file, int lineno, const char *func),
+char * attribute_malloc __ast_strdup(const char *str, const char *file, int lineno, const char *func),
 {
        char *newstr = NULL;
 
@@ -1073,16 +827,16 @@ char * attribute_malloc _ast_strdup(const char *str, const char *file, int linen
  * message in the case that the allocation fails.
  *
  * ast_strndup(), unlike strndup(), can safely accept a NULL argument for the
- * string to duplicate. If a NULL argument is provided, ast_strdup will return  
+ * string to duplicate. If a NULL argument is provided, ast_strdup will return
  * NULL without generating any kind of error log message.
  *
  * The arguments and return value are the same as strndup()
  */
 #define ast_strndup(str, len) \
-       _ast_strndup((str), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
+       __ast_strndup((str), (len), __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 AST_INLINE_API(
-char * attribute_malloc _ast_strndup(const char *str, size_t len, const char *file, int lineno, const char *func),
+char * attribute_malloc __ast_strndup(const char *str, size_t len, const char *file, int lineno, const char *func),
 {
        char *newstr = NULL;
 
@@ -1104,11 +858,11 @@ char * attribute_malloc _ast_strndup(const char *str, size_t len, const char *fi
  * The arguments and return value are the same as asprintf()
  */
 #define ast_asprintf(ret, fmt, ...) \
-       _ast_asprintf((ret), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, __VA_ARGS__)
+       __ast_asprintf(__FILE__, __LINE__, __PRETTY_FUNCTION__, (ret), (fmt), __VA_ARGS__)
 
 AST_INLINE_API(
 __attribute__((format(printf, 5, 6)))
-int _ast_asprintf(char **ret, const char *file, int lineno, const char *func, const char *fmt, ...),
+int __ast_asprintf(const char *file, int lineno, const char *func, char **ret, const char *fmt, ...),
 {
        int res;
        va_list ap;
@@ -1131,11 +885,11 @@ int _ast_asprintf(char **ret, const char *file, int lineno, const char *func, co
  * The arguments and return value are the same as vasprintf()
  */
 #define ast_vasprintf(ret, fmt, ap) \
-       _ast_vasprintf((ret), __FILE__, __LINE__, __PRETTY_FUNCTION__, (fmt), (ap))
+       __ast_vasprintf((ret), (fmt), (ap), __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 AST_INLINE_API(
-__attribute__((format(printf, 5, 0)))
-int _ast_vasprintf(char **ret, const char *file, int lineno, const char *func, const char *fmt, va_list ap),
+__attribute__((format(printf, 2, 0)))
+int __ast_vasprintf(char **ret, const char *fmt, va_list ap, const char *file, int lineno, const char *func),
 {
        int res;
 
@@ -1242,30 +996,35 @@ static void  LLB_ADD(char *str)
        int siz = strlen(str);
        if (rem < siz+1) {
                lline_buffer = ast_realloc(lline_buffer, lline_buffer_size + CB_INCR + siz + 1);
-               if (!lline_buffer) 
+               if (!lline_buffer)
                        return;
                lline_buffer_size += CB_INCR + siz + 1;
        }
        strcat(lline_buffer,str);
 }
 
-static void CB_RESET(void )  
-{ 
-       comment_buffer[0] = 0; 
+static void CB_RESET(void )
+{
+       comment_buffer[0] = 0;
        lline_buffer[0] = 0;
 }
-               
+
 /*! \brief Keep track of how many threads are currently trying to wait*() on
  *  a child process */
 static unsigned int safe_system_level = 0;
-static void *safe_system_prev_handler;
+static struct sigaction safe_system_prev_handler;
 
 /*! \brief NULL handler so we can collect the child exit status */
-static void null_sig_handler(int sig)
+static void _null_sig_handler(int sig)
 {
 
 }
 
+static struct sigaction null_sig_handler = {
+       .sa_handler = _null_sig_handler,
+       .sa_flags = SA_RESTART,
+};
+
 void ast_replace_sigchld(void);
 
 void ast_replace_sigchld(void)
@@ -1275,9 +1034,9 @@ void ast_replace_sigchld(void)
        level = safe_system_level++;
 
        /* only replace the handler if it has not already been done */
-       if (level == 0)
-               safe_system_prev_handler = signal(SIGCHLD, null_sig_handler);
-
+       if (level == 0) {
+               sigaction(SIGCHLD, &null_sig_handler, &safe_system_prev_handler);
+       }
 }
 
 void ast_unreplace_sigchld(void);
@@ -1289,9 +1048,9 @@ void ast_unreplace_sigchld(void)
        level = --safe_system_level;
 
        /* only restore the handler if we are the last one */
-       if (level == 0)
-               signal(SIGCHLD, safe_system_prev_handler);
-
+       if (level == 0) {
+               sigaction(SIGCHLD, &safe_system_prev_handler, NULL);
+       }
 }
 
 int ast_safe_system(const char *s);
@@ -1303,7 +1062,6 @@ int ast_safe_system(const char *s)
        int x;
 #endif
        int res;
-       struct rusage rusage;
        int status;
 
 #if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
@@ -1313,7 +1071,7 @@ int ast_safe_system(const char *s)
        pid = fork();
 #else
        pid = vfork();
-#endif 
+#endif
 
        if (pid == 0) {
 #ifdef HAVE_WORKING_FORK
@@ -1325,11 +1083,11 @@ int ast_safe_system(const char *s)
                _exit(1);
        } else if (pid > 0) {
                for(;;) {
-                       res = wait4(pid, &status, 0, &rusage);
+                       res = waitpid(pid, &status, 0);
                        if (res > -1) {
                                res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
                                break;
-                       } else if (errno != EINTR) 
+                       } else if (errno != EINTR)
                                break;
                }
        } else {
@@ -1346,7 +1104,7 @@ int ast_safe_system(const char *s)
 }
 
 static struct ast_comment *ALLOC_COMMENT(const char *buffer)
-{ 
+{
        struct ast_comment *x = ast_calloc(1,sizeof(struct ast_comment)+strlen(buffer)+1);
        strcpy(x->cmt, buffer);
        return x;
@@ -1369,7 +1127,7 @@ static struct ast_config_engine *config_engine_list;
 struct ast_category {
        char name[80];
        int ignored;                    /*!< do not let user of the config see this category */
-       int include_level;      
+       int include_level;
     char *file;                /*!< the file name from whence this declaration was read */
     int lineno;
        struct ast_comment *precomments;
@@ -1462,7 +1220,7 @@ char *ast_trim_blanks(char *str),
 
        if (work) {
                work += strlen(work) - 1;
-               /* It's tempting to only want to erase after we exit this loop, 
+               /* It's tempting to only want to erase after we exit this loop,
                   but since ast_trim_blanks *could* receive a constant string
                   (which we presumably wouldn't have to touch), we shouldn't
                   actually set anything unless we must, and it's easier just
@@ -1491,7 +1249,7 @@ char *ast_strip(char *s),
        if (s)
                ast_trim_blanks(s);
        return s;
-} 
+}
 )
 
 
@@ -1524,15 +1282,15 @@ void localized_ast_include_rename(struct ast_config *conf, const char *from_file
 
 static struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename);
 
-static struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename) 
+static struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename)
 {
        struct ast_variable *variable;
-       int name_len = strlen(name) + 1;        
+       int name_len = strlen(name) + 1;
 
        if ((variable = ast_calloc(1, name_len + strlen(value) + 1 + strlen(filename) + 1 + sizeof(*variable)))) {
                variable->name = variable->stuff;
-               variable->value = variable->stuff + name_len;           
-               variable->file = variable->value + strlen(value) + 1;           
+               variable->value = variable->stuff + name_len;
+               variable->file = variable->value + strlen(value) + 1;
                strcpy(variable->name,name);
                strcpy(variable->value,value);
                strcpy(variable->file,filename);
@@ -1544,11 +1302,11 @@ static struct ast_variable *ast_variable_new(const char *name, const char *value
 static struct ast_config_include *ast_include_new(struct ast_config *conf, const char *from_file, const char *included_file, int is_exec, const char *exec_file, int from_lineno, char *real_included_file_name, int real_included_file_name_size)
 {
        /* a file should be included ONCE. Otherwise, if one of the instances is changed,
-       then all be changed. -- how do we know to include it? -- Handling modified 
+       then all be changed. -- how do we know to include it? -- Handling modified
        instances is possible, I'd have
        to create a new master for each instance. */
        struct ast_config_include *inc;
-    
+
        inc = ast_include_find(conf, included_file);
        if (inc)
        {
@@ -1557,7 +1315,7 @@ static struct ast_config_include *ast_include_new(struct ast_config *conf, const
                ast_log(LOG_WARNING,"'%s', line %d:  Same File included more than once! This data will be saved in %s if saved back to disk.\n", from_file, from_lineno, real_included_file_name);
        } else
                *real_included_file_name = 0;
-       
+
        inc = ast_calloc(1,sizeof(struct ast_config_include));
        inc->include_location_file = ast_strdup(from_file);
        inc->include_location_lineno = from_lineno;
@@ -1565,15 +1323,15 @@ static struct ast_config_include *ast_include_new(struct ast_config *conf, const
                inc->included_file = ast_strdup(real_included_file_name);
        else
                inc->included_file = ast_strdup(included_file);
-       
+
        inc->exec = is_exec;
        if (is_exec)
                inc->exec_file = ast_strdup(exec_file);
-       
+
        /* attach this new struct to the conf struct */
        inc->next = conf->includes;
        conf->includes = inc;
-    
+
        return inc;
 }
 
@@ -1582,13 +1340,13 @@ void localized_ast_include_rename(struct ast_config *conf, const char *from_file
        struct ast_config_include *incl;
        struct ast_category *cat;
        struct ast_variable *v;
-    
+
        int from_len = strlen(from_file);
        int to_len = strlen(to_file);
-    
+
        if (strcmp(from_file, to_file) == 0) /* no use wasting time if the name is the same */
                return;
-       
+
        /* the manager code allows you to read in one config file, then
        write it back out under a different name. But, the new arrangement
           ties output lines to the file name. So, before you try to write
@@ -1597,7 +1355,7 @@ void localized_ast_include_rename(struct ast_config *conf, const char *from_file
        */
        /* file names are on categories, includes (of course), and on variables. So,
           traverse all this and swap names */
-       
+
        for (incl = conf->includes; incl; incl=incl->next) {
                if (strcmp(incl->include_location_file,from_file) == 0) {
                        if (from_len >= to_len)
@@ -1728,7 +1486,7 @@ static struct ast_variable *variable_clone(const struct ast_variable *old)
 
        return new;
 }
+
 static void ast_variables_destroy(struct ast_variable *v)
 {
        struct ast_variable *vn;
@@ -1743,7 +1501,7 @@ static void ast_variables_destroy(struct ast_variable *v)
 static void ast_includes_destroy(struct ast_config_include *incls)
 {
        struct ast_config_include *incl,*inclnext;
-    
+
        for (incl=incls; incl; incl = inclnext) {
                inclnext = incl->next;
                if (incl->include_location_file)
@@ -1764,7 +1522,7 @@ static void ast_config_destroy(struct ast_config *cfg)
                return;
 
        ast_includes_destroy(cfg->includes);
-       
+
        cat = cfg->root;
        while (cat) {
                ast_variables_destroy(cat->root);
@@ -1814,8 +1572,6 @@ enum ast_option_flags {
        AST_OPT_FLAG_DONT_WARN = (1 << 18),
        /*! End CDRs before the 'h' extension */
        AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN = (1 << 19),
-       /*! Use DAHDI Timing for generators if available */
-       AST_OPT_FLAG_INTERNAL_TIMING = (1 << 20),
        /*! Always fork, even if verbose or debug settings are non-zero */
        AST_OPT_FLAG_ALWAYS_FORK = (1 << 21),
        /*! Disable log/verbose output to remote consoles */
@@ -1861,15 +1617,14 @@ struct ast_flags ast_options = { AST_DEFAULT_OPTIONS };
 #define ast_opt_transmit_silence       ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSMIT_SILENCE)
 #define ast_opt_dont_warn              ast_test_flag(&ast_options, AST_OPT_FLAG_DONT_WARN)
 #define ast_opt_end_cdr_before_h_exten ast_test_flag(&ast_options, AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN)
-#define ast_opt_internal_timing                ast_test_flag(&ast_options, AST_OPT_FLAG_INTERNAL_TIMING)
 #define ast_opt_always_fork            ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)
 #define ast_opt_mute                   ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE)
 
 extern int option_verbose;
 extern int option_debug;               /*!< Debugging */
-extern int option_maxcalls;            /*!< Maximum number of simultaneous channels */
-extern double option_maxload;
-extern char defaultlanguage[];
+extern int ast_option_maxcalls;                /*!< Maximum number of simultaneous channels */
+extern double ast_option_maxload;
+extern char ast_defaultlanguage[];
 
 extern pid_t ast_mainpid;
 
@@ -1882,9 +1637,6 @@ extern int ast_language_is_prefix;
 
 /* linkedlists.h */
 
-#define AST_LIST_LOCK(head)                                            \
-       ast_mutex_lock(&(head)->lock) 
-
 /*!
   \brief Write locks a list.
   \param head This is a pointer to the list head structure
@@ -1906,50 +1658,6 @@ extern int ast_language_is_prefix;
 */
 #define AST_RWLIST_RDLOCK(head)                                         \
         ast_rwlock_rdlock(&(head)->lock)
-       
-/*!
-  \brief Locks a list, without blocking if the list is locked.
-  \param head This is a pointer to the list head structure
-
-  This macro attempts to place an exclusive lock in the
-  list head structure pointed to by head.
-  Returns non-zero on success, 0 on failure
-*/
-#define AST_LIST_TRYLOCK(head)                                         \
-       ast_mutex_trylock(&(head)->lock) 
-
-/*!
-  \brief Write locks a list, without blocking if the list is locked.
-  \param head This is a pointer to the list head structure
-
-  This macro attempts to place an exclusive write lock in the
-  list head structure pointed to by head.
-  Returns non-zero on success, 0 on failure
-*/
-#define AST_RWLIST_TRYWRLOCK(head)                                      \
-        ast_rwlock_trywrlock(&(head)->lock)
-
-/*!
-  \brief Read locks a list, without blocking if the list is locked.
-  \param head This is a pointer to the list head structure
-
-  This macro attempts to place a read lock in the
-  list head structure pointed to by head.
-  Returns non-zero on success, 0 on failure
-*/
-#define AST_RWLIST_TRYRDLOCK(head)                                      \
-        ast_rwlock_tryrdlock(&(head)->lock)
-       
-/*!
-  \brief Attempts to unlock a list.
-  \param head This is a pointer to the list head structure
-
-  This macro attempts to remove an exclusive lock from the
-  list head structure pointed to by head. If the list
-  was not locked by this thread, this macro has no effect.
-*/
-#define AST_LIST_UNLOCK(head)                                          \
-       ast_mutex_unlock(&(head)->lock)
 
 /*!
   \brief Attempts to unlock a read/write based list.
@@ -2224,7 +1932,7 @@ struct {                                                          \
 }
 
 #define AST_RWLIST_ENTRY AST_LIST_ENTRY
+
 /*!
   \brief Returns the first entry contained in a list.
   \param head This is a pointer to the list head structure
@@ -2429,20 +2137,6 @@ struct {                                                         \
 }
 
 /*!
-  \brief Destroys a list head structure.
-  \param head This is a pointer to the list head structure
-
-  This macro destroys a list head structure by setting the head
-  entry to \a NULL (empty list) and destroying the embedded lock.
-  It does not free the structure from memory.
-*/
-#define AST_LIST_HEAD_DESTROY(head) {                                  \
-       (head)->first = NULL;                                           \
-       (head)->last = NULL;                                            \
-       ast_mutex_destroy(&(head)->lock);                               \
-}
-
-/*!
   \brief Destroys an rwlist head structure.
   \param head This is a pointer to the list head structure
 
@@ -2650,7 +2344,7 @@ struct ast_switch {
        AST_LIST_ENTRY(ast_switch) list;
        const char *name;                       /*!< Name of the switch */
        const char *description;                /*!< Description of the switch */
-       
+
        ast_switch_f *exists;
        ast_switch_f *canmatch;
        ast_switch_f *exec;
@@ -2665,8 +2359,6 @@ static int static_config = 0;
 static int write_protect_config = 1;
 static int autofallthrough_config = 0;
 static int clearglobalvars_config = 0;
-/*! Go no deeper than this through includes (not counting loops) */
-#define AST_PBX_MAX_STACK      128
 static void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count);
 
 
@@ -2726,7 +2418,7 @@ static const char *ast_var_name(const struct ast_var_t *var)
 }
 
 /* experiment 1: see if it's easier just to use existing config code
- *               to read in the extensions.conf file. In this scenario, 
+ *               to read in the extensions.conf file. In this scenario,
                  I have to rip/copy code from other modules, because they
                  are staticly declared as-is. A solution would be to move
                  the ripped code to another location and make them available
@@ -2738,7 +2430,7 @@ static void ast_log(int level, const char *file, int line, const char *function,
 {
        va_list vars;
        va_start(vars,fmt);
-       
+
        printf("LOG: lev:%d file:%s  line:%d func: %s  ",
                   level, file, line, function);
        vprintf(fmt, vars);
@@ -2750,7 +2442,7 @@ void __attribute__((format(printf, 1, 2))) ast_verbose(const char *fmt, ...)
 {
        va_list vars;
        va_start(vars,fmt);
-       
+
        printf("VERBOSE: ");
        vprintf(fmt, vars);
        fflush(stdout);
@@ -2801,6 +2493,63 @@ static int ast_true(const char *s)
        return 0;
 }
 
+#define ONE_MILLION    1000000
+/*
+ * put timeval in a valid range. usec is 0..999999
+ * negative values are not allowed and truncated.
+ */
+static struct timeval tvfix(struct timeval a)
+{
+       if (a.tv_usec >= ONE_MILLION) {
+               ast_log(LOG_WARNING, "warning too large timestamp %ld.%ld\n",
+                       (long)a.tv_sec, (long int) a.tv_usec);
+               a.tv_sec += a.tv_usec / ONE_MILLION;
+               a.tv_usec %= ONE_MILLION;
+       } else if (a.tv_usec < 0) {
+               ast_log(LOG_WARNING, "warning negative timestamp %ld.%ld\n",
+                       (long)a.tv_sec, (long int) a.tv_usec);
+               a.tv_usec = 0;
+       }
+       return a;
+}
+
+struct timeval ast_tvadd(struct timeval a, struct timeval b);
+struct timeval ast_tvadd(struct timeval a, struct timeval b)
+{
+       /* consistency checks to guarantee usec in 0..999999 */
+       a = tvfix(a);
+       b = tvfix(b);
+       a.tv_sec += b.tv_sec;
+       a.tv_usec += b.tv_usec;
+       if (a.tv_usec >= ONE_MILLION) {
+               a.tv_sec++;
+               a.tv_usec -= ONE_MILLION;
+       }
+       return a;
+}
+
+struct timeval ast_tvsub(struct timeval a, struct timeval b);
+struct timeval ast_tvsub(struct timeval a, struct timeval b)
+{
+       /* consistency checks to guarantee usec in 0..999999 */
+       a = tvfix(a);
+       b = tvfix(b);
+       a.tv_sec -= b.tv_sec;
+       a.tv_usec -= b.tv_usec;
+       if (a.tv_usec < 0) {
+               a.tv_sec-- ;
+               a.tv_usec += ONE_MILLION;
+       }
+       return a;
+}
+#undef ONE_MILLION
+
+void ast_mark_lock_failed(void *lock_addr);
+void ast_mark_lock_failed(void *lock_addr)
+{
+       /* Pretend to do something. */
+}
+
 /* stolen from pbx.c */
 #define VAR_BUF_SIZE 4096
 
@@ -2842,7 +2591,7 @@ struct ast_timing {
        unsigned int monthmask;                 /*!< Mask for month */
        unsigned int daymask;                   /*!< Mask for date */
        unsigned int dowmask;                   /*!< Mask for day of week (mon-sun) */
-       unsigned int minmask[24];               /*!< Mask for minute */
+       unsigned int minmask[48];               /*!< Mask for minute */
        char *timezone;                 /*!< NULL, or zoneinfo style timezone */
 };
 /* end of pbx.h */
@@ -2911,7 +2660,7 @@ struct ast_state_cb {
 /*! \brief Structure for dial plan hints
 
   \note Hints are pointers from an extension in the dialplan to one or
-  more devices (tech/name) 
+  more devices (tech/name)
        - See \ref AstExtState
 */
 struct ast_hint {
@@ -2932,50 +2681,14 @@ struct store_hint {
 
 AST_LIST_HEAD(store_hints, store_hint);
 
-static const struct cfextension_states {
-       int extension_state;
-       const char * const text;
-} extension_states[] = {
-       { AST_EXTENSION_NOT_INUSE,                     "Idle" },
-       { AST_EXTENSION_INUSE,                         "InUse" },
-       { AST_EXTENSION_BUSY,                          "Busy" },
-       { AST_EXTENSION_UNAVAILABLE,                   "Unavailable" },
-       { AST_EXTENSION_RINGING,                       "Ringing" },
-       { AST_EXTENSION_INUSE | AST_EXTENSION_RINGING, "InUse&Ringing" },
-       { AST_EXTENSION_ONHOLD,                        "Hold" },
-       { AST_EXTENSION_INUSE | AST_EXTENSION_ONHOLD,  "InUse&Hold" }
-};
 #define STATUS_NO_CONTEXT      1
 #define STATUS_NO_EXTENSION    2
 #define STATUS_NO_PRIORITY     3
 #define STATUS_NO_LABEL                4
 #define STATUS_SUCCESS         5
 
-
-#if defined ( __i386__) && (defined(__FreeBSD__) || defined(linux))
-#if defined(__FreeBSD__)
-#include <machine/cpufunc.h>
-#elif defined(linux)
-static __inline uint64_t
-rdtsc(void)
-{ 
-       uint64_t rv;
-
-       __asm __volatile(".byte 0x0f, 0x31" : "=A" (rv));
-       return (rv);
-}
-#endif
-#else  /* supply a dummy function on other platforms */
-static __inline uint64_t
-rdtsc(void)
-{
-       return 0;
-}
-#endif
-
-
 static struct ast_var_t *ast_var_assign(const char *name, const char *value)
-{      
+{
        struct ast_var_t *var;
        int name_len = strlen(name) + 1;
        int value_len = strlen(value) + 1;
@@ -2987,10 +2700,10 @@ static struct ast_var_t *ast_var_assign(const char *name, const char *value)
        ast_copy_string(var->name, name, name_len);
        var->value = var->name + name_len;
        ast_copy_string(var->value, value, value_len);
-       
+
        return var;
-}      
-       
+}
+
 static void ast_var_delete(struct ast_var_t *var)
 {
        free(var);
@@ -3080,10 +2793,9 @@ static void pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name
                }
        }
 
-       if (value) {
+       if (value && (newvariable = ast_var_assign(name, value))) {
                if ((option_verbose > 1) && (headp == &globals))
                        ast_verbose(VERBOSE_PREFIX_2 "Setting global variable '%s' to '%s'\n", name, value);
-               newvariable = ast_var_assign(name, value);
                AST_LIST_INSERT_HEAD(headp, newvariable, entries);
        }
 
@@ -3149,7 +2861,7 @@ static int lookup_name(const char *s, char *const names[], int max)
        }
 
        /* Allow months and weekdays to be specified as numbers, as well */
-       if (sscanf(s, "%d", &i) == 1 && i >= 1 && i <= max) {
+       if (sscanf(s, "%2d", &i) == 1 && i >= 1 && i <= max) {
                /* What the array offset would have been: "1" would be at offset 0 */
                return i - 1;
        }
@@ -3226,7 +2938,7 @@ static void get_timerange(struct ast_timing *i, char *times)
        /* Otherwise expect a range */
        while ((part = strsep(&times, "&"))) {
                if (!(endpart = strchr(part, '-'))) {
-                       if (sscanf(part, "%d:%d", &st_h, &st_m) != 2 || st_h < 0 || st_h > 23 || st_m < 0 || st_m > 59) {
+                       if (sscanf(part, "%2d:%2d", &st_h, &st_m) != 2 || st_h < 0 || st_h > 23 || st_m < 0 || st_m > 59) {
                                ast_log(LOG_WARNING, "%s isn't a valid time.\n", part);
                                continue;
                        }
@@ -3242,11 +2954,11 @@ static void get_timerange(struct ast_timing *i, char *times)
                        ast_log(LOG_WARNING, "Invalid time range starting with '%s-'.\n", part);
                        continue;
                }
-               if (sscanf(part, "%d:%d", &st_h, &st_m) != 2 || st_h < 0 || st_h > 23 || st_m < 0 || st_m > 59) {
+               if (sscanf(part, "%2d:%2d", &st_h, &st_m) != 2 || st_h < 0 || st_h > 23 || st_m < 0 || st_m > 59) {
                        ast_log(LOG_WARNING, "'%s' isn't a valid start time.\n", part);
                        continue;
                }
-               if (sscanf(endpart, "%d:%d", &endh, &endm) != 2 || endh < 0 || endh > 23 || endm < 0 || endm > 59) {
+               if (sscanf(endpart, "%2d:%2d", &endh, &endm) != 2 || endh < 0 || endh > 23 || endm < 0 || endm > 59) {
                        ast_log(LOG_WARNING, "'%s' isn't a valid end time.\n", endpart);
                        continue;
                }
@@ -3268,7 +2980,7 @@ static void null_datad(void *foo)
 }
 
 /*! \brief Find realtime engine for realtime family */
-static struct ast_config_engine *find_engine(const char *family, char *database, int dbsiz, char *table, int tabsiz) 
+static struct ast_config_engine *find_engine(const char *family, char *database, int dbsiz, char *table, int tabsiz)
 {
        struct ast_config_engine *eng, *ret = NULL;
        struct ast_config_map *map;
@@ -3291,12 +3003,12 @@ static struct ast_config_engine *find_engine(const char *family, char *database,
                                ret = eng;
                }
        }
-       
-       
+
+
        /* if we found a mapping, but the engine is not available, then issue a warning */
        if (map && !ret)
                ast_log(LOG_WARNING, "Realtime mapping for '%s' found to engine '%s', but the engine is not available\n", map->name, map->driver);
-       
+
        return ret;
 }
 
@@ -3371,7 +3083,7 @@ static void ast_category_destroy(struct ast_category *cat)
        ast_variables_destroy(cat->root);
        if (cat->file)
                free(cat->file);
-       
+
        free(cat);
 }
 
@@ -3388,7 +3100,7 @@ static struct ast_config *ast_config_internal_load(const char *filename, struct
        char db[256];
        char table[256];
        struct ast_config_engine *loader = &text_file_engine;
-       struct ast_config *result; 
+       struct ast_config *result;
 
        if (cfg->include_level == cfg->max_include_level) {
                ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level);
@@ -3416,7 +3128,7 @@ static struct ast_config *ast_config_internal_load(const char *filename, struct
        }
 
        result = loader->load_func(db, table, filename, cfg, withcomments, suggested_incl_file);
-       /* silence is golden 
+       /* silence is golden
           ast_log(LOG_WARNING, "finished internal loading file %s level=%d\n", filename, cfg->include_level);
        */
 
@@ -3455,7 +3167,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                        return -1;
                }
                (*cat)->lineno = lineno;
-        
+
                /* add comments */
                if (withcomments && comment_buffer && comment_buffer[0] ) {
                        newcat->precomments = ALLOC_COMMENT(comment_buffer);
@@ -3465,7 +3177,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                }
                if( withcomments )
                        CB_RESET();
-               
+
                /* If there are options or categories to inherit from, process them now */
                if (c) {
                        if (!(cur = strchr(c, ')'))) {
@@ -3492,7 +3204,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                                        }
                                } else {
                                        struct ast_category *base;
-                               
+
                                        base = category_get(cfg, cur, 1);
                                        if (!base) {
                                                ast_log(LOG_WARNING, "Inheritance requested, but category '%s' does not exist, line %d of %s\n", cur, lineno, configfile);
@@ -3515,7 +3227,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                        c = ast_skip_blanks(c + 1);
                        if (!*c)
                                c = NULL;
-               } else 
+               } else
                        c = NULL;
                do_include = !strcasecmp(cur, "include");
                if(!do_include)
@@ -3530,8 +3242,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                        if (c) {
                                char *cur2;
                                char real_inclusion_name[256];
-                               struct ast_config_include *inclu;
-                
+
                                /* Strip off leading and trailing "'s and <>'s */
                                while((*c == '<') || (*c == '>') || (*c == '\"')) c++;
                                /* Get rid of leading mess */
@@ -3546,7 +3257,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                                }
                                /* #exec </path/to/executable>
                                   We create a tmp file, then we #include it, then we delete it. */
-                               if (do_exec) { 
+                               if (do_exec) {
                                        snprintf(exec_file, sizeof(exec_file), "/var/tmp/exec.%d.%ld", (int)time(NULL), (long)pthread_self());
                                        snprintf(cmd, sizeof(cmd), "%s > %s 2>&1", cur, exec_file);
                                        ast_safe_system(cmd);
@@ -3555,26 +3266,26 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                                        exec_file[0] = '\0';
                                /* A #include */
                                /* ast_log(LOG_WARNING, "Reading in included file %s withcomments=%d\n", cur, withcomments); */
-                               
+
                                /* record this inclusion */
-                               inclu = ast_include_new(cfg, configfile, cur, do_exec, cur2, lineno, real_inclusion_name, sizeof(real_inclusion_name));
-                               
+                               ast_include_new(cfg, configfile, cur, do_exec, cur2, lineno, real_inclusion_name, sizeof(real_inclusion_name));
+
                                do_include = ast_config_internal_load(cur, cfg, withcomments, real_inclusion_name) ? 1 : 0;
                                if(!ast_strlen_zero(exec_file))
                                        unlink(exec_file);
                                if(!do_include)
                                        return 0;
                                /* ast_log(LOG_WARNING, "Done reading in included file %s withcomments=%d\n", cur, withcomments); */
-                               
+
                        } else {
-                               ast_log(LOG_WARNING, "Directive '#%s' needs an argument (%s) at line %d of %s\n", 
+                               ast_log(LOG_WARNING, "Directive '#%s' needs an argument (%s) at line %d of %s\n",
                                                do_exec ? "exec" : "include",
                                                do_exec ? "/path/to/executable" : "filename",
                                                lineno,
                                                configfile);
                        }
                }
-               else 
+               else
                        ast_log(LOG_WARNING, "Unknown directive '%s' at line %d of %s\n", cur, lineno, configfile);
        } else {
                /* Just a line (variable = value) */
@@ -3608,7 +3319,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                                }
                                if( withcomments )
                                        CB_RESET();
-                               
+
                        } else {
                                return -1;
                        }
@@ -3646,7 +3357,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
        struct ast_category *cat = NULL;
        int count = 0;
        struct stat statbuf;
-       
+
        cat = ast_config_get_current_category(cfg);
 
        if (filename[0] == '/') {
@@ -3661,7 +3372,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
        if (withcomments && cfg && cfg->include_level < 2 ) {
                CB_INIT();
        }
-       
+
 #ifdef AST_INCLUDE_GLOB
        {
                int glob_ret;
@@ -3712,17 +3423,17 @@ static struct ast_config *config_text_file_load(const char *database, const char
                while(!feof(f)) {
                        lineno++;
                        if (fgets(buf, sizeof(buf), f)) {
-                               if ( withcomments ) {    
+                               if ( withcomments ) {
                                        CB_ADD(lline_buffer);       /* add the current lline buffer to the comment buffer */
                                        lline_buffer[0] = 0;        /* erase the lline buffer */
                                }
-                               
+
                                new_buf = buf;
-                               if (comment) 
+                               if (comment)
                                        process_buf = NULL;
                                else
                                        process_buf = buf;
-                               
+
                                while ((comment_p = strchr(new_buf, COMMENT_META))) {
                                        if ((comment_p > new_buf) && (*(comment_p-1) == '\\')) {
                                                /* Yuck, gotta memmove */
@@ -3754,7 +3465,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                                                        CB_ADD(";");
                                                                        CB_ADD_LEN(oldptr+1,new_buf-oldptr-1);
                                                                }
-                                                               
+
                                                                memmove(oldptr, new_buf, strlen(new_buf) + 1);
                                                                new_buf = oldptr;
                                                        } else
@@ -3762,12 +3473,12 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                                }
                                        } else {
                                                if (!comment) {
-                                                       /* If ; is found, and we are not nested in a comment, 
+                                                       /* If ; is found, and we are not nested in a comment,
                                                           we immediately stop all comment processing */
                                                        if ( withcomments ) {
                                                                LLB_ADD(comment_p);
                                                        }
-                                                       *comment_p = '\0'; 
+                                                       *comment_p = '\0';
                                                        new_buf = comment_p;
                                                } else
                                                        new_buf = comment_p + 1;
@@ -3777,7 +3488,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                {
                                        CB_ADD(buf);  /* the whole line is a comment, store it */
                                }
-                               
+
                                if (process_buf) {
                                        char *stripped_process_buf = ast_strip(process_buf);
                                        if (!ast_strlen_zero(stripped_process_buf)) {
@@ -3789,7 +3500,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                }
                        }
                }
-               fclose(f);              
+               fclose(f);
        } while(0);
        if (comment) {
                ast_log(LOG_WARNING,"Unterminated comment detected beginning on line %d\n", nest[comment]);
@@ -3803,12 +3514,12 @@ static struct ast_config *config_text_file_load(const char *database, const char
                }
 #endif
        if (cfg && cfg->include_level == 1 && withcomments && comment_buffer) {
-               if (comment_buffer) { 
+               if (comment_buffer) {
                        free(comment_buffer);
                        free(lline_buffer);
-                       comment_buffer=0; 
-                       lline_buffer=0; 
-                       comment_buffer_size=0; 
+                       comment_buffer=0;
+                       lline_buffer=0;
+                       comment_buffer_size=0;
                        lline_buffer_size=0;
                }
        }
@@ -3821,7 +3532,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
 
 static struct ast_config *ast_config_new(void) ;
 
-static struct ast_config *ast_config_new(void) 
+static struct ast_config *ast_config_new(void)
 {
        struct ast_config *config;
 
@@ -3874,7 +3585,7 @@ static struct ast_category *next_available_category(struct ast_category *cat)
 }
 
 static char *ast_category_browse(struct ast_config *config, const char *prev)
-{      
+{
        struct ast_category *cat = NULL;
 
        if (prev && config->last_browse && (config->last_browse->name == prev))
@@ -3897,7 +3608,7 @@ static char *ast_category_browse(struct ast_config *config, const char *prev)
                        }
                }
        }
-       
+
        if (cat)
                cat = next_available_category(cat);
 
@@ -3918,21 +3629,21 @@ void ast_config_set_current_category(struct ast_config *cfg, const struct ast_ca
 /* NOTE: categories and variables each have a file and lineno attribute. On a save operation, these are used to determine
    which file and line number to write out to. Thus, an entire hierarchy of config files (via #include statements) can be
    recreated. BUT, care must be taken to make sure that every cat and var has the proper file name stored, or you may
-   be shocked and mystified as to why things are not showing up in the files! 
-   
+   be shocked and mystified as to why things are not showing up in the files!
+
    Also, All #include/#exec statements are recorded in the "includes" LL in the ast_config structure. The file name
    and line number are stored for each include, plus the name of the file included, so that these statements may be
-   included in the output files on a file_save operation. 
-   
+   included in the output files on a file_save operation.
+
    The lineno's are really just for relative placement in the file. There is no attempt to make sure that blank lines
    are included to keep the lineno's the same between input and output. The lineno fields are used mainly to determine
    the position of the #include and #exec directives. So, blank lines tend to disappear from a read/rewrite operation,
    and a header gets added.
-   
+
    vars and category heads are output in the order they are stored in the config file. So, if the software
    shuffles these at all, then the placement of #include directives might get a little mixed up, because the
    file/lineno data probably won't get changed.
-   
+
 */
 
 static void gen_header(FILE *f1, const char *configfile, const char *fn, const char *generator)
@@ -3941,7 +3652,7 @@ static void gen_header(FILE *f1, const char *configfile, const char *fn, const c
        time_t t;
        time(&t);
        ast_copy_string(date, ctime(&t), sizeof(date));
-       
+
        fprintf(f1, ";!\n");
        fprintf(f1, ";! Automatically generated configuration file\n");
        if (strcmp(configfile, fn))
@@ -3960,7 +3671,7 @@ static void set_fn(char *fn, int fn_size, const char *file, const char *configfi
                        ast_copy_string(fn, configfile, fn_size);
                else
                        snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, configfile);
-       } else if (file[0] == '/') 
+       } else if (file[0] == '/')
                ast_copy_string(fn, file, fn_size);
        else
                snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, file);
@@ -3977,20 +3688,20 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
        struct ast_comment *cmt;
        struct ast_config_include *incl;
        int blanklines = 0;
-       
+
        /* reset all the output flags, in case this isn't our first time saving this data */
-       
+
        for (incl=cfg->includes; incl; incl = incl->next)
                incl->output = 0;
-       
+
        /* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions)
           are all truncated to zero bytes and have that nice header*/
-       
+
        for (incl=cfg->includes; incl; incl = incl->next)
        {
                if (!incl->exec) { /* leave the execs alone -- we'll write out the #exec directives, but won't zero out the include files or exec files*/
                        FILE *f1;
-                       
+
                        set_fn(fn, sizeof(fn), incl->included_file, configfile); /* normally, fn is just set to incl->included_file, prepended with config dir if relative */
                        f1 = fopen(fn,"w");
                        if (f1) {
@@ -4001,24 +3712,24 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                        }
                }
        }
-       
+
        set_fn(fn, sizeof(fn), 0, configfile); /* just set fn to absolute ver of configfile */
-#ifdef __CYGWIN__      
+#ifdef __CYGWIN__
        if ((f = fopen(fn, "w+"))) {
 #else
        if ((f = fopen(fn, "w"))) {
-#endif     
+#endif
                if (option_verbose > 1)
                        ast_verbose(VERBOSE_PREFIX_2 "Saving '%s': ", fn);
 
                gen_header(f, configfile, fn, generator);
                cat = cfg->root;
                fclose(f);
-        
+
                /* from here out, we open each involved file and concat the stuff we need to add to the end and immediately close... */
-               /* since each var, cat, and associated comments can come from any file, we have to be 
+               /* since each var, cat, and associated comments can come from any file, we have to be
                   mobile, and open each file, print, and close it on an entry-by-entry basis */
-               
+
                while(cat) {
                        set_fn(fn, sizeof(fn), cat->file, configfile);
                        f = fopen(fn, "a");
@@ -4027,7 +3738,7 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                                ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
                                return -1;
                        }
-                       
+
                        /* dump any includes that happen before this category header */
                        for (incl=cfg->includes; incl; incl = incl->next) {
                                if (strcmp(incl->include_location_file, cat->file) == 0){
@@ -4040,7 +3751,7 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                                        }
                                }
                        }
-            
+
                        /* Dump section with any appropriate comment */
                        for (cmt = cat->precomments; cmt; cmt=cmt->next) {
                                if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!')
@@ -4055,7 +3766,7 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                        if (!cat->sameline)
                                fprintf(f,"\n");
                        fclose(f);
-            
+
                        var = cat->root;
                        while(var) {
                                set_fn(fn, sizeof(fn), var->file, configfile);
@@ -4065,7 +3776,7 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                                        ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
                                        return -1;
                                }
-                
+
                                /* dump any includes that happen before this category header */
                                for (incl=cfg->includes; incl; incl = incl->next) {
                                        if (strcmp(incl->include_location_file, var->file) == 0){
@@ -4078,24 +3789,24 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                                                }
                                        }
                                }
-                
+
                                for (cmt = var->precomments; cmt; cmt=cmt->next) {
                                        if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!')
                                                fprintf(f,"%s", cmt->cmt);
                                }
-                               if (var->sameline) 
+                               if (var->sameline)
                                        fprintf(f, "%s %s %s  %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt);
-                               else    
+                               else
                                        fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value);
                                if (var->blanklines) {
                                        blanklines = var->blanklines;
                                        while (blanklines--)
                                                fprintf(f, "\n");
                                }
-                               
+
                                fclose(f);
-                
-                               
+
+
                                var = var->next;
                        }
                        cat = cat->next;
@@ -4112,7 +3823,7 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
 
        /* Now, for files with trailing #include/#exec statements,
           we have to make sure every entry is output */
-       
+
        for (incl=cfg->includes; incl; incl = incl->next) {
                if (!incl->output) {
                        /* open the respective file */
@@ -4123,7 +3834,7 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                                ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
                                return -1;
                        }
-            
+
                        /* output the respective include */
                        if (incl->exec)
                                fprintf(f,"#exec \"%s\"\n", incl->exec_file);
@@ -4133,7 +3844,7 @@ int localized_config_text_file_save(const char *configfile, const struct ast_con
                        incl->output = 1;
                }
        }
-       
+
        return 0;
 }
 
@@ -4152,20 +3863,6 @@ struct ast_app;
 #else
 #define EXT_DATA_SIZE 8192
 #endif
-/*!
- * When looking up extensions, we can have different requests
- * identified by the 'action' argument, as follows.
- * Note that the coding is such that the low 4 bits are the
- * third argument to extension_match_core.
- */
-enum ext_match_t {
-       E_MATCHMORE =   0x00,   /* extension can match but only with more 'digits' */
-       E_CANMATCH =    0x01,   /* extension can match with or without more 'digits' */
-       E_MATCH =       0x02,   /* extension is an exact match */
-       E_MATCH_MASK =  0x03,   /* mask for the argument to extension_match_core() */
-       E_SPAWN =       0x12,   /* want to spawn an extension. Requires exact match */
-       E_FINDLABEL =   0x22    /* returns the priority for a given label. Requires exact match */
-};
 
 #ifdef NOT_ANYMORE
 static AST_RWLIST_HEAD_STATIC(switches, ast_switch);
@@ -4369,16 +4066,18 @@ int ast_build_timing(struct ast_timing *i, const char *info_in);
 
 int ast_build_timing(struct ast_timing *i, const char *info_in)
 {
-       char *info_save, *info;
+       char *info;
        int j, num_fields, last_sep = -1;
 
+       i->timezone = NULL;
+
        /* Check for empty just in case */
        if (ast_strlen_zero(info_in)) {
                return 0;
        }
 
        /* make a copy just in case we were passed a static string */
-       info_save = info = ast_strdupa(info_in);
+       info = ast_strdupa(info_in);
 
        /* count the number of fields in the timespec */
        for (j = 0, num_fields = 1; info[j] != '\0'; j++) {
@@ -4391,8 +4090,6 @@ int ast_build_timing(struct ast_timing *i, const char *info_in)
        /* save the timezone, if it is specified */
        if (num_fields == 5) {
                i->timezone = ast_strdup(info + last_sep + 1);
-       } else {
-               i->timezone = NULL;
        }
 
        /* Assume everything except time */
@@ -4473,7 +4170,7 @@ static int ext_cmp1(const char **p)
                break;
        }
        /* locate end of set */
-       end = strchr(*p, ']');  
+       end = strchr(*p, ']');
 
        if (end == NULL) {
                ast_log(LOG_WARNING, "Wrong usage of [] in the extension\n");
@@ -4650,6 +4347,19 @@ static struct ast_include *ast_walk_context_includes(struct ast_context *con,
                return inc->next;
 }
 
+int ast_context_includes_count(struct ast_context *con);
+int ast_context_includes_count(struct ast_context *con)
+{
+       int c = 0;
+       struct ast_include *inc = NULL;
+
+       while ((inc = ast_walk_context_includes(con, inc))) {
+               c++;
+       }
+
+       return c;
+}
+
 struct ast_include *localized_walk_context_includes(struct ast_context *con,
                                                                                                        struct ast_include *inc);
 struct ast_include *localized_walk_context_includes(struct ast_context *con,
@@ -4658,6 +4368,31 @@ struct ast_include *localized_walk_context_includes(struct ast_context *con,
        return ast_walk_context_includes(con, inc);
 }
 
+static struct ast_ignorepat *ast_walk_context_ignorepats(struct ast_context *con,
+       struct ast_ignorepat *ip);
+
+static struct ast_ignorepat *ast_walk_context_ignorepats(struct ast_context *con,
+       struct ast_ignorepat *ip)
+{
+       if (!ip)
+               return con ? con->ignorepats : NULL;
+       else
+               return ip->next;
+}
+
+int ast_context_ignorepats_count(struct ast_context *con);
+int ast_context_ignorepats_count(struct ast_context *con)
+{
+       int c = 0;
+       struct ast_ignorepat *ip = NULL;
+
+       while ((ip = ast_walk_context_ignorepats(con, ip))) {
+               c++;
+       }
+
+       return c;
+}
+
 
 static struct ast_sw *ast_walk_context_switches(struct ast_context *con,
                                                                                                         struct ast_sw *sw);
@@ -4679,6 +4414,19 @@ struct ast_sw *localized_walk_context_switches(struct ast_context *con,
        return ast_walk_context_switches(con, sw);
 }
 
+int ast_context_switches_count(struct ast_context *con);
+int ast_context_switches_count(struct ast_context *con)
+{
+       int c = 0;
+       struct ast_sw *sw = NULL;
+
+       while ((sw = ast_walk_context_switches(con, sw))) {
+               c++;
+       }
+
+       return c;
+}
+
 
 static struct ast_context *ast_context_find(const char *name);
 
@@ -4692,22 +4440,6 @@ static struct ast_context *ast_context_find(const char *name)
        return tmp;
 }
 
-/* request and result for pbx_find_extension */
-struct pbx_find_info {
-#if 0
-       const char *context;
-       const char *exten;
-       int priority;
-#endif
-
-       char *incstack[AST_PBX_MAX_STACK];      /* filled during the search */
-       int stacklen;                   /* modified during the search */
-       int status;                     /* set on return */
-       struct ast_switch *swo;         /* set on return */
-       const char *data;               /* set on return */
-       const char *foundcontext;       /* set on return */
-};
-
 /*
  * Internal function for ast_extension_{match|close}
  * return 0 on no-match, 1 on match, 2 on early match.
@@ -4848,24 +4580,24 @@ static inline int include_valid(struct ast_include *i)
 
 
 static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
-                                                                                       struct ast_context *bypass, 
+                                                                                       struct ast_context *bypass,
                                                                                        struct pbx_find_info *q,
-                                                                                       const char *context, 
-                                                                                       const char *exten, 
+                                                                                       const char *context,
+                                                                                       const char *exten,
                                                                                        int priority,
-                                                                                       const char *label, 
-                                                                                       const char *callerid, 
+                                                                                       const char *label,
+                                                                                       const char *callerid,
                                                                                        enum ext_match_t action);
 
 
 static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
-                                                                                       struct ast_context *bypass, 
+                                                                                       struct ast_context *bypass,
                                                                                        struct pbx_find_info *q,
-                                                                                       const char *context, 
-                                                                                       const char *exten, 
+                                                                                       const char *context,
+                                                                                       const char *exten,
                                                                                        int priority,
-                                                                                       const char *label, 
-                                                                                       const char *callerid, 
+                                                                                       const char *label,
+                                                                                       const char *callerid,
                                                                                        enum ext_match_t action)
 {
        int x;
@@ -4873,6 +4605,10 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
        struct ast_exten *e, *eroot;
        struct ast_include *i;
 
+       if (!context) {
+               return NULL;
+       }
+
        /* Initialize status if appropriate */
        if (q->stacklen == 0) {
                q->status = STATUS_NO_CONTEXT;
@@ -4949,7 +4685,7 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
                        continue;
                }
                /* No need to Substitute variables now; we shouldn't be here if there's any  */
-               
+
                /* equivalent of extension_match_core() at the switch level */
                if (action == E_CANMATCH)
                        aswf = asw->canmatch;
@@ -4983,20 +4719,20 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
 
 struct ast_exten *localized_find_extension(struct ast_context *bypass,
                                                                                  struct pbx_find_info *q,
-                                                                                 const char *context, 
-                                                                                 const char *exten, 
+                                                                                 const char *context,
+                                                                                 const char *exten,
                                                                                  int priority,
-                                                                                 const char *label, 
-                                                                                 const char *callerid, 
+                                                                                 const char *label,
+                                                                                 const char *callerid,
                                                                                  enum ext_match_t action);
 
 struct ast_exten *localized_find_extension(struct ast_context *bypass,
                                                                                  struct pbx_find_info *q,
-                                                                                 const char *context, 
-                                                                                 const char *exten, 
+                                                                                 const char *context,
+                                                                                 const char *exten,
                                                                                  int priority,
-                                                                                 const char *label, 
-                                                                                 const char *callerid, 
+                                                                                 const char *label,
+                                                                                 const char *callerid,
                                                                                   enum ext_match_t action)
 {
        return pbx_find_extension(NULL, bypass, q, context, exten, priority, label, callerid, action);
@@ -5541,7 +5277,7 @@ static int parse_variable_name(char *var, int *offset, int *length, int *isfunc)
                        parens--;
                } else if (*var == ':' && parens == 0) {
                        *var++ = '\0';
-                       sscanf(var, "%d:%d", offset, length);
+                       sscanf(var, "%30d:%30d", offset, length);
                        return 1; /* offset:length valid */
                }
        }
@@ -5610,7 +5346,7 @@ static void pbx_retrieve_variable(struct ast_channel *c, const char *var, char *
        int offset, length;
        int i, need_substring;
        struct varshead *places[2] = { headp, &globals };       /* list of places where we may look */
-       
+
        /*
         * Make a copy of var because parse_variable_name() modifies the string.
         * Then if called directly, we might need to run substring() on the result;
@@ -5618,7 +5354,7 @@ static void pbx_retrieve_variable(struct ast_channel *c, const char *var, char *
         */
        tmpvar = ast_strdupa(var);      /* parse_variable_name modifies the string */
        need_substring = parse_variable_name(tmpvar, &offset, &length, &i /* ignored */);
-       
+
        /*
         * Look first into predefined variables, then into variable lists.
         * Variable 's' points to the result, according to the following rules:
@@ -5639,7 +5375,7 @@ static void pbx_retrieve_variable(struct ast_channel *c, const char *var, char *
                if (!strcmp(var, "EPOCH")) {
                        snprintf(workspace, workspacelen, "%u",(int)time(NULL));
                }
-               
+
                s = workspace;
        }
        /* if not found, look into chanvars or global vars */
@@ -5882,11 +5618,11 @@ static int pbx_load_config(const char *config_file)
                autofallthrough_config = ast_true(aft);
        clearglobalvars_config = ast_true(ast_variable_retrieve(cfg, "general", "clearglobalvars"));
 
-       if ((cxt = ast_variable_retrieve(cfg, "general", "userscontext"))) 
+       if ((cxt = ast_variable_retrieve(cfg, "general", "userscontext")))
                ast_copy_string(userscontext, cxt, sizeof(userscontext));
        else
                ast_copy_string(userscontext, "default", sizeof(userscontext));
-                                                                   
+
        for (v = ast_variable_browse(cfg, "globals"); v; v = v->next) {
                memset(realvalue, 0, sizeof(realvalue));
                pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
@@ -5945,7 +5681,7 @@ static int pbx_load_config(const char *config_file)
                                                        ipri = lastpri;
                                                else
                                                        ast_log(LOG_WARNING, "Can't use 'same' priority on the first entry!\n");
-                                       } else if (sscanf(pri, "%d", &ipri) != 1 &&
+                                       } else if (sscanf(pri, "%30d", &ipri) != 1 &&
                                            (ipri = ast_findlabel_extension2(NULL, con, realext, pri, cidmatch)) < 1) {
                                                ast_log(LOG_WARNING, "Invalid priority/label '%s' at line %d\n", pri, v->lineno);
                                                ipri = 0;
@@ -6138,9 +5874,7 @@ static void ast_merge_contexts_and_delete(struct ast_context **extcontexts, cons
        return;
 }
 
-void localized_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar);
-
-void localized_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar)
+void localized_merge_contexts_and_delete(struct ast_context **extcontexts, void *tab, const char *registrar)
 {
        ast_merge_contexts_and_delete(extcontexts, registrar);
 }
@@ -6189,7 +5923,16 @@ int localized_pbx_load_module(void)
                printf("Context: %s\n", con->name);
        }
        printf("=========\n");
-       
+
        return 0;
 }
 
+/* For platforms which don't have pthread_rwlock_timedrdlock() */
+struct timeval ast_tvnow(void);
+
+struct timeval ast_tvnow(void)
+{
+       struct timeval t;
+       gettimeofday(&t, NULL);
+       return t;
+}