Asterisk - The Open Source Telephony Project GIT-master-7e7a603
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 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_SOUNDS_SEARCH_CUSTOM = (1 << 19) ,
  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)
 
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
 
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
 
static struct hints hints = { .first = NULL, .last = NULL, .lock = PTHREAD_RWLOCK_INITIALIZER , }
 
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 extensions.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 1358 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 1362 of file extconf.c.

◆ AST_FILENAME_MAX

#define AST_FILENAME_MAX   80

Definition at line 1359 of file extconf.c.

◆ ast_fully_booted

#define ast_fully_booted   ast_test_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED)

Definition at line 1375 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 1995 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 1733 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

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;
}
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
Definition: linkedlists.h:410

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

Definition at line 1694 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 1705 of file extconf.c.

◆ AST_LIST_HEAD

#define AST_LIST_HEAD (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
ast_mutex_t lock; \
}
struct sla_ringing_trunk * first
Definition: app_sla.c:332
ast_mutex_t lock
Definition: app_sla.c:331
struct sla_ringing_trunk * last
Definition: app_sla.c:332
static const char name[]
Definition: format_mp3.c:68

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;
#define AST_LIST_HEAD(name, type)
Defines a structure to be used to hold a list of specified type.
Definition: linkedlists.h:173
Definition: search.h:40

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 1457 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

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 1885 of file extconf.c.

◆ AST_LIST_HEAD_INIT_NOLOCK

#define AST_LIST_HEAD_INIT_NOLOCK (   head)
Value:
{ \
(head)->first = NULL; \
(head)->last = NULL; \
}

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 1926 of file extconf.c.

◆ AST_LIST_HEAD_INIT_VALUE

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

Defines initial values for a declaration of AST_LIST_HEAD.

Definition at line 1518 of file extconf.c.

◆ AST_LIST_HEAD_NOLOCK

#define AST_LIST_HEAD_NOLOCK (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
}

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:

#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
Definition: linkedlists.h:225

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 1509 of file extconf.c.

◆ AST_LIST_HEAD_NOLOCK_INIT_VALUE

#define AST_LIST_HEAD_NOLOCK_INIT_VALUE
Value:
{ \
.first = NULL, \
.last = NULL, \
}

Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK.

Definition at line 1536 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; \
#define AST_LIST_HEAD_NOLOCK_INIT_VALUE
Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK.
Definition: extconf.c:1536

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

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

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 1672 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; \
#define AST_LIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_LIST_HEAD.
Definition: extconf.c:1518

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:

#define AST_LIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
Definition: linkedlists.h:291

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

Definition at line 1575 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 1940 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 1858 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 1956 of file extconf.c.

◆ 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 1976 of file extconf.c.

◆ 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 1713 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 1723 of file extconf.c.

◆ 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 2037 of file extconf.c.

◆ 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 1836 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 2016 of file extconf.c.

◆ 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)
}
size_t current
Definition: main/cli.c:113
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 1773 of file extconf.c.

◆ 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)
}
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615

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 1811 of file extconf.c.

◆ AST_LIST_TRAVERSE_SAFE_END

#define AST_LIST_TRAVERSE_SAFE_END   }

Closes a safe loop traversal block.

Definition at line 1874 of file extconf.c.

◆ AST_MAX_EXTENSION

#define AST_MAX_EXTENSION   80

Max length of an extension

Definition at line 2078 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.

◆ ast_opt_always_fork

#define ast_opt_always_fork   ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)

Definition at line 1385 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 1379 of file extconf.c.

◆ ast_opt_console

#define ast_opt_console   ast_test_flag(&ast_options, AST_OPT_FLAG_CONSOLE)

Definition at line 1369 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 1384 of file extconf.c.

◆ ast_opt_dump_core

#define ast_opt_dump_core   ast_test_flag(&ast_options, AST_OPT_FLAG_DUMP_CORE)

Definition at line 1378 of file extconf.c.

◆ ast_opt_exec

#define ast_opt_exec   ast_test_flag(&ast_options, AST_OPT_FLAG_EXEC)

Definition at line 1373 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 1366 of file extconf.c.

◆ ast_opt_high_priority

#define ast_opt_high_priority   ast_test_flag(&ast_options, AST_OPT_FLAG_HIGH_PRIORITY)

Definition at line 1370 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 1371 of file extconf.c.

◆ ast_opt_mute

#define ast_opt_mute   ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE)

Definition at line 1386 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 1374 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 1367 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 1381 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 1377 of file extconf.c.

◆ ast_opt_quiet

#define ast_opt_quiet   ast_test_flag(&ast_options, AST_OPT_FLAG_QUIET)

Definition at line 1368 of file extconf.c.

◆ ast_opt_reconnect

#define ast_opt_reconnect   ast_test_flag(&ast_options, AST_OPT_FLAG_RECONNECT)

Definition at line 1382 of file extconf.c.

◆ ast_opt_remote

#define ast_opt_remote   ast_test_flag(&ast_options, AST_OPT_FLAG_REMOTE)

Definition at line 1372 of file extconf.c.

◆ ast_opt_timestamp

#define ast_opt_timestamp   ast_test_flag(&ast_options, AST_OPT_FLAG_TIMESTAMP)

Definition at line 1380 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 1376 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 1383 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 2005 of file extconf.c.

◆ AST_RWLIST_EMPTY

#define AST_RWLIST_EMPTY   AST_LIST_EMPTY

Definition at line 1735 of file extconf.c.

◆ AST_RWLIST_ENTRY

#define AST_RWLIST_ENTRY   AST_LIST_ENTRY

Definition at line 1699 of file extconf.c.

◆ AST_RWLIST_FIRST

#define AST_RWLIST_FIRST   AST_LIST_FIRST

Definition at line 1707 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; \
}

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;
#define AST_RWLIST_HEAD(name, type)
Defines a structure to be used to hold a read/write list of specified type.
Definition: linkedlists.h:199

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 1483 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); \
}

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 1912 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); \
}

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 1898 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

Defines initial values for a declaration of AST_RWLIST_HEAD.

Definition at line 1527 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)

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 1658 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; \
#define AST_RWLIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_RWLIST_HEAD.
Definition: extconf.c:1527

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:

#define AST_RWLIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a read/write list of specified type, statically initialized.
Definition: linkedlists.h:333

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

Definition at line 1617 of file extconf.c.

◆ AST_RWLIST_INSERT_AFTER

#define AST_RWLIST_INSERT_AFTER   AST_LIST_INSERT_AFTER

Definition at line 1947 of file extconf.c.

◆ AST_RWLIST_INSERT_BEFORE_CURRENT

#define AST_RWLIST_INSERT_BEFORE_CURRENT   AST_LIST_INSERT_BEFORE_CURRENT

Definition at line 1869 of file extconf.c.

◆ AST_RWLIST_INSERT_HEAD

#define AST_RWLIST_INSERT_HEAD   AST_LIST_INSERT_HEAD

Definition at line 1963 of file extconf.c.

◆ AST_RWLIST_INSERT_TAIL

#define AST_RWLIST_INSERT_TAIL   AST_LIST_INSERT_TAIL

Definition at line 1986 of file extconf.c.

◆ AST_RWLIST_LAST

#define AST_RWLIST_LAST   AST_LIST_LAST

Definition at line 1715 of file extconf.c.

◆ AST_RWLIST_NEXT

#define AST_RWLIST_NEXT   AST_LIST_NEXT

Definition at line 1725 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 1424 of file extconf.c.

◆ AST_RWLIST_REMOVE

#define AST_RWLIST_REMOVE   AST_LIST_REMOVE

Definition at line 2055 of file extconf.c.

◆ AST_RWLIST_REMOVE_CURRENT

#define AST_RWLIST_REMOVE_CURRENT   AST_LIST_REMOVE_CURRENT

Definition at line 1846 of file extconf.c.

◆ AST_RWLIST_REMOVE_HEAD

#define AST_RWLIST_REMOVE_HEAD   AST_LIST_REMOVE_HEAD

Definition at line 2027 of file extconf.c.

◆ AST_RWLIST_TRAVERSE

#define AST_RWLIST_TRAVERSE   AST_LIST_TRAVERSE

Definition at line 1776 of file extconf.c.

◆ AST_RWLIST_TRAVERSE_SAFE_BEGIN

#define AST_RWLIST_TRAVERSE_SAFE_BEGIN   AST_LIST_TRAVERSE_SAFE_BEGIN

Definition at line 1823 of file extconf.c.

◆ AST_RWLIST_TRAVERSE_SAFE_END

#define AST_RWLIST_TRAVERSE_SAFE_END   AST_LIST_TRAVERSE_SAFE_END

Definition at line 1876 of file extconf.c.

◆ 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 1435 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 1413 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 2327 of file extconf.c.

◆ BACKGROUND_NOANSWER

#define BACKGROUND_NOANSWER   (1 << 1)

Definition at line 2326 of file extconf.c.

◆ BACKGROUND_PLAYBACK

#define BACKGROUND_PLAYBACK   (1 << 3)

Definition at line 2328 of file extconf.c.

◆ BACKGROUND_SKIP

#define BACKGROUND_SKIP   (1 << 0)

Definition at line 2325 of file extconf.c.

◆ CB_INCR

#define CB_INCR   250

Definition at line 711 of file extconf.c.

◆ 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.

◆ 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.

◆ 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 3603 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_

Definition at line 121 of file extconf.c.

◆ 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.

◆ 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.

◆ LOG_VERBOSE

#define LOG_VERBOSE   __LOG_VERBOSE, _A_

Definition at line 151 of file extconf.c.

◆ LOG_WARNING

#define LOG_WARNING   __LOG_WARNING, _A_

Definition at line 139 of file extconf.c.

◆ MAX_INCLUDE_LEVEL

#define MAX_INCLUDE_LEVEL   10

Definition at line 895 of file extconf.c.

◆ MAX_NESTED_COMMENTS

#define MAX_NESTED_COMMENTS   128

Definition at line 696 of file extconf.c.

◆ ONE_MILLION

#define ONE_MILLION   1000000

Definition at line 2261 of file extconf.c.

◆ PRIORITY_HINT

#define PRIORITY_HINT   -1

Special Priority for a hint

Definition at line 2082 of file extconf.c.

◆ 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.

◆ 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.

◆ STATUS_NO_CONTEXT

#define STATUS_NO_CONTEXT   1

Definition at line 2448 of file extconf.c.

◆ STATUS_NO_EXTENSION

#define STATUS_NO_EXTENSION   2

Definition at line 2449 of file extconf.c.

◆ STATUS_NO_LABEL

#define STATUS_NO_LABEL   4

Definition at line 2451 of file extconf.c.

◆ STATUS_NO_PRIORITY

#define STATUS_NO_PRIORITY   3

Definition at line 2450 of file extconf.c.

◆ STATUS_SUCCESS

#define STATUS_SUCCESS   5

Definition at line 2452 of file extconf.c.

◆ SWITCH_DATA_LENGTH

#define SWITCH_DATA_LENGTH   256

Definition at line 3610 of file extconf.c.

◆ VAR_BUF_SIZE

#define VAR_BUF_SIZE   4096

Definition at line 2319 of file extconf.c.

◆ VAR_HARDTRAN

#define VAR_HARDTRAN   3

Definition at line 2323 of file extconf.c.

◆ VAR_NORMAL

#define VAR_NORMAL   1

Definition at line 2321 of file extconf.c.

◆ VAR_SOFTTRAN

#define VAR_SOFTTRAN   2

Definition at line 2322 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   " == "

Definition at line 101 of file extconf.c.

◆ VERBOSE_PREFIX_3

#define VERBOSE_PREFIX_3   " -- "

Definition at line 102 of file extconf.c.

◆ 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 2353 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 2105 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 2084 of file extconf.c.

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

◆ 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_SOUNDS_SEARCH_CUSTOM 

Search custom directory for sounds first

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 1308 of file extconf.c.

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

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 4706 of file extconf.c.

4707{
4708 struct ast_context *tmp, **loc_contexts;
4709 int length = sizeof(struct ast_context) + strlen(name) + 1;
4710
4711 if (!extcontexts) {
4713 loc_contexts = &contexts;
4714 } else
4715 loc_contexts = extcontexts;
4716
4717 for (tmp = *loc_contexts; tmp; tmp = tmp->next) {
4718 if (!strcasecmp(tmp->name, name)) {
4719 if (!existsokay) {
4720 ast_log(LOG_WARNING, "Tried to register context '%s', already in use\n", name);
4721 tmp = NULL;
4722 }
4723 if (!extcontexts)
4725 return tmp;
4726 }
4727 }
4728 if ((tmp = ast_calloc(1, length))) {
4729 ast_rwlock_init(&tmp->lock);
4730 strcpy(tmp->name, name);
4731 tmp->root = NULL;
4732 tmp->registrar = registrar;
4733 tmp->next = *loc_contexts;
4734 tmp->includes = NULL;
4735 tmp->ignorepats = NULL;
4736 *loc_contexts = tmp;
4737 if (option_debug)
4738 ast_log(LOG_DEBUG, "Registered context '%s'\n", tmp->name);
4739 if (option_verbose > 2)
4740 ast_verbose( VERBOSE_PREFIX_3 "Registered extension context '%s'\n", tmp->name);
4741 }
4742
4743 if (!extcontexts)
4745 return tmp;
4746}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
static int tmp()
Definition: bt_open.c:389
#define VERBOSE_PREFIX_3
Definition: extconf.c:102
static int ast_wrlock_contexts(void)
Definition: extconf.c:4609
#define LOG_DEBUG
Definition: extconf.c:121
void ast_verbose(const char *fmt,...)
Definition: extconf.c:2206
static struct ast_context * contexts
Definition: extconf.c:3597
static int ast_unlock_contexts(void)
Definition: extconf.c:4614
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2194
#define LOG_WARNING
Definition: extconf.c:139
static int ast_rwlock_init(ast_rwlock_t *prwlock)
Definition: extconf.c:516
int option_debug
Definition: options.c:69
int option_verbose
Definition: options.c:67
static char * registrar
Definition: pbx_ael.c:78
ast_context: An extension context
Definition: pbx.c:284

References ast_calloc, ast_log(), ast_rwlock_init(), ast_unlock_contexts(), ast_verbose(), ast_wrlock_contexts(), contexts, LOG_DEBUG, LOG_WARNING, name, NULL, option_debug, option_verbose, registrar, tmp(), and VERBOSE_PREFIX_3.

Referenced by ast_context_find_or_create(), and localized_context_find_or_create().

◆ __ast_context_destroy()

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

Definition at line 5501 of file extconf.c.

5502{
5503 struct ast_context *tmp, *tmpl=NULL;
5504 struct ast_include *tmpi;
5505 struct ast_sw *sw;
5506 struct ast_exten *e, *el, *en;
5507 struct ast_ignorepat *ipi;
5508
5509 for (tmp = contexts; tmp; ) {
5510 struct ast_context *next; /* next starting point */
5511 for (; tmp; tmpl = tmp, tmp = tmp->next) {
5512 if (option_debug)
5513 ast_log(LOG_DEBUG, "check ctx %s %s\n", tmp->name, tmp->registrar);
5514 if ( (!registrar || !strcasecmp(registrar, tmp->registrar)) &&
5515 (!con || !strcasecmp(tmp->name, con->name)) )
5516 break; /* found it */
5517 }
5518 if (!tmp) /* not found, we are done */
5519 break;
5521 if (option_debug)
5522 ast_log(LOG_DEBUG, "delete ctx %s %s\n", tmp->name, tmp->registrar);
5523 next = tmp->next;
5524 if (tmpl)
5525 tmpl->next = next;
5526 else
5527 contexts = next;
5528 /* Okay, now we're safe to let it go -- in a sense, we were
5529 ready to let it go as soon as we locked it. */
5531 for (tmpi = tmp->includes; tmpi; ) { /* Free includes */
5532 struct ast_include *tmpil = tmpi;
5533 tmpi = tmpi->next;
5534 free(tmpil);
5535 }
5536 for (ipi = tmp->ignorepats; ipi; ) { /* Free ignorepats */
5537 struct ast_ignorepat *ipl = ipi;
5538 ipi = ipi->next;
5539 free(ipl);
5540 }
5541 while ((sw = AST_LIST_REMOVE_HEAD(&tmp->alts, list)))
5542 free(sw);
5543 for (e = tmp->root; e;) {
5544 for (en = e->peer; en;) {
5545 el = en;
5546 en = en->peer;
5548 }
5549 el = e;
5550 e = e->next;
5552 }
5553 ast_rwlock_destroy(&tmp->lock);
5554 free(tmp);
5555 /* if we have a specific match, we are done, otherwise continue */
5556 tmp = con ? NULL : next;
5557 }
5558}
static EditLine * el
Definition: asterisk.c:340
static int ast_wrlock_context(struct ast_context *con)
Definition: extconf.c:4619
static int ast_rwlock_destroy(ast_rwlock_t *prwlock)
Definition: extconf.c:529
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: extconf.c:2016
static int ast_unlock_context(struct ast_context *con)
Definition: extconf.c:4624
static void destroy_exten(struct ast_exten *e)
Definition: extconf.c:3765
void free()
struct ast_context * next
Definition: pbx.c:292
const char * name
Definition: pbx.c:285
ast_exten: An extension The dialplan is saved as a linked list with each context having it's own link...
Definition: pbx.c:237
struct ast_exten * peer
Definition: pbx.c:250
struct ast_exten * next
Definition: pbx.c:256
ast_ignorepat: Ignore patterns in dial plan
Definition: pbx_ignorepat.c:37
struct ast_ignorepat * next
Definition: extconf.c:2388
ast_include: include= support in extensions.conf
Definition: pbx_include.c:37
struct ast_include * next
Definition: extconf.c:2370
ast_sw: Switch statement in extensions.conf
Definition: pbx_sw.c:37

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

Referenced by ast_merge_contexts_and_delete(), and localized_context_destroy().

◆ _extension_match_core()

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

Definition at line 4191 of file extconf.c.

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

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

Referenced by extension_match_core().

◆ _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 3675 of file extconf.c.

3677{
3678 struct ast_exten *ep;
3679
3680 for (ep = NULL; e ; ep = e, e = e->peer) {
3681 if (e->priority >= tmp->priority)
3682 break;
3683 }
3684 if (!e) { /* go at the end, and ep is surely set because the list is not empty */
3685 ep->peer = tmp;
3686 return 0; /* success */
3687 }
3688 if (e->priority == tmp->priority) {
3689 /* Can't have something exactly the same. Is this a
3690 replacement? If so, replace, otherwise, bonk. */
3691 if (!replace) {
3692 ast_log(LOG_WARNING, "Unable to register extension '%s', priority %d in '%s', already in use\n", tmp->exten, tmp->priority, con->name);
3693 tmp->datad(tmp->data);
3694 free(tmp);
3695 return -1;
3696 }
3697 /* we are replacing e, so copy the link fields and then update
3698 * whoever pointed to e to point to us
3699 */
3700 tmp->next = e->next; /* not meaningful if we are not first in the peer list */
3701 tmp->peer = e->peer; /* always meaningful */
3702 if (ep) /* We're in the peer list, just insert ourselves */
3703 ep->peer = tmp;
3704 else if (el) /* We're the first extension. Take over e's functions */
3705 el->next = tmp;
3706 else /* We're the very first extension. */
3707 con->root = tmp;
3708 if (tmp->priority == PRIORITY_HINT)
3710 /* Destroy the old one */
3711 e->datad(e->data);
3712 free(e);
3713 } else { /* Slip ourselves in just before e */
3714 tmp->peer = e;
3715 tmp->next = e->next; /* extension chain, or NULL if e is not the first extension */
3716 if (ep) /* Easy enough, we're just in the peer list */
3717 ep->peer = tmp;
3718 else { /* we are the first in some peer list, so link in the ext list */
3719 if (el)
3720 el->next = tmp; /* in the middle... */
3721 else
3722 con->root = tmp; /* ... or at the head */
3723 e->next = NULL; /* e is no more at the head, so e->next must be reset */
3724 }
3725 /* And immediately return success. */
3726 if (tmp->priority == PRIORITY_HINT)
3728 }
3729 return 0;
3730}
#define PRIORITY_HINT
Definition: extconf.c:2082
static int ast_change_hint(struct ast_exten *oe, struct ast_exten *ne)
ast_change_hint: Change hint for an extension
Definition: extconf.c:3625
static int ast_add_hint(struct ast_exten *e)
ast_add_hint: Add hint to hint list, check initial extension state
Definition: extconf.c:3642
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:888
struct ast_exten * root
Definition: pbx.c:289

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

Referenced by ast_add_extension2().

◆ ALLOC_COMMENT()

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

Definition at line 877 of file extconf.c.

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

References ast_calloc, and ast_comment::cmt.

Referenced by process_text_line().

◆ 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 4773 of file extconf.c.

