Asterisk - The Open Source Telephony Project GIT-master-57e2743
Loading...
Searching...
No Matches
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_flag64(&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.
 
#define AST_LIST_EMPTY(head)   (AST_LIST_FIRST(head) == NULL)
 Checks whether the specified list contains any entries.
 
#define AST_LIST_ENTRY(type)
 Declare a forward link structure inside a list entry.
 
#define AST_LIST_FIRST(head)   ((head)->first)
 Returns the first entry contained in a list.
 
#define AST_LIST_HEAD(name, type)
 Defines a structure to be used to hold a list of specified type.
 
#define AST_LIST_HEAD_INIT(head)
 Initializes a list head structure.
 
#define AST_LIST_HEAD_INIT_NOLOCK(head)
 Initializes a list head structure.
 
#define AST_LIST_HEAD_INIT_VALUE
 Defines initial values for a declaration of AST_LIST_HEAD.
 
#define AST_LIST_HEAD_NOLOCK(name, type)
 Defines a structure to be used to hold a list of specified type (with no lock).
 
#define AST_LIST_HEAD_NOLOCK_INIT_VALUE
 Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK.
 
#define AST_LIST_HEAD_NOLOCK_STATIC(name, type)
 Defines a structure to be used to hold a list of specified type, statically initialized.
 
#define AST_LIST_HEAD_SET(head, entry)
 Initializes a list head structure with a specified first entry.
 
#define AST_LIST_HEAD_SET_NOLOCK(head, entry)
 Initializes a list head structure with a specified first entry.
 
#define AST_LIST_HEAD_STATIC(name, type)
 Defines a structure to be used to hold a list of specified type, statically initialized.
 
#define AST_LIST_INSERT_AFTER(head, listelm, elm, field)
 Inserts a list entry after a given entry.
 
#define AST_LIST_INSERT_BEFORE_CURRENT(head, elm, field)
 Inserts a list entry before the current entry during a traversal.
 
#define AST_LIST_INSERT_HEAD(head, elm, field)
 Inserts a list entry at the head of a list.
 
#define AST_LIST_INSERT_TAIL(head, elm, field)
 Appends a list entry to the tail of a list.
 
#define AST_LIST_LAST(head)   ((head)->last)
 Returns the last entry contained in a list.
 
#define AST_LIST_NEXT(elm, field)   ((elm)->field.next)
 Returns the next entry in the list after the given entry.
 
#define AST_LIST_REMOVE(head, elm, field)
 Removes a specific entry from a list.
 
#define AST_LIST_REMOVE_CURRENT(head, field)
 Removes the current entry from a list during a traversal.
 
#define AST_LIST_REMOVE_HEAD(head, field)
 Removes and returns the head entry from a list.
 
#define AST_LIST_TRAVERSE(head, var, field)    for((var) = (head)->first; (var); (var) = (var)->field.next)
 Loops over (traverses) the entries in a list.
 
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
 Loops safely over (traverses) the entries in a list.
 
#define AST_LIST_TRAVERSE_SAFE_END   }
 Closes a safe loop traversal block.
 
#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_flag64(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)
 
#define ast_opt_cache_record_files   ast_test_flag64(&ast_options, AST_OPT_FLAG_CACHE_RECORD_FILES)
 
#define ast_opt_console   ast_test_flag64(&ast_options, AST_OPT_FLAG_CONSOLE)
 
#define ast_opt_dont_warn   ast_test_flag64(&ast_options, AST_OPT_FLAG_DONT_WARN)
 
#define ast_opt_dump_core   ast_test_flag64(&ast_options, AST_OPT_FLAG_DUMP_CORE)
 
#define ast_opt_exec   ast_test_flag64(&ast_options, AST_OPT_FLAG_EXEC)
 
#define ast_opt_exec_includes   ast_test_flag64(&ast_options, AST_OPT_FLAG_EXEC_INCLUDES)
 
#define ast_opt_high_priority   ast_test_flag64(&ast_options, AST_OPT_FLAG_HIGH_PRIORITY)
 
#define ast_opt_init_keys   ast_test_flag64(&ast_options, AST_OPT_FLAG_INIT_KEYS)
 
#define ast_opt_mute   ast_test_flag64(&ast_options, AST_OPT_FLAG_MUTE)
 
#define ast_opt_no_color   ast_test_flag64(&ast_options, AST_OPT_FLAG_NO_COLOR)
 
#define ast_opt_no_fork   ast_test_flag64(&ast_options, AST_OPT_FLAG_NO_FORK)
 
#define ast_opt_override_config   ast_test_flag64(&ast_options, AST_OPT_FLAG_OVERRIDE_CONFIG)
 
#define ast_opt_priority_jumping   ast_test_flag64(&ast_options, AST_OPT_FLAG_PRIORITY_JUMPING)
 
#define ast_opt_quiet   ast_test_flag64(&ast_options, AST_OPT_FLAG_QUIET)
 
#define ast_opt_reconnect   ast_test_flag64(&ast_options, AST_OPT_FLAG_RECONNECT)
 
#define ast_opt_remote   ast_test_flag64(&ast_options, AST_OPT_FLAG_REMOTE)
 
#define ast_opt_timestamp   ast_test_flag64(&ast_options, AST_OPT_FLAG_TIMESTAMP)
 
#define ast_opt_transcode_via_slin   ast_test_flag64(&ast_options, AST_OPT_FLAG_TRANSCODE_VIA_SLIN)
 
#define ast_opt_transmit_silence   ast_test_flag64(&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.
 
#define AST_RWLIST_HEAD_DESTROY(head)
 Destroys an rwlist head structure.
 
#define AST_RWLIST_HEAD_INIT(head)
 Initializes an rwlist head structure.
 
#define AST_RWLIST_HEAD_INIT_VALUE
 Defines initial values for a declaration of AST_RWLIST_HEAD.
 
#define AST_RWLIST_HEAD_SET(head, entry)
 Initializes an rwlist head structure with a specified first entry.
 
#define AST_RWLIST_HEAD_STATIC(name, type)
 Defines a structure to be used to hold a read/write list of specified type, statically initialized.
 
#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.
 
#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.
 
#define AST_RWLIST_WRLOCK(head)    ast_rwlock_wrlock(&(head)->lock)
 Write locks a list.
 
#define AST_RWLOCK_DEFINE_STATIC(rwlock)   __AST_RWLOCK_DEFINE(static, rwlock)
 
#define AST_RWLOCK_INIT_VALUE   PTHREAD_RWLOCK_INITIALIZER
 
#define ast_test_flag64(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 SWAP64_32(flags)   (((uint64_t)(flags) << 32) | ((uint64_t)(flags) >> 32))
 
#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_config * config_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_config * realtime_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_variable * realtime_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
}
 
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_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.
 
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
 
static struct ast_comment * ALLOC_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.
 
static int ast_add_hint (struct ast_exten *e)
 ast_add_hint: Add hint to hint list, check initial extension state
 
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.
 
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.
 
int ast_build_timing (struct ast_timing *i, const char *info_in)
 Construct a timing bitmap, for use in time-based conditionals.
 
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_category * ast_category_get (const struct ast_config *config, const char *category_name)
 
static struct ast_category * ast_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
 
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.
 
static void ast_config_destroy (struct ast_config *cfg)
 
struct ast_category * ast_config_get_current_category (const struct ast_config *cfg)
 Retrieve the current category name being built.
 
static struct ast_config * ast_config_internal_load (const char *filename, struct ast_config *cfg, int withcomments, const char *suggested_incl_file)
 
static struct ast_config * ast_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.
 
void ast_console_puts (const char *string)
 write the string to the root console, and all attached network console clients
 
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_context * ast_context_find (const char *name)
 
static struct ast_context * ast_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_include * ast_include_find (struct ast_config *conf, const char *included_file)
 
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 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.
 
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
 
void ast_replace_sigchld (void)
 Replace the SIGCHLD handler.
 
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.
 
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.
 
char * ast_skip_blanks (const char *str)
 
char * ast_strip (char *s)
 Strip leading/trailing whitespace from a string.
 
static force_inline int ast_strlen_zero (const char *s)
 
char * ast_trim_blanks (char *str)
 Trims trailing whitespace characters from a string.
 
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.
 
struct timeval ast_tvnow (void)
 
struct timeval ast_tvsub (struct timeval a, struct timeval b)
 Returns the difference of two timevals a - b.
 
static int ast_unlock_context (struct ast_context *con)
 
static int ast_unlock_contexts (void)
 
void ast_unreplace_sigchld (void)
 Restore the SIGCHLD handler.
 
static struct ast_var_t * ast_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_variable * ast_variable_browse (const struct ast_config *config, const char *category)
 
static struct ast_variable * ast_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_exten * ast_walk_context_extensions (struct ast_context *con, struct ast_exten *exten)
 
