Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
extconf.c File Reference
#include "asterisk.h"
#include "asterisk/compat.h"
#include "asterisk/paths.h"
#include <errno.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <stdarg.h>
#include <string.h>
#include <locale.h>
#include <ctype.h>
#include <err.h>
#include <regex.h>
#include <limits.h>
#include <pthread.h>
#include <netdb.h>
#include <sys/param.h>
#include <signal.h>
#include "asterisk/inline_api.h"
#include "asterisk/endian.h"
#include "asterisk/ast_expr.h"
#include "asterisk/extconf.h"
#include "asterisk/hashtab.h"
#include "asterisk/ael_structs.h"
#include "asterisk/pval.h"
Include dependency graph for extconf.c:

Go to the source code of this file.

Data Structures

struct  ast_app
 ast_app: A registered application More...
 
struct  ast_category
 
struct  ast_channel
 Main Channel structure associated with a channel. More...
 
struct  ast_comment
 Structure to keep comments for rewriting configuration files. More...
 
struct  ast_config
 
struct  ast_config_engine
 Configuration engine structure, used to define realtime drivers. More...
 
struct  ast_config_include
 
struct  ast_config_map
 
struct  ast_context
 ast_context: An extension context - must remain in sync with fake_context More...
 
struct  ast_custom_function
 Data structure associated with a custom dialplan function. More...
 
struct  ast_exten
 ast_exten: An extension The dialplan is saved as a linked list with each context having it's own linked list of extensions - one item per priority. More...
 
struct  ast_flags
 Structure used to handle boolean flags. More...
 
struct  ast_hint
 Structure for dial plan hints. More...
 
struct  ast_ignorepat
 ast_ignorepat: Ignore patterns in dial plan More...
 
struct  ast_include
 ast_include: include= support in extensions.conf More...
 
struct  ast_state_cb
 ast_state_cb: An extension state notify register item More...
 
struct  ast_sw
 ast_sw: Switch statement in extensions.conf More...
 
struct  ast_switch
 
struct  ast_timing
 
struct  ast_var_t
 
struct  ast_variable
 Structure for variables, used for configurations and for channel variables. More...
 
struct  hints
 
struct  store_hint
 
struct  store_hints
 
struct  varshead
 

Macros

#define __AST_MUTEX_DEFINE(scope, mutex)   scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE
 
#define __AST_RWLOCK_DEFINE(scope, rwlock)   scope ast_rwlock_t rwlock = AST_RWLOCK_INIT_VALUE
 
#define __LOG_DEBUG   0
 
#define __LOG_DTMF   6
 
#define __LOG_ERROR   4
 
#define __LOG_EVENT   1
 
#define __LOG_NOTICE   2
 
#define __LOG_VERBOSE   5
 
#define __LOG_WARNING   3
 
#define __MTX_PROF(a)   return pthread_mutex_lock((a))
 
#define _A_   __FILE__, __LINE__, __PRETTY_FUNCTION__
 
#define _ASTERISK_LOCK_H   /* A small indication that this is horribly wrong. */
 
#define AST_API_MODULE   1 /* gimme the inline defs! */
 
#define AST_CACHE_DIR_LEN   512
 
#define AST_DEFAULT_OPTIONS   AST_OPT_FLAG_TRANSCODE_VIA_SLIN
 
#define AST_FILENAME_MAX   80
 
#define ast_fully_booted   ast_test_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED)
 
#define AST_LIST_APPEND_LIST(head, list, field)
 Appends a whole list to the tail of a list. More...
 
#define AST_LIST_EMPTY(head)   (AST_LIST_FIRST(head) == NULL)
 Checks whether the specified list contains any entries. More...
 
#define AST_LIST_ENTRY(type)
 Declare a forward link structure inside a list entry. More...
 
#define AST_LIST_FIRST(head)   ((head)->first)
 Returns the first entry contained in a list. More...
 
#define AST_LIST_HEAD(name, type)
 Defines a structure to be used to hold a list of specified type. More...
 
#define AST_LIST_HEAD_INIT(head)
 Initializes a list head structure. More...
 
#define AST_LIST_HEAD_INIT_NOLOCK(head)
 Initializes a list head structure. More...
 
#define AST_LIST_HEAD_INIT_VALUE
 Defines initial values for a declaration of AST_LIST_HEAD. More...
 
#define AST_LIST_HEAD_NOLOCK(name, type)
 Defines a structure to be used to hold a list of specified type (with no lock). More...
 
#define AST_LIST_HEAD_NOLOCK_INIT_VALUE
 Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK. More...
 
#define AST_LIST_HEAD_NOLOCK_STATIC(name, type)
 Defines a structure to be used to hold a list of specified type, statically initialized. More...
 
#define AST_LIST_HEAD_SET(head, entry)
 Initializes a list head structure with a specified first entry. More...
 
#define AST_LIST_HEAD_SET_NOLOCK(head, entry)
 Initializes a list head structure with a specified first entry. More...
 
#define AST_LIST_HEAD_STATIC(name, type)
 Defines a structure to be used to hold a list of specified type, statically initialized. More...
 
#define AST_LIST_INSERT_AFTER(head, listelm, elm, field)
 Inserts a list entry after a given entry. More...
 
#define AST_LIST_INSERT_BEFORE_CURRENT(head, elm, field)
 Inserts a list entry before the current entry during a traversal. More...
 
#define AST_LIST_INSERT_HEAD(head, elm, field)
 Inserts a list entry at the head of a list. More...
 
#define AST_LIST_INSERT_TAIL(head, elm, field)
 Appends a list entry to the tail of a list. More...
 
#define AST_LIST_LAST(head)   ((head)->last)
 Returns the last entry contained in a list. More...
 
#define AST_LIST_NEXT(elm, field)   ((elm)->field.next)
 Returns the next entry in the list after the given entry. More...
 
#define AST_LIST_REMOVE(head, elm, field)
 Removes a specific entry from a list. More...
 
#define AST_LIST_REMOVE_CURRENT(head, field)
 Removes the current entry from a list during a traversal. More...
 
#define AST_LIST_REMOVE_HEAD(head, field)
 Removes and returns the head entry from a list. More...
 
#define AST_LIST_TRAVERSE(head, var, field)   for((var) = (head)->first; (var); (var) = (var)->field.next)
 Loops over (traverses) the entries in a list. More...
 
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
 Loops safely over (traverses) the entries in a list. More...
 
#define AST_LIST_TRAVERSE_SAFE_END   }
 Closes a safe loop traversal block. More...
 
#define AST_MAX_EXTENSION   80
 
#define AST_MUTEX_DEFINE_STATIC(mutex)   __AST_MUTEX_DEFINE(static, mutex)
 
#define AST_MUTEX_INIT_VALUE   ((ast_mutex_t) PTHREAD_MUTEX_INIT_VALUE)
 
#define AST_MUTEX_INITIALIZER   __use_AST_MUTEX_DEFINE_STATIC_rather_than_AST_MUTEX_INITIALIZER__
 
#define AST_MUTEX_KIND   PTHREAD_MUTEX_RECURSIVE
 
#define ast_opt_always_fork   ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)
 
#define ast_opt_cache_record_files   ast_test_flag(&ast_options, AST_OPT_FLAG_CACHE_RECORD_FILES)
 
#define ast_opt_console   ast_test_flag(&ast_options, AST_OPT_FLAG_CONSOLE)
 
#define ast_opt_dont_warn   ast_test_flag(&ast_options, AST_OPT_FLAG_DONT_WARN)
 
#define ast_opt_dump_core   ast_test_flag(&ast_options, AST_OPT_FLAG_DUMP_CORE)
 
#define ast_opt_exec   ast_test_flag(&ast_options, AST_OPT_FLAG_EXEC)
 
#define ast_opt_exec_includes   ast_test_flag(&ast_options, AST_OPT_FLAG_EXEC_INCLUDES)
 
#define ast_opt_high_priority   ast_test_flag(&ast_options, AST_OPT_FLAG_HIGH_PRIORITY)
 
#define ast_opt_init_keys   ast_test_flag(&ast_options, AST_OPT_FLAG_INIT_KEYS)
 
#define ast_opt_mute   ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE)
 
#define ast_opt_no_color   ast_test_flag(&ast_options, AST_OPT_FLAG_NO_COLOR)
 
#define ast_opt_no_fork   ast_test_flag(&ast_options, AST_OPT_FLAG_NO_FORK)
 
#define ast_opt_override_config   ast_test_flag(&ast_options, AST_OPT_FLAG_OVERRIDE_CONFIG)
 
#define ast_opt_priority_jumping   ast_test_flag(&ast_options, AST_OPT_FLAG_PRIORITY_JUMPING)
 
#define ast_opt_quiet   ast_test_flag(&ast_options, AST_OPT_FLAG_QUIET)
 
#define ast_opt_reconnect   ast_test_flag(&ast_options, AST_OPT_FLAG_RECONNECT)
 
#define ast_opt_remote   ast_test_flag(&ast_options, AST_OPT_FLAG_REMOTE)
 
#define ast_opt_timestamp   ast_test_flag(&ast_options, AST_OPT_FLAG_TIMESTAMP)
 
#define ast_opt_transcode_via_slin   ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSCODE_VIA_SLIN)
 
#define ast_opt_transmit_silence   ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSMIT_SILENCE)
 
#define ast_pthread_mutex_init(pmutex, a)   pthread_mutex_init(pmutex,a)
 
#define AST_PTHREADT_NULL   (pthread_t) -1
 
#define AST_PTHREADT_STOP   (pthread_t) -2
 
#define AST_RWLIST_APPEND_LIST   AST_LIST_APPEND_LIST
 
#define AST_RWLIST_EMPTY   AST_LIST_EMPTY
 
#define AST_RWLIST_ENTRY   AST_LIST_ENTRY
 
#define AST_RWLIST_FIRST   AST_LIST_FIRST
 
#define AST_RWLIST_HEAD(name, type)
 Defines a structure to be used to hold a read/write list of specified type. More...
 
#define AST_RWLIST_HEAD_DESTROY(head)
 Destroys an rwlist head structure. More...
 
#define AST_RWLIST_HEAD_INIT(head)
 Initializes an rwlist head structure. More...
 
#define AST_RWLIST_HEAD_INIT_VALUE
 Defines initial values for a declaration of AST_RWLIST_HEAD. More...
 
#define AST_RWLIST_HEAD_SET(head, entry)
 Initializes an rwlist head structure with a specified first entry. More...
 
#define AST_RWLIST_HEAD_STATIC(name, type)
 Defines a structure to be used to hold a read/write list of specified type, statically initialized. More...
 
#define AST_RWLIST_INSERT_AFTER   AST_LIST_INSERT_AFTER
 
#define AST_RWLIST_INSERT_BEFORE_CURRENT   AST_LIST_INSERT_BEFORE_CURRENT
 
#define AST_RWLIST_INSERT_HEAD   AST_LIST_INSERT_HEAD
 
#define AST_RWLIST_INSERT_TAIL   AST_LIST_INSERT_TAIL
 
#define AST_RWLIST_LAST   AST_LIST_LAST
 
#define AST_RWLIST_NEXT   AST_LIST_NEXT
 
#define AST_RWLIST_RDLOCK(head)   ast_rwlock_rdlock(&(head)->lock)
 Read locks a list. More...
 
#define AST_RWLIST_REMOVE   AST_LIST_REMOVE
 
#define AST_RWLIST_REMOVE_CURRENT   AST_LIST_REMOVE_CURRENT
 
#define AST_RWLIST_REMOVE_HEAD   AST_LIST_REMOVE_HEAD
 
#define AST_RWLIST_TRAVERSE   AST_LIST_TRAVERSE
 
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN   AST_LIST_TRAVERSE_SAFE_BEGIN
 
#define AST_RWLIST_TRAVERSE_SAFE_END   AST_LIST_TRAVERSE_SAFE_END
 
#define AST_RWLIST_UNLOCK(head)   ast_rwlock_unlock(&(head)->lock)
 Attempts to unlock a read/write based list. More...
 
#define AST_RWLIST_WRLOCK(head)   ast_rwlock_wrlock(&(head)->lock)
 Write locks a list. More...
 
#define AST_RWLOCK_DEFINE_STATIC(rwlock)   __AST_RWLOCK_DEFINE(static, rwlock)
 
#define AST_RWLOCK_INIT_VALUE   PTHREAD_RWLOCK_INITIALIZER
 
#define ast_set2_flag(p, value, flag)
 
#define ast_test_flag(p, flag)
 
#define ASTMM_LIBC   ASTMM_IGNORE
 
#define BACKGROUND_MATCHEXTEN   (1 << 2)
 
#define BACKGROUND_NOANSWER   (1 << 1)
 
#define BACKGROUND_PLAYBACK   (1 << 3)
 
#define BACKGROUND_SKIP   (1 << 0)
 
#define CB_INCR   250
 
#define COMMENT_END   "--;"
 
#define COMMENT_META   ';'
 
#define COMMENT_START   ";--"
 
#define COMMENT_TAG   '-'
 
#define DEBUG_M(a)
 
#define EVENTLOG   "event_log"
 
#define EXT_DATA_SIZE   8192
 
#define gethostbyname   __gethostbyname__is__not__reentrant__use__ast_gethostbyname__instead__
 
#define LOG_DEBUG   __LOG_DEBUG, _A_
 
#define LOG_DTMF   __LOG_DTMF, _A_
 
#define LOG_ERROR   __LOG_ERROR, _A_
 
#define LOG_EVENT   __LOG_EVENT, _A_
 
#define LOG_NOTICE   __LOG_NOTICE, _A_
 
#define LOG_VERBOSE   __LOG_VERBOSE, _A_
 
#define LOG_WARNING   __LOG_WARNING, _A_
 
#define MAX_INCLUDE_LEVEL   10
 
#define MAX_NESTED_COMMENTS   128
 
#define ONE_MILLION   1000000
 
#define PRIORITY_HINT   -1
 
#define pthread_cond_t   use_ast_cond_t_instead_of_pthread_cond_t
 
#define pthread_create   __use_ast_pthread_create_instead__
 
#define pthread_mutex_init   use_ast_mutex_init_instead_of_pthread_mutex_init
 
#define PTHREAD_MUTEX_INIT_VALUE   PTHREAD_MUTEX_INITIALIZER
 
#define pthread_mutex_t   use_ast_mutex_t_instead_of_pthread_mutex_t
 
#define QUEUELOG   "queue_log"
 
#define S_OR(a, b)   (!ast_strlen_zero(a) ? (a) : (b))
 
#define STATUS_NO_CONTEXT   1
 
#define STATUS_NO_EXTENSION   2
 
#define STATUS_NO_LABEL   4
 
#define STATUS_NO_PRIORITY   3
 
#define STATUS_SUCCESS   5
 
#define SWITCH_DATA_LENGTH   256
 
#define VAR_BUF_SIZE   4096
 
#define VAR_HARDTRAN   3
 
#define VAR_NORMAL   1
 
#define VAR_SOFTTRAN   2
 
#define VERBOSE_PREFIX_1   " "
 
#define VERBOSE_PREFIX_2   " == "
 
#define VERBOSE_PREFIX_3   " -- "
 
#define VERBOSE_PREFIX_4   " > "
 

Typedefs

typedef pthread_cond_t ast_cond_t
 
typedef pthread_mutex_t ast_mutex_t
 
typedef pthread_rwlock_t ast_rwlock_t
 
typedef int(* ast_state_cb_type) (char *context, char *id, enum ast_extension_states state, void *data)
 