4777{
4778 /*
4779 * Sort extensions (or patterns) according to the rules indicated above.
4780 * These are implemented by the function ext_cmp()).
4781 * All priorities for the same ext/pattern/cid are kept in a list,
4782 * using the 'peer' field as a link field..
4783 */
4784 struct ast_exten *tmp, *e, *el = NULL;
4785 int res;
4786 int length;
4787 char *p;
4788
4789 /* if we are adding a hint, and there are global variables, and the hint
4790 contains variable references, then expand them --- NOT In this situation!!!
4791 */
4792
4793 length = sizeof(struct ast_exten);
4794 length += strlen(extension) + 1;
4795 length += strlen(application) + 1;
4796 if (label)
4797 length += strlen(label) + 1;
4798 if (callerid)
4799 length += strlen(callerid) + 1;
4800 else
4801 length ++; /* just the '\0' */
4802
4803 /* Be optimistic: Build the extension structure first */
4804 if (datad == NULL)
4805 datad = null_datad;
4806 if (!(tmp = ast_calloc(1, length)))
4807 return -1;
4808
4809 /* use p as dst in assignments, as the fields are const char * */
4810 p = tmp->stuff;
4811 if (label) {
4812 tmp->label = p;
4813 strcpy(p, label);
4814 p += strlen(label) + 1;
4815 }
4816 tmp->exten = p;
4817 p += ext_strncpy(p, extension, strlen(extension) + 1) + 1;
4818 tmp->priority = priority;
4819 tmp->cidmatch = p; /* but use p for assignments below */
4820 if (callerid) {
4821 p += ext_strncpy(p, callerid, strlen(callerid) + 1) + 1;
4822 tmp->matchcid = 1;
4823 } else {
4824 *p++ = '\0';
4825 tmp->matchcid = 0;
4826 }
4827 tmp->app = p;
4828 strcpy(p, application);
4829 tmp->parent = con;
4830 tmp->data = data;
4831 tmp->datad = datad;
4832 tmp->registrar = registrar;
4833
4834 res = 0; /* some compilers will think it is uninitialized otherwise */
4835 for (e = con->root; e; el = e, e = e->next) { /* scan the extension list */
4836 res = ext_cmp(e->exten, extension);
4837 if (res == 0) { /* extension match, now look at cidmatch */
4838 if (!e->matchcid && !tmp->matchcid)
4839 res = 0;
4840 else if (tmp->matchcid && !e->matchcid)
4841 res = 1;
4842 else if (e->matchcid && !tmp->matchcid)
4843 res = -1;
4844 else
4845 res = strcasecmp(e->cidmatch, tmp->cidmatch);
4846 }
4847 if (res >= 0)
4848 break;
4849 }
4850 if (e && res == 0) { /* exact match, insert in the pri chain */
4851 res = add_pri(con, tmp, el, e, replace);
4852 if (res < 0) {
4853 errno = EEXIST; /* XXX do we care ? */
4854 return 0; /* XXX should we return -1 maybe ? */
4855 }
4856 } else {
4857 /*
4858 * not an exact match, this is the first entry with this pattern,
4859 * so insert in the main list right before 'e' (if any)
4860 */
4861 tmp->next = e;
4862 if (el)
4863 el->next = tmp;
4864 else
4865 con->root = tmp;
4866 if (tmp->priority == PRIORITY_HINT)
4868 }
4869 if (option_debug) {
4870 if (tmp->matchcid) {
4871 ast_log(LOG_DEBUG, "Added extension '%s' priority %d (CID match '%s') to %s\n",
4872 tmp->exten, tmp->priority, tmp->cidmatch, con->name);
4873 } else {
4874 ast_log(LOG_DEBUG, "Added extension '%s' priority %d to %s\n",
4875 tmp->exten, tmp->priority, con->name);
4876 }
4877 }
4878 if (option_verbose > 2) {
4879 if (tmp->matchcid) {
4880 ast_verbose( VERBOSE_PREFIX_3 "Added extension '%s' priority %d (CID match '%s')to %s\n",
4881 tmp->exten, tmp->priority, tmp->cidmatch, con->name);
4882 } else {
4883 ast_verbose( VERBOSE_PREFIX_3 "Added extension '%s' priority %d to %s\n",
4884 tmp->exten, tmp->priority, con->name);
4885 }
4886 }
4887 return 0;
4888}
static int priority
static int ext_cmp(const char *a, const char *b)
the full routine to compare extensions in rules.
Definition: extconf.c:3944
static int ext_strncpy(char *dst, const char *src, int len)
copy a string skipping whitespace
Definition: extconf.c:3971
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:3675
static void null_datad(void *foo)
Definition: extconf.c:2742
int errno
char * exten
Definition: pbx.c:238
const char * cidmatch
Definition: pbx.c:241
void * data
Definition: pbx.c:248
void(* datad)(void *)
Definition: pbx.c:249
const char * label
Definition: pbx.c:244
int matchcid
Definition: pbx.c:240
structure to hold extensions

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

Referenced by localized_add_extension2(), and pbx_load_config().

◆ 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 3642 of file extconf.c.

3643{
3644 struct ast_hint *hint;
3645
3646 if (!e)
3647 return -1;
3648
3649
3650 /* Search if hint exists, do nothing */
3651 AST_RWLIST_TRAVERSE(&hints, hint, list) {
3652 if (hint->exten == e) {
3653 if (option_debug > 1)
3654 ast_log(LOG_DEBUG, "HINTS: Not re-adding existing hint %s: %s\n", ast_get_extension_name(e), ast_get_extension_app(e));
3655 return -1;
3656 }
3657 }
3658
3659 if (option_debug > 1)
3660 ast_log(LOG_DEBUG, "HINTS: Adding hint %s: %s\n", ast_get_extension_name(e), ast_get_extension_app(e));
3661
3662 if (!(hint = ast_calloc(1, sizeof(*hint)))) {
3663 return -1;
3664 }
3665 /* Initialize and insert new item at the top */
3666 hint->exten = e;
3667 AST_RWLIST_INSERT_HEAD(&hints, hint, list);
3668
3669 return 0;
3670}
static const char * ast_get_extension_app(struct ast_exten *e)
Definition: extconf.c:3612
#define AST_RWLIST_TRAVERSE
Definition: extconf.c:1776
static const char * ast_get_extension_name(struct ast_exten *exten)
Definition: extconf.c:3617
#define AST_RWLIST_INSERT_HEAD
Definition: extconf.c:1963
Structure for dial plan hints.
Definition: pbx.c:331
struct ast_exten * exten
Hint extension.
Definition: pbx.c:338

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

Referenced by add_pri(), and ast_add_extension2().

◆ ast_app_separate_args()

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

Definition at line 2486 of file extconf.c.

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

References array(), buf, paren, and quote().

Referenced by pbx_builtin_setvar().

◆ 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.

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.

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.
info_inStandard string containing a timerange, weekday range, monthday range, and month range, as well as an optional timezone.
Return values
1on success.
0on failure.

Definition at line 3806 of file extconf.c.

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

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

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

◆ ast_category_append()

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

Definition at line 2833 of file extconf.c.

2834{
2835 if (config->last)
2836 config->last->next = category;
2837 else
2838 config->root = category;
2839 config->last = category;
2840 config->current = category;
2841}
static const char config[]
Definition: chan_ooh323.c:111

Referenced by process_text_line().

◆ ast_category_browse()

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

Definition at line 3326 of file extconf.c.

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

Referenced by pbx_load_config().

◆ ast_category_destroy()

static void ast_category_destroy ( struct ast_category cat)
static

Definition at line 2845 of file extconf.c.

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

Referenced by process_text_line().

◆ ast_category_get()

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

Definition at line 1210 of file extconf.c.

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

References category_get(), and config.

Referenced by ast_variable_browse().

◆ ast_category_new()

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

Definition at line 2788 of file extconf.c.

2789{
2790 struct ast_category *category;
2791
2792 if ((category = ast_calloc(1, sizeof(*category))))
2793 ast_copy_string(category->name, name, sizeof(category->name));
2794 category->file = strdup(in_file);
2795 category->lineno = lineno; /* if you don't know the lineno, set it to 999999 or something real big */
2796 return category;
2797}
#define strdup(a)
Definition: astmm.h:163
void ast_copy_string(char *dst, const char *src, size_t size)
Definition: extconf.c:970

Referenced by process_text_line().

◆ 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 3625 of file extconf.c.

3626{
3627 struct ast_hint *hint;
3628 int res = -1;
3629
3630 AST_RWLIST_TRAVERSE(&hints, hint, list) {
3631 if (hint->exten == oe) {
3632 hint->exten = ne;
3633 res = 0;
3634 break;
3635 }
3636 }
3637
3638 return res;
3639}

References AST_RWLIST_TRAVERSE, and ast_hint::exten.

Referenced by add_pri().

◆ 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
1if the time matches.
0if the current time falls outside of the specified range.

Definition at line 4000 of file extconf.c.

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

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

◆ ast_config_destroy()

static void ast_config_destroy ( struct ast_config cfg)
static

Definition at line 1289 of file extconf.c.

1290{
1291 struct ast_category *cat, *catn;
1292
1293 if (!cfg)
1294 return;
1295
1297
1298 cat = cfg->root;
1299 while (cat) {
1301 catn = cat;
1302 cat = cat->next;
1303 free(catn);
1304 }
1305 free(cfg);
1306}
static void ast_includes_destroy(struct ast_config_include *incls)
Definition: extconf.c:1273
struct ast_category * root
Definition: main/config.c:251
struct ast_config_include * includes
Definition: main/config.c:258

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

◆ 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 2781 of file extconf.c.

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

References ast_config::current.

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

◆ 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 2862 of file extconf.c.

2863{
2864 char db[256] = "";
2865 char table[256] = "";
2866 struct ast_config_engine *loader = &text_file_engine;
2867 struct ast_config *result;
2868
2869 if (cfg->include_level == cfg->max_include_level) {
2870 ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level);
2871 return NULL;
2872 }
2873
2874 cfg->include_level++;
2875 /* silence is golden!
2876 ast_log(LOG_WARNING, "internal loading file %s level=%d\n", filename, cfg->include_level);
2877 */
2878
2879 if (strcmp(filename, extconfig_conf) && strcmp(filename, "asterisk.conf") && config_engine_list) {
2880 struct ast_config_engine *eng;
2881
2882 eng = find_engine(filename, db, sizeof(db), table, sizeof(table));
2883
2884
2885 if (eng && eng->load_func) {
2886 loader = eng;
2887 } else {
2888 eng = find_engine("global", db, sizeof(db), table, sizeof(table));
2889 if (eng && eng->load_func)
2890 loader = eng;
2891 }
2892 }
2893
2894 result = loader->load_func(db, table, filename, cfg, withcomments, suggested_incl_file);
2895 /* silence is golden
2896 ast_log(LOG_WARNING, "finished internal loading file %s level=%d\n", filename, cfg->include_level);
2897 */
2898
2899 if (result)
2900 result->include_level--;
2901
2902 return result;
2903}
static char * table
Definition: cdr_odbc.c:55
static sqlite3 * db
static PGresult * result
Definition: cel_pgsql.c:84
static struct ast_config_engine * config_engine_list
Definition: extconf.c:893
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:2747
static char * extconfig_conf
Definition: extconf.c:702
static struct ast_config_engine text_file_engine
Definition: extconf.c:2854
Configuration engine structure, used to define realtime drivers.
config_load_func * load_func
int include_level
Definition: main/config.c:256
int max_include_level
Definition: main/config.c:257

References ast_log(), config_engine_list, db, extconfig_conf, 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().

◆ ast_config_new()

static struct ast_config * ast_config_new ( void  )
static

Definition at line 3274 of file extconf.c.

3275{
3276 struct ast_config *config;
3277
3278 if ((config = ast_calloc(1, sizeof(*config))))
3279 config->max_include_level = MAX_INCLUDE_LEVEL;
3280 return config;
3281}
#define MAX_INCLUDE_LEVEL
Definition: extconf.c:895

Referenced by localized_config_load(), and localized_config_load_with_comments().

◆ 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 3362 of file extconf.c.

3363{
3364 /* cast below is just to silence compiler warning about dropping "const" */
3365 cfg->current = (struct ast_category *) cat;
3366}

References ast_config::current.

◆ 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 1352 of file asterisk.c.

1353{
1354 /* Send to the root console */
1355 fputs(string, stdout);
1356 fflush(stdout);
1357
1358 /* Send to any network console clients */
1359 ast_network_puts(string);
1360}
static void ast_network_puts(const char *string)
write the string to all attached console clients
Definition: asterisk.c:1336

◆ ast_context_add_ignorepat2()

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

Definition at line 4567 of file extconf.c.

4568{
4569 struct ast_ignorepat *ignorepat, *ignorepatc, *ignorepatl = NULL;
4570 int length;
4571 length = sizeof(struct ast_ignorepat);
4572 length += strlen(value) + 1;
4573 if (!(ignorepat = ast_calloc(1, length)))
4574 return -1;
4575 /* The cast to char * is because we need to write the initial value.
4576 * The field is not supposed to be modified otherwise
4577 */
4578 strcpy((char *)ignorepat->pattern, value);
4579 ignorepat->next = NULL;
4580 ignorepat->registrar = registrar;
4581 for (ignorepatc = con->ignorepats; ignorepatc; ignorepatc = ignorepatc->next) {
4582 ignorepatl = ignorepatc;
4583 if (!strcasecmp(ignorepatc->pattern, value)) {
4584 /* Already there */
4585 errno = EEXIST;
4586 return -1;
4587 }
4588 }
4589 if (ignorepatl)
4590 ignorepatl->next = ignorepat;
4591 else
4592 con->ignorepats = ignorepat;
4593 return 0;
4594
4595}
struct ast_ignorepats ignorepats
Definition: pbx.c:294
const char pattern[0]
Definition: pbx_ignorepat.c:39
const char * registrar
Definition: pbx_ignorepat.c:38
int value
Definition: syslog.c:37

References ast_calloc, errno, ast_context::ignorepats, ast_ignorepat::next, NULL, ast_ignorepat::pattern, ast_ignorepat::registrar, registrar, and value.

Referenced by localized_context_add_ignorepat2(), and pbx_load_config().

◆ ast_context_add_include2()

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

Definition at line 4501 of file extconf.c.

4503{
4504 struct ast_include *new_include;
4505 char *c;
4506 struct ast_include *i, *il = NULL; /* include, include_last */
4507 int length;
4508 char *p;
4509
4510 length = sizeof(struct ast_include);
4511 length += 2 * (strlen(value) + 1);
4512
4513 /* allocate new include structure ... */
4514 if (!(new_include = ast_calloc(1, length)))
4515 return -1;
4516 /* Fill in this structure. Use 'p' for assignments, as the fields
4517 * in the structure are 'const char *'
4518 */
4519 p = new_include->stuff;
4520 new_include->name = p;
4521 strcpy(p, value);
4522 p += strlen(value) + 1;
4523 new_include->rname = p;
4524 strcpy(p, value);
4525 /* Strip off timing info, and process if it is there */
4526 if ( (c = strchr(p, '|')) || (c = strchr(p, ',')) ) {
4527 *c++ = '\0';
4528 new_include->hastime = ast_build_timing(&(new_include->timing), c);
4529 }
4530 new_include->next = NULL;
4531 new_include->registrar = registrar;
4532
4533
4534 /* ... go to last include and check if context is already included too... */
4535 for (i = con->includes; i; i = i->next) {
4536 if (!strcasecmp(i->name, new_include->name)) {
4537 free(new_include);
4538 errno = EEXIST;
4539 return -1;
4540 }
4541 il = i;
4542 }
4543
4544 /* ... include new context into context list, unlock, return */
4545 if (il)
4546 il->next = new_include;
4547 else
4548 con->includes = new_include;
4549 if (option_verbose > 2)
4550 ast_verbose(VERBOSE_PREFIX_3 "Including context '%s' in context '%s'\n", new_include->name, ast_get_context_name(con));
4551
4552 return 0;
4553}
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:3806
static const char * ast_get_context_name(struct ast_context *con)
Definition: extconf.c:4486
struct ast_includes includes
Definition: pbx.c:293
struct ast_timing timing
Definition: pbx_include.c:46
const char * rname
Definition: pbx_include.c:40
char stuff[0]
Definition: pbx_include.c:47
const char * registrar
Definition: pbx_include.c:42
const char * name
Definition: pbx_include.c:38
static struct test_val c

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

Referenced by localized_context_add_include2(), and pbx_load_config().

◆ 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 4639 of file extconf.c.

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

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, ast_sw::name, option_verbose, ast_sw::registrar, registrar, ast_sw::stuff, SWITCH_DATA_LENGTH, ast_sw::tmpdata, value, and VERBOSE_PREFIX_3.

Referenced by localized_context_add_switch2(), and pbx_load_config().

◆ ast_context_find()

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

Definition at line 4172 of file extconf.c.

4173{
4174 struct ast_context *tmp = NULL;
4175 while ( (tmp = ast_walk_contexts(tmp)) ) {
4176 if (!name || !strcasecmp(name, tmp->name))
4177 break;
4178 }
4179 return tmp;
4180}
static struct ast_context * ast_walk_contexts(struct ast_context *con)
Definition: extconf.c:4024

Referenced by ast_context_verify_includes().

◆ 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 4980 of file extconf.c.

4981{
4982 return __ast_context_create(extcontexts, name, registrar, 1);
4983}
static struct ast_context * __ast_context_create(struct ast_context **extcontexts, const char *name, const char *registrar, int existsokay)
Definition: extconf.c:4706

References __ast_context_create(), name, and registrar.

Referenced by pbx_load_config().

◆ ast_context_ignorepats_count()

int ast_context_ignorepats_count ( struct ast_context con)

Definition at line 4123 of file extconf.c.

4124{
4125 int c = 0;
4126 struct ast_ignorepat *ip = NULL;
4127
4128 while ((ip = ast_walk_context_ignorepats(con, ip))) {
4129 c++;
4130 }
4131
4132 return c;
4133}
static struct ast_ignorepat * ast_walk_context_ignorepats(struct ast_context *con, struct ast_ignorepat *ip)
Definition: extconf.c:4113

References ast_walk_context_ignorepats(), c, and NULL.

◆ ast_context_includes_count()

int ast_context_includes_count ( struct ast_context con)

Definition at line 4090 of file extconf.c.

4091{
4092 int c = 0;
4093 struct ast_include *inc = NULL;
4094
4095 while ((inc = ast_walk_context_includes(con, inc))) {
4096 c++;
4097 }
4098
4099 return c;
4100}
static struct ast_include * ast_walk_context_includes(struct ast_context *con, struct ast_include *inc)
Definition: extconf.c:4080

References ast_walk_context_includes(), c, and NULL.

◆ ast_context_switches_count()

int ast_context_switches_count ( struct ast_context con)

Definition at line 4157 of file extconf.c.

4158{
4159 int c = 0;
4160 struct ast_sw *sw = NULL;
4161
4162 while ((sw = ast_walk_context_switches(con, sw))) {
4163 c++;
4164 }
4165
4166 return c;
4167}
static struct ast_sw * ast_walk_context_switches(struct ast_context *con, struct ast_sw *sw)
Definition: extconf.c:4139

References ast_walk_context_switches(), c, and NULL.

◆ ast_context_verify_includes()

static int ast_context_verify_includes ( struct ast_context con)
static

Definition at line 5620 of file extconf.c.

5621{
5622 struct ast_include *inc = NULL;
5623 int res = 0;
5624
5625 while ( (inc = ast_walk_context_includes(con, inc)) )
5626 if (!ast_context_find(inc->rname)) {
5627 res = -1;
5628 if (strcasecmp(inc->rname,"parkedcalls")!=0)
5629 ast_log(LOG_WARNING, "Context '%s' tries to include the nonexistent context '%s'\n",
5630 ast_get_context_name(con), inc->rname);
5631 }
5632 return res;
5633}
static struct ast_context * ast_context_find(const char *name)
Definition: extconf.c:4172

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

Referenced by localized_context_verify_includes(), and localized_pbx_load_module().

◆ 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 4295 of file extconf.c.

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

Referenced by matchcid().

◆ 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 4975 of file extconf.c.

4976{
4977 return pbx_extension_helper(c, con, NULL, exten, 0, label, callerid, E_FINDLABEL);
4978}
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:4914
@ E_FINDLABEL
Definition: extconf.h:220

Referenced by pbx_load_config().

◆ ast_func_read()

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

Definition at line 4993 of file extconf.c.

4994{
4995 ast_log(LOG_ERROR, "Function %s not registered\n", function);
4996 return -1;
4997}
#define LOG_ERROR
Definition: extconf.c:145

References ast_log(), and LOG_ERROR.

Referenced by pbx_substitute_variables_helper_full().

◆ ast_func_write()

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

Definition at line 2478 of file extconf.c.

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