static struct ast_ignorepat * ast_walk_context_ignorepats (struct ast_context *con, struct ast_ignorepat *ip)
 
static struct ast_include * ast_walk_context_includes (struct ast_context *con, struct ast_include *inc)
 
static struct ast_sw * ast_walk_context_switches (struct ast_context *con, struct ast_sw *sw)
 
static struct ast_context * ast_walk_contexts (struct ast_context *con)
 
static struct ast_exten * ast_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_category * category_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_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 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.
 
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.
 
static int ext_strncpy (char *dst, const char *src, int len)
 copy a string skipping whitespace
 
static int extension_match_core (const char *pattern, const char *data, enum ext_match_t mode)
 
static struct ast_config_engine * find_engine (const char *family, char *database, int dbsiz, char *table, int tabsiz)
 Find realtime engine for realtime family.
 
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.
 
static void get_timerange (struct ast_timing *i, char *times)
 store a bitmask of valid times, one bit each 2 minute
 
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_category * localized_category_get (const struct ast_config *config, const char *category_name)
 
struct ast_config * localized_config_load (const char *filename)
 
struct ast_config * localized_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_context * localized_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_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)
 
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_exten * localized_walk_context_extensions (struct ast_context *con, struct ast_exten *exten)
 
struct ast_include * localized_walk_context_includes (struct ast_context *con, struct ast_include *inc)
 
struct ast_sw * localized_walk_context_switches (struct ast_context *con, struct ast_sw *sw)
 
struct ast_context * localized_walk_contexts (struct ast_context *con)
 
struct ast_exten * localized_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.
 
static int matchcid (const char *cidpattern, const char *callerid)
 
static void move_variables (struct ast_category *old, struct ast_category *new)
 
static struct ast_category * next_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)
 
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:
 
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 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.
 
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.
 
static struct timeval tvfix (struct timeval a)
 
static struct ast_variable * variable_clone (const struct ast_variable *old)
 

Variables

uint64_t __unsigned_int_flags_dummy64
 
char ast_defaultlanguage []
 
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_engine * config_engine_list
 
static char * config_filename = "extensions.conf"
 
static struct ast_config_map * config_maps = NULL
 
static ast_rwlock_t conlock = AST_RWLOCK_INIT_VALUE
 
static struct ast_context * contexts = 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 = AST_RWLOCK_INIT_VALUE
 
static struct hints hints = AST_RWLIST_HEAD_INIT_VALUE
 
static char * lline_buffer
 
static int lline_buffer_size
 
static struct ast_context * local_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.
 
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 1356 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 1360 of file extconf.c.

◆ AST_FILENAME_MAX

#define AST_FILENAME_MAX   80

Definition at line 1357 of file extconf.c.

◆ ast_fully_booted

#define ast_fully_booted   ast_test_flag64(&ast_options, AST_OPT_FLAG_FULLY_BOOTED)

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

1991 { \
1992 if (!(head)->first) { \
1993 (head)->first = (list)->first; \
1994 (head)->last = (list)->last; \
1995 } else { \
1996 (head)->last->field.next = (list)->first; \
1997 (head)->last = (list)->last; \
1998 } \
1999} while (0)
struct sla_ringing_trunk * first
Definition app_sla.c:338
struct sla_ringing_trunk * last
Definition app_sla.c:338
struct sla_station_ref * last
Definition app_sla.c:313
struct sla_ringing_trunk * next
Definition app_sla.c:314
struct sla_station_ref * first
Definition app_sla.c:313

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

◆ AST_LIST_ENTRY

#define AST_LIST_ENTRY (   type)
Value:
struct { \
struct type *next; \
}
static const char type[]

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.

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

Definition at line 1690 of file extconf.c.

1691 { \
1692 struct type *next; \
1693}

◆ 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 1701 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
Definition app_sla.c:337
static const char name[]
Definition format_mp3.c:68
Structure for mutex and tracking information.
Definition lock.h:142

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.

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

1454 { \
1455 struct type *first; \
1456 struct type *last; \
1457 ast_mutex_t lock; \
1458}

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

1881 { \
1882 (head)->first = NULL; \
1883 (head)->last = NULL; \
1884 ast_mutex_init(&(head)->lock); \
1885}

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

1922 { \
1923 (head)->first = NULL; \
1924 (head)->last = NULL; \
1925}

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

1514 { \
1515 .first = NULL, \
1516 .last = NULL, \
1517 .lock = AST_MUTEX_INIT_VALUE, \
1518 }

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

static AST_LIST_HEAD_NOLOCK(entry_list, entry) entries;
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).

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

1506 { \
1507 struct type *first; \
1508 struct type *last; \
1509}

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

1532 { \
1533 .first = NULL, \
1534 .last = NULL, \
1535 }

◆ 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:1532

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

