Asterisk - The Open Source Telephony Project  GIT-master-1f78ee9
Data Structures | Macros | Typedefs | Enumerations | Functions
pbx.h File Reference

Core PBX routines and definitions. More...

#include "asterisk/channel.h"
#include "asterisk/sched.h"
#include "asterisk/devicestate.h"
#include "asterisk/presencestate.h"
#include "asterisk/chanvars.h"
#include "asterisk/hashtab.h"
#include "asterisk/stringfields.h"
#include "asterisk/xmldoc.h"
#include "asterisk/format.h"

Go to the source code of this file.

Data Structures

struct  ast_custom_function
 Data structure associated with a custom dialplan function. More...
 
struct  ast_device_state_info
 
struct  ast_pbx
 
struct  ast_pbx_args
 Options for ast_pbx_run() More...
 
struct  ast_state_cb_info
 
struct  ast_switch
 
struct  ast_timing
 
struct  pbx_find_info
 

Macros

#define ast_custom_function_register(acf)   __ast_custom_function_register(acf, AST_MODULE_SELF)
 Register a custom function. More...
 
#define ast_custom_function_register_escalating(acf, escalation)   __ast_custom_function_register_escalating(acf, escalation, AST_MODULE_SELF)
 Register a custom function which requires escalated privileges. More...
 
#define AST_MAX_APP   32
 
#define AST_PBX_GOTO_FAILED   -3
 
#define AST_PBX_KEEP   0
 
#define AST_PBX_MAX_STACK   512
 
#define AST_PBX_REPLACE   1
 
#define PRIORITY_HINT   -1
 
#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 AST_PBX_HANGUP   -1
 Special return values from applications to the PBX. More...
 
#define AST_PBX_OK   0
 
#define AST_PBX_ERROR   1
 
#define AST_PBX_INCOMPLETE   12
 

Typedefs

typedef void(* ast_state_cb_destroy_type) (int id, void *data)
 Typedef for devicestate and hint callback removal indication callback. More...
 
typedef int(* ast_state_cb_type) (const char *context, const char *exten, struct ast_state_cb_info *info, void *data)
 Typedef for devicestate and hint callbacks. More...
 