Referenced by pbx_builtin_setvar_helper().

◆ ast_get_context_name()

static const char * ast_get_context_name ( struct ast_context con)
static

Definition at line 4486 of file extconf.c.

4487{
4488 return con ? con->name : NULL;
4489}

References ast_context::name, and NULL.

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

◆ ast_get_extension_app()

static const char * ast_get_extension_app ( struct ast_exten e)
static

Definition at line 3612 of file extconf.c.

3613{
3614 return e ? e->app : NULL;
3615}
const char * app
Definition: pbx.c:246

References ast_exten::app, and NULL.

Referenced by ast_add_hint().

◆ ast_get_extension_name()

static const char * ast_get_extension_name ( struct ast_exten exten)
static

Definition at line 3617 of file extconf.c.

3618{
3619 return exten ? exten->exten : NULL;
3620}

References ast_exten::exten, and NULL.

Referenced by ast_add_hint().

◆ ast_include_find()

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

Definition at line 1163 of file extconf.c.

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

Referenced by ast_include_new().

◆ 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 1074 of file extconf.c.

1075{
1076 /* a file should be included ONCE. Otherwise, if one of the instances is changed,
1077 then all be changed. -- how do we know to include it? -- Handling modified
1078 instances is possible, I'd have
1079 to create a new master for each instance. */
1080 struct ast_config_include *inc;
1081
1083 if (inc)
1084 {
1085 inc->inclusion_count++;
1086 snprintf(real_included_file_name, real_included_file_name_size, "%s~~%d", included_file, inc->inclusion_count);
1087 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);
1088 } else
1089 *real_included_file_name = 0;
1090
1091 inc = ast_calloc(1,sizeof(struct ast_config_include));
1092 inc->include_location_file = ast_strdup(from_file);
1093 inc->include_location_lineno = from_lineno;
1094 if (!ast_strlen_zero(real_included_file_name))
1095 inc->included_file = ast_strdup(real_included_file_name);
1096 else
1098
1099 inc->exec = is_exec;
1100 if (is_exec)
1102
1103 /* attach this new struct to the conf struct */
1104 inc->next = conf->includes;
1105 conf->includes = inc;
1106
1107 return inc;
1108}
static struct ast_config_include * ast_include_find(struct ast_config *conf, const char *included_file)
Definition: extconf.c:1163
char * include_location_file
file name in which the include occurs
Definition: main/config.c:266
char * exec_file
if it's an exec, you'll have both the /var/tmp to read, and the original script
Definition: main/config.c:273

Referenced by process_text_line().

◆ ast_includes_destroy()

static void ast_includes_destroy ( struct ast_config_include incls)
static

Definition at line 1273 of file extconf.c.

1274{
1275 struct ast_config_include *incl,*inclnext;
1276
1277 for (incl=incls; incl; incl = inclnext) {
1278 inclnext = incl->next;
1279 if (incl->include_location_file)
1281 if (incl->exec_file)
1282 free(incl->exec_file);
1283 if (incl->included_file)
1284 free(incl->included_file);
1285 free(incl);
1286 }
1287}

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().

◆ 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 2498 of file logger.c.

2499{
2500#ifdef HAVE_BKTR
2501 struct ast_bt *bt;
2502 int i = 0;
2503 struct ast_vector_string *strings;
2504
2505 if (!(bt = ast_bt_create())) {
2506 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
2507 return;
2508 }
2509
2510 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
2511 int count = AST_VECTOR_SIZE(strings);
2512 struct ast_str *buf = ast_str_create(bt->num_frames * 64);
2513
2514 if (buf) {
2515 ast_str_append(&buf, 0, "Got %d backtrace record%c\n", count - 3, count - 3 != 1 ? 's' : ' ');
2516 for (i = 3; i < AST_VECTOR_SIZE(strings); i++) {
2517 ast_str_append(&buf, 0, "#%2d: %s\n", i - 3, AST_VECTOR_GET(strings, i));
2518 }
2520 ast_free(buf);
2521 }
2522
2523 ast_bt_free_symbols(strings);
2524 } else {
2525 ast_log(LOG_ERROR, "Could not allocate memory for backtrace\n");
2526 }
2527 ast_bt_destroy(bt);
2528#else
2529 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
2530#endif /* defined(HAVE_BKTR) */
2531}
#define ast_free(a)
Definition: astmm.h:180
#define ast_bt_free_symbols(string_vector)
Definition: backtrace.h:42
#define ast_bt_get_symbols(addresses, num_frames)
Definition: backtrace.h:41
#define ast_bt_create()
Definition: backtrace.h:39
#define ast_bt_destroy(bt)
Definition: backtrace.h:40
#define __LOG_ERROR
#define LOG_ERROR
#define LOG_WARNING
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:2463
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:2441
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:1139
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
A structure to hold backtrace information. This structure provides an easy means to store backtrace i...
Definition: backtrace.h:50
void * addresses[AST_MAX_BT_FRAMES]
Definition: backtrace.h:52
int num_frames
Definition: backtrace.h:54
Support for dynamic strings.
Definition: strings.h:623
String vector definitions.
Definition: vector.h:55
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

◆ ast_mark_lock_failed()

void ast_mark_lock_failed ( void *  lock_addr)

Definition at line 2313 of file extconf.c.

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

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

◆ ast_merge_contexts_and_delete()

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

Definition at line 5570 of file extconf.c.

5571{
5572 struct ast_context *tmp, *lasttmp = NULL;
5573
5574 /* it is very important that this function hold the hint list lock _and_ the conlock
5575 during its operation; not only do we need to ensure that the list of contexts
5576 and extensions does not change, but also that no hint callbacks (watchers) are
5577 added or removed during the merge/delete process
5578
5579 in addition, the locks _must_ be taken in this order, because there are already
5580 other code paths that use this order
5581 */
5583
5584 tmp = *extcontexts;
5585 if (registrar) {
5586 /* XXX remove previous contexts from same registrar */
5587 if (option_debug)
5588 ast_log(LOG_DEBUG, "must remove any reg %s\n", registrar);
5590 while (tmp) {
5591 lasttmp = tmp;
5592 tmp = tmp->next;
5593 }
5594 } else {
5595 /* XXX remove contexts with the same name */
5596 while (tmp) {
5597 ast_log(LOG_WARNING, "must remove %s reg %s\n", tmp->name, tmp->registrar);
5598 __ast_context_destroy(tmp,tmp->registrar);
5599 lasttmp = tmp;
5600 tmp = tmp->next;
5601 }
5602 }
5603 if (lasttmp) {
5604 lasttmp->next = contexts;
5605 contexts = *extcontexts;
5606 *extcontexts = NULL;
5607 } else
5608 ast_log(LOG_WARNING, "Requested contexts didn't get merged\n");
5609
5611
5612 return;
5613}
static void __ast_context_destroy(struct ast_context *con, const char *registrar)
Definition: extconf.c:5501

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

Referenced by localized_merge_contexts_and_delete(), and localized_pbx_load_module().

◆ ast_mutex_init()

static int ast_mutex_init ( ast_mutex_t pmutex)
inlinestatic

Definition at line 469 of file extconf.c.

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 AST_MUTEX_KIND
Definition: extconf.c:194
#define pthread_mutex_init
Definition: extconf.c:501

References AST_MUTEX_KIND, and pthread_mutex_init.

◆ ast_process_quotes_and_slashes()

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

Definition at line 2218 of file extconf.c.

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

Referenced by pbx_load_config().

◆ 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 953 of file logger.c.

954{
955 va_list ap;
956 struct timeval tv;
957 struct ast_tm tm;
958 char qlog_msg[8192];
959 int qlog_len;
960 char time_str[30];
961
962 if (!logger_initialized) {
963 /* You are too early. We are not open yet! */
964 return;
965 }
966 if (!queuelog_init) {
967 /* We must initialize now since someone is trying to log something. */
969 }
970
971 if (ast_check_realtime("queue_log")) {
972 tv = ast_tvnow();
973 ast_localtime(&tv, &tm, logfiles.queue_log_realtime_use_gmt ? "GMT" : NULL);
974 ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
975 va_start(ap, fmt);
976 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
977 va_end(ap);
978 if (logfiles.queue_adaptive_realtime) {
980 AST_APP_ARG(data)[5];
981 );
982 AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
983 /* Ensure fields are large enough to receive data */
984 ast_realtime_require_field("queue_log",
985 "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
986 "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
987 "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
988 "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
989 "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
990 SENTINEL);
991
992 /* Store the log */
993 ast_store_realtime("queue_log", "time", time_str,
994 "callid", callid,
995 "queuename", queuename,
996 "agent", agent,
997 "event", event,
998 "data1", S_OR(args.data[0], ""),
999 "data2", S_OR(args.data[1], ""),
1000 "data3", S_OR(args.data[2], ""),
1001 "data4", S_OR(args.data[3], ""),
1002 "data5", S_OR(args.data[4], ""),
1003 SENTINEL);
1004 } else {
1005 ast_store_realtime("queue_log", "time", time_str,
1006 "callid", callid,
1007 "queuename", queuename,
1008 "agent", agent,
1009 "event", event,
1010 "data", qlog_msg,
1011 SENTINEL);
1012 }
1013
1014 if (!logfiles.queue_log_to_file) {
1015 return;
1016 }
1017 }
1018
1019 if (qlog) {
1020 va_start(ap, fmt);
1021 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
1022 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
1023 va_end(ap);
1025 if (qlog) {
1026 fprintf(qlog, "%s\n", qlog_msg);
1027 fflush(qlog);
1028 }
1030 }
1031}
#define SENTINEL
Definition: compiler.h:87
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the 'nonstandard' argument separation process for an application.
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
Definition: main/config.c:3549
int ast_check_realtime(const char *family)
Check if realtime engine is configured for family.
Definition: main/config.c:3530
int ast_store_realtime(const char *family,...) attribute_sentinel
Create realtime configuration.
Definition: main/config.c:3740
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:78
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
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_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
static int queuelog_init
Definition: logger.c:88
void logger_queue_start(void)
Start the ast_queue_log() logger.
Definition: logger.c:2174
static FILE * qlog
Definition: logger.c:201
static int logger_initialized
Definition: logger.c:89
static struct @367 logfiles
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
Definition: astman.c:222
const char * args
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:159

Referenced by logger_queue_start(), and reload_logger().

◆ ast_remove_hint()

static int ast_remove_hint ( struct ast_exten e)
static

ast_remove_hint: Remove hint from extension

Definition at line 3733 of file extconf.c.

3734{
3735 /* Cleanup the Notifys if hint is removed */
3736 struct ast_hint *hint;
3737 struct ast_state_cb *cblist, *cbprev;
3738 int res = -1;
3739
3740 if (!e)
3741 return -1;
3742
3744 if (hint->exten == e) {
3745 cbprev = NULL;
3746 cblist = hint->callbacks;
3747 while (cblist) {
3748 /* Notify with -1 and remove all callbacks */
3749 cbprev = cblist;
3750 cblist = cblist->next;
3751 free(cbprev);
3752 }
3753 hint->callbacks = NULL;
3755 free(hint);
3756 res = 0;
3757 break;
3758 }
3759 }
3761
3762 return res;
3763}
#define AST_RWLIST_REMOVE_CURRENT
Definition: extconf.c:1846
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: extconf.c:1823
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: extconf.c:1876
struct ao2_container * callbacks
Definition: pbx.c:339
ast_state_cb: An extension state notify register item
Definition: pbx.c:308
struct ast_state_cb * next
Definition: pbx.c:320

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().

◆ 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.

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 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
static struct sigaction null_sig_handler
Definition: extconf.c:794

References null_sig_handler, safe_system_level, and safe_system_prev_handler.

Referenced by ast_safe_fork(), ast_safe_system(), and handle_include_exec().

◆ ast_rwlock_destroy()

static int ast_rwlock_destroy ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 529 of file extconf.c.

530{
531 return pthread_rwlock_destroy(prwlock);
532}

Referenced by __ast_context_destroy().

◆ ast_rwlock_init()

static int ast_rwlock_init ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 516 of file extconf.c.

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}

Referenced by __ast_context_create().

◆ ast_rwlock_rdlock()

static int ast_rwlock_rdlock ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 539 of file extconf.c.

540{
541 return pthread_rwlock_rdlock(prwlock);
542}

Referenced by pbx_retrieve_variable().

◆ ast_rwlock_unlock()

static int ast_rwlock_unlock ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 534 of file extconf.c.

535{
536 return pthread_rwlock_unlock(prwlock);
537}

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

◆ ast_rwlock_wrlock()

static int ast_rwlock_wrlock ( ast_rwlock_t prwlock)
inlinestatic

Definition at line 544 of file extconf.c.

545{
546 return pthread_rwlock_wrlock(prwlock);
547}

Referenced by ast_wrlock_context(), and ast_wrlock_contexts().

◆ 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.

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}
jack_status_t status
Definition: app_jack.c:146
void ast_replace_sigchld(void)
Replace the SIGCHLD handler.
Definition: extconf.c:801
void ast_unreplace_sigchld(void)
Restore the SIGCHLD handler.
Definition: extconf.c:815
#define WEXITSTATUS(status)
#define WIFEXITED(status)

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

Referenced by add_email_attachment(), alarmreceiver_exec(), AST_TEST_DEFINE(), 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().

◆ 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 2136 of file extconf.c.

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

Referenced by pbx_load_config().

◆ ast_skip_blanks()

char * ast_skip_blanks ( const char *  str)

Definition at line 979 of file extconf.c.