1627 { \
1628 struct type *first; \
1629 struct type *last; \

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

1640 { \
1641 (head)->first = (entry); \
1642 (head)->last = (entry); \
1643 ast_mutex_init(&(head)->lock); \
1644} while (0)

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

1668 { \
1669 (head)->first = (entry); \
1670 (head)->last = (entry); \
1671} while (0)

◆ AST_LIST_HEAD_STATIC

#define AST_LIST_HEAD_STATIC (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
#define AST_LIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_LIST_HEAD.
Definition extconf.c:1514

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.

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

Definition at line 1571 of file extconf.c.

1572 { \
1573 struct type *first; \
1574 struct type *last; \
1575 ast_mutex_t lock; \

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

1936 { \
1937 (elm)->field.next = (listelm)->field.next; \
1938 (listelm)->field.next = (elm); \
1939 if ((head)->last == (listelm)) \
1940 (head)->last = (elm); \
1941} while (0)

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

1854 { \
1855 if (__list_prev) { \
1856 (elm)->field.next = __list_prev->field.next; \
1857 __list_prev->field.next = elm; \
1858 } else { \
1859 (elm)->field.next = (head)->first; \
1860 (head)->first = (elm); \
1861 } \
1862 __new_prev = (elm); \
1863} while (0)

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

1952 { \
1953 (elm)->field.next = (head)->first; \
1954 (head)->first = (elm); \
1955 if (!(head)->last) \
1956 (head)->last = (elm); \
1957} while (0)

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

1972 { \
1973 if (!(head)->first) { \
1974 (head)->first = (elm); \
1975 (head)->last = (elm); \
1976 } else { \
1977 (head)->last->field.next = (elm); \
1978 (head)->last = (elm); \
1979 } \
1980} while (0)

◆ 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 1709 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 1719 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 2033 of file extconf.c.

2033 { \
2034 if ((head)->first == (elm)) { \
2035 (head)->first = (elm)->field.next; \
2036 if ((head)->last == (elm)) \
2037 (head)->last = NULL; \
2038 } else { \
2039 typeof(elm) curelm = (head)->first; \
2040 while (curelm && (curelm->field.next != (elm))) \
2041 curelm = curelm->field.next; \
2042 if (curelm) { \
2043 curelm->field.next = (elm)->field.next; \
2044 if ((head)->last == (elm)) \
2045 (head)->last = curelm; \
2046 } \
2047 } \
2048 (elm)->field.next = NULL; \
2049} while (0)

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

2012 { \
2013 typeof((head)->first) cur = (head)->first; \
2014 if (cur) { \
2015 (head)->first = cur->field.next; \
2016 cur->field.next = NULL; \
2017 if ((head)->last == cur) \
2018 (head)->last = NULL; \
2019 } \
2020 cur; \
2021 })

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

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

1807 { \
1808 typeof((head)->first) __list_next; \
1809 typeof((head)->first) __list_prev = NULL; \
1810 typeof((head)->first) __new_prev = NULL; \
1811 for ((var) = (head)->first, __new_prev = (var), \
1812 __list_next = (var) ? (var)->field.next : NULL; \
1813 (var); \
1814 __list_prev = __new_prev, (var) = __list_next, \
1815 __new_prev = (var), \
1816 __list_next = (var) ? (var)->field.next : NULL \
1817 )
#define var
Definition ast_expr2f.c:605

◆ AST_LIST_TRAVERSE_SAFE_END

#define AST_LIST_TRAVERSE_SAFE_END   }

Closes a safe loop traversal block.

Definition at line 1870 of file extconf.c.

◆ AST_MAX_EXTENSION

#define AST_MAX_EXTENSION   80

Max length of an extension

Definition at line 2074 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_flag64(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)

Definition at line 1383 of file extconf.c.

◆ ast_opt_cache_record_files

#define ast_opt_cache_record_files   ast_test_flag64(&ast_options, AST_OPT_FLAG_CACHE_RECORD_FILES)

Definition at line 1377 of file extconf.c.

◆ ast_opt_console

#define ast_opt_console   ast_test_flag64(&ast_options, AST_OPT_FLAG_CONSOLE)

Definition at line 1367 of file extconf.c.

◆ ast_opt_dont_warn

#define ast_opt_dont_warn   ast_test_flag64(&ast_options, AST_OPT_FLAG_DONT_WARN)

Definition at line 1382 of file extconf.c.

◆ ast_opt_dump_core

#define ast_opt_dump_core   ast_test_flag64(&ast_options, AST_OPT_FLAG_DUMP_CORE)

Definition at line 1376 of file extconf.c.

◆ ast_opt_exec

#define ast_opt_exec   ast_test_flag64(&ast_options, AST_OPT_FLAG_EXEC)

Definition at line 1371 of file extconf.c.

◆ ast_opt_exec_includes

#define ast_opt_exec_includes   ast_test_flag64(&ast_options, AST_OPT_FLAG_EXEC_INCLUDES)

Definition at line 1364 of file extconf.c.

◆ ast_opt_high_priority

#define ast_opt_high_priority   ast_test_flag64(&ast_options, AST_OPT_FLAG_HIGH_PRIORITY)

Definition at line 1368 of file extconf.c.

◆ ast_opt_init_keys

#define ast_opt_init_keys   ast_test_flag64(&ast_options, AST_OPT_FLAG_INIT_KEYS)

Definition at line 1369 of file extconf.c.

◆ ast_opt_mute

#define ast_opt_mute   ast_test_flag64(&ast_options, AST_OPT_FLAG_MUTE)

Definition at line 1384 of file extconf.c.

◆ ast_opt_no_color

#define ast_opt_no_color   ast_test_flag64(&ast_options, AST_OPT_FLAG_NO_COLOR)

Definition at line 1372 of file extconf.c.

◆ ast_opt_no_fork

#define ast_opt_no_fork   ast_test_flag64(&ast_options, AST_OPT_FLAG_NO_FORK)

Definition at line 1365 of file extconf.c.

◆ ast_opt_override_config

#define ast_opt_override_config   ast_test_flag64(&ast_options, AST_OPT_FLAG_OVERRIDE_CONFIG)

Definition at line 1379 of file extconf.c.

◆ ast_opt_priority_jumping

#define ast_opt_priority_jumping   ast_test_flag64(&ast_options, AST_OPT_FLAG_PRIORITY_JUMPING)

Definition at line 1375 of file extconf.c.

◆ ast_opt_quiet

#define ast_opt_quiet   ast_test_flag64(&ast_options, AST_OPT_FLAG_QUIET)

Definition at line 1366 of file extconf.c.

◆ ast_opt_reconnect

#define ast_opt_reconnect   ast_test_flag64(&ast_options, AST_OPT_FLAG_RECONNECT)

Definition at line 1380 of file extconf.c.

◆ ast_opt_remote

#define ast_opt_remote   ast_test_flag64(&ast_options, AST_OPT_FLAG_REMOTE)

Definition at line 1370 of file extconf.c.

◆ ast_opt_timestamp

#define ast_opt_timestamp   ast_test_flag64(&ast_options, AST_OPT_FLAG_TIMESTAMP)

Definition at line 1378 of file extconf.c.

◆ ast_opt_transcode_via_slin

#define ast_opt_transcode_via_slin   ast_test_flag64(&ast_options, AST_OPT_FLAG_TRANSCODE_VIA_SLIN)

Definition at line 1374 of file extconf.c.

◆ ast_opt_transmit_silence

#define ast_opt_transmit_silence   ast_test_flag64(&ast_options, AST_OPT_FLAG_TRANSMIT_SILENCE)

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

◆ AST_RWLIST_EMPTY

#define AST_RWLIST_EMPTY   AST_LIST_EMPTY

Definition at line 1731 of file extconf.c.

◆ AST_RWLIST_ENTRY

#define AST_RWLIST_ENTRY   AST_LIST_ENTRY

Definition at line 1695 of file extconf.c.

◆ AST_RWLIST_FIRST

#define AST_RWLIST_FIRST   AST_LIST_FIRST

Definition at line 1703 of file extconf.c.

◆ AST_RWLIST_HEAD

#define AST_RWLIST_HEAD (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
}
Structure for rwlock and tracking information.
Definition lock.h:164

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.

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

1480 { \
1481 struct type *first; \
1482 struct type *last; \
1484}

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

1908 { \
1909 (head)->first = NULL; \
1910 (head)->last = NULL; \
1911 ast_rwlock_destroy(&(head)->lock); \
1912}

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

1894 { \
1895 (head)->first = NULL; \
1896 (head)->last = NULL; \
1897 ast_rwlock_init(&(head)->lock); \
1898}

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

1523 { \
1524 .first = NULL, \
1525 .last = NULL, \
1526 .lock = AST_RWLOCK_INIT_VALUE, \
1527 }

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

1654 { \
1655 (head)->first = (entry); \
1656 (head)->last = (entry); \
1657 ast_rwlock_init(&(head)->lock); \
1658} while (0)

◆ AST_RWLIST_HEAD_STATIC

#define AST_RWLIST_HEAD_STATIC (   name,
  type 
)
Value:
struct name { \
struct type *first; \
struct type *last; \
#define AST_RWLIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_RWLIST_HEAD.
Definition extconf.c:1523

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.

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

Definition at line 1613 of file extconf.c.

1614 { \
1615 struct type *first; \
1616 struct type *last; \

◆ AST_RWLIST_INSERT_AFTER

#define AST_RWLIST_INSERT_AFTER   AST_LIST_INSERT_AFTER

Definition at line 1943 of file extconf.c.

◆ AST_RWLIST_INSERT_BEFORE_CURRENT

#define AST_RWLIST_INSERT_BEFORE_CURRENT   AST_LIST_INSERT_BEFORE_CURRENT

Definition at line 1865 of file extconf.c.

◆ AST_RWLIST_INSERT_HEAD

#define AST_RWLIST_INSERT_HEAD   AST_LIST_INSERT_HEAD

Definition at line 1959 of file extconf.c.

◆ AST_RWLIST_INSERT_TAIL

#define AST_RWLIST_INSERT_TAIL   AST_LIST_INSERT_TAIL

Definition at line 1982 of file extconf.c.

◆ AST_RWLIST_LAST

#define AST_RWLIST_LAST   AST_LIST_LAST

Definition at line 1711 of file extconf.c.

◆ AST_RWLIST_NEXT

#define AST_RWLIST_NEXT   AST_LIST_NEXT

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

◆ AST_RWLIST_REMOVE

#define AST_RWLIST_REMOVE   AST_LIST_REMOVE

Definition at line 2051 of file extconf.c.

◆ AST_RWLIST_REMOVE_CURRENT

#define AST_RWLIST_REMOVE_CURRENT   AST_LIST_REMOVE_CURRENT

Definition at line 1842 of file extconf.c.

◆ AST_RWLIST_REMOVE_HEAD

#define AST_RWLIST_REMOVE_HEAD   AST_LIST_REMOVE_HEAD

Definition at line 2023 of file extconf.c.

◆ AST_RWLIST_TRAVERSE

#define AST_RWLIST_TRAVERSE   AST_LIST_TRAVERSE

Definition at line 1772 of file extconf.c.

◆ AST_RWLIST_TRAVERSE_SAFE_BEGIN

#define AST_RWLIST_TRAVERSE_SAFE_BEGIN   AST_LIST_TRAVERSE_SAFE_BEGIN

Definition at line 1819 of file extconf.c.

◆ AST_RWLIST_TRAVERSE_SAFE_END

#define AST_RWLIST_TRAVERSE_SAFE_END   AST_LIST_TRAVERSE_SAFE_END

Definition at line 1872 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 1431 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 1409 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_test_flag64

#define ast_test_flag64 (   p,
  flag 
)

Definition at line 685 of file extconf.c.

685 { \
686 typeof ((p)->flags) __p = (p)->flags; \
687 typeof (__unsigned_int_flags_dummy64) __x = 0; \
688 (void) (&__p == (typeof(__p)*)&__x); \
689 ((p)->flags & SWAP64_32(flag)); \
690 })
#define SWAP64_32(flags)
Definition extconf.c:678
uint64_t __unsigned_int_flags_dummy64
long int flag
Definition f2c.h:83
typedef typeof(dummy_tv_var_for_types.tv_sec) ast_time_t

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

◆ BACKGROUND_NOANSWER

#define BACKGROUND_NOANSWER   (1 << 1)

Definition at line 2322 of file extconf.c.

◆ BACKGROUND_PLAYBACK

#define BACKGROUND_PLAYBACK   (1 << 3)

Definition at line 2324 of file extconf.c.

◆ BACKGROUND_SKIP

#define BACKGROUND_SKIP   (1 << 0)

Definition at line 2321 of file extconf.c.

◆ CB_INCR

#define CB_INCR   250

Definition at line 709 of file extconf.c.

◆ COMMENT_END

#define COMMENT_END   "--;"

Definition at line 696 of file extconf.c.

◆ COMMENT_META

#define COMMENT_META   ';'