typedef int() ast_switch_f(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
 
typedef struct ast_configconfig_load_func(const char *database, const char *table, const char *configfile, struct ast_config *config, int withcomments, const char *suggested_include_file)
 
typedef struct ast_configrealtime_multi_get(const char *database, const char *table, va_list ap)
 
typedef int realtime_update(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap)
 
typedef struct ast_variablerealtime_var_get(const char *database, const char *table, va_list ap)
 

Enumerations

enum  ast_extension_states {
  AST_EXTENSION_REMOVED = -2, AST_EXTENSION_DEACTIVATED = -1, AST_EXTENSION_NOT_INUSE = 0, AST_EXTENSION_INUSE = 1 << 0,
  AST_EXTENSION_BUSY = 1 << 1, AST_EXTENSION_UNAVAILABLE = 1 << 2, AST_EXTENSION_RINGING = 1 << 3, AST_EXTENSION_ONHOLD = 1 << 4,
  AST_EXTENSION_REMOVED = -2, AST_EXTENSION_DEACTIVATED = -1, AST_EXTENSION_NOT_INUSE = 0, AST_EXTENSION_INUSE = 1 << 0,
  AST_EXTENSION_BUSY = 1 << 1, AST_EXTENSION_UNAVAILABLE = 1 << 2, AST_EXTENSION_RINGING = 1 << 3, AST_EXTENSION_ONHOLD = 1 << 4
}
 
enum  ast_option_flags {
  AST_OPT_FLAG_EXEC_INCLUDES = (1 << 0), AST_OPT_FLAG_NO_FORK = (1 << 1), AST_OPT_FLAG_QUIET = (1 << 2), AST_OPT_FLAG_CONSOLE = (1 << 3),
  AST_OPT_FLAG_HIGH_PRIORITY = (1 << 4), AST_OPT_FLAG_INIT_KEYS = (1 << 5), AST_OPT_FLAG_REMOTE = (1 << 6), AST_OPT_FLAG_EXEC = (1 << 7),
  AST_OPT_FLAG_NO_COLOR = (1 << 8), AST_OPT_FLAG_FULLY_BOOTED = (1 << 9), AST_OPT_FLAG_TRANSCODE_VIA_SLIN = (1 << 10), AST_OPT_FLAG_STDEXTEN_MACRO = (1 << 11),
  AST_OPT_FLAG_DUMP_CORE = (1 << 12), AST_OPT_FLAG_CACHE_RECORD_FILES = (1 << 13), AST_OPT_FLAG_TIMESTAMP = (1 << 14), AST_OPT_FLAG_CACHE_MEDIA_FRAMES = (1 << 15),
  AST_OPT_FLAG_RECONNECT = (1 << 16), AST_OPT_FLAG_TRANSMIT_SILENCE = (1 << 17), AST_OPT_FLAG_DONT_WARN = (1 << 18), AST_OPT_FLAG_REF_DEBUG = (1 << 20),
  AST_OPT_FLAG_ALWAYS_FORK = (1 << 21), AST_OPT_FLAG_MUTE = (1 << 22), AST_OPT_FLAG_DEBUG_MODULE = (1 << 23), AST_OPT_FLAG_TRACE_MODULE = (1 << 24),
  AST_OPT_FLAG_LIGHT_BACKGROUND = (1 << 25), AST_OPT_FLAG_HIDE_MESSAGING_AMI_EVENTS = (1 << 26), AST_OPT_FLAG_FORCE_BLACK_BACKGROUND = (1 << 27), AST_OPT_FLAG_HIDE_CONSOLE_CONNECT = (1 << 28),
  AST_OPT_FLAG_LOCK_CONFIG_DIR = (1 << 29), AST_OPT_FLAG_GENERIC_PLC = (1 << 30), AST_OPT_FLAG_GENERIC_PLC_ON_EQUAL_CODECS = (1 << 31), AST_OPT_FLAG_EXEC_INCLUDES = (1 << 0),
  AST_OPT_FLAG_NO_FORK = (1 << 1), AST_OPT_FLAG_QUIET = (1 << 2), AST_OPT_FLAG_CONSOLE = (1 << 3), AST_OPT_FLAG_HIGH_PRIORITY = (1 << 4),
  AST_OPT_FLAG_INIT_KEYS = (1 << 5), AST_OPT_FLAG_REMOTE = (1 << 6), AST_OPT_FLAG_EXEC = (1 << 7), AST_OPT_FLAG_NO_COLOR = (1 << 8),
  AST_OPT_FLAG_FULLY_BOOTED = (1 << 9), AST_OPT_FLAG_TRANSCODE_VIA_SLIN = (1 << 10), AST_OPT_FLAG_DUMP_CORE = (1 << 12), AST_OPT_FLAG_CACHE_RECORD_FILES = (1 << 13),
  AST_OPT_FLAG_TIMESTAMP = (1 << 14), AST_OPT_FLAG_OVERRIDE_CONFIG = (1 << 15), AST_OPT_FLAG_RECONNECT = (1 << 16), AST_OPT_FLAG_TRANSMIT_SILENCE = (1 << 17),
  AST_OPT_FLAG_DONT_WARN = (1 << 18), AST_OPT_FLAG_ALWAYS_FORK = (1 << 21), AST_OPT_FLAG_MUTE = (1 << 22), AST_OPT_FLAG_DEBUG_FILE = (1 << 23),
  AST_OPT_FLAG_LIGHT_BACKGROUND = (1 << 25), AST_OPT_FLAG_FORCE_BLACK_BACKGROUND = (1 << 27)
}
 

Functions

static struct ast_context__ast_context_create (struct ast_context **extcontexts, const char *name, const char *registrar, int existsokay)
 
static void __ast_context_destroy (struct ast_context *con, const char *registrar)
 
static int _extension_match_core (const char *pattern, const char *data, enum ext_match_t mode)
 
static void _null_sig_handler (int sig)
 NULL handler so we can collect the child exit status. More...
 
static int add_pri (struct ast_context *con, struct ast_exten *tmp, struct ast_exten *el, struct ast_exten *e, int replace)
 add the extension in the priority chain. returns 0 on success, -1 on failure More...
 
static struct ast_commentALLOC_COMMENT (const char *buffer)
 
static int ast_add_extension2 (struct ast_context *con, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
 Main interface to add extensions to the list for out context. More...
 
static int ast_add_hint (struct ast_exten *e)
 ast_add_hint: Add hint to hint list, check initial extension state More...
 
static unsigned int ast_app_separate_args (char *buf, char delim, char **array, int arraylen)
 
int ast_atomic_dec_and_test (volatile int *p)
 decrement *p by 1 and return true if the variable has reached 0. Useful e.g. to check if a refcount has reached 0. More...
 
int ast_atomic_fetchadd_int (volatile int *p, int v)
 Atomically add v to *p and return * the previous value of *p. This can be used to handle reference counts, and the return value can be used to generate unique identifiers. More...
 
int ast_build_timing (struct ast_timing *i, const char *info_in)
 Construct a timing bitmap, for use in time-based conditionals. More...
 
static void ast_category_append (struct ast_config *config, struct ast_category *category)
 
static char * ast_category_browse (struct ast_config *config, const char *prev)
 
static void ast_category_destroy (struct ast_category *cat)
 
static struct ast_categoryast_category_get (const struct ast_config *config, const char *category_name)
 
static struct ast_categoryast_category_new (const char *name, const char *in_file, int lineno)
 
static int ast_change_hint (struct ast_exten *oe, struct ast_exten *ne)
 ast_change_hint: Change hint for an extension More...
 
int ast_check_timing (const struct ast_timing *i)
 Evaluate a pre-constructed bitmap as to whether the current time falls within the range specified. More...
 
static void ast_config_destroy (struct ast_config *cfg)
 
struct ast_categoryast_config_get_current_category (const struct ast_config *cfg)
 Retrieve the current category name being built. More...
 
static struct ast_configast_config_internal_load (const char *filename, struct ast_config *cfg, int withcomments, const char *suggested_incl_file)
 
static struct ast_configast_config_new (void)
 
void ast_config_set_current_category (struct ast_config *cfg, const struct ast_category *cat)
 Set the category within the configuration as being current. More...
 
void ast_console_puts (const char *string)
 write the string to the root console, and all attached network console clients More...
 
static int ast_context_add_ignorepat2 (struct ast_context *con, const char *value, const char *registrar)
 
static int ast_context_add_include2 (struct ast_context *con, const char *value, const char *registrar)
 
static int ast_context_add_switch2 (struct ast_context *con, const char *value, const char *data, int eval, const char *registrar)
 
static struct ast_contextast_context_find (const char *name)
 
static struct ast_contextast_context_find_or_create (struct ast_context **extcontexts, void *tab, const char *name, const char *registrar)
 
int ast_context_ignorepats_count (struct ast_context *con)
 
int ast_context_includes_count (struct ast_context *con)
 
int ast_context_switches_count (struct ast_context *con)
 
static int ast_context_verify_includes (struct ast_context *con)
 
void ast_copy_string (char *dst, const char *src, size_t size)
 
static int ast_extension_match (const char *pattern, const char *data)
 
static int ast_findlabel_extension2 (struct ast_channel *c, struct ast_context *con, const char *exten, const char *label, const char *callerid)
 
static int ast_func_read (struct ast_channel *chan, const char *function, char *workspace, size_t len)
 
static int ast_func_write (struct ast_channel *chan, const char *function, const char *value)
 
static const char * ast_get_context_name (struct ast_context *con)
 
static const char * ast_get_extension_app (struct ast_exten *e)
 
static const char * ast_get_extension_name (struct ast_exten *exten)
 
static struct ast_config_includeast_include_find (struct ast_config *conf, const char *included_file)
 
static struct ast_config_includeast_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)
 
static void ast_includes_destroy (struct ast_config_include *incls)
 
static void ast_log (int level, const char *file, int line, const char *function, const char *fmt,...)
 
void ast_log_backtrace (void)
 Log a backtrace of the current thread's execution stack to the Asterisk log. More...
 
void ast_mark_lock_failed (void *lock_addr)
 Mark the last lock as failed (trylock) More...
 
static void ast_merge_contexts_and_delete (struct ast_context **extcontexts, const char *registrar)
 
static int ast_mutex_init (ast_mutex_t *pmutex)
 
static char * ast_process_quotes_and_slashes (char *start, char find, char replace_with)
 
void ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
 
static int ast_remove_hint (struct ast_exten *e)
 ast_remove_hint: Remove hint from extension More...
 
void ast_replace_sigchld (void)
 Replace the SIGCHLD handler. More...
 
static int ast_rwlock_destroy (ast_rwlock_t *prwlock)
 
static int ast_rwlock_init (ast_rwlock_t *prwlock)
 
static int ast_rwlock_rdlock (ast_rwlock_t *prwlock)
 
static int ast_rwlock_unlock (ast_rwlock_t *prwlock)
 
static int ast_rwlock_wrlock (ast_rwlock_t *prwlock)
 
int ast_safe_system (const char *s)
 Safely spawn an OS shell command while closing file descriptors. More...
 
static void ast_shrink_phone_number (char *n)
 Clean up phone string remove '(', ' ', ')', non-trailing '.', and '-' not in square brackets. Basically, remove anything that could be invalid in a pattern. More...
 
char * ast_skip_blanks (const char *str)
 
char * ast_strip (char *s)
 Strip leading/trailing whitespace from a string. More...
 
static force_inline int ast_strlen_zero (const char *s)
 
char * ast_trim_blanks (char *str)
 Trims trailing whitespace characters from a string. More...
 
static int ast_true (const char *s)
 
struct timeval ast_tvadd (struct timeval a, struct timeval b)
 Returns the sum of two timevals a + b. More...
 
struct timeval ast_tvnow (void)
 
struct timeval ast_tvsub (struct timeval a, struct timeval b)
 Returns the difference of two timevals a - b. More...
 
static int ast_unlock_context (struct ast_context *con)
 
static int ast_unlock_contexts (void)
 
void ast_unreplace_sigchld (void)
 Restore the SIGCHLD handler. More...
 
static struct ast_var_tast_var_assign (const char *name, const char *value)
 
static void ast_var_delete (struct ast_var_t *var)
 
static const char * ast_var_name (const struct ast_var_t *var)
 
static const char * ast_var_value (const struct ast_var_t *var)
 
static void ast_variable_append (struct ast_category *category, struct ast_variable *variable)
 
static struct ast_variableast_variable_browse (const struct ast_config *config, const char *category)
 
static struct ast_variableast_variable_new (const char *name, const char *value, const char *filename)
 
static const char * ast_variable_retrieve (const struct ast_config *config, const char *category, const char *variable)
 
static void ast_variables_destroy (struct ast_variable *v)
 
void ast_verbose (const char *fmt,...)
 
static struct ast_extenast_walk_context_extensions (struct ast_context *con, struct ast_exten *exten)
 
static struct ast_ignorepatast_walk_context_ignorepats (struct ast_context *con, struct ast_ignorepat *ip)
 
static struct ast_includeast_walk_context_includes (struct ast_context *con, struct ast_include *inc)
 
static struct ast_swast_walk_context_switches (struct ast_context *con, struct ast_sw *sw)
 
static struct ast_contextast_walk_contexts (struct ast_context *con)
 
static struct ast_extenast_walk_extension_priorities (struct ast_exten *exten, struct ast_exten *priority)
 
static int ast_wrlock_context (struct ast_context *con)
 
static int ast_wrlock_contexts (void)
 
static struct ast_categorycategory_get (const struct ast_config *config, const char *category_name, int ignored)
 
static void CB_ADD (char *str)
 
static void CB_ADD_LEN (char *str, int len)
 
static void CB_INIT (void)
 
static void CB_RESET (void)
 
static struct ast_configconfig_text_file_load (const char *database, const char *table, const char *filename, struct ast_config *cfg, int withcomments, const char *suggested_include_file)
 
static void destroy_exten (struct ast_exten *e)
 
static int ext_cmp (const char *a, const char *b)
 the full routine to compare extensions in rules. More...
 
static int ext_cmp1 (const char **p)
 helper functions to sort extensions and patterns in the desired way, so that more specific patterns appear first. More...
 
static int ext_strncpy (char *dst, const char *src, int len)
 copy a string skipping whitespace More...
 
static int extension_match_core (const char *pattern, const char *data, enum ext_match_t mode)
 
static struct ast_config_enginefind_engine (const char *family, char *database, int dbsiz, char *table, int tabsiz)
 Find realtime engine for realtime family. More...
 
static void gen_header (FILE *f1, const char *configfile, const char *fn, const char *generator)
 
static unsigned get_range (char *src, int max, char *const names[], const char *msg)
 helper function to return a range up to max (7, 12, 31 respectively). names, if supplied, is an array of names that should be mapped to numbers. More...
 
static void get_timerange (struct ast_timing *i, char *times)
 store a bitmask of valid times, one bit each 2 minute More...
 
static int include_valid (struct ast_include *i)
 
static void inherit_category (struct ast_category *new, const struct ast_category *base)
 
static void LLB_ADD (char *str)
 
int localized_add_extension2 (struct ast_context *con, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
 
void localized_ast_include_rename (struct ast_config *conf, const char *from_file, const char *to_file)
 
struct ast_categorylocalized_category_get (const struct ast_config *config, const char *category_name)
 
struct ast_configlocalized_config_load (const char *filename)
 
struct ast_configlocalized_config_load_with_comments (const char *filename)
 
int localized_config_text_file_save (const char *configfile, const struct ast_config *cfg, const char *generator)
 
int localized_context_add_ignorepat2 (struct ast_context *con, const char *value, const char *registrar)
 
int localized_context_add_include2 (struct ast_context *con, const char *value, const char *registrar)
 
int localized_context_add_switch2 (struct ast_context *con, const char *value, const char *data, int eval, const char *registrar)
 
void localized_context_destroy (struct ast_context *con, const char *registrar)
 
struct ast_contextlocalized_context_find_or_create (struct ast_context **extcontexts, void *tab, const char *name, const char *registrar)
 
int localized_context_verify_includes (struct ast_context *con)
 
struct ast_extenlocalized_find_extension (struct ast_context *bypass, struct pbx_find_info *q, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
 
void localized_merge_contexts_and_delete (struct ast_context **extcontexts, void *tab, const char *registrar)
 
int localized_pbx_builtin_setvar (struct ast_channel *chan, const void *data)
 
int localized_pbx_load_module (void)
 
void localized_use_conf_dir (void)
 
void localized_use_local_dir (void)
 
struct ast_extenlocalized_walk_context_extensions (struct ast_context *con, struct ast_exten *exten)
 
struct ast_includelocalized_walk_context_includes (struct ast_context *con, struct ast_include *inc)
 
struct ast_swlocalized_walk_context_switches (struct ast_context *con, struct ast_sw *sw)
 
struct ast_contextlocalized_walk_contexts (struct ast_context *con)
 
struct ast_extenlocalized_walk_extension_priorities (struct ast_exten *exten, struct ast_exten *priority)
 
static int lookup_name (const char *s, char *const names[], int max)
 Helper for get_range. return the index of the matching entry, starting from 1. If names is not supplied, try numeric values. More...
 
static int matchcid (const char *cidpattern, const char *callerid)
 
static void move_variables (struct ast_category *old, struct ast_category *new)
 
static struct ast_categorynext_available_category (struct ast_category *cat)
 
static void null_datad (void *foo)
 
static int parse_variable_name (char *var, int *offset, int *length, int *isfunc)
 extract offset:length from variable name. Returns 1 if there is a offset:length part, which is trimmed off (values go into variables) More...
 
static int pbx_builtin_setvar (struct ast_channel *chan, const void *data)
 
static void pbx_builtin_setvar_helper (struct ast_channel *chan, const char *name, const char *value)
 
static int pbx_extension_helper (struct ast_channel *c, struct ast_context *con, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
 The return value depends on the action: More...
 
static struct ast_extenpbx_find_extension (struct ast_channel *chan, struct ast_context *bypass, struct pbx_find_info *q, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
 
static int pbx_load_config (const char *config_file)
 
static void pbx_retrieve_variable (struct ast_channel *c, const char *var, char **ret, char *workspace, int workspacelen, struct varshead *headp)
 Support for Asterisk built-in variables in the dialplan. More...
 
static void pbx_substitute_variables_helper (struct ast_channel *c, const char *cp1, char *cp2, int count)
 
static void pbx_substitute_variables_helper_full (struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int count)
 
static int process_text_line (struct ast_config *cfg, struct ast_category **cat, char *buf, int lineno, const char *configfile, int withcomments, const char *suggested_include_file)
 
static void set_fn (char *fn, int fn_size, const char *file, const char *configfile)
 
static char * substring (const char *value, int offset, int length, char *workspace, size_t workspace_len)
 takes a substring. It is ok to call with value == workspace. More...
 
static struct timeval tvfix (struct timeval a)
 
static struct ast_variablevariable_clone (const struct ast_variable *old)
 

Variables

char ast_defaultlanguage []
 
int ast_language_is_prefix
 The following variable controls the layout of localized sound files. If 0, use the historical layout with prefix just before the filename (i.e. digits/en/1.gsm , digits/it/1.gsm or default to digits/1.gsm), if 1 put the prefix at the beginning of the filename (i.e. en/digits/1.gsm, it/digits/1.gsm or default to digits/1.gsm). The latter permits a language to be entirely in one directory. More...
 
pid_t ast_mainpid
 
int ast_option_maxcalls
 
double ast_option_maxload
 
struct ast_flags ast_options = { AST_DEFAULT_OPTIONS }
 
static int autofallthrough_config = 0
 
static int clearglobalvars_config = 0
 
static char * comment_buffer
 
static int comment_buffer_size
 
static struct ast_config_engineconfig_engine_list
 
static char * config_filename = "extensions.conf"
 
static struct ast_config_mapconfig_maps = NULL
 
static ast_rwlock_t conlock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} }
 
static struct ast_contextcontexts = NULL
 
char * days []
 
char debug_filename [AST_FILENAME_MAX]
 
static char * extconfig_conf = "extconfig.conf"
 
static char * global_registrar = "conf2ael"
 
static struct varshead globals = AST_LIST_HEAD_NOLOCK_INIT_VALUE
 
static ast_rwlock_t globalslock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} }
 
static struct hints hints = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
 
static char * lline_buffer
 
static int lline_buffer_size
 
static struct ast_contextlocal_contexts = NULL
 
char * months []
 
static struct sigaction null_sig_handler
 
int option_debug
 
int option_verbose
 
char record_cache_dir [AST_CACHE_DIR_LEN]
 
static unsigned int safe_system_level = 0
 Keep track of how many threads are currently trying to wait*() on a child process. More...
 
static struct sigaction safe_system_prev_handler
 
static int static_config = 0
 
static struct ast_config_engine text_file_engine
 
static int use_local_dir = 1
 
static char userscontext [AST_MAX_EXTENSION] = "default"
 
static int write_protect_config = 1
 

Detailed Description

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.

Definition in file extconf.c.

Macro Definition Documentation

◆ __AST_MUTEX_DEFINE

#define __AST_MUTEX_DEFINE (   scope,
  mutex 
)    scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE

Definition at line 496 of file extconf.c.

◆ __AST_RWLOCK_DEFINE

#define __AST_RWLOCK_DEFINE (   scope,
  rwlock 
)    scope ast_rwlock_t rwlock = AST_RWLOCK_INIT_VALUE

Definition at line 564 of file extconf.c.

◆ __LOG_DEBUG

#define __LOG_DEBUG   0

Definition at line 120 of file extconf.c.

◆ __LOG_DTMF

#define __LOG_DTMF   6

Definition at line 156 of file extconf.c.

◆ __LOG_ERROR

#define __LOG_ERROR   4

Definition at line 144 of file extconf.c.

◆ __LOG_EVENT

#define __LOG_EVENT   1

Definition at line 126 of file extconf.c.

◆ __LOG_NOTICE

#define __LOG_NOTICE   2

Definition at line 132 of file extconf.c.

◆ __LOG_VERBOSE

#define __LOG_VERBOSE   5

Definition at line 150 of file extconf.c.

◆ __LOG_WARNING

#define __LOG_WARNING   3

Definition at line 138 of file extconf.c.

◆ __MTX_PROF

#define __MTX_PROF (   a)    return pthread_mutex_lock((a))

Definition at line 163 of file extconf.c.

◆ _A_

#define _A_   __FILE__, __LINE__, __PRETTY_FUNCTION__

Definition at line 115 of file extconf.c.

◆ _ASTERISK_LOCK_H

#define _ASTERISK_LOCK_H   /* A small indication that this is horribly wrong. */

Definition at line 160 of file extconf.c.

◆ AST_API_MODULE

#define AST_API_MODULE   1 /* gimme the inline defs! */

Definition at line 78 of file extconf.c.

◆ AST_CACHE_DIR_LEN

#define AST_CACHE_DIR_LEN   512

Definition at line 1359 of file extconf.c.

◆ AST_DEFAULT_OPTIONS

#define AST_DEFAULT_OPTIONS   AST_OPT_FLAG_TRANSCODE_VIA_SLIN

These are the options that set by default when Asterisk starts

Definition at line 1363 of file extconf.c.

◆ AST_FILENAME_MAX

#define AST_FILENAME_MAX   80

Definition at line 1360 of file extconf.c.

◆ ast_fully_booted

#define ast_fully_booted   ast_test_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED)

Definition at line 1376 of file extconf.c.

◆ AST_LIST_APPEND_LIST

#define AST_LIST_APPEND_LIST (   head,
  list,
  field 
)

Appends a whole list to the tail of a list.

Parameters
headThis is a pointer to the list head structure
listThis is a pointer to the list to be appended.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

Definition at line 1996 of file extconf.c.

◆ AST_LIST_EMPTY

#define AST_LIST_EMPTY (   head)    (AST_LIST_FIRST(head) == NULL)

Checks whether the specified list contains any entries.

Parameters
headThis is a pointer to the list head structure

Returns non-zero if the list has entries, zero if not.

Definition at line 1734 of file extconf.c.

◆ AST_LIST_ENTRY

#define AST_LIST_ENTRY (   type)
Value:
struct { \
struct type *next; \
}
static const char type[]
Definition: chan_ooh323.c:109
struct ast_frame * next

Declare a forward link structure inside a list entry.

Parameters
typeThis is the type of each list entry.

This macro declares a structure to be used to link list entries together. It must be used inside the definition of the structure named in type, as follows:

struct list_entry {
...
AST_LIST_ENTRY(list_entry) list;
}

The field name list here is arbitrary, and can be anything you wish.

Definition at line 1695 of file extconf.c.

◆ AST_LIST_FIRST

#define AST_LIST_FIRST (   head)    ((head)->first)

Returns the first entry contained in a list.

Parameters
headThis is a pointer to the list head structure

Definition at line 1706 of file extconf.c.

Referenced by ast_walk_context_switches().

◆ AST_LIST_HEAD

#define AST_LIST_HEAD (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
ast_mutex_t lock; \
}
static const char type[]
Definition: chan_ooh323.c:109
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
static const char name[]
Definition: cdr_mysql.c:74

Defines a structure to be used to hold a list of specified type.

Parameters
nameThis will be the name of the defined structure.
typeThis is the type of each list entry.

This macro creates a structure definition that can be used to hold a list of the entries of type type. It does not actually declare (allocate) a structure; to do that, either follow this macro with the desired name of the instance you wish to declare, or use the specified name to declare instances elsewhere.

Example usage:

static AST_LIST_HEAD(entry_list, entry) entries;

This would define struct entry_list, and declare an instance of it named entries, all intended to hold a list of type struct entry.

Definition at line 1458 of file extconf.c.

◆ AST_LIST_HEAD_INIT

#define AST_LIST_HEAD_INIT (   head)
Value:
{ \
(head)->first = NULL; \
(head)->last = NULL; \
ast_mutex_init(&(head)->lock); \
}
#define NULL
Definition: resample.c:96
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092

Initializes a list head structure.

Parameters
headThis is a pointer to the list head structure

This macro initializes a list head structure by setting the head entry to NULL (empty list) and recreating the embedded lock.

Definition at line 1886 of file extconf.c.

◆ AST_LIST_HEAD_INIT_NOLOCK

#define AST_LIST_HEAD_INIT_NOLOCK (   head)
Value:
{ \
(head)->first = NULL; \
(head)->last = NULL; \
}
#define NULL
Definition: resample.c:96
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092

Initializes a list head structure.

Parameters
headThis is a pointer to the list head structure

This macro initializes a list head structure by setting the head entry to NULL (empty list). There is no embedded lock handling with this macro.

Definition at line 1927 of file extconf.c.

◆ AST_LIST_HEAD_INIT_VALUE

#define AST_LIST_HEAD_INIT_VALUE
Value:
{ \
.first = NULL, \
.last = NULL, \
}
#define NULL
Definition: resample.c:96
#define AST_MUTEX_INIT_VALUE
Definition: extconf.c:467

Defines initial values for a declaration of AST_LIST_HEAD.

Definition at line 1519 of file extconf.c.

◆ AST_LIST_HEAD_NOLOCK

#define AST_LIST_HEAD_NOLOCK (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
}
static const char type[]
Definition: chan_ooh323.c:109
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
static const char name[]
Definition: cdr_mysql.c:74

Defines a structure to be used to hold a list of specified type (with no lock).

Parameters
nameThis will be the name of the defined structure.
typeThis is the type of each list entry.

This macro creates a structure definition that can be used to hold a list of the entries of type type. It does not actually declare (allocate) a structure; to do that, either follow this macro with the desired name of the instance you wish to declare, or use the specified name to declare instances elsewhere.

Example usage:

This would define struct entry_list, and declare an instance of it named entries, all intended to hold a list of type struct entry.

Definition at line 1510 of file extconf.c.

◆ AST_LIST_HEAD_NOLOCK_INIT_VALUE

#define AST_LIST_HEAD_NOLOCK_INIT_VALUE
Value:
{ \
.first = NULL, \
.last = NULL, \
}
#define NULL
Definition: resample.c:96

Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK.

Definition at line 1537 of file extconf.c.

◆ AST_LIST_HEAD_NOLOCK_STATIC

#define AST_LIST_HEAD_NOLOCK_STATIC (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
static const char type[]
Definition: chan_ooh323.c:109
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
static const char name[]
Definition: cdr_mysql.c:74
#define AST_LIST_HEAD_NOLOCK_INIT_VALUE
Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK.
Definition: extconf.c:1537

Defines a structure to be used to hold a list of specified type, statically initialized.

This is the same as AST_LIST_HEAD_STATIC, except without the lock included.

Definition at line 1631 of file extconf.c.

◆ AST_LIST_HEAD_SET

#define AST_LIST_HEAD_SET (   head,
  entry 
)
Value:
do { \
(head)->first = (entry); \
(head)->last = (entry); \
ast_mutex_init(&(head)->lock); \
} while (0)
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
Definition: search.h:40

Initializes a list head structure with a specified first entry.

Parameters
headThis is a pointer to the list head structure
entrypointer to the list entry that will become the head of the list

This macro initializes a list head structure by setting the head entry to the supplied value and recreating the embedded lock.

Definition at line 1645 of file extconf.c.

◆ AST_LIST_HEAD_SET_NOLOCK

#define AST_LIST_HEAD_SET_NOLOCK (   head,
  entry 
)
Value:
do { \
(head)->first = (entry); \
(head)->last = (entry); \
} while (0)
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
Definition: search.h:40

Initializes a list head structure with a specified first entry.

Parameters
headThis is a pointer to the list head structure
entrypointer to the list entry that will become the head of the list

This macro initializes a list head structure by setting the head entry to the supplied value.