988{

References str.

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

◆ 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 1023 of file extconf.c.

1028{

Referenced by config_text_file_load(), and process_text_line().

◆ 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
strthe input string
Returns
a pointer to the modified string

Definition at line 1004 of file extconf.c.

1017{

References ast_skip_blanks(), and ast_trim_blanks().

Referenced by ast_trim_blanks().

◆ ast_true()

static int ast_true ( const char *  s)
static

Definition at line 2244 of file extconf.c.

2245{
2246 if (ast_strlen_zero(s))
2247 return 0;
2248
2249 /* Determine if this is a true value */
2250 if (!strcasecmp(s, "yes") ||
2251 !strcasecmp(s, "true") ||
2252 !strcasecmp(s, "y") ||
2253 !strcasecmp(s, "t") ||
2254 !strcasecmp(s, "1") ||
2255 !strcasecmp(s, "on"))
2256 return -1;
2257
2258 return 0;
2259}

References ast_strlen_zero().

Referenced by pbx_load_config().

◆ ast_tvadd()

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

Returns the sum of two timevals a + b.

Definition at line 2282 of file extconf.c.

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

References a, b, 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_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_and_jitter(), calc_timestamp(), cli_show_tasks(), cli_tps_ping(), conf_run(), consumer_should_stay(), dial_exec_full(), do_cdr(), do_timing(), expire_objects_from_cache(), handler_wait_for_message(), hook_event_cb(), iax2_process_thread(), jb_get_and_deliver(), jitterbuffer_frame_get_ntp_timestamp(), make_deadline(), mb_poll_thread(), monmp3thread(), mp3_exec(), mwi_monitor_handler(), 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().

◆ ast_tvnow()

struct timeval ast_tvnow ( void  )

Definition at line 5671 of file extconf.c.

5672{
5673 struct timeval t;
5674 gettimeofday(&t, NULL);
5675 return t;
5676}

References NULL.

◆ ast_tvsub()

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

Returns the difference of two timevals a - b.

Definition at line 2297 of file extconf.c.

2298{
2299 /* consistency checks to guarantee usec in 0..999999 */
2300 a = tvfix(a);
2301 b = tvfix(b);
2302 a.tv_sec -= b.tv_sec;
2303 a.tv_usec -= b.tv_usec;
2304 if (a.tv_usec < 0) {
2305 a.tv_sec-- ;
2306 a.tv_usec += ONE_MILLION;
2307 }
2308 return a;
2309}

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

Referenced by action_login(), ast_poll2(), ast_sched_dump(), AST_TEST_DEFINE(), ast_translate(), ast_waitfor_nandfds(), calc_rxstamp(), calc_rxstamp_and_jitter(), 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().

◆ ast_unlock_context()

static int ast_unlock_context ( struct ast_context con)
static

Definition at line 4624 of file extconf.c.

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

References ast_rwlock_unlock(), and ast_context::lock.

Referenced by __ast_context_destroy().

◆ ast_unlock_contexts()

static int ast_unlock_contexts ( void  )
static

Definition at line 4614 of file extconf.c.

4615{
4616 return ast_rwlock_unlock(&conlock);
4617}
static ast_rwlock_t conlock
Definition: extconf.c:4482

References ast_rwlock_unlock(), and conlock.

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

◆ 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.

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}

References NULL, safe_system_level, and safe_system_prev_handler.

Referenced by ast_safe_fork_cleanup(), ast_safe_system(), and handle_include_exec().

◆ ast_var_assign()

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

Definition at line 2454 of file extconf.c.

2455{
2456 struct ast_var_t *var;
2457 int name_len = strlen(name) + 1;
2458 int value_len = strlen(value) + 1;
2459
2460 if (!(var = ast_calloc(sizeof(*var) + name_len + value_len, sizeof(char)))) {
2461 return NULL;
2462 }
2463
2464 ast_copy_string(var->name, name, name_len);
2465 var->value = var->name + name_len;
2466 ast_copy_string(var->value, value, value_len);
2467
2468 return var;
2469}
#define var
Definition: ast_expr2f.c:605

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

Referenced by pbx_builtin_setvar_helper().

◆ ast_var_delete()

static void ast_var_delete ( struct ast_var_t var)
static

Definition at line 2471 of file extconf.c.

2472{
2473 free(var);
2474}

Referenced by pbx_builtin_setvar_helper().

◆ ast_var_name()

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

Definition at line 2170 of file extconf.c.

2171{
2172 const char *name;
2173
2174 if (var == NULL || (name = var->name) == NULL)
2175 return NULL;
2176 /* Return the name without the initial underscores */
2177 if (name[0] == '_') {
2178 name++;
2179 if (name[0] == '_')
2180 name++;
2181 }
2182 return name;
2183}

References name, NULL, and var.

Referenced by pbx_builtin_setvar_helper(), and pbx_retrieve_variable().

◆ ast_var_value()

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

Definition at line 5025 of file extconf.c.

5026{
5027 return (var ? var->value : NULL);
5028}

References NULL, and var.

Referenced by pbx_retrieve_variable().

◆ ast_variable_append()

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

Definition at line 1177 of file extconf.c.

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

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

◆ ast_variable_browse()

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

Definition at line 1215 of file extconf.c.

1216{
1217 struct ast_category *cat = NULL;
1218
1219 if (category && config->last_browse && (config->last_browse->name == category))
1220 cat = config->last_browse;
1221 else
1222 cat = ast_category_get(config, category);
1223
1224 return (cat) ? cat->root : NULL;
1225}
static struct ast_category * ast_category_get(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1210

Referenced by ast_variable_retrieve(), and pbx_load_config().

◆ ast_variable_new()

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

Definition at line 1055 of file extconf.c.

1056{
1057 struct ast_variable *variable;
1058 int name_len = strlen(name) + 1;
1059 size_t value_len = strlen(value) + 1;
1060 size_t filename_len = strlen(filename) + 1;
1061
1062 if ((variable = ast_calloc(1, name_len + value_len + filename_len + sizeof(*variable)))) {
1063 variable->name = variable->stuff;
1064 variable->value = variable->stuff + name_len;
1065 variable->file = variable->value + value_len;
1066 strcpy(variable->name,name);
1067 ast_copy_string(variable->value, value, value_len);
1068 ast_copy_string(variable->file, filename, filename_len);
1069 }
1070
1071 return variable;
1072}
Structure for variables, used for configurations and for channel variables.
char stuff[0]
Contents of file, name, and value in that order stuffed here.

References ast_calloc, ast_copy_string(), ast_variable::file, name, ast_variable::name, ast_variable::stuff, ast_variable::value, and value.

Referenced by process_text_line(), and variable_clone().

◆ ast_variable_retrieve()

static const char * ast_variable_retrieve ( const struct ast_config config,
const char *  category,
const char *  variable 
)
static

Definition at line 1227 of file extconf.c.

1228{
1229 struct ast_variable *v;
1230
1231 if (category) {
1232 for (v = ast_variable_browse(config, category); v; v = v->next) {
1233 if (!strcasecmp(variable, v->name))
1234 return v->value;
1235 }
1236 } else {
1237 struct ast_category *cat;
1238
1239 for (cat = config->root; cat; cat = cat->next)
1240 for (v = cat->root; v; v = v->next)
1241 if (!strcasecmp(variable, v->name))
1242 return v->value;
1243 }
1244
1245 return NULL;
1246}
static struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category)
Definition: extconf.c:1215

References ast_variable_browse(), config, ast_variable::name, ast_variable::next, ast_category::next, NULL, ast_category::root, and ast_variable::value.

Referenced by pbx_load_config().

◆ ast_variables_destroy()

static void ast_variables_destroy ( struct ast_variable v)
static

Definition at line 1262 of file extconf.c.

1263{
1264 struct ast_variable *vn;
1265
1266 while (v) {
1267 vn = v;
1268 v = v->next;
1269 free(vn);
1270 }
1271}

Referenced by ast_category_destroy(), and ast_config_destroy().

◆ ast_verbose()

void ast_verbose ( const char *  fmt,
  ... 
)

◆ ast_walk_context_extensions()

static struct ast_exten * ast_walk_context_extensions ( struct ast_context con,
struct ast_exten exten 
)
static

Definition at line 4040 of file extconf.c.

4042{
4043 if (!exten)
4044 return con ? con->root : NULL;
4045 else
4046 return exten->next;
4047}

References ast_exten::exten, NULL, and ast_context::root.

Referenced by localized_walk_context_extensions(), and pbx_find_extension().

◆ ast_walk_context_ignorepats()

static struct ast_ignorepat * ast_walk_context_ignorepats ( struct ast_context con,
struct ast_ignorepat ip 
)
static

Definition at line 4113 of file extconf.c.

4115{
4116 if (!ip)
4117 return con ? con->ignorepats : NULL;
4118 else
4119 return ip->next;
4120}

References ast_context::ignorepats, ast_ignorepat::next, and NULL.

Referenced by ast_context_ignorepats_count().

◆ ast_walk_context_includes()

static struct ast_include * ast_walk_context_includes ( struct ast_context con,
struct ast_include inc 
)
static

Definition at line 4080 of file extconf.c.

4082{
4083 if (!inc)
4084 return con ? con->includes : NULL;
4085 else
4086 return inc->next;
4087}

References ast_context::includes, ast_include::next, and NULL.

Referenced by ast_context_includes_count(), ast_context_verify_includes(), and localized_walk_context_includes().

◆ ast_walk_context_switches()

static struct ast_sw * ast_walk_context_switches ( struct ast_context con,
struct ast_sw sw 
)
static

Definition at line 4139 of file extconf.c.

4141{
4142 if (!sw)
4143 return con ? AST_LIST_FIRST(&con->alts) : NULL;
4144 else
4145 return AST_LIST_NEXT(sw, list);
4146}
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: extconf.c:1705
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: extconf.c:1723

References ast_context::alts, AST_LIST_FIRST, AST_LIST_NEXT, ast_sw::list, and NULL.

Referenced by ast_context_switches_count(), and localized_walk_context_switches().

◆ ast_walk_contexts()

static struct ast_context * ast_walk_contexts ( struct ast_context con)
static

Definition at line 4024 of file extconf.c.

4025{
4026 return con ? con->next : contexts;
4027}

Referenced by ast_context_find(), localized_pbx_load_module(), localized_walk_contexts(), and pbx_find_extension().

◆ ast_walk_extension_priorities()

static struct ast_exten * ast_walk_extension_priorities ( struct ast_exten exten,
struct ast_exten priority 
)
static

Definition at line 4061 of file extconf.c.

4063{
4064 return priority ? priority->peer : exten;
4065}

Referenced by localized_walk_extension_priorities(), and pbx_find_extension().

◆ ast_wrlock_context()

static int ast_wrlock_context ( struct ast_context con)
static

Definition at line 4619 of file extconf.c.

4620{
4621 return ast_rwlock_wrlock(&con->lock);
4622}
static int ast_rwlock_wrlock(ast_rwlock_t *prwlock)
Definition: extconf.c:544

References ast_rwlock_wrlock(), and ast_context::lock.

Referenced by __ast_context_destroy().

◆ ast_wrlock_contexts()

static int ast_wrlock_contexts ( void  )
static

Definition at line 4609 of file extconf.c.

4610{
4611 return ast_rwlock_wrlock(&conlock);
4612}

References ast_rwlock_wrlock(), and conlock.

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

◆ category_get()

static struct ast_category * category_get ( const struct ast_config config,
const char *  category_name,
int  ignored 
)
static

Definition at line 1192 of file extconf.c.

1193{
1194 struct ast_category *cat;
1195
1196 /* try exact match first, then case-insensitive match */
1197 for (cat = config->root; cat; cat = cat->next) {
1198 if (cat->name == category_name && (ignored || !cat->ignored))
1199 return cat;
1200 }
1201
1202 for (cat = config->root; cat; cat = cat->next) {
1203 if (!strcasecmp(cat->name, category_name) && (ignored || !cat->ignored))
1204 return cat;
1205 }
1206
1207 return NULL;
1208}

References config, ast_category::ignored, ast_category::name, ast_category::next, and NULL.

Referenced by ast_category_get(), localized_category_get(), and process_text_line().

◆ CB_ADD()

static void CB_ADD ( char *  str)
static

Definition at line 737 of file extconf.c.

738{
739 int rem = comment_buffer_size - strlen(comment_buffer) - 1;
740 int siz = strlen(str);
741 if (rem < siz+1) {
743 if (!comment_buffer)
744 return;
746 }
747 strcat(comment_buffer,str);
748}
const char * str
Definition: app_jack.c:147
#define ast_realloc(p, len)
A wrapper for realloc()
Definition: astmm.h:226
#define CB_INCR
Definition: extconf.c:711
static char * comment_buffer
Definition: extconf.c:705
static int comment_buffer_size
Definition: extconf.c:706

References ast_realloc, CB_INCR, comment_buffer, comment_buffer_size, and str.

Referenced by config_text_file_load().

◆ CB_ADD_LEN()

static void CB_ADD_LEN ( char *  str,
int  len 
)
static

Definition at line 750 of file extconf.c.

751{
752 int cbl = strlen(comment_buffer) + 1;
753 int rem = comment_buffer_size - cbl;
754 if (rem < len+1) {
756 if (!comment_buffer)
757 return;
759 }
760 strncat(comment_buffer,str,len); /* safe */
761 comment_buffer[cbl+len-1] = 0;
762}
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)

References ast_realloc, CB_INCR, comment_buffer, comment_buffer_size, len(), and str.

Referenced by config_text_file_load().

◆ CB_INIT()

static void CB_INIT ( void  )
static

Definition at line 718 of file extconf.c.

719{
720 if (!comment_buffer) {
722 if (!comment_buffer)
723 return;
724 comment_buffer[0] = 0;
727 if (!lline_buffer)
728 return;
729 lline_buffer[0] = 0;
731 } else {
732 comment_buffer[0] = 0;
733 lline_buffer[0] = 0;
734 }
735}
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
static char * lline_buffer
Definition: extconf.c:708
static int lline_buffer_size
Definition: extconf.c:709

References ast_malloc, CB_INCR, comment_buffer, comment_buffer_size, lline_buffer, and lline_buffer_size.

Referenced by config_text_file_load().

◆ CB_RESET()

static void CB_RESET ( void  )
static

Definition at line 777 of file extconf.c.

778{
779 comment_buffer[0] = 0;
780 lline_buffer[0] = 0;
781}

References comment_buffer, and lline_buffer.

Referenced by process_text_line().

◆ config_text_file_load()

static struct ast_config * config_text_file_load ( const char *  database,
const char *  table,
const char *  filename,
struct ast_config cfg,
int  withcomments,
const char *  suggested_include_file 
)
static

Definition at line 3119 of file extconf.c.

3120{
3121 char fn[256];
3122 char buf[8192];
3123 char *new_buf, *comment_p, *process_buf;
3124 FILE *f;
3125 int lineno=0;
3126 int comment = 0, nest[MAX_NESTED_COMMENTS];
3127 struct ast_category *cat = NULL;
3128 int count = 0;
3129 struct stat statbuf;
3130
3132
3133 if (filename[0] == '/') {
3134 ast_copy_string(fn, filename, sizeof(fn));
3135 } else {
3136 if (use_local_dir)
3137 snprintf(fn, sizeof(fn), "./%s", filename);
3138 else
3139 snprintf(fn, sizeof(fn), "%s/%s", ast_config_AST_CONFIG_DIR, filename);
3140 }
3141
3142 if (withcomments && cfg && cfg->include_level < 2 ) {
3143 CB_INIT();
3144 }
3145
3146 do {
3147 if (stat(fn, &statbuf))
3148 continue;
3149
3150 if (!S_ISREG(statbuf.st_mode)) {
3151 ast_log(LOG_WARNING, "'%s' is not a regular file, ignoring\n", fn);
3152 continue;
3153 }
3154 if (option_verbose > 1) {
3155 ast_verbose(VERBOSE_PREFIX_2 "Parsing '%s': ", fn);
3156 fflush(stdout);
3157 }
3158 if (!(f = fopen(fn, "r"))) {
3159 if (option_debug)
3160 ast_log(LOG_DEBUG, "No file to parse: %s\n", fn);
3161 if (option_verbose > 1)
3162 ast_verbose( "Not found (%s)\n", strerror(errno));
3163 continue;
3164 }
3165 count++;
3166 if (option_debug)
3167 ast_log(LOG_DEBUG, "Parsing %s\n", fn);
3168 if (option_verbose > 1)
3169 ast_verbose("Found\n");
3170 while(!feof(f)) {
3171 lineno++;
3172 if (fgets(buf, sizeof(buf), f)) {
3173 if ( withcomments ) {
3174 CB_ADD(lline_buffer); /* add the current lline buffer to the comment buffer */
3175 lline_buffer[0] = 0; /* erase the lline buffer */
3176 }
3177
3178 new_buf = buf;
3179 if (comment)
3180 process_buf = NULL;
3181 else
3182 process_buf = buf;
3183
3184 while ((comment_p = strchr(new_buf, COMMENT_META))) {
3185 if ((comment_p > new_buf) && (*(comment_p-1) == '\\')) {
3186 /* Yuck, gotta memmove */
3187 memmove(comment_p - 1, comment_p, strlen(comment_p) + 1);
3188 new_buf = comment_p;
3189 } else if(comment_p[1] == COMMENT_TAG && comment_p[2] == COMMENT_TAG && (comment_p[3] != '-')) {
3190 /* Meta-Comment start detected ";--" */
3192 *comment_p = '\0';
3193 new_buf = comment_p + 3;
3194 comment++;
3195 nest[comment-1] = lineno;
3196 } else {
3197 ast_log(LOG_ERROR, "Maximum nest limit of %d reached.\n", MAX_NESTED_COMMENTS);
3198 }
3199 } else if ((comment_p >= new_buf + 2) &&
3200 (*(comment_p - 1) == COMMENT_TAG) &&
3201 (*(comment_p - 2) == COMMENT_TAG)) {
3202 /* Meta-Comment end detected */
3203 comment--;
3204 new_buf = comment_p + 1;
3205 if (!comment) {
3206 /* Back to non-comment now */
3207 if (process_buf) {
3208 /* Actually have to move what's left over the top, then continue */
3209 char *oldptr;
3210 oldptr = process_buf + strlen(process_buf);
3211 if ( withcomments ) {
3212 CB_ADD(";");
3213 CB_ADD_LEN(oldptr+1,new_buf-oldptr-1);
3214 }
3215
3216 memmove(oldptr, new_buf, strlen(new_buf) + 1);
3217 new_buf = oldptr;
3218 } else
3219 process_buf = new_buf;
3220 }
3221 } else {
3222 if (!comment) {
3223 /* If ; is found, and we are not nested in a comment,
3224 we immediately stop all comment processing */
3225 if ( withcomments ) {
3226 LLB_ADD(comment_p);
3227 }
3228 *comment_p = '\0';
3229 new_buf = comment_p;
3230 } else
3231 new_buf = comment_p + 1;
3232 }
3233 }
3234 if( withcomments && comment && !process_buf )
3235 {
3236 CB_ADD(buf); /* the whole line is a comment, store it */
3237 }
3238
3239 if (process_buf) {
3240 char *stripped_process_buf = ast_strip(process_buf);
3241 if (!ast_strlen_zero(stripped_process_buf)) {
3242 if (process_text_line(cfg, &cat, stripped_process_buf, lineno, filename, withcomments, suggested_include_file)) {
3243 cfg = NULL;
3244 break;
3245 }
3246 }
3247 }
3248 }
3249 }
3250 fclose(f);
3251 } while(0);
3252 if (comment) {
3253 ast_log(LOG_WARNING,"Unterminated comment detected beginning on line %d\n", nest[comment]);
3254 }
3255 if (cfg && cfg->include_level == 1 && withcomments && comment_buffer) {
3256 if (comment_buffer) {
3260 lline_buffer=0;
3263 }
3264 }
3265 if (count == 0)
3266 return NULL;
3267
3268 return cfg;
3269}
#define comment
Definition: ael_lex.c:965
#define MAX_NESTED_COMMENTS
Definition: extconf.c:696
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)
Definition: extconf.c:2906
#define COMMENT_TAG
Definition: extconf.c:700
#define VERBOSE_PREFIX_2
Definition: extconf.c:101
static int use_local_dir
Definition: extconf.c:3103
static void CB_INIT(void)
Definition: extconf.c:718
struct ast_category * ast_config_get_current_category(const struct ast_config *cfg)
Retrieve the current category name being built.
Definition: extconf.c:2781
static void CB_ADD(char *str)
Definition: extconf.c:737
#define COMMENT_META
Definition: extconf.c:699
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: extconf.c:1023
static void CB_ADD_LEN(char *str, int len)
Definition: extconf.c:750
static void LLB_ADD(char *str)
Definition: extconf.c:764
const char * ast_config_AST_CONFIG_DIR
Definition: options.c:151

References ast_config_AST_CONFIG_DIR, ast_config_get_current_category(), ast_copy_string(), ast_log(), ast_strip(), ast_strlen_zero(), ast_verbose(), buf, CB_ADD(), CB_ADD_LEN(), CB_INIT(), comment, comment_buffer, comment_buffer_size, COMMENT_META, COMMENT_TAG, errno, free(), ast_config::include_level, LLB_ADD(), lline_buffer, lline_buffer_size, LOG_DEBUG, LOG_ERROR, LOG_WARNING, MAX_NESTED_COMMENTS, NULL, option_debug, option_verbose, process_text_line(), use_local_dir, and VERBOSE_PREFIX_2.

◆ destroy_exten()

static void destroy_exten ( struct ast_exten e)
static

Definition at line 3765 of file extconf.c.

3766{
3767 if (e->priority == PRIORITY_HINT)
3768 ast_remove_hint(e);
3769
3770 if (e->datad)
3771 e->datad(e->data);
3772 free(e);
3773}
static int ast_remove_hint(struct ast_exten *e)
ast_remove_hint: Remove hint from extension
Definition: extconf.c:3733
int priority
Definition: pbx.c:243

References ast_remove_hint(), ast_exten::data, ast_exten::datad, free(), ast_exten::priority, and PRIORITY_HINT.

Referenced by __ast_context_destroy().

◆ ext_cmp()

static int ext_cmp ( const char *  a,
const char *  b 
)
static

the full routine to compare extensions in rules.

Definition at line 3944 of file extconf.c.

3945{
3946 /* make sure non-patterns come first.
3947 * If a is not a pattern, it either comes first or
3948 * we use strcmp to compare the strings.
3949 */
3950 int ret = 0;
3951
3952 if (a[0] != '_')
3953 return (b[0] == '_') ? -1 : strcmp(a, b);
3954
3955 /* Now we know a is a pattern; if b is not, a comes first */
3956 if (b[0] != '_')
3957 return 1;
3958#if 0 /* old mode for ext matching */
3959 return strcmp(a, b);
3960#endif
3961 /* ok we need full pattern sorting routine */
3962 while (!ret && a && b)
3963 ret = ext_cmp1(&a) - ext_cmp1(&b);
3964 if (ret == 0)
3965 return 0;
3966 else
3967 return (ret > 0) ? 1 : -1;
3968}
static int ext_cmp1(const char **p)
helper functions to sort extensions and patterns in the desired way, so that more specific patterns a...
Definition: extconf.c:3872

References a, b, and ext_cmp1().

Referenced by ast_add_extension2().

◆ ext_cmp1()

static int ext_cmp1 ( const char **  p)
static

helper functions to sort extensions and patterns in the desired way, so that more specific patterns appear first.

ext_cmp1 compares individual characters (or sets of), returning an int where bits 0-7 are the ASCII code of the first char in the set, while bit 8-15 are the cardinality of the set minus 1. This way more specific patterns (smaller cardinality) appear first. Wildcards have a special value, so that we can directly compare them to sets by subtracting the two values. In particular: 0x000xx one character, xx 0x0yyxx yy character set starting with xx 0x10000 '.' (one or more of anything) 0x20000 '!' (zero or more of anything) 0x30000 NUL (end of string) 0x40000 error in set. The pointer to the string is advanced according to needs. NOTES:

  1. the empty set is equivalent to NUL.
  2. given that a full set has always 0 as the first element, we could encode the special cases as 0xffXX where XX is 1, 2, 3, 4 as used above.

Definition at line 3872 of file extconf.c.

3873{
3874 uint32_t chars[8];
3875 int c, cmin = 0xff, count = 0;
3876 const char *end;
3877
3878 /* load, sign extend and advance pointer until we find
3879 * a valid character.
3880 */
3881 while ( (c = *(*p)++) && (c == ' ' || c == '-') )
3882 ; /* ignore some characters */
3883
3884 /* always return unless we have a set of chars */
3885 switch (c) {
3886 default: /* ordinary character */
3887 return 0x0000 | (c & 0xff);
3888
3889 case 'N': /* 2..9 */
3890 return 0x0700 | '2' ;
3891
3892 case 'X': /* 0..9 */
3893 return 0x0900 | '0';
3894
3895 case 'Z': /* 1..9 */
3896 return 0x0800 | '1';
3897
3898 case '.': /* wildcard */
3899 return 0x10000;
3900
3901 case '!': /* earlymatch */
3902 return 0x20000; /* less specific than NULL */
3903
3904 case '\0': /* empty string */
3905 *p = NULL;
3906 return 0x30000;
3907
3908 case '[': /* pattern */
3909 break;
3910 }
3911 /* locate end of set */
3912 end = strchr(*p, ']');
3913
3914 if (end == NULL) {
3915 ast_log(LOG_WARNING, "Wrong usage of [] in the extension\n");
3916 return 0x40000; /* XXX make this entry go last... */
3917 }
3918
3919 memset(chars, '\0', sizeof(chars)); /* clear all chars in the set */
3920 for (; *p < end ; (*p)++) {
3921 unsigned char c1, c2; /* first-last char in range */
3922 c1 = (unsigned char)((*p)[0]);
3923 if (*p + 2 < end && (*p)[1] == '-') { /* this is a range */
3924 c2 = (unsigned char)((*p)[2]);
3925 *p += 2; /* skip a total of 3 chars */
3926 } else /* individual character */
3927 c2 = c1;
3928 if (c1 < cmin)
3929 cmin = c1;
3930 for (; c1 <= c2; c1++) {
3931 uint32_t mask = 1 << (c1 % 32);
3932 if ( (chars[ c1 / 32 ] & mask) == 0)
3933 count += 0x100;
3934 chars[ c1 / 32 ] |= mask;
3935 }
3936 }
3937 (*p)++;
3938 return count == 0 ? 0x30000 : (count | cmin);
3939}

References ast_log(), c, end, LOG_WARNING, and NULL.

Referenced by ext_cmp().

◆ ext_strncpy()

static int ext_strncpy ( char *  dst,
const char *  src,
int  len 
)
static

copy a string skipping whitespace

Definition at line 3971 of file extconf.c.

3972{
3973 int count=0;
3974
3975 while (*src && (count < len - 1)) {
3976 switch(*src) {
3977 case ' ':
3978 /* otherwise exten => [a-b],1,... doesn't work */
3979 /* case '-': */
3980 /* Ignore */
3981 break;
3982 default:
3983 *dst = *src;
3984 dst++;
3985 }
3986 src++;
3987 count++;
3988 }
3989 *dst = '\0';
3990
3991 return count;
3992}

References len().

Referenced by ast_add_extension2().

◆ extension_match_core()

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

Definition at line 4286 of file extconf.c.

4287{
4288 int i;
4289 i = _extension_match_core(pattern, data, mode);
4290 return i;
4291}
static int _extension_match_core(const char *pattern, const char *data, enum ext_match_t mode)
Definition: extconf.c:4191

References _extension_match_core(), and ast_context::data.

Referenced by ast_extension_match(), and pbx_find_extension().

◆ find_engine()

static struct ast_config_engine * find_engine ( const char *  family,
char *  database,
int  dbsiz,
char *  table,
int  tabsiz 
)
static

Find realtime engine for realtime family.

Definition at line 2747 of file extconf.c.