Definition at line 697 of file extconf.c.

◆ COMMENT_START

#define COMMENT_START   ";--"

Definition at line 695 of file extconf.c.

◆ COMMENT_TAG

#define COMMENT_TAG   '-'

Definition at line 698 of file extconf.c.

◆ DEBUG_M

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

Definition at line 96 of file extconf.c.

96 { \
97 a; \
98}

◆ EVENTLOG

#define EVENTLOG   "event_log"

Definition at line 93 of file extconf.c.

◆ EXT_DATA_SIZE

#define EXT_DATA_SIZE   8192

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

◆ MAX_NESTED_COMMENTS

#define MAX_NESTED_COMMENTS   128

Definition at line 694 of file extconf.c.

◆ ONE_MILLION

#define ONE_MILLION   1000000

Definition at line 2257 of file extconf.c.

◆ PRIORITY_HINT

#define PRIORITY_HINT   -1

Special Priority for a hint

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

◆ STATUS_NO_CONTEXT

#define STATUS_NO_CONTEXT   1

Definition at line 2444 of file extconf.c.

◆ STATUS_NO_EXTENSION

#define STATUS_NO_EXTENSION   2

Definition at line 2445 of file extconf.c.

◆ STATUS_NO_LABEL

#define STATUS_NO_LABEL   4

Definition at line 2447 of file extconf.c.

◆ STATUS_NO_PRIORITY

#define STATUS_NO_PRIORITY   3

Definition at line 2446 of file extconf.c.

◆ STATUS_SUCCESS

#define STATUS_SUCCESS   5

Definition at line 2448 of file extconf.c.

◆ SWAP64_32

#define SWAP64_32 (   flags)    (((uint64_t)(flags) << 32) | ((uint64_t)(flags) >> 32))

Definition at line 678 of file extconf.c.

◆ SWITCH_DATA_LENGTH

#define SWITCH_DATA_LENGTH   256

Definition at line 3606 of file extconf.c.

◆ VAR_BUF_SIZE

#define VAR_BUF_SIZE   4096

Definition at line 2315 of file extconf.c.

◆ VAR_HARDTRAN

#define VAR_HARDTRAN   3

Definition at line 2319 of file extconf.c.

◆ VAR_NORMAL

#define VAR_NORMAL   1

Definition at line 2317 of file extconf.c.

◆ VAR_SOFTTRAN

#define VAR_SOFTTRAN   2

Definition at line 2318 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 2349 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 2101 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 931 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 933 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 934 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 932 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

Definition at line 2080 of file extconf.c.

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

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

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

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

4703{
4704 struct ast_context *tmp, **loc_contexts;
4705 int length = sizeof(struct ast_context) + strlen(name) + 1;
4706
4707 if (!extcontexts) {
4709 loc_contexts = &contexts;
4710 } else
4711 loc_contexts = extcontexts;
4712
4713 for (tmp = *loc_contexts; tmp; tmp = tmp->next) {
4714 if (!strcasecmp(tmp->name, name)) {
4715 if (!existsokay) {
4716 ast_log(LOG_WARNING, "Tried to register context '%s', already in use\n", name);
4717 tmp = NULL;
4718 }
4719 if (!extcontexts)
4721 return tmp;
4722 }
4723 }
4724 if ((tmp = ast_calloc(1, length))) {
4725 ast_rwlock_init(&tmp->lock);
4726 strcpy(tmp->name, name);
4727 tmp->root = NULL;
4728 tmp->registrar = registrar;
4729 tmp->next = *loc_contexts;
4730 tmp->includes = NULL;
4731 tmp->ignorepats = NULL;
4732 *loc_contexts = tmp;
4733 if (option_debug)
4734 ast_log(LOG_DEBUG, "Registered context '%s'\n", tmp->name);
4735 if (option_verbose > 2)
4736 ast_verbose( VERBOSE_PREFIX_3 "Registered extension context '%s'\n", tmp->name);
4737 }
4738
4739 if (!extcontexts)
4741 return tmp;
4742}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define ast_log
Definition astobj2.c:42
#define VERBOSE_PREFIX_3
Definition extconf.c:102
static int ast_wrlock_contexts(void)
Definition extconf.c:4605
#define LOG_DEBUG
Definition extconf.c:121
static struct ast_context * contexts
Definition extconf.c:3593
static int ast_unlock_contexts(void)
Definition extconf.c:4610
#define LOG_WARNING
Definition extconf.c:139
static const char registrar[]
The static registrar for the added dialplan hints.
int option_debug
Definition options.c:70
int option_verbose
Definition options.c:68
#define ast_verbose(...)
#define ast_rwlock_init(rwlock)
wrapper for rwlock with tracking enabled
Definition lock.h:231
ast_context: An extension context
Definition pbx.c:254
struct ast_exten * root
Definition pbx.c:259
struct ast_ignorepats ignorepats
Definition pbx.c:264
struct ast_includes includes
Definition pbx.c:263
const char * registrar
Definition pbx.c:256
struct ast_context * next
Definition pbx.c:262
ast_rwlock_t lock
Definition pbx.c:258
const char * name
Definition pbx.c:255

References ast_calloc, ast_log, ast_rwlock_init, ast_unlock_contexts(), ast_verbose, ast_wrlock_contexts(), contexts, ast_context::ignorepats, ast_context::includes, ast_context::lock, LOG_DEBUG, LOG_WARNING, name, ast_context::name, ast_context::next, NULL, option_debug, option_verbose, registrar, ast_context::registrar, ast_context::root, 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 5497 of file extconf.c.

5498{
5499 struct ast_context *tmp, *tmpl=NULL;
5500 struct ast_include *tmpi;
5501 struct ast_sw *sw;
5502 struct ast_exten *e, *el, *en;
5503 struct ast_ignorepat *ipi;
5504
5505 for (tmp = contexts; tmp; ) {
5506 struct ast_context *next; /* next starting point */
5507 for (; tmp; tmpl = tmp, tmp = tmp->next) {
5508 if (option_debug)
5509 ast_log(LOG_DEBUG, "check ctx %s %s\n", tmp->name, tmp->registrar);
5510 if ( (!registrar || !strcasecmp(registrar, tmp->registrar)) &&
5511 (!con || !strcasecmp(tmp->name, con->name)) )
5512 break; /* found it */
5513 }
5514 if (!tmp) /* not found, we are done */
5515 break;
5516 ast_wrlock_context(tmp);
5517 if (option_debug)
5518 ast_log(LOG_DEBUG, "delete ctx %s %s\n", tmp->name, tmp->registrar);
5519 next = tmp->next;
5520 if (tmpl)
5521 tmpl->next = next;
5522 else
5523 contexts = next;
5524 /* Okay, now we're safe to let it go -- in a sense, we were
5525 ready to let it go as soon as we locked it. */
5526 ast_unlock_context(tmp);
5527 for (tmpi = tmp->includes; tmpi; ) { /* Free includes */
5528 struct ast_include *tmpil = tmpi;
5529 tmpi = tmpi->next;
5530 free(tmpil);
5531 }
5532 for (ipi = tmp->ignorepats; ipi; ) { /* Free ignorepats */
5533 struct ast_ignorepat *ipl = ipi;
5534 ipi = ipi->next;
5535 free(ipl);
5536 }
5537 while ((sw = AST_LIST_REMOVE_HEAD(&tmp->alts, list)))
5538 free(sw);
5539 for (e = tmp->root; e;) {
5540 for (en = e->peer; en;) {
5541 el = en;
5542 en = en->peer;
5544 }
5545 el = e;
5546 e = e->next;
5548 }
5549 ast_rwlock_destroy(&tmp->lock);
5550 free(tmp);
5551 /* if we have a specific match, we are done, otherwise continue */
5552 tmp = con ? NULL : next;
5553 }
5554}
static EditLine * el
Definition asterisk.c:348
static int ast_wrlock_context(struct ast_context *con)
Definition extconf.c:4615
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition extconf.c:2012
static int ast_unlock_context(struct ast_context *con)
Definition extconf.c:4620
static void destroy_exten(struct ast_exten *e)
Definition extconf.c:3761
void free()
#define ast_rwlock_destroy(rwlock)
Definition lock.h:240
ast_exten: An extension The dialplan is saved as a linked list with each context having it's own link...
Definition pbx.c:207
struct ast_exten * peer
Definition pbx.c:220
struct ast_exten * next
Definition pbx.c:226
ast_ignorepat: Ignore patterns in dial plan
struct ast_ignorepat * next
Definition extconf.c:2384
ast_include: include= support in extensions.conf
Definition pbx_include.c:37
struct ast_include * next
Definition extconf.c:2366
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, and registrar.

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

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

788{
789
790}

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

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

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

Referenced by ast_add_extension2().

◆ ALLOC_COMMENT()

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

Definition at line 875 of file extconf.c.