typedef int() ast_switch_f(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
 All switch functions have the same interface, so define a type for them. More...
 

Enumerations

enum  ast_custom_function_escalation { AST_CFE_NONE, AST_CFE_READ, AST_CFE_WRITE, AST_CFE_BOTH }
 Description of the ways in which a function may escalate privileges. More...
 
enum  ast_ext_matchcid_types { AST_EXT_MATCHCID_OFF = 0, AST_EXT_MATCHCID_ON = 1, AST_EXT_MATCHCID_ANY = 2 }
 extension matchcid types More...
 
enum  ast_extension_states {
  AST_EXTENSION_REMOVED = -2, AST_EXTENSION_DEACTIVATED = -1, AST_EXTENSION_NOT_INUSE = 0, AST_EXTENSION_INUSE = 1 << 0,
  AST_EXTENSION_BUSY = 1 << 1, AST_EXTENSION_UNAVAILABLE = 1 << 2, AST_EXTENSION_RINGING = 1 << 3, AST_EXTENSION_ONHOLD = 1 << 4,
  AST_EXTENSION_REMOVED = -2, AST_EXTENSION_DEACTIVATED = -1, AST_EXTENSION_NOT_INUSE = 0, AST_EXTENSION_INUSE = 1 << 0,
  AST_EXTENSION_BUSY = 1 << 1, AST_EXTENSION_UNAVAILABLE = 1 << 2, AST_EXTENSION_RINGING = 1 << 3, AST_EXTENSION_ONHOLD = 1 << 4
}
 Extension states. More...
 
enum  ast_pbx_outgoing_sync { AST_OUTGOING_NO_WAIT = 0, AST_OUTGOING_WAIT = 1, AST_OUTGOING_WAIT_COMPLETE = 2 }
 
enum  ast_pbx_result { AST_PBX_SUCCESS = 0, AST_PBX_FAILED = -1, AST_PBX_CALL_LIMIT = -2 }
 The result codes when starting the PBX on a channel with ast_pbx_start. More...
 
enum  ast_state_cb_update_reason { AST_HINT_UPDATE_DEVICE = 1, AST_HINT_UPDATE_PRESENCE = 2 }
 
enum  ext_match_t {
  E_MATCHMORE = 0x00, E_CANMATCH = 0x01, E_MATCH = 0x02, E_MATCH_MASK = 0x03,
  E_SPAWN = 0x12, E_FINDLABEL = 0x22, E_MATCHMORE = 0x00, E_CANMATCH = 0x01,
  E_MATCH = 0x02, E_MATCH_MASK = 0x03, E_SPAWN = 0x12, E_FINDLABEL = 0x22
}
 

Functions

int __ast_custom_function_register (struct ast_custom_function *acf, struct ast_module *mod)
 Register a custom function. More...
 
int __ast_custom_function_register_escalating (struct ast_custom_function *acf, enum ast_custom_function_escalation escalation, struct ast_module *mod)
 Register a custom function which requires escalated privileges. More...
 
int ast_active_calls (void)
 Retrieve the number of active calls. More...
 
int ast_add_extension (const char *context, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
 Add and extension to an extension context. More...
 
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, const char *registrar_file, int registrar_line)
 Add an extension to an extension context, this time with an ast_context *. More...
 
int ast_add_extension2_nolock (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, const char *registrar_file, int registrar_line)
 Same as ast_add_extension2, but assumes you have already locked context. More...
 
int ast_async_goto (struct ast_channel *chan, const char *context, const char *exten, int priority)
 Set the channel to next execute the specified dialplan location. More...
 
int ast_async_goto_by_name (const char *chan, const char *context, const char *exten, int priority)
 Set the channel to next execute the specified dialplan location. More...
 
int ast_async_goto_if_exists (struct ast_channel *chan, const char *context, const char *exten, int priority)
 
int ast_async_parseable_goto (struct ast_channel *chan, const char *goto_string)
 
int ast_build_timing (struct ast_timing *i, const char *info)
 Construct a timing bitmap, for use in time-based conditionals. More...
 
int ast_canmatch_extension (struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
 Looks for a valid matching extension. More...
 
int ast_check_timing (const struct ast_timing *i)
 Evaluate a pre-constructed bitmap as to whether the current time falls within the range specified. More...
 
int ast_check_timing2 (const struct ast_timing *i, const struct timeval tv)
 Evaluate a pre-constructed bitmap as to whether a particular time falls within the range specified. More...
 
char * ast_complete_applications (const char *line, const char *word, int state)
 Command completion for the list of installed applications. More...
 
int ast_context_add_ignorepat (const char *context, const char *ignorepat, const char *registrar)
 Add an ignorepat. More...
 
int ast_context_add_ignorepat2 (struct ast_context *con, const char *ignorepat, const char *registrar)
 
int ast_context_add_include (const char *context, const char *include, const char *registrar)
 Add a context include. More...
 
int ast_context_add_include2 (struct ast_context *con, const char *include, const char *registrar)
 Add a context include. More...
 
int ast_context_add_switch (const char *context, const char *sw, const char *data, int eval, const char *registrar)
 Add a switch. More...
 
int ast_context_add_switch2 (struct ast_context *con, const char *sw, const char *data, int eval, const char *registrar)
 Adds a switch (first param is a ast_context) More...
 
void ast_context_destroy (struct ast_context *con, const char *registrar)
 Destroy a context (matches the specified context or ANY context if NULL) More...
 
int ast_context_destroy_by_name (const char *context, const char *registrar)
 Destroy a context by name. More...
 
struct ast_contextast_context_find (const char *name)
 Find a context. More...
 
struct ast_contextast_context_find_or_create (struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)
 Register a new context or find an existing one. More...
 
int ast_context_lockmacro (const char *macrocontext)
 locks the macrolock in the given context More...
 
int ast_context_remove_ignorepat (const char *context, const char *ignorepat, const char *registrar)
 
int ast_context_remove_ignorepat2 (struct ast_context *con, const char *ignorepat, const char *registrar)
 
int ast_context_remove_include (const char *context, const char *include, const char *registrar)
 Remove a context include. More...
 
int ast_context_remove_include2 (struct ast_context *con, const char *include, const char *registrar)
 Removes an include by an ast_context structure. More...
 
int ast_context_remove_switch (const char *context, const char *sw, const char *data, const char *registrar)
 Remove a switch. More...
 
int ast_context_remove_switch2 (struct ast_context *con, const char *sw, const char *data, const char *registrar)
 This function locks given context, removes switch, unlock context and return. More...
 
void ast_context_set_autohints (struct ast_context *con, int enabled)
 Enable or disable autohints support on a context. More...
 
int ast_context_unlockmacro (const char *macrocontext)
 Unlocks the macrolock in the given context. More...
 
int ast_context_verify_includes (struct ast_context *con)
 Verifies includes in an ast_contect structure. More...
 
struct ast_custom_functionast_custom_function_find (const char *name)
 
int ast_custom_function_unregister (struct ast_custom_function *acf)
 Unregister a custom function. More...
 
int ast_destroy_timing (struct ast_timing *i)
 Deallocates memory structures associated with a timing bitmap. More...
 
enum ast_extension_states ast_devstate_to_extenstate (enum ast_device_state devstate)
 Map devstate to an extension state. More...
 
int ast_exists_extension (struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
 Determine whether an extension exists. More...
 
int ast_explicit_goto (struct ast_channel *chan, const char *context, const char *exten, int priority)
 
int ast_extension_close (const char *pattern, const char *data, int needmore)
 
int ast_extension_cmp (const char *a, const char *b)
 Determine if one extension should match before another. More...
 
int ast_extension_match (const char *pattern, const char *extension)
 Determine if a given extension matches a given pattern (in NXX format) More...
 
int ast_extension_patmatch (const char *pattern, const char *data)
 
int ast_extension_state (struct ast_channel *c, const char *context, const char *exten)
 Uses hint and devicestate callback to get the state of an extension. More...
 
const char * ast_extension_state2str (int extension_state)
 Return string representation of the state of an extension. More...
 
int ast_extension_state_add (const char *context, const char *exten, ast_state_cb_type change_cb, void *data)
 Add watcher for extension states. More...
 
int ast_extension_state_add_destroy (const char *context, const char *exten, ast_state_cb_type change_cb, ast_state_cb_destroy_type destroy_cb, void *data)
 Add watcher for extension states with destructor. More...
 
int ast_extension_state_add_destroy_extended (const char *context, const char *exten, ast_state_cb_type change_cb, ast_state_cb_destroy_type destroy_cb, void *data)
 Add watcher for extended extension states with destructor. More...
 
int ast_extension_state_add_extended (const char *context, const char *exten, ast_state_cb_type change_cb, void *data)
 Add watcher for extended extension states. More...
 
int ast_extension_state_del (int id, ast_state_cb_type change_cb)
 Deletes a state change watcher by ID. More...
 
int ast_extension_state_extended (struct ast_channel *c, const char *context, const char *exten, struct ao2_container **device_state_info)
 Uses hint and devicestate callback to get the extended state of an extension. More...
 
int ast_findlabel_extension (struct ast_channel *c, const char *context, const char *exten, const char *label, const char *callerid)
 Find the priority of an extension that has the specified label. More...
 
int ast_findlabel_extension2 (struct ast_channel *c, struct ast_context *con, const char *exten, const char *label, const char *callerid)
 Find the priority of an extension that has the specified label. More...
 
int ast_func_read (struct ast_channel *chan, const char *function, char *workspace, size_t len)
 executes a read operation on a function More...
 
int ast_func_read2 (struct ast_channel *chan, const char *function, struct ast_str **str, ssize_t maxlen)
 executes a read operation on a function More...
 
int ast_func_write (struct ast_channel *chan, const char *function, const char *value)
 executes a write operation on a function More...
 
const char * ast_get_extension_registrar_file (struct ast_exten *e)
 Get name of configuration file used by registrar to register this extension. More...
 
int ast_get_extension_registrar_line (struct ast_exten *e)
 Get line number of configuration file used by registrar to register this extension. More...
 
int ast_get_hint (char *hint, int hintsize, char *name, int namesize, struct ast_channel *c, const char *context, const char *exten)
 If an extension hint exists, return non-zero. More...
 
int ast_goto_if_exists (struct ast_channel *chan, const char *context, const char *exten, int priority)
 
int ast_hint_presence_state (struct ast_channel *c, const char *context, const char *exten, char **subtype, char **message)
 Uses hint and presence state callback to get the presence state of an extension. More...
 
int ast_ignore_pattern (const char *context, const char *pattern)
 Checks to see if a number should be ignored. More...
 
int ast_matchmore_extension (struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
 Looks to see if adding anything to this extension might match something. (exists ^ canmatch) More...
 
void ast_merge_contexts_and_delete (struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *registrar)
 Merge the temporary contexts into a global contexts list and delete from the global list the ones that are being added. More...
 
int ast_parseable_goto (struct ast_channel *chan, const char *goto_string)
 
void ast_pbx_h_exten_run (struct ast_channel *chan, const char *context)
 Run the h exten from the given context. More...
 
void ast_pbx_hangup_handler_destroy (struct ast_channel *chan)
 Destroy the hangup handler container on a channel. More...
 
void ast_pbx_hangup_handler_init (struct ast_channel *chan)
 Init the hangup handler container on a channel. More...
 
int ast_pbx_hangup_handler_pop (struct ast_channel *chan)
 Pop the top of the channel hangup handler stack. More...
 
void ast_pbx_hangup_handler_push (struct ast_channel *chan, const char *handler)
 Push the given hangup handler onto the channel hangup handler stack. More...
 
int ast_pbx_hangup_handler_run (struct ast_channel *chan)
 Run all hangup handlers on the channel. More...
 
int ast_pbx_outgoing_app (const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *app, const char *appdata, int *reason, int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel, const struct ast_assigned_ids *assignedids)
 Synchronously or asynchronously make an outbound call and execute an application on the channel. More...
 
int ast_pbx_outgoing_app_predial (const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *app, const char *appdata, int *reason, int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel, const struct ast_assigned_ids *assignedids, const char *predial_callee)
 
int ast_pbx_outgoing_exten (const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *context, const char *exten, int priority, int *reason, int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel, int early_media, const struct ast_assigned_ids *assignedids)
 Synchronously or asynchronously make an outbound call and send it to a particular extension. More...
 
int ast_pbx_outgoing_exten_predial (const char *type, struct ast_format_cap *cap, const char *addr, int timeout, const char *context, const char *exten, int priority, int *reason, int synchronous, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel, int early_media, const struct ast_assigned_ids *assignedids, const char *predial_callee)
 
enum ast_pbx_result ast_pbx_run (struct ast_channel *c)
 Execute the PBX in the current thread. More...
 
enum ast_pbx_result ast_pbx_run_args (struct ast_channel *c, struct ast_pbx_args *args)
 Execute the PBX in the current thread. More...
 
enum ast_pbx_result ast_pbx_start (struct ast_channel *c)
 Create a new thread and start the PBX. More...
 
int ast_processed_calls (void)
 Retrieve the total number of calls processed through the PBX since last restart. More...
 
int ast_rdlock_context (struct ast_context *con)
 Read locks a given context. More...
 
int ast_rdlock_contexts (void)
 Read locks the context list. More...
 
int ast_register_switch (struct ast_switch *sw)
 Register an alternative dialplan switch. More...
 
int ast_spawn_extension (struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid, int *found, int combined_find_spawn)
 Launch a new extension (i.e. new stack) More...
 
int ast_str_get_hint (struct ast_str **hint, ssize_t hintsize, struct ast_str **name, ssize_t namesize, struct ast_channel *c, const char *context, const char *exten)
 If an extension hint exists, return non-zero. More...
 
int ast_thread_inhibit_escalations (void)
 Inhibit (in the current thread) the execution of dialplan functions which cause privilege escalations. If pbx_live_dangerously() has been called, this function has no effect. More...
 
int ast_thread_inhibit_escalations_swap (int inhibit)
 Swap the current thread escalation inhibit setting. More...
 
int ast_unlock_context (struct ast_context *con)
 
int ast_unlock_contexts (void)
 Unlocks contexts. More...
 
void ast_unregister_switch (struct ast_switch *sw)
 Unregister an alternative switch. More...
 
int ast_wrlock_context (struct ast_context *con)
 Write locks a given context. More...
 
int ast_wrlock_contexts (void)
 Write locks the context list. More...
 
void pbx_builtin_clear_globals (void)
 
const char * pbx_builtin_getvar_helper (struct ast_channel *chan, const char *name)
 Return a pointer to the value of the corresponding channel variable. More...
 
void pbx_builtin_pushvar_helper (struct ast_channel *chan, const char *name, const char *value)
 Add a variable to the channel variable stack, without removing any previously set value. More...
 
int pbx_builtin_raise_exception (struct ast_channel *chan, const char *data)
 
int pbx_builtin_serialize_variables (struct ast_channel *chan, struct ast_str **buf)
 Create a human-readable string, specifying all variables and their corresponding values. More...
 
int pbx_builtin_setvar (struct ast_channel *chan, const char *data)
 Parse and set a single channel variable, where the name and value are separated with an '=' character. More...
 
int pbx_builtin_setvar_helper (struct ast_channel *chan, const char *name, const char *value)
 Add a variable to the channel variable stack, removing the most recently set value for the same name. More...
 
int pbx_builtin_setvar_multiple (struct ast_channel *chan, const char *data)
 Parse and set multiple channel variables, where the pairs are separated by the ',' character, and name and value are separated with an '=' character. More...
 
int pbx_checkcondition (const char *condition)
 Evaluate a condition. More...
 
int pbx_exec (struct ast_channel *c, struct ast_app *app, const char *data)
 Execute an application. More...
 
struct ast_extenpbx_find_extension (struct ast_channel *chan, struct ast_context *bypass, struct pbx_find_info *q, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
 
struct ast_apppbx_findapp (const char *app)
 Look up an application. More...
 
void pbx_live_dangerously (int new_live_dangerously)
 Enable/disable the execution of 'dangerous' functions from external protocols (AMI, etc.). More...
 
void pbx_retrieve_variable (struct ast_channel *c, const char *var, char **ret, char *workspace, int workspacelen, struct varshead *headp)
 Retrieve the value of a builtin variable or variable from the channel variable stack. More...
 
int pbx_set_autofallthrough (int newval)
 
int pbx_set_extenpatternmatchnew (int newval)
 
void pbx_set_overrideswitch (const char *newval)
 
int ast_context_remove_extension (const char *context, const char *extension, int priority, const char *registrar)
 Simply remove extension from context. More...
 
int ast_context_remove_extension2 (struct ast_context *con, const char *extension, int priority, const char *registrar, int already_locked)
 This functionc locks given context, search for the right extension and fires out all peer in this extensions with given priority. If priority is set to 0, all peers are removed. After that, unlock context and return. More...
 
int ast_context_remove_extension_callerid (const char *context, const char *extension, int priority, const char *callerid, int matchcid, const char *registrar)
 
int ast_context_remove_extension_callerid2 (struct ast_context *con, const char *extension, int priority, const char *callerid, int matchcid, const char *registrar, int already_locked)
 

Functions for returning values from structures

const char * ast_get_context_name (struct ast_context *con)
 
const char * ast_get_extension_name (struct ast_exten *exten)
 
struct ast_contextast_get_extension_context (struct ast_exten *exten)
 
const char * ast_get_include_name (const struct ast_include *include)
 
const char * ast_get_ignorepat_name (const struct ast_ignorepat *ip)
 
const char * ast_get_switch_name (const struct ast_sw *sw)
 
const char * ast_get_switch_data (const struct ast_sw *sw)
 
int ast_get_switch_eval (const struct ast_sw *sw)
 
Other Extension stuff
int ast_get_extension_priority (struct ast_exten *exten)
 
int ast_get_extension_matchcid (struct ast_exten *e)
 
const char * ast_get_extension_cidmatch (struct ast_exten *e)
 
const char * ast_get_extension_app (struct ast_exten *e)
 
const char * ast_get_extension_label (struct ast_exten *e)
 
void * ast_get_extension_app_data (struct ast_exten *e)
 
Registrar info functions ...
const char * ast_get_context_registrar (struct ast_context *c)
 
const char * ast_get_extension_registrar (struct ast_exten *e)
 
const char * ast_get_include_registrar (const struct ast_include *i)
 
const char * ast_get_ignorepat_registrar (const struct ast_ignorepat *ip)
 
const char * ast_get_switch_registrar (const struct ast_sw *sw)
 
Walking functions ...
struct ast_contextast_walk_contexts (struct ast_context *con)
 
struct ast_extenast_walk_context_extensions (struct ast_context *con, struct ast_exten *priority)
 
struct ast_extenast_walk_extension_priorities (struct ast_exten *exten, struct ast_exten *priority)
 
const struct ast_includeast_walk_context_includes (const struct ast_context *con, const struct ast_include *inc)
 
const struct ast_ignorepatast_walk_context_ignorepats (const struct ast_context *con, const struct ast_ignorepat *ip)
 
const struct ast_swast_walk_context_switches (const struct ast_context *con, const struct ast_sw *sw)
 
Iterator functions ...
int ast_context_includes_count (const struct ast_context *con)
 
const struct ast_includeast_context_includes_get (const struct ast_context *con, int idx)
 
int ast_context_ignorepats_count (const struct ast_context *con)
 
const struct ast_ignorepatast_context_ignorepats_get (const struct ast_context *con, int idx)
 
int ast_context_switches_count (const struct ast_context *con)
 
const struct ast_swast_context_switches_get (const struct ast_context *con, int idx)
 
Substitution routines, using static string buffers
void pbx_substitute_variables_helper (struct ast_channel *c, const char *cp1, char *cp2, int count)
 
void pbx_substitute_variables_varshead (struct varshead *headp, const char *cp1, char *cp2, int count)
 
void pbx_substitute_variables_helper_full (struct ast_channel *c, struct varshead *headp, const char *cp1, char *cp2, int cp2_size, size_t *used)
 
Substitution routines, using dynamic string buffers
const char * ast_str_retrieve_variable (struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, struct varshead *headp, const char *var)
 
void ast_str_substitute_variables (struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
 
void ast_str_substitute_variables_varshead (struct ast_str **buf, ssize_t maxlen, struct varshead *headp, const char *templ)
 
void ast_str_substitute_variables_full (struct ast_str **buf, ssize_t maxlen, struct ast_channel *c, struct varshead *headp, const char *templ, size_t *used)
 
int ast_hashtab_compare_contexts (const void *ah_a, const void *ah_b)
 hashtable functions for contexts More...
 
unsigned int ast_hashtab_hash_contexts (const void *obj)
 

Detailed Description

Core PBX routines and definitions.

Definition in file pbx.h.

Macro Definition Documentation

◆ ast_custom_function_register

#define ast_custom_function_register (   acf)    __ast_custom_function_register(acf, AST_MODULE_SELF)

Register a custom function.

Definition at line 1504 of file pbx.h.

Referenced by load_module(), load_parking_bridge_features(), and reload().

◆ ast_custom_function_register_escalating

#define ast_custom_function_register_escalating (   acf,
  escalation 
)    __ast_custom_function_register_escalating(acf, escalation, AST_MODULE_SELF)

Register a custom function which requires escalated privileges.

Examples would be SHELL() (for which a read needs permission to execute arbitrary code) or FILE() (for which write needs permission to change files on the filesystem).

Definition at line 1513 of file pbx.h.

Referenced by load_module().

◆ AST_MAX_APP

#define AST_MAX_APP   32

Max length of an application

Definition at line 40 of file pbx.h.

Referenced by handle_show_function(), sla_build_station(), and sla_station_destructor().

◆ AST_PBX_ERROR

#define AST_PBX_ERROR   1

Jump to the 'e' exten

Definition at line 50 of file pbx.h.

Referenced by __ast_pbx_run().

◆ AST_PBX_GOTO_FAILED

#define AST_PBX_GOTO_FAILED   -3

Definition at line 42 of file pbx.h.

Referenced by __ast_goto_if_exists().

◆ AST_PBX_HANGUP

#define AST_PBX_HANGUP   -1

Special return values from applications to the PBX.

Jump to the 'h' exten

Definition at line 48 of file pbx.h.

◆ AST_PBX_INCOMPLETE

#define AST_PBX_INCOMPLETE   12

Return to PBX matching, allowing more digits for the extension

Definition at line 51 of file pbx.h.

Referenced by __ast_pbx_run(), dial_exec_full(), pbx_builtin_incomplete(), and retrydial_exec().

◆ AST_PBX_KEEP

#define AST_PBX_KEEP   0

Definition at line 43 of file pbx.h.

◆ AST_PBX_MAX_STACK

#define AST_PBX_MAX_STACK   512

Definition at line 1609 of file pbx.h.

◆ AST_PBX_OK

#define AST_PBX_OK   0

No errors

Definition at line 49 of file pbx.h.

◆ AST_PBX_REPLACE

#define AST_PBX_REPLACE   1

Definition at line 44 of file pbx.h.

◆ PRIORITY_HINT

#define PRIORITY_HINT   -1

◆ STATUS_NO_CONTEXT

#define STATUS_NO_CONTEXT   1

Definition at line 1600 of file pbx.h.

◆ STATUS_NO_EXTENSION

#define STATUS_NO_EXTENSION   2

Definition at line 1601 of file pbx.h.

◆ STATUS_NO_LABEL

#define STATUS_NO_LABEL   4

Definition at line 1603 of file pbx.h.

◆ STATUS_NO_PRIORITY

#define STATUS_NO_PRIORITY   3

Definition at line 1602 of file pbx.h.

◆ STATUS_SUCCESS

#define STATUS_SUCCESS   5

Definition at line 1604 of file pbx.h.

Typedef Documentation

◆ ast_state_cb_destroy_type

typedef void(* ast_state_cb_destroy_type) (int id, void *data)

Typedef for devicestate and hint callback removal indication callback.

Definition at line 115 of file pbx.h.

◆ ast_state_cb_type

typedef int(* ast_state_cb_type) (const char *context, const char *exten, struct ast_state_cb_info *info, void *data)

Typedef for devicestate and hint callbacks.

Definition at line 112 of file pbx.h.

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

All switch functions have the same interface, so define a type for them.

Data structure associated with an Asterisk switch

Definition at line 156 of file pbx.h.

Enumeration Type Documentation

◆ ast_custom_function_escalation

Description of the ways in which a function may escalate privileges.

Enumerator
AST_CFE_NONE 
AST_CFE_READ 
AST_CFE_WRITE 
AST_CFE_BOTH 

Definition at line 1494 of file pbx.h.

1494  {
1495  AST_CFE_NONE,
1496  AST_CFE_READ,
1497  AST_CFE_WRITE,
1498  AST_CFE_BOTH,
1499 };

◆ ast_ext_matchcid_types

extension matchcid types

Note
matchcid in ast_exten retains 0/1, this adds 3rd state for functions to specify all
See also
ast_context_remove_extension_callerid
Enumerator
AST_EXT_MATCHCID_OFF 

Match only extensions with matchcid=0

AST_EXT_MATCHCID_ON 

Match only extensions with matchcid=1 AND cidmatch matches

AST_EXT_MATCHCID_ANY 

Match both - used only in functions manipulating ast_exten's

Definition at line 77 of file pbx.h.

77  {
78  AST_EXT_MATCHCID_OFF = 0, /*!< Match only extensions with matchcid=0 */
79  AST_EXT_MATCHCID_ON = 1, /*!< Match only extensions with matchcid=1 AND cidmatch matches */
80  AST_EXT_MATCHCID_ANY = 2, /*!< Match both - used only in functions manipulating ast_exten's */
81 };

◆ ast_extension_states

Extension states.

Note
States can be combined Extension and device states in Asterisk
Enumerator
AST_EXTENSION_REMOVED 

Extension removed

AST_EXTENSION_DEACTIVATED 

Extension hint removed

AST_EXTENSION_NOT_INUSE 

No device INUSE or BUSY

AST_EXTENSION_INUSE 

One or more devices INUSE

AST_EXTENSION_BUSY 

All devices BUSY

AST_EXTENSION_UNAVAILABLE 

All devices UNAVAILABLE/UNREGISTERED

AST_EXTENSION_RINGING 

All devices RINGING

AST_EXTENSION_ONHOLD 

All devices ONHOLD

AST_EXTENSION_REMOVED 

Extension removed

AST_EXTENSION_DEACTIVATED 

Extension hint removed

AST_EXTENSION_NOT_INUSE 

No device INUSE or BUSY

AST_EXTENSION_INUSE 

One or more devices INUSE

AST_EXTENSION_BUSY 

All devices BUSY

AST_EXTENSION_UNAVAILABLE 

All devices UNAVAILABLE/UNREGISTERED

AST_EXTENSION_RINGING 

All devices RINGING

AST_EXTENSION_ONHOLD 

All devices ONHOLD

Definition at line 61 of file pbx.h.

61  {
62  AST_EXTENSION_REMOVED = -2, /*!< Extension removed */
63  AST_EXTENSION_DEACTIVATED = -1, /*!< Extension hint removed */
64  AST_EXTENSION_NOT_INUSE = 0, /*!< No device INUSE or BUSY */
65  AST_EXTENSION_INUSE = 1 << 0, /*!< One or more devices INUSE */
66  AST_EXTENSION_BUSY = 1 << 1, /*!< All devices BUSY */
67  AST_EXTENSION_UNAVAILABLE = 1 << 2, /*!< All devices UNAVAILABLE/UNREGISTERED */
68  AST_EXTENSION_RINGING = 1 << 3, /*!< All devices RINGING */
69  AST_EXTENSION_ONHOLD = 1 << 4, /*!< All devices ONHOLD */
70 };

◆ ast_pbx_outgoing_sync

Enumerator
AST_OUTGOING_NO_WAIT 

Don't wait for originated call to answer

AST_OUTGOING_WAIT 

Wait for originated call to answer

AST_OUTGOING_WAIT_COMPLETE 

Wait for originated call to answer and hangup

Definition at line 1147 of file pbx.h.

1147  {
1148  AST_OUTGOING_NO_WAIT = 0, /*!< Don't wait for originated call to answer */
1149  AST_OUTGOING_WAIT = 1, /*!< Wait for originated call to answer */
1150  AST_OUTGOING_WAIT_COMPLETE = 2, /*!< Wait for originated call to answer and hangup */
1151 };

◆ ast_pbx_result

The result codes when starting the PBX on a channel with ast_pbx_start.

Note
AST_PBX_CALL_LIMIT refers to the maxcalls call limit in asterisk.conf
See also
ast_pbx_start
Enumerator
AST_PBX_SUCCESS 
AST_PBX_FAILED 
AST_PBX_CALL_LIMIT 

Definition at line 354 of file pbx.h.

354  {
355  AST_PBX_SUCCESS = 0,
356  AST_PBX_FAILED = -1,
357  AST_PBX_CALL_LIMIT = -2,
358 };

◆ ast_state_cb_update_reason

Enumerator
AST_HINT_UPDATE_DEVICE 

The extension state update is a result of a device state changing on the extension.

AST_HINT_UPDATE_PRESENCE 

The extension state update is a result of presence state changing on the extension.

Definition at line 89 of file pbx.h.

89  {
90  /*! The extension state update is a result of a device state changing on the extension. */
92  /*! The extension state update is a result of presence state changing on the extension. */
94 };

◆ ext_match_t

When looking up extensions, we can have different requests identified by the 'action' argument, as follows.

Note
that the coding is such that the low 4 bits are the third argument to extension_match_core.
Enumerator
E_MATCHMORE 
E_CANMATCH 
E_MATCH 
E_MATCH_MASK 
E_SPAWN 
E_FINDLABEL 
E_MATCHMORE 
E_CANMATCH 
E_MATCH 
E_MATCH_MASK 
E_SPAWN 
E_FINDLABEL 

Definition at line 1591 of file pbx.h.

1591  {
1592  E_MATCHMORE = 0x00, /* extension can match but only with more 'digits' */
1593  E_CANMATCH = 0x01, /* extension can match with or without more 'digits' */
1594  E_MATCH = 0x02, /* extension is an exact match */
1595  E_MATCH_MASK = 0x03, /* mask for the argument to extension_match_core() */
1596  E_SPAWN = 0x12, /* want to spawn an extension. Requires exact match */
1597  E_FINDLABEL = 0x22 /* returns the priority for a given label. Requires exact match */
1598 };
Definition: pbx.h:1596
Definition: pbx.h:1594

Function Documentation

◆ __ast_custom_function_register()

int __ast_custom_function_register ( struct ast_custom_function acf,
struct ast_module mod 
)

Register a custom function.

Definition at line 373 of file pbx_functions.c.

References acf_retrieve_docs(), ast_custom_function_find_nolock(), ast_log, AST_RWLIST_INSERT_BEFORE_CURRENT, AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, AST_STATIC_DOC, ast_verb, COLOR_BRCYAN, COLORIZE, COLORIZE_FMT, ast_custom_function::docsrc, LOG_ERROR, ast_custom_function::mod, and ast_custom_function::name.

Referenced by __ast_custom_function_register_escalating(), __init_manager(), ast_msg_init(), load_features_config(), and load_pbx().

374 {
375  struct ast_custom_function *cur;
376 
377  if (!acf) {
378  return -1;
379  }
380 
381  acf->mod = mod;
382 #ifdef AST_XML_DOCS
383  acf->docsrc = AST_STATIC_DOC;
384 #endif
385 
386  if (acf_retrieve_docs(acf)) {
387  return -1;
388  }
389 
391 
393  if (cur) {
394  ast_log(LOG_ERROR, "Function %s already registered.\n", acf->name);
396  return -1;
397  }
398 
399  /* Store in alphabetical order */
400  AST_RWLIST_TRAVERSE_SAFE_BEGIN(&acf_root, cur, acflist) {
401  if (strcmp(acf->name, cur->name) < 0) {
402  AST_RWLIST_INSERT_BEFORE_CURRENT(acf, acflist);
403  break;
404  }
405  }
407  if (!cur) {
408  AST_RWLIST_INSERT_TAIL(&acf_root, acf, acflist);
409  }
410 
412 
413  ast_verb(2, "Registered custom function '" COLORIZE_FMT "'\n", COLORIZE(COLOR_BRCYAN, 0, acf->name));
414 
415  return 0;
416 }
const char * name
Definition: pbx.h:119
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
enum ast_doc_src docsrc
Definition: pbx.h:127
static struct ast_custom_function * ast_custom_function_find_nolock(const char *name)
struct ast_module * mod
Definition: pbx.h:142
#define ast_verb(level,...)
Definition: logger.h:455
#define COLOR_BRCYAN
Definition: term.h:60
#define COLORIZE(fg, bg, str)
Definition: term.h:68
#define ast_log
Definition: astobj2.c:42
Data structure associated with a custom dialplan function.
Definition: pbx.h:118
#define COLORIZE_FMT
Shortcut macros for coloring a set of text.
Definition: term.h:67
Registered functions container.
Definition: pbx_functions.c:59
#define AST_RWLIST_INSERT_BEFORE_CURRENT
Definition: linkedlists.h:609
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:544
static int acf_retrieve_docs(struct ast_custom_function *acf)
#define LOG_ERROR
Definition: logger.h:285
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:740
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:616

◆ __ast_custom_function_register_escalating()

int __ast_custom_function_register_escalating ( struct ast_custom_function acf,
enum ast_custom_function_escalation  escalation,
struct ast_module mod 
)

Register a custom function which requires escalated privileges.

Examples would be SHELL() (for which a read needs permission to execute arbitrary code) or FILE() (for which write needs permission to change files on the filesystem).

Definition at line 418 of file pbx_functions.c.

References __ast_custom_function_register(), AST_CFE_BOTH, AST_CFE_NONE, AST_CFE_READ, AST_CFE_WRITE, ast_custom_function::read_escalates, and ast_custom_function::write_escalates.

419 {
420  int res;
421 
422  res = __ast_custom_function_register(acf, mod);
423  if (res != 0) {
424  return -1;
425  }
426 
427  switch (escalation) {
428  case AST_CFE_NONE:
429  break;
430  case AST_CFE_READ:
431  acf->read_escalates = 1;
432  break;
433  case AST_CFE_WRITE:
434  acf->write_escalates = 1;
435  break;
436  case AST_CFE_BOTH:
437  acf->read_escalates = 1;
438  acf->write_escalates = 1;
439  break;
440  }
441 
442  return 0;
443 }
int __ast_custom_function_register(struct ast_custom_function *acf, struct ast_module *mod)
Register a custom function.
unsigned int write_escalates
Definition: pbx.h:147
unsigned int read_escalates
Definition: pbx.h:143

◆ ast_active_calls()

int ast_active_calls ( void  )

Retrieve the number of active calls.

Definition at line 4755 of file pbx.c.

References countcalls.

Referenced by ast_var_Config(), get_current_call_count(), handle_chanlist(), handle_showcalls(), and sysinfo_helper().

4756 {
4757  return countcalls;
4758 }
static int countcalls
Definition: pbx.c:773

◆ ast_add_extension()

int ast_add_extension ( const char *  context,
int  replace,
const char *  extension,
int  priority,
const char *  label,
const char *  callerid,
const char *  application,
void *  data,
void(*)(void *)  datad,
const char *  registrar 
)

Add and extension to an extension context.

Parameters
contextcontext to add the extension to
replace
extensionextension to add
prioritypriority level of extension addition
labelextension label
calleridpattern to match CallerID, or NULL to match any CallerID
applicationapplication to run on the extension with that priority level
datadata to pass to the application
datad
registrarwho registered the extension
Return values
0success
-1failure

Definition at line 6961 of file pbx.c.

References ast_add_extension2(), ast_unlock_contexts(), c, ast_exten::datad, find_context_locked(), and NULL.

Referenced by add_to_regcontext(), app_create(), ast_hint_presence_state(), ast_sip_persistent_endpoint_update_state(), AST_TEST_DEFINE(), create_test_dialplan(), device_state_cb(), extension_state_add_destroy(), handle_cli_dialplan_add_extension(), internal_extension_state_extended(), join_conference_bridge(), load_module(), register_exten(), register_extension(), register_peer_exten(), sla_build_station(), and sla_build_trunk().

6964 {
6965  int ret = -1;
6966  struct ast_context *c;
6967 
6969  if (c) {
6970  ret = ast_add_extension2(c, replace, extension, priority, label, callerid,
6971  application, data, datad, registrar, NULL, 0);
6973  }
6974 
6975  return ret;
6976 }
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, const char *registrar_file, int registrar_line)
Main interface to add extensions to the list for out context.
Definition: pbx.c:7290
static struct test_val c
#define NULL
Definition: resample.c:96
static int priority
structure to hold extensions
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:790
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_add_extension2()

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,
const char *  registrar_file,
int  registrar_line 
)

Add an extension to an extension context, this time with an ast_context *.

Parameters
registrar_fileoptional configuration file that defines this extension
registrar_lineoptional line number of configuration file that defines extension
Note
For details about the other arguments, check ast_add_extension()

Add an extension to an extension context, this time with an ast_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 7290 of file pbx.c.

References ast_add_extension2_lockopt(), ast_exten::datad, and localized_add_extension2().

Referenced by add_extensions(), ast_add_extension(), context_merge(), lua_register_hints(), manager_dialplan_extension_add(), pbx_load_config(), and pbx_load_users().

7294 {
7295  return ast_add_extension2_lockopt(con, replace, extension, priority, label, callerid,
7296  application, data, datad, registrar, registrar_file, registrar_line, 1);
7297 }
static int ast_add_extension2_lockopt(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, const char *registrar_file, int registrar_line, int lock_context)
Same as ast_add_extension2() but controls the context locking.
Definition: pbx.c:7316
static int priority
structure to hold extensions
static char * registrar
Definition: pbx_ael.c:78
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:790

◆ ast_add_extension2_nolock()

int ast_add_extension2_nolock ( 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,
const char *  registrar_file,
int  registrar_line 
)

Same as ast_add_extension2, but assumes you have already locked context.

Since
12.0.0
Note
con must be write locked prior to calling. For details about the arguments, check ast_add_extension2()

Definition at line 7299 of file pbx.c.

References ast_add_extension2_lockopt(), and ast_exten::datad.

Referenced by add_extension(), parking_add_extension(), and parking_duration_callback().

7303 {
7304  return ast_add_extension2_lockopt(con, replace, extension, priority, label, callerid,
7305  application, data, datad, registrar, registrar_file, registrar_line, 0);
7306 }
static int ast_add_extension2_lockopt(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, const char *registrar_file, int registrar_line, int lock_context)
Same as ast_add_extension2() but controls the context locking.
Definition: pbx.c:7316
static int priority
structure to hold extensions
static char * registrar
Definition: pbx_ael.c:78
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:790

◆ ast_async_goto()

int ast_async_goto ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority 
)

Set the channel to next execute the specified dialplan location.

See also
ast_async_parseable_goto, ast_async_goto_if_exists
Note
Do NOT hold any channel locks when calling this function.

Definition at line 7002 of file pbx.c.

References ast_channel_flags(), ast_channel_is_bridged(), ast_channel_lock, ast_channel_name(), ast_channel_pbx(), ast_channel_unlock, ast_channel_yank(), ast_explicit_goto(), AST_FLAG_IN_AUTOLOOP, ast_hangup(), ast_log, ast_pbx_start(), AST_SOFTHANGUP_ASYNCGOTO, ast_softhangup_nolock(), ast_test_flag, and LOG_WARNING.

Referenced by __ast_goto_if_exists(), action_redirect(), ast_async_goto_by_name(), bridge_channel_blind_transfer(), chan_pjsip_cng_tone_detected(), comeback_goto(), dahdi_handle_dtmf(), fax_detect_framehook(), handle_request_bye(), my_handle_dtmf(), onModeChanged(), ooh323_rtp_read(), pbx_parseable_goto(), process_ast_dsp(), process_sdp(), and sip_read().

7003 {
7004  struct ast_channel *newchan;
7005 
7006  ast_channel_lock(chan);
7007  /* Channels in a bridge or running a PBX can be sent directly to the specified destination */
7008  if (ast_channel_is_bridged(chan) || ast_channel_pbx(chan)) {
7010  priority += 1;
7011  }
7014  ast_channel_unlock(chan);
7015  return 0;
7016  }
7017  ast_channel_unlock(chan);
7018 
7019  /* Otherwise, we need to gain control of the channel first */
7020  newchan = ast_channel_yank(chan);
7021  if (!newchan) {
7022  ast_log(LOG_WARNING, "Unable to gain control of channel %s\n", ast_channel_name(chan));
7023  return -1;
7024  }
7026  if (ast_pbx_start(newchan)) {
7027  ast_hangup(newchan);
7028  ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(newchan));
7029  return -1;
7030  }
7031 
7032  return 0;
7033 }
#define ast_channel_lock(chan)
Definition: channel.h:2837
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
Main Channel structure associated with a channel.
#define ast_test_flag(p, flag)
Definition: utils.h:63
int ast_explicit_goto(struct ast_channel *chan, const char *context, const char *exten, int priority)
Definition: pbx.c:6978
#define LOG_WARNING
Definition: logger.h:274
struct ast_channel * ast_channel_yank(struct ast_channel *yankee)
Gain control of a channel in the system.
Definition: channel.c:10627
static int priority
#define ast_log
Definition: astobj2.c:42
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
Create a new thread and start the PBX.
Definition: pbx.c:4703
int ast_softhangup_nolock(struct ast_channel *chan, int reason)
Softly hangup up a channel (no channel lock)
Definition: channel.c:2438
int ast_channel_is_bridged(const struct ast_channel *chan)
Determine if a channel is in a bridge.
Definition: channel.c:10579
#define ast_channel_unlock(chan)
Definition: channel.h:2838
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2523
const char * ast_channel_name(const struct ast_channel *chan)
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