2748{
2749 struct ast_config_engine *eng, *ret = NULL;
2750 struct ast_config_map *map;
2751
2752
2753 for (map = config_maps; map; map = map->next) {
2754 if (!strcasecmp(family, map->name)) {
2755 if (database)
2756 ast_copy_string(database, map->database, dbsiz);
2757 if (table)
2758 ast_copy_string(table, map->table ? map->table : family, tabsiz);
2759 break;
2760 }
2761 }
2762
2763 /* Check if the required driver (engine) exist */
2764 if (map) {
2765 for (eng = config_engine_list; !ret && eng; eng = eng->next) {
2766 if (!strcasecmp(eng->name, map->driver))
2767 ret = eng;
2768 }
2769 }
2770
2771
2772 /* if we found a mapping, but the engine is not available, then issue a warning */
2773 if (map && !ret)
2774 ast_log(LOG_WARNING, "Realtime mapping for '%s' found to engine '%s', but the engine is not available\n", map->name, map->driver);
2775
2776 return ret;
2777}
static struct ast_config_map * config_maps
struct ast_config_engine * next
const char * driver
Definition: main/config.c:205
struct ast_config_map * next
Definition: main/config.c:200
const char * table
Definition: main/config.c:209
const char * database
Definition: main/config.c:207
const char * name
Definition: main/config.c:203

References ast_copy_string(), ast_log(), config_engine_list, config_maps, ast_config_map::database, ast_config_map::driver, LOG_WARNING, ast_config_map::name, ast_config_engine::next, ast_config_map::next, NULL, table, and ast_config_map::table.

Referenced by ast_config_internal_load().

◆ gen_header()

static void gen_header ( FILE *  f1,
const char *  configfile,
const char *  fn,
const char *  generator 
)
static

Definition at line 3388 of file extconf.c.

3389{
3390 char date[256]="";
3391 time_t t;
3392 time(&t);
3393 ast_copy_string(date, ctime(&t), sizeof(date));
3394
3395 fprintf(f1, ";!\n");
3396 fprintf(f1, ";! Automatically generated configuration file\n");
3397 if (strcmp(configfile, fn))
3398 fprintf(f1, ";! Filename: %s (%s)\n", configfile, fn);
3399 else
3400 fprintf(f1, ";! Filename: %s\n", configfile);
3401 fprintf(f1, ";! Generator: %s\n", generator);
3402 fprintf(f1, ";! Creation Date: %s", date);
3403 fprintf(f1, ";!\n");
3404}

References ast_copy_string().

Referenced by localized_config_text_file_save().

◆ get_range()

static unsigned get_range ( char *  src,
int  max,
char *const  names[],
const char *  msg 
)
static

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 at line 2638 of file extconf.c.

2639{
2640 int start, end; /* start and ending position */
2641 unsigned int mask = 0;
2642 char *part;
2643
2644 /* Check for whole range */
2645 if (ast_strlen_zero(src) || !strcmp(src, "*")) {
2646 return (1 << max) - 1;
2647 }
2648
2649 while ((part = strsep(&src, "&"))) {
2650 /* Get start and ending position */
2651 char *endpart = strchr(part, '-');
2652 if (endpart) {
2653 *endpart++ = '\0';
2654 }
2655 /* Find the start */
2656 if ((start = lookup_name(part, names, max)) < 0) {
2657 ast_log(LOG_WARNING, "Invalid %s '%s', skipping element\n", msg, part);
2658 continue;
2659 }
2660 if (endpart) { /* find end of range */
2661 if ((end = lookup_name(endpart, names, max)) < 0) {
2662 ast_log(LOG_WARNING, "Invalid end %s '%s', skipping element\n", msg, endpart);
2663 continue;
2664 }
2665 } else {
2666 end = start;
2667 }
2668 /* Fill the mask. Remember that ranges are cyclic */
2669 mask |= (1 << end); /* initialize with last element */
2670 while (start != end) {
2671 if (start >= max) {
2672 start = 0;
2673 }
2674 mask |= (1 << start);
2675 start++;
2676 }
2677 }
2678 return mask;
2679}
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 suppli...
Definition: extconf.c:2615
#define max(a, b)
Definition: f2c.h:198

References ast_log(), ast_strlen_zero(), end, LOG_WARNING, lookup_name(), max, and strsep().

Referenced by ast_build_timing().

◆ get_timerange()

static void get_timerange ( struct ast_timing i,
char *  times 
)
static

store a bitmask of valid times, one bit each 2 minute

Definition at line 2682 of file extconf.c.

2683{
2684 char *endpart, *part;
2685 int x;
2686 int st_h, st_m;
2687 int endh, endm;
2688 int minute_start, minute_end;
2689
2690 /* start disabling all times, fill the fields with 0's, as they may contain garbage */
2691 memset(i->minmask, 0, sizeof(i->minmask));
2692
2693 /* 1-minute per bit */
2694 /* Star is all times */
2695 if (ast_strlen_zero(times) || !strcmp(times, "*")) {
2696 /* 48, because each hour takes 2 integers; 30 bits each */
2697 for (x = 0; x < 48; x++) {
2698 i->minmask[x] = 0x3fffffff; /* 30 bits */
2699 }
2700 return;
2701 }
2702 /* Otherwise expect a range */
2703 while ((part = strsep(&times, "&"))) {
2704 if (!(endpart = strchr(part, '-'))) {
2705 if (sscanf(part, "%2d:%2d", &st_h, &st_m) != 2 || st_h < 0 || st_h > 23 || st_m < 0 || st_m > 59) {
2706 ast_log(LOG_WARNING, "%s isn't a valid time.\n", part);
2707 continue;
2708 }
2709 i->minmask[st_h * 2 + (st_m >= 30 ? 1 : 0)] |= (1 << (st_m % 30));
2710 continue;
2711 }
2712 *endpart++ = '\0';
2713 /* why skip non digits? Mostly to skip spaces */
2714 while (*endpart && !isdigit(*endpart)) {
2715 endpart++;
2716 }
2717 if (!*endpart) {
2718 ast_log(LOG_WARNING, "Invalid time range starting with '%s-'.\n", part);
2719 continue;
2720 }
2721 if (sscanf(part, "%2d:%2d", &st_h, &st_m) != 2 || st_h < 0 || st_h > 23 || st_m < 0 || st_m > 59) {
2722 ast_log(LOG_WARNING, "'%s' isn't a valid start time.\n", part);
2723 continue;
2724 }
2725 if (sscanf(endpart, "%2d:%2d", &endh, &endm) != 2 || endh < 0 || endh > 23 || endm < 0 || endm > 59) {
2726 ast_log(LOG_WARNING, "'%s' isn't a valid end time.\n", endpart);
2727 continue;
2728 }
2729 minute_start = st_h * 60 + st_m;
2730 minute_end = endh * 60 + endm;
2731 /* Go through the time and enable each appropriate bit */
2732 for (x = minute_start; x != minute_end; x = (x + 1) % (24 * 60)) {
2733 i->minmask[x / 30] |= (1 << (x % 30));
2734 }
2735 /* Do the last one */
2736 i->minmask[x / 30] |= (1 << (x % 30));
2737 }
2738 /* All done */
2739 return;
2740}
unsigned int minmask[48]
Definition: pbx.h:176

References ast_log(), ast_strlen_zero(), LOG_WARNING, ast_timing::minmask, and strsep().

Referenced by ast_build_timing().

◆ include_valid()

static int include_valid ( struct ast_include i)
inlinestatic

Definition at line 4311 of file extconf.c.

4312{
4313 if (!i->hastime)
4314 return 1;
4315
4316 return ast_check_timing(&(i->timing));
4317}
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.
Definition: extconf.c:4000

References ast_check_timing(), ast_include::hastime, and ast_include::timing.

Referenced by pbx_find_extension().

◆ inherit_category()

static void inherit_category ( struct ast_category new,
const struct ast_category base 
)
static

Definition at line 2823 of file extconf.c.

2824{
2825 struct ast_variable *var;
2826
2827 for (var = base->root; var; var = var->next)
2829}
static void ast_variable_append(struct ast_category *category, struct ast_variable *variable)
Definition: extconf.c:1177
static struct ast_variable * variable_clone(const struct ast_variable *old)
Definition: extconf.c:1248

References ast_variable_append(), ast_category::root, var, and variable_clone().

Referenced by process_text_line().

◆ LLB_ADD()

static void LLB_ADD ( char *  str)
static

Definition at line 764 of file extconf.c.

765{
766 int rem = lline_buffer_size - strlen(lline_buffer) - 1;
767 int siz = strlen(str);
768 if (rem < siz+1) {
770 if (!lline_buffer)
771 return;
772 lline_buffer_size += CB_INCR + siz + 1;
773 }
774 strcat(lline_buffer,str);
775}

References ast_realloc, CB_INCR, lline_buffer, lline_buffer_size, and str.

Referenced by config_text_file_load().

◆ localized_add_extension2()

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(*)(void *)  datad,
const char *  registrar 
)

Definition at line 4895 of file extconf.c.

4899{
4900 return ast_add_extension2(con, replace, extension, priority, label, callerid, application, data, datad, registrar);
4901}
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.
Definition: extconf.c:4773

References ast_add_extension2(), ast_exten::data, ast_exten::datad, ast_exten::label, priority, registrar, and replace().

◆ localized_ast_include_rename()

void localized_ast_include_rename ( struct ast_config conf,
const char *  from_file,
const char *  to_file 
)

Definition at line 1110 of file extconf.c.

1111{
1112 struct ast_config_include *incl;
1113 struct ast_category *cat;
1114 struct ast_variable *v;
1115
1116 int from_len = strlen(from_file);
1117 int to_len = strlen(to_file);
1118
1119 if (strcmp(from_file, to_file) == 0) /* no use wasting time if the name is the same */
1120 return;
1121
1122 /* the manager code allows you to read in one config file, then
1123 write it back out under a different name. But, the new arrangement
1124 ties output lines to the file name. So, before you try to write
1125 the config file to disk, better riffle thru the data and make sure
1126 the file names are changed.
1127 */
1128 /* file names are on categories, includes (of course), and on variables. So,
1129 traverse all this and swap names */
1130
1131 for (incl = conf->includes; incl; incl=incl->next) {
1132 if (strcmp(incl->include_location_file,from_file) == 0) {
1133 if (from_len >= to_len)
1134 strcpy(incl->include_location_file, to_file);
1135 else {
1137 incl->include_location_file = strdup(to_file);
1138 }
1139 }
1140 }
1141 for (cat = conf->root; cat; cat = cat->next) {
1142 if (strcmp(cat->file,from_file) == 0) {
1143 if (from_len >= to_len)
1144 strcpy(cat->file, to_file);
1145 else {
1146 free(cat->file);
1147 cat->file = strdup(to_file);
1148 }
1149 }
1150 for (v = cat->root; v; v = v->next) {
1151 if (strcmp(v->file,from_file) == 0) {
1152 if (from_len >= to_len)
1153 strcpy(v->file, to_file);
1154 else {
1155 free(v->file);
1156 v->file = strdup(to_file);
1157 }
1158 }
1159 }
1160 }
1161}

References ast_variable::file, ast_category::file, free(), ast_config_include::include_location_file, ast_variable::next, ast_category::next, ast_config_include::next, ast_category::root, and strdup.

◆ localized_category_get()

struct ast_category * localized_category_get ( const struct ast_config config,
const char *  category_name 
)

Definition at line 2801 of file extconf.c.

2802{
2803 return category_get(config, category_name, 0);
2804}

References category_get(), and config.

◆ localized_config_load()

struct ast_config * localized_config_load ( const char *  filename)

Definition at line 3285 of file extconf.c.

3286{
3287 struct ast_config *cfg;
3288 struct ast_config *result;
3289
3290 cfg = ast_config_new();
3291 if (!cfg)
3292 return NULL;
3293
3294 result = ast_config_internal_load(filename, cfg, 0, "");
3295 if (!result)
3296 ast_config_destroy(cfg);
3297
3298 return result;
3299}
static struct ast_config * ast_config_new(void)
Definition: extconf.c:3274
static struct ast_config * ast_config_internal_load(const char *filename, struct ast_config *cfg, int withcomments, const char *suggested_incl_file)
Definition: extconf.c:2862
static void ast_config_destroy(struct ast_config *cfg)
Definition: extconf.c:1289

References ast_config_destroy(), ast_config_internal_load(), ast_config_new(), NULL, and result.

Referenced by pbx_load_config().

◆ localized_config_load_with_comments()

struct ast_config * localized_config_load_with_comments ( const char *  filename)

Definition at line 3303 of file extconf.c.

3304{
3305 struct ast_config *cfg;
3306 struct ast_config *result;
3307
3308 cfg = ast_config_new();
3309 if (!cfg)
3310 return NULL;
3311
3312 result = ast_config_internal_load(filename, cfg, 1, "");
3313 if (!result)
3314 ast_config_destroy(cfg);
3315
3316 return result;
3317}

References ast_config_destroy(), ast_config_internal_load(), ast_config_new(), NULL, and result.

◆ localized_config_text_file_save()

int localized_config_text_file_save ( const char *  configfile,
const struct ast_config cfg,
const char *  generator 
)

Definition at line 3421 of file extconf.c.

3422{
3423 FILE *f;
3424 char fn[256];
3425 struct ast_variable *var;
3426 struct ast_category *cat;
3427 struct ast_comment *cmt;
3428 struct ast_config_include *incl;
3429 int blanklines = 0;
3430
3431 /* reset all the output flags, in case this isn't our first time saving this data */
3432
3433 for (incl=cfg->includes; incl; incl = incl->next)
3434 incl->output = 0;
3435
3436 /* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions)
3437 are all truncated to zero bytes and have that nice header*/
3438
3439 for (incl=cfg->includes; incl; incl = incl->next)
3440 {
3441 if (!incl->exec) { /* leave the execs alone -- we'll write out the #exec directives, but won't zero out the include files or exec files*/
3442 FILE *f1;
3443
3444 set_fn(fn, sizeof(fn), incl->included_file, configfile); /* normally, fn is just set to incl->included_file, prepended with config dir if relative */
3445 f1 = fopen(fn,"w");
3446 if (f1) {
3447 gen_header(f1, configfile, fn, generator);
3448 fclose(f1); /* this should zero out the file */
3449 } else {
3450 ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
3451 }
3452 }
3453 }
3454
3455 set_fn(fn, sizeof(fn), 0, configfile); /* just set fn to absolute ver of configfile */
3456#ifdef __CYGWIN__
3457 if ((f = fopen(fn, "w+"))) {
3458#else
3459 if ((f = fopen(fn, "w"))) {
3460#endif
3461 if (option_verbose > 1)
3462 ast_verbose(VERBOSE_PREFIX_2 "Saving '%s': ", fn);
3463
3464 gen_header(f, configfile, fn, generator);
3465 cat = cfg->root;
3466 fclose(f);
3467
3468 /* from here out, we open each involved file and concat the stuff we need to add to the end and immediately close... */
3469 /* since each var, cat, and associated comments can come from any file, we have to be
3470 mobile, and open each file, print, and close it on an entry-by-entry basis */
3471
3472 while(cat) {
3473 set_fn(fn, sizeof(fn), cat->file, configfile);
3474 f = fopen(fn, "a");
3475 if (!f)
3476 {
3477 ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
3478 return -1;
3479 }
3480
3481 /* dump any includes that happen before this category header */
3482 for (incl=cfg->includes; incl; incl = incl->next) {
3483 if (strcmp(incl->include_location_file, cat->file) == 0){
3484 if (cat->lineno > incl->include_location_lineno && !incl->output) {
3485 if (incl->exec)
3486 fprintf(f,"#exec \"%s\"\n", incl->exec_file);
3487 else
3488 fprintf(f,"#include \"%s\"\n", incl->included_file);
3489 incl->output = 1;
3490 }
3491 }
3492 }
3493
3494 /* Dump section with any appropriate comment */
3495 for (cmt = cat->precomments; cmt; cmt=cmt->next) {
3496 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!')
3497 fprintf(f,"%s", cmt->cmt);
3498 }
3499 if (!cat->precomments)
3500 fprintf(f,"\n");
3501 fprintf(f, "[%s]", cat->name);
3502 for(cmt = cat->sameline; cmt; cmt=cmt->next) {
3503 fprintf(f,"%s", cmt->cmt);
3504 }
3505 if (!cat->sameline)
3506 fprintf(f,"\n");
3507 fclose(f);
3508
3509 var = cat->root;
3510 while(var) {
3511 set_fn(fn, sizeof(fn), var->file, configfile);
3512 f = fopen(fn, "a");
3513 if (!f)
3514 {
3515 ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
3516 return -1;
3517 }
3518
3519 /* dump any includes that happen before this category header */
3520 for (incl=cfg->includes; incl; incl = incl->next) {
3521 if (strcmp(incl->include_location_file, var->file) == 0){
3522 if (var->lineno > incl->include_location_lineno && !incl->output) {
3523 if (incl->exec)
3524 fprintf(f,"#exec \"%s\"\n", incl->exec_file);
3525 else
3526 fprintf(f,"#include \"%s\"\n", incl->included_file);
3527 incl->output = 1;
3528 }
3529 }
3530 }
3531
3532 for (cmt = var->precomments; cmt; cmt=cmt->next) {
3533 if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!')
3534 fprintf(f,"%s", cmt->cmt);
3535 }
3536 if (var->sameline)
3537 fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt);
3538 else
3539 fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value);
3540 if (var->blanklines) {
3541 blanklines = var->blanklines;
3542 while (blanklines--)
3543 fprintf(f, "\n");
3544 }
3545
3546 fclose(f);
3547
3548
3549 var = var->next;
3550 }
3551 cat = cat->next;
3552 }
3553 if ((option_verbose > 1) && !option_debug)
3554 ast_verbose("Saved\n");
3555 } else {
3556 if (option_debug)
3557 ast_log(LOG_DEBUG, "Unable to open for writing: %s\n", fn);
3558 if (option_verbose > 1)
3559 ast_verbose(VERBOSE_PREFIX_2 "Unable to write (%s)", strerror(errno));
3560 return -1;
3561 }
3562
3563 /* Now, for files with trailing #include/#exec statements,
3564 we have to make sure every entry is output */
3565
3566 for (incl=cfg->includes; incl; incl = incl->next) {
3567 if (!incl->output) {
3568 /* open the respective file */
3569 set_fn(fn, sizeof(fn), incl->include_location_file, configfile);
3570 f = fopen(fn, "a");
3571 if (!f)
3572 {
3573 ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
3574 return -1;
3575 }
3576
3577 /* output the respective include */
3578 if (incl->exec)
3579 fprintf(f,"#exec \"%s\"\n", incl->exec_file);
3580 else
3581 fprintf(f,"#include \"%s\"\n", incl->included_file);
3582 fclose(f);
3583 incl->output = 1;
3584 }
3585 }
3586
3587 return 0;
3588}
static void gen_header(FILE *f1, const char *configfile, const char *fn, const char *generator)
Definition: extconf.c:3388
static void set_fn(char *fn, int fn_size, const char *file, const char *configfile)
Definition: extconf.c:3406
struct ast_comment * precomments
Definition: main/config.c:236
struct ast_comment * sameline
Definition: main/config.c:237
struct ast_comment * next
Definition: main/config.c:85

References ast_log(), ast_verbose(), ast_comment::cmt, errno, ast_config_include::exec, ast_config_include::exec_file, ast_category::file, gen_header(), ast_config_include::include_location_file, ast_config_include::include_location_lineno, ast_config_include::included_file, ast_config::includes, ast_category::lineno, LOG_DEBUG, ast_category::name, ast_comment::next, ast_category::next, ast_config_include::next, option_debug, option_verbose, ast_config_include::output, ast_category::precomments, ast_category::root, ast_config::root, ast_category::sameline, set_fn(), var, and VERBOSE_PREFIX_2.

◆ localized_context_add_ignorepat2()

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

Definition at line 4599 of file extconf.c.

4600{
4602}
static int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar)
Definition: extconf.c:4567

References ast_context_add_ignorepat2(), registrar, and value.

◆ localized_context_add_include2()

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

Definition at line 4557 of file extconf.c.

4559{
4561}
static int ast_context_add_include2(struct ast_context *con, const char *value, const char *registrar)
Definition: extconf.c:4501

References ast_context_add_include2(), registrar, and value.

◆ localized_context_add_switch2()

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

Definition at line 4700 of file extconf.c.

4702{
4703 return ast_context_add_switch2(con, value, data, eval, registrar);
4704}
static int ast_context_add_switch2(struct ast_context *con, const char *value, const char *data, int eval, const char *registrar)
Definition: extconf.c:4639

References ast_context_add_switch2(), ast_sw::data, ast_sw::eval, registrar, and value.

◆ localized_context_destroy()

void localized_context_destroy ( struct ast_context con,
const char *  registrar 
)

◆ localized_context_find_or_create()