876{
877 struct ast_comment *x = ast_calloc(1,sizeof(struct ast_comment)+strlen(buffer)+1);
878 strcpy(x->cmt, buffer);
879 return x;
880}
Structure to keep comments for rewriting configuration files.
Definition main/config.c:85
char cmt[0]
Definition main/config.c:88

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

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

References add_pri(), ast_exten::app, 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, ast_exten::parent, priority, ast_exten::priority, PRIORITY_HINT, registrar, ast_exten::registrar, replace(), ast_context::root, ast_exten::stuff, 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 3638 of file extconf.c.

3639{
3640 struct ast_hint *hint;
3641
3642 if (!e)
3643 return -1;
3644
3645
3646 /* Search if hint exists, do nothing */
3647 AST_RWLIST_TRAVERSE(&hints, hint, list) {
3648 if (hint->exten == e) {
3649 if (option_debug > 1)
3650 ast_log(LOG_DEBUG, "HINTS: Not re-adding existing hint %s: %s\n", ast_get_extension_name(e), ast_get_extension_app(e));
3651 return -1;
3652 }
3653 }
3654
3655 if (option_debug > 1)
3656 ast_log(LOG_DEBUG, "HINTS: Adding hint %s: %s\n", ast_get_extension_name(e), ast_get_extension_app(e));
3657
3658 if (!(hint = ast_calloc(1, sizeof(*hint)))) {
3659 return -1;
3660 }
3661 /* Initialize and insert new item at the top */
3662 hint->exten = e;
3664
3665 return 0;
3666}
static const char * ast_get_extension_app(struct ast_exten *e)
Definition extconf.c:3608
#define AST_RWLIST_TRAVERSE
Definition extconf.c:1772
static const char * ast_get_extension_name(struct ast_exten *exten)
Definition extconf.c:3613
#define AST_RWLIST_INSERT_HEAD
Definition extconf.c:1959
Structure for dial plan hints.
Definition extconf.c:2426
struct ast_hint::@555 list
struct ast_exten * exten
Definition extconf.c:2427

References ast_calloc, ast_get_extension_app(), ast_get_extension_name(), ast_log, AST_RWLIST_INSERT_HEAD, AST_RWLIST_TRAVERSE, ast_hint::exten, ast_hint::list, 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 2482 of file extconf.c.

2483{
2484 int argc;
2485 char *scan;
2486 int paren = 0, quote = 0;
2487
2488 if (!buf || !array || !arraylen)
2489 return 0;
2490
2491 memset(array, 0, arraylen * sizeof(*array));
2492
2493 scan = buf;
2494
2495 for (argc = 0; *scan && (argc < arraylen - 1); argc++) {
2496 array[argc] = scan;
2497 for (; *scan; scan++) {
2498 if (*scan == '(')
2499 paren++;
2500 else if (*scan == ')') {
2501 if (paren)
2502 paren--;
2503 } else if (*scan == '"' && delim != '"') {
2504 quote = quote ? 0 : 1;
2505 /* Remove quote character from argument */
2506 memmove(scan, scan + 1, strlen(scan));
2507 scan--;
2508 } else if (*scan == '\\') {
2509 /* Literal character, don't parse */
2510 memmove(scan, scan + 1, strlen(scan));
2511 } else if ((*scan == delim) && !paren && !quote) {
2512 *scan++ = '\0';
2513 break;
2514 }
2515 }
2516 }
2517
2518 if (*scan)
2519 array[argc++] = scan;
2520
2521 return argc;
2522}
#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().

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

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

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

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

References ast_strdup, ast_strdupa, ast_strlen_zero(), ast_timing::daymask, days, ast_timing::dowmask, get_range(), get_timerange(), 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 2829 of file extconf.c.

2830{
2831 if (config->last)
2832 config->last->next = category;
2833 else
2834 config->root = category;
2835 config->last = category;
2836 config->current = category;
2837}
static const char config[]
struct ast_variable * last
struct ast_variable * root

Referenced by process_text_line().

◆ ast_category_browse()

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

Definition at line 3322 of file extconf.c.

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

Referenced by pbx_load_config().

◆ ast_category_destroy()

static void ast_category_destroy ( struct ast_category *  cat)
static

Definition at line 2841 of file extconf.c.

2842{
2844 if (cat->file)
2845 free(cat->file);
2846
2847 free(cat);
2848}
static void ast_variables_destroy(struct ast_variable *v)
Definition extconf.c:1260
char * file
The file name from whence this declaration was read.

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

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

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

2785{
2786 struct ast_category *category;
2787
2788 if ((category = ast_calloc(1, sizeof(*category))))
2789 ast_copy_string(category->name, name, sizeof(category->name));
2790 category->file = strdup(in_file);
2791 category->lineno = lineno; /* if you don't know the lineno, set it to 999999 or something real big */
2792 return category;
2793}
void ast_copy_string(char *dst, const char *src, size_t size)
Definition extconf.c:968

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

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

References AST_RWLIST_TRAVERSE, ast_hint::exten, and ast_hint::list.

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

3997{
3998 /* sorry, but this feature will NOT be available
3999 in the standalone version */
4000 return 0;
4001}

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

◆ ast_config_destroy()

static void ast_config_destroy ( struct ast_config *  cfg)
static

Definition at line 1287 of file extconf.c.

1288{
1289 struct ast_category *cat, *catn;
1290
1291 if (!cfg)
1292 return;
1293
1295
1296 cat = cfg->root;
1297 while (cat) {
1299 catn = cat;
1300 cat = cat->next;
1301 free(catn);
1302 }
1303 free(cfg);
1304}
static void ast_includes_destroy(struct ast_config_include *incls)
Definition extconf.c:1271
struct ast_config_include * includes
Definition extconf.c:916
struct ast_category * root

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

2778{
2779 return cfg->current;
2780}
struct ast_category * current

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

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

References ast_log, config_engine_list, extconfig_conf, find_engine(), ast_config::include_level, ast_config_engine::load_func, LOG_WARNING, ast_config::max_include_level, NULL, result, 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 3270 of file extconf.c.

3271{
3272 struct ast_config *config;
3273
3274 if ((config = ast_calloc(1, sizeof(*config))))
3276 return config;
3277}
#define MAX_INCLUDE_LEVEL
Definition extconf.c:893

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

3359{
3360 /* cast below is just to silence compiler warning about dropping "const" */
3361 cfg->current = (struct ast_category *) cat;
3362}

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

1369{
1370 /* Send to the root console */
1371 fputs(string, stdout);
1372 fflush(stdout);
1373
1374 /* Send to any network console clients */
1375 ast_network_puts(string);
1376}
static void ast_network_puts(const char *string)
write the string to all attached console clients
Definition asterisk.c:1352

◆ ast_context_add_ignorepat2()

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

Definition at line 4563 of file extconf.c.

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

References ast_calloc, errno, ast_context::ignorepats, ast_ignorepat::next, NULL, ast_ignorepat::pattern, registrar, ast_ignorepat::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 4497 of file extconf.c.

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

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

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, registrar, ast_sw::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 4168 of file extconf.c.

4169{
4170 struct ast_context *tmp = NULL;
4171 while ( (tmp = ast_walk_contexts(tmp)) ) {
4172 if (!name || !strcasecmp(name, tmp->name))
4173 break;
4174 }
4175 return tmp;
4176}
struct ast_context * ast_walk_contexts(void)
Definition ael_main.c:401

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

4977{
4978 return __ast_context_create(extcontexts, name, registrar, 1);
4979}
static struct ast_context * __ast_context_create(struct ast_context **extcontexts, const char *name, const char *registrar, int existsokay)
Definition extconf.c:4702

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

4120{
4121 int c = 0;
4122 struct ast_ignorepat *ip = NULL;
4123
4124 while ((ip = ast_walk_context_ignorepats(con, ip))) {
4125 c++;
4126 }
4127
4128 return c;
4129}
static struct ast_ignorepat * ast_walk_context_ignorepats(struct ast_context *con, struct ast_ignorepat *ip)
Definition extconf.c:4109

References ast_walk_context_ignorepats(), c, and NULL.

◆ ast_context_includes_count()

int ast_context_includes_count ( struct ast_context *  con)

Definition at line 4086 of file extconf.c.

4087{
4088 int c = 0;
4089 struct ast_include *inc = NULL;
4090
4091 while ((inc = ast_walk_context_includes(con, inc))) {
4092 c++;
4093 }
4094
4095 return c;
4096}
static struct ast_include * ast_walk_context_includes(struct ast_context *con, struct ast_include *inc)
Definition extconf.c:4076

References ast_walk_context_includes(), c, and NULL.

◆ ast_context_switches_count()

int ast_context_switches_count ( struct ast_context *  con)

Definition at line 4153 of file extconf.c.