◆ ast_async_goto_by_name()

int ast_async_goto_by_name ( const char *  chan,
const char *  context,
const char *  exten,
int  priority 
)

Set the channel to next execute the specified dialplan location.

Definition at line 7035 of file pbx.c.

References ast_async_goto(), ast_channel_get_by_name(), and ast_channel_unref.

7036 {
7037  struct ast_channel *chan;
7038  int res = -1;
7039 
7040  if ((chan = ast_channel_get_by_name(channame))) {
7041  res = ast_async_goto(chan, context, exten, priority);
7042  chan = ast_channel_unref(chan);
7043  }
7044 
7045  return res;
7046 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
Main Channel structure associated with a channel.
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2873
static int priority
int ast_async_goto(struct ast_channel *chan, const char *context, const char *exten, int priority)
Set the channel to next execute the specified dialplan location.
Definition: pbx.c:7002
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
struct ast_channel * ast_channel_get_by_name(const char *name)
Find a channel by name.
Definition: channel.c:1439

◆ ast_async_goto_if_exists()

int ast_async_goto_if_exists ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority 
)
Note
This function will handle locking the channel as needed.

Definition at line 8779 of file pbx.c.

References __ast_goto_if_exists().

8780 {
8781  return __ast_goto_if_exists(chan, context, exten, priority, 1);
8782 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int __ast_goto_if_exists(struct ast_channel *chan, const char *context, const char *exten, int priority, int async)
Definition: pbx.c:8753
static int priority
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_async_parseable_goto()

int ast_async_parseable_goto ( struct ast_channel chan,
const char *  goto_string 
)
Note
This function will handle locking the channel as needed.

Definition at line 8845 of file pbx.c.

References pbx_parseable_goto().

Referenced by asyncgoto_exec(), handle_redirect(), and parking_duration_callback().

8846 {
8847  return pbx_parseable_goto(chan, goto_string, 1);
8848 }
static int pbx_parseable_goto(struct ast_channel *chan, const char *goto_string, int async)
Definition: pbx.c:8784

◆ ast_build_timing()

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

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

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

/brief Build timing

/param i info /param info_in

Definition at line 3808 of file extconf.c.

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

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

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

◆ ast_canmatch_extension()

int ast_canmatch_extension ( struct ast_channel c,
const char *  context,
const char *  exten,
int  priority,
const char *  callerid 
)

Looks for a valid matching extension.

Parameters
cnot really important
contextcontext to serach within
extenextension to check
prioritypriority of extension path
calleridcallerid of extension being searched for
Note
It is possible for autoservice to be started and stopped on c during this function call, it is important that c is not locked prior to calling this. Otherwise a deadlock may occur
Returns
If "exten" could be a valid extension in this context with or without some more digits, return non-zero. Basically, when this returns 0, no matter what you add to exten, it's not going to be a valid extension anymore

Definition at line 4185 of file pbx.c.

References E_CANMATCH, NULL, and pbx_extension_helper().

Referenced by __analog_ss_thread(), analog_ss_thread(), background_detect_exec(), cb_events(), do_immediate_setup(), dp_lookup(), dundi_lookup_local(), get_also_info(), get_destination(), leave_voicemail(), loopback_canmatch(), mgcp_ss(), pbx_builtin_background(), phone_check_exception(), test_exten(), and valid_exit().

4186 {
4187  return pbx_extension_helper(c, NULL, context, exten, priority, NULL, callerid, E_CANMATCH, 0, 0);
4188 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define NULL
Definition: resample.c:96
static int priority
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
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, int *found, int combined_find_spawn)
The return value depends on the action:
Definition: pbx.c:2875

◆ ast_check_timing()

int ast_check_timing ( const struct ast_timing i)

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

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

Definition at line 4002 of file extconf.c.

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

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

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

◆ ast_check_timing2()

int ast_check_timing2 ( const struct ast_timing i,
const struct timeval  tv 
)

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

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

Definition at line 251 of file pbx_timing.c.

References ast_localtime(), ast_log, ast_timing::daymask, ast_timing::dowmask, LOG_WARNING, ast_timing::minmask, ast_timing::monthmask, ast_timing::timezone, ast_tm::tm_hour, ast_tm::tm_mday, ast_tm::tm_min, ast_tm::tm_mon, and ast_tm::tm_wday.

Referenced by ast_check_timing(), and pbx_builtin_gotoiftime().

252 {
253  struct ast_tm tm;
254 
255  ast_localtime(&tv, &tm, i->timezone);
256 
257  /* If it's not the right month, return */
258  if (!(i->monthmask & (1 << tm.tm_mon)))
259  return 0;
260 
261  /* If it's not that time of the month.... */
262  /* Warning, tm_mday has range 1..31! */
263  if (!(i->daymask & (1 << (tm.tm_mday-1))))
264  return 0;
265 
266  /* If it's not the right day of the week */
267  if (!(i->dowmask & (1 << tm.tm_wday)))
268  return 0;
269 
270  /* Sanity check the hour just to be safe */
271  if ((tm.tm_hour < 0) || (tm.tm_hour > 23)) {
272  ast_log(LOG_WARNING, "Insane time...\n");
273  return 0;
274  }
275 
276  /* Now the tough part, we calculate if it fits
277  in the right time based on min/hour */
278  if (!(i->minmask[tm.tm_hour * 2 + (tm.tm_min >= 30 ? 1 : 0)] & (1 << (tm.tm_min >= 30 ? tm.tm_min - 30 : tm.tm_min))))
279  return 0;
280 
281  /* If we got this far, then we're good */
282  return 1;
283 }
unsigned int daymask
Definition: pbx.h:174
#define LOG_WARNING
Definition: logger.h:274
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
unsigned int minmask[48]
Definition: pbx.h:176
unsigned int monthmask
Definition: pbx.h:173
#define ast_log
Definition: astobj2.c:42
unsigned int dowmask
Definition: pbx.h:175
char * timezone
Definition: pbx.h:177

◆ ast_complete_applications()

char* ast_complete_applications ( const char *  line,
const char *  word,
int  state 
)

Command completion for the list of installed applications.

This can be called from a CLI command completion function that wants to complete from the list of available applications.

Definition at line 429 of file pbx_app.c.

References app, ast_cli_completion_add(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, and NULL.

Referenced by handle_orig(), and handle_show_application().

430 {
431  struct ast_app *app;
432  int which = 0;
433  int cmp;
434  char *ret = NULL;
435  size_t wordlen = strlen(word);
436 
438  AST_RWLIST_TRAVERSE(&apps, app, list) {
439  cmp = strncasecmp(word, app->name, wordlen);
440  if (cmp < 0) {
441  /* No more matches. */
442  break;
443  } else if (!cmp) {
444  /* Found match. */
445  if (state != -1) {
446  if (++which <= state) {
447  /* Not enough matches. */
448  continue;
449  }
450  ret = ast_strdup(app->name);
451  break;
452  }
453  if (ast_cli_completion_add(ast_strdup(app->name))) {
454  break;
455  }
456  }
457  }
459 
460  return ret;
461 }
Registered applications container.
Definition: pbx_app.c:67
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
ast_app: A registered application
Definition: pbx_app.c:45
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition: main/cli.c:2677
static const char app[]
Definition: app_mysql.c:62
short word

◆ ast_context_add_ignorepat()

int ast_context_add_ignorepat ( const char *  context,
const char *  ignorepat,
const char *  registrar 
)

Add an ignorepat.

Parameters
contextwhich context to add the ignorpattern to
ignorepatignorepattern to set up for the extension
registrarregistrar of the ignore pattern

Adds an ignore pattern to a particular context.

Return values
0on success
-1on failure

Definition at line 6868 of file pbx.c.

References ast_context_add_ignorepat2(), ast_unlock_contexts(), c, and find_context_locked().

Referenced by handle_cli_dialplan_add_ignorepat().

6869 {
6870  int ret = -1;
6871  struct ast_context *c;
6872 
6874  if (c) {
6877  }
6878  return ret;
6879 }
static struct test_val c
int value
Definition: syslog.c:37
int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar)
Definition: pbx.c:6881
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_add_ignorepat2()

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

Definition at line 348 of file ael_main.c.

References ADD_LAST, ast_context_ignorepats_count(), ast_context_ignorepats_get(), ast_get_ignorepat_name(), ast_unlock_context(), AST_VECTOR_APPEND, ast_wrlock_context(), create_name(), errno, ignorepat_alloc(), ignorepat_free(), ast_context::ignorepats, and localized_context_add_ignorepat2().

Referenced by ast_compile_ael2(), ast_context_add_ignorepat(), context_merge_incls_swits_igps_other_registrars(), and pbx_load_config().

349 {
350  if(!no_comp)
351  printf("Executed ast_context_add_ignorepat2(con, value=%s, registrar=%s);\n", value, registrar);
352  if( dump_extensions ) {
353  struct namelist *x;
354  x = create_name(value);
355  ADD_LAST(con->ignorepats,x);
356  }
357 }
struct ast_ignorepats ignorepats
Definition: pbx.c:291
int value
Definition: syslog.c:37
static int dump_extensions
Definition: ael_main.c:126
static int no_comp
Definition: ael_main.c:124
#define ADD_LAST(headptr, memptr)
Definition: ael_main.c:64
static char * registrar
Definition: pbx_ael.c:78
struct namelist * create_name(const char *name)
Definition: ael_main.c:79

◆ ast_context_add_include()

int ast_context_add_include ( const char *  context,
const char *  include,
const char *  registrar 
)

Add a context include.

Parameters
contextcontext to add include to
includenew include to add
registrarwho's registering it

Adds an include taking a char * string as the context parameter

Return values
0on success
-1on error

Definition at line 6697 of file pbx.c.

References ast_context_add_include2(), ast_unlock_contexts(), c, and find_context_locked().

Referenced by AST_TEST_DEFINE(), and handle_cli_dialplan_add_include().

6698 {
6699  int ret = -1;
6700  struct ast_context *c;
6701 
6703  if (c) {
6704  ret = ast_context_add_include2(c, include, registrar);
6706  }
6707  return ret;
6708 }
int ast_context_add_include2(struct ast_context *con, const char *value, const char *registrar)
Add a context include.
Definition: pbx.c:6717
static struct test_val c
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_add_include2()

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

Add a context include.

Parameters
concontext to add the include to
valueinclude value to add
registrarwho registered the context

Adds an include taking a struct ast_context as the first parameter

Return values
0on success
-1on failure

Definition at line 359 of file ael_main.c.

References ADD_LAST, ast_context_includes_count(), ast_context_includes_get(), ast_debug, ast_get_context_name(), ast_get_include_name(), ast_unlock_context(), AST_VECTOR_APPEND, ast_wrlock_context(), create_name(), errno, include_alloc(), include_free(), ast_context::includes, and localized_context_add_include2().

Referenced by ast_compile_ael2(), ast_context_add_include(), context_merge_incls_swits_igps_other_registrars(), and pbx_load_config().

360 {
361  if(!no_comp)
362  printf("Executed ast_context_add_include2(con, value=%s, registrar=%s);\n", value, registrar);
363  if( dump_extensions ) {
364  struct namelist *x;
365  x = create_name((char*)value);
366  ADD_LAST(con->includes,x);
367  }
368 }
int value
Definition: syslog.c:37
static int dump_extensions
Definition: ael_main.c:126
static int no_comp
Definition: ael_main.c:124
#define ADD_LAST(headptr, memptr)
Definition: ael_main.c:64
struct ast_includes includes
Definition: pbx.c:290
static char * registrar
Definition: pbx_ael.c:78
struct namelist * create_name(const char *name)
Definition: ael_main.c:79

◆ ast_context_add_switch()

int ast_context_add_switch ( const char *  context,
const char *  sw,
const char *  data,
int  eval,
const char *  registrar 
)

Add a switch.

Parameters
contextcontext to which to add the switch
swswitch to add
datadata to pass to switch
evalwhether to evaluate variables when running switch
registrarwhoever registered the switch

This function registers a switch with the asterisk switch architecture

Return values
0on success
-1on failure

Definition at line 6762 of file pbx.c.

References ast_context_add_switch2(), ast_unlock_contexts(), c, and find_context_locked().

6763 {
6764  int ret = -1;
6765  struct ast_context *c;
6766 
6768  if (c) { /* found, add switch to this context */
6769  ret = ast_context_add_switch2(c, sw, data, eval, registrar);
6771  }
6772  return ret;
6773 }
static struct test_val c
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
int ast_context_add_switch2(struct ast_context *con, const char *value, const char *data, int eval, const char *registrar)
Adds a switch (first param is a ast_context)
Definition: pbx.c:6782
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_add_switch2()

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

Adds a switch (first param is a ast_context)

Note
See ast_context_add_switch() for argument information, with the exception of the first argument. In this case, it's a pointer to an ast_context structure as opposed to the name.

Definition at line 370 of file ael_main.c.

References ADD_LAST, ast_context::alts, ast_context_switches_count(), ast_context_switches_get(), ast_get_context_name(), ast_get_switch_data(), ast_get_switch_name(), ast_unlock_context(), AST_VECTOR_APPEND, ast_verb, ast_wrlock_context(), create_name(), errno, ast_context::eswitches, localized_context_add_switch2(), namelist::name2, sw_alloc(), sw_free(), and ast_context::switches.

Referenced by ast_compile_ael2(), ast_context_add_switch(), context_merge_incls_swits_igps_other_registrars(), lua_register_switches(), and pbx_load_config().

371 {
372  if(!no_comp)
373  printf("Executed ast_context_add_switch2(con, value=%s, data=%s, eval=%d, registrar=%s);\n", value, data, eval, registrar);
374  if( dump_extensions ) {
375  struct namelist *x;
376  x = create_name((char*)value);
377  strncpy(x->name2, data, 99);
378  if( eval ) {
379 
380  ADD_LAST(con->switches,x);
381 
382  } else {
383 
384  ADD_LAST(con->eswitches,x);
385  }
386  }
387 }
struct namelist * eswitches
Definition: ael_main.c:54
int value
Definition: syslog.c:37
struct namelist * switches
Definition: ael_main.c:53
static int dump_extensions
Definition: ael_main.c:126
static int no_comp
Definition: ael_main.c:124
#define ADD_LAST(headptr, memptr)
Definition: ael_main.c:64
static char * registrar
Definition: pbx_ael.c:78
struct namelist * create_name(const char *name)
Definition: ael_main.c:79
char name2[100]
Definition: ael_main.c:42

◆ ast_context_destroy()

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

Destroy a context (matches the specified context or ANY context if NULL)

Parameters
concontext to destroy
registrarwho registered it

You can optionally leave out either parameter. It will find it based on either the ast_context or the registrar name.

Returns
nothing

Definition at line 625 of file conf2ael.c.

References __ast_context_destroy(), ast_context_verify_includes(), ast_unlock_contexts(), ast_wrlock_contexts(), and localized_context_destroy().

Referenced by ast_context_destroy_by_name(), AST_TEST_DEFINE(), ast_walk_contexts(), parking_lot_cfg_remove_extensions(), remove_all_configured_parking_lot_extensions(), remove_pending_parking_lot_extensions(), sla_destroy(), and unload_module().

626 {
628 }
static char * registrar
Definition: pbx_ael.c:78
void localized_context_destroy(struct ast_context *con, const char *registrar)
Definition: extconf.c:5565

◆ ast_context_destroy_by_name()

int ast_context_destroy_by_name ( const char *  context,
const char *  registrar 
)

Destroy a context by name.

Parameters
contextName of the context to destroy
registrarwho registered it

You can optionally leave out the registrar parameter. It will find it based on the context name.

Return values
-1context not found
0Success

Definition at line 8225 of file pbx.c.

References ast_context_destroy(), ast_context_find(), ast_unlock_contexts(), and ast_wrlock_contexts().

Referenced by __unload_module(), app_dtor(), ast_sip_destroy_sorcery_global(), check_regcontext(), cleanup_stale_contexts(), handle_cli_dialplan_remove_context(), and unload_module().

8226 {
8227  struct ast_context *con;
8228  int ret = -1;
8229 
8231  con = ast_context_find(context);
8232  if (con) {
8234  ret = 0;
8235  }
8237 
8238  return ret;
8239 }
struct ast_context * ast_context_find(const char *name)
Find a context.
Definition: pbx.c:2443
void ast_context_destroy(struct ast_context *con, const char *registrar)
Destroy a context (matches the specified context or ANY context if NULL)
Definition: pbx.c:8241
int ast_wrlock_contexts(void)
Write locks the context list.
Definition: pbx.c:8483
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_find()

static struct ast_context * ast_context_find ( const char *  name)

Find a context.

Parameters
namename of the context to find

Will search for the context with the given name.

Returns
the ast_context on success, NULL on failure.

Definition at line 4174 of file extconf.c.

References ast_copy_string(), ast_hashtab_lookup(), ast_rdlock_contexts(), ast_unlock_contexts(), ast_walk_contexts(), ast_context::name, fake_context::name, NULL, and tmp().

Referenced by _macro_exec(), app_create(), ast_context_destroy_by_name(), ast_context_verify_includes(), ast_ignore_pattern(), handle_cli_dialplan_add_extension(), handle_cli_dialplan_add_include(), isexten_function_read(), register_exten(), register_peer_exten(), and unregister_exten().

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

◆ ast_context_find_or_create()

struct ast_context* ast_context_find_or_create ( struct ast_context **  extcontexts,
struct ast_hashtab exttable,
const char *  name,
const char *  registrar 
)

Register a new context or find an existing one.

Parameters
extcontextspointer to the ast_context structure pointer
exttablepointer to the hashtable that contains all the elements in extcontexts
namename of the new context
registrarregistrar of the context

This function allows you to play in two environments: the global contexts (active dialplan) or an external context set of your choosing. To act on the external set, make sure extcontexts and exttable are set; for the globals, make sure both extcontexts and exttable are NULL.

This will first search for a context with your name. If it exists already, it will not create a new one. If it does not exist, it will create a new one with the given name and registrar.

Returns
NULL on failure, and an ast_context structure on success

Definition at line 6189 of file pbx.c.

References __ast_cli_register_multiple(), ast_context::alts, ast_calloc, ast_copy_string(), ast_debug, ast_hashtab_compare_contexts(), ast_hashtab_create, ast_hashtab_hash_contexts(), ast_hashtab_insert_immediate, ast_hashtab_insert_safe, ast_hashtab_lookup(), ast_hashtab_newsize_java(), ast_hashtab_resize_java(), ast_log, ast_mutex_init, ast_rdlock_contexts(), ast_rwlock_init, ast_strdup, ast_unlock_contexts(), AST_VECTOR_INIT, ast_wrlock_contexts(), contexts, ast_context::ignorepats, ast_context::includes, local_contexts, localized_context_find_or_create(), ast_context::lock, LOG_ERROR, ast_context::macrolock, ast_context::name, fake_context::name, ast_context::next, NULL, ast_context::refcount, ast_context::registrar, ast_context::root, ast_context::root_table, and tmp().

Referenced by add_hints(), app_create(), ast_compile_ael2(), ast_sip_persistent_endpoint_add_to_regcontext(), AST_TEST_DEFINE(), config_parse_variables(), context_merge(), create_test_dialplan(), handle_cli_dialplan_add_extension(), handle_cli_dialplan_add_include(), load_module(), lua_register_hints(), lua_register_switches(), manager_dialplan_extension_add(), parking_duration_callback(), parking_lot_cfg_create_extensions(), pbx_load_config(), pbx_load_users(), reload_config(), set_config(), sla_build_station(), and sla_build_trunk().

6190 {
6191  struct ast_context *tmp, **local_contexts;
6192  struct fake_context search;
6193  int length = sizeof(struct ast_context) + strlen(name) + 1;
6194 
6195  if (!contexts_table) {
6196  /* Protect creation of contexts_table from reentrancy. */
6198  if (!contexts_table) {
6204  0);
6205  }
6207  }
6208 
6209  ast_copy_string(search.name, name, sizeof(search.name));
6210  if (!extcontexts) {
6212  local_contexts = &contexts;
6213  tmp = ast_hashtab_lookup(contexts_table, &search);
6214  if (tmp) {
6215  tmp->refcount++;
6217  return tmp;
6218  }
6219  } else { /* local contexts just in a linked list; search there for the new context; slow, linear search, but not frequent */
6220  local_contexts = extcontexts;
6221  tmp = ast_hashtab_lookup(exttable, &search);
6222  if (tmp) {
6223  tmp->refcount++;
6224  return tmp;
6225  }
6226  }
6227 
6228  if ((tmp = ast_calloc(1, length))) {
6229  ast_rwlock_init(&tmp->lock);
6230  ast_mutex_init(&tmp->macrolock);
6231  strcpy(tmp->name, name);
6232  tmp->root = NULL;
6233  tmp->root_table = NULL;
6234  tmp->registrar = ast_strdup(registrar);
6235  AST_VECTOR_INIT(&tmp->includes, 0);
6236  AST_VECTOR_INIT(&tmp->ignorepats, 0);
6237  AST_VECTOR_INIT(&tmp->alts, 0);
6238  tmp->refcount = 1;
6239  } else {
6240  ast_log(LOG_ERROR, "Danger! We failed to allocate a context for %s!\n", name);
6241  if (!extcontexts) {
6243  }
6244  return NULL;
6245  }
6246 
6247  if (!extcontexts) {
6248  tmp->next = *local_contexts;
6249  *local_contexts = tmp;
6250  ast_hashtab_insert_safe(contexts_table, tmp); /*put this context into the tree */
6252  } else {
6253  tmp->next = *local_contexts;
6254  if (exttable)
6255  ast_hashtab_insert_immediate(exttable, tmp); /*put this context into the tree */
6256 
6257  *local_contexts = tmp;
6258  }
6259  ast_debug(1, "Registered extension context '%s'; registrar: %s\n", tmp->name, registrar);
6260  return tmp;
6261 }
struct ast_ignorepats ignorepats
Definition: pbx.c:291
void * ast_hashtab_lookup(struct ast_hashtab *tab, const void *obj)
Lookup this object in the hash table.
Definition: hashtab.c:486
int ast_hashtab_newsize_java(struct ast_hashtab *tab)
Create a prime number roughly 2x the current table size.
Definition: hashtab.c:127
struct ast_exten * root
Definition: pbx.c:286
static struct ast_hashtab * contexts_table
Definition: pbx.c:777
static int tmp()
Definition: bt_open.c:389
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
struct ast_context * local_contexts
int ast_rdlock_contexts(void)
Read locks the context list.
Definition: pbx.c:8488
int ast_hashtab_resize_java(struct ast_hashtab *tab)
Determines if a table resize should occur using the Java algorithm (if the table load factor is 75% o...
Definition: hashtab.c:84
#define ast_hashtab_insert_safe(tab, obj)
Definition: hashtab.h:315
struct ast_context * next
Definition: pbx.c:289
ast_mutex_t macrolock
Definition: pbx.c:296
int ast_wrlock_contexts(void)
Write locks the context list.
Definition: pbx.c:8483
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
#define ast_hashtab_insert_immediate(tab, obj)
Definition: hashtab.h:291
#define ast_log
Definition: astobj2.c:42
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition: vector.h:113
char * registrar
Definition: pbx.c:293
struct ast_includes includes
Definition: pbx.c:290
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
ast_rwlock_t lock
Definition: pbx.c:285
#define LOG_ERROR
Definition: logger.h:285
char name[0]
Definition: pbx.c:297
#define ast_rwlock_init(rwlock)
wrapper for rwlock with tracking enabled
Definition: lock.h:222
static char * registrar
Definition: pbx_ael.c:78
static const char name[]
Definition: cdr_mysql.c:74
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned int ast_hashtab_hash_contexts(const void *obj)
Definition: pbx.c:735
int refcount
Definition: pbx.c:294
struct ast_hashtab * root_table
Definition: pbx.c:287
static struct ast_context * contexts
Definition: pbx.c:776
#define ast_hashtab_create(initial_buckets, compare, resize, newsize, hash, do_locking)
Definition: hashtab.h:261
#define ast_mutex_init(pmutex)
Definition: lock.h:184
struct ast_sws alts
Definition: pbx.c:292
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284
int ast_hashtab_compare_contexts(const void *ah_a, const void *ah_b)
hashtable functions for contexts
Definition: pbx.c:683

◆ ast_context_ignorepats_count()

int ast_context_ignorepats_count ( const struct ast_context con)

◆ ast_context_ignorepats_get()

const struct ast_ignorepat* ast_context_ignorepats_get ( const struct ast_context con,
int  idx 
)

◆ ast_context_includes_count()

int ast_context_includes_count ( const struct ast_context con)

◆ ast_context_includes_get()

const struct ast_include* ast_context_includes_get ( const struct ast_context con,
int  idx 
)

◆ ast_context_lockmacro()

int ast_context_lockmacro ( const char *  context)

locks the macrolock in the given context

Parameters
macrocontextname of the macro-context to lock

Locks the given macro-context to ensure only one thread (call) can execute it at a time

Return values
0on success
-1on failure
Note
This function locks contexts list by &conlist, searches for the right context structure, and locks the macrolock mutex in that context. macrolock is used to limit a macro to be executed by one call at a time.
Parameters
contextThe context

Definition at line 5153 of file pbx.c.

References ast_mutex_lock, ast_unlock_contexts(), c, find_context_locked(), and ast_context::macrolock.

Referenced by _macro_exec().

5154 {
5155  struct ast_context *c;
5156  int ret = -1;
5157 
5159  if (c) {
5161 
5162  /* if we found context, lock macrolock */
5163  ret = ast_mutex_lock(&c->macrolock);
5164  }
5165 
5166  return ret;
5167 }
#define ast_mutex_lock(a)
Definition: lock.h:187
static struct test_val c
ast_mutex_t macrolock
Definition: pbx.c:296
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_remove_extension()

int ast_context_remove_extension ( const char *  context,
const char *  extension,
int  priority,
const char *  registrar 
)

Simply remove extension from context.

Parameters
contextcontext to remove extension from
extensionwhich extension to remove
prioritypriority of extension to remove (0 to remove all)
registrarregistrar of the extension

This function removes an extension from a given context.

Return values
0on success
-1on failure
Note
This function will lock conlock.

Definition at line 4943 of file pbx.c.

References ast_context_remove_extension_callerid(), AST_EXT_MATCHCID_ANY, and NULL.

Referenced by ast_sip_persistent_endpoint_update_state(), AST_TEST_DEFINE(), conf_ended(), delete_extens(), register_peer_exten(), sla_station_destructor(), sla_trunk_destructor(), unregister_exten(), and unregister_extension().

4944 {
4946 }
#define NULL
Definition: resample.c:96
static int priority
structure to hold extensions
static char * registrar
Definition: pbx_ael.c:78
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
int ast_context_remove_extension_callerid(const char *context, const char *extension, int priority, const char *callerid, int matchcallerid, const char *registrar)
Definition: pbx.c:4948

◆ ast_context_remove_extension2()

int ast_context_remove_extension2 ( struct ast_context con,
const char *  extension,
int  priority,
const char *  registrar,
int  already_locked 
)

This functionc locks given context, search for the right extension and fires out all peer in this extensions with given priority. If priority is set to 0, all peers are removed. After that, unlock context and return.

Note
When do you want to call this function, make sure that &conlock is locked, because some process can handle with your *con context before you lock it.

Definition at line 4973 of file pbx.c.

References ast_context_remove_extension_callerid2(), AST_EXT_MATCHCID_ANY, and NULL.

Referenced by add_extension(), and add_hints().

4974 {
4976 }
#define NULL
Definition: resample.c:96
static int priority
structure to hold extensions
static char * registrar
Definition: pbx_ael.c:78
int ast_context_remove_extension_callerid2(struct ast_context *con, const char *extension, int priority, const char *callerid, int matchcallerid, const char *registrar, int already_locked)
Definition: pbx.c:4978

◆ ast_context_remove_extension_callerid()

int ast_context_remove_extension_callerid ( const char *  context,
const char *  extension,
int  priority,
const char *  callerid,
int  matchcid,
const char *  registrar 
)

Definition at line 4948 of file pbx.c.

References ast_context_remove_extension_callerid2(), ast_unlock_contexts(), c, and find_context_locked().

Referenced by ast_context_remove_extension(), handle_cli_dialplan_remove_extension(), and manager_dialplan_extension_remove().

4949 {
4950  int ret = -1; /* default error return */
4951  struct ast_context *c;
4952 
4954  if (c) { /* ... remove extension ... */
4956  matchcallerid, registrar, 0);
4958  }
4959 
4960  return ret;
4961 }
static struct test_val c
static int priority
structure to hold extensions
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
int ast_context_remove_extension_callerid2(struct ast_context *con, const char *extension, int priority, const char *callerid, int matchcallerid, const char *registrar, int already_locked)
Definition: pbx.c:4978
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_remove_extension_callerid2()