Definition at line 1673 of file extconf.c.

◆ AST_LIST_HEAD_STATIC

#define AST_LIST_HEAD_STATIC (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
ast_mutex_t lock; \
static const char type[]
Definition: chan_ooh323.c:109
#define AST_LIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_LIST_HEAD.
Definition: extconf.c:1519
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
static const char name[]
Definition: cdr_mysql.c:74

Defines a structure to be used to hold a list of specified type, statically initialized.

Parameters
nameThis will be the name of the defined structure.
typeThis is the type of each list entry.

This macro creates a structure definition that can be used to hold a list of the entries of type type, and allocates an instance of it, initialized to be empty.

Example usage:

This would define struct entry_list, intended to hold a list of type struct entry.

Definition at line 1576 of file extconf.c.

◆ AST_LIST_INSERT_AFTER

#define AST_LIST_INSERT_AFTER (   head,
  listelm,
  elm,
  field 
)

Inserts a list entry after a given entry.

Parameters
headThis is a pointer to the list head structure
listelmThis is a pointer to the entry after which the new entry should be inserted.
elmThis is a pointer to the entry to be inserted.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

Definition at line 1941 of file extconf.c.

◆ AST_LIST_INSERT_BEFORE_CURRENT

#define AST_LIST_INSERT_BEFORE_CURRENT (   head,
  elm,
  field 
)

Inserts a list entry before the current entry during a traversal.

Parameters
headThis is a pointer to the list head structure
elmThis is a pointer to the entry to be inserted.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.
Note
This macro can only be used inside an AST_LIST_TRAVERSE_SAFE_BEGIN() block.

Definition at line 1859 of file extconf.c.

◆ AST_LIST_INSERT_HEAD

#define AST_LIST_INSERT_HEAD (   head,
  elm,
  field 
)

Inserts a list entry at the head of a list.

Parameters
headThis is a pointer to the list head structure
elmThis is a pointer to the entry to be inserted.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

Definition at line 1957 of file extconf.c.

Referenced by pbx_builtin_setvar_helper().

◆ AST_LIST_INSERT_TAIL

#define AST_LIST_INSERT_TAIL (   head,
  elm,
  field 
)

Appends a list entry to the tail of a list.

Parameters
headThis is a pointer to the list head structure
elmThis is a pointer to the entry to be appended.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

Note: The link field in the appended entry is not modified, so if it is actually the head of a list itself, the entire list will be appended temporarily (until the next AST_LIST_INSERT_TAIL is performed).

Definition at line 1977 of file extconf.c.

Referenced by ast_context_add_switch2().

◆ AST_LIST_LAST

#define AST_LIST_LAST (   head)    ((head)->last)

Returns the last entry contained in a list.

Parameters
headThis is a pointer to the list head structure

Definition at line 1714 of file extconf.c.

◆ AST_LIST_NEXT

#define AST_LIST_NEXT (   elm,
  field 
)    ((elm)->field.next)

Returns the next entry in the list after the given entry.

Parameters
elmThis is a pointer to the current entry.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

Definition at line 1724 of file extconf.c.

Referenced by ast_walk_context_switches().

◆ AST_LIST_REMOVE

#define AST_LIST_REMOVE (   head,
  elm,
  field 
)

Removes a specific entry from a list.

Parameters
headThis is a pointer to the list head structure
elmThis is a pointer to the entry to be removed.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.
Warning
The removed entry is not freed nor modified in any way.

Definition at line 2038 of file extconf.c.

Referenced by pbx_builtin_setvar_helper().

◆ AST_LIST_REMOVE_CURRENT

#define AST_LIST_REMOVE_CURRENT (   head,
  field 
)

Removes the current entry from a list during a traversal.

Parameters
headThis is a pointer to the list head structure
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.
Note
This macro can only be used inside an AST_LIST_TRAVERSE_SAFE_BEGIN() block; it is used to unlink the current entry from the list without affecting the list traversal (and without having to re-traverse the list to modify the previous entry, if any).

Definition at line 1837 of file extconf.c.

◆ AST_LIST_REMOVE_HEAD

#define AST_LIST_REMOVE_HEAD (   head,
  field 
)

Removes and returns the head entry from a list.

Parameters
headThis is a pointer to the list head structure
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

Removes the head entry from the list, and returns a pointer to it. This macro is safe to call on an empty list.

Definition at line 2017 of file extconf.c.

Referenced by __ast_context_destroy().

◆ AST_LIST_TRAVERSE

#define AST_LIST_TRAVERSE (   head,
  var,
  field 
)    for((var) = (head)->first; (var); (var) = (var)->field.next)

Loops over (traverses) the entries in a list.

Parameters
headThis is a pointer to the list head structure
varThis is the name of the variable that will hold a pointer to the current list entry on each iteration. It must be declared before calling this macro.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

This macro is use to loop over (traverse) the entries in a list. It uses a for loop, and supplies the enclosed code with a pointer to each list entry as it loops. It is typically used as follows:

static AST_LIST_HEAD(entry_list, list_entry) entries;
...
struct list_entry {
...
AST_LIST_ENTRY(list_entry) list;
}
...
struct list_entry *current;
...
AST_LIST_TRAVERSE(&entries, current, list) {
(do something with current here)
}
Warning
If you modify the forward-link pointer contained in the current entry while inside the loop, the behavior will be unpredictable. At a minimum, the following macros will modify the forward-link pointer, and should not be used inside AST_LIST_TRAVERSE() against the entry pointed to by the current pointer without careful consideration of their consequences:

Definition at line 1774 of file extconf.c.

Referenced by ast_context_add_switch2(), pbx_builtin_setvar_helper(), pbx_find_extension(), and pbx_retrieve_variable().

◆ AST_LIST_TRAVERSE_SAFE_BEGIN

#define AST_LIST_TRAVERSE_SAFE_BEGIN (   head,
  var,
  field 
)

Loops safely over (traverses) the entries in a list.

Parameters
headThis is a pointer to the list head structure
varThis is the name of the variable that will hold a pointer to the current list entry on each iteration. It must be declared before calling this macro.
fieldThis is the name of the field (declared using AST_LIST_ENTRY()) used to link entries of this list together.

This macro is used to safely loop over (traverse) the entries in a list. It uses a for loop, and supplies the enclosed code with a pointer to each list entry as it loops. It is typically used as follows:

static AST_LIST_HEAD(entry_list, list_entry) entries;
...
struct list_entry {
...
AST_LIST_ENTRY(list_entry) list;
}
...
struct list_entry *current;
...
AST_LIST_TRAVERSE_SAFE_BEGIN(&entries, current, list) {
(do something with current here)
}

It differs from AST_LIST_TRAVERSE() in that the code inside the loop can modify (or even free, after calling AST_LIST_REMOVE_CURRENT()) the entry pointed to by the current pointer without affecting the loop traversal.

Definition at line 1812 of file extconf.c.

◆ AST_LIST_TRAVERSE_SAFE_END

#define AST_LIST_TRAVERSE_SAFE_END   }

Closes a safe loop traversal block.

Definition at line 1875 of file extconf.c.

◆ AST_MAX_EXTENSION

#define AST_MAX_EXTENSION   80

Max length of an extension

Definition at line 2079 of file extconf.c.

◆ AST_MUTEX_DEFINE_STATIC

#define AST_MUTEX_DEFINE_STATIC (   mutex)    __AST_MUTEX_DEFINE(static, mutex)

Definition at line 504 of file extconf.c.

◆ AST_MUTEX_INIT_VALUE

#define AST_MUTEX_INIT_VALUE   ((ast_mutex_t) PTHREAD_MUTEX_INIT_VALUE)

Definition at line 467 of file extconf.c.

◆ AST_MUTEX_INITIALIZER

#define AST_MUTEX_INITIALIZER   __use_AST_MUTEX_DEFINE_STATIC_rather_than_AST_MUTEX_INITIALIZER__

Definition at line 506 of file extconf.c.

◆ AST_MUTEX_KIND

#define AST_MUTEX_KIND   PTHREAD_MUTEX_RECURSIVE

Definition at line 194 of file extconf.c.

Referenced by ast_mutex_init().

◆ ast_opt_always_fork

#define ast_opt_always_fork   ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)

Definition at line 1386 of file extconf.c.

◆ ast_opt_cache_record_files

#define ast_opt_cache_record_files   ast_test_flag(&ast_options, AST_OPT_FLAG_CACHE_RECORD_FILES)

Definition at line 1380 of file extconf.c.

◆ ast_opt_console

#define ast_opt_console   ast_test_flag(&ast_options, AST_OPT_FLAG_CONSOLE)

Definition at line 1370 of file extconf.c.

◆ ast_opt_dont_warn

#define ast_opt_dont_warn   ast_test_flag(&ast_options, AST_OPT_FLAG_DONT_WARN)

Definition at line 1385 of file extconf.c.

Referenced by pbx_load_config().

◆ ast_opt_dump_core

#define ast_opt_dump_core   ast_test_flag(&ast_options, AST_OPT_FLAG_DUMP_CORE)

Definition at line 1379 of file extconf.c.

◆ ast_opt_exec

#define ast_opt_exec   ast_test_flag(&ast_options, AST_OPT_FLAG_EXEC)

Definition at line 1374 of file extconf.c.

◆ ast_opt_exec_includes

#define ast_opt_exec_includes   ast_test_flag(&ast_options, AST_OPT_FLAG_EXEC_INCLUDES)

Definition at line 1367 of file extconf.c.

Referenced by process_text_line().

◆ ast_opt_high_priority

#define ast_opt_high_priority   ast_test_flag(&ast_options, AST_OPT_FLAG_HIGH_PRIORITY)

Definition at line 1371 of file extconf.c.

◆ ast_opt_init_keys

#define ast_opt_init_keys   ast_test_flag(&ast_options, AST_OPT_FLAG_INIT_KEYS)

Definition at line 1372 of file extconf.c.

◆ ast_opt_mute

#define ast_opt_mute   ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE)

Definition at line 1387 of file extconf.c.

◆ ast_opt_no_color

#define ast_opt_no_color   ast_test_flag(&ast_options, AST_OPT_FLAG_NO_COLOR)

Definition at line 1375 of file extconf.c.

◆ ast_opt_no_fork

#define ast_opt_no_fork   ast_test_flag(&ast_options, AST_OPT_FLAG_NO_FORK)

Definition at line 1368 of file extconf.c.

◆ ast_opt_override_config

#define ast_opt_override_config   ast_test_flag(&ast_options, AST_OPT_FLAG_OVERRIDE_CONFIG)

Definition at line 1382 of file extconf.c.

◆ ast_opt_priority_jumping

#define ast_opt_priority_jumping   ast_test_flag(&ast_options, AST_OPT_FLAG_PRIORITY_JUMPING)

Definition at line 1378 of file extconf.c.

◆ ast_opt_quiet

#define ast_opt_quiet   ast_test_flag(&ast_options, AST_OPT_FLAG_QUIET)

Definition at line 1369 of file extconf.c.

◆ ast_opt_reconnect

#define ast_opt_reconnect   ast_test_flag(&ast_options, AST_OPT_FLAG_RECONNECT)

Definition at line 1383 of file extconf.c.

◆ ast_opt_remote

#define ast_opt_remote   ast_test_flag(&ast_options, AST_OPT_FLAG_REMOTE)

Definition at line 1373 of file extconf.c.

◆ ast_opt_timestamp

#define ast_opt_timestamp   ast_test_flag(&ast_options, AST_OPT_FLAG_TIMESTAMP)

Definition at line 1381 of file extconf.c.

◆ ast_opt_transcode_via_slin

#define ast_opt_transcode_via_slin   ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSCODE_VIA_SLIN)

Definition at line 1377 of file extconf.c.

◆ ast_opt_transmit_silence

#define ast_opt_transmit_silence   ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSMIT_SILENCE)

Definition at line 1384 of file extconf.c.

◆ ast_pthread_mutex_init

#define ast_pthread_mutex_init (   pmutex,
  a 
)    pthread_mutex_init(pmutex,a)

Definition at line 479 of file extconf.c.

◆ AST_PTHREADT_NULL

#define AST_PTHREADT_NULL   (pthread_t) -1

Definition at line 180 of file extconf.c.

◆ AST_PTHREADT_STOP

#define AST_PTHREADT_STOP   (pthread_t) -2

Definition at line 181 of file extconf.c.

◆ AST_RWLIST_APPEND_LIST

#define AST_RWLIST_APPEND_LIST   AST_LIST_APPEND_LIST

Definition at line 2006 of file extconf.c.

◆ AST_RWLIST_EMPTY

#define AST_RWLIST_EMPTY   AST_LIST_EMPTY

Definition at line 1736 of file extconf.c.

◆ AST_RWLIST_ENTRY

#define AST_RWLIST_ENTRY   AST_LIST_ENTRY

Definition at line 1700 of file extconf.c.

◆ AST_RWLIST_FIRST

#define AST_RWLIST_FIRST   AST_LIST_FIRST

Definition at line 1708 of file extconf.c.

◆ AST_RWLIST_HEAD

#define AST_RWLIST_HEAD (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
ast_rwlock_t lock; \
}
static const char type[]
Definition: chan_ooh323.c:109
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
static const char name[]
Definition: cdr_mysql.c:74

Defines a structure to be used to hold a read/write list of specified type.

Parameters
nameThis will be the name of the defined structure.
typeThis is the type of each list entry.

This macro creates a structure definition that can be used to hold a list of the entries of type type. It does not actually declare (allocate) a structure; to do that, either follow this macro with the desired name of the instance you wish to declare, or use the specified name to declare instances elsewhere.

Example usage:

static AST_RWLIST_HEAD(entry_list, entry) entries;

This would define struct entry_list, and declare an instance of it named entries, all intended to hold a list of type struct entry.

Definition at line 1484 of file extconf.c.

◆ AST_RWLIST_HEAD_DESTROY

#define AST_RWLIST_HEAD_DESTROY (   head)
Value:
{ \
(head)->first = NULL; \
(head)->last = NULL; \
ast_rwlock_destroy(&(head)->lock); \
}
#define NULL
Definition: resample.c:96
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092

Destroys an rwlist head structure.

Parameters
headThis is a pointer to the list head structure

This macro destroys a list head structure by setting the head entry to NULL (empty list) and destroying the embedded lock. It does not free the structure from memory.

Definition at line 1913 of file extconf.c.

◆ AST_RWLIST_HEAD_INIT

#define AST_RWLIST_HEAD_INIT (   head)
Value:
{ \
(head)->first = NULL; \
(head)->last = NULL; \
ast_rwlock_init(&(head)->lock); \
}
#define NULL
Definition: resample.c:96
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092

Initializes an rwlist head structure.

Parameters
headThis is a pointer to the list head structure

This macro initializes a list head structure by setting the head entry to NULL (empty list) and recreating the embedded lock.

Definition at line 1899 of file extconf.c.

◆ AST_RWLIST_HEAD_INIT_VALUE

#define AST_RWLIST_HEAD_INIT_VALUE
Value:
{ \
.first = NULL, \
.last = NULL, \
}
#define AST_RWLOCK_INIT_VALUE
Definition: extconf.c:563
#define NULL
Definition: resample.c:96

Defines initial values for a declaration of AST_RWLIST_HEAD.

Definition at line 1528 of file extconf.c.

◆ AST_RWLIST_HEAD_SET

#define AST_RWLIST_HEAD_SET (   head,
  entry 
)
Value:
do { \
(head)->first = (entry); \
(head)->last = (entry); \
ast_rwlock_init(&(head)->lock); \
} while (0)
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
Definition: search.h:40

Initializes an rwlist head structure with a specified first entry.

Parameters
headThis is a pointer to the list head structure
entrypointer to the list entry that will become the head of the list

This macro initializes a list head structure by setting the head entry to the supplied value and recreating the embedded lock.

Definition at line 1659 of file extconf.c.

◆ AST_RWLIST_HEAD_STATIC

#define AST_RWLIST_HEAD_STATIC (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
ast_rwlock_t lock; \
static const char type[]
Definition: chan_ooh323.c:109
struct sla_ringing_trunk * last
Definition: app_meetme.c:1092
ast_mutex_t lock
Definition: app_meetme.c:1091
#define AST_RWLIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_RWLIST_HEAD.
Definition: extconf.c:1528
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
static const char name[]
Definition: cdr_mysql.c:74

Defines a structure to be used to hold a read/write list of specified type, statically initialized.

Parameters
nameThis will be the name of the defined structure.
typeThis is the type of each list entry.

This macro creates a structure definition that can be used to hold a list of the entries of type type, and allocates an instance of it, initialized to be empty.

Example usage:

This would define struct entry_list, intended to hold a list of type struct entry.

Definition at line 1618 of file extconf.c.

◆ AST_RWLIST_INSERT_AFTER

#define AST_RWLIST_INSERT_AFTER   AST_LIST_INSERT_AFTER

Definition at line 1948 of file extconf.c.

◆ AST_RWLIST_INSERT_BEFORE_CURRENT

#define AST_RWLIST_INSERT_BEFORE_CURRENT   AST_LIST_INSERT_BEFORE_CURRENT

Definition at line 1870 of file extconf.c.

◆ AST_RWLIST_INSERT_HEAD

#define AST_RWLIST_INSERT_HEAD   AST_LIST_INSERT_HEAD

Definition at line 1964 of file extconf.c.

Referenced by ast_add_hint().

◆ AST_RWLIST_INSERT_TAIL

#define AST_RWLIST_INSERT_TAIL   AST_LIST_INSERT_TAIL

Definition at line 1987 of file extconf.c.

◆ AST_RWLIST_LAST

#define AST_RWLIST_LAST   AST_LIST_LAST

Definition at line 1716 of file extconf.c.

◆ AST_RWLIST_NEXT

#define AST_RWLIST_NEXT   AST_LIST_NEXT

Definition at line 1726 of file extconf.c.

◆ AST_RWLIST_RDLOCK

#define AST_RWLIST_RDLOCK (   head)    ast_rwlock_rdlock(&(head)->lock)

Read locks a list.

Parameters
headThis 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

Definition at line 1425 of file extconf.c.

◆ AST_RWLIST_REMOVE

#define AST_RWLIST_REMOVE   AST_LIST_REMOVE

Definition at line 2056 of file extconf.c.

◆ AST_RWLIST_REMOVE_CURRENT

#define AST_RWLIST_REMOVE_CURRENT   AST_LIST_REMOVE_CURRENT

Definition at line 1847 of file extconf.c.

Referenced by ast_remove_hint().

◆ AST_RWLIST_REMOVE_HEAD

#define AST_RWLIST_REMOVE_HEAD   AST_LIST_REMOVE_HEAD

Definition at line 2028 of file extconf.c.

◆ AST_RWLIST_TRAVERSE

#define AST_RWLIST_TRAVERSE   AST_LIST_TRAVERSE

Definition at line 1777 of file extconf.c.

Referenced by ast_add_hint(), ast_change_hint(), and ast_check_timing().

◆ AST_RWLIST_TRAVERSE_SAFE_BEGIN

#define AST_RWLIST_TRAVERSE_SAFE_BEGIN   AST_LIST_TRAVERSE_SAFE_BEGIN

Definition at line 1824 of file extconf.c.

Referenced by ast_remove_hint().

◆ AST_RWLIST_TRAVERSE_SAFE_END

#define AST_RWLIST_TRAVERSE_SAFE_END   AST_LIST_TRAVERSE_SAFE_END

Definition at line 1877 of file extconf.c.

Referenced by ast_remove_hint().

◆ AST_RWLIST_UNLOCK

#define AST_RWLIST_UNLOCK (   head)    ast_rwlock_unlock(&(head)->lock)

Attempts to unlock a read/write based list.

Parameters
headThis is a pointer to the list head structure

This macro attempts to remove a read or write lock from the list head structure pointed to by head. If the list was not locked by this thread, this macro has no effect.

Definition at line 1436 of file extconf.c.

◆ AST_RWLIST_WRLOCK

#define AST_RWLIST_WRLOCK (   head)    ast_rwlock_wrlock(&(head)->lock)

Write locks a list.

Parameters
headThis 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

Definition at line 1414 of file extconf.c.

◆ AST_RWLOCK_DEFINE_STATIC

#define AST_RWLOCK_DEFINE_STATIC (   rwlock)    __AST_RWLOCK_DEFINE(static, rwlock)

Definition at line 568 of file extconf.c.

◆ AST_RWLOCK_INIT_VALUE

#define AST_RWLOCK_INIT_VALUE   PTHREAD_RWLOCK_INITIALIZER

Definition at line 563 of file extconf.c.

◆ ast_set2_flag

#define ast_set2_flag (   p,
  value,
  flag 
)

Definition at line 684 of file extconf.c.

◆ ast_test_flag

#define ast_test_flag (   p,
  flag 
)

Definition at line 677 of file extconf.c.

◆ ASTMM_LIBC

#define ASTMM_LIBC   ASTMM_IGNORE

Definition at line 46 of file extconf.c.

◆ BACKGROUND_MATCHEXTEN

#define BACKGROUND_MATCHEXTEN   (1 << 2)

Definition at line 2328 of file extconf.c.

◆ BACKGROUND_NOANSWER

#define BACKGROUND_NOANSWER   (1 << 1)

Definition at line 2327 of file extconf.c.

◆ BACKGROUND_PLAYBACK

#define BACKGROUND_PLAYBACK   (1 << 3)

Definition at line 2329 of file extconf.c.

◆ BACKGROUND_SKIP

#define BACKGROUND_SKIP   (1 << 0)

Definition at line 2326 of file extconf.c.

◆ CB_INCR

#define CB_INCR   250

Definition at line 711 of file extconf.c.

Referenced by CB_ADD(), CB_ADD_LEN(), CB_INIT(), and LLB_ADD().

◆ COMMENT_END

#define COMMENT_END   "--;"

Definition at line 698 of file extconf.c.

◆ COMMENT_META

#define COMMENT_META   ';'

Definition at line 699 of file extconf.c.

Referenced by config_text_file_load().

◆ COMMENT_START

#define COMMENT_START   ";--"

Definition at line 697 of file extconf.c.

◆ COMMENT_TAG

#define COMMENT_TAG   '-'

Definition at line 700 of file extconf.c.

Referenced by config_text_file_load().

◆ DEBUG_M

#define DEBUG_M (   a)
Value:
{ \
a; \
}

Definition at line 96 of file extconf.c.

◆ EVENTLOG

#define EVENTLOG   "event_log"

Definition at line 93 of file extconf.c.

◆ EXT_DATA_SIZE