4154{
4155 int c = 0;
4156 struct ast_sw *sw = NULL;
4157
4158 while ((sw = ast_walk_context_switches(con, sw))) {
4159 c++;
4160 }
4161
4162 return c;
4163}
static struct ast_sw * ast_walk_context_switches(struct ast_context *con, struct ast_sw *sw)
Definition extconf.c:4135

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

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

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

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

4292{
4293 return extension_match_core(pattern, data, E_MATCH);
4294}
static int extension_match_core(const char *pattern, const char *data, enum ext_match_t mode)
Definition extconf.c:4282

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

4972{
4973 return pbx_extension_helper(c, con, NULL, exten, 0, label, callerid, E_FINDLABEL);
4974}
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:4910
@ 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 4989 of file extconf.c.

4990{
4991 ast_log(LOG_ERROR, "Function %s not registered\n", function);
4992 return -1;
4993}
#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 2474 of file extconf.c.

2475{
2476
2477 /* ast_log(LOG_ERROR, "Function %s not registered\n", function); we are not interested in the details here */
2478
2479 return -1;
2480}

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

4483{
4484 return con ? con->name : NULL;
4485}

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

3609{
3610 return e ? e->app : NULL;
3611}

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

3614{
3615 return exten ? exten->exten : NULL;
3616}

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

1162{
1163 struct ast_config_include *x;
1164 for (x=conf->includes;x;x=x->next)
1165 {
1166 if (strcmp(x->included_file,included_file) == 0)
1167 return x;
1168 }
1169 return 0;
1170}
char * included_file
file name included
struct ast_config_include * next
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 1072 of file extconf.c.

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

Referenced by process_text_line().

◆ ast_includes_destroy()

static void ast_includes_destroy ( struct ast_config_include *  incls)
static

Definition at line 1271 of file extconf.c.

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

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

Definition at line 2190 of file extconf.c.

2191{
2192 va_list vars;
2193 va_start(vars,fmt);
2194
2195 printf("LOG: lev:%d file:%s line:%d func: %s ",
2196 level, file, line, function);
2197 vprintf(fmt, vars);
2198 fflush(stdout);
2199 va_end(vars);
2200}

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

2578{
2579#ifdef HAVE_BKTR
2580 struct ast_bt *bt;
2581 int i = 0;
2582 struct ast_vector_string *strings;
2583
2584 if (!(bt = ast_bt_create())) {
2585 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
2586 return;
2587 }
2588
2589 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
2590 int count = AST_VECTOR_SIZE(strings);
2591 struct ast_str *buf = ast_str_create(bt->num_frames * 64);
2592
2593 if (buf) {
2594 ast_str_append(&buf, 0, "Got %d backtrace record%c\n", count - 3, count - 3 != 1 ? 's' : ' ');
2595 for (i = 3; i < AST_VECTOR_SIZE(strings); i++) {
2596 ast_str_append(&buf, 0, "#%2d: %s\n", i - 3, AST_VECTOR_GET(strings, i));
2597 }
2599 ast_free(buf);
2600 }
2601
2602 ast_bt_free_symbols(strings);
2603 } else {
2604 ast_log(LOG_ERROR, "Could not allocate memory for backtrace\n");
2605 }
2606 ast_bt_destroy(bt);
2607#else
2608 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
2609#endif /* defined(HAVE_BKTR) */
2610}
#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:2542
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
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
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:637
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition vector.h:708

◆ ast_mark_lock_failed()

void ast_mark_lock_failed ( void *  lock_addr)

Definition at line 2309 of file extconf.c.

2310{
2311 /* Pretend to do something. */
2312}

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

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

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

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

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

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

974{
975 va_list ap;
976 struct timeval tv;
977 struct ast_tm tm;
978 char qlog_msg[8192];
979 int qlog_len;
980 char time_str[30];
981
982 if (!logger_initialized) {
983 /* You are too early. We are not open yet! */
984 return;
985 }
986 if (!queuelog_init) {
987 /* We must initialize now since someone is trying to log something. */
989 }
990
991 if (ast_check_realtime("queue_log")) {
992 tv = ast_tvnow();
993 ast_localtime(&tv, &tm, logfiles.queue_log_realtime_use_gmt ? "GMT" : NULL);
994 ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
995 va_start(ap, fmt);
996 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
997 va_end(ap);
998 if (logfiles.queue_adaptive_realtime) {
1000 AST_APP_ARG(data)[5];
1001 );
1002 AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
1003 /* Ensure fields are large enough to receive data */
1004 ast_realtime_require_field("queue_log",
1005 "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
1006 "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
1007 "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
1008 "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
1009 "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
1010 SENTINEL);
1011
1012 /* Store the log */
1013 ast_store_realtime("queue_log", "time", time_str,
1014 "callid", callid,
1015 "queuename", queuename,
1016 "agent", agent,
1017 "event", event,
1018 "data1", S_OR(args.data[0], ""),
1019 "data2", S_OR(args.data[1], ""),
1020 "data3", S_OR(args.data[2], ""),
1021 "data4", S_OR(args.data[3], ""),
1022 "data5", S_OR(args.data[4], ""),
1023 SENTINEL);
1024 } else {
1025 ast_store_realtime("queue_log", "time", time_str,
1026 "callid", callid,
1027 "queuename", queuename,
1028 "agent", agent,
1029 "event", event,
1030 "data", qlog_msg,
1031 SENTINEL);
1032 }
1033
1034 if (!logfiles.queue_log_to_file) {
1035 return;
1036 }
1037 }
1038
1039 if (qlog) {
1040 va_start(ap, fmt);
1041 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
1042 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
1043 va_end(ap);
1045 if (qlog) {
1046 fprintf(qlog, "%s\n", qlog_msg);
1047 fflush(qlog);
1048 }
1050 }
1051}
#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.
int ast_check_realtime(const char *family)
Check if realtime engine is configured for family.
int ast_store_realtime(const char *family,...) attribute_sentinel
Create realtime configuration.
#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.
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 struct @395 logfiles
static int queuelog_init
Definition logger.c:86
void logger_queue_start(void)
Start the ast_queue_log() logger.
Definition logger.c:2175
static FILE * qlog
Definition logger.c:214
static int logger_initialized
Definition logger.c:87
static struct @523 args
#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
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 3729 of file extconf.c.

3730{
3731 /* Cleanup the Notifys if hint is removed */
3732 struct ast_hint *hint;
3733 struct ast_state_cb *cblist, *cbprev;
3734 int res = -1;
3735
3736 if (!e)
3737 return -1;
3738
3740 if (hint->exten == e) {
3741 cbprev = NULL;
3742 cblist = hint->callbacks;
3743 while (cblist) {
3744 /* Notify with -1 and remove all callbacks */
3745 cbprev = cblist;
3746 cblist = cblist->next;
3747 free(cbprev);
3748 }
3749 hint->callbacks = NULL;
3751 free(hint);
3752 res = 0;
3753 break;
3754 }
3755 }
3757
3758 return res;
3759}
#define AST_RWLIST_REMOVE_CURRENT
Definition extconf.c:1842
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition extconf.c:1819
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition extconf.c:1872
struct ast_state_cb * callbacks
Definition extconf.c:2429
ast_state_cb: An extension state notify register item
Definition extconf.c:2413
struct ast_state_cb * next
Definition extconf.c:2417

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

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

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}

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

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

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

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

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

828{
829 pid_t pid;
830#ifdef HAVE_WORKING_FORK
831 int x;
832#endif
833 int res;
834 int status;
835
836#if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
838
839#ifdef HAVE_WORKING_FORK
840 pid = fork();
841#else
842 pid = vfork();
843#endif
844
845 if (pid == 0) {
846#ifdef HAVE_WORKING_FORK
847 /* Close file descriptors and launch system command */
848 for (x = STDERR_FILENO + 1; x < 4096; x++)
849 close(x);
850#endif
851 execl("/bin/sh", "/bin/sh", "-c", s, (char *) NULL);
852 _exit(1);
853 } else if (pid > 0) {
854 for(;;) {
855 res = waitpid(pid, &status, 0);
856 if (res > -1) {
857 res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
858 break;
859 } else if (errno != EINTR)
860 break;
861 }
862 } else {
863 ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(errno));
864 res = -1;
865 }
866
868#else
869 res = -1;
870#endif
871
872 return res;
873}
jack_status_t status
Definition app_jack.c:149
void ast_replace_sigchld(void)
Replace the SIGCHLD handler.
Definition extconf.c:799
void ast_unreplace_sigchld(void)
Restore the SIGCHLD handler.
Definition extconf.c:813
#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(), mixmonitor_thread(), notify_message(), process_text_line(), rotate_file(), run_externnotify(), sendmail(), 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 2132 of file extconf.c.

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

Referenced by pbx_load_config().

◆ ast_skip_blanks()

char * ast_skip_blanks ( const char *  str)

Definition at line 977 of file extconf.c.

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

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

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

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

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