struct ast_context * localized_context_find_or_create ( struct ast_context **  extcontexts,
void *  tab,
const char *  name,
const char *  registrar 
)
Version
1.6.1 added tab parameter
1.6.1 renamed function from localized_context_create to localized_context_find_or_create

Definition at line 4986 of file extconf.c.

4987{
4988 return __ast_context_create(extcontexts, name, registrar, 1);
4989}

References __ast_context_create(), name, and registrar.

◆ localized_context_verify_includes()

int localized_context_verify_includes ( struct ast_context con)

Definition at line 5637 of file extconf.c.

5638{
5639 return ast_context_verify_includes(con);
5640}
static int ast_context_verify_includes(struct ast_context *con)
Definition: extconf.c:5620

References ast_context_verify_includes().

◆ localized_find_extension()

struct ast_exten * localized_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 
)

Definition at line 4468 of file extconf.c.

4476{
4477 return pbx_find_extension(NULL, bypass, q, context, exten, priority, label, callerid, action);
4478}
static struct ast_exten * pbx_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)
Definition: extconf.c:4332

References voicemailpwcheck::context, ast_exten::exten, ast_exten::label, NULL, pbx_find_extension(), and priority.

Referenced by pbx_find_extension().

◆ localized_merge_contexts_and_delete()

void localized_merge_contexts_and_delete ( struct ast_context **  extcontexts,
void *  tab,
const char *  registrar 
)
Version
1.6.1 added tab parameter

Definition at line 5615 of file extconf.c.

5616{
5618}
static void ast_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar)
Definition: extconf.c:5570

References ast_merge_contexts_and_delete(), and registrar.

◆ localized_pbx_builtin_setvar()

int localized_pbx_builtin_setvar ( struct ast_channel chan,
const void *  data 
)

Definition at line 2605 of file extconf.c.

2606{
2607 return pbx_builtin_setvar(chan, data);
2608}
static int pbx_builtin_setvar(struct ast_channel *chan, const void *data)
Definition: extconf.c:2568

References pbx_builtin_setvar().

◆ localized_pbx_load_module()

int localized_pbx_load_module ( void  )

Definition at line 5644 of file extconf.c.

5645{
5646 struct ast_context *con;
5647
5649 return -1 /* AST_MODULE_LOAD_DECLINE*/;
5650
5651 /* pbx_load_users(); */ /* does this affect the dialplan? */
5652
5654
5655 for (con = NULL; (con = ast_walk_contexts(con));)
5657
5658 printf("=== Loading extensions.conf ===\n");
5659 con = 0;
5660 while ((con = ast_walk_contexts(con)) ) {
5661 printf("Context: %s\n", con->name);
5662 }
5663 printf("=========\n");
5664
5665 return 0;
5666}
static struct ast_context * local_contexts
Definition: extconf.c:3596
static int pbx_load_config(const char *config_file)
Definition: extconf.c:5336
static char * global_registrar
Definition: extconf.c:2121
static char * config_filename
Definition: extconf.c:2120

References ast_context_verify_includes(), ast_merge_contexts_and_delete(), ast_walk_contexts(), config_filename, global_registrar, local_contexts, ast_context::name, NULL, and pbx_load_config().

Referenced by check_goto(), and check_pval_item().

◆ localized_use_conf_dir()

void localized_use_conf_dir ( void  )

Definition at line 3113 of file extconf.c.

3114{
3115 use_local_dir = 0;
3116}

References use_local_dir.

Referenced by main().

◆ localized_use_local_dir()

void localized_use_local_dir ( void  )

Definition at line 3108 of file extconf.c.

3109{
3110 use_local_dir = 1;
3111}

References use_local_dir.

Referenced by main().

◆ localized_walk_context_extensions()

struct ast_exten * localized_walk_context_extensions ( struct ast_context con,
struct ast_exten exten 
)

Definition at line 4051 of file extconf.c.

4053{
4054 return ast_walk_context_extensions(con,exten);
4055}
static struct ast_exten * ast_walk_context_extensions(struct ast_context *con, struct ast_exten *exten)
Definition: extconf.c:4040

References ast_walk_context_extensions(), and ast_exten::exten.

◆ localized_walk_context_includes()

struct ast_include * localized_walk_context_includes ( struct ast_context con,
struct ast_include inc 
)

Definition at line 4104 of file extconf.c.

4106{
4107 return ast_walk_context_includes(con, inc);
4108}

References ast_walk_context_includes().

◆ localized_walk_context_switches()

struct ast_sw * localized_walk_context_switches ( struct ast_context con,
struct ast_sw sw 
)

Definition at line 4150 of file extconf.c.

4152{
4153 return ast_walk_context_switches(con, sw);
4154}

References ast_walk_context_switches().

◆ localized_walk_contexts()

struct ast_context * localized_walk_contexts ( struct ast_context con)

Definition at line 4030 of file extconf.c.

4031{
4032 return ast_walk_contexts(con);
4033}

References ast_walk_contexts().

◆ localized_walk_extension_priorities()

struct ast_exten * localized_walk_extension_priorities ( struct ast_exten exten,
struct ast_exten priority 
)

Definition at line 4069 of file extconf.c.

4071{
4073}
static struct ast_exten * ast_walk_extension_priorities(struct ast_exten *exten, struct ast_exten *priority)
Definition: extconf.c:4061

References ast_walk_extension_priorities(), ast_exten::exten, and priority.

◆ lookup_name()

static int lookup_name ( const char *  s,
char *const  names[],
int  max 
)
static

Helper for get_range. return the index of the matching entry, starting from 1. If names is not supplied, try numeric values.

Definition at line 2615 of file extconf.c.

2616{
2617 int i;
2618
2619 if (names && *s > '9') {
2620 for (i = 0; names[i]; i++) {
2621 if (!strcasecmp(s, names[i])) {
2622 return i;
2623 }
2624 }
2625 }
2626
2627 /* Allow months and weekdays to be specified as numbers, as well */
2628 if (sscanf(s, "%2d", &i) == 1 && i >= 1 && i <= max) {
2629 /* What the array offset would have been: "1" would be at offset 0 */
2630 return i - 1;
2631 }
2632 return -1; /* error return */
2633}

References max.

Referenced by get_range().

◆ matchcid()

static int matchcid ( const char *  cidpattern,
const char *  callerid 
)
static

Definition at line 4300 of file extconf.c.

4301{
4302 /* If the Caller*ID pattern is empty, then we're matching NO Caller*ID, so
4303 failing to get a number should count as a match, otherwise not */
4304
4305 if (ast_strlen_zero(callerid))
4306 return ast_strlen_zero(cidpattern) ? 1 : 0;
4307
4308 return ast_extension_match(cidpattern, callerid);
4309}
static int ast_extension_match(const char *pattern, const char *data)
Definition: extconf.c:4295

References ast_extension_match(), and ast_strlen_zero().

Referenced by pbx_find_extension().

◆ move_variables()

static void move_variables ( struct ast_category old,
struct ast_category new 
)
static

Definition at line 2806 of file extconf.c.

2807{
2808 struct ast_variable *var = old->root;
2809 old->root = NULL;
2810#if 1
2811 /* we can just move the entire list in a single op */
2813#else
2814 while (var) {
2815 struct ast_variable *next = var->next;
2816 var->next = NULL;
2818 var = next;
2819 }
2820#endif
2821}

References ast_variable_append(), ast_variable::next, NULL, ast_category::root, and var.

Referenced by process_text_line().

◆ next_available_category()

static struct ast_category * next_available_category ( struct ast_category cat)
static

Definition at line 3319 of file extconf.c.

3320{
3321 for (; cat && cat->ignored; cat = cat->next);
3322
3323 return cat;
3324}

References ast_category::ignored, and ast_category::next.

Referenced by ast_category_browse().

◆ null_datad()

static void null_datad ( void *  foo)
static

Definition at line 2742 of file extconf.c.

2743{
2744}

Referenced by ast_add_extension2().

◆ parse_variable_name()

static int parse_variable_name ( char *  var,
int *  offset,
int *  length,
int *  isfunc 
)
static

extract offset:length from variable name. Returns 1 if there is a offset:length part, which is trimmed off (values go into variables)

Definition at line 5003 of file extconf.c.

5004{
5005 int parens=0;
5006
5007 *offset = 0;
5008 *length = INT_MAX;
5009 *isfunc = 0;
5010 for (; *var; var++) {
5011 if (*var == '(') {
5012 (*isfunc)++;
5013 parens++;
5014 } else if (*var == ')') {
5015 parens--;
5016 } else if (*var == ':' && parens == 0) {
5017 *var++ = '\0';
5018 sscanf(var, "%30d:%30d", offset, length);
5019 return 1; /* offset:length valid */
5020 }
5021 }
5022 return 0;
5023}

References var.

Referenced by pbx_retrieve_variable(), and pbx_substitute_variables_helper_full().

◆ pbx_builtin_setvar()

static int pbx_builtin_setvar ( struct ast_channel chan,
const void *  data 
)
static

Definition at line 2568 of file extconf.c.

2569{
2570 char *name, *value, *mydata;
2571 int argc;
2572 char *argv[24]; /* this will only support a maximum of 24 variables being set in a single operation */
2573 int global = 0;
2574 int x;
2575
2576 if (ast_strlen_zero(data)) {
2577 ast_log(LOG_WARNING, "Set requires at least one variable name/value pair.\n");
2578 return 0;
2579 }
2580
2581 mydata = ast_strdupa(data);
2582 argc = ast_app_separate_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0]));
2583
2584 /* check for a trailing flags argument */
2585 if ((argc > 1) && !strchr(argv[argc-1], '=')) {
2586 argc--;
2587 if (strchr(argv[argc], 'g'))
2588 global = 1;
2589 }
2590
2591 for (x = 0; x < argc; x++) {
2592 name = argv[x];
2593 if ((value = strchr(name, '='))) {
2594 *value++ = '\0';
2596 } else
2597 ast_log(LOG_WARNING, "Ignoring entry '%s' with no = (and not last 'options' entry)\n", name);
2598 }
2599
2600 return(0);
2601}
static void pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Definition: extconf.c:2528
static unsigned int ast_app_separate_args(char *buf, char delim, char **array, int arraylen)
Definition: extconf.c:2486
static struct aco_type global
Definition: test_config.c:1445

References ast_app_separate_args(), ast_log(), ast_strdupa, ast_strlen_zero(), global, LOG_WARNING, name, NULL, pbx_builtin_setvar_helper(), and value.

Referenced by localized_pbx_builtin_setvar().

◆ pbx_builtin_setvar_helper()

static void pbx_builtin_setvar_helper ( struct ast_channel chan,
const char *  name,
const char *  value 
)
static

Definition at line 2528 of file extconf.c.

2529{
2530 struct ast_var_t *newvariable;
2531 struct varshead *headp;
2532 const char *nametail = name;
2533
2534 /* XXX may need locking on the channel ? */
2535 if (name[strlen(name)-1] == ')') {
2536 char *function = ast_strdupa(name);
2537
2538 ast_func_write(chan, function, value);
2539 return;
2540 }
2541
2542 headp = &globals;
2543
2544 /* For comparison purposes, we have to strip leading underscores */
2545 if (*nametail == '_') {
2546 nametail++;
2547 if (*nametail == '_')
2548 nametail++;
2549 }
2550
2551 AST_LIST_TRAVERSE (headp, newvariable, entries) {
2552 if (strcasecmp(ast_var_name(newvariable), nametail) == 0) {
2553 /* there is already such a variable, delete it */
2554 AST_LIST_REMOVE(headp, newvariable, entries);
2555 ast_var_delete(newvariable);
2556 break;
2557 }
2558 }
2559
2560 if (value && (newvariable = ast_var_assign(name, value))) {
2561 if ((option_verbose > 1) && (headp == &globals))
2562 ast_verbose(VERBOSE_PREFIX_2 "Setting global variable '%s' to '%s'\n", name, value);
2563 AST_LIST_INSERT_HEAD(headp, newvariable, entries);
2564 }
2565
2566}
static struct ast_var_t * ast_var_assign(const char *name, const char *value)
Definition: extconf.c:2454
static const char * ast_var_name(const struct ast_var_t *var)
Definition: extconf.c:2170
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: extconf.c:1956
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: extconf.c:2037
static int ast_func_write(struct ast_channel *chan, const char *function, const char *value)
Definition: extconf.c:2478
static void ast_var_delete(struct ast_var_t *var)
Definition: extconf.c:2471
static struct varshead globals
Definition: extconf.c:2068

References ast_func_write(), AST_LIST_INSERT_HEAD, AST_LIST_REMOVE, AST_LIST_TRAVERSE, ast_strdupa, ast_var_assign(), ast_var_delete(), ast_var_name(), ast_verbose(), globals, name, option_verbose, value, and VERBOSE_PREFIX_2.

Referenced by pbx_builtin_setvar(), and pbx_load_config().

◆ pbx_extension_helper()

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

The return value depends on the action:

E_MATCH, E_CANMATCH, E_MATCHMORE require a real match, and return 0 on failure, -1 on match; E_FINDLABEL maps the label to a priority, and returns the priority on success, ... XXX E_SPAWN, spawn an application, and return 0 on success, -1 on failure.

Definition at line 4914 of file extconf.c.

4917{
4918 struct ast_exten *e;
4919 int res;
4920 struct pbx_find_info q = { .stacklen = 0 }; /* the rest is reset in pbx_find_extension */
4921
4922 int matching_action = (action == E_MATCH || action == E_CANMATCH || action == E_MATCHMORE);
4923
4924 e = pbx_find_extension(NULL, con, &q, context, exten, priority, label, callerid, action);
4925 if (e) {
4926 if (matching_action) {
4927 return -1; /* success, we found it */
4928 } else if (action == E_FINDLABEL) { /* map the label to a priority */
4929 res = e->priority;
4930 return res; /* the priority we were looking for */
4931 } else { /* spawn */
4932
4933 /* NOT!!!!! */
4934 return 0;
4935 }
4936 } else if (q.swo) { /* not found here, but in another switch */
4937 if (matching_action)
4938 return -1;
4939 else {
4940 if (!q.swo->exec) {
4941 ast_log(LOG_WARNING, "No execution engine for switch %s\n", q.swo->name);
4942 res = -1;
4943 }
4944 return q.swo->exec(c, q.foundcontext ? q.foundcontext : context, exten, priority, callerid, q.data);
4945 }
4946 } else { /* not found anywhere, see what happened */
4947 switch (q.status) {
4948 case STATUS_NO_CONTEXT:
4949 if (!matching_action)
4950 ast_log(LOG_NOTICE, "Cannot find extension context '%s'\n", context);
4951 break;
4953 if (!matching_action)
4954 ast_log(LOG_NOTICE, "Cannot find extension '%s' in context '%s'\n", exten, context);
4955 break;
4956 case STATUS_NO_PRIORITY:
4957 if (!matching_action)
4958 ast_log(LOG_NOTICE, "No such priority %d in extension '%s' in context '%s'\n", priority, exten, context);
4959 break;
4960 case STATUS_NO_LABEL:
4961 if (context)
4962 ast_log(LOG_NOTICE, "No such label '%s' in extension '%s' in context '%s'\n", label, exten, context);
4963 break;
4964 default:
4965 if (option_debug)
4966 ast_log(LOG_DEBUG, "Shouldn't happen!\n");
4967 }
4968
4969 return (matching_action) ? 0 : -1;
4970 }
4971}
#define STATUS_NO_LABEL
Definition: extconf.c:2451
#define STATUS_NO_EXTENSION
Definition: extconf.c:2449
#define STATUS_NO_CONTEXT
Definition: extconf.c:2448
#define STATUS_NO_PRIORITY
Definition: extconf.c:2450
#define LOG_NOTICE
Definition: extconf.c:133
@ E_CANMATCH
Definition: extconf.h:216
ast_switch_f * exec
Definition: pbx.h:167
const char * name
Definition: pbx.h:162
int stacklen
Definition: extconf.h:237
struct ast_switch * swo
Definition: extconf.h:239
const char * foundcontext
Definition: extconf.h:241
const char * data
Definition: extconf.h:240

References ast_log(), c, voicemailpwcheck::context, pbx_find_info::data, E_CANMATCH, E_FINDLABEL, E_MATCH, E_MATCHMORE, ast_switch::exec, pbx_find_info::foundcontext, LOG_DEBUG, LOG_NOTICE, LOG_WARNING, ast_switch::name, NULL, option_debug, pbx_find_extension(), priority, ast_exten::priority, pbx_find_info::stacklen, pbx_find_info::status, STATUS_NO_CONTEXT, STATUS_NO_EXTENSION, STATUS_NO_LABEL, STATUS_NO_PRIORITY, and pbx_find_info::swo.

Referenced by ast_findlabel_extension2().

◆ pbx_find_extension()

static struct ast_exten * pbx_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

Definition at line 4332 of file extconf.c.