#define EXT_DATA_SIZE   8192

Definition at line 3605 of file extconf.c.

◆ gethostbyname

#define gethostbyname   __gethostbyname__is__not__reentrant__use__ast_gethostbyname__instead__

Definition at line 508 of file extconf.c.

◆ LOG_DEBUG

#define LOG_DEBUG   __LOG_DEBUG, _A_

◆ LOG_DTMF

#define LOG_DTMF   __LOG_DTMF, _A_

Definition at line 157 of file extconf.c.

◆ LOG_ERROR

#define LOG_ERROR   __LOG_ERROR, _A_

Definition at line 145 of file extconf.c.

Referenced by ast_func_read(), config_text_file_load(), and process_text_line().

◆ LOG_EVENT

#define LOG_EVENT   __LOG_EVENT, _A_

Definition at line 127 of file extconf.c.

◆ LOG_NOTICE

#define LOG_NOTICE   __LOG_NOTICE, _A_

Definition at line 133 of file extconf.c.

Referenced by pbx_extension_helper(), and pbx_substitute_variables_helper_full().

◆ LOG_VERBOSE

#define LOG_VERBOSE   __LOG_VERBOSE, _A_

Definition at line 151 of file extconf.c.

◆ LOG_WARNING

#define LOG_WARNING   __LOG_WARNING, _A_

◆ MAX_INCLUDE_LEVEL

#define MAX_INCLUDE_LEVEL   10

Definition at line 895 of file extconf.c.

Referenced by ast_config_new().

◆ MAX_NESTED_COMMENTS

#define MAX_NESTED_COMMENTS   128

Definition at line 696 of file extconf.c.

Referenced by config_text_file_load().

◆ ONE_MILLION

#define ONE_MILLION   1000000

Definition at line 2262 of file extconf.c.

Referenced by ast_tvadd(), ast_tvsub(), and tvfix().

◆ PRIORITY_HINT

#define PRIORITY_HINT   -1

Special Priority for a hint

Definition at line 2083 of file extconf.c.

Referenced by add_pri(), ast_add_extension2(), destroy_exten(), and pbx_load_config().

◆ pthread_cond_t

#define pthread_cond_t   use_ast_cond_t_instead_of_pthread_cond_t

Definition at line 502 of file extconf.c.

◆ pthread_create

#define pthread_create   __use_ast_pthread_create_instead__

Definition at line 511 of file extconf.c.

◆ pthread_mutex_init

#define pthread_mutex_init   use_ast_mutex_init_instead_of_pthread_mutex_init

Definition at line 501 of file extconf.c.

Referenced by ast_mutex_init().

◆ PTHREAD_MUTEX_INIT_VALUE

#define PTHREAD_MUTEX_INIT_VALUE   PTHREAD_MUTEX_INITIALIZER

Definition at line 193 of file extconf.c.

◆ pthread_mutex_t

#define pthread_mutex_t   use_ast_mutex_t_instead_of_pthread_mutex_t

Definition at line 500 of file extconf.c.

◆ QUEUELOG

#define QUEUELOG   "queue_log"

Definition at line 94 of file extconf.c.

◆ S_OR

#define S_OR (   a,
  b 
)    (!ast_strlen_zero(a) ? (a) : (b))

Definition at line 957 of file extconf.c.

Referenced by pbx_load_config().

◆ STATUS_NO_CONTEXT

#define STATUS_NO_CONTEXT   1

Definition at line 2450 of file extconf.c.

Referenced by pbx_extension_helper(), and pbx_find_extension().

◆ STATUS_NO_EXTENSION

#define STATUS_NO_EXTENSION   2

Definition at line 2451 of file extconf.c.

Referenced by pbx_extension_helper(), and pbx_find_extension().

◆ STATUS_NO_LABEL

#define STATUS_NO_LABEL   4

Definition at line 2453 of file extconf.c.

Referenced by pbx_extension_helper(), and pbx_find_extension().

◆ STATUS_NO_PRIORITY

#define STATUS_NO_PRIORITY   3

Definition at line 2452 of file extconf.c.

Referenced by pbx_extension_helper(), and pbx_find_extension().

◆ STATUS_SUCCESS

#define STATUS_SUCCESS   5

Definition at line 2454 of file extconf.c.

Referenced by pbx_find_extension().

◆ SWITCH_DATA_LENGTH

#define SWITCH_DATA_LENGTH   256

Definition at line 3612 of file extconf.c.

Referenced by ast_context_add_switch2().

◆ VAR_BUF_SIZE

#define VAR_BUF_SIZE   4096

Definition at line 2320 of file extconf.c.

Referenced by pbx_substitute_variables_helper_full().

◆ VAR_HARDTRAN

#define VAR_HARDTRAN   3

Definition at line 2324 of file extconf.c.

◆ VAR_NORMAL

#define VAR_NORMAL   1

Definition at line 2322 of file extconf.c.

◆ VAR_SOFTTRAN

#define VAR_SOFTTRAN   2

Definition at line 2323 of file extconf.c.

◆ VERBOSE_PREFIX_1

#define VERBOSE_PREFIX_1   " "

Definition at line 100 of file extconf.c.

◆ VERBOSE_PREFIX_2

#define VERBOSE_PREFIX_2   " == "

◆ VERBOSE_PREFIX_3

#define VERBOSE_PREFIX_3   " -- "

◆ VERBOSE_PREFIX_4

#define VERBOSE_PREFIX_4   " > "

Definition at line 103 of file extconf.c.

Typedef Documentation

◆ ast_cond_t

Definition at line 481 of file extconf.c.

◆ ast_mutex_t

Definition at line 465 of file extconf.c.

◆ ast_rwlock_t

typedef pthread_rwlock_t ast_rwlock_t

Definition at line 514 of file extconf.c.

◆ ast_state_cb_type

typedef int(* ast_state_cb_type) (char *context, char *id, enum ast_extension_states state, void *data)

Definition at line 2354 of file extconf.c.

◆ ast_switch_f

typedef int() ast_switch_f(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)

Definition at line 2106 of file extconf.c.

◆ config_load_func

typedef struct ast_config* config_load_func(const char *database, const char *table, const char *configfile, struct ast_config *config, int withcomments, const char *suggested_include_file)

Definition at line 933 of file extconf.c.

◆ realtime_multi_get

typedef struct ast_config* realtime_multi_get(const char *database, const char *table, va_list ap)

Definition at line 935 of file extconf.c.

◆ realtime_update

typedef int realtime_update(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap)

Definition at line 936 of file extconf.c.

◆ realtime_var_get

typedef struct ast_variable* realtime_var_get(const char *database, const char *table, va_list ap)

Definition at line 934 of file extconf.c.

Enumeration Type Documentation

◆ ast_extension_states

Enumerator
AST_EXTENSION_REMOVED 

Extension removed

AST_EXTENSION_DEACTIVATED 

Extension hint removed

AST_EXTENSION_NOT_INUSE 

No device INUSE or BUSY

AST_EXTENSION_INUSE 

One or more devices INUSE

AST_EXTENSION_BUSY 

All devices BUSY

AST_EXTENSION_UNAVAILABLE 

All devices UNAVAILABLE/UNREGISTERED

AST_EXTENSION_RINGING 

All devices RINGING

AST_EXTENSION_ONHOLD 

All devices ONHOLD

AST_EXTENSION_REMOVED 

Extension removed

AST_EXTENSION_DEACTIVATED 

Extension hint removed

AST_EXTENSION_NOT_INUSE 

No device INUSE or BUSY

AST_EXTENSION_INUSE 

One or more devices INUSE

AST_EXTENSION_BUSY 

All devices BUSY

AST_EXTENSION_UNAVAILABLE 

All devices UNAVAILABLE/UNREGISTERED

AST_EXTENSION_RINGING 

All devices RINGING

AST_EXTENSION_ONHOLD 

All devices ONHOLD

Definition at line 2085 of file extconf.c.

2085  {
2086  AST_EXTENSION_REMOVED = -2, /*!< Extension removed */
2087  AST_EXTENSION_DEACTIVATED = -1, /*!< Extension hint removed */
2088  AST_EXTENSION_NOT_INUSE = 0, /*!< No device INUSE or BUSY */
2089  AST_EXTENSION_INUSE = 1 << 0, /*!< One or more devices INUSE */
2090  AST_EXTENSION_BUSY = 1 << 1, /*!< All devices BUSY */
2091  AST_EXTENSION_UNAVAILABLE = 1 << 2, /*!< All devices UNAVAILABLE/UNREGISTERED */
2092  AST_EXTENSION_RINGING = 1 << 3, /*!< All devices RINGING */
2093  AST_EXTENSION_ONHOLD = 1 << 4, /*!< All devices ONHOLD */
2094 };

◆ ast_option_flags

Enumerator
AST_OPT_FLAG_EXEC_INCLUDES 

Allow #exec in config files

AST_OPT_FLAG_NO_FORK 

Do not fork()

AST_OPT_FLAG_QUIET 

Keep quiet

AST_OPT_FLAG_CONSOLE 

Console mode

AST_OPT_FLAG_HIGH_PRIORITY 

Run in realtime Linux priority

AST_OPT_FLAG_INIT_KEYS 

Initialize keys for RSA authentication

AST_OPT_FLAG_REMOTE 

Remote console

AST_OPT_FLAG_EXEC 

Execute an asterisk CLI command upon startup

AST_OPT_FLAG_NO_COLOR 

Don't use termcap colors

AST_OPT_FLAG_FULLY_BOOTED 

Are we fully started yet?

AST_OPT_FLAG_TRANSCODE_VIA_SLIN 

Trascode via signed linear

AST_OPT_FLAG_STDEXTEN_MACRO 

Invoke the stdexten using the legacy macro method.

AST_OPT_FLAG_DUMP_CORE 

Dump core on a seg fault

AST_OPT_FLAG_CACHE_RECORD_FILES 

Cache sound files

AST_OPT_FLAG_TIMESTAMP 

Display timestamp in CLI verbose output

AST_OPT_FLAG_CACHE_MEDIA_FRAMES 

Cache media frames for performance

AST_OPT_FLAG_RECONNECT 

Reconnect

AST_OPT_FLAG_TRANSMIT_SILENCE 

Transmit Silence during Record() and DTMF Generation

AST_OPT_FLAG_DONT_WARN 

Suppress some warnings

AST_OPT_FLAG_REF_DEBUG 

Reference Debugging

AST_OPT_FLAG_ALWAYS_FORK 

Always fork, even if verbose or debug settings are non-zero

AST_OPT_FLAG_MUTE 

Disable log/verbose output to remote consoles

AST_OPT_FLAG_DEBUG_MODULE 

There is a per-module debug setting

AST_OPT_FLAG_TRACE_MODULE 

There is a per-module trace setting

AST_OPT_FLAG_LIGHT_BACKGROUND 

Terminal colors should be adjusted for a light-colored background

AST_OPT_FLAG_HIDE_MESSAGING_AMI_EVENTS 

Make the global Message channel an internal channel to suppress AMI events

AST_OPT_FLAG_FORCE_BLACK_BACKGROUND 

Force black background

AST_OPT_FLAG_HIDE_CONSOLE_CONNECT 

Hide remote console connect messages on console

AST_OPT_FLAG_LOCK_CONFIG_DIR 

Protect the configuration file path with a lock

AST_OPT_FLAG_GENERIC_PLC 

Generic PLC

AST_OPT_FLAG_GENERIC_PLC_ON_EQUAL_CODECS 

Generic PLC onm equal codecs

AST_OPT_FLAG_EXEC_INCLUDES 

Allow #exec in config files

AST_OPT_FLAG_NO_FORK 

Do not fork()

AST_OPT_FLAG_QUIET 

Keep quiet

AST_OPT_FLAG_CONSOLE 

Console mode

AST_OPT_FLAG_HIGH_PRIORITY 

Run in realtime Linux priority

AST_OPT_FLAG_INIT_KEYS 

Initialize keys for RSA authentication

AST_OPT_FLAG_REMOTE 

Remote console

AST_OPT_FLAG_EXEC 

Execute an asterisk CLI command upon startup

AST_OPT_FLAG_NO_COLOR 

Don't use termcap colors

AST_OPT_FLAG_FULLY_BOOTED 

Are we fully started yet?

AST_OPT_FLAG_TRANSCODE_VIA_SLIN 

Trascode via signed linear

AST_OPT_FLAG_DUMP_CORE 

Dump core on a seg fault

AST_OPT_FLAG_CACHE_RECORD_FILES 

Cache sound files

AST_OPT_FLAG_TIMESTAMP 

Display timestamp in CLI verbose output

AST_OPT_FLAG_OVERRIDE_CONFIG 

Override config

AST_OPT_FLAG_RECONNECT 

Reconnect

AST_OPT_FLAG_TRANSMIT_SILENCE 

Transmit Silence during Record() and DTMF Generation

AST_OPT_FLAG_DONT_WARN 

Suppress some warnings

AST_OPT_FLAG_ALWAYS_FORK 

Always fork, even if verbose or debug settings are non-zero

AST_OPT_FLAG_MUTE 

Disable log/verbose output to remote consoles

AST_OPT_FLAG_DEBUG_FILE 

There is a per-file debug setting

AST_OPT_FLAG_LIGHT_BACKGROUND 

Terminal colors should be adjusted for a light-colored background

AST_OPT_FLAG_FORCE_BLACK_BACKGROUND 

Force black background

Definition at line 1309 of file extconf.c.

1309  {
1310  /*! Allow \#exec in config files */
1311  AST_OPT_FLAG_EXEC_INCLUDES = (1 << 0),
1312  /*! Do not fork() */
1313  AST_OPT_FLAG_NO_FORK = (1 << 1),
1314  /*! Keep quiet */
1315  AST_OPT_FLAG_QUIET = (1 << 2),
1316  /*! Console mode */
1317  AST_OPT_FLAG_CONSOLE = (1 << 3),
1318  /*! Run in realtime Linux priority */
1319  AST_OPT_FLAG_HIGH_PRIORITY = (1 << 4),
1320  /*! Initialize keys for RSA authentication */
1321  AST_OPT_FLAG_INIT_KEYS = (1 << 5),
1322  /*! Remote console */
1323  AST_OPT_FLAG_REMOTE = (1 << 6),
1324  /*! Execute an asterisk CLI command upon startup */
1325  AST_OPT_FLAG_EXEC = (1 << 7),
1326  /*! Don't use termcap colors */
1327  AST_OPT_FLAG_NO_COLOR = (1 << 8),
1328  /*! Are we fully started yet? */
1329  AST_OPT_FLAG_FULLY_BOOTED = (1 << 9),
1330  /*! Trascode via signed linear */
1331  AST_OPT_FLAG_TRANSCODE_VIA_SLIN = (1 << 10),
1332  /*! Dump core on a seg fault */
1333  AST_OPT_FLAG_DUMP_CORE = (1 << 12),
1334  /*! Cache sound files */
1335  AST_OPT_FLAG_CACHE_RECORD_FILES = (1 << 13),
1336  /*! Display timestamp in CLI verbose output */
1337  AST_OPT_FLAG_TIMESTAMP = (1 << 14),
1338  /*! Override config */
1339  AST_OPT_FLAG_OVERRIDE_CONFIG = (1 << 15),
1340  /*! Reconnect */
1341  AST_OPT_FLAG_RECONNECT = (1 << 16),
1342  /*! Transmit Silence during Record() and DTMF Generation */
1343  AST_OPT_FLAG_TRANSMIT_SILENCE = (1 << 17),
1344  /*! Suppress some warnings */
1345  AST_OPT_FLAG_DONT_WARN = (1 << 18),
1346  /*! Always fork, even if verbose or debug settings are non-zero */
1347  AST_OPT_FLAG_ALWAYS_FORK = (1 << 21),
1348  /*! Disable log/verbose output to remote consoles */
1349  AST_OPT_FLAG_MUTE = (1 << 22),
1350  /*! There is a per-file debug setting */
1351  AST_OPT_FLAG_DEBUG_FILE = (1 << 23),
1352  /*! Terminal colors should be adjusted for a light-colored background */
1353  AST_OPT_FLAG_LIGHT_BACKGROUND = (1 << 25),
1354  /*! Force black background */
1356 };

Function Documentation

◆ __ast_context_create()

static struct ast_context* __ast_context_create ( struct ast_context **  extcontexts,
const char *  name,
const char *  registrar,
int  existsokay 
)
static

Definition at line 4708 of file extconf.c.

References ast_calloc, ast_log(), ast_mutex_init(), ast_rwlock_init(), ast_unlock_contexts(), ast_verbose(), ast_wrlock_contexts(), contexts, ast_context::ignorepats, ast_context::includes, ast_context::lock, LOG_DEBUG, LOG_WARNING, ast_context::macrolock, ast_context::name, ast_context::next, NULL, registrar, ast_context::registrar, ast_context::root, tmp(), and VERBOSE_PREFIX_3.

Referenced by ast_context_find_or_create(), and localized_context_find_or_create().

4709 {
4710  struct ast_context *tmp, **loc_contexts;
4711  int length = sizeof(struct ast_context) + strlen(name) + 1;
4712 
4713  if (!extcontexts) {
4715  loc_contexts = &contexts;
4716  } else
4717  loc_contexts = extcontexts;
4718 
4719  for (tmp = *loc_contexts; tmp; tmp = tmp->next) {
4720  if (!strcasecmp(tmp->name, name)) {
4721  if (!existsokay) {
4722  ast_log(LOG_WARNING, "Tried to register context '%s', already in use\n", name);
4723  tmp = NULL;
4724  }
4725  if (!extcontexts)
4727  return tmp;
4728  }
4729  }
4730  if ((tmp = ast_calloc(1, length))) {
4731  ast_rwlock_init(&tmp->lock);
4732  ast_mutex_init(&tmp->macrolock);
4733  strcpy(tmp->name, name);
4734  tmp->root = NULL;
4735  tmp->registrar = registrar;
4736  tmp->next = *loc_contexts;
4737  tmp->includes = NULL;
4738  tmp->ignorepats = NULL;
4739  *loc_contexts = tmp;
4740  if (option_debug)
4741  ast_log(LOG_DEBUG, "Registered context '%s'\n", tmp->name);
4742  if (option_verbose > 2)
4743  ast_verbose( VERBOSE_PREFIX_3 "Registered extension context '%s'\n", tmp->name);
4744  }
4745 
4746  if (!extcontexts)
4748  return tmp;
4749 }
struct ast_ignorepats ignorepats
Definition: pbx.c:291
struct ast_exten * root
Definition: pbx.c:286
int option_debug
Definition: options.c:69
static struct ast_context * contexts
Definition: extconf.c:3599
static int tmp()
Definition: bt_open.c:389
int option_verbose
Definition: options.c:67
void ast_verbose(const char *fmt,...)
Definition: extconf.c:2207
#define NULL
Definition: resample.c:96
static int ast_rwlock_init(ast_rwlock_t *prwlock)
Definition: extconf.c:516
#define VERBOSE_PREFIX_3
Definition: extconf.c:102
static int ast_mutex_init(ast_mutex_t *pmutex)
Definition: extconf.c:469
struct ast_context * next
Definition: pbx.c:289
ast_mutex_t macrolock
Definition: pbx.c:296
static int ast_unlock_contexts(void)
Definition: extconf.c:4616
char * registrar
Definition: pbx.c:293
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
struct ast_includes includes
Definition: pbx.c:290
#define LOG_WARNING
Definition: extconf.c:139
ast_rwlock_t lock
Definition: pbx.c:285
char name[0]
Definition: pbx.c:297
static char * registrar
Definition: pbx_ael.c:78
static const char name[]
Definition: cdr_mysql.c:74
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
#define LOG_DEBUG
Definition: extconf.c:121
static int ast_wrlock_contexts(void)
Definition: extconf.c:4611
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ __ast_context_destroy()

static void __ast_context_destroy ( struct ast_context con,
const char *  registrar 
)
static

Definition at line 5504 of file extconf.c.

References AST_LIST_REMOVE_HEAD, ast_log(), ast_rwlock_destroy(), ast_unlock_context(), ast_wrlock_context(), destroy_exten(), el, free(), localized_context_destroy(), LOG_DEBUG, ast_context::name, ast_include::next, ast_ignorepat::next, ast_exten::next, ast_context::next, NULL, ast_exten::peer, and tmp().

Referenced by ast_merge_contexts_and_delete(), and localized_context_destroy().

5505 {
5506  struct ast_context *tmp, *tmpl=NULL;
5507  struct ast_include *tmpi;
5508  struct ast_sw *sw;
5509  struct ast_exten *e, *el, *en;
5510  struct ast_ignorepat *ipi;
5511 
5512  for (tmp = contexts; tmp; ) {
5513  struct ast_context *next; /* next starting point */
5514  for (; tmp; tmpl = tmp, tmp = tmp->next) {
5515  if (option_debug)
5516  ast_log(LOG_DEBUG, "check ctx %s %s\n", tmp->name, tmp->registrar);
5517  if ( (!registrar || !strcasecmp(registrar, tmp->registrar)) &&
5518  (!con || !strcasecmp(tmp->name, con->name)) )
5519  break; /* found it */
5520  }
5521  if (!tmp) /* not found, we are done */
5522  break;
5523  ast_wrlock_context(tmp);
5524  if (option_debug)
5525  ast_log(LOG_DEBUG, "delete ctx %s %s\n", tmp->name, tmp->registrar);
5526  next = tmp->next;
5527  if (tmpl)
5528  tmpl->next = next;
5529  else
5530  contexts = next;
5531  /* Okay, now we're safe to let it go -- in a sense, we were
5532  ready to let it go as soon as we locked it. */
5533  ast_unlock_context(tmp);
5534  for (tmpi = tmp->includes; tmpi; ) { /* Free includes */
5535  struct ast_include *tmpil = tmpi;
5536  tmpi = tmpi->next;
5537  free(tmpil);
5538  }
5539  for (ipi = tmp->ignorepats; ipi; ) { /* Free ignorepats */
5540  struct ast_ignorepat *ipl = ipi;
5541  ipi = ipi->next;
5542  free(ipl);
5543  }
5544  while ((sw = AST_LIST_REMOVE_HEAD(&tmp->alts, list)))
5545  free(sw);
5546  for (e = tmp->root; e;) {
5547  for (en = e->peer; en;) {
5548  el = en;
5549  en = en->peer;
5550  destroy_exten(el);
5551  }
5552  el = e;
5553  e = e->next;
5554  destroy_exten(el);
5555  }
5556  ast_rwlock_destroy(&tmp->lock);
5557  free(tmp);
5558  /* if we have a specific match, we are done, otherwise continue */
5559  tmp = con ? NULL : next;
5560  }
5561 }
ast_include: include= support in extensions.conf
Definition: pbx_include.c:37
ast_exten: An extension The dialplan is saved as a linked list with each context having it&#39;s own link...
Definition: pbx.c:237
int option_debug
Definition: options.c:69
static struct ast_context * contexts
Definition: extconf.c:3599
static int tmp()
Definition: bt_open.c:389
static int ast_unlock_context(struct ast_context *con)
Definition: extconf.c:4626
static EditLine * el
Definition: asterisk.c:340
struct ast_ignorepat * next
Definition: conf2ael.c:169
struct ast_include * next
Definition: conf2ael.c:151
#define NULL
Definition: resample.c:96
struct ast_context * next
Definition: pbx.c:289
struct ast_exten * next
Definition: pbx.c:256
struct ast_exten * peer
Definition: pbx.c:250
ast_sw: Switch statement in extensions.conf
Definition: pbx_sw.c:37
void free()
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
static int ast_rwlock_destroy(ast_rwlock_t *prwlock)
Definition: extconf.c:529
char name[0]
Definition: pbx.c:297
ast_ignorepat: Ignore patterns in dial plan
Definition: pbx_ignorepat.c:37
static char * registrar
Definition: pbx_ael.c:78
#define LOG_DEBUG
Definition: extconf.c:121
static int ast_wrlock_context(struct ast_context *con)
Definition: extconf.c:4621
static void destroy_exten(struct ast_exten *e)
Definition: extconf.c:3767
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: extconf.c:2017