2279{
2280 /* consistency checks to guarantee usec in 0..999999 */
2281 a = tvfix(a);
2282 b = tvfix(b);
2283 a.tv_sec += b.tv_sec;
2284 a.tv_usec += b.tv_usec;
2285 if (a.tv_usec >= ONE_MILLION) {
2286 a.tv_sec++;
2287 a.tv_usec -= ONE_MILLION;
2288 }
2289 return a;
2290}
#define ONE_MILLION
Definition extconf.c:2257
static struct timeval tvfix(struct timeval a)
Definition extconf.c:2262
static struct test_val b

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(), register_aor_core(), rtp_deallocate_transport(), run_task(), sched_run(), sched_settime(), schedule_cache_expiration(), schedule_delivery(), set_timeout(), sla_process_timers(), smdi_message_wait(), sorcery_memory_cache_print_object(), stasis_app_broadcast_wait(), subscription_persistence_update(), timeout_write(), user_event_wait_for_events(), and wait_for_stimulus().

◆ ast_tvnow()

struct timeval ast_tvnow ( void  )

Definition at line 5667 of file extconf.c.

5668{
5669 struct timeval t;
5670 gettimeofday(&t, NULL);
5671 return t;
5672}

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

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

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

4621{
4622 return ast_rwlock_unlock(&con->lock);
4623}
#define ast_rwlock_unlock(a)
Definition lock.h:241

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

4611{
4612 return ast_rwlock_unlock(&conlock);
4613}
static ast_rwlock_t conlock
Definition extconf.c:4478

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

814{
815 unsigned int level;
816
817 level = --safe_system_level;
818
819 /* only restore the handler if we are the last one */
820 if (level == 0) {
821 sigaction(SIGCHLD, &safe_system_prev_handler, NULL);
822 }
823}

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

2451{
2452 struct ast_var_t *var;
2453 int name_len = strlen(name) + 1;
2454 int value_len = strlen(value) + 1;
2455
2456 if (!(var = ast_calloc(sizeof(*var) + name_len + value_len, sizeof(char)))) {
2457 return NULL;
2458 }
2459
2460 ast_copy_string(var->name, name, name_len);
2461 var->value = var->name + name_len;
2462 ast_copy_string(var->value, value, value_len);
2463
2464 return var;
2465}

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

◆ ast_var_delete()

static void ast_var_delete ( struct ast_var_t *  var)
static

Definition at line 2467 of file extconf.c.

2468{
2469 free(var);
2470}

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

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

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

5022{
5023 return (var ? var->value : NULL);
5024}

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

1176{
1177 if (!variable)
1178 return;
1179 if (category->last)
1180 category->last->next = variable;
1181 else
1182 category->root = variable;
1183 category->last = variable;
1184 while (category->last->next)
1185 category->last = category->last->next;
1186}
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 1213 of file extconf.c.

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

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

1054{
1055 struct ast_variable *variable;
1056 int name_len = strlen(name) + 1;
1057 size_t value_len = strlen(value) + 1;
1058 size_t filename_len = strlen(filename) + 1;
1059
1060 if ((variable = ast_calloc(1, name_len + value_len + filename_len + sizeof(*variable)))) {
1061 variable->name = variable->stuff;
1062 variable->value = variable->stuff + name_len;
1063 variable->file = variable->value + value_len;
1064 strcpy(variable->name,name);
1065 ast_copy_string(variable->value, value, value_len);
1066 ast_copy_string(variable->file, filename, filename_len);
1067 }
1068
1069 return variable;
1070}
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.

◆ ast_variable_retrieve()

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

Definition at line 1225 of file extconf.c.

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

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

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

Referenced by ast_category_destroy(), and ast_config_destroy().

◆ ast_verbose()

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

Definition at line 2202 of file extconf.c.

2203{
2204 va_list vars;
2205 va_start(vars,fmt);
2206
2207 printf("VERBOSE: ");
2208 vprintf(fmt, vars);
2209 fflush(stdout);
2210 va_end(vars);
2211}

◆ ast_walk_context_extensions()

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

Definition at line 4036 of file extconf.c.

4038{
4039 if (!exten)
4040 return con ? con->root : NULL;
4041 else
4042 return exten->next;
4043}

References ast_exten::exten, ast_exten::next, 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 4109 of file extconf.c.

4111{
4112 if (!ip)
4113 return con ? con->ignorepats : NULL;
4114 else
4115 return ip->next;
4116}

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

4078{
4079 if (!inc)
4080 return con ? con->includes : NULL;
4081 else
4082 return inc->next;
4083}

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

4137{
4138 if (!sw)
4139 return con ? AST_LIST_FIRST(&con->alts) : NULL;
4140 else
4141 return AST_LIST_NEXT(sw, list);
4142}
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition extconf.c:1701
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition extconf.c:1719

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

4021{
4022 return con ? con->next : contexts;
4023}

◆ ast_walk_extension_priorities()

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

Definition at line 4057 of file extconf.c.

4059{
4060 return priority ? priority->peer : exten;
4061}

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

4616{
4617 return ast_rwlock_wrlock(&con->lock);
4618}
#define ast_rwlock_wrlock(a)
Definition lock.h:243

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

4606{
4607 return ast_rwlock_wrlock(&conlock);
4608}

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

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

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

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

◆ CB_ADD()

static void CB_ADD ( char *  str)
static

Definition at line 735 of file extconf.c.

736{
737 int rem = comment_buffer_size - strlen(comment_buffer) - 1;
738 int siz = strlen(str);
739 if (rem < siz+1) {
741 if (!comment_buffer)
742 return;
744 }
745 strcat(comment_buffer,str);
746}
const char * str
Definition app_jack.c:150
#define ast_realloc(p, len)
A wrapper for realloc()
Definition astmm.h:226
#define CB_INCR
Definition extconf.c:709
static char * comment_buffer
Definition extconf.c:703
static int comment_buffer_size
Definition extconf.c:704

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

749{
750 int cbl = strlen(comment_buffer) + 1;
751 int rem = comment_buffer_size - cbl;
752 if (rem < len+1) {
754 if (!comment_buffer)
755 return;
757 }
758 strncat(comment_buffer,str,len); /* safe */
759 comment_buffer[cbl+len-1] = 0;
760}
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 716 of file extconf.c.

717{
718 if (!comment_buffer) {
720 if (!comment_buffer)
721 return;
722 comment_buffer[0] = 0;
725 if (!lline_buffer)
726 return;
727 lline_buffer[0] = 0;
729 } else {
730 comment_buffer[0] = 0;
731 lline_buffer[0] = 0;
732 }
733}
#define ast_malloc(len)
A wrapper for malloc()
Definition astmm.h:191
static char * lline_buffer
Definition extconf.c:706
static int lline_buffer_size
Definition extconf.c:707

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

776{
777 comment_buffer[0] = 0;
778 lline_buffer[0] = 0;
779}

References comment_buffer, and lline_buffer.

Referenced by config_text_file_load(), process_text_line(), and 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 3115 of file extconf.c.

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

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

3762{
3763 if (e->priority == PRIORITY_HINT)
3764 ast_remove_hint(e);
3765
3766 if (e->datad)
3767 e->datad(e->data);
3768 free(e);
3769}
static int ast_remove_hint(struct ast_exten *e)
ast_remove_hint: Remove hint from extension
Definition extconf.c:3729

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

3941{
3942 /* make sure non-patterns come first.
3943 * If a is not a pattern, it either comes first or
3944 * we use strcmp to compare the strings.
3945 */
3946 int ret = 0;
3947
3948 if (a[0] != '_')
3949 return (b[0] == '_') ? -1 : strcmp(a, b);
3950
3951 /* Now we know a is a pattern; if b is not, a comes first */
3952 if (b[0] != '_')
3953 return 1;
3954#if 0 /* old mode for ext matching */
3955 return strcmp(a, b);
3956#endif
3957 /* ok we need full pattern sorting routine */
3958 while (!ret && a && b)
3959 ret = ext_cmp1(&a) - ext_cmp1(&b);
3960 if (ret == 0)
3961 return 0;
3962 else
3963 return (ret > 0) ? 1 : -1;
3964}
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:3868

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

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

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

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

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

4283{
4284 int i;
4285 i = _extension_match_core(pattern, data, mode);
4286 return i;
4287}
static int _extension_match_core(const char *pattern, const char *data, enum ext_match_t mode)
Definition extconf.c:4187

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

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

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

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

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

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

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

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

4308{
4309 if (!i->hastime)
4310 return 1;
4311
4312 return ast_check_timing(&(i->timing));
4313}
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:3996

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

2820{
2821 struct ast_variable *var;
2822
2823 for (var = base->root; var; var = var->next)
2825}
static void ast_variable_append(struct ast_category *category, struct ast_variable *variable)
Definition extconf.c:1175
static struct ast_variable * variable_clone(const struct ast_variable *old)
Definition extconf.c:1246

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

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

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