int ast_context_remove_extension_callerid2 ( struct ast_context con,
const char *  extension,
int  priority,
const char *  callerid,
int  matchcid,
const char *  registrar,
int  already_locked 
)

Definition at line 4978 of file pbx.c.

References add_exten_to_pattern_tree(), ast_hashtab_insert_immediate, ast_hashtab_lookup(), ast_hashtab_remove_this_object(), ast_hashtab_size(), ast_log, ast_strlen_zero, ast_unlock_context(), ast_verb, ast_wrlock_context(), ast_exten::cidmatch, match_char::deleted, destroy_exten(), ext_strncpy(), ast_exten::exten, match_char::exten, ast_exten::label, LOG_ERROR, LOG_NOTICE, LOG_WARNING, ast_exten::matchcid, ast_exten::name, ast_context::name, ast_exten::next, NULL, ast_context::pattern_tree, ast_exten::peer, ast_exten::peer_label_table, ast_exten::peer_table, ast_exten::priority, ast_exten::registrar, ast_context::root, ast_context::root_table, and match_char::x.

Referenced by __ast_context_destroy(), ast_context_remove_extension2(), and ast_context_remove_extension_callerid().

4979 {
4980  struct ast_exten *exten, *prev_exten = NULL;
4981  struct ast_exten *peer;
4982  struct ast_exten ex, *exten2, *exten3;
4983  char dummy_name[1024];
4984  char dummy_cid[1024];
4985  struct ast_exten *previous_peer = NULL;
4986  struct ast_exten *next_peer = NULL;
4987  int found = 0;
4988 
4989  if (!already_locked)
4990  ast_wrlock_context(con);
4991 
4992 #ifdef NEED_DEBUG
4993  ast_verb(3,"Removing %s/%s/%d%s%s from trees, registrar=%s\n", con->name, extension, priority, matchcallerid ? "/" : "", matchcallerid ? callerid : "", registrar);
4994 #endif
4995 #ifdef CONTEXT_DEBUG
4996  check_contexts(__FILE__, __LINE__);
4997 #endif
4998  /* find this particular extension */
4999  ex.exten = dummy_name;
5000  ext_strncpy(dummy_name, extension, sizeof(dummy_name), 1);
5001  ex.matchcid = matchcallerid;
5002  if (callerid) {
5003  ex.cidmatch = dummy_cid;
5004  ext_strncpy(dummy_cid, callerid, sizeof(dummy_cid), 1);
5005  } else {
5006  ex.cidmatch = NULL;
5007  }
5008  exten = ast_hashtab_lookup(con->root_table, &ex);
5009  if (exten) {
5010  if (priority == 0) {
5011  exten2 = ast_hashtab_remove_this_object(con->root_table, exten);
5012  if (!exten2)
5013  ast_log(LOG_ERROR,"Trying to delete the exten %s from context %s, but could not remove from the root_table\n", extension, con->name);
5014  if (con->pattern_tree) {
5015  struct match_char *x = add_exten_to_pattern_tree(con, exten, 1);
5016 
5017  if (x->exten) { /* this test for safety purposes */
5018  x->deleted = 1; /* with this marked as deleted, it will never show up in the scoreboard, and therefore never be found */
5019  x->exten = 0; /* get rid of what will become a bad pointer */
5020  } else {
5021  ast_log(LOG_WARNING,"Trying to delete an exten from a context, but the pattern tree node returned isn't a full extension\n");
5022  }
5023  }
5024  } else {
5025  ex.priority = priority;
5026  exten2 = ast_hashtab_lookup(exten->peer_table, &ex);
5027  if (exten2) {
5028  if (exten2->label) { /* if this exten has a label, remove that, too */
5029  exten3 = ast_hashtab_remove_this_object(exten->peer_label_table,exten2);
5030  if (!exten3) {
5031  ast_log(LOG_ERROR, "Did not remove this priority label (%d/%s) "
5032  "from the peer_label_table of context %s, extension %s!\n",
5033  priority, exten2->label, con->name, exten2->name);
5034  }
5035  }
5036 
5037  exten3 = ast_hashtab_remove_this_object(exten->peer_table, exten2);
5038  if (!exten3) {
5039  ast_log(LOG_ERROR, "Did not remove this priority (%d) from the "
5040  "peer_table of context %s, extension %s!\n",
5041  priority, con->name, exten2->name);
5042  }
5043  if (exten2 == exten && exten2->peer) {
5044  exten2 = ast_hashtab_remove_this_object(con->root_table, exten);
5046  }
5047  if (ast_hashtab_size(exten->peer_table) == 0) {
5048  /* well, if the last priority of an exten is to be removed,
5049  then, the extension is removed, too! */
5050  exten3 = ast_hashtab_remove_this_object(con->root_table, exten);
5051  if (!exten3) {
5052  ast_log(LOG_ERROR, "Did not remove this exten (%s) from the "
5053  "context root_table (%s) (priority %d)\n",
5054  exten->name, con->name, priority);
5055  }
5056  if (con->pattern_tree) {
5057  struct match_char *x = add_exten_to_pattern_tree(con, exten, 1);
5058  if (x->exten) { /* this test for safety purposes */
5059  x->deleted = 1; /* with this marked as deleted, it will never show up in the scoreboard, and therefore never be found */
5060  x->exten = 0; /* get rid of what will become a bad pointer */
5061  }
5062  }
5063  }
5064  } else {
5065  ast_log(LOG_ERROR,"Could not find priority %d of exten %s in context %s!\n",
5066  priority, exten->name, con->name);
5067  }
5068  }
5069  } else {
5070  /* hmmm? this exten is not in this pattern tree? */
5071  ast_log(LOG_WARNING,"Cannot find extension %s in root_table in context %s\n",
5072  extension, con->name);
5073  }
5074 #ifdef NEED_DEBUG
5075  if (con->pattern_tree) {
5076  ast_log(LOG_NOTICE,"match char tree after exten removal:\n");
5077  log_match_char_tree(con->pattern_tree, " ");
5078  }
5079 #endif
5080 
5081  /* scan the extension list to find first matching extension-registrar */
5082  for (exten = con->root; exten; prev_exten = exten, exten = exten->next) {
5083  if (!strcmp(exten->exten, ex.exten) &&
5084  (!matchcallerid ||
5085  (!ast_strlen_zero(ex.cidmatch) && !ast_strlen_zero(exten->cidmatch) && !strcmp(exten->cidmatch, ex.cidmatch)) ||
5086  (ast_strlen_zero(ex.cidmatch) && ast_strlen_zero(exten->cidmatch)))) {
5087  break;
5088  }
5089  }
5090  if (!exten) {
5091  /* we can't find right extension */
5092  if (!already_locked)
5093  ast_unlock_context(con);
5094  return -1;
5095  }
5096 
5097  /* scan the priority list to remove extension with exten->priority == priority */
5098  for (peer = exten, next_peer = exten->peer ? exten->peer : exten->next;
5099  peer && !strcmp(peer->exten, ex.exten) &&
5100  (!callerid || (!matchcallerid && !peer->matchcid) || (matchcallerid && peer->matchcid && !strcmp(peer->cidmatch, ex.cidmatch))) ;
5101  peer = next_peer, next_peer = next_peer ? (next_peer->peer ? next_peer->peer : next_peer->next) : NULL) {
5102 
5103  if ((priority == 0 || peer->priority == priority) &&
5104  (!registrar || !strcmp(peer->registrar, registrar) )) {
5105  found = 1;
5106 
5107  /* we are first priority extension? */
5108  if (!previous_peer) {
5109  /*
5110  * We are first in the priority chain, so must update the extension chain.
5111  * The next node is either the next priority or the next extension
5112  */
5113  struct ast_exten *next_node = peer->peer ? peer->peer : peer->next;
5114  if (peer->peer) {
5115  /* move the peer_table and peer_label_table down to the next peer, if
5116  it is there */
5117  peer->peer->peer_table = peer->peer_table;
5118  peer->peer->peer_label_table = peer->peer_label_table;
5119  peer->peer_table = NULL;
5120  peer->peer_label_table = NULL;
5121  }
5122  if (!prev_exten) { /* change the root... */
5123  con->root = next_node;
5124  } else {
5125  prev_exten->next = next_node; /* unlink */
5126  }
5127  if (peer->peer) { /* update the new head of the pri list */
5128  peer->peer->next = peer->next;
5129  }
5130  } else { /* easy, we are not first priority in extension */
5131  previous_peer->peer = peer->peer;
5132  }
5133 
5134 
5135  /* now, free whole priority extension */
5136  destroy_exten(peer);
5137  } else {
5138  previous_peer = peer;
5139  }
5140  }
5141  if (!already_locked)
5142  ast_unlock_context(con);
5143  return found ? 0 : -1;
5144 }
const char * label
Definition: pbx.c:244
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
ast_exten: An extension The dialplan is saved as a linked list with each context having it&#39;s own link...
Definition: pbx.c:237
void * ast_hashtab_lookup(struct ast_hashtab *tab, const void *obj)
Lookup this object in the hash table.
Definition: hashtab.c:486
static unsigned int ext_strncpy(char *dst, const char *src, size_t dst_size, int nofluff)
Definition: pbx.c:7059
int ast_unlock_context(struct ast_context *con)
Definition: pbx.c:8511
struct ast_exten * exten
Definition: pbx.c:268
struct ast_exten * root
Definition: pbx.c:286
char * name
Definition: pbx.c:239
static struct match_char * add_exten_to_pattern_tree(struct ast_context *con, struct ast_exten *e1, int findonly)
Definition: pbx.c:1657
#define LOG_WARNING
Definition: logger.h:274
#define NULL
Definition: resample.c:96
struct ast_hashtab * peer_table
Definition: pbx.c:251
static int priority
char x[1]
Definition: pbx.c:269
#define ast_verb(level,...)
Definition: logger.h:455
const char * registrar
Definition: pbx.c:253
int matchcid
Definition: pbx.c:240
struct ast_exten * next
Definition: pbx.c:256
#define ast_hashtab_insert_immediate(tab, obj)
Definition: hashtab.h:291
int priority
Definition: pbx.c:243
#define ast_log
Definition: astobj2.c:42
struct ast_exten * peer
Definition: pbx.c:250
structure to hold extensions
struct ast_hashtab * peer_label_table
Definition: pbx.c:252
char * exten
Definition: pbx.c:238
#define LOG_ERROR
Definition: logger.h:285
char name[0]
Definition: pbx.c:297
int ast_wrlock_context(struct ast_context *con)
Write locks a given context.
Definition: pbx.c:8501
#define LOG_NOTICE
Definition: logger.h:263
static char * registrar
Definition: pbx_ael.c:78
#define ast_strlen_zero(a)
Definition: muted.c:73
const char * cidmatch
Definition: pbx.c:241
struct ast_hashtab * root_table
Definition: pbx.c:287
int ast_hashtab_size(struct ast_hashtab *tab)
Returns the number of elements stored in the hashtab.
Definition: hashtab.c:577
struct match_char * pattern_tree
Definition: pbx.c:288
static void destroy_exten(struct ast_exten *e)
Definition: pbx.c:4669
int deleted
Definition: pbx.c:264
match_char: forms a syntax tree for quick matching of extension patterns
Definition: pbx.c:261
void * ast_hashtab_remove_this_object(struct ast_hashtab *tab, void *obj)
Hash the object and then compare ptrs in bucket list instead of calling the compare routine...
Definition: hashtab.c:789