4341{
4342 int x;
4343 struct ast_context *tmp;
4344 struct ast_exten *e, *eroot;
4345 struct ast_include *i;
4346
4347 if (!context) {
4348 return NULL;
4349 }
4350
4351 /* Initialize status if appropriate */
4352 if (q->stacklen == 0) {
4354 q->swo = NULL;
4355 q->data = NULL;
4356 q->foundcontext = NULL;
4357 } else if (q->stacklen >= AST_PBX_MAX_STACK) {
4358 ast_log(LOG_WARNING, "Maximum PBX stack exceeded\n");
4359 return NULL;
4360 }
4361 /* Check first to see if we've already been checked */
4362 for (x = 0; x < q->stacklen; x++) {
4363 if (!strcasecmp(q->incstack[x], context))
4364 return NULL;
4365 }
4366 if (bypass) /* bypass means we only look there */
4367 tmp = bypass;
4368 else { /* look in contexts */
4369 tmp = NULL;
4370 while ((tmp = ast_walk_contexts(tmp)) ) {
4371 if (!strcmp(tmp->name, context))
4372 break;
4373 }
4374 if (!tmp)
4375 return NULL;
4376 }
4377 if (q->status < STATUS_NO_EXTENSION)
4379
4380 /* scan the list trying to match extension and CID */
4381 eroot = NULL;
4382 while ( (eroot = ast_walk_context_extensions(tmp, eroot)) ) {
4383 int match = extension_match_core(eroot->exten, exten, action);
4384 /* 0 on fail, 1 on match, 2 on earlymatch */
4385
4386 if (!match || (eroot->matchcid && !matchcid(eroot->cidmatch, callerid)))
4387 continue; /* keep trying */
4388 if (match == 2 && action == E_MATCHMORE) {
4389 /* We match an extension ending in '!'.
4390 * The decision in this case is final and is NULL (no match).
4391 */
4392 return NULL;
4393 }
4394 /* found entry, now look for the right priority */
4395 if (q->status < STATUS_NO_PRIORITY)
4397 e = NULL;
4398 while ( (e = ast_walk_extension_priorities(eroot, e)) ) {
4399 /* Match label or priority */
4400 if (action == E_FINDLABEL) {
4401 if (q->status < STATUS_NO_LABEL)
4403 if (label && e->label && !strcmp(label, e->label))
4404 break; /* found it */
4405 } else if (e->priority == priority) {
4406 break; /* found it */
4407 } /* else keep searching */
4408 }
4409 if (e) { /* found a valid match */
4411 q->foundcontext = context;
4412 return e;
4413 }
4414 }
4415#ifdef NOT_RIGHT_NOW
4416 /* Check alternative switches??? */
4417 AST_LIST_TRAVERSE(&tmp->alts, sw, list) {
4418 struct ast_switch *asw = pbx_findswitch(sw->name);
4419 ast_switch_f *aswf = NULL;
4420 char *datap;
4421
4422 if (!asw) {
4423 ast_log(LOG_WARNING, "No such switch '%s'\n", sw->name);
4424 continue;
4425 }
4426 /* No need to Substitute variables now; we shouldn't be here if there's any */
4427
4428 /* equivalent of extension_match_core() at the switch level */
4429 if (action == E_CANMATCH)
4430 aswf = asw->canmatch;
4431 else if (action == E_MATCHMORE)
4432 aswf = asw->matchmore;
4433 else /* action == E_MATCH */
4434 aswf = asw->exists;
4435 datap = sw->eval ? sw->tmpdata : sw->data;
4436 res = !aswf ? 0 : aswf(chan, context, exten, priority, callerid, datap);
4437 if (res) { /* Got a match */
4438 q->swo = asw;
4439 q->data = datap;
4440 q->foundcontext = context;
4441 /* XXX keep status = STATUS_NO_CONTEXT ? */
4442 return NULL;
4443 }
4444 }
4445#endif
4446 q->incstack[q->stacklen++] = tmp->name; /* Setup the stack */
4447 /* Now try any includes we have in this context */
4448 for (i = tmp->includes; i; i = i->next) {
4449 if (include_valid(i)) {
4450 if ((e = pbx_find_extension(NULL, bypass, q, i->rname, exten, priority, label, callerid, action)))
4451 return e;
4452 if (q->swo)
4453 return NULL;
4454 }
4455 }
4456 return NULL;
4457}
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
Definition: chan_iax2.c:2362
static int include_valid(struct ast_include *i)
Definition: extconf.c:4311
int() ast_switch_f(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
Definition: extconf.c:2105
static int matchcid(const char *cidpattern, const char *callerid)
Definition: extconf.c:4300
#define STATUS_SUCCESS
Definition: extconf.c:2452
#define AST_PBX_MAX_STACK
Definition: extconf.h:225
struct ast_switch * pbx_findswitch(const char *sw)
Definition: pbx_switch.c:40
ast_switch_f * canmatch
Definition: pbx.h:166
ast_switch_f * exists
Definition: pbx.h:165
ast_switch_f * matchmore
Definition: pbx.h:168
char * incstack[AST_PBX_MAX_STACK]
Definition: extconf.h:236

References AST_LIST_TRAVERSE, ast_log(), AST_PBX_MAX_STACK, ast_walk_context_extensions(), ast_walk_contexts(), ast_walk_extension_priorities(), ast_switch::canmatch, ast_exten::cidmatch, voicemailpwcheck::context, pbx_find_info::data, E_CANMATCH, E_FINDLABEL, E_MATCHMORE, ast_switch::exists, ast_exten::exten, extension_match_core(), pbx_find_info::foundcontext, include_valid(), pbx_find_info::incstack, ast_exten::label, LOG_WARNING, match(), ast_exten::matchcid, matchcid(), ast_switch::matchmore, ast_include::next, NULL, pbx_find_extension(), pbx_findswitch(), priority, ast_exten::priority, ast_include::rname, pbx_find_info::stacklen, pbx_find_info::status, STATUS_NO_CONTEXT, STATUS_NO_EXTENSION, STATUS_NO_LABEL, STATUS_NO_PRIORITY, STATUS_SUCCESS, pbx_find_info::swo, and tmp().

Referenced by localized_find_extension(), pbx_extension_helper(), and pbx_find_extension().

◆ pbx_load_config()

static int pbx_load_config ( const char *  config_file)
static

Definition at line 5336 of file extconf.c.

5337{
5338 struct ast_config *cfg;
5339 char *end;
5340 char *label;
5341 char realvalue[256];
5342 int lastpri = -2;
5343 struct ast_context *con;
5344 struct ast_variable *v;
5345 const char *cxt;
5346 const char *aft;
5347
5349 if (!cfg)
5350 return 0;
5351
5352 /* Use existing config to populate the PBX table */
5353 static_config = ast_true(ast_variable_retrieve(cfg, "general", "static"));
5354 write_protect_config = ast_true(ast_variable_retrieve(cfg, "general", "writeprotect"));
5355 if ((aft = ast_variable_retrieve(cfg, "general", "autofallthrough")))
5357 clearglobalvars_config = ast_true(ast_variable_retrieve(cfg, "general", "clearglobalvars"));
5358
5359 if ((cxt = ast_variable_retrieve(cfg, "general", "userscontext")))
5361 else
5362 ast_copy_string(userscontext, "default", sizeof(userscontext));
5363
5364 for (v = ast_variable_browse(cfg, "globals"); v; v = v->next) {
5365 memset(realvalue, 0, sizeof(realvalue));
5366 pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
5367 pbx_builtin_setvar_helper(NULL, v->name, realvalue);
5368 }
5369 for (cxt = NULL; (cxt = ast_category_browse(cfg, cxt)); ) {
5370 /* All categories but "general" or "globals" are considered contexts */
5371 if (!strcasecmp(cxt, "general") || !strcasecmp(cxt, "globals"))
5372 continue;
5374 if (con == NULL)
5375 continue;
5376
5377 for (v = ast_variable_browse(cfg, cxt); v; v = v->next) {
5378 if (!strcasecmp(v->name, "exten")) {
5379 char *tc = ast_strdup(v->value);
5380 if (tc) {
5381 int ipri = -2;
5382 char realext[256]="";
5383 char *plus, *firstp, *firstc;
5384 char *pri, *appl, *data, *cidmatch;
5385 char *stringp = tc;
5386 char *ext = strsep(&stringp, ",");
5387 if (!ext)
5388 ext="";
5389 pbx_substitute_variables_helper(NULL, ext, realext, sizeof(realext) - 1);
5390 cidmatch = strchr(realext, '/');
5391 if (cidmatch) {
5392 *cidmatch++ = '\0';
5393 ast_shrink_phone_number(cidmatch);
5394 }
5395 pri = strsep(&stringp, ",");
5396 if (!pri)
5397 pri="";
5398 label = strchr(pri, '(');
5399 if (label) {
5400 *label++ = '\0';
5401 end = strchr(label, ')');
5402 if (end)
5403 *end = '\0';
5404 else
5405 ast_log(LOG_WARNING, "Label missing trailing ')' at line %d\n", v->lineno);
5406 }
5407 plus = strchr(pri, '+');
5408 if (plus)
5409 *plus++ = '\0';
5410 if (!strcmp(pri,"hint"))
5411 ipri=PRIORITY_HINT;
5412 else if (!strcmp(pri, "next") || !strcmp(pri, "n")) {
5413 if (lastpri > -2)
5414 ipri = lastpri + 1;
5415 else
5416 ast_log(LOG_WARNING, "Can't use 'next' priority on the first entry!\n");
5417 } else if (!strcmp(pri, "same") || !strcmp(pri, "s")) {
5418 if (lastpri > -2)
5419 ipri = lastpri;
5420 else
5421 ast_log(LOG_WARNING, "Can't use 'same' priority on the first entry!\n");
5422 } else if (sscanf(pri, "%30d", &ipri) != 1 &&
5423 (ipri = ast_findlabel_extension2(NULL, con, realext, pri, cidmatch)) < 1) {
5424 ast_log(LOG_WARNING, "Invalid priority/label '%s' at line %d\n", pri, v->lineno);
5425 ipri = 0;
5426 }
5427 appl = S_OR(stringp, "");
5428 /* Find the first occurrence of either '(' or ',' */
5429 firstc = strchr(appl, ',');
5430 firstp = strchr(appl, '(');
5431 if (firstc && (!firstp || firstc < firstp)) {
5432 /* comma found, no parenthesis */
5433 /* or both found, but comma found first */
5434 appl = strsep(&stringp, ",");
5435 data = stringp;
5436 } else if (!firstc && !firstp) {
5437 /* Neither found */
5438 data = "";
5439 } else {
5440 /* Final remaining case is parenthesis found first */
5441 appl = strsep(&stringp, "(");
5442 data = stringp;
5443 end = strrchr(data, ')');
5444 if ((end = strrchr(data, ')'))) {
5445 *end = '\0';
5446 } else {
5447 ast_log(LOG_WARNING, "No closing parenthesis found? '%s(%s'\n", appl, data);
5448 }
5449 ast_process_quotes_and_slashes(data, ',', '|');
5450 }
5451
5452 if (!data)
5453 data="";
5454 appl = ast_skip_blanks(appl);
5455 if (ipri) {
5456 if (plus)
5457 ipri += atoi(plus);
5458 lastpri = ipri;
5459 if (!ast_opt_dont_warn && !strcmp(realext, "_."))
5460 ast_log(LOG_WARNING, "The use of '_.' for an extension is strongly discouraged and can have unexpected behavior. Please use '_X.' instead at line %d\n", v->lineno);
5461 if (ast_add_extension2(con, 0, realext, ipri, label, cidmatch, appl, strdup(data), ast_free_ptr, global_registrar)) {
5462 ast_log(LOG_WARNING, "Unable to register extension at line %d\n", v->lineno);
5463 }
5464 }
5465 free(tc);
5466 }
5467 } else if (!strcasecmp(v->name, "include")) {
5468 memset(realvalue, 0, sizeof(realvalue));
5469 pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
5470 if (ast_context_add_include2(con, realvalue, global_registrar))
5471 ast_log(LOG_WARNING, "Unable to include context '%s' in context '%s'\n", v->value, cxt);
5472 } else if (!strcasecmp(v->name, "ignorepat")) {
5473 memset(realvalue, 0, sizeof(realvalue));
5474 pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
5475 if (ast_context_add_ignorepat2(con, realvalue, global_registrar))
5476 ast_log(LOG_WARNING, "Unable to include ignorepat '%s' in context '%s'\n", v->value, cxt);
5477 } else if (!strcasecmp(v->name, "switch") || !strcasecmp(v->name, "lswitch") || !strcasecmp(v->name, "eswitch")) {
5478 char *stringp= realvalue;
5479 char *appl, *data;
5480
5481 memset(realvalue, 0, sizeof(realvalue));
5482 if (!strcasecmp(v->name, "switch"))
5483 pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
5484 else
5485 ast_copy_string(realvalue, v->value, sizeof(realvalue));
5486 appl = strsep(&stringp, "/");
5487 data = strsep(&stringp, ""); /* XXX what for ? */
5488 if (!data)
5489 data = "";
5490 if (ast_context_add_switch2(con, appl, data, !strcasecmp(v->name, "eswitch"), global_registrar))
5491 ast_log(LOG_WARNING, "Unable to include switch '%s' in context '%s'\n", v->value, cxt);
5492 } else {
5493 ast_log(LOG_WARNING, "==!!== Unknown directive: %s at line %d -- IGNORING!!!\n", v->name, v->lineno);
5494 }
5495 }
5496 }
5497 ast_config_destroy(cfg);
5498 return 1;
5499}
void ast_free_ptr(void *ptr)
free() wrapper
Definition: astmm.c:1739
static const char config_file[]
Definition: cdr_odbc.c:54
static int ast_true(const char *s)
Definition: extconf.c:2244
static int autofallthrough_config
Definition: extconf.c:2125
#define S_OR(a, b)
Definition: extconf.c:957
static const char * ast_variable_retrieve(const struct ast_config *config, const char *category, const char *variable)
Definition: extconf.c:1227
#define ast_opt_dont_warn
Definition: extconf.c:1384
static char * ast_process_quotes_and_slashes(char *start, char find, char replace_with)
Definition: extconf.c:2218
static char * ast_category_browse(struct ast_config *config, const char *prev)
Definition: extconf.c:3326
static int clearglobalvars_config
Definition: extconf.c:2126
static struct ast_context * ast_context_find_or_create(struct ast_context **extcontexts, void *tab, const char *name, const char *registrar)
Definition: extconf.c:4980
static int static_config
Definition: extconf.c:2123
static char userscontext[AST_MAX_EXTENSION]
Definition: extconf.c:2122
struct ast_config * localized_config_load(const char *filename)
Definition: extconf.c:3285
static void ast_shrink_phone_number(char *n)
Clean up phone string remove '(', ' ', ')', non-trailing '.', and '-' not in square brackets....
Definition: extconf.c:2136
static int ast_findlabel_extension2(struct ast_channel *c, struct ast_context *con, const char *exten, const char *label, const char *callerid)
Definition: extconf.c:4975
char * ast_skip_blanks(const char *str)
Definition: extconf.c:979
static void pbx_substitute_variables_helper(struct ast_channel *c, const char *cp1, char *cp2, int count)
Definition: extconf.c:5328
static int write_protect_config
Definition: extconf.c:2124
const char * ext
Definition: http.c:150

References ast_add_extension2(), ast_category_browse(), ast_config_destroy(), ast_context_add_ignorepat2(), ast_context_add_include2(), ast_context_add_switch2(), ast_context_find_or_create(), ast_copy_string(), ast_findlabel_extension2(), ast_free_ptr(), ast_log(), ast_opt_dont_warn, ast_process_quotes_and_slashes(), ast_shrink_phone_number(), ast_skip_blanks(), ast_strdup, ast_true(), ast_variable_browse(), ast_variable_retrieve(), autofallthrough_config, clearglobalvars_config, config_file, end, ext, free(), global_registrar, ast_variable::lineno, local_contexts, localized_config_load(), LOG_WARNING, ast_variable::name, ast_variable::next, NULL, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), PRIORITY_HINT, S_OR, static_config, strdup, strsep(), userscontext, ast_variable::value, and write_protect_config.

Referenced by localized_pbx_load_module().

◆ pbx_retrieve_variable()

static void pbx_retrieve_variable ( struct ast_channel c,
const char *  var,
char **  ret,
char *  workspace,
int  workspacelen,
struct varshead headp 
)
static

Support for Asterisk built-in variables in the dialplan.

Note
See also

Definition at line 5079 of file extconf.c.

5080{
5081 const char not_found = '\0';
5082 char *tmpvar;
5083 const char *s; /* the result */
5084 int offset, length;
5085 int i, need_substring;
5086 struct varshead *places[2] = { headp, &globals }; /* list of places where we may look */
5087
5088 /*
5089 * Make a copy of var because parse_variable_name() modifies the string.
5090 * Then if called directly, we might need to run substring() on the result;
5091 * remember this for later in 'need_substring', 'offset' and 'length'
5092 */
5093 tmpvar = ast_strdupa(var); /* parse_variable_name modifies the string */
5094 need_substring = parse_variable_name(tmpvar, &offset, &length, &i /* ignored */);
5095
5096 /*
5097 * Look first into predefined variables, then into variable lists.
5098 * Variable 's' points to the result, according to the following rules:
5099 * s == &not_found (set at the beginning) means that we did not find a
5100 * matching variable and need to look into more places.
5101 * If s != &not_found, s is a valid result string as follows:
5102 * s = NULL if the variable does not have a value;
5103 * you typically do this when looking for an unset predefined variable.
5104 * s = workspace if the result has been assembled there;
5105 * typically done when the result is built e.g. with an snprintf(),
5106 * so we don't need to do an additional copy.
5107 * s != workspace in case we have a string, that needs to be copied
5108 * (the ast_copy_string is done once for all at the end).
5109 * Typically done when the result is already available in some string.
5110 */
5111 s = &not_found; /* default value */
5112 if (s == &not_found) { /* look for more */
5113 if (!strcmp(var, "EPOCH")) {
5114 snprintf(workspace, workspacelen, "%u",(int)time(NULL));
5115 }
5116
5117 s = workspace;
5118 }
5119 /* if not found, look into chanvars or global vars */
5120 for (i = 0; s == &not_found && i < (sizeof(places) / sizeof(places[0])); i++) {
5121 struct ast_var_t *variables;
5122 if (!places[i])
5123 continue;
5124 if (places[i] == &globals)
5126 AST_LIST_TRAVERSE(places[i], variables, entries) {
5127 if (strcasecmp(ast_var_name(variables), var)==0) {
5128 s = ast_var_value(variables);
5129 break;
5130 }
5131 }
5132 if (places[i] == &globals)
5134 }
5135 if (s == &not_found || s == NULL)
5136 *ret = NULL;
5137 else {
5138 if (s != workspace)
5139 ast_copy_string(workspace, s, workspacelen);
5140 *ret = workspace;
5141 if (need_substring)
5142 *ret = substring(*ret, offset, length, workspace, workspacelen);
5143 }
5144}
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.
Definition: extconf.c:5038
static ast_rwlock_t globalslock
Definition: extconf.c:2067
static const char * ast_var_value(const struct ast_var_t *var)
Definition: extconf.c:5025
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,...
Definition: extconf.c:5003
static int ast_rwlock_rdlock(ast_rwlock_t *prwlock)
Definition: extconf.c:539
struct ast_var_t::@211 entries

References ast_copy_string(), AST_LIST_TRAVERSE, ast_rwlock_rdlock(), ast_rwlock_unlock(), ast_strdupa, ast_var_name(), ast_var_value(), ast_var_t::entries, globals, globalslock, NULL, parse_variable_name(), substring(), and var.

Referenced by pbx_substitute_variables_helper_full().

◆ pbx_substitute_variables_helper()

static void pbx_substitute_variables_helper ( struct ast_channel c,
const char *  cp1,
char *  cp2,
int  count 
)
static

Definition at line 5328 of file extconf.c.

5329{
5330 pbx_substitute_variables_helper_full(c, NULL, cp1, cp2, count);
5331}
static void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int count)
Definition: extconf.c:5146

References c, NULL, and pbx_substitute_variables_helper_full().

Referenced by pbx_load_config().

◆ pbx_substitute_variables_helper_full()

static void pbx_substitute_variables_helper_full ( struct ast_channel c,
struct varshead headp,
const char *  cp1,
char *  cp2,
int  count 
)
static

Definition at line 5146 of file extconf.c.

5147{
5148 /* Substitutes variables into cp2, based on string cp1, and assuming cp2 to be
5149 zero-filled */
5150 char *cp4;
5151 const char *tmp, *whereweare;
5152 int length, offset, offset2, isfunction;
5153 char *workspace = NULL;
5154 char *ltmp = NULL, *var = NULL;
5155 char *nextvar, *nextexp, *nextthing;
5156 char *vars, *vare;
5157 int pos, brackets, needsub, len;
5158
5159 *cp2 = 0; /* just in case there's nothing to do */
5160 whereweare=tmp=cp1;
5161 while (!ast_strlen_zero(whereweare) && count) {
5162 /* Assume we're copying the whole remaining string */
5163 pos = strlen(whereweare);
5164 nextvar = NULL;
5165 nextexp = NULL;
5166 nextthing = strchr(whereweare, '$');
5167 if (nextthing) {
5168 switch (nextthing[1]) {
5169 case '{':
5170 nextvar = nextthing;
5171 pos = nextvar - whereweare;
5172 break;
5173 case '[':
5174 nextexp = nextthing;
5175 pos = nextexp - whereweare;
5176 break;
5177 }
5178 }
5179
5180 if (pos) {
5181 /* Can't copy more than 'count' bytes */
5182 if (pos > count)
5183 pos = count;
5184
5185 /* Copy that many bytes */
5186 memcpy(cp2, whereweare, pos);
5187
5188 count -= pos;
5189 cp2 += pos;
5190 whereweare += pos;
5191 *cp2 = 0;
5192 }
5193
5194 if (nextvar) {
5195 /* We have a variable. Find the start and end, and determine
5196 if we are going to have to recursively call ourselves on the
5197 contents */
5198 vars = vare = nextvar + 2;
5199 brackets = 1;
5200 needsub = 0;
5201
5202 /* Find the end of it */
5203 while (brackets && *vare) {
5204 if ((vare[0] == '$') && (vare[1] == '{')) {
5205 needsub++;
5206 } else if (vare[0] == '{') {
5207 brackets++;
5208 } else if (vare[0] == '}') {
5209 brackets--;
5210 } else if ((vare[0] == '$') && (vare[1] == '['))
5211 needsub++;
5212 vare++;
5213 }
5214 if (brackets)
5215 ast_log(LOG_NOTICE, "Error in extension logic (missing '}' in '%s')\n", cp1);
5216 len = vare - vars - 1;
5217
5218 /* Skip totally over variable string */
5219 whereweare += (len + 3);
5220
5221 if (!var)
5222 var = alloca(VAR_BUF_SIZE);
5223
5224 /* Store variable name (and truncate) */
5225 ast_copy_string(var, vars, len + 1);
5226
5227 /* Substitute if necessary */
5228 if (needsub) {
5229 if (!ltmp)
5230 ltmp = alloca(VAR_BUF_SIZE);
5231
5232 memset(ltmp, 0, VAR_BUF_SIZE);
5234 vars = ltmp;
5235 } else {
5236 vars = var;
5237 }
5238
5239 if (!workspace)
5240 workspace = alloca(VAR_BUF_SIZE);
5241
5242 workspace[0] = '\0';
5243
5244 parse_variable_name(vars, &offset, &offset2, &isfunction);
5245 if (isfunction) {
5246 /* Evaluate function */
5247 cp4 = ast_func_read(c, vars, workspace, VAR_BUF_SIZE) ? NULL : workspace;
5248 if (option_debug)
5249 ast_log(LOG_DEBUG, "Function result is '%s'\n", cp4 ? cp4 : "(null)");
5250 } else {
5251 /* Retrieve variable value */
5252 pbx_retrieve_variable(c, vars, &cp4, workspace, VAR_BUF_SIZE, headp);
5253 }
5254 if (cp4) {
5255 cp4 = substring(cp4, offset, offset2, workspace, VAR_BUF_SIZE);
5256
5257 length = strlen(cp4);
5258 if (length > count)
5259 length = count;
5260 memcpy(cp2, cp4, length);
5261 count -= length;
5262 cp2 += length;
5263 *cp2 = 0;
5264 }
5265 } else if (nextexp) {
5266 /* We have an expression. Find the start and end, and determine
5267 if we are going to have to recursively call ourselves on the
5268 contents */
5269 vars = vare = nextexp + 2;
5270 brackets = 1;
5271 needsub = 0;
5272
5273 /* Find the end of it */
5274 while (brackets && *vare) {
5275 if ((vare[0] == '$') && (vare[1] == '[')) {
5276 needsub++;
5277 brackets++;
5278 vare++;
5279 } else if (vare[0] == '[') {
5280 brackets++;
5281 } else if (vare[0] == ']') {
5282 brackets--;
5283 } else if ((vare[0] == '$') && (vare[1] == '{')) {
5284 needsub++;
5285 vare++;
5286 }
5287 vare++;
5288 }
5289 if (brackets)
5290 ast_log(LOG_NOTICE, "Error in extension logic (missing ']')\n");
5291 len = vare - vars - 1;
5292
5293 /* Skip totally over expression */
5294 whereweare += (len + 3);
5295
5296 if (!var)
5297 var = alloca(VAR_BUF_SIZE);
5298
5299 /* Store variable name (and truncate) */
5300 ast_copy_string(var, vars, len + 1);
5301
5302 /* Substitute if necessary */
5303 if (needsub) {
5304 if (!ltmp)
5305 ltmp = alloca(VAR_BUF_SIZE);
5306
5307 memset(ltmp, 0, VAR_BUF_SIZE);
5309 vars = ltmp;
5310 } else {
5311 vars = var;
5312 }
5313
5314 length = ast_expr(vars, cp2, count, NULL);
5315
5316 if (length) {
5317 if (option_debug)
5318 ast_log(LOG_DEBUG, "Expression result is '%s'\n", cp2);
5319 count -= length;
5320 cp2 += length;
5321 *cp2 = 0;
5322 }
5323 } else
5324 break;
5325 }
5326}
int ast_expr(char *expr, char *buf, int length, struct ast_channel *chan)
Evaluate the given expression.
Definition: ast_expr2f.c:2391
static int ast_func_read(struct ast_channel *chan, const char *function, char *workspace, size_t len)
Definition: extconf.c:4993
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.
Definition: extconf.c:5079
#define VAR_BUF_SIZE
Definition: extconf.c:2319