4895{
4896 return ast_add_extension2(con, replace, extension, priority, label, callerid, application, data, datad, registrar);
4897}
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:4769

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

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

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

◆ localized_category_get()

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

Definition at line 2797 of file extconf.c.

2798{
2799 return category_get(config, category_name, 0);
2800}

References category_get(), and config.

◆ localized_config_load()

struct ast_config * localized_config_load ( const char *  filename)

Definition at line 3281 of file extconf.c.

3282{
3283 struct ast_config *cfg;
3284 struct ast_config *result;
3285
3286 cfg = ast_config_new();
3287 if (!cfg)
3288 return NULL;
3289
3290 result = ast_config_internal_load(filename, cfg, 0, "");
3291 if (!result)
3292 ast_config_destroy(cfg);
3293
3294 return result;
3295}
static struct ast_config * ast_config_new(void)
Definition extconf.c:3270
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:2858
static void ast_config_destroy(struct ast_config *cfg)
Definition extconf.c:1287

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

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

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

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

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

4596{
4598}
static int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar)
Definition extconf.c:4563

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

4555{
4557}
static int ast_context_add_include2(struct ast_context *con, const char *value, const char *registrar)
Definition extconf.c:4497

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

4698{
4699 return ast_context_add_switch2(con, value, data, eval, registrar);
4700}
static int ast_context_add_switch2(struct ast_context *con, const char *value, const char *data, int eval, const char *registrar)
Definition extconf.c:4635

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

4983{
4984 return __ast_context_create(extcontexts, name, registrar, 1);
4985}

References __ast_context_create(), name, and registrar.

◆ localized_context_verify_includes()

int localized_context_verify_includes ( struct ast_context *  con)

Definition at line 5633 of file extconf.c.

5634{
5635 return ast_context_verify_includes(con);
5636}
void ast_context_verify_includes(void)
Definition ael_main.c:395

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

4472{
4473 return pbx_find_extension(NULL, bypass, q, context, exten, priority, label, callerid, action);
4474}
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:4328

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

5612{
5614}
void ast_merge_contexts_and_delete(void)
Definition ael_main.c:389

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

2602{
2603 return pbx_builtin_setvar(chan, data);
2604}
static int pbx_builtin_setvar(struct ast_channel *chan, const void *data)
Definition extconf.c:2564

References pbx_builtin_setvar().

◆ localized_pbx_load_module()

int localized_pbx_load_module ( void  )

Definition at line 5640 of file extconf.c.

5641{
5642 struct ast_context *con;
5643
5645 return -1 /* AST_MODULE_LOAD_DECLINE*/;
5646
5647 /* pbx_load_users(); */ /* does this affect the dialplan? */
5648
5650
5651 for (con = NULL; (con = ast_walk_contexts(con));)
5653
5654 printf("=== Loading extensions.conf ===\n");
5655 con = 0;
5656 while ((con = ast_walk_contexts(con)) ) {
5657 printf("Context: %s\n", con->name);
5658 }
5659 printf("=========\n");
5660
5661 return 0;
5662}
static struct ast_context * local_contexts
Definition extconf.c:3592
static int pbx_load_config(const char *config_file)
Definition extconf.c:5332
static char * global_registrar
Definition extconf.c:2117
static char * config_filename
Definition extconf.c:2116

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

3110{
3111 use_local_dir = 0;
3112}

References use_local_dir.

Referenced by main().

◆ localized_use_local_dir()

void localized_use_local_dir ( void  )

Definition at line 3104 of file extconf.c.

3105{
3106 use_local_dir = 1;
3107}

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

4049{
4050 return ast_walk_context_extensions(con,exten);
4051}
static struct ast_exten * ast_walk_context_extensions(struct ast_context *con, struct ast_exten *exten)
Definition extconf.c:4036

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

4102{
4103 return ast_walk_context_includes(con, inc);
4104}

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

4148{
4149 return ast_walk_context_switches(con, sw);
4150}

References ast_walk_context_switches().

◆ localized_walk_contexts()

struct ast_context * localized_walk_contexts ( struct ast_context *  con)

Definition at line 4026 of file extconf.c.

4027{
4028 return ast_walk_contexts(con);
4029}

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

4067{
4069}
static struct ast_exten * ast_walk_extension_priorities(struct ast_exten *exten, struct ast_exten *priority)
Definition extconf.c:4057

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

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

References max.

Referenced by get_range().

◆ matchcid()

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

Definition at line 4296 of file extconf.c.

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

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

2803{
2804 struct ast_variable *var = old->root;
2805 old->root = NULL;
2806#if 1
2807 /* we can just move the entire list in a single op */
2809#else
2810 while (var) {
2811 struct ast_variable *next = var->next;
2812 var->next = NULL;
2814 var = next;
2815 }
2816#endif
2817}

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

3316{
3317 for (; cat && cat->ignored; cat = cat->next);
3318
3319 return cat;
3320}

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

2739{
2740}

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

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

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

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

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

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

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

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

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

References ast_context::alts, 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, 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(), ast_context::includes, pbx_find_info::incstack, ast_exten::label, LOG_WARNING, match(), ast_exten::matchcid, matchcid(), ast_switch::matchmore, ast_context::name, 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, and pbx_find_info::swo.

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

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

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

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

5325{
5326 pbx_substitute_variables_helper_full(c, NULL, cp1, cp2, count);
5327}
static void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int count)
Definition extconf.c:5142

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

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

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(), 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 2902 of file extconf.c.

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

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

References ast_config_AST_CONFIG_DIR, ast_copy_string(), and ast_category::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 5034 of file extconf.c.

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

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

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

References a, ast_log, LOG_WARNING, and ONE_MILLION.

◆ variable_clone()

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

Definition at line 1246 of file extconf.c.

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

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

◆ __unsigned_int_flags_dummy64

uint64_t __unsigned_int_flags_dummy64
extern

◆ ast_defaultlanguage

char ast_defaultlanguage[]
extern

Definition at line 99 of file options.c.

Referenced by load_asterisk_conf().

◆ ast_mainpid

pid_t ast_mainpid
extern

Definition at line 323 of file asterisk.c.

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

◆ autofallthrough_config

int autofallthrough_config = 0
static

Definition at line 2121 of file extconf.c.

Referenced by pbx_load_config().

◆ clearglobalvars_config

int clearglobalvars_config = 0
static

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

Referenced by CB_ADD(), CB_ADD_LEN(), CB_INIT(), CB_RESET(), config_text_file_load(), config_text_file_load(), process_text_line(), 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 704 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 891 of file extconf.c.

Referenced by ast_config_internal_load(), and find_engine().

◆ config_filename

char* config_filename = "extensions.conf"
static

◆ config_maps

struct ast_config_map * config_maps = NULL
static

Referenced by find_engine().

◆ conlock

Lock for the ast_context list

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

3772{
3773 "sun",
3774 "mon",
3775 "tue",
3776 "wed",
3777 "thu",
3778 "fri",
3779 "sat",
3780 NULL,
3781};

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

Referenced by ast_config_internal_load().

◆ global_registrar

char* global_registrar = "conf2ael"
static

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

Referenced by pbx_builtin_setvar_helper(), and pbx_retrieve_variable().

◆ globalslock

ast_rwlock_t globalslock = AST_RWLOCK_INIT_VALUE
static

Definition at line 2063 of file extconf.c.

Referenced by pbx_retrieve_variable().

◆ hints

◆ lline_buffer

char* lline_buffer
static

A buffer for stuff behind the ;

Definition at line 706 of file extconf.c.

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

◆ lline_buffer_size

int lline_buffer_size
static

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

Referenced by localized_pbx_load_module(), and pbx_load_config().

◆ months

char* months[]

Definition at line 3783 of file extconf.c.

3784{
3785 "jan",
3786 "feb",
3787 "mar",
3788 "apr",
3789 "may",
3790 "jun",
3791 "jul",
3792 "aug",
3793 "sep",
3794 "oct",
3795 "nov",
3796 "dec",
3797 NULL,
3798};

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:787

Definition at line 792 of file extconf.c.

792 {
793 .sa_handler = _null_sig_handler,
794 .sa_flags = SA_RESTART,
795};

Referenced by ast_replace_sigchld().

◆ record_cache_dir

char record_cache_dir[AST_CACHE_DIR_LEN]
extern

Definition at line 97 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 783 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 784 of file extconf.c.

Referenced by ast_replace_sigchld(), and ast_unreplace_sigchld().

◆ static_config

int static_config = 0
static

Definition at line 2119 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:3115

Definition at line 2850 of file extconf.c.

2850 {
2851 .name = "text",
2852 .load_func = config_text_file_load,
2853};

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

Referenced by pbx_load_config().

◆ write_protect_config

int write_protect_config = 1
static

Definition at line 2120 of file extconf.c.

Referenced by pbx_load_config().