◆ ast_context_remove_ignorepat()

int ast_context_remove_ignorepat ( const char *  context,
const char *  ignorepat,
const char *  registrar 
)

Definition at line 6828 of file pbx.c.

References ast_context_remove_ignorepat2(), ast_unlock_contexts(), c, and find_context_locked().

Referenced by handle_cli_dialplan_remove_ignorepat().

6829 {
6830  int ret = -1;
6831  struct ast_context *c;
6832 
6834  if (c) {
6835  ret = ast_context_remove_ignorepat2(c, ignorepat, registrar);
6837  }
6838  return ret;
6839 }
int ast_context_remove_ignorepat2(struct ast_context *con, const char *ignorepat, const char *registrar)
Definition: pbx.c:6841
static struct test_val c
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_remove_ignorepat2()

int ast_context_remove_ignorepat2 ( struct ast_context con,
const char *  ignorepat,
const char *  registrar 
)

Definition at line 6841 of file pbx.c.

References ast_context_ignorepats_count(), ast_get_ignorepat_name(), ast_get_ignorepat_registrar(), ast_unlock_context(), AST_VECTOR_GET, AST_VECTOR_REMOVE_ORDERED, ast_wrlock_context(), errno, ignorepat_free(), and ast_context::ignorepats.

Referenced by ast_context_remove_ignorepat().

6842 {
6843  int idx;
6844 
6845  ast_wrlock_context(con);
6846 
6847  for (idx = 0; idx < ast_context_ignorepats_count(con); idx++) {
6848  struct ast_ignorepat *ip = AST_VECTOR_GET(&con->ignorepats, idx);
6849 
6850  if (!strcmp(ast_get_ignorepat_name(ip), ignorepat) &&
6853  ignorepat_free(ip);
6854  ast_unlock_context(con);
6855  return 0;
6856  }
6857  }
6858 
6859  ast_unlock_context(con);
6860  errno = EINVAL;
6861  return -1;
6862 }
struct ast_ignorepats ignorepats
Definition: pbx.c:291
int ast_unlock_context(struct ast_context *con)
Definition: pbx.c:8511
const char * ast_get_ignorepat_registrar(const struct ast_ignorepat *ip)
Definition: pbx_ignorepat.c:47
void ignorepat_free(struct ast_ignorepat *ip)
Definition: pbx_ignorepat.c:77
#define AST_VECTOR_REMOVE_ORDERED(vec, idx)
Remove an element from a vector by index while maintaining order.
Definition: vector.h:448
const char * ast_get_ignorepat_name(const struct ast_ignorepat *ip)
Definition: pbx_ignorepat.c:42
int ast_context_ignorepats_count(const struct ast_context *con)
Definition: pbx.c:8721
ast_ignorepat: Ignore patterns in dial plan
Definition: pbx_ignorepat.c:37
int errno
int ast_wrlock_context(struct ast_context *con)
Write locks a given context.
Definition: pbx.c:8501
static char * registrar
Definition: pbx_ael.c:78
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:678

◆ ast_context_remove_include()

int ast_context_remove_include ( const char *  context,
const char *  include,
const char *  registrar 
)

Remove a context include.

Note
See ast_context_add_include for information on arguments
Return values
0on success
-1on failure

Remove a context include.

Definition at line 4831 of file pbx.c.

References ast_context_remove_include2(), ast_unlock_contexts(), c, and find_context_locked().

Referenced by handle_cli_dialplan_remove_include().

4832 {
4833  int ret = -1;
4834  struct ast_context *c;
4835 
4837  if (c) {
4838  /* found, remove include from this context ... */
4839  ret = ast_context_remove_include2(c, include, registrar);
4841  }
4842  return ret;
4843 }
int ast_context_remove_include2(struct ast_context *con, const char *include, const char *registrar)
Locks context, remove included contexts, unlocks context. When we call this function, &conlock lock must be locked, because when we giving *con argument, some process can remove/change this context and after that there can be segfault.
Definition: pbx.c:4854
static struct test_val c
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_remove_include2()

int ast_context_remove_include2 ( struct ast_context con,
const char *  include,
const char *  registrar 
)

Removes an include by an ast_context structure.

Note
See ast_context_add_include2 for information on arguments
Return values
0on success
-1on success

Removes an include by an ast_context structure.

Return values
0on success.
-1on failure.

Definition at line 4854 of file pbx.c.

References ast_context_includes_count(), ast_get_context_name(), ast_get_include_name(), ast_get_include_registrar(), ast_unlock_context(), AST_VECTOR_GET, AST_VECTOR_REMOVE_ORDERED, ast_verb, ast_wrlock_context(), include_free(), and ast_context::includes.

Referenced by ast_context_remove_include().

4855 {
4856  int ret = -1;
4857  int idx;
4858 
4859  ast_wrlock_context(con);
4860 
4861  /* find our include */
4862  for (idx = 0; idx < ast_context_includes_count(con); idx++) {
4863  struct ast_include *i = AST_VECTOR_GET(&con->includes, idx);
4864 
4865  if (!strcmp(ast_get_include_name(i), include) &&
4866  (!registrar || !strcmp(ast_get_include_registrar(i), registrar))) {
4867 
4868  /* remove from list */
4869  ast_verb(3, "Removing inclusion of context '%s' in context '%s; registrar=%s'\n", include, ast_get_context_name(con), registrar);
4870  AST_VECTOR_REMOVE_ORDERED(&con->includes, idx);
4871 
4872  /* free include and return */
4873  include_free(i);
4874  ret = 0;
4875  break;
4876  }
4877  }
4878 
4879  ast_unlock_context(con);
4880 
4881  return ret;
4882 }
ast_include: include= support in extensions.conf
Definition: pbx_include.c:37
int ast_unlock_context(struct ast_context *con)
Definition: pbx.c:8511
void include_free(struct ast_include *inc)
Definition: pbx_include.c:106
const char * ast_get_include_registrar(const struct ast_include *i)
Definition: pbx_include.c:60
#define ast_verb(level,...)
Definition: logger.h:455
#define AST_VECTOR_REMOVE_ORDERED(vec, idx)
Remove an element from a vector by index while maintaining order.
Definition: vector.h:448
struct ast_includes includes
Definition: pbx.c:290
int ast_wrlock_context(struct ast_context *con)
Write locks a given context.
Definition: pbx.c:8501
static char * registrar
Definition: pbx_ael.c:78
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:678
const char * ast_get_include_name(const struct ast_include *include)
Definition: pbx_include.c:50
const char * ast_get_context_name(struct ast_context *con)
Definition: pbx.c:8519
int ast_context_includes_count(const struct ast_context *con)
Definition: pbx.c:8678

◆ ast_context_remove_switch()

int ast_context_remove_switch ( const char *  context,
const char *  sw,
const char *  data,
const char *  registrar 
)

Remove a switch.

Removes a switch with the given parameters

Return values
0on success
-1on failure
Note
This function locks contexts list by &conlist, search for the rigt context structure, leave context list locked and call ast_context_remove_switch2 which removes switch, unlock contexts list and return ...

Definition at line 4889 of file pbx.c.

References ast_context_remove_switch2(), ast_unlock_contexts(), c, and find_context_locked().

4890 {
4891  int ret = -1; /* default error return */
4892  struct ast_context *c;
4893 
4895  if (c) {
4896  /* remove switch from this context ... */
4897  ret = ast_context_remove_switch2(c, sw, data, registrar);
4899  }
4900  return ret;
4901 }
int ast_context_remove_switch2(struct ast_context *con, const char *sw, const char *data, const char *registrar)
This function locks given context, removes switch, unlock context and return.
Definition: pbx.c:4911
static struct test_val c
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static char * registrar
Definition: pbx_ael.c:78
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_context_remove_switch2()

int ast_context_remove_switch2 ( struct ast_context con,
const char *  sw,
const char *  data,
const char *  registrar 
)

This function locks given context, removes switch, unlock context and return.

Note
When we call this function, &conlock lock must be locked, because when we giving *con argument, some process can remove/change this context and after that there can be segfault.

Definition at line 4911 of file pbx.c.

References ast_context::alts, ast_context_switches_count(), ast_get_context_name(), ast_get_switch_data(), ast_get_switch_name(), ast_get_switch_registrar(), ast_unlock_context(), AST_VECTOR_GET, AST_VECTOR_REMOVE_ORDERED, ast_verb, ast_wrlock_context(), and sw_free().

Referenced by ast_context_remove_switch().

4912 {
4913  int idx;
4914  int ret = -1;
4915 
4916  ast_wrlock_context(con);
4917 
4918  /* walk switches */
4919  for (idx = 0; idx < ast_context_switches_count(con); idx++) {
4920  struct ast_sw *i = AST_VECTOR_GET(&con->alts, idx);
4921 
4922  if (!strcmp(ast_get_switch_name(i), sw) &&
4923  !strcmp(ast_get_switch_data(i), data) &&
4924  (!registrar || !strcmp(ast_get_switch_registrar(i), registrar))) {
4925 
4926  /* found, remove from list */
4927  ast_verb(3, "Removing switch '%s' from context '%s; registrar=%s'\n", sw, ast_get_context_name(con), registrar);
4928  AST_VECTOR_REMOVE_ORDERED(&con->alts, idx);
4929 
4930  /* free switch and return */
4931  sw_free(i);
4932  ret = 0;
4933  break;
4934  }
4935  }
4936 
4937  ast_unlock_context(con);
4938 
4939  return ret;
4940 }
const char * ast_get_switch_name(const struct ast_sw *sw)
Definition: pbx_sw.c:48
const char * ast_get_switch_registrar(const struct ast_sw *sw)
Definition: pbx_sw.c:63
int ast_context_switches_count(const struct ast_context *con)
Definition: pbx.c:8633
int ast_unlock_context(struct ast_context *con)
Definition: pbx.c:8511
#define ast_verb(level,...)
Definition: logger.h:455
ast_sw: Switch statement in extensions.conf
Definition: pbx_sw.c:37
const char * data
Definition: pbx_sw.c:42
#define AST_VECTOR_REMOVE_ORDERED(vec, idx)
Remove an element from a vector by index while maintaining order.
Definition: vector.h:448
int ast_wrlock_context(struct ast_context *con)
Write locks a given context.
Definition: pbx.c:8501
static char * registrar
Definition: pbx_ael.c:78
const char * ast_get_switch_data(const struct ast_sw *sw)
Definition: pbx_sw.c:53
void sw_free(struct ast_sw *sw)
Definition: pbx_sw.c:101
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:678
const char * ast_get_context_name(struct ast_context *con)
Definition: pbx.c:8519
struct ast_sws alts
Definition: pbx.c:292

◆ ast_context_set_autohints()

void ast_context_set_autohints ( struct ast_context con,
int  enabled 
)

Enable or disable autohints support on a context.

Parameters
conpointer to the context
enabledwhether autohints are enabled

Definition at line 6263 of file pbx.c.

References __ast_context_destroy(), ast_context::autohints, enabled, and ast_exten::registrar.

Referenced by pbx_load_config().

6264 {
6265  con->autohints = enabled;
6266 }
int autohints
Definition: pbx.c:295
static int enabled
Definition: dnsmgr.c:91

◆ ast_context_switches_count()

int ast_context_switches_count ( const struct ast_context con)

◆ ast_context_switches_get()

const struct ast_sw* ast_context_switches_get ( const struct ast_context con,
int  idx 
)

Definition at line 8638 of file pbx.c.

References ast_context::alts, and AST_VECTOR_GET.

Referenced by ast_context_add_switch2(), ast_walk_context_switches(), context_merge_incls_swits_igps_other_registrars(), handle_cli_dialplan_save(), manager_show_dialplan_helper(), pbx_find_extension(), and show_dialplan_helper().

8639 {
8640  return AST_VECTOR_GET(&con->alts, idx);
8641 }
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:678
struct ast_sws alts
Definition: pbx.c:292

◆ ast_context_unlockmacro()

int ast_context_unlockmacro ( const char *  context)

Unlocks the macrolock in the given context.

Parameters
macrocontextname of the macro-context to unlock

Unlocks the given macro-context so that another thread (call) can execute it

Return values
0on success
-1on failure
Note
This function locks contexts list by &conlist, searches for the right context structure, and unlocks the macrolock mutex in that context. macrolock is used to limit a macro to be executed by one call at a time.
Parameters
contextThe context

Definition at line 5175 of file pbx.c.

References ast_mutex_unlock, ast_unlock_contexts(), c, find_context_locked(), and ast_context::macrolock.

Referenced by _macro_exec().

5176 {
5177  struct ast_context *c;
5178  int ret = -1;
5179 
5181  if (c) {
5183 
5184  /* if we found context, unlock macrolock */
5185  ret = ast_mutex_unlock(&c->macrolock);
5186  }
5187 
5188  return ret;
5189 }
static struct test_val c
ast_mutex_t macrolock
Definition: pbx.c:296
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
static struct ast_context * find_context_locked(const char *context)
lookup for a context with a given name,
Definition: pbx.c:4809
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ ast_context_verify_includes()

int ast_context_verify_includes ( struct ast_context con)

Verifies includes in an ast_contect structure.

Parameters
concontext in which to verify the includes
Return values
0if no problems found
-1if there were any missing context

Definition at line 632 of file conf2ael.c.

References ast_context_find(), ast_context_includes_count(), ast_context_includes_get(), ast_get_context_name(), ast_log, ast_merge_contexts_and_delete(), include_rname(), localized_context_verify_includes(), and LOG_WARNING.

Referenced by ast_context_destroy(), and pbx_load_module().

633 {
635 }
int localized_context_verify_includes(struct ast_context *con)
Definition: extconf.c:5640

◆ ast_custom_function_find()

struct ast_custom_function * ast_custom_function_find ( const char *  name)

◆ ast_custom_function_unregister()

int ast_custom_function_unregister ( struct ast_custom_function acf)

Unregister a custom function.

Definition at line 273 of file pbx_functions.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_string_field_free_memory, ast_verb, AST_XML_DOC, ast_custom_function::docsrc, and ast_custom_function::name.

Referenced by load_module(), manager_shutdown(), message_shutdown(), reload(), unload_features_config(), unload_module(), unload_parking_bridge_features(), and unload_pbx().

274 {
275  struct ast_custom_function *cur;
276 
277  if (!acf) {
278  return -1;
279  }
280 
282  cur = AST_RWLIST_REMOVE(&acf_root, acf, acflist);
283  if (cur) {
284 #ifdef AST_XML_DOCS
285  if (cur->docsrc == AST_XML_DOC) {
287  }
288 #endif
289  ast_verb(2, "Unregistered custom function %s\n", cur->name);
290  }
292 
293  return cur ? 0 : -1;
294 }
const char * name
Definition: pbx.h:119
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
enum ast_doc_src docsrc
Definition: pbx.h:127
#define ast_verb(level,...)
Definition: logger.h:455
Data structure associated with a custom dialplan function.
Definition: pbx.h:118
Registered functions container.
Definition: pbx_functions.c:59
#define AST_RWLIST_REMOVE
Definition: linkedlists.h:884
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:368

◆ ast_destroy_timing()

int ast_destroy_timing ( struct ast_timing i)

Deallocates memory structures associated with a timing bitmap.

Parameters
iPointer to an ast_timing structure.
Return values
0success
non-zerofailure (number suitable to pass to
See also
strerror)

Definition at line 285 of file pbx_timing.c.

References ast_free, NULL, and ast_timing::timezone.

Referenced by iftime(), include_free(), pbx_builtin_execiftime(), and pbx_builtin_gotoiftime().

286 {
287  if (i->timezone) {
288  ast_free(i->timezone);
289  i->timezone = NULL;
290  }
291  return 0;
292 }
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182
char * timezone
Definition: pbx.h:177

◆ ast_devstate_to_extenstate()

enum ast_extension_states ast_devstate_to_extenstate ( enum ast_device_state  devstate)

Map devstate to an extension state.

Parameters
[in]devstatedevice state
Returns
the extension state mapping.

Definition at line 3006 of file pbx.c.