References ast_copy_string(), ast_expr(), ast_func_read(), ast_log(), ast_strlen_zero(), c, len(), LOG_DEBUG, LOG_NOTICE, NULL, option_debug, parse_variable_name(), pbx_retrieve_variable(), pbx_substitute_variables_helper_full(), substring(), tmp(), var, and VAR_BUF_SIZE.

Referenced by pbx_substitute_variables_helper(), and pbx_substitute_variables_helper_full().

◆ process_text_line()

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

Definition at line 2906 of file extconf.c.

2907{
2908 char *c;
2909 char *cur = buf;
2910 struct ast_variable *v;
2911 char exec_file[512];
2912 int object, do_exec, do_include;
2913
2914 /* Actually parse the entry */
2915 if (cur[0] == '[') {
2916 struct ast_category *newcat = NULL;
2917 char *catname;
2918
2919 /* A category header */
2920 c = strchr(cur, ']');
2921 if (!c) {
2922 ast_log(LOG_WARNING, "parse error: no closing ']', line %d of %s\n", lineno, configfile);
2923 return -1;
2924 }
2925 *c++ = '\0';
2926 cur++;
2927 if (*c++ != '(')
2928 c = NULL;
2929 catname = cur;
2930 if (!(*cat = newcat = ast_category_new(catname, ast_strlen_zero(suggested_include_file)?configfile:suggested_include_file, lineno))) {
2931 return -1;
2932 }
2933 (*cat)->lineno = lineno;
2934
2935 /* add comments */
2936 if (withcomments && comment_buffer && comment_buffer[0] ) {
2938 }
2939 if (withcomments && lline_buffer && lline_buffer[0] ) {
2941 }
2942 if( withcomments )
2943 CB_RESET();
2944
2945 /* If there are options or categories to inherit from, process them now */
2946 if (c) {
2947 if (!(cur = strchr(c, ')'))) {
2948 ast_log(LOG_WARNING, "parse error: no closing ')', line %d of %s\n", lineno, configfile);
2949 return -1;
2950 }
2951 *cur = '\0';
2952 while ((cur = strsep(&c, ","))) {
2953 if (!strcasecmp(cur, "!")) {
2954 (*cat)->ignored = 1;
2955 } else if (!strcasecmp(cur, "+")) {
2956 *cat = category_get(cfg, catname, 1);
2957 if (!*cat) {
2958 ast_config_destroy(cfg);
2959 if (newcat)
2960 ast_category_destroy(newcat);
2961 ast_log(LOG_WARNING, "Category addition requested, but category '%s' does not exist, line %d of %s\n", catname, lineno, configfile);
2962 return -1;
2963 }
2964 if (newcat) {
2965 move_variables(newcat, *cat);
2966 ast_category_destroy(newcat);
2967 newcat = NULL;
2968 }
2969 } else {
2970 struct ast_category *base;
2971
2972 base = category_get(cfg, cur, 1);
2973 if (!base) {
2974 ast_log(LOG_WARNING, "Inheritance requested, but category '%s' does not exist, line %d of %s\n", cur, lineno, configfile);
2975 return -1;
2976 }
2977 inherit_category(*cat, base);
2978 }
2979 }
2980 }
2981 if (newcat)
2982 ast_category_append(cfg, *cat);
2983 } else if (cur[0] == '#') {
2984 /* A directive */
2985 cur++;
2986 c = cur;
2987 while(*c && (*c > 32)) c++;
2988 if (*c) {
2989 *c = '\0';
2990 /* Find real argument */
2991 c = ast_skip_blanks(c + 1);
2992 if (!*c)
2993 c = NULL;
2994 } else
2995 c = NULL;
2996 do_include = !strcasecmp(cur, "include");
2997 if(!do_include)
2998 do_exec = !strcasecmp(cur, "exec");
2999 else
3000 do_exec = 0;
3001 if (do_exec && !ast_opt_exec_includes) {
3002 ast_log(LOG_WARNING, "Cannot perform #exec unless execincludes option is enabled in asterisk.conf (options section)!\n");
3003 do_exec = 0;
3004 }
3005 if (do_include || do_exec) {
3006 if (c) {
3007 char *cur2;
3008 char real_inclusion_name[525];
3009
3010 /* Strip off leading and trailing "'s and <>'s */
3011 while((*c == '<') || (*c == '>') || (*c == '\"')) c++;
3012 /* Get rid of leading mess */
3013 cur = c;
3014 cur2 = cur;
3015 while (!ast_strlen_zero(cur)) {
3016 c = cur + strlen(cur) - 1;
3017 if ((*c == '>') || (*c == '<') || (*c == '\"'))
3018 *c = '\0';
3019 else
3020 break;
3021 }
3022 /* #exec </path/to/executable>
3023 We create a tmp file, then we #include it, then we delete it. */
3024 if (do_exec) {
3025 char cmd[1024];
3026
3027 snprintf(exec_file, sizeof(exec_file), "/var/tmp/exec.%d.%ld", (int)time(NULL), (long)pthread_self());
3028 if (snprintf(cmd, sizeof(cmd), "%s > %s 2>&1", cur, exec_file) >= sizeof(cmd)) {
3029 ast_log(LOG_ERROR, "Failed to construct command string to execute %s.\n", cur);
3030
3031 return -1;
3032 }
3033 ast_safe_system(cmd);
3034 cur = exec_file;
3035 } else
3036 exec_file[0] = '\0';
3037 /* A #include */
3038 /* ast_log(LOG_WARNING, "Reading in included file %s withcomments=%d\n", cur, withcomments); */
3039
3040 /* record this inclusion */
3041 ast_include_new(cfg, configfile, cur, do_exec, cur2, lineno, real_inclusion_name, sizeof(real_inclusion_name));
3042
3043 do_include = ast_config_internal_load(cur, cfg, withcomments, real_inclusion_name) ? 1 : 0;
3044 if(!ast_strlen_zero(exec_file))
3045 unlink(exec_file);
3046 if(!do_include)
3047 return 0;
3048 /* ast_log(LOG_WARNING, "Done reading in included file %s withcomments=%d\n", cur, withcomments); */
3049
3050 } else {
3051 ast_log(LOG_WARNING, "Directive '#%s' needs an argument (%s) at line %d of %s\n",
3052 do_exec ? "exec" : "include",
3053 do_exec ? "/path/to/executable" : "filename",
3054 lineno,
3055 configfile);
3056 }
3057 }
3058 else
3059 ast_log(LOG_WARNING, "Unknown directive '%s' at line %d of %s\n", cur, lineno, configfile);
3060 } else {
3061 /* Just a line (variable = value) */
3062 if (!*cat) {
3064 "parse error: No category context for line %d of %s\n", lineno, configfile);
3065 return -1;
3066 }
3067 c = strchr(cur, '=');
3068 if (c) {
3069 *c = 0;
3070 c++;
3071 /* Ignore > in => */
3072 if (*c== '>') {
3073 object = 1;
3074 c++;
3075 } else
3076 object = 0;
3077 if ((v = ast_variable_new(ast_strip(cur), ast_strip(c), configfile))) {
3078 v->lineno = lineno;
3079 v->object = object;
3080 /* Put and reset comments */
3081 v->blanklines = 0;
3082 ast_variable_append(*cat, v);
3083 /* add comments */
3084 if (withcomments && comment_buffer && comment_buffer[0] ) {
3086 }
3087 if (withcomments && lline_buffer && lline_buffer[0] ) {
3089 }
3090 if( withcomments )
3091 CB_RESET();
3092
3093 } else {
3094 return -1;
3095 }
3096 } else {
3097 ast_log(LOG_WARNING, "EXTENSIONS.CONF: No '=' (equal sign) in line %d of %s\n", lineno, configfile);
3098 }
3099 }
3100 return 0;
3101}
static void CB_RESET(void)
Definition: extconf.c:777
static struct ast_variable * ast_variable_new(const char *name, const char *value, const char *filename)
Definition: extconf.c:1055
static void inherit_category(struct ast_category *new, const struct ast_category *base)
Definition: extconf.c:2823
static void ast_category_append(struct ast_config *config, struct ast_category *category)
Definition: extconf.c:2833
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)
Definition: extconf.c:1074
static struct ast_category * ast_category_new(const char *name, const char *in_file, int lineno)
Definition: extconf.c:2788
static void move_variables(struct ast_category *old, struct ast_category *new)
Definition: extconf.c:2806
static void ast_category_destroy(struct ast_category *cat)
Definition: extconf.c:2845
int ast_safe_system(const char *s)
Safely spawn an OS shell command while closing file descriptors.
Definition: extconf.c:829
static struct ast_comment * ALLOC_COMMENT(const char *buffer)
Definition: extconf.c:877
#define ast_opt_exec_includes
Definition: extconf.c:1366
struct ast_comment * precomments
struct ast_comment * sameline

References ALLOC_COMMENT(), ast_category_append(), ast_category_destroy(), ast_category_new(), ast_config_destroy(), ast_config_internal_load(), ast_include_new(), ast_log(), ast_opt_exec_includes, ast_safe_system(), ast_skip_blanks(), ast_strip(), ast_strlen_zero(), ast_variable_append(), ast_variable_new(), ast_variable::blanklines, buf, c, category_get(), CB_RESET(), comment_buffer, inherit_category(), ast_variable::lineno, ast_category::lineno, lline_buffer, LOG_ERROR, LOG_WARNING, move_variables(), NULL, ast_variable::object, ast_variable::precomments, ast_category::precomments, ast_variable::sameline, ast_category::sameline, and strsep().

Referenced by config_text_file_load().

◆ set_fn()

static void set_fn ( char *  fn,
int  fn_size,
const char *  file,
const char *  configfile 
)
static

Definition at line 3406 of file extconf.c.

3407{
3408 if (!file || file[0] == 0) {
3409 if (configfile[0] == '/')
3410 ast_copy_string(fn, configfile, fn_size);
3411 else
3412 snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, configfile);
3413 } else if (file[0] == '/')
3414 ast_copy_string(fn, file, fn_size);
3415 else
3416 snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, file);
3417}

References ast_config_AST_CONFIG_DIR, ast_copy_string(), and make_ari_stubs::file.

Referenced by localized_config_text_file_save().

◆ substring()

static char * substring ( const char *  value,
int  offset,
int  length,
char *  workspace,
size_t  workspace_len 
)
static

takes a substring. It is ok to call with value == workspace.

offset < 0 means start from the end of the string and set the beginning to be that many characters back. length is the length of the substring. A value less than 0 means to leave that many off the end. Always return a copy in workspace.

Definition at line 5038 of file extconf.c.

5039{
5040 char *ret = workspace;
5041 int lr; /* length of the input string after the copy */
5042
5043 ast_copy_string(workspace, value, workspace_len); /* always make a copy */
5044
5045 lr = strlen(ret); /* compute length after copy, so we never go out of the workspace */
5046
5047 /* Quick check if no need to do anything */
5048 if (offset == 0 && length >= lr) /* take the whole string */
5049 return ret;
5050
5051 if (offset < 0) { /* translate negative offset into positive ones */
5052 offset = lr + offset;
5053 if (offset < 0) /* If the negative offset was greater than the length of the string, just start at the beginning */
5054 offset = 0;
5055 }
5056
5057 /* too large offset result in empty string so we know what to return */
5058 if (offset >= lr)
5059 return ret + lr; /* the final '\0' */
5060
5061 ret += offset; /* move to the start position */
5062 if (length >= 0 && length < lr - offset) /* truncate if necessary */
5063 ret[length] = '\0';
5064 else if (length < 0) {
5065 if (lr > offset - length) /* After we remove from the front and from the rear, is there anything left? */
5066 ret[lr + length - offset] = '\0';
5067 else
5068 ret[0] = '\0';
5069 }
5070
5071 return ret;
5072}

References ast_copy_string(), and value.

Referenced by pbx_retrieve_variable(), and pbx_substitute_variables_helper_full().

◆ tvfix()

static struct timeval tvfix ( struct timeval  a)
static

Definition at line 2266 of file extconf.c.

2267{
2268 if (a.tv_usec >= ONE_MILLION) {
2269 ast_log(LOG_WARNING, "warning too large timestamp %ld.%ld\n",
2270 (long)a.tv_sec, (long int) a.tv_usec);
2271 a.tv_sec += a.tv_usec / ONE_MILLION;
2272 a.tv_usec %= ONE_MILLION;
2273 } else if (a.tv_usec < 0) {
2274 ast_log(LOG_WARNING, "warning negative timestamp %ld.%ld\n",
2275 (long)a.tv_sec, (long int) a.tv_usec);
2276 a.tv_usec = 0;
2277 }
2278 return a;
2279}

References a, ast_log(), LOG_WARNING, and ONE_MILLION.

Referenced by ast_tvadd(), and ast_tvsub().

◆ variable_clone()

static struct ast_variable * variable_clone ( const struct ast_variable old)
static

Definition at line 1248 of file extconf.c.

1249{
1250 struct ast_variable *new = ast_variable_new(old->name, old->value, old->file);
1251
1252 if (new) {
1253 new->lineno = old->lineno;
1254 new->object = old->object;
1255 new->blanklines = old->blanklines;
1256 /* TODO: clone comments? */
1257 }
1258
1259 return new;
1260}

References ast_variable_new(), ast_variable::blanklines, ast_variable::file, ast_variable::lineno, ast_variable::name, ast_variable::object, and ast_variable::value.

Referenced by inherit_category().

Variable Documentation

◆ ast_defaultlanguage

char ast_defaultlanguage[]
extern

Definition at line 98 of file options.c.

Referenced by load_asterisk_conf().

◆ ast_language_is_prefix

int ast_language_is_prefix
extern

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.

This is settable in asterisk.conf.

Definition at line 67 of file file.c.

Referenced by fileexists_test().

◆ ast_mainpid

pid_t ast_mainpid
extern

Definition at line 315 of file asterisk.c.

Referenced by asterisk_daemon(), main(), and netconsole().

◆ autofallthrough_config

int autofallthrough_config = 0
static

Definition at line 2125 of file extconf.c.

Referenced by pbx_load_config().

◆ clearglobalvars_config

int clearglobalvars_config = 0
static

Definition at line 2126 of file extconf.c.

Referenced by pbx_load_config().

◆ comment_buffer

char* comment_buffer
static

Growable string buffer this will be a comment collector.

Definition at line 705 of file extconf.c.

Referenced by CB_ADD(), CB_ADD_LEN(), CB_INIT(), CB_RESET(), config_text_file_load(), and process_text_line().

◆ comment_buffer_size

int comment_buffer_size
static

the amount of storage so far alloc'd for the comment_buffer

Definition at line 706 of file extconf.c.

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

◆ config_engine_list

static struct ast_config_engine * config_engine_list
static

Definition at line 893 of file extconf.c.

Referenced by ast_config_internal_load(), and find_engine().

◆ config_filename

char* config_filename = "extensions.conf"
static

Definition at line 2120 of file extconf.c.

Referenced by AST_TEST_DEFINE(), localized_pbx_load_module(), and parse_config().

◆ config_maps

struct ast_config_map * config_maps = NULL
static

Referenced by find_engine().

◆ conlock

ast_rwlock_t conlock = PTHREAD_RWLOCK_INITIALIZER
static

Lock for the ast_context list

Definition at line 4482 of file extconf.c.

Referenced by ast_unlock_contexts(), and ast_wrlock_contexts().

◆ contexts

static struct ast_context * contexts = NULL
static

◆ days

char* days[]

Definition at line 3775 of file extconf.c.

Referenced by ast_build_timing().

◆ debug_filename

char debug_filename[AST_FILENAME_MAX]
extern

◆ extconfig_conf

char* extconfig_conf = "extconfig.conf"
static

Definition at line 702 of file extconf.c.

Referenced by ast_config_internal_load().

◆ global_registrar

char* global_registrar = "conf2ael"
static

Definition at line 2121 of file extconf.c.

Referenced by localized_pbx_load_module(), and pbx_load_config().

◆ globals

struct varshead globals = AST_LIST_HEAD_NOLOCK_INIT_VALUE
static

Definition at line 2068 of file extconf.c.

Referenced by pbx_builtin_setvar_helper(), and pbx_retrieve_variable().

◆ globalslock

ast_rwlock_t globalslock = PTHREAD_RWLOCK_INITIALIZER
static

Definition at line 2067 of file extconf.c.

Referenced by pbx_retrieve_variable().

◆ hints

struct hints hints = { .first = NULL, .last = NULL, .lock = PTHREAD_RWLOCK_INITIALIZER , }
static

◆ lline_buffer

char* lline_buffer
static

A buffer for stuff behind the ;

Definition at line 708 of file extconf.c.

Referenced by CB_INIT(), CB_RESET(), config_text_file_load(), LLB_ADD(), and process_text_line().

◆ lline_buffer_size

int lline_buffer_size
static

Definition at line 709 of file extconf.c.

Referenced by CB_INIT(), config_text_file_load(), and LLB_ADD().

◆ local_contexts

struct ast_context* local_contexts = NULL
static

Definition at line 3596 of file extconf.c.

Referenced by localized_pbx_load_module(), and pbx_load_config().

◆ months

char* months[]

Definition at line 3787 of file extconf.c.

Referenced by ast_build_timing().

◆ null_sig_handler

struct sigaction null_sig_handler
static
Initial value:
= {
.sa_handler = _null_sig_handler,
.sa_flags = SA_RESTART,
}
static void _null_sig_handler(int sig)
NULL handler so we can collect the child exit status.
Definition: extconf.c:789

Definition at line 794 of file extconf.c.

Referenced by ast_replace_sigchld().

◆ record_cache_dir

char record_cache_dir[AST_CACHE_DIR_LEN]
extern

Definition at line 96 of file options.c.

Referenced by load_asterisk_conf().

◆ safe_system_level

unsigned int safe_system_level = 0
static

Keep track of how many threads are currently trying to wait*() on a child process.

Definition at line 785 of file extconf.c.

Referenced by ast_replace_sigchld(), and ast_unreplace_sigchld().

◆ safe_system_prev_handler

struct sigaction safe_system_prev_handler
static

Definition at line 786 of file extconf.c.

Referenced by ast_replace_sigchld(), and ast_unreplace_sigchld().

◆ static_config

int static_config = 0
static

Definition at line 2123 of file extconf.c.

Referenced by pbx_load_config().

◆ text_file_engine

struct ast_config_engine text_file_engine
static
Initial value:
= {
.name = "text",
.load_func = config_text_file_load,
}
static struct ast_config * config_text_file_load(const char *database, const char *table, const char *filename, struct ast_config *cfg, int withcomments, const char *suggested_include_file)
Definition: extconf.c:3119

Definition at line 2854 of file extconf.c.

Referenced by ast_config_internal_load().

◆ use_local_dir

int use_local_dir = 1
static

◆ userscontext

char userscontext[AST_MAX_EXTENSION] = "default"
static

Definition at line 2122 of file extconf.c.

Referenced by pbx_load_config().

◆ write_protect_config

int write_protect_config = 1
static

Definition at line 2124 of file extconf.c.

Referenced by pbx_load_config().