◆ _extension_match_core()

static int _extension_match_core ( const char *  pattern,
const char *  data,
enum ext_match_t  mode 
)
static

Definition at line 4193 of file extconf.c.

References ast_log(), E_MATCH, E_MATCH_MASK, E_MATCHMORE, end, LOG_WARNING, and NULL.

Referenced by extension_match_core().

4194 {
4195  mode &= E_MATCH_MASK; /* only consider the relevant bits */
4196 
4197  if ( (mode == E_MATCH) && (pattern[0] == '_') && (strcasecmp(pattern,data)==0) ) /* note: if this test is left out, then _x. will not match _x. !!! */
4198  return 1;
4199 
4200  if (pattern[0] != '_') { /* not a pattern, try exact or partial match */
4201  int ld = strlen(data), lp = strlen(pattern);
4202 
4203  if (lp < ld) /* pattern too short, cannot match */
4204  return 0;
4205  /* depending on the mode, accept full or partial match or both */
4206  if (mode == E_MATCH)
4207  return !strcmp(pattern, data); /* 1 on match, 0 on fail */
4208  if (ld == 0 || !strncasecmp(pattern, data, ld)) /* partial or full match */
4209  return (mode == E_MATCHMORE) ? lp > ld : 1; /* XXX should consider '!' and '/' ? */
4210  else
4211  return 0;
4212  }
4213  pattern++; /* skip leading _ */
4214  /*
4215  * XXX below we stop at '/' which is a separator for the CID info. However we should
4216  * not store '/' in the pattern at all. When we insure it, we can remove the checks.
4217  */
4218  while (*data && *pattern && *pattern != '/') {
4219  const char *end;
4220 
4221  if (*data == '-') { /* skip '-' in data (just a separator) */
4222  data++;
4223  continue;
4224  }
4225  switch (toupper(*pattern)) {
4226  case '[': /* a range */
4227  end = strchr(pattern+1, ']'); /* XXX should deal with escapes ? */
4228  if (end == NULL) {
4229  ast_log(LOG_WARNING, "Wrong usage of [] in the extension\n");
4230  return 0; /* unconditional failure */
4231  }
4232  for (pattern++; pattern != end; pattern++) {
4233  if (pattern+2 < end && pattern[1] == '-') { /* this is a range */
4234  if (*data >= pattern[0] && *data <= pattern[2])
4235  break; /* match found */
4236  else {
4237  pattern += 2; /* skip a total of 3 chars */
4238  continue;
4239  }
4240  } else if (*data == pattern[0])
4241  break; /* match found */
4242  }
4243  if (pattern == end)
4244  return 0;
4245  pattern = end; /* skip and continue */
4246  break;
4247  case 'N':
4248  if (*data < '2' || *data > '9')
4249  return 0;
4250  break;
4251  case 'X':
4252  if (*data < '0' || *data > '9')
4253  return 0;
4254  break;
4255  case 'Z':
4256  if (*data < '1' || *data > '9')
4257  return 0;
4258  break;
4259  case '.': /* Must match, even with more digits */
4260  return 1;
4261  case '!': /* Early match */
4262  return 2;
4263  case ' ':
4264  case '-': /* Ignore these in patterns */
4265  data--; /* compensate the final data++ */
4266  break;
4267  default:
4268  if (*data != *pattern)
4269  return 0;
4270  }
4271  data++;
4272  pattern++;
4273  }
4274  if (*data) /* data longer than pattern, no match */
4275  return 0;
4276  /*
4277  * match so far, but ran off the end of the data.
4278  * Depending on what is next, determine match or not.
4279  */
4280  if (*pattern == '\0' || *pattern == '/') /* exact match */
4281  return (mode == E_MATCHMORE) ? 0 : 1; /* this is a failure for E_MATCHMORE */
4282  else if (*pattern == '!') /* early match */
4283  return 2;
4284  else /* partial match */
4285  return (mode == E_MATCH) ? 0 : 1; /* this is a failure for E_MATCH */
4286 }
const char pattern[0]
Definition: pbx_ignorepat.c:39
#define NULL
Definition: resample.c:96
char * end
Definition: eagi_proxy.c:73
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
#define LOG_WARNING
Definition: extconf.c:139

◆ _null_sig_handler()

static void _null_sig_handler ( int  sig)
static

NULL handler so we can collect the child exit status.

Definition at line 789 of file extconf.c.

790 {
791 
792 }

◆ add_pri()

static int add_pri ( struct ast_context con,
struct ast_exten tmp,
struct ast_exten el,
struct ast_exten e,
int  replace 
)
static

add the extension in the priority chain. returns 0 on success, -1 on failure

Definition at line 3677 of file extconf.c.

References ast_add_hint(), ast_change_hint(), ast_log(), ast_exten::data, ast_exten::datad, ast_exten::exten, free(), LOG_WARNING, ast_context::name, ast_exten::next, NULL, ast_exten::peer, ast_exten::priority, PRIORITY_HINT, ast_context::root, and tmp().

Referenced by ast_add_extension2().

3679 {
3680  struct ast_exten *ep;
3681 
3682  for (ep = NULL; e ; ep = e, e = e->peer) {
3683  if (e->priority >= tmp->priority)
3684  break;
3685  }
3686  if (!e) { /* go at the end, and ep is surely set because the list is not empty */
3687  ep->peer = tmp;
3688  return 0; /* success */
3689  }
3690  if (e->priority == tmp->priority) {
3691  /* Can't have something exactly the same. Is this a
3692  replacement? If so, replace, otherwise, bonk. */
3693  if (!replace) {
3694  ast_log(LOG_WARNING, "Unable to register extension '%s', priority %d in '%s', already in use\n", tmp->exten, tmp->priority, con->name);
3695  tmp->datad(tmp->data);
3696  free(tmp);
3697  return -1;
3698  }
3699  /* we are replacing e, so copy the link fields and then update
3700  * whoever pointed to e to point to us
3701  */
3702  tmp->next = e->next; /* not meaningful if we are not first in the peer list */
3703  tmp->peer = e->peer; /* always meaningful */
3704  if (ep) /* We're in the peer list, just insert ourselves */
3705  ep->peer = tmp;
3706  else if (el) /* We're the first extension. Take over e's functions */
3707  el->next = tmp;
3708  else /* We're the very first extension. */
3709  con->root = tmp;
3710  if (tmp->priority == PRIORITY_HINT)
3711  ast_change_hint(e,tmp);
3712  /* Destroy the old one */
3713  e->datad(e->data);
3714  free(e);
3715  } else { /* Slip ourselves in just before e */
3716  tmp->peer = e;
3717  tmp->next = e->next; /* extension chain, or NULL if e is not the first extension */
3718  if (ep) /* Easy enough, we're just in the peer list */
3719  ep->peer = tmp;
3720  else { /* we are the first in some peer list, so link in the ext list */
3721  if (el)
3722  el->next = tmp; /* in the middle... */
3723  else
3724  con->root = tmp; /* ... or at the head */
3725  e->next = NULL; /* e is no more at the head, so e->next must be reset */
3726  }
3727  /* And immediately return success. */
3728  if (tmp->priority == PRIORITY_HINT)
3729  ast_add_hint(tmp);
3730  }
3731  return 0;
3732 }
ast_exten: An extension The dialplan is saved as a linked list with each context having it&#39;s own link...
Definition: pbx.c:237
struct ast_exten * root
Definition: pbx.c:286
static int tmp()
Definition: bt_open.c:389
#define NULL
Definition: resample.c:96
struct ast_exten * next
Definition: pbx.c:256
int priority
Definition: pbx.c:243
struct ast_exten * peer
Definition: pbx.c:250
void free()
static int ast_add_hint(struct ast_exten *e)
ast_add_hint: Add hint to hint list, check initial extension state
Definition: extconf.c:3644
void(* datad)(void *)
Definition: pbx.c:249
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
#define LOG_WARNING
Definition: extconf.c:139
char * exten
Definition: pbx.c:238
char name[0]
Definition: pbx.c:297
static int ast_change_hint(struct ast_exten *oe, struct ast_exten *ne)
ast_change_hint: Change hint for an extension
Definition: extconf.c:3627
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:790
#define PRIORITY_HINT
Definition: extconf.c:2083
void * data
Definition: pbx.c:248

◆ ALLOC_COMMENT()

static struct ast_comment* ALLOC_COMMENT ( const char *  buffer)
static

Definition at line 877 of file extconf.c.

References ast_calloc, ast_comment::cmt, ast_config_map::next, and ast_channel::x.

Referenced by process_text_line().

878 {
879  struct ast_comment *x = ast_calloc(1,sizeof(struct ast_comment)+strlen(buffer)+1);
880  strcpy(x->cmt, buffer);
881  return x;
882 }
Structure to keep comments for rewriting configuration files.
Definition: main/config.c:84
char cmt[0]
Definition: main/config.c:87
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204

◆ ast_add_extension2()

static int ast_add_extension2 ( struct ast_context con,
int  replace,
const char *  extension,
int  priority,
const char *  label,
const char *  callerid,
const char *  application,
void *  data,
void(*)(void *)  datad,
const char *  registrar 
)
static

Main interface to add extensions to the list for out context.