References AST_DEVICE_BUSY, AST_DEVICE_INUSE, AST_DEVICE_INVALID, AST_DEVICE_NOT_INUSE, AST_DEVICE_ONHOLD, AST_DEVICE_RINGING, AST_DEVICE_RINGINUSE, AST_DEVICE_TOTAL, AST_DEVICE_UNAVAILABLE, AST_DEVICE_UNKNOWN, AST_EXTENSION_BUSY, AST_EXTENSION_INUSE, AST_EXTENSION_NOT_INUSE, AST_EXTENSION_ONHOLD, AST_EXTENSION_RINGING, and AST_EXTENSION_UNAVAILABLE.

Referenced by ast_extension_state3(), AST_TEST_DEFINE(), and manager_show_dialplan().

3007 {
3008  switch (devstate) {
3009  case AST_DEVICE_ONHOLD:
3010  return AST_EXTENSION_ONHOLD;
3011  case AST_DEVICE_BUSY:
3012  return AST_EXTENSION_BUSY;
3013  case AST_DEVICE_UNKNOWN:
3014  return AST_EXTENSION_NOT_INUSE;
3016  case AST_DEVICE_INVALID:
3018  case AST_DEVICE_RINGINUSE:
3020  case AST_DEVICE_RINGING:
3021  return AST_EXTENSION_RINGING;
3022  case AST_DEVICE_INUSE:
3023  return AST_EXTENSION_INUSE;
3024  case AST_DEVICE_NOT_INUSE:
3025  return AST_EXTENSION_NOT_INUSE;
3026  case AST_DEVICE_TOTAL: /* not a device state, included for completeness */
3027  break;
3028  }
3029 
3030  return AST_EXTENSION_NOT_INUSE;
3031 }

◆ ast_exists_extension()

int ast_exists_extension ( struct ast_channel c,
const char *  context,
const char *  exten,
int  priority,
const char *  callerid 
)

Determine whether an extension exists.

Parameters
cthis is not important
contextwhich context to look in
extenwhich extension to search for
prioritypriority of the action within the extension
calleridcallerid to search for
Note
It is possible for autoservice to be started and stopped on c during this function call, it is important that c is not locked prior to calling this. Otherwise a deadlock may occur
Returns
If an extension within the given context(or callerid) with the given priority is found a non zero value will be returned. Otherwise, 0 is returned.
Examples:
/tmp/asterisk-shallow/main/app.c.

Definition at line 4170 of file pbx.c.

References E_MATCH, NULL, and pbx_extension_helper().

Referenced by __analog_ss_thread(), __ast_goto_if_exists(), __ast_pbx_run(), _macro_exec(), acf_isexten_exec(), action_originate(), add_to_regcontext(), analog_ss_thread(), ast_app_dtget(), ast_bridge_setup_after_goto(), ast_pbx_outgoing_exten_predial(), ast_sip_persistent_endpoint_update_state(), cb_events(), chan_pjsip_cng_tone_detected(), cli_console_dial(), comeback_goto(), conf_run(), console_dial(), dahdi_handle_dtmf(), dial_exec_full(), dialplan_has_destination_cb(), disa_exec(), dp_lookup(), dundi_lookup_local(), fax_detect_framehook(), findmeexec(), get_also_info(), get_destination(), get_refer_info(), gosub_exec(), handle_clear_alarms(), handle_gosub(), isexten_function_read(), jingle_new(), join_conference_bridge(), key_dial_page(), leave_voicemail(), local_call(), local_devicestate(), loopback_exists(), mgcp_ss(), minivm_greet_exec(), misdn_overlap_dial_task(), my_handle_dtmf(), new_subscribe(), onModeChanged(), ooh323_rtp_read(), options_on_rx_request(), pbx_builtin_waitexten(), phone_check_exception(), privacy_exec(), process_ast_dsp(), process_sdp(), readexten_exec(), refer_incoming_attended_request(), refer_incoming_blind_request(), register_peer_exten(), setsubstate(), show_debug_helper(), sip_new(), sip_read(), skinny_dialer(), socket_process_helper(), try_calling(), vm_authenticate(), and waitstream_core().

4171 {
4172  return pbx_extension_helper(c, NULL, context, exten, priority, NULL, callerid, E_MATCH, 0, 0);
4173 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define NULL
Definition: resample.c:96
static int priority
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
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, int *found, int combined_find_spawn)
The return value depends on the action:
Definition: pbx.c:2875

◆ ast_explicit_goto()

int ast_explicit_goto ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority 
)
Note
This function will handle locking the channel as needed.

Definition at line 6978 of file pbx.c.

References ast_channel_context_set(), ast_channel_exten_set(), ast_channel_flags(), ast_channel_lock, ast_channel_priority_set(), ast_channel_unlock, AST_FLAG_IN_AUTOLOOP, ast_strlen_zero, ast_test_flag, and ast_exten::priority.

Referenced by __ast_goto_if_exists(), app_control_continue(), ast_async_goto(), ast_bridge_setup_after_goto(), disa_exec(), handle_setpriority(), msg_route(), and pbx_parseable_goto().

6979 {
6980  if (!chan)
6981  return -1;
6982 
6983  ast_channel_lock(chan);
6984 
6985  if (!ast_strlen_zero(context))
6987  if (!ast_strlen_zero(exten))
6989  if (priority > -1) {
6990  /* see flag description in channel.h for explanation */
6992  --priority;
6993  }
6995  }
6996 
6997  ast_channel_unlock(chan);
6998 
6999  return 0;
7000 }
#define ast_channel_lock(chan)
Definition: channel.h:2837
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define ast_test_flag(p, flag)
Definition: utils.h:63
static int priority
#define ast_strlen_zero(a)
Definition: muted.c:73
#define ast_channel_unlock(chan)
Definition: channel.h:2838
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
void ast_channel_context_set(struct ast_channel *chan, const char *value)
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)

◆ ast_extension_close()

int ast_extension_close ( const char *  pattern,
const char *  data,
int  needmore 
)

Definition at line 2418 of file pbx.c.

References ast_log, E_CANMATCH, E_MATCHMORE, extension_match_core(), and LOG_WARNING.

Referenced by lua_find_extension(), and realtime_switch_common().

2419 {
2420  if (needmore != E_MATCHMORE && needmore != E_CANMATCH)
2421  ast_log(LOG_WARNING, "invalid argument %d\n", needmore);
2422  return extension_match_core(pattern, data, needmore);
2423 }
#define LOG_WARNING
Definition: logger.h:274
#define ast_log
Definition: astobj2.c:42
static int extension_match_core(const char *pattern, const char *data, enum ext_match_t mode)
Definition: pbx.c:2400

◆ ast_extension_cmp()

int ast_extension_cmp ( const char *  a,
const char *  b 
)

Determine if one extension should match before another.

Parameters
aextension to compare with b
bextension to compare with a

Checks whether or extension a should match before extension b

Return values
0if the two extensions have equal matching priority
1on a > b
-1on a < b

Definition at line 2183 of file pbx.c.

References ext_cmp().

Referenced by lua_extension_cmp().

2184 {
2185  int cmp;
2186 
2187  cmp = ext_cmp(a, b);
2188  if (cmp < 0) {
2189  return -1;
2190  }
2191  if (cmp > 0) {
2192  return 1;
2193  }
2194  return 0;
2195 }
static int ext_cmp(const char *left, const char *right)
Definition: pbx.c:2126
static struct test_val b
static struct test_val a

◆ ast_extension_match()

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

Determine if a given extension matches a given pattern (in NXX format)

Parameters
patternpattern to match
extensionextension to check against the pattern.

Checks whether or not the given extension matches the given pattern.

Return values
1on match
0on failure

Definition at line 4297 of file extconf.c.

References E_MATCH, and extension_match_core().

Referenced by ast_ignore_pattern(), do_say(), find_matching_priority(), load_module(), loopback_canmatch(), loopback_exists(), loopback_matchmore(), lua_find_extension(), manager_show_dialplan_helper(), matchcid(), misdn_cfg_is_msn_valid(), realtime_switch_common(), reload(), and show_dialplan_helper().

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

◆ ast_extension_patmatch()

int ast_extension_patmatch ( const char *  pattern,
const char *  data 
)

◆ ast_extension_state()

int ast_extension_state ( struct ast_channel c,
const char *  context,
const char *  exten 
)

Uses hint and devicestate callback to get the state of an extension.

Parameters
cthis is not important
contextwhich context to look in
extenwhich extension to get state
Returns
extension state as defined in the ast_extension_states enum

Uses hint and devicestate callback to get the state of an extension.

Definition at line 3165 of file pbx.c.

References internal_extension_state_extended(), and NULL.

Referenced by action_extensionstate(), extstate_read(), and get_queue_member_status().