We sort extensions in order of matching preference, so that we can stop the search as soon as we find a suitable match. This ordering also takes care of wildcards such as '.' (meaning "one or more of any character") and '!' (which is 'earlymatch', meaning "zero or more of any character" but also impacts the return value from CANMATCH and EARLYMATCH.

The extension match rules defined in the devmeeting 2006.05.05 are quite simple: WE SELECT THE LONGEST MATCH. In detail, "longest" means the number of matched characters in the extension. In case of ties (e.g. _XXX and 333) in the length of a pattern, we give priority to entries with the smallest cardinality (e.g, [5-9] comes before [2-8] before the former has only 5 elements, while the latter has 7, etc. In case of same cardinality, the first element in the range counts. If we still have a tie, any final '!' will make this as a possibly less specific pattern.

EBUSY - can't lock EEXIST - extension with the same priority exist and no replace is set

Definition at line 4776 of file extconf.c.

References add_pri(), ast_exten::app, ast_add_hint(), ast_calloc, ast_log(), ast_verbose(), ast_exten::cidmatch, ast_channel::data, ast_exten::data, ast_exten::datad, el, errno, ext_cmp(), ext_strncpy(), ast_exten::exten, ast_exten::label, localized_add_extension2(), LOG_DEBUG, ast_exten::matchcid, ast_context::name, ast_exten::next, NULL, null_datad(), ast_exten::parent, priority, ast_exten::priority, PRIORITY_HINT, registrar, ast_exten::registrar, ast_context::root, ast_exten::stuff, tmp(), and VERBOSE_PREFIX_3.

Referenced by localized_add_extension2(), and pbx_load_config().

4780 {
4781  /*
4782  * Sort extensions (or patterns) according to the rules indicated above.
4783  * These are implemented by the function ext_cmp()).
4784  * All priorities for the same ext/pattern/cid are kept in a list,
4785  * using the 'peer' field as a link field..
4786  */
4787  struct ast_exten *tmp, *e, *el = NULL;
4788  int res;
4789  int length;
4790  char *p;
4791 
4792  /* if we are adding a hint, and there are global variables, and the hint
4793  contains variable references, then expand them --- NOT In this situation!!!
4794  */
4795 
4796  length = sizeof(struct ast_exten);
4797  length += strlen(extension) + 1;
4798  length += strlen(application) + 1;
4799  if (label)
4800  length += strlen(label) + 1;
4801  if (callerid)
4802  length += strlen(callerid) + 1;
4803  else
4804  length ++; /* just the '\0' */
4805 
4806  /* Be optimistic: Build the extension structure first */
4807  if (datad == NULL)
4808  datad = null_datad;
4809  if (!(tmp = ast_calloc(1, length)))
4810  return -1;
4811 
4812  /* use p as dst in assignments, as the fields are const char * */
4813  p = tmp->stuff;
4814  if (label) {
4815  tmp->label = p;
4816  strcpy(p, label);
4817  p += strlen(label) + 1;
4818  }
4819  tmp->exten = p;
4820  p += ext_strncpy(p, extension, strlen(extension) + 1) + 1;
4821  tmp->priority = priority;
4822  tmp->cidmatch = p; /* but use p for assignments below */
4823  if (callerid) {
4824  p += ext_strncpy(p, callerid, strlen(callerid) + 1) + 1;
4825  tmp->matchcid = 1;
4826  } else {
4827  *p++ = '\0';
4828  tmp->matchcid = 0;
4829  }
4830  tmp->app = p;
4831  strcpy(p, application);
4832  tmp->parent = con;
4833  tmp->data = data;
4834  tmp->datad = datad;
4835  tmp->registrar = registrar;
4836 
4837  res = 0; /* some compilers will think it is uninitialized otherwise */
4838  for (e = con->root; e; el = e, e = e->next) { /* scan the extension list */
4839  res = ext_cmp(e->exten, extension);
4840  if (res == 0) { /* extension match, now look at cidmatch */
4841  if (!e->matchcid && !tmp->matchcid)
4842  res = 0;
4843  else if (tmp->matchcid && !e->matchcid)
4844  res = 1;
4845  else if (e->matchcid && !tmp->matchcid)
4846  res = -1;
4847  else
4848  res = strcasecmp(e->cidmatch, tmp->cidmatch);
4849  }
4850  if (res >= 0)
4851  break;
4852  }
4853  if (e && res == 0) { /* exact match, insert in the pri chain */
4854  res = add_pri(con, tmp, el, e, replace);
4855  if (res < 0) {
4856  errno = EEXIST; /* XXX do we care ? */
4857  return 0; /* XXX should we return -1 maybe ? */
4858  }
4859  } else {
4860  /*
4861  * not an exact match, this is the first entry with this pattern,
4862  * so insert in the main list right before 'e' (if any)
4863  */
4864  tmp->next = e;
4865  if (el)
4866  el->next = tmp;
4867  else
4868  con->root = tmp;
4869  if (tmp->priority == PRIORITY_HINT)
4870  ast_add_hint(tmp);
4871  }
4872  if (option_debug) {
4873  if (tmp->matchcid) {
4874  ast_log(LOG_DEBUG, "Added extension '%s' priority %d (CID match '%s') to %s\n",
4875  tmp->exten, tmp->priority, tmp->cidmatch, con->name);
4876  } else {
4877  ast_log(LOG_DEBUG, "Added extension '%s' priority %d to %s\n",
4878  tmp->exten, tmp->priority, con->name);
4879  }
4880  }
4881  if (option_verbose > 2) {
4882  if (tmp->matchcid) {
4883  ast_verbose( VERBOSE_PREFIX_3 "Added extension '%s' priority %d (CID match '%s')to %s\n",
4884  tmp->exten, tmp->priority, tmp->cidmatch, con->name);
4885  } else {
4886  ast_verbose( VERBOSE_PREFIX_3 "Added extension '%s' priority %d to %s\n",
4887  tmp->exten, tmp->priority, con->name);
4888  }
4889  }
4890  return 0;
4891 }
const char * label
Definition: pbx.c:244
ast_exten: An extension The dialplan is saved as a linked list with each context having it&#39;s own link...
Definition: pbx.c:237
struct ast_exten * root
Definition: pbx.c:286
int option_debug
Definition: options.c:69
static int tmp()
Definition: bt_open.c:389
static EditLine * el
Definition: asterisk.c:340
int option_verbose
Definition: options.c:67
void ast_verbose(const char *fmt,...)
Definition: extconf.c:2207
#define NULL
Definition: resample.c:96
char stuff[0]
Definition: pbx.c:257
static int priority
#define VERBOSE_PREFIX_3
Definition: extconf.c:102
const char * registrar
Definition: pbx.c:253
static int add_pri(struct ast_context *con, struct ast_exten *tmp, struct ast_exten *el, struct ast_exten *e, int replace)
add the extension in the priority chain. returns 0 on success, -1 on failure
Definition: extconf.c:3677
int matchcid
Definition: pbx.c:240
struct ast_exten * next
Definition: pbx.c:256
int priority
Definition: pbx.c:243
structure to hold extensions
static int ast_add_hint(struct ast_exten *e)
ast_add_hint: Add hint to hint list, check initial extension state
Definition: extconf.c:3644
void(* datad)(void *)
Definition: pbx.c:249
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
static void null_datad(void *foo)
Definition: extconf.c:2744
char * exten
Definition: pbx.c:238
char name[0]
Definition: pbx.c:297
int errno
static char * registrar
Definition: pbx_ael.c:78
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:790
const char * cidmatch
Definition: pbx.c:241
#define LOG_DEBUG
Definition: extconf.c:121
static int ext_strncpy(char *dst, const char *src, int len)
copy a string skipping whitespace
Definition: extconf.c:3973
static int ext_cmp(const char *a, const char *b)
the full routine to compare extensions in rules.
Definition: extconf.c:3946
const char * app
Definition: pbx.c:246
struct ast_context * parent
Definition: pbx.c:245
#define PRIORITY_HINT
Definition: extconf.c:2083
void * data
Definition: pbx.c:248

◆ ast_add_hint()

static int ast_add_hint ( struct ast_exten e)
static

ast_add_hint: Add hint to hint list, check initial extension state

Definition at line 3644 of file extconf.c.

References ast_calloc, ast_get_extension_app(), ast_get_extension_name(), ast_log(), AST_RWLIST_INSERT_HEAD, AST_RWLIST_TRAVERSE, ast_hint::exten, and LOG_DEBUG.

Referenced by add_pri(), and ast_add_extension2().

3645 {
3646  struct ast_hint *hint;
3647 
3648  if (!e)
3649  return -1;
3650 
3651 
3652  /* Search if hint exists, do nothing */
3653  AST_RWLIST_TRAVERSE(&hints, hint, list) {
3654  if (hint->exten == e) {
3655  if (option_debug > 1)
3656  ast_log(LOG_DEBUG, "HINTS: Not re-adding existing hint %s: %s\n", ast_get_extension_name(e), ast_get_extension_app(e));
3657  return -1;
3658  }
3659  }
3660 
3661  if (option_debug > 1)
3662  ast_log(LOG_DEBUG, "HINTS: Adding hint %s: %s\n", ast_get_extension_name(e), ast_get_extension_app(e));
3663 
3664  if (!(hint = ast_calloc(1, sizeof(*hint)))) {
3665  return -1;
3666  }
3667  /* Initialize and insert new item at the top */
3668  hint->exten = e;
3669  AST_RWLIST_INSERT_HEAD(&hints, hint, list);
3670 
3671  return 0;
3672 }
int option_debug
Definition: options.c:69
static const char * ast_get_extension_app(struct ast_exten *e)
Definition: extconf.c:3614
static const char * ast_get_extension_name(struct ast_exten *exten)
Definition: extconf.c:3619
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
struct ast_exten * exten
Hint extension.
Definition: pbx.c:331
Structure for dial plan hints.
Definition: pbx.c:324
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
#define LOG_DEBUG
Definition: extconf.c:121
#define AST_RWLIST_TRAVERSE
Definition: extconf.c:1777
#define AST_RWLIST_INSERT_HEAD
Definition: extconf.c:1964

◆ ast_app_separate_args()

static unsigned int ast_app_separate_args ( char *  buf,
char  delim,
char **  array,
int  arraylen 
)
static

Definition at line 2488 of file extconf.c.

References buf, paren, and quote().

Referenced by pbx_builtin_setvar().

2489 {
2490  int argc;
2491  char *scan;
2492  int paren = 0, quote = 0;
2493 
2494  if (!buf || !array || !arraylen)
2495  return 0;
2496 
2497  memset(array, 0, arraylen * sizeof(*array));
2498 
2499  scan = buf;
2500 
2501  for (argc = 0; *scan && (argc < arraylen - 1); argc++) {
2502  array[argc] = scan;
2503  for (; *scan; scan++) {
2504  if (*scan == '(')
2505  paren++;
2506  else if (*scan == ')') {
2507  if (paren)
2508  paren--;
2509  } else if (*scan == '"' && delim != '"') {
2510  quote = quote ? 0 : 1;
2511  /* Remove quote character from argument */
2512  memmove(scan, scan + 1, strlen(scan));
2513  scan--;
2514  } else if (*scan == '\\') {
2515  /* Literal character, don't parse */
2516  memmove(scan, scan + 1, strlen(scan));
2517  } else if ((*scan == delim) && !paren && !quote) {
2518  *scan++ = '\0';
2519  break;
2520  }
2521  }
2522  }
2523 
2524  if (*scan)
2525  array[argc++] = scan;
2526 
2527  return argc;
2528 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static int quote(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int array(struct ast_channel *chan, const char *cmd, char *var, const char *value)
#define paren
Definition: ael_lex.c:973

◆ ast_atomic_dec_and_test()

int ast_atomic_dec_and_test ( volatile int *  p)

decrement *p by 1 and return true if the variable has reached 0. Useful e.g. to check if a refcount has reached 0.

Definition at line 634 of file extconf.c.

References a, ast_atomic_fetchadd_int(), ast_channel_lock, ast_channel_trylock, ast_channel_unlock, AST_INLINE_API, and SIZEOF_INT.

Referenced by ast_atomic_fetchadd_int().

637 {

◆ ast_atomic_fetchadd_int()

int ast_atomic_fetchadd_int ( volatile int *  p,
int  v 
)

Atomically add v to *p and return * the previous value of *p. This can be used to handle reference counts, and the return value can be used to generate unique identifiers.

Definition at line 593 of file extconf.c.

References ast_atomic_dec_and_test(), AST_INLINE_API, HAVE_GCC_ATOMICS, and SIZEOF_INT.

Referenced by ast_atomic_dec_and_test().

596 {

◆ ast_build_timing()

int ast_build_timing ( struct ast_timing i,
const char *  info_in 
)

Construct a timing bitmap, for use in time-based conditionals.

Parameters
iPointer to an ast_timing structure.
infoStandard string containing a timerange, weekday range, monthday range, and month range, as well as an optional timezone.
Return values
Returns1 on success or 0 on failure.

/brief Build timing

/param i info /param info_in

Definition at line 3808 of file extconf.c.

References ast_strdup, ast_strdupa, ast_strlen_zero(), ast_timing::daymask, ast_timing::dowmask, get_range(), get_timerange(), sip_to_pjsip::info(), ast_timing::monthmask, NULL, strsep(), and ast_timing::timezone.

Referenced by ast_context_add_include2(), iftime(), include_alloc(), pbx_builtin_execiftime(), and pbx_builtin_gotoiftime().

3809 {
3810  char *info;
3811  int j, num_fields, last_sep = -1;
3812 
3813  i->timezone = NULL;
3814 
3815  /* Check for empty just in case */
3816  if (ast_strlen_zero(info_in)) {
3817  return 0;
3818  }
3819 
3820  /* make a copy just in case we were passed a static string */
3821  info = ast_strdupa(info_in);
3822 
3823  /* count the number of fields in the timespec */
3824  for (j = 0, num_fields = 1; info[j] != '\0'; j++) {
3825  if (info[j] == ',') {
3826  last_sep = j;
3827  num_fields++;
3828  }
3829  }
3830 
3831  /* save the timezone, if it is specified */
3832  if (num_fields == 5) {
3833  i->timezone = ast_strdup(info + last_sep + 1);
3834  }
3835 
3836  /* Assume everything except time */
3837  i->monthmask = 0xfff; /* 12 bits */
3838  i->daymask = 0x7fffffffU; /* 31 bits */
3839  i->dowmask = 0x7f; /* 7 bits */
3840  /* on each call, use strsep() to move info to the next argument */
3841  get_timerange(i, strsep(&info, "|,"));
3842  if (info)
3843  i->dowmask = get_range(strsep(&info, "|,"), 7, days, "day of week");
3844  if (info)
3845  i->daymask = get_range(strsep(&info, "|,"), 31, NULL, "day");
3846  if (info)
3847  i->monthmask = get_range(strsep(&info, "|,"), 12, months, "month");
3848  return 1;
3849 }
unsigned int daymask
Definition: pbx.h:174
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
static unsigned get_range(char *src, int max, char *const names[], const char *msg)
helper function to return a range up to max (7, 12, 31 respectively). names, if supplied, is an array of names that should be mapped to numbers.
Definition: extconf.c:2640
unsigned int monthmask
Definition: pbx.h:173
static force_inline int ast_strlen_zero(const char *s)
Definition: extconf.c:952
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
static void get_timerange(struct ast_timing *i, char *times)
store a bitmask of valid times, one bit each 2 minute
Definition: extconf.c:2684
char * days[]
Definition: extconf.c:3777
unsigned int dowmask
Definition: pbx.h:175
def info(msg)
char * months[]
Definition: extconf.c:3789
char * strsep(char **str, const char *delims)
char * timezone
Definition: pbx.h:177

◆ ast_category_append()

static void ast_category_append ( struct ast_config config,
struct ast_category category 
)
static

Definition at line 2835 of file extconf.c.

References ast_category_destroy(), ast_config::current, ast_config::last, ast_category::next, and ast_config::root.

Referenced by inherit_category(), and process_text_line().

2836 {
2837  if (config->last)
2838  config->last->next = category;
2839  else
2840  config->root = category;
2841  config->last = category;
2842  config->current = category;
2843 }
struct ast_category * next
Definition: main/config.c:246
struct ast_category * last
Definition: main/config.c:253
struct ast_category * current
Definition: main/config.c:254
struct ast_category * root
Definition: main/config.c:251

◆ ast_category_browse()

static char* ast_category_browse ( struct ast_config config,
const char *  prev 
)
static

Definition at line 3328 of file extconf.c.

References ast_config_set_current_category(), ast_config::last_browse, ast_category::name, ast_category::next, next_available_category(), NULL, and ast_config::root.

Referenced by pbx_load_config().

3329 {
3330  struct ast_category *cat = NULL;
3331 
3332  if (prev && config->last_browse && (config->last_browse->name == prev))
3333  cat = config->last_browse->next;
3334  else if (!prev && config->root)
3335  cat = config->root;
3336  else if (prev) {
3337  for (cat = config->root; cat; cat = cat->next) {
3338  if (cat->name == prev) {
3339  cat = cat->next;
3340  break;
3341  }
3342  }
3343  if (!cat) {
3344  for (cat = config->root; cat; cat = cat->next) {
3345  if (!strcasecmp(cat->name, prev)) {
3346  cat = cat->next;
3347  break;
3348  }
3349  }
3350  }
3351  }
3352 
3353  if (cat)
3354  cat = next_available_category(cat);
3355 
3356  config->last_browse = cat;
3357  return (cat) ? cat->name : NULL;
3358 }
struct ast_category * next
Definition: main/config.c:246
static struct ast_category * next_available_category(struct ast_category *cat)
Definition: extconf.c:3321
struct ast_category * prev
Definition: main/config.c:244
#define NULL
Definition: resample.c:96
struct ast_category * last_browse
Definition: main/config.c:255
char name[80]
Definition: main/config.c:226
struct ast_category * root
Definition: main/config.c:251

◆ ast_category_destroy()

static void ast_category_destroy ( struct ast_category cat)
static

Definition at line 2847 of file extconf.c.

References ast_variables_destroy(), ast_category::file, free(), and ast_category::root.

Referenced by ast_category_append(), and process_text_line().

2848 {
2850  if (cat->file)
2851  free(cat->file);
2852 
2853  free(cat);
2854 }
char * file
The file name from whence this declaration was read.
Definition: main/config.c:233
void free()
struct ast_variable * root
Definition: main/config.c:240
static void ast_variables_destroy(struct ast_variable *v)
Definition: extconf.c:1263

◆ ast_category_get()

static struct ast_category* ast_category_get ( const struct ast_config config,
const char *  category_name 
)
static

Definition at line 1211 of file extconf.c.

References category_get().

Referenced by ast_variable_browse().

1212 {
1213  return category_get(config, category_name, 0);
1214 }
static struct ast_category * category_get(const struct ast_config *config, const char *category_name, int ignored)
Definition: extconf.c:1193

◆ ast_category_new()

static struct ast_category* ast_category_new ( const char *  name,
const char *  in_file,
int  lineno 
)
static

Definition at line 2790 of file extconf.c.

References ast_calloc, ast_copy_string(), ast_category::file, ast_category::lineno, localized_category_get(), ast_category::name, and strdup.

Referenced by ast_config_get_current_category(), and process_text_line().

2791 {
2792  struct ast_category *category;
2793 
2794  if ((category = ast_calloc(1, sizeof(*category))))
2795  ast_copy_string(category->name, name, sizeof(category->name));
2796  category->file = strdup(in_file);
2797  category->lineno = lineno; /* if you don't know the lineno, set it to 999999 or something real big */
2798  return category;
2799 }
char * file
The file name from whence this declaration was read.
Definition: main/config.c:233
void ast_copy_string(char *dst, const char *src, size_t size)
Definition: extconf.c:970
static const char name[]
Definition: cdr_mysql.c:74
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
char name[80]
Definition: main/config.c:226
#define strdup(a)
Definition: astmm.h:165

◆ ast_change_hint()

static int ast_change_hint ( struct ast_exten oe,
struct ast_exten ne 
)
static

ast_change_hint: Change hint for an extension

Definition at line 3627 of file extconf.c.

References AST_RWLIST_TRAVERSE, and ast_hint::exten.

Referenced by add_pri().

3628 {
3629  struct ast_hint *hint;
3630  int res = -1;
3631 
3632  AST_RWLIST_TRAVERSE(&hints, hint, list) {
3633  if (hint->exten == oe) {
3634  hint->exten = ne;
3635  res = 0;
3636  break;
3637  }
3638  }
3639 
3640  return res;
3641 }
struct ast_exten * exten
Hint extension.
Definition: pbx.c:331
Structure for dial plan hints.
Definition: pbx.c:324
#define AST_RWLIST_TRAVERSE
Definition: extconf.c:1777

◆ ast_check_timing()

int ast_check_timing ( const struct ast_timing i)

Evaluate a pre-constructed bitmap as to whether the current time falls within the range specified.

Parameters
iPointer to an ast_timing structure.
Return values
Returns1, if the time matches or 0, if the current time falls outside of the specified range.

Definition at line 4002 of file extconf.c.

References AST_RWLIST_TRAVERSE, ast_walk_contexts(), ast_switch::list, ast_switch::name, and pbx_findswitch().

Referenced by ext_strncpy(), iftime(), include_valid(), and pbx_builtin_execiftime().

4003 {
4004  /* sorry, but this feature will NOT be available
4005  in the standalone version */
4006  return 0;
4007 }

◆ ast_config_destroy()

static void ast_config_destroy ( struct ast_config cfg)
static

Definition at line 1290 of file extconf.c.

References ast_includes_destroy(), ast_variables_destroy(), free(), ast_config::includes, ast_category::next, ast_category::root, and ast_config::root.

Referenced by localized_config_load(), localized_config_load_with_comments(), pbx_load_config(), and process_text_line().

1291 {
1292  struct ast_category *cat, *catn;
1293 
1294  if (!cfg)
1295  return;
1296 
1298 
1299  cat = cfg->root;
1300  while (cat) {
1302  catn = cat;
1303  cat = cat->next;
1304  free(catn);
1305  }
1306  free(cfg);
1307 }
struct ast_category * next
Definition: main/config.c:246
struct ast_config_include * includes
Definition: main/config.c:258
void free()
struct ast_variable * root
Definition: main/config.c:240
static void ast_variables_destroy(struct ast_variable *v)
Definition: extconf.c:1263
static void ast_includes_destroy(struct ast_config_include *incls)
Definition: extconf.c:1274
struct ast_category * root
Definition: main/config.c:251

◆ ast_config_get_current_category()

struct ast_category* ast_config_get_current_category ( const struct ast_config cfg)

Retrieve the current category name being built.

API for backend configuration engines while building a configuration set.

Definition at line 2783 of file extconf.c.

References ast_category_new(), ast_config::current, and ast_channel::name.

Referenced by config_curl(), config_odbc(), config_text_file_load(), and find_engine().

2784 {
2785  return cfg->current;
2786 }
struct ast_category * current
Definition: main/config.c:254

◆ ast_config_internal_load()

static struct ast_config * ast_config_internal_load ( const char *  filename,
struct ast_config cfg,
int  withcomments,
const char *  suggested_incl_file 
)
static

Definition at line 2864 of file extconf.c.

References ast_log(), db, find_engine(), ast_config::include_level, ast_config_engine::load_func, LOG_WARNING, ast_config::max_include_level, NULL, result, table, and text_file_engine.

Referenced by localized_config_load(), localized_config_load_with_comments(), and process_text_line().

2865 {
2866  char db[256];
2867  char table[256];
2868  struct ast_config_engine *loader = &text_file_engine;
2869  struct ast_config *result;
2870 
2871  if (cfg->include_level == cfg->max_include_level) {
2872  ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level);
2873  return NULL;
2874  }
2875 
2876  cfg->include_level++;
2877  /* silence is golden!
2878  ast_log(LOG_WARNING, "internal loading file %s level=%d\n", filename, cfg->include_level);
2879  */
2880 
2881  if (strcmp(filename, extconfig_conf) && strcmp(filename, "asterisk.conf") && config_engine_list) {
2882  struct ast_config_engine *eng;
2883 
2884  eng = find_engine(filename, db, sizeof(db), table, sizeof(table));
2885 
2886 
2887  if (eng && eng->load_func) {
2888  loader = eng;
2889  } else {
2890  eng = find_engine("global", db, sizeof(db), table, sizeof(table));
2891  if (eng && eng->load_func)
2892  loader = eng;
2893  }
2894  }
2895 
2896  result = loader->load_func(db, table, filename, cfg, withcomments, suggested_incl_file);
2897  /* silence is golden
2898  ast_log(LOG_WARNING, "finished internal loading file %s level=%d\n", filename, cfg->include_level);
2899  */
2900 
2901  if (result)
2902  result->include_level--;
2903 
2904  return result;
2905 }
static sqlite3 * db
int include_level
Definition: main/config.c:256
#define NULL
Definition: resample.c:96
Configuration engine structure, used to define realtime drivers.
static char * table
Definition: cdr_odbc.c:58
static struct ast_config_engine text_file_engine
Definition: extconf.c:2856
static char * extconfig_conf
Definition: extconf.c:702
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
static struct ast_config_engine * config_engine_list
Definition: extconf.c:893
#define LOG_WARNING
Definition: extconf.c:139
static struct ast_config_engine * find_engine(const char *family, char *database, int dbsiz, char *table, int tabsiz)
Find realtime engine for realtime family.
Definition: extconf.c:2749
config_load_func * load_func
static PGresult * result
Definition: cel_pgsql.c:88
int max_include_level
Definition: main/config.c:257

◆ ast_config_new()

static struct ast_config* ast_config_new ( void  )
static

Definition at line 3276 of file extconf.c.

References ast_calloc, config, localized_config_load(), ast_config::max_include_level, and MAX_INCLUDE_LEVEL.

Referenced by config_text_file_load(), localized_config_load(), and localized_config_load_with_comments().

3277 {
3278  struct ast_config *config;
3279 
3280  if ((config = ast_calloc(1, sizeof(*config))))
3282  return config;
3283 }
#define MAX_INCLUDE_LEVEL
Definition: extconf.c:895
char * config
Definition: conf2ael.c:66
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
int max_include_level
Definition: main/config.c:257

◆ ast_config_set_current_category()

void ast_config_set_current_category ( struct ast_config cfg,
const struct ast_category cat 
)

Set the category within the configuration as being current.

API for backend configuration engines while building a configuration set.

Definition at line 3364 of file extconf.c.

References ast_config::current.

Referenced by ast_category_browse().

3365 {
3366  /* cast below is just to silence compiler warning about dropping "const" */
3367  cfg->current = (struct ast_category *) cat;
3368 }
struct ast_category * current
Definition: main/config.c:254

◆ ast_console_puts()

void ast_console_puts ( const char *  string)

write the string to the root console, and all attached network console clients

Definition at line 1314 of file asterisk.c.

References ast_network_puts().

1315 {
1316  /* Send to the root console */
1317  fputs(string, stdout);
1318  fflush(stdout);
1319 
1320  /* Send to any network console clients */
1321  ast_network_puts(string);
1322 }
static void ast_network_puts(const char *string)
write the string to all attached console clients
Definition: asterisk.c:1298

◆ ast_context_add_ignorepat2()

static int ast_context_add_ignorepat2 ( struct ast_context con,
const char *  value,
const char *  registrar 
)
static

Definition at line 4569 of file extconf.c.

References ast_calloc, errno, ast_context::ignorepats, localized_context_add_ignorepat2(), ast_ignorepat::next, NULL, ast_ignorepat::pattern, ast_ignorepat::registrar, and registrar.

Referenced by localized_context_add_ignorepat2(), localized_context_add_include2(), and pbx_load_config().

4570 {
4571  struct ast_ignorepat *ignorepat, *ignorepatc, *ignorepatl = NULL;
4572  int length;
4573  length = sizeof(struct ast_ignorepat);
4574  length += strlen(value) + 1;
4575  if (!(ignorepat = ast_calloc(1, length)))
4576  return -1;
4577  /* The cast to char * is because we need to write the initial value.
4578  * The field is not supposed to be modified otherwise
4579  */
4580  strcpy((char *)ignorepat->pattern, value);
4581  ignorepat->next = NULL;
4582  ignorepat->registrar = registrar;
4583  for (ignorepatc = con->ignorepats; ignorepatc; ignorepatc = ignorepatc->next) {
4584  ignorepatl = ignorepatc;
4585  if (!strcasecmp(ignorepatc->pattern, value)) {
4586  /* Already there */
4587  errno = EEXIST;
4588  return -1;
4589  }
4590  }
4591  if (ignorepatl)
4592  ignorepatl->next = ignorepat;
4593  else
4594  con->ignorepats = ignorepat;
4595  return 0;
4596 
4597 }
struct ast_ignorepats ignorepats
Definition: pbx.c:291
const char pattern[0]
Definition: pbx_ignorepat.c:39
struct ast_ignorepat * next
Definition: conf2ael.c:169
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
const char * registrar
Definition: pbx_ignorepat.c:38
ast_ignorepat: Ignore patterns in dial plan
Definition: pbx_ignorepat.c:37
int errno
static char * registrar
Definition: pbx_ael.c:78
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204

◆ ast_context_add_include2()

static int ast_context_add_include2 ( struct ast_context con,
const char *  value,
const char *  registrar 
)
static

Definition at line 4503 of file extconf.c.

References ast_build_timing(), ast_calloc, ast_get_context_name(), ast_verbose(), c, errno, free(), ast_include::hastime, ast_context::includes, localized_context_add_include2(), ast_include::name, ast_include::next, NULL, ast_include::registrar, registrar, ast_include::rname, ast_include::stuff, ast_include::timing, and VERBOSE_PREFIX_3.

Referenced by ast_get_context_name(), localized_context_add_include2(), and pbx_load_config().

4505 {
4506  struct ast_include *new_include;
4507  char *c;
4508  struct ast_include *i, *il = NULL; /* include, include_last */
4509  int length;
4510  char *p;
4511 
4512  length = sizeof(struct ast_include);
4513  length += 2 * (strlen(value) + 1);
4514 
4515  /* allocate new include structure ... */
4516  if (!(new_include = ast_calloc(1, length)))
4517  return -1;
4518  /* Fill in this structure. Use 'p' for assignments, as the fields
4519  * in the structure are 'const char *'
4520  */
4521  p = new_include->stuff;
4522  new_include->name = p;
4523  strcpy(p, value);
4524  p += strlen(value) + 1;
4525  new_include->rname = p;
4526  strcpy(p, value);
4527  /* Strip off timing info, and process if it is there */
4528  if ( (c = strchr(p, '|')) ) {
4529  *c++ = '\0';
4530  new_include->hastime = ast_build_timing(&(new_include->timing), c);
4531  }
4532  new_include->next = NULL;
4533  new_include->registrar = registrar;
4534 
4535 
4536  /* ... go to last include and check if context is already included too... */
4537  for (i = con->includes; i; i = i->next) {
4538  if (!strcasecmp(i->name, new_include->name)) {
4539  free(new_include);
4540  errno = EEXIST;
4541  return -1;
4542  }
4543  il = i;
4544  }
4545 
4546  /* ... include new context into context list, unlock, return */
4547  if (il)
4548  il->next = new_include;
4549  else
4550  con->includes = new_include;
4551  if (option_verbose > 2)
4552  ast_verbose(VERBOSE_PREFIX_3 "Including context '%s' in context '%s'\n", new_include->name, ast_get_context_name(con));
4553 
4554  return 0;
4555 }
ast_include: include= support in extensions.conf
Definition: pbx_include.c:37
int ast_build_timing(struct ast_timing *i, const char *info_in)
Construct a timing bitmap, for use in time-based conditionals.
Definition: extconf.c:3808
int option_verbose
Definition: options.c:67
static struct test_val c
void ast_verbose(const char *fmt,...)
Definition: extconf.c:2207
struct ast_include * next
Definition: conf2ael.c:151
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
char stuff[0]
Definition: pbx_include.c:47
#define VERBOSE_PREFIX_3
Definition: extconf.c:102
struct ast_timing timing
Definition: pbx_include.c:46
static const char * ast_get_context_name(struct ast_context *con)
Definition: extconf.c:4488
void free()
struct ast_includes includes
Definition: pbx.c:290
int errno
static char * registrar
Definition: pbx_ael.c:78
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
const char * name
Definition: pbx_include.c:38
const char * rname
Definition: pbx_include.c:40
const char * registrar
Definition: pbx_include.c:42

◆ ast_context_add_switch2()

static int ast_context_add_switch2 ( struct ast_context con,
const char *  value,
const char *  data,
int  eval,
const char *  registrar 
)
static

Definition at line 4641 of file extconf.c.

References ast_context::alts, ast_calloc, ast_get_context_name(), AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_verbose(), ast_sw::data, errno, ast_sw::eval, free(), ast_sw::list, localized_context_add_switch2(), ast_sw::name, ast_sw::registrar, registrar, ast_sw::stuff, SWITCH_DATA_LENGTH, ast_sw::tmpdata, and VERBOSE_PREFIX_3.

Referenced by ast_unlock_context(), localized_context_add_switch2(), and pbx_load_config().

4643 {
4644  struct ast_sw *new_sw;
4645  struct ast_sw *i;
4646  int length;
4647  char *p;
4648 
4649  length = sizeof(struct ast_sw);
4650  length += strlen(value) + 1;
4651  if (data)
4652  length += strlen(data);
4653  length++;
4654  if (eval) {
4655  /* Create buffer for evaluation of variables */
4656  length += SWITCH_DATA_LENGTH;
4657  length++;
4658  }
4659 
4660  /* allocate new sw structure ... */
4661  if (!(new_sw = ast_calloc(1, length)))
4662  return -1;
4663  /* ... fill in this structure ... */
4664  p = new_sw->stuff;
4665  new_sw->name = p;
4666  strcpy(new_sw->name, value);
4667  p += strlen(value) + 1;
4668  new_sw->data = p;
4669  if (data) {
4670  strcpy(new_sw->data, data);
4671  p += strlen(data) + 1;
4672  } else {
4673  strcpy(new_sw->data, "");
4674  p++;
4675  }
4676  if (eval)
4677  new_sw->tmpdata = p;
4678  new_sw->eval = eval;
4679  new_sw->registrar = registrar;
4680 
4681  /* ... go to last sw and check if context is already swd too... */
4682  AST_LIST_TRAVERSE(&con->alts, i, list) {
4683  if (!strcasecmp(i->name, new_sw->name) && !strcasecmp(i->data, new_sw->data)) {
4684  free(new_sw);
4685  errno = EEXIST;
4686  return -1;
4687  }
4688  }
4689 
4690  /* ... sw new context into context list, unlock, return */
4691  AST_LIST_INSERT_TAIL(&con->alts, new_sw, list);
4692 
4693  if (option_verbose > 2)
4694  ast_verbose(VERBOSE_PREFIX_3 "Including switch '%s/%s' in context '%s'\n", new_sw->name, new_sw->data, ast_get_context_name(con));
4695 
4696  return 0;
4697 }
const char * name
Definition: pbx_sw.c:38
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: extconf.c:1774
int option_verbose
Definition: options.c:67
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: extconf.c:1977
void ast_verbose(const char *fmt,...)
Definition: extconf.c:2207
#define SWITCH_DATA_LENGTH
Definition: extconf.c:3612
int value
Definition: syslog.c:37
char * tmpdata
Definition: conf2ael.c:162
#define VERBOSE_PREFIX_3
Definition: extconf.c:102
static const char * ast_get_context_name(struct ast_context *con)
Definition: extconf.c:4488
const char * registrar
Definition: pbx_sw.c:40
ast_sw: Switch statement in extensions.conf
Definition: pbx_sw.c:37
void free()
const char * data
Definition: pbx_sw.c:42
char stuff[0]
Definition: pbx_sw.c:45
struct ast_sw::@412 list
int eval
Definition: pbx_sw.c:43
int errno
static char * registrar
Definition: pbx_ael.c:78
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct ast_sws alts
Definition: pbx.c:292

◆ ast_context_find()

static struct ast_context* ast_context_find ( const char *  name)
static

Definition at line 4174 of file extconf.c.

References ast_walk_contexts(), ast_context::name, NULL, and tmp().

Referenced by ast_context_switches_count(), and ast_context_verify_includes().

4175 {
4176  struct ast_context *tmp = NULL;
4177  while ( (tmp = ast_walk_contexts(tmp)) ) {
4178  if (!name || !strcasecmp(name, tmp->name))
4179  break;
4180  }
4181  return tmp;
4182 }
static int tmp()
Definition: bt_open.c:389
#define NULL
Definition: resample.c:96
static struct ast_context * ast_walk_contexts(struct ast_context *con)
Definition: extconf.c:4026
char name[0]
Definition: pbx.c:297
static const char name[]
Definition: cdr_mysql.c:74
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_find_or_create()

static struct ast_context* ast_context_find_or_create ( struct ast_context **  extcontexts,
void *  tab,
const char *  name,
const char *  registrar 
)
static

Definition at line 4983 of file extconf.c.

References __ast_context_create(), and localized_context_find_or_create().

Referenced by pbx_load_config().

4984 {
4985  return __ast_context_create(extcontexts, name, registrar, 1);
4986 }
static struct ast_context * __ast_context_create(struct ast_context **extcontexts, const char *name, const char *registrar, int existsokay)
Definition: extconf.c:4708
static char * registrar
Definition: pbx_ael.c:78
static const char name[]
Definition: cdr_mysql.c:74

◆ ast_context_ignorepats_count()

int ast_context_ignorepats_count ( struct ast_context con)

Definition at line 4125 of file extconf.c.

References ast_walk_context_ignorepats(), ast_walk_context_switches(), c, and NULL.

Referenced by ast_walk_context_ignorepats().

4126 {
4127  int c = 0;
4128  struct ast_ignorepat *ip = NULL;
4129 
4130  while ((ip = ast_walk_context_ignorepats(con, ip))) {
4131  c++;
4132  }
4133 
4134  return c;
4135 }
static struct ast_ignorepat * ast_walk_context_ignorepats(struct ast_context *con, struct ast_ignorepat *ip)
Definition: extconf.c:4115
static struct test_val c
#define NULL
Definition: resample.c:96
ast_ignorepat: Ignore patterns in dial plan
Definition: pbx_ignorepat.c:37

◆ ast_context_includes_count()

int ast_context_includes_count ( struct ast_context con)

Definition at line 4092 of file extconf.c.

References ast_walk_context_includes(), c, localized_walk_context_includes(), and NULL.

Referenced by ast_walk_context_includes().

4093 {
4094  int c = 0;
4095  struct ast_include *inc = NULL;
4096 
4097  while ((inc = ast_walk_context_includes(con, inc))) {
4098  c++;
4099  }
4100 
4101  return c;
4102 }
ast_include: include= support in extensions.conf
Definition: pbx_include.c:37
static struct ast_include * ast_walk_context_includes(struct ast_context *con, struct ast_include *inc)
Definition: extconf.c:4082
static struct test_val c
#define NULL
Definition: resample.c:96

◆ ast_context_switches_count()

int ast_context_switches_count ( struct ast_context con)

Definition at line 4159 of file extconf.c.

References ast_context_find(), ast_walk_context_switches(), c, and NULL.

Referenced by localized_walk_context_switches().

4160 {
4161  int c = 0;
4162  struct ast_sw *sw = NULL;
4163 
4164  while ((sw = ast_walk_context_switches(con, sw))) {
4165  c++;
4166  }
4167 
4168  return c;
4169 }
static struct test_val c
#define NULL
Definition: resample.c:96
ast_sw: Switch statement in extensions.conf
Definition: pbx_sw.c:37
static struct ast_sw * ast_walk_context_switches(struct ast_context *con, struct ast_sw *sw)
Definition: extconf.c:4141

◆ ast_context_verify_includes()

static int ast_context_verify_includes ( struct ast_context con)
static

Definition at line 5623 of file extconf.c.

References ast_context_find(), ast_get_context_name(), ast_log(), ast_walk_context_includes(), localized_context_verify_includes(), LOG_WARNING, NULL, and ast_include::rname.

Referenced by localized_context_verify_includes(), and localized_pbx_load_module().

5624 {
5625  struct ast_include *inc = NULL;
5626  int res = 0;
5627 
5628  while ( (inc = ast_walk_context_includes(con, inc)) )
5629  if (!ast_context_find(inc->rname)) {
5630  res = -1;
5631  if (strcasecmp(inc->rname,"parkedcalls")!=0)
5632  ast_log(LOG_WARNING, "Context '%s' tries to include the nonexistent context '%s'\n",
5633  ast_get_context_name(con), inc->rname);
5634  }
5635  return res;
5636 }
ast_include: include= support in extensions.conf
Definition: pbx_include.c:37
static struct ast_include * ast_walk_context_includes(struct ast_context *con, struct ast_include *inc)
Definition: extconf.c:4082
#define NULL
Definition: resample.c:96
static const char * ast_get_context_name(struct ast_context *con)
Definition: extconf.c:4488
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
#define LOG_WARNING
Definition: extconf.c:139
const char * rname
Definition: pbx_include.c:40
static struct ast_context * ast_context_find(const char *name)
Definition: extconf.c:4174

◆ ast_copy_string()

void ast_copy_string ( char *  dst,
const char *  src,
size_t  size 
)

◆ ast_extension_match()

static int ast_extension_match ( const char *  pattern,
const char *  data 
)
static

Definition at line 4297 of file extconf.c.

References E_MATCH, and extension_match_core().

Referenced by extension_match_core(), and matchcid().

4298 {
4299  return extension_match_core(pattern, data, E_MATCH);
4300 }
static int extension_match_core(const char *pattern, const char *data, enum ext_match_t mode)
Definition: extconf.c:4288

◆ ast_findlabel_extension2()

static int ast_findlabel_extension2 ( struct ast_channel c,
struct ast_context con,
const char *  exten,
const char *  label,
const char *  callerid 
)
static

Definition at line 4978 of file extconf.c.

References E_FINDLABEL, NULL, and pbx_extension_helper().

Referenced by pbx_extension_helper(), and pbx_load_config().

4979 {
4980  return pbx_extension_helper(c, con, NULL, exten, 0, label, callerid, E_FINDLABEL);
4981 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int pbx_extension_helper(struct ast_channel *c, struct ast_context *con, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
The return value depends on the action:
Definition: extconf.c:4917
#define NULL
Definition: resample.c:96

◆ ast_func_read()

static int ast_func_read ( struct ast_channel chan,
const char *  function,
char *  workspace,
size_t  len 
)
static

Definition at line 4996 of file extconf.c.

References ast_log(), and LOG_ERROR.

Referenced by pbx_substitute_variables_helper_full().

4997 {
4998  ast_log(LOG_ERROR, "Function %s not registered\n", function);
4999  return -1;
5000 }
#define LOG_ERROR
Definition: extconf.c:145
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195

◆ ast_func_write()

static int ast_func_write ( struct ast_channel chan,
const char *  function,
const char *  value 
)
static

Definition at line 2480 of file extconf.c.

Referenced by pbx_builtin_setvar_helper().

2481 {
2482 
2483  /* ast_log(LOG_ERROR, "Function %s not registered\n", function); we are not interested in the details here */
2484 
2485  return -1;
2486 }

◆ ast_get_context_name()

static const char* ast_get_context_name ( struct ast_context con)
static

Definition at line 4488 of file extconf.c.

References ast_context_add_include2(), ast_context::name, NULL, registrar, and value.

Referenced by ast_context_add_include2(), ast_context_add_switch2(), and ast_context_verify_includes().

4489 {
4490  return con ? con->name : NULL;
4491 }
#define NULL
Definition: resample.c:96
char name[0]
Definition: pbx.c:297

◆ ast_get_extension_app()

static const char* ast_get_extension_app ( struct ast_exten e)
static

Definition at line 3614 of file extconf.c.

References ast_exten::app, and NULL.

Referenced by ast_add_hint().

3615 {
3616  return e ? e->app : NULL;
3617 }
#define NULL
Definition: resample.c:96
const char * app
Definition: pbx.c:246

◆ ast_get_extension_name()

static const char* ast_get_extension_name ( struct ast_exten exten)
static

Definition at line 3619 of file extconf.c.

References ast_exten::exten, and NULL.

Referenced by ast_add_hint().

3620 {
3621  return exten ? exten->exten : NULL;
3622 }
#define NULL
Definition: resample.c:96
char * exten
Definition: pbx.c:238

◆ ast_include_find()

static struct ast_config_include* ast_include_find ( struct ast_config conf,
const char *  included_file 
)
static

Definition at line 1164 of file extconf.c.

References ast_variable_append(), ast_config_include::included_file, ast_config::includes, ast_config_include::next, and ast_channel::x.

Referenced by ast_include_new().

1165 {
1166  struct ast_config_include *x;
1167  for (x=conf->includes;x;x=x->next)
1168  {
1169  if (strcmp(x->included_file,included_file) == 0)
1170  return x;
1171  }
1172  return 0;
1173 }
struct ast_config_include * includes
Definition: main/config.c:258
char * included_file
file name included
Definition: main/config.c:278
struct ast_config_include * next
Definition: main/config.c:282

◆ ast_include_new()

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 
)
static

Definition at line 1075 of file extconf.c.

References ast_calloc, ast_include_find(), ast_log(), ast_strdup, ast_strlen_zero(), ast_config_include::exec, ast_config_include::exec_file, ast_config_include::include_location_file, ast_config_include::include_location_lineno, ast_config_include::included_file, ast_config::includes, ast_config_include::inclusion_count, LOG_WARNING, and ast_config_include::next.

Referenced by process_text_line().

1076 {
1077  /* a file should be included ONCE. Otherwise, if one of the instances is changed,
1078  then all be changed. -- how do we know to include it? -- Handling modified
1079  instances is possible, I'd have
1080  to create a new master for each instance. */
1081  struct ast_config_include *inc;
1082 
1083  inc = ast_include_find(conf, included_file);
1084  if (inc)
1085  {
1086  inc->inclusion_count++;
1087  snprintf(real_included_file_name, real_included_file_name_size, "%s~~%d", included_file, inc->inclusion_count);
1088  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);
1089  } else
1090  *real_included_file_name = 0;
1091 
1092  inc = ast_calloc(1,sizeof(struct ast_config_include));
1093  inc->include_location_file = ast_strdup(from_file);
1094  inc->include_location_lineno = from_lineno;
1095  if (!ast_strlen_zero(real_included_file_name))
1096  inc->included_file = ast_strdup(real_included_file_name);
1097  else
1099 
1100  inc->exec = is_exec;
1101  if (is_exec)
1102  inc->exec_file = ast_strdup(exec_file);
1103 
1104  /* attach this new struct to the conf struct */
1105  inc->next = conf->includes;
1106  conf->includes = inc;
1107 
1108  return inc;
1109 }
char * include_location_file
file name in which the include occurs
Definition: main/config.c:266
struct ast_config_include * includes
Definition: main/config.c:258
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
char * exec_file
if it&#39;s an exec, you&#39;ll have both the /var/tmp to read, and the original script
Definition: main/config.c:273
char * included_file
file name included
Definition: main/config.c:278
static force_inline int ast_strlen_zero(const char *s)
Definition: extconf.c:952
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
#define LOG_WARNING
Definition: extconf.c:139
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct ast_config_include * next
Definition: main/config.c:282
static struct ast_config_include * ast_include_find(struct ast_config *conf, const char *included_file)
Definition: extconf.c:1164

◆ ast_includes_destroy()

static void ast_includes_destroy ( struct ast_config_include incls)
static

Definition at line 1274 of file extconf.c.

References ast_config_include::exec_file, free(), ast_config_include::include_location_file, ast_config_include::included_file, and ast_config_include::next.

Referenced by ast_config_destroy().

1275 {
1276  struct ast_config_include *incl,*inclnext;
1277 
1278  for (incl=incls; incl; incl = inclnext) {
1279  inclnext = incl->next;
1280  if (incl->include_location_file)
1281  free(incl->include_location_file);
1282  if (incl->exec_file)
1283  free(incl->exec_file);
1284  if (incl->included_file)
1285  free(incl->included_file);
1286  free(incl);
1287  }
1288 }
char * include_location_file
file name in which the include occurs
Definition: main/config.c:266
char * exec_file
if it&#39;s an exec, you&#39;ll have both the /var/tmp to read, and the original script
Definition: main/config.c:273
void free()
char * included_file
file name included
Definition: main/config.c:278
struct ast_config_include * next
Definition: main/config.c:282

◆ ast_log()

static void ast_log ( int  level,
const char *  file,
int  line,
const char *  function,
const char *  fmt,
  ... 
)
static

◆ ast_log_backtrace()

void ast_log_backtrace ( void  )

Log a backtrace of the current thread's execution stack to the Asterisk log.

Definition at line 2158 of file logger.c.

References __LOG_ERROR, ast_bt::addresses, ast_bt_create, ast_bt_destroy, ast_bt_free_symbols, ast_bt_get_symbols, ast_free, ast_log(), ast_log_safe(), ast_str_append(), ast_str_buffer(), ast_str_create, AST_VECTOR_GET, AST_VECTOR_SIZE, buf, LOG_ERROR, LOG_WARNING, NULL, and ast_bt::num_frames.

2159 {
2160 #ifdef HAVE_BKTR
2161  struct ast_bt *bt;
2162  int i = 0;
2163  struct ast_vector_string *strings;
2164 
2165  if (!(bt = ast_bt_create())) {
2166  ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
2167  return;
2168  }
2169 
2170  if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
2171  int count = AST_VECTOR_SIZE(strings);
2172  struct ast_str *buf = ast_str_create(bt->num_frames * 64);
2173 
2174  if (buf) {
2175  ast_str_append(&buf, 0, "Got %d backtrace record%c\n", count - 3, count - 3 != 1 ? 's' : ' ');
2176  for (i = 3; i < AST_VECTOR_SIZE(strings); i++) {
2177  ast_str_append(&buf, 0, "#%2d: %s\n", i - 3, AST_VECTOR_GET(strings, i));
2178  }
2179  ast_log_safe(__LOG_ERROR, NULL, 0, NULL, "%s\n", ast_str_buffer(buf));
2180  ast_free(buf);
2181  }
2182 
2183  ast_bt_free_symbols(strings);
2184  } else {
2185  ast_log(LOG_ERROR, "Could not allocate memory for backtrace\n");
2186  }
2187  ast_bt_destroy(bt);
2188 #else
2189  ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
2190 #endif /* defined(HAVE_BKTR) */
2191 }
#define ast_bt_free_symbols(string_vector)
Definition: backtrace.h:42
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define LOG_WARNING
Definition: logger.h:274
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
#define ast_bt_get_symbols(addresses, num_frames)
Definition: backtrace.h:41
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
#define ast_bt_destroy(bt)
Definition: backtrace.h:40
#define __LOG_ERROR
Definition: logger.h:284
#define NULL
Definition: resample.c:96
void ast_log_safe(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message with protection against recursion.
Definition: logger.c:2123
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
#define ast_bt_create()
Definition: backtrace.h:39
#define ast_free(a)
Definition: astmm.h:182
void * addresses[AST_MAX_BT_FRAMES]
Definition: backtrace.h:52
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:2101
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:682
int num_frames
Definition: backtrace.h:54
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:611
#define ast_str_create(init_len)
Create a malloc&#39;ed dynamic length string.
Definition: strings.h:620

◆ ast_mark_lock_failed()

void ast_mark_lock_failed ( void *  lock_addr)

Mark the last lock as failed (trylock)

Definition at line 2314 of file extconf.c.

Referenced by __ast_pthread_mutex_trylock(), __ast_rwlock_tryrdlock(), __ast_rwlock_trywrlock(), and ast_tvsub().

2315 {
2316  /* Pretend to do something. */
2317 }

◆ ast_merge_contexts_and_delete()

static void ast_merge_contexts_and_delete ( struct ast_context **  extcontexts,
const char *  registrar 
)
static

Definition at line 5573 of file extconf.c.

References __ast_context_destroy(), ast_log(), ast_unlock_contexts(), ast_wrlock_contexts(), contexts, LOG_DEBUG, LOG_WARNING, ast_context::name, ast_context::next, NULL, ast_context::registrar, and tmp().

Referenced by localized_merge_contexts_and_delete(), and localized_pbx_load_module().

5574 {
5575  struct ast_context *tmp, *lasttmp = NULL;
5576 
5577  /* it is very important that this function hold the hint list lock _and_ the conlock
5578  during its operation; not only do we need to ensure that the list of contexts
5579  and extensions does not change, but also that no hint callbacks (watchers) are
5580  added or removed during the merge/delete process
5581 
5582  in addition, the locks _must_ be taken in this order, because there are already
5583  other code paths that use this order
5584  */
5586 
5587  tmp = *extcontexts;
5588  if (registrar) {
5589  /* XXX remove previous contexts from same registrar */
5590  if (option_debug)
5591  ast_log(LOG_DEBUG, "must remove any reg %s\n", registrar);
5593  while (tmp) {
5594  lasttmp = tmp;
5595  tmp = tmp->next;
5596  }
5597  } else {
5598  /* XXX remove contexts with the same name */
5599  while (tmp) {
5600  ast_log(LOG_WARNING, "must remove %s reg %s\n", tmp->name, tmp->registrar);
5601  __ast_context_destroy(tmp,tmp->registrar);
5602  lasttmp = tmp;
5603  tmp = tmp->next;
5604  }
5605  }
5606  if (lasttmp) {
5607  lasttmp->next = contexts;
5608  contexts = *extcontexts;
5609  *extcontexts = NULL;
5610  } else
5611  ast_log(LOG_WARNING, "Requested contexts didn't get merged\n");
5612 
5614 
5615  return;
5616 }
int option_debug
Definition: options.c:69
static struct ast_context * contexts
Definition: extconf.c:3599
static int tmp()
Definition: bt_open.c:389
#define NULL
Definition: resample.c:96
struct ast_context * next
Definition: pbx.c:289
static int ast_unlock_contexts(void)
Definition: extconf.c:4616
char * registrar
Definition: pbx.c:293
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
#define LOG_WARNING
Definition: extconf.c:139
char name[0]
Definition: pbx.c:297
static char * registrar
Definition: pbx_ael.c:78
#define LOG_DEBUG
Definition: extconf.c:121
static void __ast_context_destroy(struct ast_context *con, const char *registrar)
Definition: extconf.c:5504
static int ast_wrlock_contexts(void)
Definition: extconf.c:4611
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_mutex_init()

static int ast_mutex_init ( ast_mutex_t pmutex)
inlinestatic

Definition at line 469 of file extconf.c.

References AST_MUTEX_KIND, and pthread_mutex_init.

Referenced by __ast_context_create().

470 {
471  pthread_mutexattr_t attr;
472 
473  pthread_mutexattr_init(&attr);
474  pthread_mutexattr_settype(&attr, AST_MUTEX_KIND);
475 
476  return pthread_mutex_init(pmutex, &attr);
477 }
#define pthread_mutex_init
Definition: extconf.c:501
#define AST_MUTEX_KIND
Definition: extconf.c:194

◆ ast_process_quotes_and_slashes()

static char* ast_process_quotes_and_slashes ( char *  start,
char  find,
char  replace_with 
)
static

Definition at line 2219 of file extconf.c.

Referenced by pbx_load_config().

2220 {
2221  char *dataPut = start;
2222  int inEscape = 0;
2223  int inQuotes = 0;
2224 
2225  for (; *start; start++) {
2226  if (inEscape) {
2227  *dataPut++ = *start; /* Always goes verbatim */
2228  inEscape = 0;
2229  } else {
2230  if (*start == '\\') {
2231  inEscape = 1; /* Do not copy \ into the data */
2232  } else if (*start == '\'') {
2233  inQuotes = 1 - inQuotes; /* Do not copy ' into the data */
2234  } else {
2235  /* Replace , with |, unless in quotes */
2236  *dataPut++ = inQuotes ? *start : ((*start == find) ? replace_with : *start);
2237  }
2238  }
2239  }
2240  if (start != dataPut)
2241  *dataPut = 0;
2242  return dataPut;
2243 }

◆ ast_queue_log()

void ast_queue_log ( const char *  queuename,
const char *  callid,
const char *  agent,
const char *  event,
const char *  fmt,
  ... 
)

Definition at line 894 of file logger.c.

References args, AST_APP_ARG, ast_check_realtime(), AST_DECLARE_APP_ARGS, ast_localtime(), AST_NONSTANDARD_APP_ARGS, ast_realtime_require_field(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_store_realtime(), ast_strftime(), ast_tvnow(), logfiles, logger_initialized, logger_queue_start(), NULL, queuelog_init, RQ_CHAR, S_OR, and SENTINEL.

Referenced by logger_queue_start(), and reload_logger().

895 {
896  va_list ap;
897  struct timeval tv;
898  struct ast_tm tm;
899  char qlog_msg[8192];
900  int qlog_len;
901  char time_str[30];
902 
903  if (!logger_initialized) {
904  /* You are too early. We are not open yet! */
905  return;
906  }
907  if (!queuelog_init) {
908  /* We must initialize now since someone is trying to log something. */
910  }
911 
912  if (ast_check_realtime("queue_log")) {
913  tv = ast_tvnow();
914  ast_localtime(&tv, &tm, logfiles.queue_log_realtime_use_gmt ? "GMT" : NULL);
915  ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
916  va_start(ap, fmt);
917  vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
918  va_end(ap);
919  if (logfiles.queue_adaptive_realtime) {
921  AST_APP_ARG(data)[5];
922  );
923  AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
924  /* Ensure fields are large enough to receive data */
925  ast_realtime_require_field("queue_log",
926  "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
927  "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
928  "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
929  "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
930  "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
931  SENTINEL);
932 
933  /* Store the log */
934  ast_store_realtime("queue_log", "time", time_str,
935  "callid", callid,
936  "queuename", queuename,
937  "agent", agent,
938  "event", event,
939  "data1", S_OR(args.data[0], ""),
940  "data2", S_OR(args.data[1], ""),
941  "data3", S_OR(args.data[2], ""),
942  "data4", S_OR(args.data[3], ""),
943  "data5", S_OR(args.data[4], ""),
944  SENTINEL);
945  } else {
946  ast_store_realtime("queue_log", "time", time_str,
947  "callid", callid,
948  "queuename", queuename,
949  "agent", agent,
950  "event", event,
951  "data", qlog_msg,
952  SENTINEL);
953  }
954 
955  if (!logfiles.queue_log_to_file) {
956  return;
957  }
958  }
959 
960  if (qlog) {
961  va_start(ap, fmt);
962  qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
963  vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
964  va_end(ap);
966  if (qlog) {
967  fprintf(qlog, "%s\n", qlog_msg);
968  fflush(qlog);
969  }
971  }
972 }
static int queuelog_init
Definition: logger.c:86
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1739
int ast_check_realtime(const char *family)
Check if realtime engine is configured for family.
Definition: main/config.c:3363
Definition: astman.c:222
void logger_queue_start(void)
Start the ast_queue_log() logger.
Definition: logger.c:1854
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
const char * args
#define NULL
Definition: resample.c:96
static FILE * qlog
Definition: logger.c:193
static int logger_initialized
Definition: logger.c:87
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define SENTINEL
Definition: compiler.h:87
int ast_store_realtime(const char *family,...) attribute_sentinel
Create realtime configuration.
Definition: main/config.c:3570
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
Definition: main/config.c:3382
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the &#39;nonstandard&#39; argument separation process for an application.
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2524
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application&#39;s arguments.
static struct @403 logfiles
#define AST_APP_ARG(name)
Define an application argument.

◆ ast_remove_hint()

static int ast_remove_hint ( struct ast_exten e)
static

ast_remove_hint: Remove hint from extension

Definition at line 3735 of file extconf.c.

References AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, ast_hint::callbacks, ast_hint::exten, free(), ast_state_cb::next, and NULL.

Referenced by destroy_exten().

3736 {
3737  /* Cleanup the Notifys if hint is removed */
3738  struct ast_hint *hint;
3739  struct ast_state_cb *cblist, *cbprev;
3740  int res = -1;
3741 
3742  if (!e)
3743  return -1;
3744 
3745  AST_RWLIST_TRAVERSE_SAFE_BEGIN(&hints, hint, list) {
3746  if (hint->exten == e) {
3747  cbprev = NULL;
3748  cblist = hint->callbacks;
3749  while (cblist) {
3750  /* Notify with -1 and remove all callbacks */
3751  cbprev = cblist;
3752  cblist = cblist->next;
3753  free(cbprev);
3754  }
3755  hint->callbacks = NULL;
3757  free(hint);
3758  res = 0;
3759  break;
3760  }
3761  }
3763 
3764  return res;
3765 }
struct ast_state_cb * next
Definition: pbx.c:313
ast_state_cb: An extension state notify register item
Definition: pbx.c:301
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: extconf.c:1877
#define NULL
Definition: resample.c:96
void free()
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: extconf.c:1824
struct ast_exten * exten
Hint extension.
Definition: pbx.c:331
#define AST_RWLIST_REMOVE_CURRENT
Definition: extconf.c:1847
Structure for dial plan hints.
Definition: pbx.c:324
struct ao2_container * callbacks
Definition: pbx.c:332

◆ ast_replace_sigchld()

void ast_replace_sigchld ( void  )

Replace the SIGCHLD handler.

Normally, Asterisk has a SIGCHLD handler that is cleaning up all zombie processes from forking elsewhere in Asterisk. However, if you want to wait*() on the process to retrieve information about it's exit status, then this signal handler needs to be temporarily replaced.

Code that executes this function must call ast_unreplace_sigchld() after it is finished doing the wait*().

Definition at line 801 of file extconf.c.

References ast_unreplace_sigchld(), and safe_system_prev_handler.

Referenced by ast_safe_fork(), and ast_safe_system().

802 {
803  unsigned int level;
804 
805  level = safe_system_level++;
806 
807  /* only replace the handler if it has not already been done */
808  if (level == 0) {
809  sigaction(SIGCHLD, &null_sig_handler, &safe_system_prev_handler);
810  }
811 }
static struct sigaction null_sig_handler
Definition: extconf.c:794
static unsigned int safe_system_level
Keep track of how many threads are currently trying to wait*() on a child process.
Definition: extconf.c:785
static struct sigaction safe_system_prev_handler
Definition: extconf.c:786

◆ ast_rwlock_destroy()

static int ast_rwlock_destroy ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 529 of file extconf.c.

Referenced by __ast_context_destroy().

530 {
531  return pthread_rwlock_destroy(prwlock);
532 }

◆ ast_rwlock_init()

static int ast_rwlock_init ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 516 of file extconf.c.

Referenced by __ast_context_create().

517 {
518  pthread_rwlockattr_t attr;
519 
520  pthread_rwlockattr_init(&attr);
521 
522 #ifdef HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NP
523  pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP);
524 #endif
525 
526  return pthread_rwlock_init(prwlock, &attr);
527 }

◆ ast_rwlock_rdlock()

static int ast_rwlock_rdlock ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 539 of file extconf.c.

Referenced by pbx_retrieve_variable().

540 {
541  return pthread_rwlock_rdlock(prwlock);
542 }

◆ ast_rwlock_unlock()

static int ast_rwlock_unlock ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 534 of file extconf.c.

Referenced by ast_unlock_context(), ast_unlock_contexts(), and pbx_retrieve_variable().

535 {
536  return pthread_rwlock_unlock(prwlock);
537 }

◆ ast_rwlock_wrlock()

static int ast_rwlock_wrlock ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 544 of file extconf.c.

Referenced by ast_wrlock_context(), and ast_wrlock_contexts().

545 {
546  return pthread_rwlock_wrlock(prwlock);
547 }

◆ ast_safe_system()

int ast_safe_system ( const char *  s)

Safely spawn an OS shell command while closing file descriptors.

Note
This replaces the system call in all Asterisk modules
Parameters
s- OS shell command string to execute.
Warning
Command injection can happen using this call if the passed in string is created using untrusted data from an external source. It is best not to use untrusted data. However, the caller could filter out dangerous characters to avoid command injection.

Definition at line 829 of file extconf.c.

References ast_log(), ast_replace_sigchld(), ast_unreplace_sigchld(), errno, LOG_WARNING, NULL, status, WEXITSTATUS, WIFEXITED, and ast_channel::x.

Referenced by add_email_attachment(), alarmreceiver_exec(), ast_monitor_stop(), AST_TEST_DEFINE(), ast_unreplace_sigchld(), convert_bdb_to_sqlite3(), mixmonitor_thread(), notify_message(), process_text_line(), rotate_file(), run_externnotify(), sendmail(), sendpage(), system_exec_helper(), and vm_change_password_shell().

830 {
831  pid_t pid;
832 #ifdef HAVE_WORKING_FORK
833  int x;
834 #endif
835  int res;
836  int status;
837 
838 #if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
840 
841 #ifdef HAVE_WORKING_FORK
842  pid = fork();
843 #else
844  pid = vfork();
845 #endif
846 
847  if (pid == 0) {
848 #ifdef HAVE_WORKING_FORK
849  /* Close file descriptors and launch system command */
850  for (x = STDERR_FILENO + 1; x < 4096; x++)
851  close(x);
852 #endif
853  execl("/bin/sh", "/bin/sh", "-c", s, (char *) NULL);
854  _exit(1);
855  } else if (pid > 0) {
856  for(;;) {
857  res = waitpid(pid, &status, 0);
858  if (res > -1) {
859  res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
860  break;
861  } else if (errno != EINTR)
862  break;
863  }
864  } else {
865  ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(errno));
866  res = -1;
867  }
868 
870 #else
871  res = -1;
872 #endif
873 
874  return res;
875 }
void ast_unreplace_sigchld(void)
Restore the SIGCHLD handler.
Definition: extconf.c:815
void ast_replace_sigchld(void)
Replace the SIGCHLD handler.
Definition: extconf.c:801
#define NULL
Definition: resample.c:96
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2195
#define LOG_WARNING
Definition: extconf.c:139
int errno
#define WEXITSTATUS(status)
#define WIFEXITED(status)
jack_status_t status
Definition: app_jack.c:146

◆ ast_shrink_phone_number()

static void ast_shrink_phone_number ( char *  n)
static

Clean up phone string remove '(', ' ', ')', non-trailing '.', and '-' not in square brackets. Basically, remove anything that could be invalid in a pattern.

Definition at line 2137 of file extconf.c.

References ast_channel::x.

Referenced by pbx_load_config().

2138 {
2139  int x, y=0;
2140  int bracketed = 0;
2141 
2142  for (x=0; n[x]; x++) {
2143  switch(n[x]) {
2144  case '[':
2145  bracketed++;
2146  n[y++] = n[x];
2147  break;
2148  case ']':
2149  bracketed--;
2150  n[y++] = n[x];
2151  break;
2152  case '-':
2153  if (bracketed)
2154  n[y++] = n[x];
2155  break;
2156  case '.':
2157  if (!n[x+1])
2158  n[y++] = n[x];
2159  break;
2160  default:
2161  if (!strchr("()", n[x]))
2162  n[y++] = n[x];
2163  }
2164  }
2165  n[y] = '\0';
2166 }

◆ ast_skip_blanks()

char* ast_skip_blanks ( const char *  str)

Definition at line 979 of file extconf.c.

References str.

Referenced by ast_trim_blanks(), pbx_load_config(), and process_text_line().

989 {

◆ ast_strip()

char* ast_strip ( char *  s)

Strip leading/trailing whitespace from a string.

Parameters
sThe string to be stripped (will be modified).
Returns
The stripped string.

This functions strips all leading and trailing whitespace characters from the input string, and returns a pointer to the resulting string. The string is modified in place.

Definition at line 1024 of file extconf.c.

Referenced by config_text_file_load(), and process_text_line().

1029 {

◆ ast_strlen_zero()

static force_inline int ast_strlen_zero ( const char *  s)
static

◆ ast_trim_blanks()

char* ast_trim_blanks ( char *  str)

Trims trailing whitespace characters from a string.

Parameters
ast_trim_blanksfunction being used
strthe input string
Returns
a pointer to the modified string

Definition at line 1005 of file extconf.c.

References ast_skip_blanks().

1018 {

◆ ast_true()

static int ast_true ( const char *  s)
static

Definition at line 2245 of file extconf.c.

References ast_strlen_zero().

Referenced by pbx_load_config().

2246 {
2247  if (ast_strlen_zero(s))
2248  return 0;
2249 
2250  /* Determine if this is a true value */
2251  if (!strcasecmp(s, "yes") ||
2252  !strcasecmp(s, "true") ||
2253  !strcasecmp(s, "y") ||
2254  !strcasecmp(s, "t") ||
2255  !strcasecmp(s, "1") ||
2256  !strcasecmp(s, "on"))
2257  return -1;
2258 
2259  return 0;
2260 }
static force_inline int ast_strlen_zero(const char *s)
Definition: extconf.c:952

◆ ast_tvadd()

struct timeval ast_tvadd ( struct timeval  a,
struct timeval  b 
)

Returns the sum of two timevals a + b.

Definition at line 2283 of file extconf.c.

References a, ONE_MILLION, and tvfix().

Referenced by __get_from_jb(), acf_jabberreceive_read(), ast_audiohook_trigger_wait(), ast_bridge_channel_feature_digit(), ast_bridge_interval_hook(), ast_channel_cmpwhentohangup_tv(), ast_channel_setwhentohangup_tv(), ast_poll2(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_end_with_duration(), ast_rtp_ice_turn_request(), ast_rtp_sendcng(), ast_sched_runq(), ast_sip_sched_task_get_times2(), ast_sip_schedule_task(), ast_smoother_read(), AST_TEST_DEFINE(), ast_translate(), bridge_builtin_set_limits(), bridge_channel_handle_interval(), bridge_sync_wait(), calc_rxstamp(), calc_timestamp(), cli_show_tasks(), cli_tps_ping(), conf_run(), consumer_should_stay(), dial_exec_full(), do_cdr(), do_timing(), drop_packets_data_update(), expire_objects_from_cache(), handle_keepalive_message(), handler_wait_for_message(), hook_event_cb(), iax2_process_thread(), ice_reset_session(), jb_get_and_deliver(), jitterbuffer_frame_get_ntp_timestamp(), make_deadline(), mb_poll_thread(), monmp3thread(), mp3_exec(), mwi_monitor_handler(), NBScat_exec(), register_aor_core(), rtp_deallocate_transport(), run_task(), sched_run(), sched_settime(), schedule_cache_expiration(), schedule_delivery(), set_timeout(), sla_process_timers(), smdi_message_wait(), sorcery_memory_cache_print_object(), subscription_persistence_update(), timeout_write(), user_event_wait_for_events(), and wait_for_stimulus().

2284 {
2285  /* consistency checks to guarantee usec in 0..999999 */
2286  a = tvfix(a);
2287  b = tvfix(b);
2288  a.tv_sec += b.tv_sec;
2289  a.tv_usec += b.tv_usec;
2290  if (a.tv_usec >= ONE_MILLION) {
2291  a.tv_sec++;
2292  a.tv_usec -= ONE_MILLION;
2293  }
2294  return a;
2295 }
static struct timeval tvfix(struct timeval a)
Definition: extconf.c:2267
static struct test_val b
#define ONE_MILLION
Definition: extconf.c:2262
static struct test_val a

◆ ast_tvnow()

struct timeval ast_tvnow ( void  )

Definition at line 5674 of file extconf.c.

References NULL.

5675 {
5676  struct timeval t;
5677  gettimeofday(&t, NULL);
5678  return t;
5679 }
#define NULL
Definition: resample.c:96

◆ ast_tvsub()

struct timeval ast_tvsub ( struct timeval  a,
struct timeval  b 
)

Returns the difference of two timevals a - b.

Definition at line 2298 of file extconf.c.

References a, ast_mark_lock_failed(), ONE_MILLION, and tvfix().

Referenced by action_login(), ast_poll2(), ast_sched_dump(), AST_TEST_DEFINE(), ast_translate(), ast_waitfor_nandfds(), calc_rxstamp(), calc_timestamp(), cli_tps_ping(), conf_run(), debug_check_frame_for_silence(), handle_showcalls(), handle_showuptime(), jitterbuffer_frame_get_ntp_timestamp(), memory_cache_stale_check_object(), object_stale_callback(), and publish_fully_booted().

2299 {
2300  /* consistency checks to guarantee usec in 0..999999 */
2301  a = tvfix(a);
2302  b = tvfix(b);
2303  a.tv_sec -= b.tv_sec;
2304  a.tv_usec -= b.tv_usec;
2305  if (a.tv_usec < 0) {
2306  a.tv_sec-- ;
2307  a.tv_usec += ONE_MILLION;
2308  }
2309  return a;
2310 }
static struct timeval tvfix(struct timeval a)
Definition: extconf.c:2267
static struct test_val b
#define ONE_MILLION
Definition: extconf.c:2262
static struct test_val a

◆ ast_unlock_context()

static int ast_unlock_context ( struct ast_context con)
static

Definition at line 4626 of file extconf.c.

References ast_context_add_switch2(), ast_rwlock_unlock(), and ast_context::lock.

Referenced by __ast_context_destroy().

4627 {
4628  return ast_rwlock_unlock(&con->lock);
4629 }
ast_rwlock_t lock
Definition: pbx.c:285
static int ast_rwlock_unlock(ast_rwlock_t *prwlock)
Definition: extconf.c:534

◆ ast_unlock_contexts()

static int ast_unlock_contexts ( void  )
static

Definition at line 4616 of file extconf.c.

References ast_rwlock_unlock(), and conlock.

Referenced by __ast_context_create(), ast_merge_contexts_and_delete(), and localized_context_destroy().

4617 {
4618  return ast_rwlock_unlock(&conlock);
4619 }
static ast_rwlock_t conlock
Definition: extconf.c:4484
static int ast_rwlock_unlock(ast_rwlock_t *prwlock)
Definition: extconf.c:534

◆ ast_unreplace_sigchld()

void ast_unreplace_sigchld ( void  )

Restore the SIGCHLD handler.

This function is called after a call to ast_replace_sigchld. It restores the SIGCHLD handler that cleans up any zombie processes.

Definition at line 815 of file extconf.c.

References ast_safe_system(), NULL, safe_system_level, and safe_system_prev_handler.

Referenced by ast_replace_sigchld(), ast_safe_fork_cleanup(), ast_safe_system(), and AST_TEST_DEFINE().

816 {
817  unsigned int level;
818 
819  level = --safe_system_level;
820 
821  /* only restore the handler if we are the last one */
822  if (level == 0) {
823  sigaction(SIGCHLD, &safe_system_prev_handler, NULL);
824  }
825 }
#define NULL
Definition: resample.c:96
static unsigned int safe_system_level
Keep track of how many threads are currently trying to wait*() on a child process.
Definition: extconf.c:785
static struct sigaction safe_system_prev_handler
Definition: extconf.c:786

◆ ast_var_assign()

static struct ast_var_t * ast_var_assign ( const char *  name,
const char *  value 
)
static

Definition at line 2456 of file extconf.c.

References ast_calloc, ast_copy_string(), ast_var_t::name, NULL, ast_var_t::value, and var.

Referenced by pbx_builtin_setvar_helper().

2457 {
2458  struct ast_var_t *var;
2459  int name_len = strlen(name) + 1;
2460  int value_len = strlen(value) + 1;
2461 
2462  if (!(var = ast_calloc(sizeof(*var) + name_len + value_len, sizeof(char)))) {
2463  return NULL;
2464  }
2465 
2466  ast_copy_string(var->name, name, name_len);
2467  var->value = var->name + name_len;
2468  ast_copy_string(var->value, value, value_len);
2469 
2470  return var;
2471 }
void ast_copy_string(char *dst, const char *src, size_t size)
Definition: extconf.c:970
#define var
Definition: ast_expr2f.c:614
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
char name[0]
Definition: chanvars.h:31
char * value
Definition: chanvars.h:30
static const char name[]
Definition: cdr_mysql.c:74
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204

◆ ast_var_delete()

static void ast_var_delete ( struct ast_var_t var)
static

Definition at line 2473 of file extconf.c.

References free().

Referenced by pbx_builtin_setvar_helper().

2474 {
2475  free(var);
2476 }
void free()

◆ ast_var_name()

static const char* ast_var_name ( const struct ast_var_t var)
static

Definition at line 2171 of file extconf.c.

References ast_var_t::name, ast_channel::name, and NULL.

Referenced by pbx_builtin_setvar_helper(), and pbx_retrieve_variable().

2172 {
2173  const char *name;
2174 
2175  if (var == NULL || (name = var->name) == NULL)
2176  return NULL;
2177  /* Return the name without the initial underscores */
2178  if (name[0] == '_') {
2179  name++;
2180  if (name[0] == '_')
2181  name++;
2182  }
2183  return name;
2184 }
#define NULL
Definition: resample.c:96
char name[0]
Definition: chanvars.h:31
static const char name[]
Definition: cdr_mysql.c:74

◆ ast_var_value()

static const char* ast_var_value ( const struct ast_var_t var)
static

Definition at line 5028 of file extconf.c.

References NULL, and ast_var_t::value.

Referenced by pbx_retrieve_variable().

5029 {
5030  return (var ? var->value : NULL);
5031 }
#define NULL
Definition: resample.c:96
char * value
Definition: chanvars.h:30

◆ ast_variable_append()

static void ast_variable_append ( struct ast_category category,
struct ast_variable variable 
)
static

Definition at line 1178 of file extconf.c.

References category_get(), config, ast_category::ignored, ast_category::last, ast_variable::next, and ast_category::root.

Referenced by ast_include_find(), inherit_category(), move_variables(), and process_text_line().

1179 {
1180  if (!variable)
1181  return;
1182  if (category->last)
1183  category->last->next = variable;
1184  else
1185  category->root = variable;
1186  category->last = variable;
1187  while (category->last->next)
1188  category->last = category->last->next;
1189 }
struct ast_variable * next
struct ast_variable * root
Definition: main/config.c:240
struct ast_variable * last
Definition: main/config.c:242

◆ ast_variable_browse()

static struct ast_variable* ast_variable_browse ( const struct ast_config config,
const char *  category 
)
static

Definition at line 1216 of file extconf.c.

References ast_category_get(), ast_config::last_browse, ast_category::name, NULL, and ast_category::root.

Referenced by ast_variable_retrieve(), and pbx_load_config().

1217 {
1218  struct ast_category *cat = NULL;
1219 
1220  if (category && config->last_browse && (config->last_browse->name == category))
1221  cat = config->last_browse;
1222  else
1223  cat = ast_category_get(config, category);
1224 
1225  return (cat) ? cat->root : NULL;
1226 }
#define NULL
Definition: resample.c:96
static struct ast_category * ast_category_get(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1211
struct ast_variable * root
Definition: main/config.c:240
struct ast_category * last_browse
Definition: main/config.c:255
char name[80]
Definition: main/config.c:226

◆ ast_variable_new()

static struct ast_variable * ast_variable_new ( const char *  name,
const char *  value,
const char *  filename