3166 {
3168 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int internal_extension_state_extended(struct ast_channel *c, const char *context, const char *exten, struct ao2_container *device_state_info)
Definition: pbx.c:3141
#define NULL
Definition: resample.c:96
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_extension_state2str()

const char* ast_extension_state2str ( int  extension_state)

Return string representation of the state of an extension.

Parameters
extension_stateis the numerical state delivered by ast_extension_state
Returns
the state of an extension as string

Return string representation of the state of an extension.

Definition at line 3126 of file pbx.c.

References ARRAY_LEN, extension_states, and cfextension_states::text.

Referenced by action_extensionstate(), action_extensionstatelist(), AST_TEST_DEFINE(), exten_state_publisher_state_cb(), extensionstate_update(), handle_request_subscribe(), handle_show_hint(), handle_show_hints(), manager_show_dialplan(), manager_state_cb(), show_channels_cb(), skinny_extensionstate_cb(), and to_ami().

3127 {
3128  int i;
3129 
3130  for (i = 0; (i < ARRAY_LEN(extension_states)); i++) {
3131  if (extension_states[i].extension_state == extension_state)
3132  return extension_states[i].text;
3133  }
3134  return "Unknown";
3135 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
const char *const text
Definition: pbx.c:608
static const struct cfextension_states extension_states[]

◆ ast_extension_state_add()

int ast_extension_state_add ( const char *  context,
const char *  exten,
ast_state_cb_type  change_cb,
void *  data 
)

Add watcher for extension states.

Parameters
contextwhich context to look in
extenwhich extension to get state
change_cbcallback to call if state changed
datato pass to callback
Note
If context and exten are NULL then the added watcher is global. The change_cb is called for every extension's state change.
The change_cb is called if the state of an extension is changed.
Return values
-1on failure
0Global watcher added successfully
IDon success

Definition at line 3816 of file pbx.c.

References extension_state_add_destroy(), and NULL.

Referenced by __init_manager(), create_queue_member(), publisher_start(), and skinny_register().

3818 {
3819  return extension_state_add_destroy(context, exten, change_cb, NULL, data, 0);
3820 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define NULL
Definition: resample.c:96
static int extension_state_add_destroy(const char *context, const char *exten, ast_state_cb_type change_cb, ast_state_cb_destroy_type destroy_cb, void *data, int extended)
Definition: pbx.c:3722
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_extension_state_add_destroy()

int ast_extension_state_add_destroy ( const char *  context,
const char *  exten,
ast_state_cb_type  change_cb,
ast_state_cb_destroy_type  destroy_cb,
void *  data 
)

Add watcher for extension states with destructor.

Since
1.8.9
10.1.0
Parameters
contextwhich context to look in
extenwhich extension to get state
change_cbcallback to call if state changed
destroy_cbcallback to call when the watcher is destroyed.
datato pass to callbacks
Note
If context and exten are NULL then the added watcher is global. The change_cb is called for every extension's state change.
The change_cb is called if the state of an extension is changed.
The destroy_cb is called when the watcher is deleted so the watcher can release any associated resources.
Return values
-1on failure
0Global watcher added successfully
IDon success

Definition at line 3810 of file pbx.c.

References extension_state_add_destroy().

3812 {
3813  return extension_state_add_destroy(context, exten, change_cb, destroy_cb, data, 0);
3814 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int extension_state_add_destroy(const char *context, const char *exten, ast_state_cb_type change_cb, ast_state_cb_destroy_type destroy_cb, void *data, int extended)
Definition: pbx.c:3722
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_extension_state_add_destroy_extended()

int ast_extension_state_add_destroy_extended ( const char *  context,
const char *  exten,
ast_state_cb_type  change_cb,
ast_state_cb_destroy_type  destroy_cb,
void *  data 
)

Add watcher for extended extension states with destructor.

Since
11
Parameters
contextwhich context to look in
extenwhich extension to get state
change_cbcallback to call if state changed
destroy_cbcallback to call when the watcher is destroyed.
datato pass to callbacks
Note
If context and exten are NULL then the added watcher is global. The change_cb is called for every extension's state change.
The change_cb is called if the state of an extension is changed. The extended state is passed to the callback in the device_state_info member of ast_state_cb_info.
The destroy_cb is called when the watcher is deleted so the watcher can release any associated resources.
Return values
-1on failure
0Global watcher added successfully
IDon success

Definition at line 3822 of file pbx.c.

References extension_state_add_destroy().

Referenced by handle_request_subscribe(), and subscription_established().

3824 {
3825  return extension_state_add_destroy(context, exten, change_cb, destroy_cb, data, 1);
3826 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int extension_state_add_destroy(const char *context, const char *exten, ast_state_cb_type change_cb, ast_state_cb_destroy_type destroy_cb, void *data, int extended)
Definition: pbx.c:3722
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_extension_state_add_extended()

int ast_extension_state_add_extended ( const char *  context,
const char *  exten,
ast_state_cb_type  change_cb,
void *  data 
)

Add watcher for extended extension states.

Since
11
Parameters
contextwhich context to look in
extenwhich extension to get state
change_cbcallback to call if state changed
datato pass to callback
Note
If context and exten are NULL then the added watcher is global. The change_cb is called for every extension's state change.
The change_cb is called if the state of an extension is changed. The extended state is passed to the callback in the device_state_info member of ast_state_cb_info.
Return values
-1on failure
0Global watcher added successfully
IDon success

Definition at line 3828 of file pbx.c.

References extension_state_add_destroy(), and NULL.

3830 {
3831  return extension_state_add_destroy(context, exten, change_cb, NULL, data, 1);
3832 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define NULL
Definition: resample.c:96
static int extension_state_add_destroy(const char *context, const char *exten, ast_state_cb_type change_cb, ast_state_cb_destroy_type destroy_cb, void *data, int extended)
Definition: pbx.c:3722
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_extension_state_del()

int ast_extension_state_del ( int  id,
ast_state_cb_type  change_cb 
)

Deletes a state change watcher by ID.

Parameters
idof the state watcher to delete (0 for global watcher)
change_cbcallback to call if state changed (Used if id == 0 (global))
Return values
0success
-1failure

Definition at line 3849 of file pbx.c.

References ao2_callback, ao2_find, ao2_lock, ao2_ref, ao2_unlock, ast_hint::callbacks, find_hint_by_cb_id(), and OBJ_UNLINK.

Referenced by destroy_queue_member_cb(), dialog_unlink_all(), handle_request_subscribe(), skinny_session_cleanup(), subscription_shutdown(), and unload_module().

3850 {
3851  struct ast_state_cb *p_cur;
3852  int ret = -1;
3853 
3854  if (!id) { /* id == 0 is a callback without extension */
3855  if (!change_cb) {
3856  return ret;
3857  }
3859  if (p_cur) {
3860  ret = 0;
3861  ao2_ref(p_cur, -1);
3862  }
3863  } else { /* callback with extension, find the callback based on ID */
3864  struct ast_hint *hint;
3865 
3866  ao2_lock(hints);/* Locked to hold off ast_merge_contexts_and_delete */
3867  hint = ao2_callback(hints, 0, find_hint_by_cb_id, &id);
3868  if (hint) {
3869  p_cur = ao2_find(hint->callbacks, &id, OBJ_UNLINK);
3870  if (p_cur) {
3871  ret = 0;
3872  ao2_ref(p_cur, -1);
3873  }
3874  ao2_ref(hint, -1);
3875  }
3876  ao2_unlock(hints);
3877  }
3878 
3879  return ret;
3880 }
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
ast_state_cb: An extension state notify register item
Definition: pbx.c:301
#define ao2_unlock(a)
Definition: astobj2.h:730
ast_state_cb_type change_cb
Definition: pbx.c:309
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ao2_lock(a)
Definition: astobj2.h:718
Structure for dial plan hints.
Definition: pbx.c:324
struct ao2_container * callbacks
Definition: pbx.c:332
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
static int find_hint_by_cb_id(void *obj, void *arg, int flags)
Find Hint by callback id.
Definition: pbx.c:3835
static struct ao2_container * statecbs
Definition: pbx.c:803

◆ ast_extension_state_extended()

int ast_extension_state_extended ( struct ast_channel c,
const char *  context,
const char *  exten,
struct ao2_container **  device_state_info 
)

Uses hint and devicestate callback to get the extended state of an extension.

Since
11
Parameters
cthis is not important
contextwhich context to look in
extenwhich extension to get state
[out]device_state_infoptr to an ao2_container with extended state info, must be unref'd after use.
Returns
extension state as defined in the ast_extension_states enum

Uses hint and devicestate callback to get the extended state of an extension.

Definition at line 3171 of file pbx.c.

References alloc_device_state_info(), ao2_ref, container, get_device_state_causing_channels(), internal_extension_state_extended(), and NULL.

Referenced by exten_state_data_alloc(), and handle_request_subscribe().

3173 {
3174  struct ao2_container *container = NULL;
3175  int ret;
3176 
3177  if (device_state_info) {
3178  container = alloc_device_state_info();
3179  }
3180 
3181  ret = internal_extension_state_extended(c, context, exten, container);
3182  if (ret < 0 && container) {
3183  ao2_ref(container, -1);
3184  container = NULL;
3185  }
3186 
3187  if (device_state_info) {
3189  *device_state_info = container;
3190  }
3191 
3192  return ret;
3193 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static struct ao2_container * alloc_device_state_info(void)
Definition: pbx.c:3076
static int internal_extension_state_extended(struct ast_channel *c, const char *context, const char *exten, struct ao2_container *device_state_info)
Definition: pbx.c:3141
#define NULL
Definition: resample.c:96
static void get_device_state_causing_channels(struct ao2_container *c)
Definition: pbx.c:3289
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ao2_container * container
Definition: res_fax.c:502
Generic container type.
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_findlabel_extension()

int ast_findlabel_extension ( struct ast_channel c,
const char *  context,
const char *  exten,
const char *  label,
const char *  callerid 
)

Find the priority of an extension that has the specified label.

Parameters
cthis is not important
contextwhich context to look in
extenwhich extension to search for
labellabel of the action within the extension to match to priority
calleridcallerid to search for
Note
It is possible for autoservice to be started and stopped on c during this function call, it is important that c is not locked prior to calling this. Otherwise a deadlock may occur
Return values
thepriority which matches the given label in the extension
-1if not found.

Definition at line 4175 of file pbx.c.

References E_FINDLABEL, NULL, and pbx_extension_helper().

Referenced by action_originate(), action_redirect(), ari_channels_handle_originate_with_id(), ast_ari_channels_continue_in_dialplan(), handle_gosub(), handle_setpriority(), isexten_function_read(), and pbx_parseable_goto().

4176 {
4177  return pbx_extension_helper(c, NULL, context, exten, 0, label, callerid, E_FINDLABEL, 0, 0);
4178 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define NULL
Definition: resample.c:96
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
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, int *found, int combined_find_spawn)
The return value depends on the action:
Definition: pbx.c:2875

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

Find the priority of an extension that has the specified label.

Note
It is possible for autoservice to be started and stopped on c during this function call, it is important that c is not locked prior to calling this. Otherwise a deadlock may occur
This function is the same as ast_findlabel_extension, except that it accepts a pointer to an ast_context structure to specify the context instead of the name of the context. Otherwise, the functions behave the same.

Definition at line 4978 of file extconf.c.

References E_FINDLABEL, NULL, and pbx_extension_helper().

Referenced by pbx_load_config().

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

◆ ast_func_read()

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

executes a read operation on a function

Parameters
chanChannel to execute on
functionData containing the function call string (will be modified)
workspaceA pointer to safe memory to use for a return value
lenthe number of bytes in workspace

This application executes a function in read mode on a given channel.

Return values
0success
non-zerofailure

Definition at line 599 of file pbx_functions.c.

References __ast_module_user_add(), __ast_module_user_remove(), args, ast_copy_string(), ast_custom_function_find(), ast_free, ast_log, ast_str_buffer(), ast_str_create, ast_str_size(), ast_strdupa, copy(), func_args(), is_read_allowed(), LOG_ERROR, ast_custom_function::mod, NULL, ast_custom_function::read, ast_custom_function::read2, and str.

Referenced by action_getvar(), assign_uuid(), fetch_access_token(), fetch_google_access_token(), generate_status(), handle_getvariable(), lua_get_variable_value(), and pbx_substitute_variables_helper_full().

600 {
601  char *copy = ast_strdupa(function);
602  char *args = func_args(copy);
603  struct ast_custom_function *acfptr = ast_custom_function_find(copy);
604  int res;
605  struct ast_module_user *u = NULL;
606 
607  if (acfptr == NULL) {
608  ast_log(LOG_ERROR, "Function %s not registered\n", copy);
609  } else if (!acfptr->read && !acfptr->read2) {
610  ast_log(LOG_ERROR, "Function %s cannot be read\n", copy);
611  } else if (!is_read_allowed(acfptr)) {
612  ast_log(LOG_ERROR, "Dangerous function %s read blocked\n", copy);
613  } else if (acfptr->read) {
614  if (acfptr->mod) {
615  u = __ast_module_user_add(acfptr->mod, chan);
616  }
617  res = acfptr->read(chan, copy, args, workspace, len);
618  if (acfptr->mod && u) {
619  __ast_module_user_remove(acfptr->mod, u);
620  }
621 
622  return res;
623  } else {
624  struct ast_str *str = ast_str_create(16);
625 
626  if (acfptr->mod) {
627  u = __ast_module_user_add(acfptr->mod, chan);
628  }
629  res = acfptr->read2(chan, copy, args, &str, 0);
630  if (acfptr->mod && u) {
631  __ast_module_user_remove(acfptr->mod, u);
632  }
633  ast_copy_string(workspace, ast_str_buffer(str), len > ast_str_size(str) ? ast_str_size(str) : len);
634  ast_free(str);
635 
636  return res;
637  }
638 
639  return -1;
640 }
size_t ast_str_size(const struct ast_str *buf)
Returns the current maximum length (without reallocation) of the current buffer.
Definition: strings.h:699
static int is_read_allowed(struct ast_custom_function *acfptr)
Determines whether execution of a custom function&#39;s read function is allowed.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
void __ast_module_user_remove(struct ast_module *, struct ast_module_user *)
Definition: loader.c:824
static int copy(char *infile, char *outfile)
Utility function to copy a file.
struct ast_module * mod
Definition: pbx.h:142
const char * str
Definition: app_jack.c:147
const char * args
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
static char * func_args(char *function)
return a pointer to the arguments of the function, and terminates the function name with &#39;\0&#39; ...
Data structure associated with a custom dialplan function.
Definition: pbx.h:118
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
struct ast_module_user * __ast_module_user_add(struct ast_module *, struct ast_channel *)
Definition: loader.c:798
#define LOG_ERROR
Definition: logger.h:285
ast_acf_read2_fn_t read2
Definition: pbx.h:137
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define ast_free(a)
Definition: astmm.h:182
struct ast_custom_function * ast_custom_function_find(const char *name)
ast_acf_read_fn_t read
Definition: pbx.h:129
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
#define ast_str_create(init_len)
Create a malloc&#39;ed dynamic length string.
Definition: strings.h:620

◆ ast_func_read2()

int ast_func_read2 ( struct ast_channel chan,
const char *  function,
struct ast_str **  str,
ssize_t  maxlen 
)

executes a read operation on a function

Parameters
chanChannel to execute on
functionData containing the function call string (will be modified)
strA dynamic string buffer into which to place the result.
maxlen<0 if the dynamic buffer should not grow; >0 if the dynamic buffer should be limited to that number of bytes; 0 if the dynamic buffer has no upper limit

This application executes a function in read mode on a given channel.

Return values
0success
non-zerofailure

Definition at line 642 of file pbx_functions.c.

References __ast_module_user_add(), __ast_module_user_remove(), args, ast_custom_function_find(), ast_log, ast_str_buffer(), ast_str_make_space, ast_str_reset(), ast_str_size(), ast_strdupa, copy(), func_args(), is_read_allowed(), LOG_ERROR, maxsize, ast_custom_function::mod, NULL, ast_custom_function::read, ast_custom_function::read2, ast_custom_function::read_max, and VAR_BUF_SIZE.

Referenced by ast_ari_channels_get_channel_var(), ast_str_substitute_variables_full(), AST_TEST_DEFINE(), and channel_get_external_vars().

643 {
644  char *copy = ast_strdupa(function);
645  char *args = func_args(copy);
646  struct ast_custom_function *acfptr = ast_custom_function_find(copy);
647  int res;
648  struct ast_module_user *u = NULL;
649 
650  if (acfptr == NULL) {
651  ast_log(LOG_ERROR, "Function %s not registered\n", copy);
652  } else if (!acfptr->read && !acfptr->read2) {
653  ast_log(LOG_ERROR, "Function %s cannot be read\n", copy);
654  } else if (!is_read_allowed(acfptr)) {
655  ast_log(LOG_ERROR, "Dangerous function %s read blocked\n", copy);
656  } else {
657  if (acfptr->mod) {
658  u = __ast_module_user_add(acfptr->mod, chan);
659  }
660  ast_str_reset(*str);
661  if (acfptr->read2) {
662  /* ast_str enabled */
663  res = acfptr->read2(chan, copy, args, str, maxlen);
664  } else {
665  /* Legacy function pointer, allocate buffer for result */
666  int maxsize = ast_str_size(*str);
667 
668  if (maxlen > -1) {
669  if (maxlen == 0) {
670  if (acfptr->read_max) {
671  maxsize = acfptr->read_max;
672  } else {
673  maxsize = VAR_BUF_SIZE;
674  }
675  } else {
676  maxsize = maxlen;
677  }
678  ast_str_make_space(str, maxsize);
679  }
680  res = acfptr->read(chan, copy, args, ast_str_buffer(*str), maxsize);
681  }
682  if (acfptr->mod && u) {
683  __ast_module_user_remove(acfptr->mod, u);
684  }
685 
686  return res;
687  }
688 
689  return -1;
690 }
size_t ast_str_size(const struct ast_str *buf)
Returns the current maximum length (without reallocation) of the current buffer.
Definition: strings.h:699
static int is_read_allowed(struct ast_custom_function *acfptr)
Determines whether execution of a custom function&#39;s read function is allowed.
#define ast_str_make_space(buf, new_len)
Definition: strings.h:780
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
void __ast_module_user_remove(struct ast_module *, struct ast_module_user *)
Definition: loader.c:824
static int copy(char *infile, char *outfile)
Utility function to copy a file.
struct ast_module * mod
Definition: pbx.h:142
const char * args
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
static char * func_args(char *function)
return a pointer to the arguments of the function, and terminates the function name with &#39;\0&#39; ...
Data structure associated with a custom dialplan function.
Definition: pbx.h:118
size_t read_max
Definition: pbx.h:139
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
struct ast_module_user * __ast_module_user_add(struct ast_module *, struct ast_channel *)
Definition: loader.c:798
#define LOG_ERROR
Definition: logger.h:285
ast_acf_read2_fn_t read2
Definition: pbx.h:137
#define VAR_BUF_SIZE
Definition: pbx_private.h:68
static int maxsize
struct ast_custom_function * ast_custom_function_find(const char *name)
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition: strings.h:653
ast_acf_read_fn_t read
Definition: pbx.h:129

◆ ast_func_write()

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

executes a write operation on a function

Parameters
chanChannel to execute on
functionData containing the function call string (will be modified)
valueA value parameter to pass for writing

This application executes a function in write mode on a given channel.

Return values
0success
non-zerofailure

Definition at line 692 of file pbx_functions.c.

References __ast_module_user_add(), __ast_module_user_remove(), args, ast_custom_function_find(), ast_log, ast_strdupa, copy(), func_args(), is_write_allowed(), LOG_ERROR, ast_custom_function::mod, NULL, and ast_custom_function::write.

Referenced by ast_channel_hangupcause_hash_set(), AST_TEST_DEFINE(), chanavail_exec(), conf_run(), confbridge_exec(), fetch_google_access_token(), pbx_builtin_pushvar_helper(), pbx_builtin_setvar_helper(), setup_profile_bridge(), setup_profile_caller(), and setup_profile_paged().

693 {
694  char *copy = ast_strdupa(function);
695  char *args = func_args(copy);
696  struct ast_custom_function *acfptr = ast_custom_function_find(copy);
697 
698  if (acfptr == NULL) {
699  ast_log(LOG_ERROR, "Function %s not registered\n", copy);
700  } else if (!acfptr->write) {
701  ast_log(LOG_ERROR, "Function %s cannot be written to\n", copy);
702  } else if (!is_write_allowed(acfptr)) {
703  ast_log(LOG_ERROR, "Dangerous function %s write blocked\n", copy);
704  } else {
705  int res;
706  struct ast_module_user *u = NULL;
707 
708  if (acfptr->mod) {
709  u = __ast_module_user_add(acfptr->mod, chan);
710  }
711  res = acfptr->write(chan, copy, args, value);
712  if (acfptr->mod && u) {
713  __ast_module_user_remove(acfptr->mod, u);
714  }
715 
716  return res;
717  }
718 
719  return -1;
720 }
void __ast_module_user_remove(struct ast_module *, struct ast_module_user *)
Definition: loader.c:824
static int copy(char *infile, char *outfile)
Utility function to copy a file.
struct ast_module * mod
Definition: pbx.h:142
static int is_write_allowed(struct ast_custom_function *acfptr)
Determines whether execution of a custom function&#39;s write function is allowed.
const char * args
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
#define ast_log
Definition: astobj2.c:42
static char * func_args(char *function)
return a pointer to the arguments of the function, and terminates the function name with &#39;\0&#39; ...
Data structure associated with a custom dialplan function.
Definition: pbx.h:118
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
ast_acf_write_fn_t write
Definition: pbx.h:141
struct ast_module_user * __ast_module_user_add(struct ast_module *, struct ast_channel *)
Definition: loader.c:798
#define LOG_ERROR
Definition: logger.h:285
struct ast_custom_function * ast_custom_function_find(const char *name)

◆ ast_get_context_name()

static const char * ast_get_context_name ( struct ast_context con)

◆ ast_get_context_registrar()

const char* ast_get_context_registrar ( struct ast_context c)

Definition at line 8547 of file pbx.c.

References NULL, and ast_context::registrar.

Referenced by handle_cli_dialplan_save(), show_debug_helper(), and show_dialplan_helper().

8548 {
8549  return c ? c->registrar : NULL;
8550 }
#define NULL
Definition: resample.c:96
char * registrar
Definition: pbx.c:293

◆ ast_get_extension_app()

const char* ast_get_extension_app ( struct ast_exten e)

◆ ast_get_extension_app_data()

void* ast_get_extension_app_data ( struct ast_exten e)

Definition at line 8582 of file pbx.c.

References ast_exten::data, and NULL.

Referenced by _macro_exec(), add_extension(), ast_get_hint(), ast_str_get_hint(), handle_cli_dialplan_save(), manager_show_dialplan_helper(), parking_blind_transfer_park(), and print_ext().

8583 {
8584  return e ? e->data : NULL;
8585 }
#define NULL
Definition: resample.c:96
void * data
Definition: pbx.c:248

◆ ast_get_extension_cidmatch()

const char* ast_get_extension_cidmatch ( struct ast_exten e)

Definition at line 8572 of file pbx.c.

References ast_exten::cidmatch_display, and NULL.

Referenced by complete_dialplan_remove_extension(), find_matching_priority(), handle_cli_dialplan_save(), and test_exten().

8573 {
8574  return e ? e->cidmatch_display : NULL;
8575 }
#define NULL
Definition: resample.c:96
const char * cidmatch_display
Definition: pbx.c:242

◆ ast_get_extension_context()

struct ast_context* ast_get_extension_context ( struct ast_exten exten)

Definition at line 8524 of file pbx.c.

References NULL, and ast_exten::parent.

Referenced by ast_add_hint(), ast_change_hint(), ast_remove_hint(), device_state_notify_callbacks(), extension_is_compatible(), handle_show_hint(), handle_show_hints(), presence_state_notify_callbacks(), print_hintdevices_key(), and print_hints_key().

8525 {
8526  return exten ? exten->parent : NULL;
8527 }
#define NULL
Definition: resample.c:96
struct ast_context * parent
Definition: pbx.c:245

◆ ast_get_extension_label()

const char* ast_get_extension_label ( struct ast_exten e)

Definition at line 8534 of file pbx.c.

References ast_exten::label, and NULL.

Referenced by handle_cli_dialplan_save(), manager_show_dialplan_helper(), and show_dialplan_helper().

8535 {
8536  return exten ? exten->label : NULL;
8537 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define NULL
Definition: resample.c:96

◆ ast_get_extension_matchcid()

int ast_get_extension_matchcid ( struct ast_exten e)

Definition at line 8567 of file pbx.c.

References ast_exten::matchcid.

Referenced by complete_dialplan_remove_extension(), find_matching_priority(), and handle_cli_dialplan_save().

8568 {
8569  return e ? e->matchcid : 0;
8570 }
int matchcid
Definition: pbx.c:240

◆ ast_get_extension_name()

const char* ast_get_extension_name ( struct ast_exten exten)

◆ ast_get_extension_priority()

int ast_get_extension_priority ( struct ast_exten exten)

Definition at line 8539 of file pbx.c.

References ast_exten::priority.

Referenced by complete_dialplan_remove_extension(), find_matching_priority(), handle_cli_dialplan_save(), manager_show_dialplan_helper(), and print_ext().

8540 {
8541  return exten ? exten->priority : -1;
8542 }
int priority
Definition: pbx.c:243

◆ ast_get_extension_registrar()

const char* ast_get_extension_registrar ( struct ast_exten e)

◆ ast_get_extension_registrar_file()

const char* ast_get_extension_registrar_file ( struct ast_exten e)

Get name of configuration file used by registrar to register this extension.

Return values
NULLif registrar did not indicate config file when registering the extension
nameof the file used to register the extension

Definition at line 8557 of file pbx.c.

References NULL, and ast_exten::registrar_file.

Referenced by show_dialplan_helper_extension_output().

8558 {
8559  return e ? e->registrar_file : NULL;
8560 }
#define NULL
Definition: resample.c:96
const char * registrar_file
Definition: pbx.c:254

◆ ast_get_extension_registrar_line()

int ast_get_extension_registrar_line ( struct ast_exten e)

Get line number of configuration file used by registrar to register this extension.

Return values
0if the line wasn't indicated when the extension was registered
positiveinteger indicating what line in the config file was responsible for registering the extension.

Definition at line 8562 of file pbx.c.

References ast_exten::registrar_line.

Referenced by show_dialplan_helper_extension_output().

8563 {
8564  return e ? e->registrar_line : 0;
8565 }
int registrar_line
Definition: pbx.c:255

◆ ast_get_hint()

int ast_get_hint ( char *  hint,
int  hintsize,
char *  name,
int  namesize,
struct ast_channel c,
const char *  context,
const char *  exten 
)

If an extension hint exists, return non-zero.

Parameters
hintbuffer for hint
hintsizesize of hint buffer, in bytes
namebuffer for name portion of hint
namesizesize of name buffer
cChannel from which to return the hint. This is only important when the hint or name contains an expression to be expanded.
contextwhich context to look in
extenwhich extension to search for
Returns
If an extension within the given context with the priority PRIORITY_HINT is found, a non zero value will be returned. Otherwise, 0 is returned.

If an extension hint exists, return non-zero.

Definition at line 4132 of file pbx.c.

References ast_copy_string(), ast_get_extension_app(), ast_get_extension_app_data(), ast_hint_extension(), and tmp().

Referenced by action_extensionstate(), device_state_cb(), get_cid_name(), get_destination(), hint_read(), manager_state_cb(), skinny_extensionstate_cb(), and state_notify_build_xml().

4133 {
4134  struct ast_exten *e = ast_hint_extension(c, context, exten);
4135 
4136  if (e) {
4137  if (hint)
4138  ast_copy_string(hint, ast_get_extension_app(e), hintsize);
4139  if (name) {
4140  const char *tmp = ast_get_extension_app_data(e);
4141  if (tmp)
4142  ast_copy_string(name, tmp, namesize);
4143  }
4144  return -1;
4145  }
4146  return 0;
4147 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
ast_exten: An extension The dialplan is saved as a linked list with each context having it&#39;s own link...
Definition: pbx.c:237
static int tmp()
Definition: bt_open.c:389
void * ast_get_extension_app_data(struct ast_exten *e)
Definition: pbx.c:8582
static struct ast_exten * ast_hint_extension(struct ast_channel *c, const char *context, const char *exten)
Definition: pbx.c:2997
static const char name[]
Definition: cdr_mysql.c:74
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
const char * ast_get_extension_app(struct ast_exten *e)
Definition: pbx.c:8577
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_get_ignorepat_name()

const char* ast_get_ignorepat_name ( const struct ast_ignorepat ip)

◆ ast_get_ignorepat_registrar()

const char* ast_get_ignorepat_registrar ( const struct ast_ignorepat ip)

◆ ast_get_include_name()

const char* ast_get_include_name ( const struct ast_include include)

◆ ast_get_include_registrar()

const char* ast_get_include_registrar ( const struct ast_include i)

◆ ast_get_switch_data()

const char* ast_get_switch_data ( const struct ast_sw sw)

◆ ast_get_switch_eval()

int ast_get_switch_eval ( const struct ast_sw sw)

Definition at line 58 of file pbx_sw.c.

References ast_sw::eval.

Referenced by context_merge_incls_swits_igps_other_registrars(), and pbx_find_extension().

59 {
60  return sw->eval;
61 }
int eval
Definition: pbx_sw.c:43

◆ ast_get_switch_name()

const char* ast_get_switch_name ( const struct ast_sw sw)

◆ ast_get_switch_registrar()

const char* ast_get_switch_registrar ( const struct ast_sw sw)

◆ ast_goto_if_exists()

int ast_goto_if_exists ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority 
)
Note
This function will handle locking the channel as needed.

Definition at line 8774 of file pbx.c.

References __ast_goto_if_exists().

Referenced by ast_bridge_setup_after_goto(), background_detect_exec(), channel_spy(), common_exec(), conf_run(), goto_exten(), onedigit_goto(), select_entry(), valid_exit(), vm_execmain(), and vmauthenticate().

8775 {
8776  return __ast_goto_if_exists(chan, context, exten, priority, 0);
8777 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int __ast_goto_if_exists(struct ast_channel *chan, const char *context, const char *exten, int priority, int async)
Definition: pbx.c:8753
static int priority
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_hashtab_compare_contexts()

int ast_hashtab_compare_contexts ( const void *  ah_a,
const void *  ah_b 
)

hashtable functions for contexts

Definition at line 589 of file ael_main.c.

References ast_hashtab_hash_contexts(), bc, and ast_context::name.

Referenced by ast_context_find_or_create(), lua_register_hints(), lua_register_switches(), main(), pbx_find_extension(), and pbx_load_module().

590 {
591  return 0;
592 }

◆ ast_hashtab_hash_contexts()

unsigned int ast_hashtab_hash_contexts ( const void *  obj)

◆ ast_hint_presence_state()

int ast_hint_presence_state ( struct ast_channel c,
const char *  context,
const char *  exten,
char **  subtype,
char **  message 
)

Uses hint and presence state callback to get the presence state of an extension.

Parameters
cthis is not important
contextwhich context to look in
extenwhich extension to get state
[out]subtypeFurther information regarding the presence returned
[out]messageCustom message further describing current presence
Note
The subtype and message are dynamically allocated and must be freed by the caller of this function.
Returns
returns the presence state value.

Definition at line 3221 of file pbx.c.

References ast_exten::app, ast_add_extension(), ast_free_ptr(), ast_hint_extension(), ast_strdup, ast_exten::cidmatch, ast_exten::data, ast_exten::exten, extension_presence_state_helper(), ast_exten::label, ast_exten::matchcid, ast_context::name, NULL, ast_exten::parent, ast_exten::priority, and ast_exten::registrar.

Referenced by exten_state_data_alloc(), and handle_request_subscribe().

3222 {
3223  struct ast_exten *e;
3224 
3225  if (!(e = ast_hint_extension(c, context, exten))) { /* Do we have a hint for this extension ? */
3226  return -1; /* No hint, return -1 */
3227  }
3228 
3229  if (e->exten[0] == '_') {
3230  /* Create this hint on-the-fly */
3231  ast_add_extension(e->parent->name, 0, exten, e->priority, e->label,
3232  e->matchcid ? e->cidmatch : NULL, e->app, ast_strdup(e->data), ast_free_ptr,
3233  e->registrar);
3234  if (!(e = ast_hint_extension(c, context, exten))) {
3235  /* Improbable, but not impossible */
3236  return -1;
3237  }
3238  }
3239 
3240  return extension_presence_state_helper(e, subtype, message);
3241 }
const char * label
Definition: pbx.c:244
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
ast_exten: An extension The dialplan is saved as a linked list with each context having it&#39;s own link...
Definition: pbx.c:237
static int extension_presence_state_helper(struct ast_exten *e, char **subtype, char **message)
Definition: pbx.c:3195
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
void ast_free_ptr(void *ptr)
free() wrapper
Definition: astmm.c:1771
const char * registrar
Definition: pbx.c:253
int matchcid
Definition: pbx.c:240
int priority
Definition: pbx.c:243
static struct ast_exten * ast_hint_extension(struct ast_channel *c, const char *context, const char *exten)
Definition: pbx.c:2997
char * exten
Definition: pbx.c:238
char name[0]
Definition: pbx.c:297
int ast_add_extension(const char *context, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
Add and extension to an extension context.
Definition: pbx.c:6961
const char * cidmatch
Definition: pbx.c:241
const char * app
Definition: pbx.c:246
struct ast_context * parent
Definition: pbx.c:245
void * data
Definition: pbx.c:248
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_ignore_pattern()

int ast_ignore_pattern ( const char *  context,
const char *  pattern 
)

Checks to see if a number should be ignored.

Parameters
contextcontext to search within
patternto check whether it should be ignored or not

Check if a number should be ignored with respect to dialtone cancellation.

Return values
0if the pattern should not be ignored
non-zeroif the pattern should be ignored
Examples:
/tmp/asterisk-shallow/main/app.c.

Definition at line 6912 of file pbx.c.

References ast_context_find(), ast_context_ignorepats_count(), ast_context_ignorepats_get(), ast_extension_match(), ast_get_ignorepat_name(), ast_rdlock_contexts(), and ast_unlock_contexts().

Referenced by __analog_ss_thread(), analog_ss_thread(), ast_app_dtget(), disa_exec(), dp_lookup(), dundi_lookup_local(), and mgcp_ss().

6913 {
6914  int ret = 0;
6915  struct ast_context *con;
6916 
6918  con = ast_context_find(context);
6919  if (con) {
6920  int idx;
6921 
6922  for (idx = 0; idx < ast_context_ignorepats_count(con); idx++) {
6923  const struct ast_ignorepat *pat = ast_context_ignorepats_get(con, idx);
6924 
6926  ret = 1;
6927  break;
6928  }
6929  }
6930  }
6932 
6933  return ret;
6934 }
const char pattern[0]
Definition: pbx_ignorepat.c:39
const struct ast_ignorepat * ast_context_ignorepats_get(const struct ast_context *con, int idx)
Definition: pbx.c:8726
struct ast_context * ast_context_find(const char *name)
Find a context.
Definition: pbx.c:2443
int ast_rdlock_contexts(void)
Read locks the context list.
Definition: pbx.c:8488
const char * ast_get_ignorepat_name(const struct ast_ignorepat *ip)
Definition: pbx_ignorepat.c:42
int ast_context_ignorepats_count(const struct ast_context *con)
Definition: pbx.c:8721
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8493
ast_ignorepat: Ignore patterns in dial plan
Definition: pbx_ignorepat.c:37
int ast_extension_match(const char *pattern, const char *data)
Determine if a given extension matches a given pattern (in NXX format)
Definition: pbx.c:2413
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
ast_context: An extension context - must remain in sync with fake_context
Definition: pbx.c:284

◆ ast_matchmore_extension()

int ast_matchmore_extension ( struct ast_channel c,
const char *  context,
const char *  exten,
int  priority,
const char *  callerid 
)

Looks to see if adding anything to this extension might match something. (exists ^ canmatch)

Parameters
cnot really important XXX
contextcontext to serach within
extenextension to check
prioritypriority of extension path
calleridcallerid of extension being searched for
Note
It is possible for autoservice to be started and stopped on c during this function call, it is important that c is not locked prior to calling this. Otherwise a deadlock may occur
Returns
If "exten" could match a valid extension in this context with some more digits, return non-zero. Does NOT return non-zero if this is an exact-match only. Basically, when this returns 0, no matter what you add to exten, it's not going to be a valid extension anymore
Examples:
/tmp/asterisk-shallow/main/app.c.

Definition at line 4190 of file pbx.c.

References E_MATCHMORE, NULL, and pbx_extension_helper().

Referenced by __analog_ss_thread(), __ast_pbx_run(), analog_ss_thread(), ast_app_dtget(), collect_digits(), disa_exec(), dp_lookup(), dundi_lookup_local(), handle_clear_alarms(), key_dial_page(), loopback_matchmore(), mgcp_ss(), pbx_builtin_background(), readexten_exec(), and skinny_dialer().

4191 {
4192  return pbx_extension_helper(c, NULL, context, exten, priority, NULL, callerid, E_MATCHMORE, 0, 0);
4193 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
#define NULL
Definition: resample.c:96
static int priority
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
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, int *found, int combined_find_spawn)
The return value depends on the action:
Definition: pbx.c:2875

◆ ast_merge_contexts_and_delete()

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

Merge the temporary contexts into a global contexts list and delete from the global list the ones that are being added.

Parameters
extcontextspointer to the ast_context structure
exttablepointer to the ast_hashtab structure that contains all the elements in extcontexts
registrarof the context; if it's set the routine will delete all contexts that belong to that registrar; if NULL only the contexts that are specified in extcontexts

Definition at line 639 of file conf2ael.c.

References __ast_internal_context_destroy(), ao2_callback, ao2_container_count(), ao2_find, ao2_iterator_destroy(), AO2_ITERATOR_DONTLOCK, ao2_iterator_init(), ao2_iterator_next, ao2_link, ao2_lock, ao2_ref, ao2_unlock, ast_exten::app, ast_add_extension_nolock(), ast_calloc, ast_copy_string(), ast_free, ast_free_ptr(), ast_get_context_name(), ast_hashtab_destroy(), ast_hashtab_end_traversal(), ast_hashtab_next(), ast_hashtab_start_traversal, ast_hint_extension_nolock(), AST_HINT_UPDATE_DEVICE, AST_LIST_HEAD_NOLOCK_INIT_VALUE, AST_LIST_INSERT_HEAD, AST_LIST_INSERT_TAIL, AST_LIST_REMOVE_HEAD, ast_mutex_lock, ast_mutex_unlock, ast_strdup, ast_tvdiff_us(), ast_tvnow(), ast_unlock_contexts(), ast_verb, ast_wrlock_contexts(), ast_hint::callbacks, store_hint::callbacks, ast_state_cb::change_cb, store_hint::context, context_merge(), context_merge_lock, context_table_create_autohints(), contexts, contexts_table, ast_exten::data, ast_state_cb::data, E_MATCH, execute_state_callback(), ast_exten::exten, ast_hint::exten, store_hint::exten, ast_hint::last_presence_message, store_hint::last_presence_message, ast_hint::last_presence_state, store_hint::last_presence_state, ast_hint::last_presence_subtype, store_hint::last_presence_subtype, ast_hint::laststate, store_hint::laststate, localized_merge_contexts_and_delete(), ast_context::name, ast_exten::next, ast_context::next, NULL, OBJ_UNLINK, ast_exten::parent, pbx_find_extension(), PRIORITY_HINT, ast_exten::registrar, pbx_find_info::stacklen, and tmp().

Referenced by ast_context_verify_includes(), lua_reload_extensions(), and pbx_load_module().

640 {
641  localized_merge_contexts_and_delete(extcontexts, exttable, registrar);
642 }
void localized_merge_contexts_and_delete(struct ast_context **extcontexts, void *tab, const char *registrar)
Definition: extconf.c:5618
static char * registrar
Definition: pbx_ael.c:78

◆ ast_parseable_goto()

int ast_parseable_goto ( struct ast_channel chan,
const char *  goto_string 
)
Note
This function will handle locking the channel as needed.
Examples:
/tmp/asterisk-shallow/main/app.c.

Definition at line 8840 of file pbx.c.

References pbx_parseable_goto().

Referenced by _while_exec(), ast_bridge_setup_after_goto(), dial_exec_full(), gosub_exec(), ivr_dispatch(), pbx_builtin_goto(), and while_continue_exec().

8841 {
8842  return pbx_parseable_goto(chan, goto_string, 0);
8843 }
static int pbx_parseable_goto(struct ast_channel *chan, const char *goto_string, int async)
Definition: pbx.c:8784

◆ ast_pbx_h_exten_run()

void ast_pbx_h_exten_run ( struct ast_channel chan,
const char *  context 
)

Run the h exten from the given context.

Since
11.0
Parameters
chanChannel to run the h exten on.
contextContext the h exten is in.
Returns
Nothing

Definition at line 4200 of file pbx.c.

References ast_channel_caller(), ast_channel_context(), ast_channel_context_set(), ast_channel_exten(), ast_channel_exten_set(), ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_priority(), ast_channel_priority_set(), ast_channel_unlock, ast_debug, AST_FLAG_BRIDGE_HANGUP_RUN, AST_FLAG_IN_AUTOLOOP, ast_set2_flag, ast_set_flag, AST_SOFTHANGUP_HANGUP_EXEC, ast_softhangup_nolock(), ast_spawn_extension(), ast_test_flag, ast_verb, NULL, and S_COR.

Referenced by __ast_pbx_run(), and ast_bridge_setup_after_goto().

4201 {
4202  int autoloopflag;
4203  int found;
4204  int spawn_error;
4205 
4206  ast_channel_lock(chan);
4207 
4208  /*
4209  * Make sure that the channel is marked as hungup since we are
4210  * going to run the h exten on it.
4211  */
4213 
4214  /* Set h exten location */
4215  if (context != ast_channel_context(chan)) {
4217  }
4218  ast_channel_exten_set(chan, "h");
4219  ast_channel_priority_set(chan, 1);
4220 
4221  /* Save autoloop flag */
4222  autoloopflag = ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_AUTOLOOP);
4224  ast_channel_unlock(chan);
4225 
4226  for (;;) {
4227  spawn_error = ast_spawn_extension(chan, ast_channel_context(chan),
4229  S_COR(ast_channel_caller(chan)->id.number.valid,
4230  ast_channel_caller(chan)->id.number.str, NULL), &found, 1);
4231 
4232  ast_channel_lock(chan);
4233  if (spawn_error) {
4234  /* The code after the loop needs the channel locked. */
4235  break;
4236  }
4238  ast_channel_unlock(chan);
4239  }
4240  if (found && spawn_error) {
4241  /* Something bad happened, or a hangup has been requested. */
4242  ast_debug(1, "Spawn extension (%s,%s,%d) exited non-zero on '%s'\n",
4244  ast_channel_priority(chan), ast_channel_name(chan));
4245  ast_verb(2, "Spawn extension (%s, %s, %d) exited non-zero on '%s'\n",
4247  ast_channel_priority(chan), ast_channel_name(chan));
4248  }
4249 
4250  /* An "h" exten has been run, so indicate that one has been run. */
4252 
4253  /* Restore autoloop flag */
4255  ast_channel_unlock(chan);
4256 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
int ast_spawn_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid, int *found, int combined_find_spawn)
Launch a new extension (i.e. new stack)
Definition: pbx.c:4195
#define ast_channel_lock(chan)
Definition: channel.h:2837
#define ast_set2_flag(p, value, flag)
Definition: utils.h:94
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define NULL
Definition: resample.c:96
int ast_channel_priority(const struct ast_channel *chan)
#define ast_verb(level,...)
Definition: logger.h:455
Number structure.
Definition: app_followme.c:154
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:85
const char * ast_channel_exten(const struct ast_channel *chan)
int ast_softhangup_nolock(struct ast_channel *chan, int reason)
Softly hangup up a channel (no channel lock)
Definition: channel.c:2438
#define ast_channel_unlock(chan)
Definition: channel.h:2838
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
void ast_channel_context_set(struct ast_channel *chan, const char *value)
const char * ast_channel_name(const struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)

◆ ast_pbx_hangup_handler_destroy()

void ast_pbx_hangup_handler_destroy ( struct ast_channel chan)

Destroy the hangup handler container on a channel.

Since
11.0
Parameters
chanChannel to destroy the hangup handler container on.
Returns
Nothing

Definition at line 103 of file pbx_hangup_handler.c.

References ast_channel_hangup_handlers(), ast_channel_lock, ast_channel_unlock, ast_free, and AST_LIST_REMOVE_HEAD.

Referenced by ast_channel_destructor(), and ast_dummy_channel_destructor().

104 {
105  struct ast_hangup_handler_list *handlers;
106  struct ast_hangup_handler *h_handler;
107 
108  ast_channel_lock(chan);
109 
110  /* Get rid of each of the hangup handlers on the channel */
111  handlers = ast_channel_hangup_handlers(chan);
112  while ((h_handler = AST_LIST_REMOVE_HEAD(handlers, node))) {
113  ast_free(h_handler);
114  }
115 
116  ast_channel_unlock(chan);
117 }
#define ast_channel_lock(chan)
Definition: channel.h:2837
Definition: test_heap.c:38
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
#define ast_channel_unlock(chan)
Definition: channel.h:2838
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
#define ast_free(a)
Definition: astmm.h:182

◆ ast_pbx_hangup_handler_init()

void ast_pbx_hangup_handler_init ( struct ast_channel chan)

Init the hangup handler container on a channel.

Since
11.0
Parameters
chanChannel to init the hangup handler container on.
Returns
Nothing

Definition at line 95 of file pbx_hangup_handler.c.

References ast_channel_hangup_handlers(), and AST_LIST_HEAD_INIT_NOLOCK.

Referenced by __ast_channel_alloc_ap(), and __ast_dummy_channel_alloc().

96 {
97  struct ast_hangup_handler_list *handlers;
98 
99  handlers = ast_channel_hangup_handlers(chan);
100  AST_LIST_HEAD_INIT_NOLOCK(handlers);
101 }
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680

◆ ast_pbx_hangup_handler_pop()

int ast_pbx_hangup_handler_pop ( struct ast_channel chan)

Pop the top of the channel hangup handler stack.

Since
11.0
Parameters
chanChannel to push the hangup handler onto.
Return values
TRUEif a handler was popped off of the stack.

Definition at line 119 of file pbx_hangup_handler.c.

References ast_hangup_handler::args, ast_channel_hangup_handlers(), ast_channel_lock, ast_channel_unlock, ast_free, AST_LIST_REMOVE_HEAD, and publish_hangup_handler_message().

Referenced by func_channel_write_real().

120 {
121  struct ast_hangup_handler_list *handlers;
122  struct ast_hangup_handler *h_handler;
123 
124  ast_channel_lock(chan);
125  handlers = ast_channel_hangup_handlers(chan);
126  h_handler = AST_LIST_REMOVE_HEAD(handlers, node);
127  if (h_handler) {
128  publish_hangup_handler_message("pop", chan, h_handler->args);
129  }
130  ast_channel_unlock(chan);
131  if (h_handler) {
132  ast_free(h_handler);
133  return 1;
134  }
135  return 0;
136 }
#define ast_channel_lock(chan)
Definition: channel.h:2837
Definition: test_heap.c:38
static void publish_hangup_handler_message(const char *action, struct ast_channel *chan, const char *handler)
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
#define ast_channel_unlock(chan)
Definition: channel.h:2838
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
#define ast_free(a)
Definition: astmm.h:182

◆ ast_pbx_hangup_handler_push()

void ast_pbx_hangup_handler_push ( struct ast_channel chan,
const char *  handler 
)

Push the given hangup handler onto the channel hangup handler stack.

Since
11.0
Parameters
chanChannel to push the hangup handler onto.
handlerGosub application parameter string.
Returns
Nothing

Definition at line 138 of file pbx_hangup_handler.c.

References ast_hangup_handler::args, ast_app_expand_sub_args(), ast_channel_hangup_handlers(), ast_channel_lock, ast_channel_unlock, ast_free, AST_LIST_INSERT_HEAD, ast_malloc, ast_strlen_zero, and publish_hangup_handler_message().

Referenced by func_channel_write_real().

139 {
140  struct ast_hangup_handler_list *handlers;
141  struct ast_hangup_handler *h_handler;
142  const char *expanded_handler;
143 
144  if (ast_strlen_zero(handler)) {
145  return;
146  }
147 
148  expanded_handler = ast_app_expand_sub_args(chan, handler);
149  if (!expanded_handler) {
150  return;
151  }
152  h_handler = ast_malloc(sizeof(*h_handler) + 1 + strlen(expanded_handler));
153  if (!h_handler) {
154  ast_free((char *) expanded_handler);
155  return;
156  }
157  strcpy(h_handler->args, expanded_handler);/* Safe */
158  ast_free((char *) expanded_handler);
159 
160  ast_channel_lock(chan);
161 
162  handlers = ast_channel_hangup_handlers(chan);
163  AST_LIST_INSERT_HEAD(handlers, h_handler, node);
164  publish_hangup_handler_message("push", chan, h_handler->args);
165  ast_channel_unlock(chan);
166 }
#define ast_channel_lock(chan)
Definition: channel.h:2837
Definition: test_heap.c:38
const char * ast_app_expand_sub_args(struct ast_channel *chan, const char *args)
Add missing context/exten to subroutine argument string.
Definition: main/app.c:351
static void publish_hangup_handler_message(const char *action, struct ast_channel *chan, const char *handler)
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:193
#define ast_strlen_zero(a)
Definition: muted.c:73
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:710
#define ast_channel_unlock(chan)
Definition: channel.h:2838
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
#define ast_free(a)
Definition: astmm.h:182
static void handler(const char *name, int response_code, struct ast_variable *get_params, struct ast_variable *path_vars, struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)
Definition: test_ari.c:59

◆ ast_pbx_hangup_handler_run()

int ast_pbx_hangup_handler_run ( struct ast_channel chan)

Run all hangup handlers on the channel.

Since
11.0
Parameters
chanChannel to run the hangup handlers on.
Note
Absolutely NO channel locks should be held before calling this function.
Return values
Zeroif no hangup handlers run.
non-zeroif hangup handlers were run.

Definition at line 58 of file pbx_hangup_handler.c.

References ast_hangup_handler::args, ast_app_exec_sub(), ast_channel_hangup_handlers(), ast_channel_lock, ast_channel_unlock, ast_free, AST_LIST_EMPTY, AST_LIST_REMOVE_HEAD, AST_SOFTHANGUP_HANGUP_EXEC, ast_softhangup_nolock(), NULL, and publish_hangup_handler_message().

Referenced by __ast_pbx_run(), and ast_hangup().

59 {
60  struct ast_hangup_handler_list *handlers;
61  struct ast_hangup_handler *h_handler;
62 
63  ast_channel_lock(chan);
64  handlers = ast_channel_hangup_handlers(chan);
65  if (AST_LIST_EMPTY(handlers)) {
66  ast_channel_unlock(chan);
67  return 0;
68  }
69 
70  /*
71  * Make sure that the channel is marked as hungup since we are
72  * going to run the hangup handlers on it.
73  */
75 
76  for (;;) {
77  handlers =