Asterisk - The Open Source Telephony Project GIT-master-80b953f
Loading...
Searching...
No Matches
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
channel.h File Reference

General Asterisk PBX channel definitions. More...

#include "asterisk/alertpipe.h"
#include "asterisk/abstract_jb.h"
#include "asterisk/astobj2.h"
#include "asterisk/poll-compat.h"
#include "asterisk/frame.h"
#include "asterisk/chanvars.h"
#include "asterisk/config.h"
#include "asterisk/lock.h"
#include "asterisk/cdr.h"
#include "asterisk/utils.h"
#include "asterisk/linkedlists.h"
#include "asterisk/stringfields.h"
#include "asterisk/datastore.h"
#include "asterisk/format_cap.h"
#include "asterisk/channelstate.h"
#include "asterisk/ccss.h"
#include "asterisk/framehook.h"
#include "asterisk/stasis.h"
#include "asterisk/endpoints.h"
Include dependency graph for channel.h:

Go to the source code of this file.

Data Structures

struct  ast_assigned_ids
 Structure to pass both assignedid values to channel drivers. More...
 
struct  ast_autochan_list
 
struct  ast_bridge_config
 bridge configuration More...
 
struct  ast_chan_write_info_t
 Structure to handle passing func_channel_write info to channels via setoption. More...
 
struct  ast_channel_initializers
 Helper struct for initializing additional channel information on channel creation. More...
 
struct  ast_channel_tech
 Structure to describe a channel "technology", ie a channel driver See for examples: More...
 
struct  ast_datastore_list
 
struct  ast_generator
 
struct  ast_group_info
 channel group info More...
 
struct  ast_hangup_handler
 
struct  ast_hangup_handler_list
 
struct  ast_party_caller
 Caller Party information. More...
 
struct  ast_party_connected_line
 Connected Line/Party information. More...
 
struct  ast_party_dialed
 Dialed/Called Party information. More...
 
struct  ast_party_id
 Information needed to identify an endpoint in a call. More...
 
struct  ast_party_name
 Information needed to specify a name in a call. More...
 
struct  ast_party_number
 Information needed to specify a number in a call. More...
 
struct  ast_party_redirecting
 Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call diversion or transfer was invoked. More...
 
struct  ast_party_redirecting_reason
 Redirecting reason information. More...
 
struct  ast_party_subaddress
 Information needed to specify a subaddress in a call. More...
 
struct  ast_readq_list
 
struct  ast_set_party_caller
 Indicate what information in ast_party_caller should be set. More...
 
struct  ast_set_party_connected_line
 Indicate what information in ast_party_connected_line should be set. More...
 
struct  ast_set_party_id
 Indicate what information in ast_party_id should be set. More...
 
struct  ast_set_party_redirecting
 Indicate what information in ast_party_redirecting should be set. More...
 
struct  outgoing_helper
 

Macros

#define AST_AGENT_FD   (AST_MAX_FDS-3)
 
#define AST_ALERT_FD   (AST_MAX_FDS-1)
 
#define AST_BRIDGE_DTMF_CHANNEL_0   (1 << 0)
 Report DTMF on channel 0.
 
#define AST_BRIDGE_DTMF_CHANNEL_1   (1 << 1)
 Report DTMF on channel 1.
 
#define AST_CHAN_WRITE_INFO_T_VERSION   1
 ast_chan_write_info_t version. Must be incremented if structure is changed
 
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, ...)
 Create a channel structure.
 
#define ast_channel_alloc_with_endpoint(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, endpoint, ...)
 
#define ast_channel_alloc_with_initializers(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, endpoint, initializers, ...)
 
#define ast_channel_cleanup(c)   ({ ao2_cleanup(c); (struct ast_channel *) (NULL); })
 Cleanup a channel reference.
 
#define ast_channel_has_tech_function(chan, function)    (ast_channel_tech(chan) ? ast_channel_tech(chan)->function != NULL : 0)
 Checks if a channel's technology implements a particular callback function.
 
#define AST_CHANNEL_INITIALIZERS_VERSION   1
 struct ABI version
 
#define ast_channel_lock(chan)   ao2_lock(chan)
 
#define ast_channel_lock_both(chan1, chan2)
 Lock two channels.
 
#define AST_CHANNEL_NAME   80
 
#define ast_channel_ref(c)   ({ ao2_ref(c, +1); (c); })
 Increase channel reference count.
 
#define ast_channel_trylock(chan)   ao2_trylock(chan)
 
#define ast_channel_unlock(chan)   ao2_unlock(chan)
 
#define ast_channel_unref(c)   ({ ao2_ref(c, -1); (struct ast_channel *) (NULL); })
 Decrease channel reference count.
 
#define ast_dummy_channel_alloc()   __ast_dummy_channel_alloc(__FILE__, __LINE__, __PRETTY_FUNCTION__)
 Create a fake channel structure.
 
#define AST_EXTENDED_FDS   12
 
#define AST_FEATURE_DTMF_MASK
 
#define AST_GENERATOR_FD   (AST_MAX_FDS-4)
 
#define AST_JITTERBUFFER_FD   (AST_MAX_FDS-5)
 
#define AST_MAX_ACCOUNT_CODE   80
 
#define AST_MAX_CONTEXT   80
 
#define AST_MAX_EXTENSION   80
 
#define AST_MAX_FDS   11
 
#define AST_MAX_PUBLIC_UNIQUEID   149
 
#define AST_MAX_TENANT_ID   64
 
#define AST_MAX_UNIQUEID   (AST_MAX_PUBLIC_UNIQUEID + 2 + 1)
 
#define AST_MAX_USER_FIELD   256
 
#define AST_MUTE_DIRECTION_READ   (1 << 0)
 
#define AST_MUTE_DIRECTION_WRITE   (1 << 1)
 
#define AST_NUM_CHANNEL_BUCKETS   1567
 
#define AST_TIMING_FD   (AST_MAX_FDS-2)
 
#define CHECK_BLOCKING(c)
 Set the blocking indication on the channel.
 
#define DATASTORE_INHERIT_FOREVER   INT_MAX
 
#define DEBUGCHAN_FLAG   0x80000000
 
#define DECLARE_STRINGFIELD_SETTERS_FOR(field)
 
#define FRAMECOUNT_INC(x)   ( ((x) & DEBUGCHAN_FLAG) | (((x)+1) & ~DEBUGCHAN_FLAG) )
 
#define MAX_LANGUAGE   40
 
#define MAX_MUSICCLASS   80
 

Typedefs

typedef int(* ast_acf_read2_fn_t) (struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
 Typedef for a custom read2 function.
 
typedef int(* ast_acf_read_fn_t) (struct ast_channel *chan, const char *function, char *data, char *buf, size_t len)
 Typedef for a custom read function.
 
typedef int(* ast_acf_write_fn_t) (struct ast_channel *chan, const char *function, char *data, const char *value)
 Typedef for a custom write function.
 
typedef unsigned long long ast_group_t
 
typedef int(* ast_timing_func_t) (const void *data)
 

Enumerations

enum  { AST_CHAN_TP_WANTSJITTER = (1 << 0) , AST_CHAN_TP_CREATESJITTER = (1 << 1) , AST_CHAN_TP_INTERNAL = (1 << 2) , AST_CHAN_TP_SEND_TEXT_DATA = (1 << 3) }
 ast_channel_tech Properties More...
 
enum  {
  AST_FLAG_DEFER_DTMF = (1 << 1) , AST_FLAG_WRITE_INT = (1 << 2) , AST_FLAG_BLOCKING = (1 << 3) , AST_FLAG_ZOMBIE = (1 << 4) ,
  AST_FLAG_EXCEPTION = (1 << 5) , AST_FLAG_MOH = (1 << 6) , AST_FLAG_SPYING = (1 << 7) , AST_FLAG_IN_AUTOLOOP = (1 << 9) ,
  AST_FLAG_OUTGOING = (1 << 10) , AST_FLAG_IN_DTMF = (1 << 12) , AST_FLAG_EMULATE_DTMF = (1 << 13) , AST_FLAG_END_DTMF_ONLY = (1 << 14) ,
  AST_FLAG_MASQ_NOSTREAM = (1 << 16) , AST_FLAG_BRIDGE_HANGUP_RUN = (1 << 17) , AST_FLAG_DISABLE_WORKAROUNDS = (1 << 20) , AST_FLAG_DISABLE_DEVSTATE_CACHE = (1 << 21) ,
  AST_FLAG_BRIDGE_DUAL_REDIRECT_WAIT = (1 << 22) , AST_FLAG_ORIGINATED = (1 << 23) , AST_FLAG_DEAD = (1 << 24) , AST_FLAG_SNAPSHOT_STAGE = (1 << 25) ,
  AST_FLAG_TIMINGDATA_IS_AO2_OBJ = (1 << 26) , AST_FLAG_SUBROUTINE_EXEC = (1 << 27)
}
 ast_channel flags More...
 
enum  {
  AST_FEATURE_PLAY_WARNING = (1 << 0) , AST_FEATURE_REDIRECT = (1 << 1) , AST_FEATURE_DISCONNECT = (1 << 2) , AST_FEATURE_ATXFER = (1 << 3) ,
  AST_FEATURE_AUTOMON = (1 << 4) , AST_FEATURE_PARKCALL = (1 << 5) , AST_FEATURE_AUTOMIXMON = (1 << 6)
}
 ast_bridge_config flags More...
 
enum  {
  AST_SOFTHANGUP_DEV = (1 << 0) , AST_SOFTHANGUP_ASYNCGOTO = (1 << 1) , AST_SOFTHANGUP_SHUTDOWN = (1 << 2) , AST_SOFTHANGUP_TIMEOUT = (1 << 3) ,
  AST_SOFTHANGUP_APPUNLOAD = (1 << 4) , AST_SOFTHANGUP_EXPLICIT = (1 << 5) , AST_SOFTHANGUP_HANGUP_EXEC = (1 << 7) , AST_SOFTHANGUP_ALL = (0xFFFFFFFF)
}
 
enum  ama_flags { AST_AMA_NONE = 0 , AST_AMA_OMIT , AST_AMA_BILLING , AST_AMA_DOCUMENTATION }
 Channel AMA Flags. More...
 
enum  ast_bridge_result { AST_BRIDGE_COMPLETE = 0 , AST_BRIDGE_FAILED = -1 , AST_BRIDGE_FAILED_NOWARN = -2 , AST_BRIDGE_RETRY = -3 }
 
enum  ast_channel_adsicpe { AST_ADSI_UNKNOWN , AST_ADSI_AVAILABLE , AST_ADSI_UNAVAILABLE , AST_ADSI_OFFHOOKONLY }
 
enum  ast_channel_error { AST_CHANNEL_ERROR_UNKNOWN , AST_CHANNEL_ERROR_ID_EXISTS }
 
enum  ast_channel_requestor_relationship { AST_CHANNEL_REQUESTOR_BRIDGE_PEER , AST_CHANNEL_REQUESTOR_REPLACEMENT }
 
enum  AST_MONITORING_STATE { AST_MONITOR_RUNNING , AST_MONITOR_PAUSED }
 
enum  AST_PARTY_CHAR_SET {
  AST_PARTY_CHAR_SET_UNKNOWN = 0 , AST_PARTY_CHAR_SET_ISO8859_1 = 1 , AST_PARTY_CHAR_SET_WITHDRAWN = 2 , AST_PARTY_CHAR_SET_ISO8859_2 = 3 ,
  AST_PARTY_CHAR_SET_ISO8859_3 = 4 , AST_PARTY_CHAR_SET_ISO8859_4 = 5 , AST_PARTY_CHAR_SET_ISO8859_5 = 6 , AST_PARTY_CHAR_SET_ISO8859_7 = 7 ,
  AST_PARTY_CHAR_SET_ISO10646_BMPSTRING = 8 , AST_PARTY_CHAR_SET_ISO10646_UTF_8STRING = 9
}
 
enum  ast_t38_state {
  T38_STATE_UNAVAILABLE , T38_STATE_UNKNOWN , T38_STATE_NEGOTIATING , T38_STATE_REJECTED ,
  T38_STATE_NEGOTIATED
}
 Possible T38 states on channels. More...
 
enum  channelreloadreason {
  CHANNEL_MODULE_LOAD , CHANNEL_MODULE_RELOAD , CHANNEL_CLI_RELOAD , CHANNEL_MANAGER_RELOAD ,
  CHANNEL_ACL_RELOAD
}
 Channel reload reasons for manager events at load or reload of configuration. More...
 

Functions

int __ast_answer (struct ast_channel *chan, unsigned int delay)
 Answer a channel, with a selectable delay before returning.
 
struct ast_channel__ast_channel_alloc (int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, const char *file, int line, const char *function, const char *name_fmt,...)
 Create a channel structure.
 
struct ast_channel__ast_channel_alloc_with_initializers (int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt,...)
 Create a channel structure.
 
struct ast_channel__ast_dummy_channel_alloc (const char *file, int line, const char *function)
 
struct ast_channel__ast_request_and_dial (const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *reason, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
 Request a channel of a given type, with data as optional information used by the low level module and attempt to place a call on it.
 
int ast_activate_generator (struct ast_channel *chan, struct ast_generator *gen, void *params)
 
int ast_active_channels (void)
 returns number of active/allocated channels
 
static int ast_add_fd (struct pollfd *pfd, int fd)
 if fd is a valid descriptor, set *pfd with the descriptor
 
int ast_answer (struct ast_channel *chan)
 Answer a channel.
 
int ast_auto_answer (struct ast_channel *chan)
 Answer a channel, if it's not already answered.
 
void ast_autoservice_chan_hangup_peer (struct ast_channel *chan, struct ast_channel *peer)
 Put chan into autoservice while hanging up peer.
 
int ast_autoservice_ignore (struct ast_channel *chan, enum ast_frame_type ftype)
 Ignore certain frame types.
 
int ast_autoservice_start (struct ast_channel *chan)
 Automatically service a channel for us...
 
int ast_autoservice_stop (struct ast_channel *chan)
 Stop servicing a channel for us...
 
int ast_call (struct ast_channel *chan, const char *addr, int timeout)
 Make a call.
 
struct ast_channelast_call_forward (struct ast_channel *caller, struct ast_channel *orig, int *timeout, struct ast_format_cap *cap, struct outgoing_helper *oh, int *outstate)
 Forwards a call to a new channel specified by the original channel's call_forward str. If possible, the new forwarded channel is created and returned while the original one is terminated.
 
const char * ast_cause2str (int cause) attribute_pure
 Gives the string form of a given cause code.
 
void ast_change_name (struct ast_channel *chan, const char *newname)
 Change channel name.
 
struct ast_channelast_channel__bridge (const struct ast_channel *chan)
 
void ast_channel__bridge_set (struct ast_channel *chan, struct ast_channel *value)
 
const char * ast_channel_accountcode (const struct ast_channel *chan)
 
enum ast_channel_adsicpe ast_channel_adsicpe (const struct ast_channel *chan)
 
void ast_channel_adsicpe_set (struct ast_channel *chan, enum ast_channel_adsicpe value)
 
int ast_channel_alert_writable (struct ast_channel *chan)
 
int ast_channel_alert_write (struct ast_channel *chan)
 
enum ama_flags ast_channel_amaflags (const struct ast_channel *chan)
 
const char * ast_channel_amaflags2string (enum ama_flags flags)
 Convert the enum representation of an AMA flag to a string representation.
 
void ast_channel_amaflags_set (struct ast_channel *chan, enum ama_flags value)
 
struct timeval ast_channel_answertime (struct ast_channel *chan)
 
void ast_channel_answertime_set (struct ast_channel *chan, struct timeval *value)
 
const char * ast_channel_appl (const struct ast_channel *chan)
 
void ast_channel_appl_set (struct ast_channel *chan, const char *value)
 
struct ast_audiohook_listast_channel_audiohooks (const struct ast_channel *chan)
 
void ast_channel_audiohooks_set (struct ast_channel *chan, struct ast_audiohook_list *value)
 
struct ast_autochan_listast_channel_autochans (struct ast_channel *chan)
 
pthread_t ast_channel_blocker (const struct ast_channel *chan)
 
void ast_channel_blocker_set (struct ast_channel *chan, pthread_t value)
 
int ast_channel_blocker_tid (const struct ast_channel *chan)
 
void ast_channel_blocker_tid_set (struct ast_channel *chan, int tid)
 
const char * ast_channel_blockproc (const struct ast_channel *chan)
 
void ast_channel_blockproc_set (struct ast_channel *chan, const char *value)
 
struct ast_channelast_channel_bridge_peer (struct ast_channel *chan)
 Get the channel's bridge peer only if the bridge is two-party.
 
const char * ast_channel_call_forward (const struct ast_channel *chan)
 
struct ast_party_callerast_channel_caller (struct ast_channel *chan)
 
void ast_channel_caller_set (struct ast_channel *chan, struct ast_party_caller *value)
 
ast_group_t ast_channel_callgroup (const struct ast_channel *chan)
 
void ast_channel_callgroup_set (struct ast_channel *chan, ast_group_t value)
 
ast_callid ast_channel_callid (const struct ast_channel *chan)
 
void ast_channel_callid_cleanup (struct ast_channel *chan)
 
void ast_channel_callid_set (struct ast_channel *chan, ast_callid value)
 
int ast_channel_cc_params_init (struct ast_channel *chan, const struct ast_cc_config_params *base_params)
 Set up datastore with CCSS parameters for a channel.
 
struct ast_cdrast_channel_cdr (const struct ast_channel *chan)
 
void ast_channel_cdr_set (struct ast_channel *chan, struct ast_cdr *value)
 
void ast_channel_clear_flag (struct ast_channel *chan, unsigned int flag)
 Clear a flag on a channel.
 
void ast_channel_clear_softhangup (struct ast_channel *chan, int flag)
 Clear a set of softhangup flags from a channel.
 
int ast_channel_cmpwhentohangup_tv (struct ast_channel *chan, struct timeval offset)
 Compare a offset with the settings of when to hang a channel up.
 
struct ast_party_connected_lineast_channel_connected (struct ast_channel *chan)
 
struct ast_party_id ast_channel_connected_effective_id (struct ast_channel *chan)
 
struct ast_party_connected_lineast_channel_connected_indicated (struct ast_channel *chan)
 
int ast_channel_connected_line_sub (struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *connected_info, int frame)
 Run a connected line interception subroutine and update a channel's connected line information.
 
void ast_channel_connected_set (struct ast_channel *chan, struct ast_party_connected_line *value)
 
const char * ast_channel_context (const struct ast_channel *chan)
 
void ast_channel_context_set (struct ast_channel *chan, const char *value)
 
struct timeval ast_channel_creationtime (struct ast_channel *chan)
 
void ast_channel_creationtime_set (struct ast_channel *chan, struct timeval *value)
 
const char * ast_channel_data (const struct ast_channel *chan)
 
void ast_channel_data_set (struct ast_channel *chan, const char *value)
 
int ast_channel_datastore_add (struct ast_channel *chan, struct ast_datastore *datastore)
 Add a datastore to a channel.
 
struct ast_datastoreast_channel_datastore_find (struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
 Find a datastore on a channel.
 
int ast_channel_datastore_inherit (struct ast_channel *from, struct ast_channel *to)
 Inherit datastores from a parent to a child.
 
int ast_channel_datastore_remove (struct ast_channel *chan, struct ast_datastore *datastore)
 Remove a datastore from a channel.
 
struct ast_datastore_listast_channel_datastores (struct ast_channel *chan)
 
int ast_channel_defer_dtmf (struct ast_channel *chan)
 Defers DTMF so that you only read things like hangups and audio.
 
const char * ast_channel_dialcontext (const struct ast_channel *chan)
 
struct ast_party_dialedast_channel_dialed (struct ast_channel *chan)
 
int ast_channel_dialed_causes_add (const struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
 Add cause code information to the channel.
 
struct ast_strast_channel_dialed_causes_channels (const struct ast_channel *chan)
 Retrieve a comma-separated list of channels for which dialed cause information is available.
 
void ast_channel_dialed_causes_clear (const struct ast_channel *chan)
 Clear all cause information from the channel.
 
struct ast_control_pvt_cause_codeast_channel_dialed_causes_find (const struct ast_channel *chan, const char *chan_name)
 Retrieve a ref-counted cause code information structure.
 
struct ao2_iterator ast_channel_dialed_causes_iterator (const struct ast_channel *chan)
 Retrieve an iterator for dialed cause information.
 
void ast_channel_dialed_set (struct ast_channel *chan, struct ast_party_dialed *value)
 
char ast_channel_dtmf_digit_to_emulate (const struct ast_channel *chan)
 
void ast_channel_dtmf_digit_to_emulate_set (struct ast_channel *chan, char value)
 
struct timeval * ast_channel_dtmf_tv (struct ast_channel *chan)
 
void ast_channel_dtmf_tv_set (struct ast_channel *chan, struct timeval *value)
 
struct ast_frameast_channel_dtmff (struct ast_channel *chan)
 
void ast_channel_dtmff_set (struct ast_channel *chan, struct ast_frame *value)
 
int ast_channel_early_bridge (struct ast_channel *c0, struct ast_channel *c1)
 Bridge two channels together (early)
 
unsigned int ast_channel_emulate_dtmf_duration (const struct ast_channel *chan)
 
void ast_channel_emulate_dtmf_duration_set (struct ast_channel *chan, unsigned int value)
 
void ast_channel_end_dtmf (struct ast_channel *chan, char digit, struct timeval start, const char *why)
 Simulate a DTMF end on a broken bridge channel.
 
struct ast_endpointast_channel_endpoint (const struct ast_channel *chan)
 
void ast_channel_endpoint_set (struct ast_channel *chan, struct ast_endpoint *endpoint)
 
int ast_channel_epfd (const struct ast_channel *chan)
 
void ast_channel_epfd_set (struct ast_channel *chan, int value)
 
enum ast_channel_error ast_channel_errno (void)
 Get error code for latest channel operation.
 
const char * ast_channel_exten (const struct ast_channel *chan)
 
void ast_channel_exten_set (struct ast_channel *chan, const char *value)
 
int ast_channel_fd (const struct ast_channel *chan, int which)
 
int ast_channel_fd_add (struct ast_channel *chan, int value)
 Add a file descriptor to the channel without a fixed position.
 
int ast_channel_fd_count (const struct ast_channel *chan)
 Retrieve the number of file decriptor positions present on the channel.
 
int ast_channel_fd_isset (const struct ast_channel *chan, int which)
 
int ast_channel_fdno (const struct ast_channel *chan)
 
void ast_channel_fdno_set (struct ast_channel *chan, int value)
 
int ast_channel_feature_hooks_append (struct ast_channel *chan, struct ast_bridge_features *features)
 Appends to the channel-attached features a channel has access to upon being bridged.
 
struct ast_bridge_featuresast_channel_feature_hooks_get (struct ast_channel *chan)
 Gets the channel-attached features a channel has access to upon being bridged.
 
int ast_channel_feature_hooks_replace (struct ast_channel *chan, struct ast_bridge_features *features)
 Sets the channel-attached features a channel has access to upon being bridged.
 
unsigned int ast_channel_fin (const struct ast_channel *chan)
 
void ast_channel_fin_set (struct ast_channel *chan, unsigned int value)
 
struct ast_flagsast_channel_flags (struct ast_channel *chan)
 
int ast_channel_forward_endpoint (struct ast_channel *chan, struct ast_endpoint *endpoint)
 Forward channel stasis messages to the given endpoint.
 
unsigned int ast_channel_fout (const struct ast_channel *chan)
 
void ast_channel_fout_set (struct ast_channel *chan, unsigned int value)
 
struct ast_framehook_listast_channel_framehooks (const struct ast_channel *chan)
 
void ast_channel_framehooks_set (struct ast_channel *chan, struct ast_framehook_list *value)
 
struct ast_generatorast_channel_generator (const struct ast_channel *chan)
 
void ast_channel_generator_set (struct ast_channel *chan, struct ast_generator *value)
 
void * ast_channel_generatordata (const struct ast_channel *chan)
 
void ast_channel_generatordata_set (struct ast_channel *chan, void *value)
 
struct varsheadast_channel_get_ari_vars (struct ast_channel *chan)
 Gets the variables for a given channel, as specified by ast_channel_set_ari_vars().
 
struct ast_bridgeast_channel_get_bridge (const struct ast_channel *chan)
 Get the bridge associated with a channel.
 
struct ast_bridge_channelast_channel_get_bridge_channel (struct ast_channel *chan)
 Get a reference to the channel's bridge pointer.
 
int ast_channel_get_cc_agent_type (struct ast_channel *chan, char *agent_type, size_t size)
 Find the appropriate CC agent type to use given a channel.
 
struct ast_cc_config_paramsast_channel_get_cc_config_params (struct ast_channel *chan)
 Get the CCSS parameters from a channel.
 
const char * ast_channel_get_current_storage_driver_name (void)
 Get the name of the current channel storage driver.
 
struct ast_streamast_channel_get_default_stream (struct ast_channel *chan, enum ast_media_type type)
 Retrieve the default stream of a specific media type on a channel.
 
int ast_channel_get_device_name (struct ast_channel *chan, char *device_name, size_t name_buffer_length)
 Get a device name given its channel structure.
 
int ast_channel_get_duration (struct ast_channel *chan)
 Obtain how long the channel since the channel was created.
 
int64_t ast_channel_get_duration_ms (struct ast_channel *chan)
 Obtain how long it's been, in milliseconds, since the channel was created.
 
int ast_channel_get_intercept_mode (void)
 Am I currently running an intercept dialplan routine.
 
struct varsheadast_channel_get_manager_vars (struct ast_channel *chan)
 Gets the variables for a given channel, as specified by ast_channel_set_manager_vars().
 
struct ast_stream_topologyast_channel_get_stream_topology (const struct ast_channel *chan)
 Retrieve the topology of streams on a channel.
 
void * ast_channel_get_stream_topology_change_source (struct ast_channel *chan)
 Retrieve the source that initiated the last stream topology change.
 
static enum ast_t38_state ast_channel_get_t38_state (struct ast_channel *chan)
 Retrieves the current T38 state of a channel.
 
int ast_channel_get_up_time (struct ast_channel *chan)
 Obtain how long it has been since the channel was answered.
 
int64_t ast_channel_get_up_time_ms (struct ast_channel *chan)
 Obtain how long it has been since the channel was answered in ms.
 
struct varsheadast_channel_get_vars (struct ast_channel *chan)
 Gets the variables for a given channel, as set using pbx_builtin_setvar_helper().
 
struct ast_hangup_handler_listast_channel_hangup_handlers (struct ast_channel *chan)
 
int ast_channel_hangupcause (const struct ast_channel *chan)
 
void ast_channel_hangupcause_hash_set (struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
 Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.
 
void ast_channel_hangupcause_set (struct ast_channel *chan, int value)
 
const char * ast_channel_hangupsource (const struct ast_channel *chan)
 
int ast_channel_has_ari_vars (void)
 Return whether or not any ARI variables have been set.
 
int ast_channel_has_audio_frame_or_monitor (struct ast_channel *chan)
 Check if the channel has active audiohooks, active framehooks, or a monitor.
 
int ast_channel_has_hook_requiring_audio (struct ast_channel *chan)
 Check if the channel has any active hooks that require audio.
 
int ast_channel_has_manager_vars (void)
 Return whether or not any manager variables have been set.
 
int ast_channel_hold_state (const struct ast_channel *chan)
 
void ast_channel_hold_state_set (struct ast_channel *chan, int value)
 
void ast_channel_inherit_variables (const struct ast_channel *parent, struct ast_channel *child)
 Inherits channel variable from parent to child channel.
 
unsigned long ast_channel_insmpl (const struct ast_channel *chan)
 
void ast_channel_insmpl_set (struct ast_channel *chan, unsigned long value)
 
ast_alert_status_t ast_channel_internal_alert_flush (struct ast_channel *chan)
 
ast_alert_status_t ast_channel_internal_alert_read (struct ast_channel *chan)
 
int ast_channel_internal_alert_readable (struct ast_channel *chan)
 
int ast_channel_internal_alert_readfd (struct ast_channel *chan)
 
void ast_channel_internal_alertpipe_clear (struct ast_channel *chan)
 
void ast_channel_internal_alertpipe_close (struct ast_channel *chan)
 
int ast_channel_internal_alertpipe_init (struct ast_channel *chan)
 
void ast_channel_internal_alertpipe_swap (struct ast_channel *chan1, struct ast_channel *chan2)
 Swap the interal alertpipe between two channels.
 
struct ast_bridgeast_channel_internal_bridge (const struct ast_channel *chan)
 
struct ast_bridge_channelast_channel_internal_bridge_channel (const struct ast_channel *chan)
 
void ast_channel_internal_bridge_channel_set (struct ast_channel *chan, struct ast_bridge_channel *value)
 
void ast_channel_internal_bridge_set (struct ast_channel *chan, struct ast_bridge *value)
 
struct ast_channelast_channel_internal_bridged_channel (const struct ast_channel *chan)
 
void ast_channel_internal_bridged_channel_set (struct ast_channel *chan, struct ast_channel *value)
 
void ast_channel_internal_copy_linkedid (struct ast_channel *dest, struct ast_channel *source)
 Copy the full linkedid channel id structure from one channel to another.
 
void ast_channel_internal_fd_clear (struct ast_channel *chan, int which)
 
void ast_channel_internal_fd_clear_all (struct ast_channel *chan)
 
void ast_channel_internal_fd_set (struct ast_channel *chan, int which, int value)
 
struct ast_channelast_channel_internal_oldest_linkedid (struct ast_channel *a, struct ast_channel *b)
 Determine which channel has an older linkedid.
 
void ast_channel_internal_set_fake_ids (struct ast_channel *chan, const char *uniqueid, const char *linkedid)
 Set uniqueid and linkedid string value only (not time)
 
void ast_channel_internal_swap_endpoint_forward (struct ast_channel *a, struct ast_channel *b)
 Swap endpoint_forward between two channels.
 
void ast_channel_internal_swap_endpoints (struct ast_channel *a, struct ast_channel *b)
 Swap endpoints between two channels.
 
void ast_channel_internal_swap_snapshots (struct ast_channel *a, struct ast_channel *b)
 Swap snapshots beteween two channels.
 
void ast_channel_internal_swap_topics (struct ast_channel *a, struct ast_channel *b)
 Swap topics beteween two channels.
 
void ast_channel_internal_swap_uniqueid_and_linkedid (struct ast_channel *a, struct ast_channel *b)
 Swap uniqueid and linkedid beteween two channels.
 
int ast_channel_is_bridged (const struct ast_channel *chan)
 Determine if a channel is in a bridge.
 
int ast_channel_is_leaving_bridge (struct ast_channel *chan)
 Determine if a channel is leaving a bridge, but not hung up.
 
int ast_channel_is_multistream (struct ast_channel *chan)
 Determine if a channel is multi-stream capable.
 
int ast_channel_is_t38_active (struct ast_channel *chan)
 This function will check if T.38 is active on the channel.
 
int ast_channel_is_t38_active_nolock (struct ast_channel *chan)
 ast_channel_is_t38_active variant. Use this if the channel is already locked prior to calling.
 
struct ast_jbast_channel_jb (struct ast_channel *chan)
 
void ast_channel_jb_set (struct ast_channel *chan, struct ast_jb *value)
 
const char * ast_channel_language (const struct ast_channel *chan)
 
const char * ast_channel_lastcontext (const struct ast_channel *chan)
 
const char * ast_channel_lastexten (const struct ast_channel *chan)
 
const char * ast_channel_latest_musicclass (const struct ast_channel *chan)
 
const char * ast_channel_linkedid (const struct ast_channel *chan)
 
int ast_channel_make_compatible (struct ast_channel *chan, struct ast_channel *peer)
 Make the frame formats of two channels compatible.
 
struct ast_channelast_channel_masq (const struct ast_channel *chan)
 
void ast_channel_masq_set (struct ast_channel *chan, struct ast_channel *value)
 
struct ast_channelast_channel_masqr (const struct ast_channel *chan)
 
void ast_channel_masqr_set (struct ast_channel *chan, struct ast_channel *value)
 
int ast_channel_move (struct ast_channel *dest, struct ast_channel *source)
 Move a channel from its current location to a new location.
 
void * ast_channel_music_state (const struct ast_channel *chan)
 
void ast_channel_music_state_set (struct ast_channel *chan, void *value)
 
const char * ast_channel_musicclass (const struct ast_channel *chan)
 
const char * ast_channel_name (const struct ast_channel *chan)
 
void ast_channel_name_to_dial_string (char *channel_name)
 Removes the trailing identifiers from a channel name string.
 
struct ast_namedgroups * ast_channel_named_callgroups (const struct ast_channel *chan)
 
void ast_channel_named_callgroups_set (struct ast_channel *chan, struct ast_namedgroups *value)
 
struct ast_namedgroups * ast_channel_named_pickupgroups (const struct ast_channel *chan)
 
void ast_channel_named_pickupgroups_set (struct ast_channel *chan, struct ast_namedgroups *value)
 
struct ast_format_capast_channel_nativeformats (const struct ast_channel *chan)
 
void ast_channel_nativeformats_set (struct ast_channel *chan, struct ast_format_cap *value)
 
const char * ast_channel_oldest_linkedid (const char *a, const char *b)
 Return the oldest linkedid between two channels.
 
struct ast_formatast_channel_oldwriteformat (struct ast_channel *chan)
 
unsigned long ast_channel_outsmpl (const struct ast_channel *chan)
 
void ast_channel_outsmpl_set (struct ast_channel *chan, unsigned long value)
 
const char * ast_channel_parkinglot (const struct ast_channel *chan)
 
struct ast_pbxast_channel_pbx (const struct ast_channel *chan)
 
void ast_channel_pbx_set (struct ast_channel *chan, struct ast_pbx *value)
 
const char * ast_channel_peeraccount (const struct ast_channel *chan)
 
ast_group_t ast_channel_pickupgroup (const struct ast_channel *chan)
 
void ast_channel_pickupgroup_set (struct ast_channel *chan, ast_group_t value)
 
int ast_channel_priority (const struct ast_channel *chan)
 
void ast_channel_priority_set (struct ast_channel *chan, int value)
 
int ast_channel_queryoption (struct ast_channel *channel, int option, void *data, int *datalen, int block)
 Checks the value of an option.
 
void ast_channel_queue_connected_line_update (struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
 Queue a connected line update frame on a channel.
 
void ast_channel_queue_redirecting_update (struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
 Queue a redirecting update frame on a channel.
 
struct ast_formatast_channel_rawreadformat (struct ast_channel *chan)
 
struct ast_formatast_channel_rawwriteformat (struct ast_channel *chan)
 
struct ast_formatast_channel_readformat (struct ast_channel *chan)
 
struct ast_readq_listast_channel_readq (struct ast_channel *chan)
 
struct ast_trans_pvtast_channel_readtrans (const struct ast_channel *chan)
 
void ast_channel_readtrans_set (struct ast_channel *chan, struct ast_trans_pvt *value)
 
const char * ast_channel_reason2str (int reason)
 return an english explanation of the code returned thru __ast_request_and_dial's 'outstate' argument
 
struct ast_party_redirectingast_channel_redirecting (struct ast_channel *chan)
 
struct ast_party_id ast_channel_redirecting_effective_from (struct ast_channel *chan)
 
struct ast_party_id ast_channel_redirecting_effective_orig (struct ast_channel *chan)
 
struct ast_party_id ast_channel_redirecting_effective_to (struct ast_channel *chan)
 
void ast_channel_redirecting_set (struct ast_channel *chan, struct ast_party_redirecting *value)
 
int ast_channel_redirecting_sub (struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *redirecting_info, int is_frame)
 Run a redirecting interception subroutine and update a channel's redirecting information.
 
int ast_channel_register (const struct ast_channel_tech *tech)
 Register a channel technology (a new channel driver) Called by a channel module to register the kind of channels it supports.
 
struct ast_channelast_channel_release (struct ast_channel *chan)
 Unlink and release reference to a channel.
 
void ast_channel_req_accountcodes (struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
 Setup new channel accountcodes from the requestor channel after ast_request().
 
void ast_channel_req_accountcodes_precious (struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
 Setup new channel accountcodes from the requestor channel after ast_request().
 
int ast_channel_request_stream_topology_change (struct ast_channel *chan, struct ast_stream_topology *topology, void *change_source)
 Request that the stream topology of a channel change.
 
int ast_channel_rings (const struct ast_channel *chan)
 
void ast_channel_rings_set (struct ast_channel *chan, int value)
 
struct ast_sched_contextast_channel_sched (const struct ast_channel *chan)
 
void ast_channel_sched_set (struct ast_channel *chan, struct ast_sched_context *value)
 
int ast_channel_sendhtml (struct ast_channel *channel, int subclass, const char *data, int datalen)
 Sends HTML on given channel Send HTML or URL on link.
 
char ast_channel_sending_dtmf_digit (const struct ast_channel *chan)
 
void ast_channel_sending_dtmf_digit_set (struct ast_channel *chan, char value)
 
struct timeval ast_channel_sending_dtmf_tv (const struct ast_channel *chan)
 
void ast_channel_sending_dtmf_tv_set (struct ast_channel *chan, struct timeval value)
 
int ast_channel_sendurl (struct ast_channel *channel, const char *url)
 Sends a URL on a given link Send URL on link.
 
void ast_channel_set_ari_vars (size_t varc, char **vars)
 Sets the variables to be stored in the ari_vars field of all snapshots.
 
void ast_channel_set_caller (struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
 Set the caller id information in the Asterisk channel.
 
void ast_channel_set_caller_event (struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
 Set the caller id information in the Asterisk channel and generate an AMI event if the caller id name or number changed.
 
void ast_channel_set_connected_line (struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
 Set the connected line information in the Asterisk channel.
 
void ast_channel_set_fd (struct ast_channel *chan, int which, int fd)
 
void ast_channel_set_flag (struct ast_channel *chan, unsigned int flag)
 Set a flag on a channel.
 
void ast_channel_set_is_t38_active (struct ast_channel *chan, int is_t38_active)
 Sets the is_t38_active flag.
 
void ast_channel_set_is_t38_active_nolock (struct ast_channel *chan, int is_t38_active)
 Variant of ast_channel_set_is_t38_active. Use this if the channel is already locked prior to calling.
 
void ast_channel_set_manager_vars (size_t varc, char **vars)
 Sets the variables to be stored in the manager_vars field of all snapshots.
 
void ast_channel_set_oldwriteformat (struct ast_channel *chan, struct ast_format *format)
 
void ast_channel_set_rawreadformat (struct ast_channel *chan, struct ast_format *format)
 
void ast_channel_set_rawwriteformat (struct ast_channel *chan, struct ast_format *format)
 
void ast_channel_set_readformat (struct ast_channel *chan, struct ast_format *format)
 
void ast_channel_set_redirecting (struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
 Set the redirecting id information in the Asterisk channel.
 
struct ast_stream_topologyast_channel_set_stream_topology (struct ast_channel *chan, struct ast_stream_topology *topology)
 Set the topology of streams on a channel.
 
void ast_channel_set_unbridged (struct ast_channel *chan, int value)
 Sets the unbridged flag and queues a NULL frame on the channel to trigger a check by bridge_channel_wait.
 
void ast_channel_set_unbridged_nolock (struct ast_channel *chan, int value)
 Variant of ast_channel_set_unbridged. Use this if the channel is already locked prior to calling.
 
void ast_channel_set_writeformat (struct ast_channel *chan, struct ast_format *format)
 
int ast_channel_setoption (struct ast_channel *channel, int option, void *data, int datalen, int block)
 Sets an option on a channel.
 
void ast_channel_setwhentohangup_tv (struct ast_channel *chan, struct timeval offset)
 Set when to hang a channel up.
 
struct ast_channel_snapshotast_channel_snapshot (const struct ast_channel *chan)
 
struct ast_flagsast_channel_snapshot_segment_flags (struct ast_channel *chan)
 
void ast_channel_snapshot_set (struct ast_channel *chan, struct ast_channel_snapshot *snapshot)
 
int ast_channel_softhangup_internal_flag (struct ast_channel *chan)
 
void ast_channel_softhangup_internal_flag_add (struct ast_channel *chan, int value)
 
void ast_channel_softhangup_internal_flag_clear (struct ast_channel *chan, int value)
 
void ast_channel_softhangup_internal_flag_set (struct ast_channel *chan, int value)
 
void ast_channel_softhangup_withcause_locked (struct ast_channel *chan, int causecode)
 Lock the given channel, then request softhangup on the channel with the given causecode.
 
struct ast_silence_generatorast_channel_start_silence_generator (struct ast_channel *chan)
 Starts a silence generator on the given channel.
 
enum ast_channel_state ast_channel_state (const struct ast_channel *chan)
 
void ast_channel_state_set (struct ast_channel *chan, enum ast_channel_state)
 
void ast_channel_stop_silence_generator (struct ast_channel *chan, struct ast_silence_generator *state)
 Stops a previously-started silence generator on the given channel.
 
struct ast_filestreamast_channel_stream (const struct ast_channel *chan)
 
void ast_channel_stream_set (struct ast_channel *chan, struct ast_filestream *value)
 
int ast_channel_stream_topology_changed (struct ast_channel *chan, struct ast_stream_topology *topology)
 Provide notice to a channel that the stream topology has changed.
 
int ast_channel_stream_topology_changed_externally (struct ast_channel *chan)
 Provide notice from a channel that the topology has changed on it as a result of the remote party renegotiating.
 
int ast_channel_streamid (const struct ast_channel *chan)
 
void ast_channel_streamid_set (struct ast_channel *chan, int value)
 
enum ama_flags ast_channel_string2amaflag (const char *flag)
 Convert a string to a detail record AMA flag.
 
int ast_channel_supports_html (struct ast_channel *channel)
 Checks for HTML support on a channel.
 
int ast_channel_suppress (struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
 Suppress passing of a frame type on a channel.
 
const struct ast_channel_techast_channel_tech (const struct ast_channel *chan)
 
int ast_channel_tech_hangupcause (const struct ast_channel *chan)
 
void ast_channel_tech_hangupcause_set (struct ast_channel *chan, int value)
 
void * ast_channel_tech_pvt (const struct ast_channel *chan)
 
void ast_channel_tech_pvt_set (struct ast_channel *chan, void *value)
 
void ast_channel_tech_set (struct ast_channel *chan, const struct ast_channel_tech *value)
 
const char * ast_channel_tenantid (const struct ast_channel *chan)
 
void ast_channel_tenantid_set (struct ast_channel *chan, const char *value)
 
struct ast_timerast_channel_timer (const struct ast_channel *chan)
 
void ast_channel_timer_set (struct ast_channel *chan, struct ast_timer *value)
 
void * ast_channel_timingdata (const struct ast_channel *chan)
 
void ast_channel_timingdata_set (struct ast_channel *chan, void *value)
 
int ast_channel_timingfd (const struct ast_channel *chan)
 
void ast_channel_timingfd_set (struct ast_channel *chan, int value)
 
ast_timing_func_t ast_channel_timingfunc (const struct ast_channel *chan)
 
void ast_channel_timingfunc_set (struct ast_channel *chan, ast_timing_func_t value)
 
struct stasis_topicast_channel_topic (struct ast_channel *chan)
 A topic which publishes the events for a particular channel.
 
unsigned short ast_channel_transfercapability (const struct ast_channel *chan)
 
void ast_channel_transfercapability_set (struct ast_channel *chan, unsigned short value)
 
int ast_channel_unbridged (struct ast_channel *chan)
 This function will check if the bridge needs to be re-evaluated due to external changes.
 
int ast_channel_unbridged_nolock (struct ast_channel *chan)
 ast_channel_unbridged variant. Use this if the channel is already locked prior to calling.
 
void ast_channel_undefer_dtmf (struct ast_channel *chan)
 Unset defer DTMF flag on channel.
 
const char * ast_channel_uniqueid (const struct ast_channel *chan)
 
void ast_channel_unlink (struct ast_channel *chan)
 Remove a channel from the global channels container.
 
void ast_channel_unregister (const struct ast_channel_tech *tech)
 Unregister a channel technology.
 
int ast_channel_unsuppress (struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
 Stop suppressing of a frame type on a channel.
 
void ast_channel_update_connected_line (struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
 Indicate that the connected line information has changed.
 
void ast_channel_update_redirecting (struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
 Indicate that the redirecting id has changed.
 
const char * ast_channel_userfield (const struct ast_channel *chan)
 
struct varsheadast_channel_varshead (struct ast_channel *chan)
 
void ast_channel_varshead_set (struct ast_channel *chan, struct varshead *value)
 
int ast_channel_visible_indication (const struct ast_channel *chan)
 
void ast_channel_visible_indication_set (struct ast_channel *chan, int value)
 
struct ast_filestreamast_channel_vstream (const struct ast_channel *chan)
 
void ast_channel_vstream_set (struct ast_channel *chan, struct ast_filestream *value)
 
int ast_channel_vstreamid (const struct ast_channel *chan)
 
void ast_channel_vstreamid_set (struct ast_channel *chan, int value)
 
struct timeval * ast_channel_whentohangup (struct ast_channel *chan)
 
void ast_channel_whentohangup_set (struct ast_channel *chan, struct timeval *value)
 
struct ast_formatast_channel_writeformat (struct ast_channel *chan)
 
struct ast_trans_pvtast_channel_writetrans (const struct ast_channel *chan)
 
void ast_channel_writetrans_set (struct ast_channel *chan, struct ast_trans_pvt *value)
 
struct ast_channelast_channel_yank (struct ast_channel *yankee)
 Gain control of a channel in the system.
 
struct ast_tone_zoneast_channel_zone (const struct ast_channel *chan)
 
void ast_channel_zone_set (struct ast_channel *chan, struct ast_tone_zone *value)
 
struct ast_variableast_channeltype_list (void)
 return an ast_variable list of channeltypes
 
int ast_check_hangup (struct ast_channel *chan)
 Check to see if a channel is needing hang up.
 
int ast_check_hangup_locked (struct ast_channel *chan)
 
int ast_connected_line_build_data (unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
 Build the connected line information data frame.
 
void ast_connected_line_copy_from_caller (struct ast_party_connected_line *dest, const struct ast_party_caller *src)
 Copy the caller information to the connected line information.
 
void ast_connected_line_copy_to_caller (struct ast_party_caller *dest, const struct ast_party_connected_line *src)
 Copy the connected line information to the caller information.
 
int ast_connected_line_parse_data (const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected)
 Parse connected line indication frame data.
 
void ast_deactivate_generator (struct ast_channel *chan)
 
static int ast_fdisset (struct pollfd *pfds, int fd, int maximum, int *start)
 Helper function for migrating select to poll.
 
const struct ast_channel_techast_get_channel_tech (const char *name)
 Get a channel technology structure by name.
 
ast_group_t ast_get_group (const char *s)
 
struct ast_namedgroups * ast_get_namedgroups (const char *s)
 Create an ast_namedgroups set with group names from comma separated string.
 
void ast_hangup (struct ast_channel *chan)
 Hang up a channel.
 
int ast_indicate (struct ast_channel *chan, int condition)
 Indicates condition of channel.
 
int ast_indicate_data (struct ast_channel *chan, int condition, const void *data, size_t datalen)
 Indicates condition of channel, with payload.
 
int ast_is_deferrable_frame (const struct ast_frame *frame)
 Should we keep this frame for later?
 
int ast_namedgroups_intersect (struct ast_namedgroups *a, struct ast_namedgroups *b)
 Return TRUE if group a and b contain at least one common groupname.
 
void ast_party_caller_copy (struct ast_party_caller *dest, const struct ast_party_caller *src)
 Copy the source caller information to the destination caller.
 
void ast_party_caller_free (struct ast_party_caller *doomed)
 Destroy the caller party contents.
 
void ast_party_caller_init (struct ast_party_caller *init)
 Initialize the given caller structure.
 
void ast_party_caller_set (struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
 Set the caller information based on another caller source.
 
void ast_party_caller_set_init (struct ast_party_caller *init, const struct ast_party_caller *guide)
 Initialize the given caller structure using the given guide for a set update operation.
 
void ast_party_connected_line_collect_caller (struct ast_party_connected_line *connected, struct ast_party_caller *caller)
 Collect the caller party information into a connected line structure.
 
void ast_party_connected_line_copy (struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
 Copy the source connected line information to the destination connected line.
 
void ast_party_connected_line_free (struct ast_party_connected_line *doomed)
 Destroy the connected line information contents.
 
void ast_party_connected_line_init (struct ast_party_connected_line *init)
 Initialize the given connected line structure.
 
void ast_party_connected_line_set (struct ast_party_connected_line *dest, const struct ast_party_connected_line *src, const struct ast_set_party_connected_line *update)
 Set the connected line information based on another connected line source.
 
void ast_party_connected_line_set_init (struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
 Initialize the given connected line structure using the given guide for a set update operation.
 
void ast_party_dialed_copy (struct ast_party_dialed *dest, const struct ast_party_dialed *src)
 Copy the source dialed party information to the destination dialed party.
 
void ast_party_dialed_free (struct ast_party_dialed *doomed)
 Destroy the dialed party contents.
 
void ast_party_dialed_init (struct ast_party_dialed *init)
 Initialize the given dialed structure.
 
void ast_party_dialed_set (struct ast_party_dialed *dest, const struct ast_party_dialed *src)
 Set the dialed information based on another dialed source.
 
void ast_party_dialed_set_init (struct ast_party_dialed *init, const struct ast_party_dialed *guide)
 Initialize the given dialed structure using the given guide for a set update operation.
 
void ast_party_id_copy (struct ast_party_id *dest, const struct ast_party_id *src)
 Copy the source party id information to the destination party id.
 
void ast_party_id_free (struct ast_party_id *doomed)
 Destroy the party id contents.
 
void ast_party_id_init (struct ast_party_id *init)
 Initialize the given party id structure.
 
void ast_party_id_invalidate (struct ast_party_id *id)
 Invalidate all components of the given party id.
 
struct ast_party_id ast_party_id_merge (struct ast_party_id *base, struct ast_party_id *overlay)
 Merge a given party id into another given party id.
 
void ast_party_id_merge_copy (struct ast_party_id *dest, struct ast_party_id *base, struct ast_party_id *overlay)
 Copy a merge of a given party id into another given party id to a given destination party id.
 
int ast_party_id_presentation (const struct ast_party_id *id)
 Determine the overall presentation value for the given party.
 
void ast_party_id_reset (struct ast_party_id *id)
 Destroy and initialize the given party id structure.
 
void ast_party_id_set (struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
 Set the source party id information into the destination party id.
 
void ast_party_id_set_init (struct ast_party_id *init, const struct ast_party_id *guide)
 Initialize the given party id structure using the given guide for a set update operation.
 
void ast_party_name_copy (struct ast_party_name *dest, const struct ast_party_name *src)
 Copy the source party name information to the destination party name.
 
void ast_party_name_free (struct ast_party_name *doomed)
 Destroy the party name contents.
 
void ast_party_name_init (struct ast_party_name *init)
 Initialize the given name structure.
 
void ast_party_name_set (struct ast_party_name *dest, const struct ast_party_name *src)
 Set the source party name information into the destination party name.
 
void ast_party_name_set_init (struct ast_party_name *init, const struct ast_party_name *guide)
 Initialize the given party name structure using the given guide for a set update operation.
 
void ast_party_number_copy (struct ast_party_number *dest, const struct ast_party_number *src)
 Copy the source party number information to the destination party number.
 
void ast_party_number_free (struct ast_party_number *doomed)
 Destroy the party number contents.
 
void ast_party_number_init (struct ast_party_number *init)
 Initialize the given number structure.
 
void ast_party_number_set (struct ast_party_number *dest, const struct ast_party_number *src)
 Set the source party number information into the destination party number.
 
void ast_party_number_set_init (struct ast_party_number *init, const struct ast_party_number *guide)
 Initialize the given party number structure using the given guide for a set update operation.
 
void ast_party_redirecting_copy (struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
 Copy the source redirecting information to the destination redirecting.
 
void ast_party_redirecting_free (struct ast_party_redirecting *doomed)
 Destroy the redirecting information contents.
 
void ast_party_redirecting_init (struct ast_party_redirecting *init)
 Initialize the given redirecting structure.
 
void ast_party_redirecting_reason_copy (struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
 Copy the source redirecting reason information to the destination redirecting reason.
 
void ast_party_redirecting_reason_free (struct ast_party_redirecting_reason *doomed)
 Destroy the redirecting reason contents.
 
void ast_party_redirecting_reason_init (struct ast_party_redirecting_reason *init)
 Initialize the given redirecting reason structure.
 
void ast_party_redirecting_reason_set (struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
 Set the redirecting reason information based on another redirecting reason source.
 
void ast_party_redirecting_reason_set_init (struct ast_party_redirecting_reason *init, const struct ast_party_redirecting_reason *guide)
 Initialize the given redirecting reason structure using the given guide for a set update operation.
 
void ast_party_redirecting_set (struct ast_party_redirecting *dest, const struct ast_party_redirecting *src, const struct ast_set_party_redirecting *update)
 Set the redirecting information based on another redirecting source.
 
void ast_party_redirecting_set_init (struct ast_party_redirecting *init, const struct ast_party_redirecting *guide)
 Initialize the given redirecting id structure using the given guide for a set update operation.
 
void ast_party_subaddress_copy (struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
 Copy the source party subaddress information to the destination party subaddress.
 
void ast_party_subaddress_free (struct ast_party_subaddress *doomed)
 Destroy the party subaddress contents.
 
void ast_party_subaddress_init (struct ast_party_subaddress *init)
 Initialize the given subaddress structure.
 
void ast_party_subaddress_set (struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
 Set the source party subaddress information into the destination party subaddress.
 
void ast_party_subaddress_set_init (struct ast_party_subaddress *init, const struct ast_party_subaddress *guide)
 Initialize the given party subaddress structure using the given guide for a set update operation.
 
int ast_pre_call (struct ast_channel *chan, const char *sub_args)
 Execute a Gosub call on the channel before a call is placed.
 
char * ast_print_group (char *buf, int buflen, ast_group_t group)
 Print call and pickup groups into buffer.
 
char * ast_print_namedgroups (struct ast_str **buf, struct ast_namedgroups *groups)
 Print named call groups and named pickup groups.
 
int ast_prod (struct ast_channel *chan)
 Send empty audio to prime a channel driver.
 
int ast_queue_answer (struct ast_channel *chan, const struct ast_stream_topology *topology)
 Queue an ANSWER control frame with topology.
 
int ast_queue_control (struct ast_channel *chan, enum ast_control_frame_type control)
 Queue a control frame without payload.
 
int ast_queue_control_data (struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
 Queue a control frame with payload.
 
int ast_queue_frame (struct ast_channel *chan, struct ast_frame *f)
 Queue one or more frames to a channel's frame queue.
 
int ast_queue_frame_head (struct ast_channel *chan, struct ast_frame *f)
 Queue one or more frames to the head of a channel's frame queue.
 
int ast_queue_hangup (struct ast_channel *chan)
 Queue a hangup frame.
 
int ast_queue_hangup_with_cause (struct ast_channel *chan, int cause)
 Queue a hangup frame with hangupcause set.
 
int ast_queue_hold (struct ast_channel *chan, const char *musicclass)
 Queue a hold frame.
 
int ast_queue_unhold (struct ast_channel *chan)
 Queue an unhold frame.
 
int ast_raw_answer (struct ast_channel *chan)
 Answer a channel.
 
int ast_raw_answer_with_stream_topology (struct ast_channel *chan, struct ast_stream_topology *topology)
 Answer a channel passing in a stream topology.
 
struct ast_frameast_read (struct ast_channel *chan)
 Reads a frame.
 
struct ast_frameast_read_noaudio (struct ast_channel *chan)
 Reads a frame, returning AST_FRAME_NULL frame if audio.
 
struct ast_frameast_read_stream (struct ast_channel *chan)
 Reads a frame, but does not filter to just the default streams.
 
struct ast_frameast_read_stream_noaudio (struct ast_channel *chan)
 Reads a frame, but does not filter to just the default streams, returning AST_FRAME_NULL frame if audio.
 
int ast_readstring (struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders)
 Reads multiple digits.
 
int ast_readstring_full (struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders, int audiofd, int ctrlfd)
 
int ast_recvchar (struct ast_channel *chan, int timeout)
 Receives a text character from a channel.
 
char * ast_recvtext (struct ast_channel *chan, int timeout)
 Receives a text string from a channel Read a string of text from a channel.
 
int ast_redirecting_build_data (unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
 Build the redirecting id data frame.
 
int ast_redirecting_parse_data (const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting)
 Parse redirecting indication frame data.
 
struct ast_namedgroups * ast_ref_namedgroups (struct ast_namedgroups *groups)
 
struct ast_channelast_request (const char *type, struct ast_format_cap *request_cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
 Requests a channel.
 
struct ast_channelast_request_and_dial (const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *reason, const char *cid_num, const char *cid_name)
 Request a channel of a given type, with data as optional information used by the low level module and attempt to place a call on it.
 
struct ast_channelast_request_with_stream_topology (const char *type, struct ast_stream_topology *topology, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
 Requests a channel (specifying stream topology)
 
int ast_safe_sleep (struct ast_channel *chan, int ms)
 Wait for a specified amount of time, looking for hangups.
 
int ast_safe_sleep_conditional (struct ast_channel *chan, int ms, int(*cond)(void *), void *data)
 Wait for a specified amount of time, looking for hangups and a condition argument.
 
int ast_safe_sleep_without_silence (struct ast_channel *chan, int ms)
 Wait for a specified amount of time, looking for hangups, and do not generate silence.
 
int ast_senddigit (struct ast_channel *chan, char digit, unsigned int duration)
 Send a DTMF digit to a channel.
 
int ast_senddigit_begin (struct ast_channel *chan, char digit)
 Send a DTMF digit to a channel.
 
int ast_senddigit_end (struct ast_channel *chan, char digit, unsigned int duration)
 Send a DTMF digit to a channel.
 
int ast_senddigit_external (struct ast_channel *chan, char digit, unsigned int duration)
 Send a DTMF digit to a channel from an external thread.
 
int ast_senddigit_mf (struct ast_channel *chan, char digit, unsigned int duration, unsigned int durationkp, unsigned int durationst, int is_external)
 Send an MF digit to a channel.
 
int ast_senddigit_mf_begin (struct ast_channel *chan, char digit)
 Send an MF digit to a channel.
 
int ast_senddigit_mf_end (struct ast_channel *chan)
 End sending an MF digit to a channel.
 
int ast_sendtext (struct ast_channel *chan, const char *text)
 Sends text to a channel.
 
int ast_sendtext_data (struct ast_channel *chan, struct ast_msg_data *msg)
 Sends text to a channel in an ast_msg_data structure wrapper with ast_sendtext as fallback.
 
void ast_set_callerid (struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
 Set caller ID number, name and ANI and generate AMI event.
 
void ast_set_hangupsource (struct ast_channel *chan, const char *source, int force)
 Set the source of the hangup in this channel and it's bridge.
 
void ast_set_party_id_all (struct ast_set_party_id *update_id)
 Set the update marker to update all information of a corresponding party id.
 
int ast_set_read_format (struct ast_channel *chan, struct ast_format *format)
 Sets read format on channel chan.
 
int ast_set_read_format_from_cap (struct ast_channel *chan, struct ast_format_cap *formats)
 Sets read format on channel chan from capabilities Set read format for channel to whichever component of "format" is best.
 
int ast_set_read_format_path (struct ast_channel *chan, struct ast_format *raw_format, struct ast_format *core_format)
 Set specific read path on channel.
 
void ast_set_variables (struct ast_channel *chan, struct ast_variable *vars)
 adds a list of channel variables to a channel
 
int ast_set_write_format (struct ast_channel *chan, struct ast_format *format)
 Sets write format on channel chan.
 
int ast_set_write_format_from_cap (struct ast_channel *chan, struct ast_format_cap *formats)
 Sets write format on channel chan Set write format for channel to whichever component of "format" is best.
 
int ast_set_write_format_interleaved_stereo (struct ast_channel *chan, struct ast_format *format)
 Sets write format for a channel. All internal data will than be handled in an interleaved format. (needed by binaural opus)
 
int ast_set_write_format_path (struct ast_channel *chan, struct ast_format *core_format, struct ast_format *raw_format)
 Set specific write path on channel.
 
int ast_settimeout (struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data)
 Enable or disable timer ticks for a channel.
 
int ast_settimeout_full (struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data, unsigned int is_ao2_obj)
 
int ast_softhangup (struct ast_channel *chan, int cause)
 Softly hangup up a channel.
 
void ast_softhangup_all (void)
 Soft hangup all active channels.
 
int ast_softhangup_nolock (struct ast_channel *chan, int cause)
 Softly hangup up a channel (no channel lock)
 
const char * ast_state2str (enum ast_channel_state state)
 Gives the string form of a given channel state.
 
int ast_str2cause (const char *name) attribute_pure
 Convert the string form of a cause code to a number.
 
int ast_tonepair (struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
 
int ast_tonepair_start (struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
 
void ast_tonepair_stop (struct ast_channel *chan)
 
int ast_transfer (struct ast_channel *chan, char *dest)
 Transfer a channel (if supported).
 
int ast_transfer_protocol (struct ast_channel *chan, char *dest, int *protocol)
 Transfer a channel (if supported) receieve protocol result.
 
char * ast_transfercapability2str (int transfercapability) attribute_const
 Gives the string form of a given transfer capability.
 
int ast_undestroyed_channels (void)
 
struct ast_namedgroups * ast_unref_namedgroups (struct ast_namedgroups *groups)
 
int ast_waitfor (struct ast_channel *chan, int ms)
 Wait for input on a channel.
 
struct ast_channelast_waitfor_n (struct ast_channel **chan, int n, int *ms)
 Waits for input on a group of channels Wait for input on an array of channels for a given # of milliseconds.
 
int ast_waitfor_n_fd (int *fds, int n, int *ms, int *exception)
 Waits for input on an fd.
 
struct ast_channelast_waitfor_nandfds (struct ast_channel **c, int n, int *fds, int nfds, int *exception, int *outfd, int *ms)
 Waits for activity on a group of channels.
 
int ast_waitfordigit (struct ast_channel *c, int ms)
 Waits for a digit.
 
int ast_waitfordigit_full (struct ast_channel *c, int ms, const char *breakon, int audiofd, int ctrlfd)
 Wait for a digit Same as ast_waitfordigit() with audio fd for outputting read audio and ctrlfd to monitor for reading.
 
int ast_write (struct ast_channel *chan, struct ast_frame *frame)
 Write a frame to a channel This function writes the given frame to the indicated channel.
 
int ast_write_stream (struct ast_channel *chan, int stream_num, struct ast_frame *frame)
 Write a frame to a stream This function writes the given frame to the indicated stream on the channel.
 
int ast_write_text (struct ast_channel *chan, struct ast_frame *frame)
 Write text frame to a channel This function writes the given frame to the indicated channel.
 
int ast_write_video (struct ast_channel *chan, struct ast_frame *frame)
 Write video frame to a channel This function writes the given frame to the indicated channel.
 
 DECLARE_STRINGFIELD_SETTERS_FOR (accountcode)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (call_forward)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (dialcontext)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (hangupsource)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (language)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (latest_musicclass)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (linkedid)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (musicclass)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (name)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (parkinglot)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (peeraccount)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (uniqueid)
 
 DECLARE_STRINGFIELD_SETTERS_FOR (userfield)
 
int internal_channel_set_current_storage_driver (const char *driver_name)
 
struct ast_channel_iteratorast_channel_iterator_all_new (void)
 Create a new channel iterator.
 
struct ast_channel_iteratorast_channel_iterator_by_exten_new (const char *exten, const char *context)
 Create a new channel iterator based on extension.
 
struct ast_channel_iteratorast_channel_iterator_by_name_new (const char *name, size_t name_len)
 Create a new channel iterator based on name.
 
struct ast_channel_iteratorast_channel_iterator_destroy (struct ast_channel_iterator *i)
 Destroy a channel iterator.
 
struct ast_channelast_channel_iterator_next (struct ast_channel_iterator *i)
 Get the next channel for a channel iterator.
 
struct ast_channelast_channel_callback (ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
 Call a function with every active channel.
 
struct ast_channelast_channel_get_by_exten (const char *exten, const char *context)
 Find a channel by extension and context.
 
struct ast_channelast_channel_get_by_name (const char *search)
 Find a channel by name or uniqueid.
 
struct ast_channelast_channel_get_by_name_prefix (const char *name, size_t name_len)
 Find a channel by a name prefix.
 
struct ast_channelast_channel_get_by_uniqueid (const char *uniqueid)
 Find a channel by a uniqueid.
 

Variables

const struct ast_channel_tech ast_kill_tech
 Kill the channel channel driver technology descriptor.
 
static const char ast_stream_topology_changed_external [] = "external"
 Set as the change source reason when a channel stream topology has been changed externally as a result of the remote side renegotiating.
 
unsigned long global_fin
 
unsigned long global_fout
 

Detailed Description

General Asterisk PBX channel definitions.

See also:

Definition in file channel.h.

Macro Definition Documentation

◆ AST_AGENT_FD

#define AST_AGENT_FD   (AST_MAX_FDS-3)

unused - formerly used by agents for pass through

Definition at line 204 of file channel.h.

◆ AST_ALERT_FD

#define AST_ALERT_FD   (AST_MAX_FDS-1)

used for alertpipe

Definition at line 202 of file channel.h.

◆ AST_BRIDGE_DTMF_CHANNEL_0

#define AST_BRIDGE_DTMF_CHANNEL_0   (1 << 0)

Report DTMF on channel 0.

Definition at line 2420 of file channel.h.

◆ AST_BRIDGE_DTMF_CHANNEL_1

#define AST_BRIDGE_DTMF_CHANNEL_1   (1 << 1)

Report DTMF on channel 1.

Definition at line 2422 of file channel.h.

◆ AST_CHAN_WRITE_INFO_T_VERSION

#define AST_CHAN_WRITE_INFO_T_VERSION   1

ast_chan_write_info_t version. Must be incremented if structure is changed

Definition at line 593 of file channel.h.

◆ ast_channel_alloc

#define ast_channel_alloc (   needqueue,
  state,
  cid_num,
  cid_name,
  acctcode,
  exten,
  context,
  assignedids,
  requestor,
  amaflag,
  ... 
)
Value:
__ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, NULL, \
__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
struct ast_channel * __ast_channel_alloc(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, const char *file, int line, const char *function, const char *name_fmt,...)
Create a channel structure.
Definition channel.c:967
#define NULL
Definition resample.c:96

Create a channel structure.

Return values
NULLfailure
non-NULLsuccessfully allocated channel
Note
Absolutely NO channel locks should be held before calling this function.
By default, new channels are set to the "s" extension and "default" context.
Since 12.0.0 this function returns with the newly created channel locked.

Definition at line 1299 of file channel.h.

1522 {
1523 /*! The requestor is the future bridge peer of the channel. */
1525 /*! The requestor is to be replaced by the channel. */
1527};
1528
1529/*!
1530 * \brief Setup new channel accountcodes from the requestor channel after ast_request().
1531 * \since 13.0.0
1532 *
1533 * \param chan New channel to get accountcodes setup.
1534 * \param requestor Requesting channel to get accountcodes from.
1535 * \param relationship What the new channel was created for.
1536 *
1537 * \pre The chan and requestor channels are already locked.
1538 *
1539 * \note Pre-existing accountcodes on chan will be overwritten.
1540 */
1541void ast_channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship);
1542
1543/*!
1544 * \brief Setup new channel accountcodes from the requestor channel after ast_request().
1545 * \since 13.0.0
1546 *
1547 * \param chan New channel to get accountcodes setup.
1548 * \param requestor Requesting channel to get accountcodes from.
1549 * \param relationship What the new channel was created for.
1550 *
1551 * \pre The chan and requestor channels are already locked.
1552 *
1553 * \note Pre-existing accountcodes on chan will not be overwritten.
1554 */
1555void ast_channel_req_accountcodes_precious(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship);
1556
1557/*!
1558 * \brief Request a channel of a given type, with data as optional information used
1559 * by the low level module and attempt to place a call on it
1560 *
1561 * \param type type of channel to request
1562 * \param cap format capabilities for requested channel
1563 * \param assignedids Unique Id to assign to channel
1564 * \param requestor channel asking for data
1565 * \param addr destination of the call
1566 * \param timeout maximum amount of time to wait for an answer
1567 * \param reason why unsuccessful (if unsuccessful)
1568 * \param cid_num Caller-ID Number
1569 * \param cid_name Caller-ID Name (ascii)
1570 *
1571 * \return Returns an ast_channel on success or no answer, NULL on failure. Check the value of chan->_state
1572 * to know if the call was answered or not.
1573 */
1574struct ast_channel *ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr,
1575 int timeout, int *reason, const char *cid_num, const char *cid_name);
1576
1577/*!
1578 * \brief Request a channel of a given type, with data as optional information used
1579 * by the low level module and attempt to place a call on it
1580 * \param type type of channel to request
1581 * \param cap format capabilities for requested channel
1582 * \param assignedids Unique Id to assign to channel
1583 * \param requestor channel requesting data
1584 * \param addr destination of the call
1585 * \param timeout maximum amount of time to wait for an answer
1586 * \param reason why unsuccessful (if unsuccessful)
1587 * \param cid_num Caller-ID Number
1588 * \param cid_name Caller-ID Name (ascii)
1589 * \param oh Outgoing helper
1590 * \return Returns an ast_channel on success or no answer, NULL on failure. Check the value of chan->_state
1591 * to know if the call was answered or not.
1592 */
1593struct ast_channel *__ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr,
1594 int timeout, int *reason, const char *cid_num, const char *cid_name, struct outgoing_helper *oh);
1595
1596/*!
1597 * \brief Forwards a call to a new channel specified by the original channel's call_forward str. If possible, the new forwarded channel is created and returned while the original one is terminated.
1598 * \param caller in channel that requested orig
1599 * \param orig channel being replaced by the call forward channel
1600 * \param timeout maximum amount of time to wait for setup of new forward channel
1601 * \param cap format capabilities for requested channel
1602 * \param oh outgoing helper used with original channel
1603 * \param outstate reason why unsuccessful (if unsuccessful)
1604 * \return Returns the forwarded call's ast_channel on success or NULL on failure
1605 */
1606struct ast_channel *ast_call_forward(struct ast_channel *caller, struct ast_channel *orig, int *timeout, struct ast_format_cap *cap, struct outgoing_helper *oh, int *outstate);
1607
1608/*!
1609 * \brief Register a channel technology (a new channel driver)
1610 * Called by a channel module to register the kind of channels it supports.
1611 * \param tech Structure defining channel technology or "type"
1612 * \return Returns 0 on success, -1 on failure.
1613 */
1614int ast_channel_register(const struct ast_channel_tech *tech);
1615
1616/*!
1617 * \brief Unregister a channel technology
1618 * \param tech Structure defining channel technology or "type" that was previously registered
1619 */
1620void ast_channel_unregister(const struct ast_channel_tech *tech);
1621
1622/*!
1623 * \brief Get a channel technology structure by name
1624 * \param name name of technology to find
1625 * \return a pointer to the structure, or NULL if no matching technology found
1626 */
1627const struct ast_channel_tech *ast_get_channel_tech(const char *name);
1628
1629/*!
1630 * \brief Hang up a channel
1631 * \note Absolutely _NO_ channel locks should be held before calling this function.
1632 * \note This function performs a hard hangup on a channel. Unlike the soft-hangup, this function
1633 * performs all stream stopping, etc, on the channel that needs to end.
1634 * chan is no longer valid after this call.
1635 * \param chan channel to hang up (NULL tolerant)
1636 */
1637void ast_hangup(struct ast_channel *chan);
1638
1639/*!
1640 * \brief Soft hangup all active channels.
1641 * \since 13.3.0
1642 */
1643void ast_softhangup_all(void);
1644
1645/*!
1646 * \brief Softly hangup up a channel
1647 *
1648 * \param chan channel to be soft-hung-up
1649 * \param cause an AST_SOFTHANGUP_* reason code
1650 *
1651 * \details
1652 * Call the protocol layer, but don't destroy the channel structure
1653 * (use this if you are trying to
1654 * safely hangup a channel managed by another thread.
1655 *
1656 * \note The channel passed to this function does not need to be locked.
1657 *
1658 * \return Returns 0 regardless
1659 */
1660int ast_softhangup(struct ast_channel *chan, int cause);
1661
1662/*!
1663 * \brief Softly hangup up a channel (no channel lock)
1664 * \param chan channel to be soft-hung-up
1665 * \param cause an AST_SOFTHANGUP_* reason code
1666 */
1667int ast_softhangup_nolock(struct ast_channel *chan, int cause);
1668
1669/*!
1670 * \brief Clear a set of softhangup flags from a channel
1671 *
1672 * Never clear a softhangup flag from a channel directly. Instead,
1673 * use this function. This ensures that all aspects of the softhangup
1674 * process are aborted.
1675 *
1676 * \param chan the channel to clear the flag on
1677 * \param flag the flag or flags to clear
1678 */
1679void ast_channel_clear_softhangup(struct ast_channel *chan, int flag);
1680
1681/*!
1682 * \brief Set the source of the hangup in this channel and it's bridge
1683 *
1684 * \param chan channel to set the field on
1685 * \param source a string describing the source of the hangup for this channel
1686 * \param force
1687 *
1688 * \note Absolutely _NO_ channel locks should be held before calling this function.
1689 *
1690 * \since 1.8
1691 *
1692 * Hangupsource is generally the channel name that caused the bridge to be
1693 * hung up, but it can also be other things such as "dialplan/agi"
1694 * This can then be logged in the CDR or CEL
1695 */
1696void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force);
1697
1698/*! \brief Check to see if a channel is needing hang up
1699 * \param chan channel on which to check for hang up
1700 * This function determines if the channel is being requested to be hung up.
1701 * \return Returns 0 if not, or 1 if hang up is requested (including time-out).
1702 */
1703int ast_check_hangup(struct ast_channel *chan);
1704
1705int ast_check_hangup_locked(struct ast_channel *chan);
1706
1707/*! \brief This function will check if the bridge needs to be re-evaluated due to
1708 * external changes.
1709 *
1710 * \param chan Channel on which to check the unbridge_eval flag
1711 *
1712 * \return Returns 0 if the flag is down or 1 if the flag is up.
1713 */
1714int ast_channel_unbridged(struct ast_channel *chan);
1715
1716/*! \brief ast_channel_unbridged variant. Use this if the channel
1717 * is already locked prior to calling.
1718 *
1719 * \param chan Channel on which to check the unbridge flag
1720 *
1721 * \return Returns 0 if the flag is down or 1 if the flag is up.
1722 */
1724
1725/*! \brief Sets the unbridged flag and queues a NULL frame on the channel to trigger
1726 * a check by bridge_channel_wait
1727 *
1728 * \param chan Which channel is having its unbridged value set
1729 * \param value What the unbridge value is being set to
1730 */
1731void ast_channel_set_unbridged(struct ast_channel *chan, int value);
1732
1733/*! \brief Variant of ast_channel_set_unbridged. Use this if the channel
1734 * is already locked prior to calling.
1735 *
1736 * \param chan Which channel is having its unbridged value set
1737 * \param value What the unbridge value is being set to
1738 */
1739void ast_channel_set_unbridged_nolock(struct ast_channel *chan, int value);
1740
1741/*!
1742 * \brief This function will check if T.38 is active on the channel.
1743 *
1744 * \param chan Channel on which to check the unbridge_eval flag
1745 *
1746 * \return Returns 0 if the flag is down or 1 if the flag is up.
1747 */
1748int ast_channel_is_t38_active(struct ast_channel *chan);
1749
1750/*!
1751 * \brief ast_channel_is_t38_active variant. Use this if the channel
1752 * is already locked prior to calling.
1753 *
1754 * \param chan Channel on which to check the is_t38_active flag
1755 *
1756 * \return Returns 0 if the flag is down or 1 if the flag is up.
1757 */
1759
1760/*!
1761 * \brief Sets the is_t38_active flag
1762 *
1763 * \param chan Which channel is having its is_t38_active value set
1764 * \param is_t38_active Non-zero if T.38 is active
1765 */
1766void ast_channel_set_is_t38_active(struct ast_channel *chan, int is_t38_active);
1767
1768/*!
1769 * \brief Variant of ast_channel_set_is_t38_active. Use this if the channel
1770 * is already locked prior to calling.
1771 *
1772 * \param chan Which channel is having its is_t38_active value set
1773 * \param is_t38_active Non-zero if T.38 is active
1774 */
1775void ast_channel_set_is_t38_active_nolock(struct ast_channel *chan, int is_t38_active);
1776
1777/*!
1778 * \brief Lock the given channel, then request softhangup on the channel with the given causecode
1779 * \param chan channel on which to hang up
1780 * \param causecode cause code to use (Zero if don't use cause code)
1781 */
1782void ast_channel_softhangup_withcause_locked(struct ast_channel *chan, int causecode);
1783
1784/*!
1785 * \brief Compare a offset with the settings of when to hang a channel up
1786 * \param chan channel on which to check for hangup
1787 * \param offset offset in seconds and microseconds from current time
1788 * \retval 1
1789 * \retval 0
1790 * \retval -1
1791 * This function compares a offset from current time with the absolute time
1792 * out on a channel (when to hang up). If the absolute time out on a channel
1793 * is earlier than current time plus the offset, it returns 1, if the two
1794 * time values are equal, it return 0, otherwise, it return -1.
1795 * \since 1.6.1
1796 */
1797int ast_channel_cmpwhentohangup_tv(struct ast_channel *chan, struct timeval offset);
1798
1799/*!
1800 * \brief Set when to hang a channel up
1801 *
1802 * \param chan channel on which to check for hang up
1803 * \param offset offset in seconds and useconds relative to the current time of when to hang up
1804 *
1805 * This function sets the absolute time out on a channel (when to hang up).
1806 *
1807 * \pre chan is locked
1808 *
1809 * \since 1.6.1
1810 */
1811void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval offset);
1812
1813/*!
1814 * \brief Answer a channel
1815 *
1816 * \param chan channel to answer
1817 *
1818 * \details
1819 * This function answers a channel and handles all necessary call
1820 * setup functions.
1821 *
1822 * \note The channel passed does not need to be locked, but is locked
1823 * by the function when needed.
1824 *
1825 * \note This function will wait up to 500 milliseconds for media to
1826 * arrive on the channel before returning to the caller, so that the
1827 * caller can properly assume the channel is 'ready' for media flow.
1828 *
1829 * \retval 0 on success
1830 * \retval non-zero on failure
1831 */
1832int ast_answer(struct ast_channel *chan);
1833
1834/*!
1835 * \brief Answer a channel, if it's not already answered.
1836 *
1837 * \param chan channel to answer
1838 *
1839 * \details See ast_answer()
1840 *
1841 * \retval 0 on success
1842 * \retval non-zero on failure
1843 */
1844int ast_auto_answer(struct ast_channel *chan);
1845
1846/*!
1847 * \brief Answer a channel
1848 *
1849 * \param chan channel to answer
1850 *
1851 * This function answers a channel and handles all necessary call
1852 * setup functions.
1853 *
1854 * \note The channel passed does not need to be locked, but is locked
1855 * by the function when needed.
1856 *
1857 * \note Unlike ast_answer(), this function will not wait for media
1858 * flow to begin. The caller should be careful before sending media
1859 * to the channel before incoming media arrives, as the outgoing
1860 * media may be lost.
1861 *
1862 * \retval 0 on success
1863 * \retval non-zero on failure
1864 */
1865int ast_raw_answer(struct ast_channel *chan);
1866
1867/*!
1868 * \brief Answer a channel passing in a stream topology
1869 * \since 18.0.0
1870 *
1871 * \param chan channel to answer
1872 * \param topology the peer's stream topology
1873 *
1874 * This function answers a channel and handles all necessary call
1875 * setup functions.
1876 *
1877 * \note The channel passed does not need to be locked, but is locked
1878 * by the function when needed.
1879 *
1880 * \note Unlike ast_answer(), this function will not wait for media
1881 * flow to begin. The caller should be careful before sending media
1882 * to the channel before incoming media arrives, as the outgoing
1883 * media may be lost.
1884 *
1885 * \note The topology is usually that of the peer channel and may be NULL.
1886 *
1887 * \retval 0 on success
1888 * \retval non-zero on failure
1889 */
1890int ast_raw_answer_with_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology);
1891
1892/*!
1893 * \brief Answer a channel, with a selectable delay before returning
1894 *
1895 * \param chan channel to answer
1896 * \param delay maximum amount of time to wait for incoming media
1897 *
1898 * This function answers a channel and handles all necessary call
1899 * setup functions.
1900 *
1901 * \note The channel passed does not need to be locked, but is locked
1902 * by the function when needed.
1903 *
1904 * \note This function will wait up to 'delay' milliseconds for media to
1905 * arrive on the channel before returning to the caller, so that the
1906 * caller can properly assume the channel is 'ready' for media flow. If
1907 * 'delay' is less than 500, the function will wait up to 500 milliseconds.
1908 *
1909 * \retval 0 on success
1910 * \retval non-zero on failure
1911 */
1912int __ast_answer(struct ast_channel *chan, unsigned int delay);
1913
1914/*!
1915 * \brief Execute a Gosub call on the channel before a call is placed.
1916 * \since 11.0
1917 *
1918 * \details
1919 * This is called between ast_request() and ast_call() to
1920 * execute a predial routine on the newly created channel.
1921 *
1922 * \param chan Channel to execute Gosub.
1923 * \param sub_args Gosub application parameter string.
1924 *
1925 * \note Absolutely _NO_ channel locks should be held before calling this function.
1926 *
1927 * \retval 0 on success.
1928 * \retval -1 on error.
1929 */
1930int ast_pre_call(struct ast_channel *chan, const char *sub_args);
1931
1932/*!
1933 * \brief Make a call
1934 * \note Absolutely _NO_ channel locks should be held before calling this function.
1935 * \param chan which channel to make the call on
1936 * \param addr destination of the call
1937 * \param timeout time to wait on for connect (Doesn't seem to be used.)
1938 * \details
1939 * Place a call, take no longer than timeout ms.
1940 * \retval 0 on success
1941 * \retval -1 on failure
1942 */
1943int ast_call(struct ast_channel *chan, const char *addr, int timeout);
1944
1945/*!
1946 * \brief Indicates condition of channel
1947 * \note Absolutely _NO_ channel locks should be held before calling this function.
1948 * \note Indicate a condition such as AST_CONTROL_BUSY, AST_CONTROL_RINGING, or AST_CONTROL_CONGESTION on a channel
1949 * \param chan channel to change the indication
1950 * \param condition which condition to indicate on the channel
1951 * \return Returns 0 on success, -1 on failure
1952 */
1953int ast_indicate(struct ast_channel *chan, int condition);
1954
1955/*!
1956 * \brief Indicates condition of channel, with payload
1957 * \note Absolutely _NO_ channel locks should be held before calling this function.
1958 * \note Indicate a condition such as AST_CONTROL_HOLD with payload being music on hold class
1959 * \param chan channel to change the indication
1960 * \param condition which condition to indicate on the channel
1961 * \param data pointer to payload data
1962 * \param datalen size of payload data
1963 * \return Returns 0 on success, -1 on failure
1964 */
1965int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen);
1966
1967/* Misc stuff ------------------------------------------------ */
1968
1969/*!
1970 * \brief Wait for input on a channel
1971 * \param chan channel to wait on
1972 * \param ms length of time to wait on the channel
1973 * \details
1974 * Wait for input on a channel for a given # of milliseconds (<0 for indefinite).
1975 * \retval < 0 on failure
1976 * \retval 0 if nothing ever arrived
1977 * \retval the # of ms remaining otherwise
1978 */
1979int ast_waitfor(struct ast_channel *chan, int ms);
1980
1981/*!
1982 * \brief Should we keep this frame for later?
1983 *
1984 * There are functions such as ast_safe_sleep which will
1985 * service a channel to ensure that it does not have a
1986 * large backlog of queued frames. When this happens,
1987 * we want to hold on to specific frame types and just drop
1988 * others. This function will tell if the frame we just
1989 * read should be held onto.
1990 *
1991 * \param frame The frame we just read
1992 * \retval 1 frame should be kept
1993 * \retval 0 frame should be dropped
1994 */
1995int ast_is_deferrable_frame(const struct ast_frame *frame);
1996
1997/*!
1998 * \brief Wait for a specified amount of time, looking for hangups
1999 * \param chan channel to wait for
2000 * \param ms length of time in milliseconds to sleep. This should never be less than zero.
2001 * \details
2002 * Waits for a specified amount of time, servicing the channel as required.
2003 * \return returns -1 on hangup, otherwise 0.
2004 */
2005int ast_safe_sleep(struct ast_channel *chan, int ms);
2006
2007/*!
2008 * \brief Wait for a specified amount of time, looking for hangups, and do not generate silence
2009 * \param chan channel to wait for
2010 * \param ms length of time in milliseconds to sleep. This should never be less than zero.
2011 * \details
2012 * Waits for a specified amount of time, servicing the channel as required.
2013 * \return returns -1 on hangup, otherwise 0.
2014 * \note Unlike ast_safe_sleep this will not generate silence if Asterisk is configured to do so.
2015 */
2016int ast_safe_sleep_without_silence(struct ast_channel *chan, int ms);
2017
2018/*!
2019 * \brief Wait for a specified amount of time, looking for hangups and a condition argument
2020 * \param chan channel to wait for
2021 * \param ms length of time in milliseconds to sleep.
2022 * \param cond a function pointer for testing continue condition
2023 * \param data argument to be passed to the condition test function
2024 * \return returns -1 on hangup, otherwise 0.
2025 * \details
2026 * Waits for a specified amount of time, servicing the channel as required. If cond
2027 * returns 0, this function returns.
2028 */
2029int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data );
2030
2031/*!
2032 * \brief Waits for activity on a group of channels
2033 * \param c an array of pointers to channels
2034 * \param n number of channels that are to be waited upon
2035 * \param fds an array of fds to wait upon
2036 * \param nfds the number of fds to wait upon
2037 * \param exception exception flag
2038 * \param outfd fd that had activity on it
2039 * \param ms On invocation, max wait time. Upon returning, how long the wait
2040 * actually was (in/out parameter).
2041 * \details
2042 * Big momma function here. Wait for activity on any of the n channels, or any of the nfds
2043 * file descriptors. -1 can be passed as the ms timeout to wait forever, 0 to
2044 * return instantly if theres no activity immediantely available.
2045 * \return Returns the channel with activity, or NULL on error or if an FD
2046 * came first. If the FD came first, it will be returned in outfd, otherwise, outfd
2047 * will be -1
2048 */
2049struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n,
2050 int *fds, int nfds, int *exception, int *outfd, int *ms);
2051
2052/*!
2053 * \brief Waits for input on a group of channels
2054 * Wait for input on an array of channels for a given # of milliseconds.
2055 * \return Return channel with activity, or NULL if none has activity.
2056 * \param chan an array of pointers to channels
2057 * \param n number of channels that are to be waited upon
2058 * \param ms time "ms" is modified in-place, if applicable
2059 */
2060struct ast_channel *ast_waitfor_n(struct ast_channel **chan, int n, int *ms);
2061
2062/*!
2063 * \brief Waits for input on an fd
2064 * \note This version works on fd's only. Be careful with it.
2065 */
2066int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception);
2067
2068
2069/*!
2070 * \brief Reads a frame
2071 *
2072 * \param chan channel to read a frame from
2073 *
2074 * \return Returns a frame, or NULL on error. If it returns NULL, you
2075 * best just stop reading frames and assume the channel has been
2076 * disconnected.
2077 *
2078 * \note This function will filter frames received from the channel so
2079 * that only frames from the default stream for each media type
2080 * are returned. All other media frames from other streams will
2081 * be absorbed internally and a NULL frame returned instead.
2082 */
2083struct ast_frame *ast_read(struct ast_channel *chan);
2084
2085/*!
2086 * \brief Reads a frame, but does not filter to just the default streams
2087 *
2088 * \param chan channel to read a frame from
2089 *
2090 * \return Returns a frame, or NULL on error. If it returns NULL, you
2091 * best just stop reading frames and assume the channel has been
2092 * disconnected.
2093 *
2094 * \note This function will not perform any filtering and will return
2095 * media frames from all streams on the channel. To determine which
2096 * stream a frame originated from the stream_num on it can be
2097 * examined.
2098 */
2099struct ast_frame *ast_read_stream(struct ast_channel *chan);
2100
2101/*!
2102 * \brief Reads a frame, returning AST_FRAME_NULL frame if audio.
2103 * \param chan channel to read a frame from
2104 * \return Returns a frame, or NULL on error. If it returns NULL, you
2105 * best just stop reading frames and assume the channel has been
2106 * disconnected.
2107 * \note Audio is replaced with AST_FRAME_NULL to avoid
2108 * transcode when the resulting audio is not necessary.
2109 */
2110struct ast_frame *ast_read_noaudio(struct ast_channel *chan);
2111
2112/*!
2113 * \brief Reads a frame, but does not filter to just the default streams,
2114 * returning AST_FRAME_NULL frame if audio.
2115 *
2116 * \param chan channel to read a frame from
2117 *
2118 * \return Returns a frame, or NULL on error. If it returns NULL, you
2119 * best just stop reading frames and assume the channel has been
2120 * disconnected.
2121 *
2122 * \note This function will not perform any filtering and will return
2123 * media frames from all streams on the channel. To determine which
2124 * stream a frame originated from the stream_num on it can be
2125 * examined.
2126 *
2127 * \note Audio is replaced with AST_FRAME_NULL to avoid
2128 * transcode when the resulting audio is not necessary.
2129 */
2130struct ast_frame *ast_read_stream_noaudio(struct ast_channel *chan);
2131
2132/*!
2133 * \brief Write a frame to a channel
2134 * This function writes the given frame to the indicated channel.
2135 * \param chan destination channel of the frame
2136 * \param frame frame that will be written
2137 * \return It returns 0 on success, -1 on failure.
2138 */
2139int ast_write(struct ast_channel *chan, struct ast_frame *frame);
2140
2141/*!
2142 * \brief Write video frame to a channel
2143 * This function writes the given frame to the indicated channel.
2144 * \param chan destination channel of the frame
2145 * \param frame frame that will be written
2146 * \return It returns 1 on success, 0 if not implemented, and -1 on failure.
2147 */
2148int ast_write_video(struct ast_channel *chan, struct ast_frame *frame);
2149
2150/*!
2151 * \brief Write text frame to a channel
2152 * This function writes the given frame to the indicated channel.
2153 * \param chan destination channel of the frame
2154 * \param frame frame that will be written
2155 * \return It returns 1 on success, 0 if not implemented, and -1 on failure.
2156 */
2157int ast_write_text(struct ast_channel *chan, struct ast_frame *frame);
2158
2159/*!
2160 * \brief Write a frame to a stream
2161 * This function writes the given frame to the indicated stream on the channel.
2162 * \param chan destination channel of the frame
2163 * \param stream_num destination stream on the channel
2164 * \param frame frame that will be written
2165 * \return It returns 0 on success, -1 on failure.
2166 * \note If -1 is provided as the stream number and a media frame is provided the
2167 * function will write to the default stream of the type of media.
2168 */
2169int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame *frame);
2170
2171/*! \brief Send empty audio to prime a channel driver */
2172int ast_prod(struct ast_channel *chan);
2173
2174/*!
2175 * \brief Set specific read path on channel.
2176 * \since 13.4.0
2177 *
2178 * \param chan Channel to setup read path.
2179 * \param raw_format Format to expect from the channel driver.
2180 * \param core_format What the core wants to read.
2181 *
2182 * \pre chan is locked
2183 *
2184 * \retval 0 on success.
2185 * \retval -1 on error.
2186 */
2187int ast_set_read_format_path(struct ast_channel *chan, struct ast_format *raw_format, struct ast_format *core_format);
2188
2189/*!
2190 * \brief Set specific write path on channel.
2191 * \since 13.13.0
2192 *
2193 * \param chan Channel to setup write path.
2194 * \param core_format What the core wants to write.
2195 * \param raw_format Raw write format.
2196 *
2197 * \pre chan is locked
2198 *
2199 * \retval 0 on success.
2200 * \retval -1 on error.
2201 */
2202int ast_set_write_format_path(struct ast_channel *chan, struct ast_format *core_format, struct ast_format *raw_format);
2203
2204/*!
2205 * \brief Sets read format on channel chan from capabilities
2206 * Set read format for channel to whichever component of "format" is best.
2207 * \param chan channel to change
2208 * \param formats new formats to pick from for reading
2209 * \return Returns 0 on success, -1 on failure
2210 */
2212
2213/*!
2214 * \brief Sets read format on channel chan
2215 * \param chan channel to change
2216 * \param format format to set for reading
2217 * \return Returns 0 on success, -1 on failure
2218 */
2219int ast_set_read_format(struct ast_channel *chan, struct ast_format *format);
2220
2221/*!
2222 * \brief Sets write format on channel chan
2223 * Set write format for channel to whichever component of "format" is best.
2224 * \param chan channel to change
2225 * \param formats new formats to pick from for writing
2226 * \return Returns 0 on success, -1 on failure
2227 */
2229
2230/*!
2231 * \brief Sets write format on channel chan
2232 * \param chan channel to change
2233 * \param format format to set for writing
2234 * \return Returns 0 on success, -1 on failure
2235 */
2236int ast_set_write_format(struct ast_channel *chan, struct ast_format *format);
2237
2238/*!
2239 * \brief Sets write format for a channel.
2240 * All internal data will than be handled in an interleaved format. (needed by binaural opus)
2241 *
2242 * \param chan channel to change
2243 * \param format format to set for writing
2244 * \return Returns 0 on success, -1 on failure
2245 */
2246int ast_set_write_format_interleaved_stereo(struct ast_channel *chan, struct ast_format *format);
2247
2248/*!
2249 * \brief Sends text to a channel
2250 *
2251 * \param chan channel to act upon
2252 * \param text string of text to send on the channel
2253 *
2254 * \details
2255 * Write text to a display on a channel
2256 *
2257 * \note The channel does not need to be locked before calling this function.
2258 *
2259 * \retval 0 on success
2260 * \retval -1 on failure
2261 */
2262int ast_sendtext(struct ast_channel *chan, const char *text);
2263
2264/*!
2265 * \brief Sends text to a channel in an ast_msg_data structure wrapper with ast_sendtext as fallback
2266 * \since 13.22.0
2267 * \since 15.5.0
2268 *
2269 * \param chan channel to act upon
2270 * \param msg ast_msg_data structure
2271 *
2272 * \details
2273 * Write text to a display on a channel. If the channel driver doesn't support the
2274 * send_text_data callback. then the original send_text callback will be used if
2275 * available.
2276 *
2277 * \note The channel does not need to be locked before calling this function.
2278 *
2279 * \retval 0 on success
2280 * \retval -1 on failure
2281 */
2282int ast_sendtext_data(struct ast_channel *chan, struct ast_msg_data *msg);
2283
2284/*!
2285 * \brief Receives a text character from a channel
2286 * \param chan channel to act upon
2287 * \param timeout timeout in milliseconds (0 for infinite wait)
2288 * \details
2289 * Read a char of text from a channel
2290 * \return 0 on success, -1 on failure
2291 */
2292int ast_recvchar(struct ast_channel *chan, int timeout);
2293
2294/*!
2295 * \brief End sending an MF digit to a channel.
2296 * \param chan channel to act upon
2297 * \return Returns 0 on success, -1 on failure
2298 */
2299int ast_senddigit_mf_end(struct ast_channel *chan);
2300
2301/*!
2302 * \brief Send an MF digit to a channel.
2303 *
2304 * \param chan channel to act upon
2305 * \param digit the MF digit to send, encoded in ASCII
2306 * \param duration the duration of a numeric digit ending in ms
2307 * \param durationkp the duration of a KP digit ending in ms
2308 * \param durationst the duration of a ST, STP, ST2P, or ST3P digit ending in ms
2309 * \param is_external 1 if called by a thread that is not the channel's media
2310 * handler thread, 0 if called by the channel's media handler
2311 * thread.
2312 *
2313 * \return 0 on success, -1 on failure
2314 */
2315int ast_senddigit_mf(struct ast_channel *chan, char digit, unsigned int duration,
2316 unsigned int durationkp, unsigned int durationst, int is_external);
2317
2318/*!
2319 * \brief Send a DTMF digit to a channel.
2320 *
2321 * \param chan channel to act upon
2322 * \param digit the DTMF digit to send, encoded in ASCII
2323 * \param duration the duration of the digit ending in ms
2324 *
2325 * \pre This must only be called by the channel's media handler thread.
2326 *
2327 * \return 0 on success, -1 on failure
2328 */
2329int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration);
2330
2331/*!
2332 * \brief Send a DTMF digit to a channel from an external thread.
2333 *
2334 * \param chan channel to act upon
2335 * \param digit the DTMF digit to send, encoded in ASCII
2336 * \param duration the duration of the digit ending in ms
2337 *
2338 * \pre This must only be called by threads that are not the channel's
2339 * media handler thread.
2340 *
2341 * \return 0 on success, -1 on failure
2342 */
2343int ast_senddigit_external(struct ast_channel *chan, char digit, unsigned int duration);
2344
2345/*!
2346 * \brief Send an MF digit to a channel.
2347 * \param chan channel to act upon
2348 * \param digit the MF digit to send, encoded in ASCII
2349 * \return 0 on success, -1 on failure
2350 */
2351int ast_senddigit_mf_begin(struct ast_channel *chan, char digit);
2352
2353/*!
2354 * \brief Send a DTMF digit to a channel.
2355 * \param chan channel to act upon
2356 * \param digit the DTMF digit to send, encoded in ASCII
2357 * \return 0 on success, -1 on failure
2358 */
2359int ast_senddigit_begin(struct ast_channel *chan, char digit);
2360
2361/*!
2362 * \brief Send a DTMF digit to a channel.
2363 * \param chan channel to act upon
2364 * \param digit the DTMF digit to send, encoded in ASCII
2365 * \param duration the duration of the digit ending in ms
2366 * \return Returns 0 on success, -1 on failure
2367 */
2368int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration);
2369
2370/*!
2371 * \brief Receives a text string from a channel
2372 * Read a string of text from a channel
2373 * \param chan channel to act upon
2374 * \param timeout timeout in milliseconds (0 for infinite wait)
2375 * \return the received text, or NULL to signify failure.
2376 */
2377char *ast_recvtext(struct ast_channel *chan, int timeout);
2378
2379/*!
2380 * \brief Waits for a digit
2381 * \param c channel to wait for a digit on
2382 * \param ms how many milliseconds to wait (<0 for indefinite).
2383 * \return Returns <0 on error, 0 on no entry, and the digit on success.
2384 */
2385int ast_waitfordigit(struct ast_channel *c, int ms);
2386
2387/*!
2388 * \brief Wait for a digit
2389 * Same as ast_waitfordigit() with audio fd for outputting read audio and ctrlfd to monitor for reading.
2390 * \param c channel to wait for a digit on
2391 * \param ms how many milliseconds to wait (<0 for indefinite).
2392 * \param breakon string of DTMF digits to break upon or NULL for any.
2393 * \param audiofd audio file descriptor to write to if audio frames are received
2394 * \param ctrlfd control file descriptor to monitor for reading
2395 * \return Returns 1 if ctrlfd becomes available
2396 */
2397int ast_waitfordigit_full(struct ast_channel *c, int ms, const char *breakon, int audiofd, int ctrlfd);
2398
2399/*!
2400 * \brief Reads multiple digits
2401 * \param c channel to read from
2402 * \param s string to read in to. Must be at least the size of your length
2403 * \param len how many digits to read (maximum)
2404 * \param timeout how long to timeout between digits
2405 * \param rtimeout timeout to wait on the first digit
2406 * \param enders digits to end the string
2407 * \details
2408 * Read in a digit string "s", max length "len", maximum timeout between
2409 * digits "timeout" (-1 for none), terminated by anything in "enders". Give them rtimeout
2410 * for the first digit.
2411 * \return Returns 0 on normal return, or 1 on a timeout. In the case of
2412 * a timeout, any digits that were read before the timeout will still be available in s.
2413 * RETURNS 2 in full version when ctrlfd is available, NOT 1
2414 */
2415int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders);
2416int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders, int audiofd, int ctrlfd);
2417
2418/*! \brief Report DTMF on channel 0 */
2419#define AST_BRIDGE_DTMF_CHANNEL_0 (1 << 0)
2420/*! \brief Report DTMF on channel 1 */
2421#define AST_BRIDGE_DTMF_CHANNEL_1 (1 << 1)
2422
2423
2424/*!
2425 * \brief Make the frame formats of two channels compatible.
2426 *
2427 * \param chan First channel to make compatible. Should be the calling party.
2428 * \param peer Other channel to make compatible. Should be the called party.
2429 *
2430 * \note Absolutely _NO_ channel locks should be held before calling this function.
2431 *
2432 * \details
2433 * Set two channels to compatible frame formats in both
2434 * directions. The path from peer to chan is made compatible
2435 * first to allow for in-band audio in case the other direction
2436 * cannot be made compatible.
2437 *
2438 * \retval 0 on success.
2439 * \retval -1 on error.
2440 */
2441int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer);
2442
2443/*!
2444 * \brief Bridge two channels together (early)
2445 * \param c0 first channel to bridge
2446 * \param c1 second channel to bridge
2447 * \details
2448 * Bridge two channels (c0 and c1) together early. This implies either side may not be answered yet.
2449 * \return Returns 0 on success and -1 if it could not be done
2450 */
2451int ast_channel_early_bridge(struct ast_channel *c0, struct ast_channel *c1);
2452
2453/*!
2454 * \brief Gives the string form of a given cause code.
2455 *
2456 * \param cause cause to get the description of
2457 * \return the text form of the binary cause code given
2458 */
2459const char *ast_cause2str(int cause) attribute_pure;
2460
2461/*!
2462 * \brief Convert the string form of a cause code to a number
2463 *
2464 * \param name string form of the cause
2465 * \return the cause code
2466 */
2467int ast_str2cause(const char *name) attribute_pure;
2468
2469/*!
2470 * \brief Gives the string form of a given channel state
2471 *
2472 * \param state state to get the name of
2473 * \return the text form of the binary state given
2474 *
2475 * \note This function is not reentrant.
2476 */
2477const char *ast_state2str(enum ast_channel_state state);
2478
2479/*!
2480 * \brief Gives the string form of a given transfer capability
2481 *
2482 * \param transfercapability transfer capability to get the name of
2483 * \return the text form of the binary transfer capability
2484 */
2485char *ast_transfercapability2str(int transfercapability) attribute_const;
2486
2487/*
2488 * Options: Some low-level drivers may implement "options" allowing fine tuning of the
2489 * low level channel. See frame.h for options. Note that many channel drivers may support
2490 * none or a subset of those features, and you should not count on this if you want your
2491 * asterisk application to be portable. They're mainly useful for tweaking performance
2492 */
2493
2494/*!
2495 * \brief Sets an option on a channel
2496 *
2497 * \param channel channel to set options on
2498 * \param option option to change
2499 * \param data data specific to option
2500 * \param datalen length of the data
2501 * \param block blocking or not
2502 * \details
2503 * Set an option on a channel (see frame.h), optionally blocking awaiting the reply
2504 * \return 0 on success and -1 on failure
2505 */
2506int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block);
2507
2508/*!
2509 * \brief Checks the value of an option
2510 *
2511 * Query the value of an option
2512 * Works similarly to setoption except only reads the options.
2513 */
2514int ast_channel_queryoption(struct ast_channel *channel, int option, void *data, int *datalen, int block);
2515
2516/*!
2517 * \brief Checks for HTML support on a channel
2518 * \return 0 if channel does not support HTML or non-zero if it does
2519 */
2520int ast_channel_supports_html(struct ast_channel *channel);
2521
2522/*!
2523 * \brief Sends HTML on given channel
2524 * Send HTML or URL on link.
2525 * \return 0 on success or -1 on failure
2526 */
2527int ast_channel_sendhtml(struct ast_channel *channel, int subclass, const char *data, int datalen);
2528
2529/*!
2530 * \brief Sends a URL on a given link
2531 * Send URL on link.
2532 * \return 0 on success or -1 on failure
2533 */
2534int ast_channel_sendurl(struct ast_channel *channel, const char *url);
2535
2536/*!
2537 * \brief Defers DTMF so that you only read things like hangups and audio.
2538 * \return non-zero if channel was already DTMF-deferred or
2539 * 0 if channel is just now being DTMF-deferred
2540 */
2541int ast_channel_defer_dtmf(struct ast_channel *chan);
2542
2543/*! Undo defer. ast_read will return any DTMF characters that were queued */
2544void ast_channel_undefer_dtmf(struct ast_channel *chan);
2545
2546/*! \return number of channels available for lookup */
2547int ast_active_channels(void);
2548
2549/*! \return the number of channels not yet destroyed */
2550int ast_undestroyed_channels(void);
2551
2552/*! Activate a given generator */
2553int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params);
2554
2555/*! Deactivate an active generator */
2556void ast_deactivate_generator(struct ast_channel *chan);
2557
2558/*!
2559 * \since 13.27.0
2560 * \since 16.4.0
2561 * \brief Obtain how long it's been, in milliseconds, since the channel was created
2562 *
2563 * \param chan The channel object
2564 *
2565 * \retval 0 if the time value cannot be computed (or you called this really fast)
2566 * \retval The number of milliseconds since channel creation
2567 */
2568int64_t ast_channel_get_duration_ms(struct ast_channel *chan);
2569
2570/*!
2571 * \since 12
2572 * \brief Obtain how long the channel since the channel was created
2573 *
2574 * \param chan The channel object
2575 *
2576 * \retval 0 if the time value cannot be computed (or you called this really fast)
2577 * \retval The number of seconds the channel has been up
2578 */
2579int ast_channel_get_duration(struct ast_channel *chan);
2580
2581/*!
2582 * \since 13.27.0
2583 * \since 16.4.0
2584 * \brief Obtain how long it has been since the channel was answered in ms
2585 *
2586 * \param chan The channel object
2587 *
2588 * \retval 0 if the channel isn't answered (or you called this really fast)
2589 * \retval The number of milliseconds the channel has been up
2590 */
2591int64_t ast_channel_get_up_time_ms(struct ast_channel *chan);
2592
2593/*!
2594 * \since 12
2595 * \brief Obtain how long it has been since the channel was answered
2596 *
2597 * \param chan The channel object
2598 *
2599 * \retval 0 if the channel isn't answered (or you called this really fast)
2600 * \retval The number of seconds the channel has been up
2601 */
2602int ast_channel_get_up_time(struct ast_channel *chan);
2603
2604/*!
2605 * \brief Set caller ID number, name and ANI and generate AMI event.
2606 *
2607 * \note Use ast_channel_set_caller() and ast_channel_set_caller_event() instead.
2608 * \note The channel does not need to be locked before calling this function.
2609 */
2610void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani);
2611
2612/*!
2613 * \brief Set the caller id information in the Asterisk channel
2614 * \since 1.8
2615 *
2616 * \param chan Asterisk channel to set caller id information
2617 * \param caller Caller id information
2618 * \param update What caller information to update. NULL if all.
2619 *
2620 * \note The channel does not need to be locked before calling this function.
2621 */
2622void ast_channel_set_caller(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update);
2623
2624/*!
2625 * \brief Set the caller id information in the Asterisk channel and generate an AMI event
2626 * if the caller id name or number changed.
2627 * \since 1.8
2628 *
2629 * \param chan Asterisk channel to set caller id information
2630 * \param caller Caller id information
2631 * \param update What caller information to update. NULL if all.
2632 *
2633 * \note The channel does not need to be locked before calling this function.
2634 */
2635void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update);
2636
2637/*! Set the file descriptor on the channel */
2638void ast_channel_set_fd(struct ast_channel *chan, int which, int fd);
2639
2640/*! Start a tone going */
2641int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol);
2642/*! Stop a tone from playing */
2643void ast_tonepair_stop(struct ast_channel *chan);
2644/*! Play a tone pair for a given amount of time */
2645int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol);
2646
2647/*!
2648 * \brief Automatically service a channel for us...
2649 *
2650 * \retval 0 success
2651 * \retval -1 failure, or the channel is already being autoserviced
2652 */
2653int ast_autoservice_start(struct ast_channel *chan);
2654
2655/*!
2656 * \brief Stop servicing a channel for us...
2657 *
2658 * \note if chan is locked prior to calling ast_autoservice_stop, it
2659 * is likely that there will be a deadlock between the thread that calls
2660 * ast_autoservice_stop and the autoservice thread. It is important
2661 * that chan is not locked prior to this call
2662 *
2663 * \param chan
2664 * \retval 0 success
2665 * \retval -1 error, or the channel has been hungup
2666 */
2667int ast_autoservice_stop(struct ast_channel *chan);
2668
2669/*!
2670 * \brief Put chan into autoservice while hanging up peer.
2671 * \since 11.0
2672 *
2673 * \param chan Chan to put into autoservice.
2674 * \param peer Chan to run hangup handlers and hangup.
2675 */
2676void ast_autoservice_chan_hangup_peer(struct ast_channel *chan, struct ast_channel *peer);
2677
2678/*!
2679 * \brief Ignore certain frame types
2680 * \note Normally, we cache DTMF, IMAGE, HTML, TEXT, and CONTROL frames
2681 * while a channel is in autoservice and queue them up when taken out of
2682 * autoservice. When this is not desireable, this API may be used to
2683 * cause the channel to ignore those frametypes after the channel is put
2684 * into autoservice, but before autoservice is stopped.
2685 * \retval 0 success
2686 * \retval -1 channel is not in autoservice
2687 */
2688int ast_autoservice_ignore(struct ast_channel *chan, enum ast_frame_type ftype);
2689
2690/*!
2691 * \brief Enable or disable timer ticks for a channel
2692 *
2693 * \param c channel
2694 * \param rate number of timer ticks per second
2695 * \param func callback function
2696 * \param data
2697 *
2698 * \details
2699 * If timers are supported, force a scheduled expiration on the
2700 * timer fd, at which point we call the callback function / data
2701 *
2702 * \note Call this function with a rate of 0 to turn off the timer ticks
2703 *
2704 * \version 1.6.1 changed samples parameter to rate, accommodates new timing methods
2705 */
2706int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data);
2707int ast_settimeout_full(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data, unsigned int is_ao2_obj);
2708
2709/*!
2710 * \brief Transfer a channel (if supported).
2711 * \retval -1 on error
2712 * \retval 0 if not supported
2713 * \retval 1 if supported and requested
2714 * \param chan current channel
2715 * \param dest destination extension for transfer
2716 */
2717int ast_transfer(struct ast_channel *chan, char *dest);
2718
2719/*!
2720 * \brief Transfer a channel (if supported) receieve protocol result.
2721 * \retval -1 on error
2722 * \retval 0 if not supported
2723 * \retval 1 if supported and requested
2724 * \param chan channel to transfer
2725 * \param dest destination extension to transfer to
2726 * \param protocol protocol is the protocol result
2727 * SIP example, 0=success, 3xx-6xx is SIP error code
2728 */
2729int ast_transfer_protocol(struct ast_channel *chan, char *dest, int *protocol);
2730
2731/*!
2732 * \brief Inherits channel variable from parent to child channel
2733 * \param parent Parent channel
2734 * \param child Child channel
2735 *
2736 * \details
2737 * Scans all channel variables in the parent channel, looking for those
2738 * that should be copied into the child channel.
2739 * Variables whose names begin with a single '_' are copied into the
2740 * child channel with the prefix removed.
2741 * Variables whose names begin with '__' are copied into the child
2742 * channel with their names unchanged.
2743 */
2744void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child);
2745
2746/*!
2747 * \brief adds a list of channel variables to a channel
2748 * \param chan the channel
2749 * \param vars a linked list of variables
2750 *
2751 * \pre chan is locked
2752 *
2753 * \details
2754 * Variable names can be for a regular channel variable or a dialplan function
2755 * that has the ability to be written to.
2756 */
2757void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars);
2758
2759/*!
2760 * \brief An opaque 'object' structure use by silence generators on channels.
2761 */
2763
2764/*!
2765 * \brief Starts a silence generator on the given channel.
2766 * \param chan The channel to generate silence on
2767 * \return An ast_silence_generator pointer, or NULL if an error occurs
2768 *
2769 * \details
2770 * This function will cause SLINEAR silence to be generated on the supplied
2771 * channel until it is disabled; if the channel cannot be put into SLINEAR
2772 * mode then the function will fail.
2773 *
2774 * \note
2775 * The pointer returned by this function must be preserved and passed to
2776 * ast_channel_stop_silence_generator when you wish to stop the silence
2777 * generation.
2778 */
2780
2781/*!
2782 * \brief Stops a previously-started silence generator on the given channel.
2783 * \param chan The channel to operate on
2784 * \param state The ast_silence_generator pointer return by a previous call to
2785 * ast_channel_start_silence_generator.
2786 *
2787 * \details
2788 * This function will stop the operating silence generator and return the channel
2789 * to its previous write format.
2790 */
2792
2793/*!
2794 * \brief Determine which channel has an older linkedid
2795 * \param a First channel
2796 * \param b Second channel
2797 * \return Returns an ast_channel structure that has oldest linkedid
2798 */
2800
2801/*!
2802 * \brief Copy the full linkedid channel id structure from one channel to another
2803 * \param dest Destination to copy linkedid to
2804 * \param source Source channel to copy linkedid from
2805 */
2806void ast_channel_internal_copy_linkedid(struct ast_channel *dest, struct ast_channel *source);
2807
2808/*!
2809 * \brief Swap uniqueid and linkedid beteween two channels
2810 * \param a First channel
2811 * \param b Second channel
2812 *
2813 * \note
2814 * This is used in masquerade to exchange identities
2815 */
2817
2818/*!
2819 * \brief Swap topics beteween two channels
2820 * \param a First channel
2821 * \param b Second channel
2822 *
2823 * \note
2824 * This is used in masquerade to exchange topics for message routing
2825 */
2827
2828/*!
2829 * \brief Swap endpoint_forward between two channels
2830 * \param a First channel
2831 * \param b Second channel
2832 *
2833 * \note
2834 * This is used in masquerade to exchange endpoint details if one of the two or both
2835 * the channels were created with endpoint
2836 */
2838
2839/*!
2840 * \brief Swap snapshots beteween two channels
2841 * \param a First channel
2842 * \param b Second channel
2843 *
2844 * \note
2845 * This is used in masquerade to exchange snapshots
2846 */
2848
2849/*!
2850 * \brief Swap endpoints between two channels
2851 * \param a First channel
2852 * \param b Second channel
2853 *
2854 * \note
2855 * This is used in masquerade to exchange endpoints
2856 */
2858
2859/*!
2860 * \brief Set uniqueid and linkedid string value only (not time)
2861 * \param chan The channel to set the uniqueid to
2862 * \param uniqueid The uniqueid to set
2863 * \param linkedid The linkedid to set
2864 *
2865 * \note
2866 * This is used only by ast_cel_fabricate_channel_from_event()
2867 * to create a temporary fake channel - time values are invalid
2868 */
2869void ast_channel_internal_set_fake_ids(struct ast_channel *chan, const char *uniqueid, const char *linkedid);
2870
2871/* Misc. functions below */
2872
2873/*!
2874 * \brief if fd is a valid descriptor, set *pfd with the descriptor
2875 * \return Return 1 (not -1!) if added, 0 otherwise (so we can add the
2876 * return value to the index into the array)
2877 */
2878static inline int ast_add_fd(struct pollfd *pfd, int fd)
2879{
2880 pfd->fd = fd;
2881 pfd->events = POLLIN | POLLPRI;
2882 return fd >= 0;
2883}
2884
2885/*! \brief Helper function for migrating select to poll */
2886static inline int ast_fdisset(struct pollfd *pfds, int fd, int maximum, int *start)
2887{
2888 int x;
2889 int dummy = 0;
2890
2891 if (fd < 0)
2892 return 0;
2893 if (!start)
2894 start = &dummy;
2895 for (x = *start; x < maximum; x++)
2896 if (pfds[x].fd == fd) {
2897 if (x == *start)
2898 (*start)++;
2899 return pfds[x].revents;
2900 }
2901 return 0;
2902}
2903
2904/*!
2905 * \brief Retrieves the current T38 state of a channel
2906 *
2907 * \note Absolutely _NO_ channel locks should be held before calling this function.
2908 */
2909static inline enum ast_t38_state ast_channel_get_t38_state(struct ast_channel *chan)
2910{
2912 int datalen = sizeof(state);
2913
2915
2916 return state;
2917}
2918
2919/*!
2920 * \brief Set the blocking indication on the channel.
2921 *
2922 * \details
2923 * Indicate that the thread handling the channel is about to do a blocking
2924 * operation to wait for media on the channel. (poll, read, or write)
2925 *
2926 * Masquerading and ast_queue_frame() use this indication to wake up the thread.
2927 *
2928 * \pre The channel needs to be locked
2929 */
2930#define CHECK_BLOCKING(c) \
2931 do { \
2932 if (ast_test_flag(ast_channel_flags(c), AST_FLAG_BLOCKING)) { \
2933 /* This should not happen as there should only be one thread handling a channel's media at a time. */ \
2934 ast_log(LOG_DEBUG, "Thread LWP %d is blocking '%s', already blocked by thread LWP %d in procedure %s\n", \
2935 ast_get_tid(), ast_channel_name(c), \
2936 ast_channel_blocker_tid(c), ast_channel_blockproc(c)); \
2937 ast_assert(0); \
2938 } \
2939 ast_channel_blocker_tid_set((c), ast_get_tid()); \
2940 ast_channel_blocker_set((c), pthread_self()); \
2941 ast_channel_blockproc_set((c), __PRETTY_FUNCTION__); \
2942 ast_set_flag(ast_channel_flags(c), AST_FLAG_BLOCKING); \
2943 } while (0)
2944
2945ast_group_t ast_get_group(const char *s);
2946
2947/*! \brief Print call and pickup groups into buffer */
2948char *ast_print_group(char *buf, int buflen, ast_group_t group);
2949
2950/*! \brief Opaque struct holding a namedgroups set, i.e. a set of group names */
2951struct ast_namedgroups;
2952
2953/*! \brief Create an ast_namedgroups set with group names from comma separated string */
2954struct ast_namedgroups *ast_get_namedgroups(const char *s);
2955struct ast_namedgroups *ast_unref_namedgroups(struct ast_namedgroups *groups);
2956struct ast_namedgroups *ast_ref_namedgroups(struct ast_namedgroups *groups);
2957/*! \brief Return TRUE if group a and b contain at least one common groupname */
2958int ast_namedgroups_intersect(struct ast_namedgroups *a, struct ast_namedgroups *b);
2959
2960/*! \brief Print named call groups and named pickup groups */
2961char *ast_print_namedgroups(struct ast_str **buf, struct ast_namedgroups *groups);
2962
2963/*! \brief return an ast_variable list of channeltypes */
2965
2966/*!
2967 * \brief return an english explanation of the code returned thru __ast_request_and_dial's 'outstate' argument
2968 * \param reason The integer argument, usually taken from AST_CONTROL_ macros
2969 * \return char pointer explaining the code
2970 */
2971const char *ast_channel_reason2str(int reason);
2972
2973/*! \brief channel group info */
2974struct ast_group_info {
2975 struct ast_channel *chan;
2976 char *category;
2977 char *group;
2979};
2980
2981#define ast_channel_lock(chan) ao2_lock(chan)
2982#define ast_channel_unlock(chan) ao2_unlock(chan)
2983#define ast_channel_trylock(chan) ao2_trylock(chan)
2984
2985/*!
2986 * \brief Lock two channels.
2987 */
2988#define ast_channel_lock_both(chan1, chan2) do { \
2989 ast_channel_lock(chan1); \
2990 while (ast_channel_trylock(chan2)) { \
2991 ast_channel_unlock(chan1); \
2992 sched_yield(); \
2993 ast_channel_lock(chan1); \
2994 } \
2995 } while (0)
2996
2997/*!
2998 * \brief Increase channel reference count
2999 *
3000 * \param c the channel
3001 *
3002 * \retval c always
3003 *
3004 * \since 1.8
3005 */
3006#define ast_channel_ref(c) ({ ao2_ref(c, +1); (c); })
3007
3008/*!
3009 * \brief Decrease channel reference count
3010 *
3011 * \param c the channel
3012 *
3013 * \retval NULL always
3014 *
3015 * \since 1.8
3016 */
3017#define ast_channel_unref(c) ({ ao2_ref(c, -1); (struct ast_channel *) (NULL); })
3018
3019/*!
3020 * \brief Cleanup a channel reference
3021 *
3022 * \param c the channel (NULL tolerant)
3023 *
3024 * \retval NULL always
3025 *
3026 * \since 12.0.0
3027 */
3028#define ast_channel_cleanup(c) ({ ao2_cleanup(c); (struct ast_channel *) (NULL); })
3029
3030/*! Channel Iterating @{ */
3031
3032/*!
3033 * \brief A channel iterator
3034 *
3035 * This is an opaque type.
3036 */
3038
3039/*!
3040 * \brief Destroy a channel iterator
3041 *
3042 * \param i the itereator to destroy
3043 *
3044 * \details
3045 * This function is used to destroy a channel iterator that was retrieved by
3046 * using one of the channel_iterator_xxx_new() functions.
3047 *
3048 * \retval NULL for convenience to clear out the pointer to the iterator that
3049 * was just destroyed.
3050 *
3051 * \since 1.8
3052 */
3054
3055/*!
3056 * \brief Create a new channel iterator based on extension
3057 *
3058 * \param exten The extension that channels must be in
3059 * \param context The context that channels must be in
3060 *
3061 * \details
3062 * After creating an iterator using this function, the ast_channel_iterator_next()
3063 * function can be used to iterate through all channels that are currently
3064 * in the specified context and extension.
3065 *
3066 * \note You must call ast_channel_iterator_destroy() when done.
3067 *
3068 * \retval NULL on failure
3069 * \retval a new channel iterator based on the specified parameters
3070 *
3071 * \since 1.8
3072 */
3073struct ast_channel_iterator *ast_channel_iterator_by_exten_new(const char *exten, const char *context);
3074
3075/*!
3076 * \brief Create a new channel iterator based on name
3077 *
3078 * \param name channel name or channel uniqueid to match
3079 * \param name_len number of characters in the channel name to match on. This
3080 * would be used to match based on name prefix. If matching on the full
3081 * channel name is desired, then this parameter should be 0.
3082 *
3083 * \details
3084 * After creating an iterator using this function, the ast_channel_iterator_next()
3085 * function can be used to iterate through all channels that exist that have
3086 * the specified name or name prefix.
3087 *
3088 * \note You must call ast_channel_iterator_destroy() when done.
3089 *
3090 * \retval NULL on failure
3091 * \retval a new channel iterator based on the specified parameters
3092 *
3093 * \since 1.8
3094 */
3095struct ast_channel_iterator *ast_channel_iterator_by_name_new(const char *name, size_t name_len);
3096
3097/*!
3098 * \brief Create a new channel iterator
3099 *
3100 * \details
3101 * After creating an iterator using this function, the ast_channel_iterator_next()
3102 * function can be used to iterate through all channels that exist.
3103 *
3104 * \note You must call ast_channel_iterator_destroy() when done.
3105 *
3106 * \retval NULL on failure
3107 * \retval a new channel iterator
3108 *
3109 * \since 1.8
3110 */
3112
3113/*!
3114 * \brief Get the next channel for a channel iterator
3115 *
3116 * \param i the channel iterator that was created using one of the
3117 * channel_iterator_xxx_new() functions.
3118 *
3119 * \details
3120 * This function should be used to iterate through all channels that match a
3121 * specified set of parameters that were provided when the iterator was created.
3122 *
3123 * \retval the next channel that matches the parameters used when the iterator
3124 * was created.
3125 * \retval NULL if no more channels match the iterator parameters.
3126 *
3127 * \since 1.8
3128 */
3130
3131/*! @} End channel iterator definitions. */
3132
3133/*! @{ Channel search functions */
3134
3135/*!
3136* \warning Absolutely _NO_ channel locks should be held while calling any of
3137* these functions.
3138*/
3139
3140/*!
3141 * \brief Call a function with every active channel
3142 *
3143 * \details
3144 * This function executes a callback one time for each active channel on the
3145 * system. The channel is provided as an argument to the function.
3146 *
3147 * \since 1.8
3148 */
3149struct ast_channel *ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg,
3150 void *data, int ao2_flags);
3151
3152/*!
3153 * \brief Find a channel by name or uniqueid
3154 *
3155 * \param search the name or uniqueid of the channel to search for
3156 *
3157 * \details
3158 * First searches for a channel with a matching name. If not found
3159 * a search for a channel with a matching uniqueid is done.
3160 *
3161 * \retval a channel with a matching name or uniqueid
3162 * \retval NULL if no channel was found
3163 *
3164 *\note The fallback search by uniqueid is a historical thing. If you
3165 * know the search term is a uniqueid, use \ref ast_channel_get_by_uniqueid
3166 * instead.
3167 *
3168 * \since 1.8
3169 */
3170struct ast_channel *ast_channel_get_by_name(const char *search);
3171
3172/*!
3173 * \brief Find a channel by a name prefix
3174 *
3175 * \param search The channel name or uniqueid prefix to search for
3176 * \param len Only search for up to this many characters from the search term
3177 *
3178 * \details
3179 * Search for a channel that has the same name prefix as specified by the
3180 * search term. If not found, search for an exact match on the uniqueid.
3181 * Searching by partial uniqueid doesn't make any sense as it's usually
3182 * a system-name plus a timestamp and is not supported.
3183 *
3184 * \retval a channel with a matching name or uniqueid
3185 * \retval NULL if no channel was found
3186 *
3187 *\note The fallback search by uniqueid is a historical thing. If you
3188 * know the search term is a uniqueid, use \ref ast_channel_get_by_uniqueid
3189 * instead.
3190 *
3191 * \since 1.8
3192 */
3193struct ast_channel *ast_channel_get_by_name_prefix(const char *name, size_t name_len);
3194
3195/*!
3196 * \brief Find a channel by extension and context
3197 *
3198 * \param exten the extension to search for
3199 * \param context the context to search for
3200 *
3201 * \details
3202 * Return a channel that is currently at the specified extension and context.
3203 *
3204 * \retval a channel that is at the specified extension and context
3205 * \retval NULL if no channel was found
3206 *
3207 * \since 1.8
3208 */
3209struct ast_channel *ast_channel_get_by_exten(const char *exten, const char *context);
3210
3211/*!
3212 * \brief Find a channel by a uniqueid
3213 *
3214 * \param uniqueid The uniqueid to search for
3215 *
3216 * \retval a channel with the uniqueid specified by the arguments
3217 * \retval NULL if no channel was found
3218 */
3220
3221/*! @} End channel search functions. */
3222
3223/*!
3224 * \brief Initialize the given name structure.
3225 * \since 1.8
3226 *
3227 * \param init Name structure to initialize.
3228 */
3229void ast_party_name_init(struct ast_party_name *init);
3230
3231/*!
3232 * \brief Copy the source party name information to the destination party name.
3233 * \since 1.8
3234 *
3235 * \param dest Destination party name
3236 * \param src Source party name
3237 */
3238void ast_party_name_copy(struct ast_party_name *dest, const struct ast_party_name *src);
3239
3240/*!
3241 * \brief Initialize the given party name structure using the given guide
3242 * for a set update operation.
3243 * \since 1.8
3244 *
3245 * \details
3246 * The initialization is needed to allow a set operation to know if a
3247 * value needs to be updated. Simple integers need the guide's original
3248 * value in case the set operation is not trying to set a new value.
3249 * String values are simply set to NULL pointers if they are not going
3250 * to be updated.
3251 *
3252 * \param init Party name structure to initialize.
3253 * \param guide Source party name to use as a guide in initializing.
3254 */
3255void ast_party_name_set_init(struct ast_party_name *init, const struct ast_party_name *guide);
3256
3257/*!
3258 * \brief Set the source party name information into the destination party name.
3259 * \since 1.8
3260 *
3261 * \param dest The name one wishes to update
3262 * \param src The new name values to update the dest
3263 */
3264void ast_party_name_set(struct ast_party_name *dest, const struct ast_party_name *src);
3265
3266/*!
3267 * \brief Destroy the party name contents
3268 * \since 1.8
3269 *
3270 * \param doomed The party name to destroy.
3271 */
3272void ast_party_name_free(struct ast_party_name *doomed);
3273
3274/*!
3275 * \brief Initialize the given number structure.
3276 * \since 1.8
3277 *
3278 * \param init Number structure to initialize.
3279 */
3280void ast_party_number_init(struct ast_party_number *init);
3281
3282/*!
3283 * \brief Copy the source party number information to the destination party number.
3284 * \since 1.8
3285 *
3286 * \param dest Destination party number
3287 * \param src Source party number
3288 */
3289void ast_party_number_copy(struct ast_party_number *dest, const struct ast_party_number *src);
3290
3291/*!
3292 * \brief Initialize the given party number structure using the given guide
3293 * for a set update operation.
3294 * \since 1.8
3295 *
3296 * \details
3297 * The initialization is needed to allow a set operation to know if a
3298 * value needs to be updated. Simple integers need the guide's original
3299 * value in case the set operation is not trying to set a new value.
3300 * String values are simply set to NULL pointers if they are not going
3301 * to be updated.
3302 *
3303 * \param init Party number structure to initialize.
3304 * \param guide Source party number to use as a guide in initializing.
3305 */
3306void ast_party_number_set_init(struct ast_party_number *init, const struct ast_party_number *guide);
3307
3308/*!
3309 * \brief Set the source party number information into the destination party number.
3310 * \since 1.8
3311 *
3312 * \param dest The number one wishes to update
3313 * \param src The new number values to update the dest
3314 */
3315void ast_party_number_set(struct ast_party_number *dest, const struct ast_party_number *src);
3316
3317/*!
3318 * \brief Destroy the party number contents
3319 * \since 1.8
3320 *
3321 * \param doomed The party number to destroy.
3322 */
3323void ast_party_number_free(struct ast_party_number *doomed);
3324
3325/*!
3326 * \since 1.8
3327 * \brief Initialize the given subaddress structure.
3328 *
3329 * \param init Subaddress structure to initialize.
3330 */
3332
3333/*!
3334 * \since 1.8
3335 * \brief Copy the source party subaddress information to the destination party subaddress.
3336 *
3337 * \param dest Destination party subaddress
3338 * \param src Source party subaddress
3339 */
3340void ast_party_subaddress_copy(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src);
3341
3342/*!
3343 * \since 1.8
3344 * \brief Initialize the given party subaddress structure using the given guide
3345 * for a set update operation.
3346 *
3347 * \details
3348 * The initialization is needed to allow a set operation to know if a
3349 * value needs to be updated. Simple integers need the guide's original
3350 * value in case the set operation is not trying to set a new value.
3351 * String values are simply set to NULL pointers if they are not going
3352 * to be updated.
3353 *
3354 * \param init Party subaddress structure to initialize.
3355 * \param guide Source party subaddress to use as a guide in initializing.
3356 */
3357void ast_party_subaddress_set_init(struct ast_party_subaddress *init, const struct ast_party_subaddress *guide);
3358
3359/*!
3360 * \since 1.8
3361 * \brief Set the source party subaddress information into the destination party subaddress.
3362 *
3363 * \param dest The subaddress one wishes to update
3364 * \param src The new subaddress values to update the dest
3365 */
3366void ast_party_subaddress_set(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src);
3367
3368/*!
3369 * \since 1.8
3370 * \brief Destroy the party subaddress contents
3371 *
3372 * \param doomed The party subaddress to destroy.
3373 */
3375
3376/*!
3377 * \brief Set the update marker to update all information of a corresponding party id.
3378 * \since 11.0
3379 *
3380 * \param update_id The update marker for a corresponding party id.
3381 */
3382void ast_set_party_id_all(struct ast_set_party_id *update_id);
3383
3384/*!
3385 * \brief Initialize the given party id structure.
3386 * \since 1.8
3387 *
3388 * \param init Party id structure to initialize.
3389 */
3390void ast_party_id_init(struct ast_party_id *init);
3391
3392/*!
3393 * \brief Copy the source party id information to the destination party id.
3394 * \since 1.8
3395 *
3396 * \param dest Destination party id
3397 * \param src Source party id
3398 */
3399void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src);
3400
3401/*!
3402 * \brief Initialize the given party id structure using the given guide
3403 * for a set update operation.
3404 * \since 1.8
3405 *
3406 * \details
3407 * The initialization is needed to allow a set operation to know if a
3408 * value needs to be updated. Simple integers need the guide's original
3409 * value in case the set operation is not trying to set a new value.
3410 * String values are simply set to NULL pointers if they are not going
3411 * to be updated.
3412 *
3413 * \param init Party id structure to initialize.
3414 * \param guide Source party id to use as a guide in initializing.
3415 */
3416void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide);
3417
3418/*!
3419 * \brief Set the source party id information into the destination party id.
3420 * \since 1.8
3421 *
3422 * \param dest The id one wishes to update
3423 * \param src The new id values to update the dest
3424 * \param update What id information to update. NULL if all.
3425 */
3426void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update);
3427
3428/*!
3429 * \brief Destroy the party id contents
3430 * \since 1.8
3431 *
3432 * \param doomed The party id to destroy.
3433 */
3434void ast_party_id_free(struct ast_party_id *doomed);
3435
3436/*!
3437 * \brief Determine the overall presentation value for the given party.
3438 * \since 1.8
3439 *
3440 * \param id Party to determine the overall presentation value.
3441 *
3442 * \return Overall presentation value for the given party.
3443 */
3444int ast_party_id_presentation(const struct ast_party_id *id);
3445
3446/*!
3447 * \brief Invalidate all components of the given party id.
3448 * \since 11.0
3449 *
3450 * \param id The party id to invalidate.
3451 */
3452void ast_party_id_invalidate(struct ast_party_id *id);
3453
3454/*!
3455 * \brief Destroy and initialize the given party id structure.
3456 * \since 11.0
3457 *
3458 * \param id The party id to reset.
3459 */
3460void ast_party_id_reset(struct ast_party_id *id);
3461
3462/*!
3463 * \brief Merge a given party id into another given party id.
3464 * \since 11.0
3465 *
3466 * \details
3467 * This function will generate an effective party id.
3468 *
3469 * Each party id component of the party id 'base' is overwritten
3470 * by components of the party id 'overlay' if the overlay
3471 * component is marked as valid. However the component 'tag' of
3472 * the base party id remains untouched.
3473 *
3474 * \param base The party id which is merged.
3475 * \param overlay The party id which is used to merge into.
3476 *
3477 * \return The merged party id as a struct, not as a pointer.
3478 * \note The merged party id returned is a shallow copy and must not be freed.
3479 */
3480struct ast_party_id ast_party_id_merge(struct ast_party_id *base, struct ast_party_id *overlay);
3481
3482/*!
3483 * \brief Copy a merge of a given party id into another given party id to a given destination party id.
3484 * \since 11.0
3485 *
3486 * \details
3487 * Each party id component of the party id 'base' is overwritten by components
3488 * of the party id 'overlay' if the 'overlay' component is marked as valid.
3489 * However the component 'tag' of the 'base' party id remains untouched.
3490 * The result is copied into the given party id 'dest'.
3491 *
3492 * \note The resulting merged party id is a real copy and has to be freed.
3493 *
3494 * \param dest The resulting merged party id.
3495 * \param base The party id which is merged.
3496 * \param overlay The party id which is used to merge into.
3497 */
3498void ast_party_id_merge_copy(struct ast_party_id *dest, struct ast_party_id *base, struct ast_party_id *overlay);
3499
3500/*!
3501 * \brief Initialize the given dialed structure.
3502 * \since 1.8
3503 *
3504 * \param init Dialed structure to initialize.
3505 */
3506void ast_party_dialed_init(struct ast_party_dialed *init);
3507
3508/*!
3509 * \brief Copy the source dialed party information to the destination dialed party.
3510 * \since 1.8
3511 *
3512 * \param dest Destination dialed party
3513 * \param src Source dialed party
3514 */
3515void ast_party_dialed_copy(struct ast_party_dialed *dest, const struct ast_party_dialed *src);
3516
3517/*!
3518 * \brief Initialize the given dialed structure using the given
3519 * guide for a set update operation.
3520 * \since 1.8
3521 *
3522 * \details
3523 * The initialization is needed to allow a set operation to know if a
3524 * value needs to be updated. Simple integers need the guide's original
3525 * value in case the set operation is not trying to set a new value.
3526 * String values are simply set to NULL pointers if they are not going
3527 * to be updated.
3528 *
3529 * \param init Caller structure to initialize.
3530 * \param guide Source dialed to use as a guide in initializing.
3531 */
3532void ast_party_dialed_set_init(struct ast_party_dialed *init, const struct ast_party_dialed *guide);
3533
3534/*!
3535 * \brief Set the dialed information based on another dialed source
3536 * \since 1.8
3537 *
3538 * This is similar to ast_party_dialed_copy, except that NULL values for
3539 * strings in the src parameter indicate not to update the corresponding dest values.
3540 *
3541 * \param dest The dialed one wishes to update
3542 * \param src The new dialed values to update the dest
3543 */
3544void ast_party_dialed_set(struct ast_party_dialed *dest, const struct ast_party_dialed *src);
3545
3546/*!
3547 * \brief Destroy the dialed party contents
3548 * \since 1.8
3549 *
3550 * \param doomed The dialed party to destroy.
3551 */
3552void ast_party_dialed_free(struct ast_party_dialed *doomed);
3553
3554/*!
3555 * \since 1.8
3556 * \brief Initialize the given caller structure.
3557 *
3558 * \param init Caller structure to initialize.
3559 */
3560void ast_party_caller_init(struct ast_party_caller *init);
3561
3562/*!
3563 * \since 1.8
3564 * \brief Copy the source caller information to the destination caller.
3565 *
3566 * \param dest Destination caller
3567 * \param src Source caller
3568 */
3569void ast_party_caller_copy(struct ast_party_caller *dest, const struct ast_party_caller *src);
3570
3571/*!
3572 * \brief Initialize the given caller structure using the given
3573 * guide for a set update operation.
3574 * \since 1.8
3575 *
3576 * \details
3577 * The initialization is needed to allow a set operation to know if a
3578 * value needs to be updated. Simple integers need the guide's original
3579 * value in case the set operation is not trying to set a new value.
3580 * String values are simply set to NULL pointers if they are not going
3581 * to be updated.
3582 *
3583 * \param init Caller structure to initialize.
3584 * \param guide Source caller to use as a guide in initializing.
3585 */
3586void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide);
3587
3588/*!
3589 * \brief Set the caller information based on another caller source
3590 * \since 1.8
3591 *
3592 * This is similar to ast_party_caller_copy, except that NULL values for
3593 * strings in the src parameter indicate not to update the corresponding dest values.
3594 *
3595 * \param dest The caller one wishes to update
3596 * \param src The new caller values to update the dest
3597 * \param update What caller information to update. NULL if all.
3598 */
3599void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update);
3600
3601/*!
3602 * \brief Destroy the caller party contents
3603 * \since 1.8
3604 *
3605 * \param doomed The caller party to destroy.
3606 */
3607void ast_party_caller_free(struct ast_party_caller *doomed);
3608
3609/*!
3610 * \since 1.8
3611 * \brief Initialize the given connected line structure.
3612 *
3613 * \param init Connected line structure to initialize.
3614 */
3616
3617/*!
3618 * \since 1.8
3619 * \brief Copy the source connected line information to the destination connected line.
3620 *
3621 * \param dest Destination connected line
3622 * \param src Source connected line
3623 */
3625
3626/*!
3627 * \since 1.8
3628 * \brief Initialize the given connected line structure using the given
3629 * guide for a set update operation.
3630 *
3631 * \details
3632 * The initialization is needed to allow a set operation to know if a
3633 * value needs to be updated. Simple integers need the guide's original
3634 * value in case the set operation is not trying to set a new value.
3635 * String values are simply set to NULL pointers if they are not going
3636 * to be updated.
3637 *
3638 * \param init Connected line structure to initialize.
3639 * \param guide Source connected line to use as a guide in initializing.
3640 */
3642
3643/*!
3644 * \since 1.8
3645 * \brief Set the connected line information based on another connected line source
3646 *
3647 * This is similar to ast_party_connected_line_copy, except that NULL values for
3648 * strings in the src parameter indicate not to update the corresponding dest values.
3649 *
3650 * \param dest The connected line one wishes to update
3651 * \param src The new connected line values to update the dest
3652 * \param update What connected line information to update. NULL if all.
3653 */
3655
3656/*!
3657 * \since 1.8
3658 * \brief Collect the caller party information into a connected line structure.
3659 *
3660 * \param connected Collected caller information for the connected line
3661 * \param caller Caller information.
3662 *
3663 * \warning This is a shallow copy.
3664 * \warning DO NOT call ast_party_connected_line_free() on the filled in
3665 * connected line structure!
3666 */
3668
3669/*!
3670 * \since 1.8
3671 * \brief Destroy the connected line information contents
3672 *
3673 * \param doomed The connected line information to destroy.
3674 */
3676
3677/*!
3678 * \brief Initialize the given redirecting reason structure
3679 *
3680 * \param init Redirecting reason structure to initialize
3681 */
3683
3684/*!
3685 * \brief Copy the source redirecting reason information to the destination redirecting reason.
3686 *
3687 * \param dest Destination redirecting reason
3688 * \param src Source redirecting reason
3689 */
3691 const struct ast_party_redirecting_reason *src);
3692
3693/*!
3694 * \brief Initialize the given redirecting reason structure using the given guide
3695 * for a set update operation.
3696 *
3697 * \details
3698 * The initialization is needed to allow a set operation to know if a
3699 * value needs to be updated. Simple integers need the guide's original
3700 * value in case the set operation is not trying to set a new value.
3701 * String values are simply set to NULL pointers if they are not going
3702 * to be updated.
3703 *
3704 * \param init Redirecting reason structure to initialize.
3705 * \param guide Source redirecting reason to use as a guide in initializing.
3706 */
3708 const struct ast_party_redirecting_reason *guide);
3709
3710/*!
3711 * \brief Set the redirecting reason information based on another redirecting reason source
3712 *
3713 * This is similar to ast_party_redirecting_reason_copy, except that NULL values for
3714 * strings in the src parameter indicate not to update the corresponding dest values.
3715 *
3716 * \param dest The redirecting reason one wishes to update
3717 * \param src The new redirecting reason values to update the dest
3718 */
3720 const struct ast_party_redirecting_reason *src);
3721
3722/*!
3723 * \brief Destroy the redirecting reason contents
3724 *
3725 * \param doomed The redirecting reason to destroy.
3726 */
3728
3729/*!
3730 * \brief Initialize the given redirecting structure.
3731 * \since 1.8
3732 *
3733 * \param init Redirecting structure to initialize.
3734 */
3736
3737/*!
3738 * \since 1.8
3739 * \brief Copy the source redirecting information to the destination redirecting.
3740 *
3741 * \param dest Destination redirecting
3742 * \param src Source redirecting
3743 */
3744void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src);
3745
3746/*!
3747 * \since 1.8
3748 * \brief Initialize the given redirecting id structure using the given guide
3749 * for a set update operation.
3750 *
3751 * \details
3752 * The initialization is needed to allow a set operation to know if a
3753 * value needs to be updated. Simple integers need the guide's original
3754 * value in case the set operation is not trying to set a new value.
3755 * String values are simply set to NULL pointers if they are not going
3756 * to be updated.
3757 *
3758 * \param init Redirecting id structure to initialize.
3759 * \param guide Source redirecting id to use as a guide in initializing.
3760 */
3761void ast_party_redirecting_set_init(struct ast_party_redirecting *init, const struct ast_party_redirecting *guide);
3762
3763/*!
3764 * \brief Set the redirecting information based on another redirecting source
3765 * \since 1.8
3766 *
3767 * This is similar to ast_party_redirecting_copy, except that NULL values for
3768 * strings in the src parameter indicate not to update the corresponding dest values.
3769 *
3770 * \param dest The redirecting one wishes to update
3771 * \param src The new redirecting values to update the dest
3772 * \param update What redirecting information to update. NULL if all.
3773 */
3775
3776/*!
3777 * \since 1.8
3778 * \brief Destroy the redirecting information contents
3779 *
3780 * \param doomed The redirecting information to destroy.
3781 */
3783
3784/*!
3785 * \since 1.8
3786 * \brief Copy the caller information to the connected line information.
3787 *
3788 * \param dest Destination connected line information
3789 * \param src Source caller information
3790 *
3791 * \note Assumes locks are already acquired
3792 */
3794
3795/*!
3796 * \since 1.8
3797 * \brief Copy the connected line information to the caller information.
3798 *
3799 * \param dest Destination caller information
3800 * \param src Source connected line information
3801 *
3802 * \note Assumes locks are already acquired
3803 */
3805
3806/*!
3807 * \since 1.8
3808 * \brief Set the connected line information in the Asterisk channel
3809 *
3810 * \param chan Asterisk channel to set connected line information
3811 * \param connected Connected line information
3812 * \param update What connected line information to update. NULL if all.
3813 *
3814 * \note The channel does not need to be locked before calling this function.
3815 */
3817
3818/*!
3819 * \since 1.8
3820 * \brief Build the connected line information data frame.
3821 *
3822 * \param data Buffer to fill with the frame data
3823 * \param datalen Size of the buffer to fill
3824 * \param connected Connected line information
3825 * \param update What connected line information to build. NULL if all.
3826 *
3827 * \retval -1 if error
3828 * \retval Amount of data buffer used
3829 */
3830int ast_connected_line_build_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update);
3831
3832/*!
3833 * \since 1.8
3834 * \brief Parse connected line indication frame data
3835 *
3836 * \param data Buffer with the frame data to parse
3837 * \param datalen Size of the buffer
3838 * \param connected Extracted connected line information
3839 *
3840 * \retval 0 on success.
3841 * \retval -1 on error.
3842 *
3843 * \note The filled in connected line structure needs to be initialized by
3844 * ast_party_connected_line_set_init() before calling. If defaults are not
3845 * required use ast_party_connected_line_init().
3846 * \note The filled in connected line structure needs to be destroyed by
3847 * ast_party_connected_line_free() when it is no longer needed.
3848 */
3849int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected);
3850
3851/*!
3852 * \since 1.8
3853 * \brief Indicate that the connected line information has changed
3854 *
3855 * \param chan Asterisk channel to indicate connected line information
3856 * \param connected Connected line information
3857 * \param update What connected line information to update. NULL if all.
3858 */
3860
3861/*!
3862 * \since 1.8
3863 * \brief Queue a connected line update frame on a channel
3864 *
3865 * \param chan Asterisk channel to indicate connected line information
3866 * \param connected Connected line information
3867 * \param update What connected line information to update. NULL if all.
3868 */
3870
3871/*!
3872 * \since 1.8
3873 * \brief Set the redirecting id information in the Asterisk channel
3874 *
3875 * \param chan Asterisk channel to set redirecting id information
3876 * \param redirecting Redirecting id information
3877 * \param update What redirecting information to update. NULL if all.
3878 *
3879 * \note The channel does not need to be locked before calling this function.
3880 */
3881void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update);
3882
3883/*!
3884 * \since 1.8
3885 * \brief Build the redirecting id data frame.
3886 *
3887 * \param data Buffer to fill with the frame data
3888 * \param datalen Size of the buffer to fill
3889 * \param redirecting Redirecting id information
3890 * \param update What redirecting information to build. NULL if all.
3891 *
3892 * \retval -1 if error
3893 * \retval Amount of data buffer used
3894 */
3895int ast_redirecting_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update);
3896
3897/*!
3898 * \since 1.8
3899 * \brief Parse redirecting indication frame data
3900 *
3901 * \param data Buffer with the frame data to parse
3902 * \param datalen Size of the buffer
3903 * \param redirecting Extracted redirecting id information
3904 *
3905 * \retval 0 on success.
3906 * \retval -1 on error.
3907 *
3908 * \note The filled in id structure needs to be initialized by
3909 * ast_party_redirecting_set_init() before calling.
3910 * \note The filled in id structure needs to be destroyed by
3911 * ast_party_redirecting_free() when it is no longer needed.
3912 */
3913int ast_redirecting_parse_data(const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting);
3914
3915/*!
3916 * \since 1.8
3917 * \brief Indicate that the redirecting id has changed
3918 *
3919 * \param chan Asterisk channel to indicate redirecting id information
3920 * \param redirecting Redirecting id information
3921 * \param update What redirecting information to update. NULL if all.
3922 */
3923void ast_channel_update_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update);
3924
3925/*!
3926 * \since 1.8
3927 * \brief Queue a redirecting update frame on a channel
3928 *
3929 * \param chan Asterisk channel to indicate redirecting id information
3930 * \param redirecting Redirecting id information
3931 * \param update What redirecting information to update. NULL if all.
3932 */
3933void ast_channel_queue_redirecting_update(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update);
3934
3935/*!
3936 * \since 11
3937 * \brief Run a connected line interception subroutine and update a channel's connected line
3938 * information
3939 *
3940 * Whenever we want to update a channel's connected line information, we may need to run
3941 * a subroutine so that an administrator can manipulate the information before sending it
3942 * out. This function both runs the subroutine specified by CONNECTED_LINE_SEND_SUB and
3943 * sends the update to the channel.
3944 *
3945 * \param autoservice_chan Channel to place into autoservice while the sub is running.
3946 * It is perfectly safe for this to be NULL
3947 * \param sub_chan The channel to run the subroutine on. Also the channel from which we
3948 * determine which subroutine we need to run.
3949 * \param connected_info Either an ast_party_connected_line or ast_frame pointer of type
3950 * AST_CONTROL_CONNECTED_LINE
3951 * \param frame If true, then connected_info is an ast_frame pointer, otherwise it is an
3952 * ast_party_connected_line pointer.
3953 * \retval 0 Success
3954 * \retval -1 Either the subroutine does not exist, or there was an error while attempting to
3955 * run the subroutine
3956 */
3957int ast_channel_connected_line_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *connected_info, int frame);
3958
3959/*!
3960 * \since 11
3961 * \brief Run a redirecting interception subroutine and update a channel's redirecting information
3962 *
3963 * \details
3964 * Whenever we want to update a channel's redirecting information, we may need to run
3965 * a subroutine so that an administrator can manipulate the information before sending it
3966 * out. This function both runs the subroutine specified by REDIRECTING_SEND_SUB and
3967 * sends the update to the channel.
3968 *
3969 * \param autoservice_chan Channel to place into autoservice while the subroutine is running.
3970 * It is perfectly safe for this to be NULL
3971 * \param sub_chan The channel to run the subroutine on. Also the channel from which we
3972 * determine which subroutine we need to run.
3973 * \param redirecting_info Either an ast_party_redirecting or ast_frame pointer of type
3974 * AST_CONTROL_REDIRECTING
3975 * \param is_frame If true, then redirecting_info is an ast_frame pointer, otherwise it is an
3976 * ast_party_redirecting pointer.
3977 *
3978 * \retval 0 Success
3979 * \retval -1 Either the subroutine does not exist, or there was an error while attempting to
3980 * run the subroutine
3981 */
3982int ast_channel_redirecting_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *redirecting_info, int is_frame);
3983
3984#include "asterisk/ccss.h"
3985
3986/*!
3987 * \since 1.8
3988 * \brief Set up datastore with CCSS parameters for a channel
3989 *
3990 * \note
3991 * If base_params is NULL, the channel will get the default
3992 * values for all CCSS parameters.
3993 *
3994 * \details
3995 * This function makes use of datastore operations on the channel, so
3996 * it is important to lock the channel before calling this function.
3997 *
3998 * \warning You should call this function only if \ref ast_cc_is_enabled()
3999 * returns true.
4000 *
4001 * \param chan The channel to create the datastore on
4002 * \param base_params CCSS parameters we wish to copy into the channel
4003 * \retval 0 Success
4004 * \retval -1 Failure or CCSS is globally disabled.
4005 */
4007 const struct ast_cc_config_params *base_params);
4008
4009/*!
4010 * \since 1.8
4011 * \brief Get the CCSS parameters from a channel
4012 *
4013 * \details
4014 * This function makes use of datastore operations on the channel, so
4015 * it is important to lock the channel before calling this function.
4016 *
4017 * \warning You should call this function only if \ref ast_cc_is_enabled()
4018 * returns true.
4019 *
4020 * \param chan Channel to retrieve parameters from
4021 * \retval NULL Failure or CCSS is globally disabled.
4022 * \retval non-NULL The parameters desired
4023 */
4025
4026
4027/*!
4028 * \since 1.8
4029 * \brief Get a device name given its channel structure
4030 *
4031 * \details
4032 * A common practice in Asterisk is to determine the device being talked
4033 * to by dissecting the channel name. For certain channel types, this is not
4034 * accurate. For instance, an ISDN channel is named based on what B channel is
4035 * used, not the device being communicated with.
4036 *
4037 * This function interfaces with a channel tech's queryoption callback to
4038 * retrieve the name of the device being communicated with. If the channel does not
4039 * implement this specific option, then the traditional method of using the channel
4040 * name is used instead.
4041 *
4042 * \param chan The channel to retrieve the information from
4043 * \param[out] device_name The buffer to place the device's name into
4044 * \param name_buffer_length The allocated space for the device_name
4045 * \return 0 always
4046 */
4047int ast_channel_get_device_name(struct ast_channel *chan, char *device_name, size_t name_buffer_length);
4048
4049/*!
4050 * \since 1.8
4051 * \brief Find the appropriate CC agent type to use given a channel
4052 *
4053 * \details
4054 * During call completion, we will need to create a call completion agent structure. To
4055 * figure out the type of agent to construct, we need to ask the channel driver for the
4056 * appropriate type.
4057 *
4058 * Prior to adding this function, the call completion core attempted to figure this
4059 * out for itself by stripping the technology off the channel's name. However, in the
4060 * case of chan_dahdi, there are multiple agent types registered, and so simply searching
4061 * for an agent type called "DAHDI" is not possible. In a case where multiple agent types
4062 * are defined, the channel driver must have a queryoption callback defined in its
4063 * channel_tech, and the queryoption callback must handle AST_OPTION_CC_AGENT_TYPE
4064 *
4065 * If a channel driver does not have a queryoption callback or if the queryoption callback
4066 * does not handle AST_OPTION_CC_AGENT_TYPE, then the old behavior of using the technology
4067 * portion of the channel name is used instead. This is perfectly suitable for channel drivers
4068 * whose channel technologies are a one-to-one match with the agent types defined within.
4069 *
4070 * Note that this function is only called when the agent policy on a given channel is set
4071 * to "native." Generic agents' type can be determined automatically by the core.
4072 *
4073 * \param chan The channel for which we wish to retrieve the agent type
4074 * \param[out] agent_type The type of agent the channel driver wants us to use
4075 * \param size The size of the buffer to write to
4076 */
4077int ast_channel_get_cc_agent_type(struct ast_channel *chan, char *agent_type, size_t size);
4078#if defined(__cplusplus) || defined(c_plusplus)
4079}
4080#endif
4081
4082/*!
4083 * \brief Remove a channel from the global channels container
4084 *
4085 * \param chan channel to remove
4086 *
4087 * In a case where it is desired that a channel not be available in any lookups
4088 * in the global channels conatiner, use this function.
4089 */
4090void ast_channel_unlink(struct ast_channel *chan);
4091
4092/*!
4093 * \brief Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash
4094 * on the given channel
4095 *
4096 * \param chan channel on which to set the cause information
4097 * \param cause_code ast_control_pvt_cause_code structure containing cause information
4098 * \param datalen total length of the structure since it may vary
4099 */
4100void ast_channel_hangupcause_hash_set(struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen);
4101
4102/*!
4103 * \since 12
4104 * \brief Convert a string to a detail record AMA flag
4105 *
4106 * \param flag string form of flag
4107 *
4108 * \retval the enum (integer) form of the flag
4109 */
4110enum ama_flags ast_channel_string2amaflag(const char *flag);
4111
4112/*!
4113 * \since 12
4114 * \brief Convert the enum representation of an AMA flag to a string representation
4115 *
4116 * \param flags integer flag
4117 *
4118 * \retval A string representation of the flag
4119 */
4120const char *ast_channel_amaflags2string(enum ama_flags flags);
4121
4125};
4126
4127/* ACCESSOR FUNCTIONS */
4128
4129#define DECLARE_STRINGFIELD_SETTERS_FOR(field) \
4130 void ast_channel_##field##_set(struct ast_channel *chan, const char *field); \
4131 void ast_channel_##field##_build_va(struct ast_channel *chan, const char *fmt, va_list ap) __attribute__((format(printf, 2, 0))); \
4132 void ast_channel_##field##_build(struct ast_channel *chan, const char *fmt, ...) __attribute__((format(printf, 2, 3)))
4133
4134/*!
4135 * The following string fields result in channel snapshot creation and
4136 * should have the channel locked when called:
4137 *
4138 * \li language
4139 * \li accountcode
4140 * \li peeraccount
4141 * \li linkedid
4142 */
4146DECLARE_STRINGFIELD_SETTERS_FOR(latest_musicclass);
4156
4157const char *ast_channel_name(const struct ast_channel *chan);
4158const char *ast_channel_language(const struct ast_channel *chan);
4159const char *ast_channel_musicclass(const struct ast_channel *chan);
4160const char *ast_channel_latest_musicclass(const struct ast_channel *chan);
4161const char *ast_channel_accountcode(const struct ast_channel *chan);
4162const char *ast_channel_peeraccount(const struct ast_channel *chan);
4163const char *ast_channel_userfield(const struct ast_channel *chan);
4164const char *ast_channel_call_forward(const struct ast_channel *chan);
4165const char *ast_channel_uniqueid(const struct ast_channel *chan);
4166const char *ast_channel_linkedid(const struct ast_channel *chan);
4167const char *ast_channel_tenantid(const struct ast_channel *chan);
4168void ast_channel_tenantid_set(struct ast_channel *chan, const char *value);
4169const char *ast_channel_parkinglot(const struct ast_channel *chan);
4170const char *ast_channel_hangupsource(const struct ast_channel *chan);
4171const char *ast_channel_dialcontext(const struct ast_channel *chan);
4172
4173const char *ast_channel_appl(const struct ast_channel *chan);
4174void ast_channel_appl_set(struct ast_channel *chan, const char *value);
4175const char *ast_channel_blockproc(const struct ast_channel *chan);
4176void ast_channel_blockproc_set(struct ast_channel *chan, const char *value);
4177const char *ast_channel_data(const struct ast_channel *chan);
4178void ast_channel_data_set(struct ast_channel *chan, const char *value);
4179
4180const char *ast_channel_lastcontext(const struct ast_channel *chan);
4181const char *ast_channel_context(const struct ast_channel *chan);
4182void ast_channel_context_set(struct ast_channel *chan, const char *value);
4183const char *ast_channel_lastexten(const struct ast_channel *chan);
4184const char *ast_channel_exten(const struct ast_channel *chan);
4185void ast_channel_exten_set(struct ast_channel *chan, const char *value);
4186
4187char ast_channel_dtmf_digit_to_emulate(const struct ast_channel *chan);
4189char ast_channel_sending_dtmf_digit(const struct ast_channel *chan);
4191struct timeval ast_channel_sending_dtmf_tv(const struct ast_channel *chan);
4192void ast_channel_sending_dtmf_tv_set(struct ast_channel *chan, struct timeval value);
4193enum ama_flags ast_channel_amaflags(const struct ast_channel *chan);
4194
4195/*!
4196 * \pre chan is locked
4197 */
4198void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value);
4199int ast_channel_epfd(const struct ast_channel *chan);
4200void ast_channel_epfd_set(struct ast_channel *chan, int value);
4201int ast_channel_fdno(const struct ast_channel *chan);
4202void ast_channel_fdno_set(struct ast_channel *chan, int value);
4203int ast_channel_hangupcause(const struct ast_channel *chan);
4204void ast_channel_hangupcause_set(struct ast_channel *chan, int value);
4205int ast_channel_tech_hangupcause(const struct ast_channel *chan);
4206void ast_channel_tech_hangupcause_set(struct ast_channel *chan, int value);
4207int ast_channel_priority(const struct ast_channel *chan);
4208void ast_channel_priority_set(struct ast_channel *chan, int value);
4209int ast_channel_rings(const struct ast_channel *chan);
4210void ast_channel_rings_set(struct ast_channel *chan, int value);
4211int ast_channel_streamid(const struct ast_channel *chan);
4212void ast_channel_streamid_set(struct ast_channel *chan, int value);
4213int ast_channel_timingfd(const struct ast_channel *chan);
4214void ast_channel_timingfd_set(struct ast_channel *chan, int value);
4215int ast_channel_visible_indication(const struct ast_channel *chan);
4217int ast_channel_hold_state(const struct ast_channel *chan);
4218void ast_channel_hold_state_set(struct ast_channel *chan, int value);
4219int ast_channel_vstreamid(const struct ast_channel *chan);
4220void ast_channel_vstreamid_set(struct ast_channel *chan, int value);
4221unsigned short ast_channel_transfercapability(const struct ast_channel *chan);
4222void ast_channel_transfercapability_set(struct ast_channel *chan, unsigned short value);
4223unsigned int ast_channel_emulate_dtmf_duration(const struct ast_channel *chan);
4224void ast_channel_emulate_dtmf_duration_set(struct ast_channel *chan, unsigned int value);
4225unsigned int ast_channel_fin(const struct ast_channel *chan);
4226void ast_channel_fin_set(struct ast_channel *chan, unsigned int value);
4227unsigned int ast_channel_fout(const struct ast_channel *chan);
4228void ast_channel_fout_set(struct ast_channel *chan, unsigned int value);
4229unsigned long ast_channel_insmpl(const struct ast_channel *chan);
4230void ast_channel_insmpl_set(struct ast_channel *chan, unsigned long value);
4231unsigned long ast_channel_outsmpl(const struct ast_channel *chan);
4232void ast_channel_outsmpl_set(struct ast_channel *chan, unsigned long value);
4233void *ast_channel_generatordata(const struct ast_channel *chan);
4234void ast_channel_generatordata_set(struct ast_channel *chan, void *value);
4235void *ast_channel_music_state(const struct ast_channel *chan);
4236void ast_channel_music_state_set(struct ast_channel *chan, void *value);
4237void *ast_channel_tech_pvt(const struct ast_channel *chan);
4238void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value);
4239void *ast_channel_timingdata(const struct ast_channel *chan);
4240void ast_channel_timingdata_set(struct ast_channel *chan, void *value);
4241struct ast_audiohook_list *ast_channel_audiohooks(const struct ast_channel *chan);
4243struct ast_cdr *ast_channel_cdr(const struct ast_channel *chan);
4244void ast_channel_cdr_set(struct ast_channel *chan, struct ast_cdr *value);
4245struct ast_channel *ast_channel__bridge(const struct ast_channel *chan);
4246void ast_channel__bridge_set(struct ast_channel *chan, struct ast_channel *value);
4247struct ast_channel *ast_channel_masq(const struct ast_channel *chan);
4248void ast_channel_masq_set(struct ast_channel *chan, struct ast_channel *value);
4249struct ast_channel *ast_channel_masqr(const struct ast_channel *chan);
4250void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value);
4251struct ast_filestream *ast_channel_stream(const struct ast_channel *chan);
4252void ast_channel_stream_set(struct ast_channel *chan, struct ast_filestream *value);
4253struct ast_filestream *ast_channel_vstream(const struct ast_channel *chan);
4254void ast_channel_vstream_set(struct ast_channel *chan, struct ast_filestream *value);
4255struct ast_format_cap *ast_channel_nativeformats(const struct ast_channel *chan);
4257struct ast_framehook_list *ast_channel_framehooks(const struct ast_channel *chan);
4259struct ast_generator *ast_channel_generator(const struct ast_channel *chan);
4260void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value);
4261struct ast_pbx *ast_channel_pbx(const struct ast_channel *chan);
4262void ast_channel_pbx_set(struct ast_channel *chan, struct ast_pbx *value);
4263struct ast_sched_context *ast_channel_sched(const struct ast_channel *chan);
4264void ast_channel_sched_set(struct ast_channel *chan, struct ast_sched_context *value);
4265struct ast_timer *ast_channel_timer(const struct ast_channel *chan);
4266void ast_channel_timer_set(struct ast_channel *chan, struct ast_timer *value);
4267struct ast_tone_zone *ast_channel_zone(const struct ast_channel *chan);
4268void ast_channel_zone_set(struct ast_channel *chan, struct ast_tone_zone *value);
4269struct ast_trans_pvt *ast_channel_readtrans(const struct ast_channel *chan);
4270void ast_channel_readtrans_set(struct ast_channel *chan, struct ast_trans_pvt *value);
4271struct ast_trans_pvt *ast_channel_writetrans(const struct ast_channel *chan);
4272void ast_channel_writetrans_set(struct ast_channel *chan, struct ast_trans_pvt *value);
4273const struct ast_channel_tech *ast_channel_tech(const struct ast_channel *chan);
4274void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value);
4275enum ast_channel_adsicpe ast_channel_adsicpe(const struct ast_channel *chan);
4277enum ast_channel_state ast_channel_state(const struct ast_channel *chan);
4278ast_callid ast_channel_callid(const struct ast_channel *chan);
4279struct ast_channel_snapshot *ast_channel_snapshot(const struct ast_channel *chan);
4280void ast_channel_snapshot_set(struct ast_channel *chan, struct ast_channel_snapshot *snapshot);
4282struct ast_endpoint *ast_channel_endpoint(const struct ast_channel *chan);
4283void ast_channel_endpoint_set(struct ast_channel *chan, struct ast_endpoint *endpoint);
4284
4285/*!
4286 * \pre chan is locked
4287 */
4289
4290/* XXX Internal use only, make sure to move later */
4291void ast_channel_state_set(struct ast_channel *chan, enum ast_channel_state);
4295void ast_channel_callid_cleanup(struct ast_channel *chan);
4297
4298/* Format getters */
4302struct ast_format *ast_channel_readformat(struct ast_channel *chan);
4303struct ast_format *ast_channel_writeformat(struct ast_channel *chan);
4304
4305/* Format setters - all of these functions will increment the reference count of the format passed in */
4306void ast_channel_set_oldwriteformat(struct ast_channel *chan, struct ast_format *format);
4307void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format);
4308void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format);
4309void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format);
4310void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format);
4311
4312/* Other struct getters */
4313struct ast_frame *ast_channel_dtmff(struct ast_channel *chan);
4314struct ast_jb *ast_channel_jb(struct ast_channel *chan);
4315struct ast_party_caller *ast_channel_caller(struct ast_channel *chan);
4319struct ast_party_dialed *ast_channel_dialed(struct ast_channel *chan);
4324struct timeval *ast_channel_dtmf_tv(struct ast_channel *chan);
4325struct timeval *ast_channel_whentohangup(struct ast_channel *chan);
4326struct varshead *ast_channel_varshead(struct ast_channel *chan);
4327
4328void ast_channel_dtmff_set(struct ast_channel *chan, struct ast_frame *value);
4329void ast_channel_jb_set(struct ast_channel *chan, struct ast_jb *value);
4330void ast_channel_caller_set(struct ast_channel *chan, struct ast_party_caller *value);
4332void ast_channel_dialed_set(struct ast_channel *chan, struct ast_party_dialed *value);
4334void ast_channel_dtmf_tv_set(struct ast_channel *chan, struct timeval *value);
4335
4336/*!
4337 * \pre chan is locked
4338 */
4339void ast_channel_whentohangup_set(struct ast_channel *chan, struct timeval *value);
4340void ast_channel_varshead_set(struct ast_channel *chan, struct varshead *value);
4341struct timeval ast_channel_creationtime(struct ast_channel *chan);
4342void ast_channel_creationtime_set(struct ast_channel *chan, struct timeval *value);
4343struct timeval ast_channel_answertime(struct ast_channel *chan);
4344void ast_channel_answertime_set(struct ast_channel *chan, struct timeval *value);
4345
4346/* List getters */
4350struct ast_readq_list *ast_channel_readq(struct ast_channel *chan);
4351
4352/* Typedef accessors */
4354/*!
4355 * \pre chan is locked
4356 */
4359/*!
4360 * \pre chan is locked
4361 */
4363struct ast_namedgroups *ast_channel_named_callgroups(const struct ast_channel *chan);
4364void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value);
4365struct ast_namedgroups *ast_channel_named_pickupgroups(const struct ast_channel *chan);
4366void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value);
4367
4368/* Alertpipe accessors--the "internal" functions for channel.c use only */
4369int ast_channel_alert_write(struct ast_channel *chan);
4370int ast_channel_alert_writable(struct ast_channel *chan);
4378/*! \brief Swap the interal alertpipe between two channels
4379 * \note Handle all of the necessary locking before calling this
4380 */
4381void ast_channel_internal_alertpipe_swap(struct ast_channel *chan1, struct ast_channel *chan2);
4382
4383/* file descriptor array accessors */
4384void ast_channel_internal_fd_clear(struct ast_channel *chan, int which);
4386void ast_channel_internal_fd_set(struct ast_channel *chan, int which, int value);
4387int ast_channel_fd(const struct ast_channel *chan, int which);
4388int ast_channel_fd_isset(const struct ast_channel *chan, int which);
4389
4390/*!
4391 * \since 15
4392 * \brief Retrieve the number of file decriptor positions present on the channel
4393 *
4394 * \param chan The channel to get the count of
4395 *
4396 * \pre chan is locked
4397 *
4398 * \return The number of file descriptor positions
4399 */
4400int ast_channel_fd_count(const struct ast_channel *chan);
4401
4402/*!
4403 * \since 15
4404 * \brief Add a file descriptor to the channel without a fixed position
4405 *
4406 * \param chan The channel to add the file descriptor to
4407 * \param value The file descriptor
4408 *
4409 * \pre chan is locked
4410 *
4411 * \return The position of the file descriptor
4412 */
4413int ast_channel_fd_add(struct ast_channel *chan, int value);
4414
4415pthread_t ast_channel_blocker(const struct ast_channel *chan);
4416void ast_channel_blocker_set(struct ast_channel *chan, pthread_t value);
4417
4418int ast_channel_blocker_tid(const struct ast_channel *chan);
4419void ast_channel_blocker_tid_set(struct ast_channel *chan, int tid);
4420
4423
4424struct ast_bridge *ast_channel_internal_bridge(const struct ast_channel *chan);
4425/*!
4426 * \pre chan is locked
4427 */
4429
4432
4435
4436/*!
4437 * \since 11
4438 * \brief Retrieve a comma-separated list of channels for which dialed cause information is available
4439 *
4440 * \details
4441 * This function makes use of datastore operations on the channel, so
4442 * it is important to lock the channel before calling this function.
4443 *
4444 * \param chan The channel from which to retrieve information
4445 * \retval NULL on allocation failure
4446 * \retval Pointer to an ast_str object containing the desired information which must be freed
4447 */
4448struct ast_str *ast_channel_dialed_causes_channels(const struct ast_channel *chan);
4449
4450/*!
4451 * \since 20.19.0
4452 * \since 22.9.0
4453 * \since 23.3.0
4454 * \brief Retrieve an iterator for dialed cause information
4455 *
4456 * \details
4457 * Each call to ao2_iterator_next() will return a pointer to an ast_control_pvt_cause_code
4458 * structure containing the dialed cause information for one channel. One of the entries
4459 * may be for the channel itself if the channel was hung up because of a non-2XX SIP
4460 * response code. The rest of the entries will be for channels bridged to the channel for
4461 * which dialed cause information is being retrieved. The caller is responsible for
4462 * cleaning up the reference count of each entry returned and destroying the returned
4463 * iterator with ao2_iterator_destroy() when it is finished with it.
4464 *
4465 * \param chan The channel from which to retrieve cause information
4466 * \retval ao2_iterator
4467 */
4469
4470/*!
4471 * \since 11
4472 * \brief Retrieve a ref-counted cause code information structure
4473 *
4474 * \details
4475 * This function makes use of datastore operations on the channel, so
4476 * it is important to lock the channel before calling this function.
4477 * This function increases the ref count of the returned object, so the
4478 * calling function must decrease the reference count when it is finished
4479 * with the object.
4480 *
4481 * \param chan The channel from which to retrieve information
4482 * \param chan_name The name of the channel about which to retrieve information
4483 * \retval NULL on search failure
4484 * \retval Pointer to a ref-counted ast_control_pvt_cause_code object containing the desired information
4485 */
4487
4488/*!
4489 * \since 11
4490 * \brief Add cause code information to the channel
4491 *
4492 * \details
4493 * This function makes use of datastore operations on the channel, so
4494 * it is important to lock the channel before calling this function.
4495 * The passed in data is copied and so is still owned by the caller.
4496 *
4497 * \param chan The channel on which to add information
4498 * \param cause_code The cause information to be added to the channel
4499 * \param datalen The total length of the structure since its length is variable
4500 * \retval 0 on success
4501 * \retval -1 on error
4502 */
4503int ast_channel_dialed_causes_add(const struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen);
4504
4505/*!
4506 * \since 11
4507 * \brief Clear all cause information from the channel
4508 *
4509 * \details
4510 * This function makes use of datastore operations on the channel, so
4511 * it is important to lock the channel before calling this function.
4512 *
4513 * \param chan The channel from which to clear information
4514 */
4515void ast_channel_dialed_causes_clear(const struct ast_channel *chan);
4516
4517struct ast_flags *ast_channel_flags(struct ast_channel *chan);
4518
4519/*!
4520 * \since 13.17.0
4521 * \brief Set a flag on a channel
4522 *
4523 * \param chan The channel to set the flag on
4524 * \param flag The flag to set
4525 *
4526 * \note This will lock the channel internally. If the channel is already
4527 * locked it is still safe to call.
4528 */
4529
4530void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag);
4531
4532/*!
4533 * \since 13.17.0
4534 * \brief Clear a flag on a channel
4535 *
4536 * \param chan The channel to clear the flag from
4537 * \param flag The flag to clear
4538 *
4539 * \note This will lock the channel internally. If the channel is already
4540 * locked it is still safe to call.
4541 */
4542void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag);
4543
4544/*!
4545 * \since 12.4.0
4546 * \brief Return whether or not any manager variables have been set
4547 *
4548 * \retval 0 if no manager variables are expected
4549 * \retval 1 if manager variables are expected
4550 */
4552
4553/*!
4554 * \since 12
4555 * \brief Sets the variables to be stored in the \a manager_vars field of all
4556 * snapshots.
4557 * \param varc Number of variable names.
4558 * \param vars Array of variable names.
4559 */
4560void ast_channel_set_manager_vars(size_t varc, char **vars);
4561
4562/*!
4563 * \since 12
4564 * \brief Gets the variables for a given channel, as specified by ast_channel_set_manager_vars().
4565 *
4566 * The returned variable list is an AO2 object, so ao2_cleanup() to free it.
4567 *
4568 * \param chan Channel to get variables for.
4569 * \return List of channel variables.
4570 * \retval NULL on error
4571 */
4573
4574/*!
4575 * \since 14.2.0
4576 * \brief Return whether or not any ARI variables have been set
4577 *
4578 * \retval 0 if no ARI variables are expected
4579 * \retval 1 if ARI variables are expected
4580 */
4581int ast_channel_has_ari_vars(void);
4582
4583/*!
4584 * \since 14.2.0
4585 * \brief Sets the variables to be stored in the \a ari_vars field of all
4586 * snapshots.
4587 * \param varc Number of variable names.
4588 * \param vars Array of variable names.
4589 */
4590void ast_channel_set_ari_vars(size_t varc, char **vars);
4591
4592/*!
4593 * \since 14.2.0
4594 * \brief Gets the variables for a given channel, as specified by ast_channel_set_ari_vars().
4595 *
4596 * The returned variable list is an AO2 object, so ao2_cleanup() to free it.
4597 *
4598 * \param chan Channel to get variables for.
4599 * \return List of channel variables.
4600 * \retval NULL on error
4601 */
4602struct varshead *ast_channel_get_ari_vars(struct ast_channel *chan);
4603
4604/*!
4605 * \since 12
4606 * \brief Gets the variables for a given channel, as set using pbx_builtin_setvar_helper().
4607 *
4608 * The returned variable list is an AO2 object, so ao2_cleanup() to free it.
4609 *
4610 * \param chan Channel to get variables for
4611 * \return List of channel variables.
4612 * \retval NULL on error
4613 */
4614struct varshead *ast_channel_get_vars(struct ast_channel *chan);
4615
4616/*!
4617 * \since 12
4618 * \brief A topic which publishes the events for a particular channel.
4619 *
4620 * If the given \a chan is \c NULL, ast_channel_topic_all() is returned.
4621 *
4622 * \param chan Channel, or \c NULL.
4623 *
4624 * \retval Topic for channel's events.
4625 * \retval ast_channel_topic_all() if \a chan is \c NULL.
4626 */
4627struct stasis_topic *ast_channel_topic(struct ast_channel *chan);
4628
4629/*!
4630 * \brief Get the bridge associated with a channel
4631 * \since 12.0.0
4632 *
4633 * \param chan The channel whose bridge we want
4634 *
4635 * \details
4636 * The bridge returned has its reference count incremented. Use
4637 * ao2_cleanup() or ao2_ref() in order to decrement the
4638 * reference count when you are finished with the bridge.
4639 *
4640 * \note This function expects the channel to be locked prior to
4641 * being called and will not grab the channel lock.
4642 *
4643 * \retval NULL No bridge present on the channel
4644 * \retval non-NULL The bridge the channel is in
4645 */
4646struct ast_bridge *ast_channel_get_bridge(const struct ast_channel *chan);
4647
4648/*!
4649 * \brief Determine if a channel is in a bridge
4650 * \since 12.0.0
4651 *
4652 * \param chan The channel to test
4653 *
4654 * \note This function expects the channel to be locked prior to
4655 * being called and will not grab the channel lock.
4656 *
4657 * \retval 0 The channel is not bridged
4658 * \retval non-zero The channel is bridged
4659 */
4660int ast_channel_is_bridged(const struct ast_channel *chan);
4661
4662/*!
4663 * \brief Determine if a channel is leaving a bridge, but \em not hung up
4664 * \since 12.4.0
4665 *
4666 * \param chan The channel to test
4667 *
4668 * \note If a channel is hung up, it is implicitly leaving any bridge it
4669 * may be in. This function is used to test if a channel is leaving a bridge
4670 * but may survive the experience, if it has a place to go to (dialplan or
4671 * otherwise)
4672 *
4673 * \retval 0 The channel is not leaving the bridge or is hung up
4674 * \retval non-zero The channel is leaving the bridge
4675 */
4677
4678/*!
4679 * \brief Get the channel's bridge peer only if the bridge is two-party.
4680 * \since 12.0.0
4681 *
4682 * \param chan Channel desiring the bridge peer channel.
4683 *
4684 * \note The returned peer channel is the current peer in the
4685 * bridge when called.
4686 *
4687 * \note Absolutely _NO_ channel locks should be held when calling this function.
4688 *
4689 * \retval NULL Channel not in a bridge or the bridge is not two-party.
4690 * \retval non-NULL Reffed peer channel at time of calling.
4691 */
4692struct ast_channel *ast_channel_bridge_peer(struct ast_channel *chan);
4693
4694/*!
4695 * \brief Get a reference to the channel's bridge pointer.
4696 * \since 12.0.0
4697 *
4698 * \param chan The channel whose bridge channel is desired
4699 *
4700 * \note This increases the reference count of the bridge_channel.
4701 * Use ao2_ref() or ao2_cleanup() to decrement the refcount when
4702 * you are finished with it.
4703 *
4704 * \note It is expected that the channel is locked prior to
4705 * placing this call.
4706 *
4707 * \retval NULL The channel has no bridge_channel
4708 * \retval non-NULL A reference to the bridge_channel
4709 */
4711
4712/*!
4713 * \since 12
4714 * \brief Gain control of a channel in the system
4715 *
4716 * The intention of this function is to take a channel that currently
4717 * is running in one thread and gain control of it in the current thread.
4718 * This can be used to redirect a channel to a different place in the dialplan,
4719 * for instance.
4720 *
4721 * \note This function is NOT intended to be used on bridged channels. If you
4722 * need to control a bridged channel, you can set a callback to be called
4723 * once the channel exits the bridge, and run your controlling logic in that
4724 * callback
4725 *
4726 * XXX Put name of callback-setting function in above paragraph once it is written
4727 *
4728 * \note When this function returns successfully, the yankee channel is in a state where
4729 * it cannot be used any further. Always use the returned channel instead.
4730 *
4731 * \note absolutely _NO_ channel locks should be held before calling this function.
4732 *
4733 * \note The dialplan location on the returned channel is where the channel
4734 * should be started in the dialplan if it is returned to it.
4735 *
4736 * \param yankee The channel to gain control of
4737 * \retval NULL Could not gain control of the channel
4738 * \retval non-NULL The channel
4739 */
4740struct ast_channel *ast_channel_yank(struct ast_channel *yankee);
4741
4742/*!
4743 * \since 12
4744 * \brief Move a channel from its current location to a new location
4745 *
4746 * The intention of this function is to have the destination channel
4747 * take on the identity of the source channel.
4748 *
4749 * \note This function is NOT intended to be used on bridged channels. If you
4750 * wish to move an unbridged channel into the place of a bridged channel, then
4751 * use ast_bridge_join() or ast_bridge_impart(). If you wish to move a bridged
4752 * channel into the place of another bridged channel, then use ast_bridge_move().
4753 *
4754 * \note When this function returns succesfully, the source channel is in a
4755 * state where its continued use is unreliable.
4756 *
4757 * \note absolutely _NO_ channel locks should be held before calling this function.
4758 *
4759 * \param dest The place to move the source channel
4760 * \param source The channel to move
4761 * \retval 0 Success
4762 * \retval non-zero Failure
4763 */
4764int ast_channel_move(struct ast_channel *dest, struct ast_channel *source);
4765
4766/*!
4767 * \since 12
4768 * \brief Forward channel stasis messages to the given endpoint
4769 *
4770 * \param chan The channel to forward from
4771 * \param endpoint The endpoint to forward to
4772 *
4773 * \retval 0 Success
4774 * \retval non-zero Failure
4775 */
4777
4778/*!
4779 * \brief Return the oldest linkedid between two channels.
4780 *
4781 * A channel linkedid is derived from the channel uniqueid which is formed like this:
4782 * [systemname-]ctime.seq
4783 *
4784 * The systemname, and the dash are optional, followed by the epoch time followed by an
4785 * integer sequence. Note that this is not a decimal number, since 1.2 is less than 1.11
4786 * in uniqueid land.
4787 *
4788 * To compare two uniqueids, we parse out the integer values of the time and the sequence
4789 * numbers and compare them, with time trumping sequence.
4790 *
4791 * \param a The linkedid value of the first channel to compare
4792 * \param b The linkedid value of the second channel to compare
4793 *
4794 * \retval NULL on failure
4795 * \retval The oldest linkedid value
4796 * \since 12.0.0
4797*/
4798const char *ast_channel_oldest_linkedid(const char *a, const char *b);
4799
4800/*!
4801 * \brief Check if the channel has active audiohooks, active framehooks, or a monitor.
4802 * \since 12.0.0
4803 *
4804 * \param chan The channel to check.
4805 *
4806 * \retval non-zero if channel has active audiohooks, framehooks, or monitor.
4807 */
4809
4810/*!
4811 * \brief Check if the channel has any active hooks that require audio.
4812 * \since 12.3.0
4813 *
4814 * \param chan The channel to check.
4815 *
4816 * \retval non-zero if channel has active audiohooks, audio framehooks, or monitor.
4817 */
4819
4820/*!
4821 * \brief Removes the trailing identifiers from a channel name string
4822 * \since 12.0.0
4823 *
4824 * \param channel_name string that you wish to turn into a dial string.
4825 * This string will be edited in place.
4826 */
4827void ast_channel_name_to_dial_string(char *channel_name);
4828
4829#define AST_MUTE_DIRECTION_READ (1 << 0)
4830#define AST_MUTE_DIRECTION_WRITE (1 << 1)
4831
4832/*!
4833 * \brief Suppress passing of a frame type on a channel
4834 *
4835 * \note The channel should be locked before calling this function.
4836 *
4837 * \param chan The channel to suppress
4838 * \param direction The direction in which to suppress
4839 * \param frametype The type of frame (AST_FRAME_VOICE, etc) to suppress
4840 *
4841 * \retval 0 Success
4842 * \retval -1 Failure
4843 */
4844int ast_channel_suppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype);
4845
4846/*!
4847 * \brief Stop suppressing of a frame type on a channel
4848 *
4849 * \note The channel should be locked before calling this function.
4850 *
4851 * \param chan The channel to stop suppressing
4852 * \param direction The direction in which to stop suppressing
4853 * \param frametype The type of frame (AST_FRAME_VOICE, etc) to stop suppressing
4854 *
4855 * \retval 0 Success
4856 * \retval -1 Failure
4857 */
4858int ast_channel_unsuppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype);
4859
4860/*!
4861 * \brief Simulate a DTMF end on a broken bridge channel.
4862 *
4863 * \param chan Channel sending DTMF that has not ended.
4864 * \param digit DTMF digit to stop.
4865 * \param start DTMF digit start time.
4866 * \param why Reason bridge broken.
4867 */
4868void ast_channel_end_dtmf(struct ast_channel *chan, char digit, struct timeval start, const char *why);
4869
4870struct ast_bridge_features;
4871
4872/*!
4873 * \brief Gets the channel-attached features a channel has access to upon being bridged.
4874 *
4875 * \note The channel must be locked when calling this function.
4876 *
4877 * \param chan Which channel to get features for
4878 *
4879 * \retval non-NULL The features currently set for this channel
4880 * \retval NULL if the features have not been set
4881 */
4883
4884/*!
4885 * \brief Appends to the channel-attached features a channel has access to upon being bridged.
4886 *
4887 * \note The channel must be locked when calling this function.
4888 *
4889 * \param chan Which channel to set features for
4890 * \param features The feature set to append to the channel's features
4891 *
4892 * \retval 0 on success
4893 * \retval -1 on failure
4894 */
4895int ast_channel_feature_hooks_append(struct ast_channel *chan, struct ast_bridge_features *features);
4896
4897/*!
4898 * \brief Sets the channel-attached features a channel has access to upon being bridged.
4899 *
4900 * \note The channel must be locked when calling this function.
4901 *
4902 * \param chan Which channel to set features for
4903 * \param features The feature set with which to replace the channel's features
4904 *
4905 * \retval 0 on success
4906 * \retval -1 on failure
4907 */
4908int ast_channel_feature_hooks_replace(struct ast_channel *chan, struct ast_bridge_features *features);
4909
4910enum ast_channel_error {
4911 /* Unable to determine what error occurred. */
4913 /* Channel with this ID already exists */
4915};
4916
4917/*!
4918 * \brief Get error code for latest channel operation.
4919 */
4921
4922/*!
4923 * \brief Am I currently running an intercept dialplan routine.
4924 * \since 13.14.0
4925 *
4926 * \details
4927 * A dialplan intercept routine is equivalent to an interrupt
4928 * routine. As such, the routine must be done quickly and you
4929 * do not have access to the media stream. These restrictions
4930 * are necessary because the media stream is the responsibility
4931 * of some other code and interfering with or delaying that
4932 * processing is bad.
4933 *
4934 * \retval 0 Not in an intercept routine.
4935 * \retval 1 In an intercept routine.
4936 */
4938
4939/*!
4940 * \brief Retrieve the topology of streams on a channel
4941 *
4942 * \param chan The channel to get the stream topology of
4943 *
4944 * \pre chan is locked
4945 *
4946 * \retval non-NULL success
4947 * \retval NULL failure
4948 */
4950 const struct ast_channel *chan);
4951
4952/*!
4953 * \brief Set the topology of streams on a channel
4954 *
4955 * \param chan The channel to set the stream topology on
4956 * \param topology The stream topology to set
4957 *
4958 * \pre chan is locked
4959 *
4960 * \note If topology is NULL a new empty topology will be created
4961 * and returned.
4962 *
4963 * \retval non-NULL Success
4964 * \retval NULL failure
4965 */
4967 struct ast_channel *chan, struct ast_stream_topology *topology);
4968
4969/*!
4970 * \brief Retrieve the default stream of a specific media type on a channel
4971 *
4972 * \param chan The channel to get the stream from
4973 * \param type The media type of the default stream
4974 *
4975 * \pre chan is locked
4976 *
4977 * \retval non-NULL success
4978 * \retval NULL failure
4979 */
4981
4982/*!
4983 * \brief Determine if a channel is multi-stream capable
4984 *
4985 * \param chan The channel to test
4986 *
4987 * \pre chan is locked
4988 *
4989 * \retval true if the channel is multi-stream capable.
4990 */
4991int ast_channel_is_multistream(struct ast_channel *chan);
4992
4993/*!
4994 * \brief Request that the stream topology of a channel change
4995 *
4996 * \param chan The channel to change
4997 * \param topology The new stream topology
4998 * \param change_source The source that initiated the change
4999 *
5000 * \note Absolutely _NO_ channel locks should be held before calling this function.
5001 *
5002 * \retval 0 request has been accepted to be attempted
5003 * \retval -1 request could not be attempted
5004 *
5005 * \note This function initiates an asynchronous request to change the stream topology. It is not
5006 * guaranteed that the topology will change and until an AST_CONTROL_STREAM_TOPOLOGY_CHANGED
5007 * frame is received from the channel the current handler of the channel must tolerate the
5008 * stream topology as it currently exists.
5009 *
5010 * \note This interface is provided for applications and resources to request that the topology change.
5011 * It is not for use by the channel driver itself.
5012 */
5014 struct ast_stream_topology *topology, void *change_source);
5015
5016/*!
5017 * \brief Provide notice to a channel that the stream topology has changed
5018 *
5019 * \param chan The channel to provide notice to
5020 * \param topology The new stream topology
5021 *
5022 * \pre chan is locked Absolutely _NO_ other channels can be locked.
5023 *
5024 * \retval 0 success
5025 * \retval -1 failure
5026 *
5027 * \note This interface is provided for applications and resources to accept a topology change.
5028 * It is not for use by the channel driver itself.
5029 */
5030int ast_channel_stream_topology_changed(struct ast_channel *chan, struct ast_stream_topology *topology);
5031
5032/*!
5033 * \brief Provide notice from a channel that the topology has changed on it as a result
5034 * of the remote party renegotiating.
5035 *
5036 * \param chan The channel to provide notice from
5037 *
5038 * \retval 0 success
5039 * \retval -1 failure
5040 *
5041 * \note This interface is provided for channels to provide notice that a topology change
5042 * has occurred as a result of a remote party renegotiating the stream topology.
5043 */
5045
5046/*!
5047 * \brief Retrieve the source that initiated the last stream topology change
5048 *
5049 * \param chan The channel
5050 *
5051 * \retval The channel's stream topology change source
5052 */
5054
5055/*!
5056 * \brief Checks if a channel's technology implements a particular callback function
5057 * \since 18.0.0
5058 *
5059 * \param chan The channel
5060 * \param function The function to look for
5061 *
5062 * \retval 1 if the channel has a technology set and it implements the function
5063 * \retval 0 if the channel doesn't have a technology set or it doesn't implement the function
5064 */
5065#define ast_channel_has_tech_function(chan, function) \
5066 (ast_channel_tech(chan) ? ast_channel_tech(chan)->function != NULL : 0)
5067
5068/*!
5069 * \brief Get the name of the current channel storage driver
5070 *
5071 * \return The name of the current channel storage driver
5072 */
5074
5075/*!
5076 * \internal
5077 * \brief Set the current channel storage driver
5078 *
5079 * \param driver_name The name of the driver to set as the current driver
5080 *
5081 * \return 0 on success, -1 on failure
5082 *
5083 * \warning Changing the channel storage driver while Asterisk is running is
5084 * not supported. This function will return an error if called while
5085 * the ast_fully_booted flag is set. The function is exposed only
5086 * because options.c needs it to set the driver when reading
5087 * asterisk.conf.
5088 */
5089int internal_channel_set_current_storage_driver(const char *driver_name);
5090
5091#endif /* _ASTERISK_CHANNEL_H */
ast_alert_status_t
Definition alertpipe.h:24
static struct aco_type agent_type
char digit
static struct ast_generator gen
ast_cond_t cond
Definition app_sla.c:336
static char dialcontext[AST_MAX_CONTEXT]
int() ao2_callback_data_fn(void *obj, void *arg, void *data, int flags)
Type of a generic callback function.
Definition astobj2.h:1244
Call Completion Supplementary Services API.
static int connected
Definition cdr_pgsql.c:73
static char language[MAX_LANGUAGE]
Definition chan_iax2.c:348
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition chan_iax2.c:497
static const char type[]
static void dummy(char *unused,...)
void ast_party_subaddress_copy(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Copy the source party subaddress information to the destination party subaddress.
Definition channel.c:1692
void ast_channel_internal_alertpipe_swap(struct ast_channel *chan1, struct ast_channel *chan2)
Swap the interal alertpipe between two channels.
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
struct ao2_iterator ast_channel_dialed_causes_iterator(const struct ast_channel *chan)
Retrieve an iterator for dialed cause information.
struct varshead * ast_channel_get_manager_vars(struct ast_channel *chan)
Gets the variables for a given channel, as specified by ast_channel_set_manager_vars().
Definition channel.c:8008
int ast_senddigit_mf_begin(struct ast_channel *chan, char digit)
Send an MF digit to a channel.
Definition channel.c:4870
int ast_waitfordigit(struct ast_channel *c, int ms)
Waits for a digit.
Definition channel.c:3191
int ast_str2cause(const char *name) attribute_pure
Convert the string form of a cause code to a number.
Definition channel.c:626
const char * ast_channel_linkedid(const struct ast_channel *chan)
const char * ast_channel_name(const struct ast_channel *chan)
static int ast_fdisset(struct pollfd *pfds, int fd, int maximum, int *start)
Helper function for migrating select to poll.
Definition channel.h:2887
int ast_channel_tech_hangupcause(const struct ast_channel *chan)
int ast_autoservice_stop(struct ast_channel *chan)
Stop servicing a channel for us...
char * ast_print_namedgroups(struct ast_str **buf, struct ast_namedgroups *groups)
Print named call groups and named pickup groups.
Definition channel.c:8140
struct ast_bridge * ast_channel_internal_bridge(const struct ast_channel *chan)
void * ast_channel_get_stream_topology_change_source(struct ast_channel *chan)
Retrieve the source that initiated the last stream topology change.
struct timeval ast_channel_answertime(struct ast_channel *chan)
void ast_softhangup_all(void)
Soft hangup all active channels.
Definition channel.c:494
int ast_channel_request_stream_topology_change(struct ast_channel *chan, struct ast_stream_topology *topology, void *change_source)
Request that the stream topology of a channel change.
Definition channel.c:11054
void ast_channel_end_dtmf(struct ast_channel *chan, char digit, struct timeval start, const char *why)
Simulate a DTMF end on a broken bridge channel.
Definition channel.c:10957
void ast_party_redirecting_reason_copy(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Copy the source redirecting reason information to the destination redirecting reason.
Definition channel.c:2072
void ast_channel_rings_set(struct ast_channel *chan, int value)
void ast_channel_internal_copy_linkedid(struct ast_channel *dest, struct ast_channel *source)
Copy the full linkedid channel id structure from one channel to another.
void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
struct ast_channel * ast_channel_get_by_exten(const char *exten, const char *context)
Find a channel by extension and context.
Definition channel.c:1430
int(* ast_timing_func_t)(const void *data)
Definition channel.h:919
struct ast_channel * ast_channel_masq(const struct ast_channel *chan)
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
Definition channel.c:1578
char * ast_recvtext(struct ast_channel *chan, int timeout)
Receives a text string from a channel Read a string of text from a channel.
Definition channel.c:4752
enum ast_channel_error ast_channel_errno(void)
Get error code for latest channel operation.
Definition channel.c:11049
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition channel.c:2967
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition channel.c:1336
int ast_channel_blocker_tid(const struct ast_channel *chan)
void ast_channel_stream_set(struct ast_channel *chan, struct ast_filestream *value)
void ast_channel_appl_set(struct ast_channel *chan, const char *value)
void ast_channel_dtmff_set(struct ast_channel *chan, struct ast_frame *value)
void ast_party_dialed_set_init(struct ast_party_dialed *init, const struct ast_party_dialed *guide)
Initialize the given dialed structure using the given guide for a set update operation.
Definition channel.c:1937
void ast_channel_internal_bridged_channel_set(struct ast_channel *chan, struct ast_channel *value)
void ast_channel_visible_indication_set(struct ast_channel *chan, int value)
int ast_channel_get_device_name(struct ast_channel *chan, char *device_name, size_t name_buffer_length)
Get a device name given its channel structure.
Definition channel.c:10584
const char * ast_channel_blockproc(const struct ast_channel *chan)
void ast_channel_caller_set(struct ast_channel *chan, struct ast_party_caller *value)
struct ast_stream_topology * ast_channel_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
Set the topology of streams on a channel.
char * ast_transfercapability2str(int transfercapability) attribute_const
Gives the string form of a given transfer capability.
Definition channel.c:673
void ast_channel_set_unbridged_nolock(struct ast_channel *chan, int value)
Variant of ast_channel_set_unbridged. Use this if the channel is already locked prior to calling.
struct ast_channel * ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds, int *exception, int *outfd, int *ms)
Waits for activity on a group of channels.
Definition channel.c:3004
int ast_auto_answer(struct ast_channel *chan)
Answer a channel, if it's not already answered.
Definition channel.c:2823
struct ast_namedgroups * ast_channel_named_pickupgroups(const struct ast_channel *chan)
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition channel.c:2109
void * ast_channel_tech_pvt(const struct ast_channel *chan)
void ast_channel_internal_set_fake_ids(struct ast_channel *chan, const char *uniqueid, const char *linkedid)
Set uniqueid and linkedid string value only (not time)
static enum ast_t38_state ast_channel_get_t38_state(struct ast_channel *chan)
Retrieves the current T38 state of a channel.
Definition channel.h:2910
int ast_call(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition channel.c:6496
const char * ast_channel_data(const struct ast_channel *chan)
void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Set the redirecting id information in the Asterisk channel.
Definition channel.c:9203
int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders, int audiofd, int ctrlfd)
Definition channel.c:6598
void ast_channel_dialed_set(struct ast_channel *chan, struct ast_party_dialed *value)
void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag)
Clear a flag on a channel.
Definition channel.c:11122
struct ast_party_id ast_channel_redirecting_effective_to(struct ast_channel *chan)
struct ast_control_pvt_cause_code * ast_channel_dialed_causes_find(const struct ast_channel *chan, const char *chan_name)
Retrieve a ref-counted cause code information structure.
struct ast_channel * ast_call_forward(struct ast_channel *caller, struct ast_channel *orig, int *timeout, struct ast_format_cap *cap, struct outgoing_helper *oh, int *outstate)
Forwards a call to a new channel specified by the original channel's call_forward str....
Definition channel.c:5933
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
struct ast_party_id ast_channel_redirecting_effective_from(struct ast_channel *chan)
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition channel.c:1744
int ast_set_read_format_path(struct ast_channel *chan, struct ast_format *raw_format, struct ast_format *core_format)
Set specific read path on channel.
Definition channel.c:5523
void ast_channel_clear_softhangup(struct ast_channel *chan, int flag)
Clear a set of softhangup flags from a channel.
Definition channel.c:2423
void * ast_channel_music_state(const struct ast_channel *chan)
struct ast_channel_iterator * ast_channel_iterator_by_name_new(const char *name, size_t name_len)
Create a new channel iterator based on name.
Definition channel.c:1368
struct varshead * ast_channel_get_vars(struct ast_channel *chan)
Gets the variables for a given channel, as set using pbx_builtin_setvar_helper().
Definition channel.c:7936
void ast_channel_blockproc_set(struct ast_channel *chan, const char *value)
int ast_prod(struct ast_channel *chan)
Send empty audio to prime a channel driver.
Definition channel.c:5035
unsigned int ast_channel_fin(const struct ast_channel *chan)
void ast_channel_tech_hangupcause_set(struct ast_channel *chan, int value)
int __ast_answer(struct ast_channel *chan, unsigned int delay)
Answer a channel, with a selectable delay before returning.
Definition channel.c:2707
int ast_channel_connected_line_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *connected_info, int frame)
Run a connected line interception subroutine and update a channel's connected line information.
Definition channel.c:10422
const char * ast_channel_latest_musicclass(const struct ast_channel *chan)
void ast_channel_callid_cleanup(struct ast_channel *chan)
void ast_channel_insmpl_set(struct ast_channel *chan, unsigned long value)
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
Definition channel.c:1631
void ast_channel_set_oldwriteformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_softhangup_internal_flag_clear(struct ast_channel *chan, int value)
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition channel.c:2552
void ast_channel_set_caller(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
Set the caller id information in the Asterisk channel.
Definition channel.c:7411
struct varshead * ast_channel_varshead(struct ast_channel *chan)
int ast_channel_rings(const struct ast_channel *chan)
#define DECLARE_STRINGFIELD_SETTERS_FOR(field)
Definition channel.h:4130
void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value)
int ast_write_video(struct ast_channel *chan, struct ast_frame *frame)
Write video frame to a channel This function writes the given frame to the indicated channel.
Definition channel.c:5052
int ast_raw_answer_with_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer a channel passing in a stream topology.
Definition channel.c:2650
void ast_channel_blocker_set(struct ast_channel *chan, pthread_t value)
void ast_channel_tenantid_set(struct ast_channel *chan, const char *value)
void ast_channel_sending_dtmf_digit_set(struct ast_channel *chan, char value)
void * ast_channel_timingdata(const struct ast_channel *chan)
struct ast_channel_iterator * ast_channel_iterator_destroy(struct ast_channel_iterator *i)
Destroy a channel iterator.
Definition channel.c:1349
int ast_channel_internal_alert_readfd(struct ast_channel *chan)
ast_channel_requestor_relationship
Definition channel.h:1523
@ AST_CHANNEL_REQUESTOR_BRIDGE_PEER
Definition channel.h:1525
@ AST_CHANNEL_REQUESTOR_REPLACEMENT
Definition channel.h:1527
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
Definition channel.c:10652
int ast_transfer_protocol(struct ast_channel *chan, char *dest, int *protocol)
Transfer a channel (if supported) receieve protocol result.
Definition channel.c:6533
const char * ast_channel_tenantid(const struct ast_channel *chan)
void ast_party_subaddress_set_init(struct ast_party_subaddress *init, const struct ast_party_subaddress *guide)
Initialize the given party subaddress structure using the given guide for a set update operation.
Definition channel.c:1706
void ast_channel_dtmf_tv_set(struct ast_channel *chan, struct timeval *value)
struct ast_flags * ast_channel_snapshot_segment_flags(struct ast_channel *chan)
void ast_channel_set_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Set the connected line information in the Asterisk channel.
Definition channel.c:8392
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition channel.c:4909
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
Definition channel.c:1808
struct ast_channel * ast_channel_get_by_uniqueid(const char *uniqueid)
Find a channel by a uniqueid.
Definition channel.c:1442
void ast_party_number_copy(struct ast_party_number *dest, const struct ast_party_number *src)
Copy the source party number information to the destination party number.
Definition channel.c:1639
void ast_channel_internal_swap_endpoint_forward(struct ast_channel *a, struct ast_channel *b)
Swap endpoint_forward between two channels.
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
const char * ast_channel_musicclass(const struct ast_channel *chan)
void ast_channel_unlink(struct ast_channel *chan)
Remove a channel from the global channels container.
Definition channel.c:10617
int ast_channel_sendhtml(struct ast_channel *channel, int subclass, const char *data, int datalen)
Sends HTML on given channel Send HTML or URL on link.
Definition channel.c:6663
int ast_channel_fdno(const struct ast_channel *chan)
void ast_party_number_set(struct ast_party_number *dest, const struct ast_party_number *src)
Set the source party number information into the destination party number.
Definition channel.c:1661
void ast_channel_internal_fd_clear_all(struct ast_channel *chan)
void ast_party_subaddress_init(struct ast_party_subaddress *init)
Initialize the given subaddress structure.
Definition channel.c:1684
int ast_channel_has_hook_requiring_audio(struct ast_channel *chan)
Check if the channel has any active hooks that require audio.
Definition channel.c:2535
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition channel.c:2059
void ast_channel_internal_bridge_channel_set(struct ast_channel *chan, struct ast_bridge_channel *value)
void ast_channel_internal_alertpipe_close(struct ast_channel *chan)
int64_t ast_channel_get_up_time_ms(struct ast_channel *chan)
Obtain how long it has been since the channel was answered in ms.
Definition channel.c:2847
void ast_channel_set_manager_vars(size_t varc, char **vars)
Sets the variables to be stored in the manager_vars field of all snapshots.
Definition channel.c:7912
struct stasis_topic * ast_channel_topic(struct ast_channel *chan)
A topic which publishes the events for a particular channel.
int ast_sendtext_data(struct ast_channel *chan, struct ast_msg_data *msg)
Sends text to a channel in an ast_msg_data structure wrapper with ast_sendtext as fallback.
Definition channel.c:4786
void ast_channel_answertime_set(struct ast_channel *chan, struct timeval *value)
int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition channel.c:7634
void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
Set the caller id information in the Asterisk channel and generate an AMI event if the caller id name...
Definition channel.c:7424
struct ast_channel * ast_waitfor_n(struct ast_channel **chan, int n, int *ms)
Waits for input on a group of channels Wait for input on an array of channels for a given # of millis...
Definition channel.c:3173
void ast_channel_hold_state_set(struct ast_channel *chan, int value)
int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition channel.c:5009
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
void ast_party_redirecting_set(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src, const struct ast_set_party_redirecting *update)
Set the redirecting information based on another redirecting source.
Definition channel.c:2153
const char * ast_channel_lastexten(const struct ast_channel *chan)
int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer)
Make the frame formats of two channels compatible.
Definition channel.c:6755
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
ast_t38_state
Possible T38 states on channels.
Definition channel.h:898
@ T38_STATE_UNAVAILABLE
Definition channel.h:899
void ast_channel_data_set(struct ast_channel *chan, const char *value)
struct timeval ast_channel_sending_dtmf_tv(const struct ast_channel *chan)
struct varshead * ast_channel_get_ari_vars(struct ast_channel *chan)
Gets the variables for a given channel, as specified by ast_channel_set_ari_vars().
Definition channel.c:8013
void ast_channel_jb_set(struct ast_channel *chan, struct ast_jb *value)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_snapshot_set(struct ast_channel *chan, struct ast_channel_snapshot *snapshot)
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition channel.c:1798
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
Definition channel.c:571
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
void ast_party_subaddress_set(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Set the source party subaddress information into the destination party subaddress.
Definition channel.c:1714
int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
Waits for input on an fd.
Definition channel.c:2996
unsigned short ast_channel_transfercapability(const struct ast_channel *chan)
int ast_channel_stream_topology_changed(struct ast_channel *chan, struct ast_stream_topology *topology)
Provide notice to a channel that the stream topology has changed.
Definition channel.c:11084
struct ast_namedgroups * ast_channel_named_callgroups(const struct ast_channel *chan)
ast_group_t ast_channel_pickupgroup(const struct ast_channel *chan)
void ast_channel_blocker_tid_set(struct ast_channel *chan, int tid)
void ast_channel_vstreamid_set(struct ast_channel *chan, int value)
void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
Set the source party id information into the destination party id.
Definition channel.c:1775
struct ast_channel * ast_channel_iterator_next(struct ast_channel_iterator *i)
Get the next channel for a channel iterator.
Definition channel.c:1388
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition channel.c:8199
struct ast_namedgroups * ast_ref_namedgroups(struct ast_namedgroups *groups)
Definition channel.c:7790
int ast_channel_feature_hooks_replace(struct ast_channel *chan, struct ast_bridge_features *features)
Sets the channel-attached features a channel has access to upon being bridged.
Definition channel.c:11044
struct ast_silence_generator * ast_channel_start_silence_generator(struct ast_channel *chan)
Starts a silence generator on the given channel.
Definition channel.c:8248
int internal_channel_set_current_storage_driver(const char *driver_name)
Definition channel.c:8063
void ast_channel_timingdata_set(struct ast_channel *chan, void *value)
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition channel.c:2018
int ast_recvchar(struct ast_channel *chan, int timeout)
Receives a text character from a channel.
Definition channel.c:4741
struct ast_format * ast_channel_oldwriteformat(struct ast_channel *chan)
int ast_channel_internal_alert_readable(struct ast_channel *chan)
struct ast_cdr * ast_channel_cdr(const struct ast_channel *chan)
struct ast_channel * ast_channel_yank(struct ast_channel *yankee)
Gain control of a channel in the system.
Definition channel.c:10681
int ast_channel_queryoption(struct ast_channel *channel, int option, void *data, int *datalen, int block)
Checks the value of an option.
Definition channel.c:7494
int ast_waitfor(struct ast_channel *chan, int ms)
Wait for input on a channel.
Definition channel.c:3178
int ast_channel_cc_params_init(struct ast_channel *chan, const struct ast_cc_config_params *base_params)
Set up datastore with CCSS parameters for a channel.
Definition channel.c:10535
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_channel * __ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *reason, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
Request a channel of a given type, with data as optional information used by the low level module and...
Definition channel.c:6011
void ast_channel_redirecting_set(struct ast_channel *chan, struct ast_party_redirecting *value)
unsigned long long ast_group_t
Definition channel.h:215
ast_channel_error
Definition channel.h:4911
@ AST_CHANNEL_ERROR_ID_EXISTS
Definition channel.h:4915
@ AST_CHANNEL_ERROR_UNKNOWN
Definition channel.h:4913
int ast_channel_get_intercept_mode(void)
Am I currently running an intercept dialplan routine.
Definition channel.c:10417
void ast_party_connected_line_set(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src, const struct ast_set_party_connected_line *update)
Set the connected line information based on another connected line source.
Definition channel.c:2041
int ast_channel_priority(const struct ast_channel *chan)
void ast_channel_writetrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_silence_generator *state)
Stops a previously-started silence generator on the given channel.
Definition channel.c:8294
int ast_settimeout_full(struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data, unsigned int is_ao2_obj)
Definition channel.c:3201
void ast_channel_streamid_set(struct ast_channel *chan, int value)
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
void ast_party_dialed_init(struct ast_party_dialed *init)
Initialize the given dialed structure.
Definition channel.c:1915
const char * ast_channel_get_current_storage_driver_name(void)
Get the name of the current channel storage driver.
Definition channel.c:8057
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
void ast_party_caller_copy(struct ast_party_caller *dest, const struct ast_party_caller *src)
Copy the source caller information to the destination caller.
Definition channel.c:1973
struct ast_str * ast_channel_dialed_causes_channels(const struct ast_channel *chan)
Retrieve a comma-separated list of channels for which dialed cause information is available.
void ast_channel_softhangup_internal_flag_set(struct ast_channel *chan, int value)
ast_callid ast_channel_callid(const struct ast_channel *chan)
void ast_party_redirecting_reason_set(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Set the redirecting reason information based on another redirecting reason source.
Definition channel.c:2089
int ast_namedgroups_intersect(struct ast_namedgroups *a, struct ast_namedgroups *b)
Return TRUE if group a and b contain at least one common groupname.
Definition channel.c:8174
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_accountcode(const struct ast_channel *chan)
void ast_channel_internal_swap_endpoints(struct ast_channel *a, struct ast_channel *b)
Swap endpoints between two channels.
struct ast_channel * ast_channel__bridge(const struct ast_channel *chan)
void ast_channel_undefer_dtmf(struct ast_channel *chan)
Unset defer DTMF flag on channel.
Definition channel.c:1329
void ast_channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
Setup new channel accountcodes from the requestor channel after ast_request().
Definition channel.c:6469
const char * ast_channel_context(const struct ast_channel *chan)
const char * ast_channel_userfield(const struct ast_channel *chan)
char ast_channel_dtmf_digit_to_emulate(const struct ast_channel *chan)
unsigned long ast_channel_insmpl(const struct ast_channel *chan)
int ast_channel_fd_add(struct ast_channel *chan, int value)
Add a file descriptor to the channel without a fixed position.
void ast_deactivate_generator(struct ast_channel *chan)
Definition channel.c:2904
ast_alert_status_t ast_channel_internal_alert_flush(struct ast_channel *chan)
void ast_party_id_merge_copy(struct ast_party_id *dest, struct ast_party_id *base, struct ast_party_id *overlay)
Copy a merge of a given party id into another given party id to a given destination party id.
Definition channel.c:1907
struct ast_channel_iterator * ast_channel_iterator_by_exten_new(const char *exten, const char *context)
Create a new channel iterator based on extension.
Definition channel.c:1357
int ast_check_hangup_locked(struct ast_channel *chan)
Definition channel.c:460
void ast_channel_timingfd_set(struct ast_channel *chan, int value)
int ast_channel_cmpwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
Compare a offset with the settings of when to hang a channel up.
Definition channel.c:524
void ast_channel_endpoint_set(struct ast_channel *chan, struct ast_endpoint *endpoint)
char * ast_print_group(char *buf, int buflen, ast_group_t group)
Print call and pickup groups into buffer.
Definition channel.c:8115
struct ast_channel * ast_channel_get_by_name_prefix(const char *name, size_t name_len)
Find a channel by a name prefix.
Definition channel.c:1400
pthread_t ast_channel_blocker(const struct ast_channel *chan)
void ast_party_redirecting_reason_set_init(struct ast_party_redirecting_reason *init, const struct ast_party_redirecting_reason *guide)
Initialize the given redirecting reason structure using the given guide for a set update operation.
Definition channel.c:2083
ama_flags
Channel AMA Flags.
Definition channel.h:1197
int ast_set_write_format_interleaved_stereo(struct ast_channel *chan, struct ast_format *format)
Sets write format for a channel. All internal data will than be handled in an interleaved format....
Definition channel.c:5820
void ast_channel_sending_dtmf_tv_set(struct ast_channel *chan, struct timeval value)
int ast_write(struct ast_channel *chan, struct ast_frame *frame)
Write a frame to a channel This function writes the given frame to the indicated channel.
Definition channel.c:5179
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
Set the caller information based on another caller source.
Definition channel.c:1994
int ast_channel_suppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
Suppress passing of a frame type on a channel.
Definition channel.c:10865
int ast_channel_feature_hooks_append(struct ast_channel *chan, struct ast_bridge_features *features)
Appends to the channel-attached features a channel has access to upon being bridged.
Definition channel.c:11039
int ast_autoservice_start(struct ast_channel *chan)
Automatically service a channel for us...
void ast_channel_softhangup_withcause_locked(struct ast_channel *chan, int causecode)
Lock the given channel, then request softhangup on the channel with the given causecode.
Definition channel.c:469
int ast_channel_epfd(const struct ast_channel *chan)
int ast_undestroyed_channels(void)
Definition channel.c:505
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition channel.c:4290
void ast_party_connected_line_collect_caller(struct ast_party_connected_line *connected, struct ast_party_caller *caller)
Collect the caller party information into a connected line structure.
Definition channel.c:2050
struct ast_bridge_features * ast_channel_feature_hooks_get(struct ast_channel *chan)
Gets the channel-attached features a channel has access to upon being bridged.
Definition channel.c:10991
void ast_channel_update_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Indicate that the connected line information has changed.
Definition channel.c:9177
int ast_channel_is_t38_active_nolock(struct ast_channel *chan)
ast_channel_is_t38_active variant. Use this if the channel is already locked prior to calling.
int ast_senddigit_mf_end(struct ast_channel *chan)
End sending an MF digit to a channel.
Definition channel.c:4978
int ast_channel_move(struct ast_channel *dest, struct ast_channel *source)
Move a channel from its current location to a new location.
Definition channel.c:10754
void ast_channel_queue_redirecting_update(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Queue a redirecting update frame on a channel.
Definition channel.c:10381
void ast_party_redirecting_reason_init(struct ast_party_redirecting_reason *init)
Initialize the given redirecting reason structure.
Definition channel.c:2066
const char * ast_channel_parkinglot(const struct ast_channel *chan)
ast_channel_adsicpe
Definition channel.h:888
int ast_senddigit_external(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel from an external thread.
Definition channel.c:5022
void ast_channel_internal_swap_topics(struct ast_channel *a, struct ast_channel *b)
Swap topics beteween two channels.
int ast_sendtext(struct ast_channel *chan, const char *text)
Sends text to a channel.
Definition channel.c:4844
const char * ast_channel_appl(const struct ast_channel *chan)
struct ast_frame * ast_read_stream(struct ast_channel *chan)
Reads a frame, but does not filter to just the default streams.
Definition channel.c:4295
void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide)
Initialize the given caller structure using the given guide for a set update operation.
Definition channel.c:1986
int ast_channel_unbridged_nolock(struct ast_channel *chan)
ast_channel_unbridged variant. Use this if the channel is already locked prior to calling.
void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
Initialize the given party id structure using the given guide for a set update operation.
Definition channel.c:1767
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
Definition channel.c:1625
void ast_channel_set_ari_vars(size_t varc, char **vars)
Sets the variables to be stored in the ari_vars field of all snapshots.
Definition channel.c:7917
const char * ast_channel_peeraccount(const struct ast_channel *chan)
void ast_party_dialed_free(struct ast_party_dialed *doomed)
Destroy the dialed party contents.
Definition channel.c:1958
void ast_channel_framehooks_set(struct ast_channel *chan, struct ast_framehook_list *value)
struct timeval ast_channel_creationtime(struct ast_channel *chan)
void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
Set caller ID number, name and ANI and generate AMI event.
Definition channel.c:7386
int ast_channel_redirecting_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *redirecting_info, int is_frame)
Run a redirecting interception subroutine and update a channel's redirecting information.
Definition channel.c:10467
void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
Inherits channel variable from parent to child channel.
Definition channel.c:6811
struct ast_channel * ast_channel_get_by_name(const char *search)
Find a channel by name or uniqueid.
Definition channel.c:1417
struct ast_bridge_channel * ast_channel_internal_bridge_channel(const struct ast_channel *chan)
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
struct ast_frame * ast_read_stream_noaudio(struct ast_channel *chan)
Reads a frame, but does not filter to just the default streams, returning AST_FRAME_NULL frame if aud...
Definition channel.c:4305
void ast_channel_audiohooks_set(struct ast_channel *chan, struct ast_audiohook_list *value)
int ast_channel_fd(const struct ast_channel *chan, int which)
void ast_party_redirecting_set_init(struct ast_party_redirecting *init, const struct ast_party_redirecting *guide)
Initialize the given redirecting id structure using the given guide for a set update operation.
Definition channel.c:2140
void ast_channel_timer_set(struct ast_channel *chan, struct ast_timer *value)
int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
Sets read format on channel chan.
Definition channel.c:5797
void ast_channel_internal_fd_set(struct ast_channel *chan, int which, int value)
void ast_party_name_set_init(struct ast_party_name *init, const struct ast_party_name *guide)
Initialize the given party name structure using the given guide for a set update operation.
Definition channel.c:1600
void ast_channel_fin_set(struct ast_channel *chan, unsigned int value)
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
enum ama_flags ast_channel_amaflags(const struct ast_channel *chan)
int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected)
Parse connected line indication frame data.
Definition channel.c:8869
void ast_party_caller_free(struct ast_party_caller *doomed)
Destroy the caller party contents.
Definition channel.c:2002
void ast_channel_readtrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
void ast_party_dialed_copy(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
Copy the source dialed party information to the destination dialed party.
Definition channel.c:1923
int ast_active_channels(void)
returns number of active/allocated channels
Definition channel.c:500
struct ast_namedgroups * ast_get_namedgroups(const char *s)
Create an ast_namedgroups set with group names from comma separated string.
Definition channel.c:7727
int ast_channel_supports_html(struct ast_channel *channel)
Checks for HTML support on a channel.
Definition channel.c:6658
void ast_channel_callgroup_set(struct ast_channel *chan, ast_group_t value)
void ast_channel_internal_bridge_set(struct ast_channel *chan, struct ast_bridge *value)
void * ast_channel_generatordata(const struct ast_channel *chan)
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)
void ast_channel_set_is_t38_active_nolock(struct ast_channel *chan, int is_t38_active)
Variant of ast_channel_set_is_t38_active. Use this if the channel is already locked prior to calling.
const char * ast_channel_hangupsource(const struct ast_channel *chan)
AST_MONITORING_STATE
Definition channel.h:4123
@ AST_MONITOR_PAUSED
Definition channel.h:4125
@ AST_MONITOR_RUNNING
Definition channel.h:4124
unsigned int ast_channel_fout(const struct ast_channel *chan)
const char * ast_channel_dialcontext(const struct ast_channel *chan)
int ast_check_hangup(struct ast_channel *chan)
Check to see if a channel is needing hang up.
Definition channel.c:446
struct ast_stream_topology * ast_channel_get_stream_topology(const struct ast_channel *chan)
Retrieve the topology of streams on a channel.
void ast_channel_set_unbridged(struct ast_channel *chan, int value)
Sets the unbridged flag and queues a NULL frame on the channel to trigger a check by bridge_channel_w...
void ast_channel_outsmpl_set(struct ast_channel *chan, unsigned long value)
void ast_party_name_set(struct ast_party_name *dest, const struct ast_party_name *src)
Set the source party name information into the destination party name.
Definition channel.c:1608
int ast_channel_hangupcause(const struct ast_channel *chan)
void ast_set_party_id_all(struct ast_set_party_id *update_id)
Set the update marker to update all information of a corresponding party id.
Definition channel.c:1737
int ast_channel_is_bridged(const struct ast_channel *chan)
Determine if a channel is in a bridge.
Definition channel.c:10633
void ast_party_dialed_set(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
Set the dialed information based on another dialed source.
Definition channel.c:1945
const char * ast_channel_reason2str(int reason)
return an english explanation of the code returned thru __ast_request_and_dial's 'outstate' argument
Definition channel.c:5861
int ast_channel_timingfd(const struct ast_channel *chan)
void ast_channel_fdno_set(struct ast_channel *chan, int value)
struct ast_frame * ast_read_noaudio(struct ast_channel *chan)
Reads a frame, returning AST_FRAME_NULL frame if audio.
Definition channel.c:4300
int64_t ast_channel_get_duration_ms(struct ast_channel *chan)
Obtain how long it's been, in milliseconds, since the channel was created.
Definition channel.c:2832
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition channel.c:10622
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
struct ast_channel * ast_channel_internal_bridged_channel(const struct ast_channel *chan)
void ast_channel_creationtime_set(struct ast_channel *chan, struct timeval *value)
int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen)
Indicates condition of channel, with payload.
Definition channel.c:4688
int ast_redirecting_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Build the redirecting id data frame.
Definition channel.c:9352
struct ast_tone_zone * ast_channel_zone(const struct ast_channel *chan)
void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
Set the source of the hangup in this channel and it's bridge.
Definition channel.c:2510
void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
Set a flag on a channel.
Definition channel.c:11115
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup up a channel.
Definition channel.c:2462
struct ast_party_id ast_channel_redirecting_effective_orig(struct ast_channel *chan)
void ast_channel_name_to_dial_string(char *channel_name)
Removes the trailing identifiers from a channel name string.
Definition channel.c:6879
int ast_channel_dialed_causes_add(const struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Add cause code information to the channel.
void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
int ast_channel_alert_write(struct ast_channel *chan)
void ast_channel_hangupcause_hash_set(struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.
Definition channel.c:4380
const char * ast_channel_lastcontext(const struct ast_channel *chan)
int ast_channel_vstreamid(const struct ast_channel *chan)
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
void ast_channel_update_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Indicate that the redirecting id has changed.
Definition channel.c:10368
int ast_channel_has_manager_vars(void)
Return whether or not any manager variables have been set.
Definition channel.c:7880
void ast_channel_set_is_t38_active(struct ast_channel *chan, int is_t38_active)
Sets the is_t38_active flag.
struct ast_jb * ast_channel_jb(struct ast_channel *chan)
void ast_party_id_reset(struct ast_party_id *id)
Destroy and initialize the given party id structure.
Definition channel.c:1883
const char * ast_channel_amaflags2string(enum ama_flags flags)
Convert the enum representation of an AMA flag to a string representation.
Definition channel.c:4407
void ast_channel__bridge_set(struct ast_channel *chan, struct ast_channel *value)
void ast_party_id_invalidate(struct ast_party_id *id)
Invalidate all components of the given party id.
Definition channel.c:1876
ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
int ast_connected_line_build_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Build the connected line information data frame.
Definition channel.c:8781
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition channel.c:4959
int ast_channel_has_ari_vars(void)
Return whether or not any ARI variables have been set.
Definition channel.c:7885
void ast_channel_dtmf_digit_to_emulate_set(struct ast_channel *chan, char value)
int ast_channel_register(const struct ast_channel_tech *tech)
Register a channel technology (a new channel driver) Called by a channel module to register the kind ...
Definition channel.c:540
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
struct timeval * ast_channel_whentohangup(struct ast_channel *chan)
struct ast_party_id ast_party_id_merge(struct ast_party_id *base, struct ast_party_id *overlay)
Merge a given party id into another given party id.
Definition channel.c:1889
struct ast_stream * ast_channel_get_default_stream(struct ast_channel *chan, enum ast_media_type type)
Retrieve the default stream of a specific media type on a channel.
struct ast_channel * ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *reason, const char *cid_num, const char *cid_name)
Request a channel of a given type, with data as optional information used by the low level module and...
Definition channel.c:6209
struct ast_filestream * ast_channel_vstream(const struct ast_channel *chan)
int ast_channel_stream_topology_changed_externally(struct ast_channel *chan)
Provide notice from a channel that the topology has changed on it as a result of the remote party ren...
Definition channel.c:11096
ast_alert_status_t ast_channel_internal_alert_read(struct ast_channel *chan)
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
void ast_party_number_set_init(struct ast_party_number *init, const struct ast_party_number *guide)
Initialize the given party number structure using the given guide for a set update operation.
Definition channel.c:1653
int ast_settimeout(struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data)
Enable or disable timer ticks for a channel.
Definition channel.c:3196
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition channel.c:5838
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition channel.c:1752
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
Definition channel.c:1678
void ast_channel_internal_swap_uniqueid_and_linkedid(struct ast_channel *a, struct ast_channel *b)
Swap uniqueid and linkedid beteween two channels.
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
ast_group_t ast_channel_callgroup(const struct ast_channel *chan)
struct ast_party_id ast_channel_connected_effective_id(struct ast_channel *chan)
int ast_channel_unbridged(struct ast_channel *chan)
This function will check if the bridge needs to be re-evaluated due to external changes.
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition channel.c:2009
int ast_channel_get_up_time(struct ast_channel *chan)
Obtain how long it has been since the channel was answered.
Definition channel.c:2857
int ast_channel_is_leaving_bridge(struct ast_channel *chan)
Determine if a channel is leaving a bridge, but not hung up.
Definition channel.c:10638
void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
Set when to hang a channel up.
Definition channel.c:511
int ast_channel_hold_state(const struct ast_channel *chan)
int ast_channel_sendurl(struct ast_channel *channel, const char *url)
Sends a URL on a given link Send URL on link.
Definition channel.c:6670
int ast_redirecting_parse_data(const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting)
Parse redirecting indication frame data.
Definition channel.c:9563
void ast_channel_emulate_dtmf_duration_set(struct ast_channel *chan, unsigned int value)
int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int(*cond)(void *), void *data)
Wait for a specified amount of time, looking for hangups and a condition argument.
Definition channel.c:1555
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
struct ast_variable * ast_channeltype_list(void)
return an ast_variable list of channeltypes
Definition channel.c:189
const char * ast_channel_oldest_linkedid(const char *a, const char *b)
Return the oldest linkedid between two channels.
const char * ast_channel_language(const struct ast_channel *chan)
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel's bridge pointer.
Definition channel.c:10670
const char * ast_cause2str(int cause) attribute_pure
Gives the string form of a given cause code.
Definition channel.c:613
int ast_senddigit_mf(struct ast_channel *chan, char digit, unsigned int duration, unsigned int durationkp, unsigned int durationst, int is_external)
Send an MF digit to a channel.
Definition channel.c:4987
int ast_write_text(struct ast_channel *chan, struct ast_frame *frame)
Write text frame to a channel This function writes the given frame to the indicated channel.
struct ast_party_connected_line * ast_channel_connected_indicated(struct ast_channel *chan)
struct ast_endpoint * ast_channel_endpoint(const struct ast_channel *chan)
int ast_transfer(struct ast_channel *chan, char *dest)
Transfer a channel (if supported).
Definition channel.c:6520
void ast_channel_cdr_set(struct ast_channel *chan, struct ast_cdr *value)
int ast_channel_unsuppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
Stop suppressing of a frame type on a channel.
Definition channel.c:10927
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition channel.c:2166
void ast_channel_context_set(struct ast_channel *chan, const char *value)
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
Definition channel.c:2417
int ast_channel_streamid(const struct ast_channel *chan)
void ast_channel_connected_set(struct ast_channel *chan, struct ast_party_connected_line *value)
const char * ast_state2str(enum ast_channel_state state)
Gives the string form of a given channel state.
Definition channel.c:637
void ast_channel_timingfunc_set(struct ast_channel *chan, ast_timing_func_t value)
struct ast_sched_context * ast_channel_sched(const struct ast_channel *chan)
void ast_channel_state_set(struct ast_channel *chan, enum ast_channel_state)
void ast_connected_line_copy_from_caller(struct ast_party_connected_line *dest, const struct ast_party_caller *src)
Copy the caller information to the connected line information.
Definition channel.c:8377
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
Softly hangup up a channel (no channel lock)
Definition channel.c:2449
int ast_channel_forward_endpoint(struct ast_channel *chan, struct ast_endpoint *endpoint)
Forward channel stasis messages to the given endpoint.
int ast_channel_fd_count(const struct ast_channel *chan)
Retrieve the number of file decriptor positions present on the channel.
enum ama_flags ast_channel_string2amaflag(const char *flag)
Convert a string to a detail record AMA flag.
Definition channel.c:4394
struct ast_frame * ast_channel_dtmff(struct ast_channel *chan)
void ast_channel_internal_swap_snapshots(struct ast_channel *a, struct ast_channel *b)
Swap snapshots beteween two channels.
void ast_channel_music_state_set(struct ast_channel *chan, void *value)
void ast_channel_req_accountcodes_precious(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
Setup new channel accountcodes from the requestor channel after ast_request().
Definition channel.c:6474
unsigned int ast_channel_emulate_dtmf_duration(const struct ast_channel *chan)
static int ast_add_fd(struct pollfd *pfd, int fd)
if fd is a valid descriptor, set *pfd with the descriptor
Definition channel.h:2879
const char * ast_channel_call_forward(const struct ast_channel *chan)
int ast_set_write_format_path(struct ast_channel *chan, struct ast_format *core_format, struct ast_format *raw_format)
Set specific write path on channel.
Definition channel.c:5559
struct ast_filestream * ast_channel_stream(const struct ast_channel *chan)
void ast_channel_internal_fd_clear(struct ast_channel *chan, int which)
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
void ast_channel_fout_set(struct ast_channel *chan, unsigned int value)
struct ast_autochan_list * ast_channel_autochans(struct ast_channel *chan)
int ast_pre_call(struct ast_channel *chan, const char *sub_args)
Execute a Gosub call on the channel before a call is placed.
Definition channel.c:6479
void ast_channel_zone_set(struct ast_channel *chan, struct ast_tone_zone *value)
struct ast_channel * ast_channel_masqr(const struct ast_channel *chan)
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
Definition channel.c:7784
void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
Destroy the party subaddress contents.
Definition channel.c:1731
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block)
Sets an option on a channel.
Definition channel.c:7474
int ast_set_read_format_from_cap(struct ast_channel *chan, struct ast_format_cap *formats)
Sets read format on channel chan from capabilities Set read format for channel to whichever component...
Definition channel.c:5815
struct timeval * ast_channel_dtmf_tv(struct ast_channel *chan)
int ast_channel_get_duration(struct ast_channel *chan)
Obtain how long the channel since the channel was created.
Definition channel.c:2842
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
void ast_channel_queue_connected_line_update(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Queue a connected line update frame on a channel.
Definition channel.c:9190
void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
Initialize the given connected line structure using the given guide for a set update operation.
Definition channel.c:2032
char ast_channel_sending_dtmf_digit(const struct ast_channel *chan)
int ast_channel_visible_indication(const struct ast_channel *chan)
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
void ast_channel_transfercapability_set(struct ast_channel *chan, unsigned short value)
unsigned long ast_channel_outsmpl(const struct ast_channel *chan)
void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value)
void ast_channel_callid_set(struct ast_channel *chan, ast_callid value)
int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame *frame)
Write a frame to a stream This function writes the given frame to the indicated stream on the channel...
Definition channel.c:5184
void ast_channel_internal_alertpipe_clear(struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)
int ast_safe_sleep_without_silence(struct ast_channel *chan, int ms)
Wait for a specified amount of time, looking for hangups, and do not generate silence.
Definition channel.c:1566
int ast_autoservice_ignore(struct ast_channel *chan, enum ast_frame_type ftype)
Ignore certain frame types.
int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders)
Reads multiple digits.
Definition channel.c:6593
void ast_connected_line_copy_to_caller(struct ast_party_caller *dest, const struct ast_party_connected_line *src)
Copy the connected line information to the caller information.
Definition channel.c:8384
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
void ast_autoservice_chan_hangup_peer(struct ast_channel *chan, struct ast_channel *peer)
Put chan into autoservice while hanging up peer.
void ast_channel_whentohangup_set(struct ast_channel *chan, struct timeval *value)
void ast_channel_pickupgroup_set(struct ast_channel *chan, ast_group_t value)
const struct ast_channel_tech * ast_get_channel_tech(const char *name)
Get a channel technology structure by name.
Definition channel.c:593
int ast_channel_fd_isset(const struct ast_channel *chan, int which)
int ast_channel_defer_dtmf(struct ast_channel *chan)
Defers DTMF so that you only read things like hangups and audio.
Definition channel.c:1315
int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition channel.c:7652
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2817
void ast_channel_adsicpe_set(struct ast_channel *chan, enum ast_channel_adsicpe value)
void ast_channel_dialed_causes_clear(const struct ast_channel *chan)
Clear all cause information from the channel.
void ast_channel_epfd_set(struct ast_channel *chan, int value)
ast_group_t ast_get_group(const char *s)
Definition channel.c:7670
int ast_channel_is_multistream(struct ast_channel *chan)
Determine if a channel is multi-stream capable.
int ast_channel_early_bridge(struct ast_channel *c0, struct ast_channel *c1)
Bridge two channels together (early)
Definition channel.c:7464
int ast_channel_internal_alertpipe_init(struct ast_channel *chan)
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition channel.c:4310
void ast_channel_sched_set(struct ast_channel *chan, struct ast_sched_context *value)
int ast_is_deferrable_frame(const struct ast_frame *frame)
Should we keep this frame for later?
Definition channel.c:1454
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
struct ast_channel_iterator * ast_channel_iterator_all_new(void)
Create a new channel iterator.
Definition channel.c:1380
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait for a specified amount of time, looking for hangups.
Definition channel.c:1561
const char * ast_channel_exten(const struct ast_channel *chan)
int ast_channel_is_t38_active(struct ast_channel *chan)
This function will check if T.38 is active on the channel.
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
struct ast_cc_config_params * ast_channel_get_cc_config_params(struct ast_channel *chan)
Get the CCSS parameters from a channel.
Definition channel.c:10558
void ast_channel_masq_set(struct ast_channel *chan, struct ast_channel *value)
int ast_raw_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2702
int ast_waitfordigit_full(struct ast_channel *c, int ms, const char *breakon, int audiofd, int ctrlfd)
Wait for a digit Same as ast_waitfordigit() with audio fd for outputting read audio and ctrlfd to mon...
Definition channel.c:3256
void ast_channel_varshead_set(struct ast_channel *chan, struct varshead *value)
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition channel.c:2122
void ast_channel_pbx_set(struct ast_channel *chan, struct ast_pbx *value)
struct ast_channel * ast_channel_internal_oldest_linkedid(struct ast_channel *a, struct ast_channel *b)
Determine which channel has an older linkedid.
void ast_party_name_copy(struct ast_party_name *dest, const struct ast_party_name *src)
Copy the source party name information to the destination party name.
Definition channel.c:1586
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_vstream_set(struct ast_channel *chan, struct ast_filestream *value)
int ast_channel_get_cc_agent_type(struct ast_channel *chan, char *agent_type, size_t size)
Find the appropriate CC agent type to use given a channel.
Definition channel.c:10601
void ast_party_redirecting_reason_free(struct ast_party_redirecting_reason *doomed)
Destroy the redirecting reason contents.
Definition channel.c:2103
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition channel.c:1965
int ast_set_write_format_from_cap(struct ast_channel *chan, struct ast_format_cap *formats)
Sets write format on channel chan Set write format for channel to whichever component of "format" is ...
Definition channel.c:5856
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
int ast_channel_alert_writable(struct ast_channel *chan)
void ast_tonepair_stop(struct ast_channel *chan)
Definition channel.c:7647
int ast_channel_has_audio_frame_or_monitor(struct ast_channel *chan)
Check if the channel has active audiohooks, active framehooks, or a monitor.
Definition channel.c:2529
ast_channel_state
ast_channel states
ast_media_type
Types of media.
Definition codec.h:30
static void update(int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)
Definition codec_g726.c:367
#define attribute_pure
Definition compiler.h:35
#define attribute_const
Definition compiler.h:41
char buf[BUFSIZE]
Definition eagi_proxy.c:66
long int flag
Definition f2c.h:83
static const char name[]
Definition format_mp3.c:68
direction
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define AST_OPTION_T38_STATE
ast_frame_type
Frame types.
unsigned int ast_callid
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
static char url[512]
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821
Structure to pass both assignedid values to channel drivers.
Definition channel.h:606
Structure that contains information regarding a channel in a bridge.
struct ast_channel * chan
Structure that contains features information.
Structure that contains information about a bridge.
Definition bridge.h:353
Responsible for call detail data.
Definition cdr.h:281
Structure representing a snapshot of channel state.
Structure to describe a channel "technology", ie a channel driver See for examples:
Definition channel.h:648
Main Channel structure associated with a channel.
struct ast_channel_id uniqueid
char exten[AST_MAX_EXTENSION]
const char * data
const struct ast_channel_tech * tech
struct ast_endpoint * endpoint
struct ast_channel_id linkedid
enum ast_channel_state state
char context[AST_MAX_CONTEXT]
struct ast_party_caller caller
Channel Caller ID information.
This structure is allocated by file.c in one chunk, together with buf_size and desc_size bytes of mem...
Definition mod_format.h:101
Structure used to handle boolean flags.
Definition utils.h:220
Format capabilities structure, holds formats + preference order + etc.
Definition format_cap.c:54
Definition of a media format.
Definition format.c:43
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
union ast_frame::@235 data
channel group info
Definition channel.h:2975
struct ast_group_info::@219 group_list
char * category
Definition channel.h:2977
struct ast_channel * chan
Definition channel.h:2976
General jitterbuffer state.
Structure used to transport a message through the frame core.
Caller Party information.
Definition channel.h:420
Connected Line/Party information.
Definition channel.h:458
Dialed/Called Party information.
Definition channel.h:380
Information needed to identify an endpoint in a call.
Definition channel.h:340
Information needed to specify a name in a call.
Definition channel.h:264
Information needed to specify a number in a call.
Definition channel.h:291
Redirecting reason information.
Definition channel.h:503
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition channel.h:524
Information needed to specify a subaddress in a call.
Definition channel.h:309
Definition pbx.h:216
Indicate what information in ast_party_caller should be set.
Definition channel.h:442
Indicate what information in ast_party_connected_line should be set.
Definition channel.h:491
Indicate what information in ast_party_id should be set.
Definition channel.h:363
Indicate what information in ast_party_redirecting should be set.
Definition channel.h:557
Support for dynamic strings.
Definition strings.h:623
A set of tones for a given locale.
Definition indications.h:74
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition translate.h:213
Structure for variables, used for configurations and for channel variables.
Definition file.c:70
int value
Definition syslog.c:37
static struct test_val b
static struct test_val a
static struct test_val c

◆ ast_channel_alloc_with_endpoint

#define ast_channel_alloc_with_endpoint (   needqueue,
  state,
  cid_num,
  cid_name,
  acctcode,
  exten,
  context,
  assignedids,
  requestor,
  amaflag,
  endpoint,
  ... 
)
Value:
__ast_channel_alloc((needqueue), (state), (cid_num), (cid_name), (acctcode), (exten), (context), (assignedids), (requestor), (amaflag), (endpoint), \
__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)

Definition at line 1303 of file channel.h.

◆ ast_channel_alloc_with_initializers

#define ast_channel_alloc_with_initializers (   needqueue,
  state,
  cid_num,
  cid_name,
  acctcode,
  exten,
  context,
  assignedids,
  requestor,
  amaflag,
  endpoint,
  initializers,
  ... 
)
Value:
__ast_channel_alloc_with_initializers((needqueue), (state), (cid_num), (cid_name), (acctcode), (exten), (context), (assignedids), (requestor), (amaflag), (endpoint), \
(initializers), __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
struct ast_channel * __ast_channel_alloc_with_initializers(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt,...)
Create a channel structure.
Definition channel.c:986

Definition at line 1307 of file channel.h.

◆ ast_channel_cleanup

#define ast_channel_cleanup (   c)    ({ ao2_cleanup(c); (struct ast_channel *) (NULL); })

Cleanup a channel reference.

Parameters
cthe channel (NULL tolerant)
Return values
NULLalways
Since
12.0.0

Definition at line 3029 of file channel.h.

◆ ast_channel_has_tech_function

#define ast_channel_has_tech_function (   chan,
  function 
)     (ast_channel_tech(chan) ? ast_channel_tech(chan)->function != NULL : 0)

Checks if a channel's technology implements a particular callback function.

Since
18.0.0
Parameters
chanThe channel
functionThe function to look for
Return values
1if the channel has a technology set and it implements the function
0if the channel doesn't have a technology set or it doesn't implement the function

Definition at line 5066 of file channel.h.

5067 : 0)

◆ AST_CHANNEL_INITIALIZERS_VERSION

#define AST_CHANNEL_INITIALIZERS_VERSION   1

struct ABI version

Note
This must be incremented when the struct changes.

Definition at line 620 of file channel.h.

◆ ast_channel_lock

#define ast_channel_lock (   chan)    ao2_lock(chan)

Definition at line 2982 of file channel.h.

◆ ast_channel_lock_both

#define ast_channel_lock_both (   chan1,
  chan2 
)

Lock two channels.

Definition at line 2989 of file channel.h.

2989 { \
2990 ast_channel_lock(chan1); \
2991 while (ast_channel_trylock(chan2)) { \
2992 ast_channel_unlock(chan1); \
2993 sched_yield(); \
2994 ast_channel_lock(chan1); \
2995 } \
2996 } while (0)
#define ast_channel_trylock(chan)
Definition channel.h:2984

◆ AST_CHANNEL_NAME

#define AST_CHANNEL_NAME   80

Max length of an ast_channel name

Definition at line 173 of file channel.h.

◆ ast_channel_ref

#define ast_channel_ref (   c)    ({ ao2_ref(c, +1); (c); })

Increase channel reference count.

Parameters
cthe channel
Return values
calways
Since
1.8

Definition at line 3007 of file channel.h.

◆ ast_channel_trylock

#define ast_channel_trylock (   chan)    ao2_trylock(chan)

Definition at line 2984 of file channel.h.

◆ ast_channel_unlock

#define ast_channel_unlock (   chan)    ao2_unlock(chan)

Definition at line 2983 of file channel.h.

◆ ast_channel_unref

#define ast_channel_unref (   c)    ({ ao2_ref(c, -1); (struct ast_channel *) (NULL); })

Decrease channel reference count.

Parameters
cthe channel
Return values
NULLalways
Since
1.8

Definition at line 3018 of file channel.h.

◆ ast_dummy_channel_alloc

#define ast_dummy_channel_alloc ( )    __ast_dummy_channel_alloc(__FILE__, __LINE__, __PRETTY_FUNCTION__)

Create a fake channel structure.

Return values
NULLfailure
non-NULLsuccessfully allocated channel
Note
This function should ONLY be used to create a fake channel that can then be populated with data for use in variable substitution when a real channel does not exist.
The created dummy channel should be destroyed by ast_channel_unref(). Using ast_channel_release() needlessly grabs the channel container lock and can cause a deadlock as a result. Also grabbing the channel container lock reduces system performance.

Definition at line 1328 of file channel.h.

◆ AST_EXTENDED_FDS

#define AST_EXTENDED_FDS   12

the start of extended file descriptor positions

Definition at line 197 of file channel.h.

◆ AST_FEATURE_DTMF_MASK

#define AST_FEATURE_DTMF_MASK
Value:
@ AST_FEATURE_AUTOMIXMON
Definition channel.h:1089
@ AST_FEATURE_REDIRECT
Definition channel.h:1084
@ AST_FEATURE_ATXFER
Definition channel.h:1086
@ AST_FEATURE_PARKCALL
Definition channel.h:1088
@ AST_FEATURE_AUTOMON
Definition channel.h:1087
@ AST_FEATURE_DISCONNECT
Definition channel.h:1085

Definition at line 1092 of file channel.h.

◆ AST_GENERATOR_FD

#define AST_GENERATOR_FD   (AST_MAX_FDS-4)

unused - formerly used by generator

Definition at line 205 of file channel.h.

◆ AST_JITTERBUFFER_FD

#define AST_JITTERBUFFER_FD   (AST_MAX_FDS-5)

used by generator

Definition at line 206 of file channel.h.

◆ AST_MAX_ACCOUNT_CODE

#define AST_MAX_ACCOUNT_CODE   80

Max length of an account code

Definition at line 172 of file channel.h.

◆ AST_MAX_CONTEXT

#define AST_MAX_CONTEXT   80

Max length of a context

Definition at line 135 of file channel.h.

◆ AST_MAX_EXTENSION

#define AST_MAX_EXTENSION   80

Max length of an extension

Definition at line 134 of file channel.h.

◆ AST_MAX_FDS

#define AST_MAX_FDS   11

original maximum number of file descriptors

Definition at line 196 of file channel.h.

◆ AST_MAX_PUBLIC_UNIQUEID

#define AST_MAX_PUBLIC_UNIQUEID   149

Max length of a channel uniqueid reported to the outside world.

149 = 127 (max systemname) + "-" + 10 (epoch timestamp)

  • "." + 10 (monotonically incrementing integer).
Note
If this value is ever changed, MAX_CHANNEL_ID should be updated in rtp_engine.h.

Definition at line 147 of file channel.h.

◆ AST_MAX_TENANT_ID

#define AST_MAX_TENANT_ID   64

Max length of a channel tenant_id

Definition at line 149 of file channel.h.

◆ AST_MAX_UNIQUEID

#define AST_MAX_UNIQUEID   (AST_MAX_PUBLIC_UNIQUEID + 2 + 1)

Maximum size of an internal Asterisk channel unique ID.

Add two for the Local;2 channel to append a ';2' if needed plus nul terminator.

Note
If this value is ever changed, MAX_CHANNEL_ID should be updated in rtp_engine.h.

Definition at line 170 of file channel.h.

◆ AST_MAX_USER_FIELD

#define AST_MAX_USER_FIELD   256

Max length of the channel user field

Definition at line 176 of file channel.h.

◆ AST_MUTE_DIRECTION_READ

#define AST_MUTE_DIRECTION_READ   (1 << 0)

Definition at line 4830 of file channel.h.

◆ AST_MUTE_DIRECTION_WRITE

#define AST_MUTE_DIRECTION_WRITE   (1 << 1)

Definition at line 4831 of file channel.h.

◆ AST_NUM_CHANNEL_BUCKETS

#define AST_NUM_CHANNEL_BUCKETS   1567

The number of buckets to store channels or channel information

Definition at line 157 of file channel.h.

◆ AST_TIMING_FD

#define AST_TIMING_FD   (AST_MAX_FDS-2)

used for timingfd

Definition at line 203 of file channel.h.

◆ CHECK_BLOCKING

#define CHECK_BLOCKING (   c)

Set the blocking indication on the channel.

Indicate that the thread handling the channel is about to do a blocking operation to wait for media on the channel. (poll, read, or write)

Masquerading and ast_queue_frame() use this indication to wake up the thread.

Precondition
The channel needs to be locked

Definition at line 2931 of file channel.h.

2932 { \
2934 /* This should not happen as there should only be one thread handling a channel's media at a time. */ \
2935 ast_log(LOG_DEBUG, "Thread LWP %d is blocking '%s', already blocked by thread LWP %d in procedure %s\n", \
2938 ast_assert(0); \
2939 } \
2940 ast_channel_blocker_tid_set((c), ast_get_tid()); \
2941 ast_channel_blocker_set((c), pthread_self()); \
2942 ast_channel_blockproc_set((c), __PRETTY_FUNCTION__); \
2943 ast_set_flag(ast_channel_flags(c), AST_FLAG_BLOCKING); \
2944 } while (0)
@ AST_FLAG_BLOCKING
Definition channel.h:1005
#define LOG_DEBUG
#define ast_test_flag(p, flag)
Definition utils.h:64
int ast_get_tid(void)
Get current thread ID.
Definition utils.c:2786

◆ DATASTORE_INHERIT_FOREVER

#define DATASTORE_INHERIT_FOREVER   INT_MAX

Definition at line 194 of file channel.h.

◆ DEBUGCHAN_FLAG

#define DEBUGCHAN_FLAG   0x80000000

The high bit of the frame count is used as a debug marker, so increments of the counters must be done with care. Please use c->fin = FRAMECOUNT_INC(c->fin) and the same for c->fout.

Definition at line 877 of file channel.h.

◆ DECLARE_STRINGFIELD_SETTERS_FOR

#define DECLARE_STRINGFIELD_SETTERS_FOR (   field)
Value:
void ast_channel_##field##_set(struct ast_channel *chan, const char *field); \
void ast_channel_##field##_build_va(struct ast_channel *chan, const char *fmt, va_list ap) __attribute__((format(printf, 2, 0))); \
void ast_channel_##field##_build(struct ast_channel *chan, const char *fmt, ...) __attribute__((format(printf, 2, 3)))

Definition at line 4130 of file channel.h.

◆ FRAMECOUNT_INC

#define FRAMECOUNT_INC (   x)    ( ((x) & DEBUGCHAN_FLAG) | (((x)+1) & ~DEBUGCHAN_FLAG) )

Definition at line 880 of file channel.h.

◆ MAX_LANGUAGE

#define MAX_LANGUAGE   40

Max length of the language setting

Definition at line 174 of file channel.h.

◆ MAX_MUSICCLASS

#define MAX_MUSICCLASS   80

Max length of the music class setting

Definition at line 175 of file channel.h.

Typedef Documentation

◆ ast_acf_read2_fn_t

typedef int(* ast_acf_read2_fn_t) (struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)

Typedef for a custom read2 function.

Note
data should be treated as const char *.

Definition at line 582 of file channel.h.

◆ ast_acf_read_fn_t

typedef int(* ast_acf_read_fn_t) (struct ast_channel *chan, const char *function, char *data, char *buf, size_t len)

Typedef for a custom read function.

Note
data should be treated as const char *.

Definition at line 576 of file channel.h.

◆ ast_acf_write_fn_t

typedef int(* ast_acf_write_fn_t) (struct ast_channel *chan, const char *function, char *data, const char *value)

Typedef for a custom write function.

Note
data should be treated as const char *.

Definition at line 588 of file channel.h.

◆ ast_group_t

typedef unsigned long long ast_group_t

Definition at line 215 of file channel.h.

◆ ast_timing_func_t

typedef int(* ast_timing_func_t) (const void *data)

Definition at line 919 of file channel.h.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

ast_channel_tech Properties

Enumerator
AST_CHAN_TP_WANTSJITTER 

Channels have this property if they can accept input with jitter; i.e. most VoIP channels.

AST_CHAN_TP_CREATESJITTER 

Channels have this property if they can create jitter; i.e. most VoIP channels.

AST_CHAN_TP_INTERNAL 

Channels with this particular technology are an implementation detail of Asterisk and should generally not be exposed or manipulated by the outside world.

AST_CHAN_TP_SEND_TEXT_DATA 

Channels have this property if they implement send_text_data.

Definition at line 975 of file channel.h.

975 {
976 /*!
977 * \brief Channels have this property if they can accept input with jitter;
978 * i.e. most VoIP channels
979 */
980 AST_CHAN_TP_WANTSJITTER = (1 << 0),
981 /*!
982 * \brief Channels have this property if they can create jitter;
983 * i.e. most VoIP channels
984 */
985 AST_CHAN_TP_CREATESJITTER = (1 << 1),
986 /*!
987 * \brief Channels with this particular technology are an implementation detail of
988 * Asterisk and should generally not be exposed or manipulated by the outside
989 * world
990 */
991 AST_CHAN_TP_INTERNAL = (1 << 2),
992 /*!
993 * \brief Channels have this property if they implement send_text_data
994 */
996};
@ AST_CHAN_TP_INTERNAL
Channels with this particular technology are an implementation detail of Asterisk and should generall...
Definition channel.h:991
@ AST_CHAN_TP_SEND_TEXT_DATA
Channels have this property if they implement send_text_data.
Definition channel.h:995
@ AST_CHAN_TP_WANTSJITTER
Channels have this property if they can accept input with jitter; i.e. most VoIP channels.
Definition channel.h:980
@ AST_CHAN_TP_CREATESJITTER
Channels have this property if they can create jitter; i.e. most VoIP channels.
Definition channel.h:985

◆ anonymous enum

anonymous enum

ast_channel flags

Enumerator
AST_FLAG_DEFER_DTMF 

Queue incoming DTMF, to be released when this flag is turned off

AST_FLAG_WRITE_INT 

write should be interrupt generator

AST_FLAG_BLOCKING 

a thread is blocking on this channel

AST_FLAG_ZOMBIE 

This is a zombie channel

AST_FLAG_EXCEPTION 

There is an exception pending

AST_FLAG_MOH 

Listening to moh XXX anthm promises me this will disappear XXX

AST_FLAG_SPYING 

This channel is spying on another channel

AST_FLAG_IN_AUTOLOOP 

the channel is in an auto-incrementing dialplan processor, so when ->priority is set, it will get incremented before finding the next priority to run

AST_FLAG_OUTGOING 

This is an outgoing call

AST_FLAG_IN_DTMF 

A DTMF_BEGIN frame has been read from this channel, but not yet an END

AST_FLAG_EMULATE_DTMF 

A DTMF_END was received when not IN_DTMF, so the length of the digit is currently being emulated

AST_FLAG_END_DTMF_ONLY 

This is set to tell the channel not to generate DTMF begin frames, and to instead only generate END frames.

AST_FLAG_MASQ_NOSTREAM 

This flag indicates that on a masquerade, an active stream should not be carried over

AST_FLAG_BRIDGE_HANGUP_RUN 

This flag indicates that the hangup exten was run when the bridge terminated, a message aimed at preventing a subsequent hangup exten being run at the pbx_run level

AST_FLAG_DISABLE_WORKAROUNDS 

Disable certain workarounds. This reintroduces certain bugs, but allows some non-traditional dialplans (like AGI) to continue to function.

AST_FLAG_DISABLE_DEVSTATE_CACHE 

Disable device state event caching. This allows channel drivers to selectively prevent device state events from being cached by certain channels such as anonymous calls which have no persistent represenatation that can be tracked.

AST_FLAG_BRIDGE_DUAL_REDIRECT_WAIT 

This flag indicates that a dual channel redirect is in progress. The bridge needs to wait until the flag is cleared to continue.

AST_FLAG_ORIGINATED 

This flag indicates that the channel was originated.

AST_FLAG_DEAD 

The channel is well and truly dead. Once this is set and published, no further actions should be taken upon the channel, and no further publications should occur.

AST_FLAG_SNAPSHOT_STAGE 

Channel snapshot should not be published, it is being staged for an explicit publish.

AST_FLAG_TIMINGDATA_IS_AO2_OBJ 

The data on chan->timingdata is an astobj2 object.

AST_FLAG_SUBROUTINE_EXEC 

The channel is executing a subroutine or macro

Definition at line 999 of file channel.h.

999 {
1000 /*! Queue incoming DTMF, to be released when this flag is turned off */
1001 AST_FLAG_DEFER_DTMF = (1 << 1),
1002 /*! write should be interrupt generator */
1003 AST_FLAG_WRITE_INT = (1 << 2),
1004 /*! a thread is blocking on this channel */
1005 AST_FLAG_BLOCKING = (1 << 3),
1006 /*! This is a zombie channel */
1007 AST_FLAG_ZOMBIE = (1 << 4),
1008 /*! There is an exception pending */
1009 AST_FLAG_EXCEPTION = (1 << 5),
1010 /*! Listening to moh XXX anthm promises me this will disappear XXX */
1011 AST_FLAG_MOH = (1 << 6),
1012 /*! This channel is spying on another channel */
1013 AST_FLAG_SPYING = (1 << 7),
1014 /*! the channel is in an auto-incrementing dialplan processor,
1015 * so when ->priority is set, it will get incremented before
1016 * finding the next priority to run */
1017 AST_FLAG_IN_AUTOLOOP = (1 << 9),
1018 /*! This is an outgoing call */
1019 AST_FLAG_OUTGOING = (1 << 10),
1020 /*! A DTMF_BEGIN frame has been read from this channel, but not yet an END */
1021 AST_FLAG_IN_DTMF = (1 << 12),
1022 /*! A DTMF_END was received when not IN_DTMF, so the length of the digit is
1023 * currently being emulated */
1024 AST_FLAG_EMULATE_DTMF = (1 << 13),
1025 /*! This is set to tell the channel not to generate DTMF begin frames, and
1026 * to instead only generate END frames. */
1027 AST_FLAG_END_DTMF_ONLY = (1 << 14),
1028 /* OBSOLETED in favor of AST_CAUSE_ANSWERED_ELSEWHERE
1029 * Flag to show channels that this call is hangup due to the fact that the call
1030 * was indeed answered, but in another channel */
1031 /* AST_FLAG_ANSWERED_ELSEWHERE = (1 << 15), */
1032 /*! This flag indicates that on a masquerade, an active stream should not
1033 * be carried over */
1034 AST_FLAG_MASQ_NOSTREAM = (1 << 16),
1035 /*! This flag indicates that the hangup exten was run when the bridge terminated,
1036 * a message aimed at preventing a subsequent hangup exten being run at the pbx_run
1037 * level */
1038 AST_FLAG_BRIDGE_HANGUP_RUN = (1 << 17),
1039 /*! Disable certain workarounds. This reintroduces certain bugs, but allows
1040 * some non-traditional dialplans (like AGI) to continue to function.
1041 */
1042 AST_FLAG_DISABLE_WORKAROUNDS = (1 << 20),
1043 /*!
1044 * Disable device state event caching. This allows channel
1045 * drivers to selectively prevent device state events from being
1046 * cached by certain channels such as anonymous calls which have
1047 * no persistent represenatation that can be tracked.
1048 */
1050 /*!
1051 * This flag indicates that a dual channel redirect is in
1052 * progress. The bridge needs to wait until the flag is cleared
1053 * to continue.
1054 */
1056 /*!
1057 * This flag indicates that the channel was originated.
1058 */
1059 AST_FLAG_ORIGINATED = (1 << 23),
1060 /*!
1061 * The channel is well and truly dead. Once this is set and published, no further
1062 * actions should be taken upon the channel, and no further publications should
1063 * occur.
1064 */
1065 AST_FLAG_DEAD = (1 << 24),
1066 /*!
1067 * Channel snapshot should not be published, it is being staged for an explicit
1068 * publish.
1069 */
1070 AST_FLAG_SNAPSHOT_STAGE = (1 << 25),
1071 /*!
1072 * The data on chan->timingdata is an astobj2 object.
1073 */
1075 /*!
1076 * The channel is executing a subroutine or macro
1077 */
1078 AST_FLAG_SUBROUTINE_EXEC = (1 << 27),
1079};
@ AST_FLAG_BRIDGE_DUAL_REDIRECT_WAIT
Definition channel.h:1055
@ AST_FLAG_ZOMBIE
Definition channel.h:1007
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
Definition channel.h:1049
@ AST_FLAG_SNAPSHOT_STAGE
Definition channel.h:1070
@ AST_FLAG_OUTGOING
Definition channel.h:1019
@ AST_FLAG_BRIDGE_HANGUP_RUN
Definition channel.h:1038
@ AST_FLAG_MASQ_NOSTREAM
Definition channel.h:1034
@ AST_FLAG_IN_AUTOLOOP
Definition channel.h:1017
@ AST_FLAG_END_DTMF_ONLY
Definition channel.h:1027
@ AST_FLAG_DEAD
Definition channel.h:1065
@ AST_FLAG_EXCEPTION
Definition channel.h:1009
@ AST_FLAG_EMULATE_DTMF
Definition channel.h:1024
@ AST_FLAG_IN_DTMF
Definition channel.h:1021
@ AST_FLAG_WRITE_INT
Definition channel.h:1003
@ AST_FLAG_DEFER_DTMF
Definition channel.h:1001
@ AST_FLAG_SPYING
Definition channel.h:1013
@ AST_FLAG_DISABLE_WORKAROUNDS
Definition channel.h:1042
@ AST_FLAG_SUBROUTINE_EXEC
Definition channel.h:1078
@ AST_FLAG_ORIGINATED
Definition channel.h:1059
@ AST_FLAG_TIMINGDATA_IS_AO2_OBJ
Definition channel.h:1074
@ AST_FLAG_MOH
Definition channel.h:1011

◆ anonymous enum

anonymous enum

ast_bridge_config flags

Enumerator
AST_FEATURE_PLAY_WARNING 
AST_FEATURE_REDIRECT 
AST_FEATURE_DISCONNECT 
AST_FEATURE_ATXFER 
AST_FEATURE_AUTOMON 
AST_FEATURE_PARKCALL 
AST_FEATURE_AUTOMIXMON 

Definition at line 1082 of file channel.h.

1082 {
1083 AST_FEATURE_PLAY_WARNING = (1 << 0),
1084 AST_FEATURE_REDIRECT = (1 << 1),
1085 AST_FEATURE_DISCONNECT = (1 << 2),
1086 AST_FEATURE_ATXFER = (1 << 3),
1087 AST_FEATURE_AUTOMON = (1 << 4),
1088 AST_FEATURE_PARKCALL = (1 << 5),
1089 AST_FEATURE_AUTOMIXMON = (1 << 6),
1090};
@ AST_FEATURE_PLAY_WARNING
Definition channel.h:1083

◆ anonymous enum

anonymous enum
Enumerator
AST_SOFTHANGUP_DEV 

Soft hangup requested by device or other internal reason. Actual hangup needed.

AST_SOFTHANGUP_ASYNCGOTO 

Used to break the normal frame flow so an async goto can be done instead of actually hanging up.

AST_SOFTHANGUP_SHUTDOWN 

Soft hangup requested by system shutdown. Actual hangup needed.

AST_SOFTHANGUP_TIMEOUT 

Used to break the normal frame flow after a timeout so an implicit async goto can be done to the 'T' exten if it exists instead of actually hanging up. If the exten does not exist then actually hangup.

AST_SOFTHANGUP_APPUNLOAD 

Soft hangup requested by application/channel-driver being unloaded. Actual hangup needed.

AST_SOFTHANGUP_EXPLICIT 

Soft hangup requested by non-associated party. Actual hangup needed.

AST_SOFTHANGUP_HANGUP_EXEC 

Used to indicate that the channel is currently executing hangup logic in the dialplan. The channel has been hungup when this is set.

AST_SOFTHANGUP_ALL 

All softhangup flags.

This can be used as an argument to ast_channel_clear_softhangup() to clear all softhangup flags from a channel.

Definition at line 1136 of file channel.h.

1136 {
1137 /*!
1138 * Soft hangup requested by device or other internal reason.
1139 * Actual hangup needed.
1140 */
1141 AST_SOFTHANGUP_DEV = (1 << 0),
1142 /*!
1143 * Used to break the normal frame flow so an async goto can be
1144 * done instead of actually hanging up.
1145 */
1146 AST_SOFTHANGUP_ASYNCGOTO = (1 << 1),
1147 /*!
1148 * Soft hangup requested by system shutdown. Actual hangup
1149 * needed.
1150 */
1151 AST_SOFTHANGUP_SHUTDOWN = (1 << 2),
1152 /*!
1153 * Used to break the normal frame flow after a timeout so an
1154 * implicit async goto can be done to the 'T' exten if it exists
1155 * instead of actually hanging up. If the exten does not exist
1156 * then actually hangup.
1157 */
1158 AST_SOFTHANGUP_TIMEOUT = (1 << 3),
1159 /*!
1160 * Soft hangup requested by application/channel-driver being
1161 * unloaded. Actual hangup needed.
1162 */
1163 AST_SOFTHANGUP_APPUNLOAD = (1 << 4),
1164 /*!
1165 * Soft hangup requested by non-associated party. Actual hangup
1166 * needed.
1167 */
1168 AST_SOFTHANGUP_EXPLICIT = (1 << 5),
1169 /*!
1170 * Used to indicate that the channel is currently executing hangup
1171 * logic in the dialplan. The channel has been hungup when this is
1172 * set.
1173 */
1174 AST_SOFTHANGUP_HANGUP_EXEC = (1 << 7),
1175 /*!
1176 * \brief All softhangup flags.
1177 *
1178 * This can be used as an argument to ast_channel_clear_softhangup()
1179 * to clear all softhangup flags from a channel.
1180 */
1181 AST_SOFTHANGUP_ALL = (0xFFFFFFFF)
1182};
@ AST_SOFTHANGUP_ASYNCGOTO
Definition channel.h:1146
@ AST_SOFTHANGUP_EXPLICIT
Definition channel.h:1168
@ AST_SOFTHANGUP_DEV
Definition channel.h:1141
@ AST_SOFTHANGUP_HANGUP_EXEC
Definition channel.h:1174
@ AST_SOFTHANGUP_ALL
All softhangup flags.
Definition channel.h:1181
@ AST_SOFTHANGUP_TIMEOUT
Definition channel.h:1158
@ AST_SOFTHANGUP_SHUTDOWN
Definition channel.h:1151
@ AST_SOFTHANGUP_APPUNLOAD
Definition channel.h:1163

◆ ama_flags

enum ama_flags

Channel AMA Flags.

Enumerator
AST_AMA_NONE 
AST_AMA_OMIT 
AST_AMA_BILLING 
AST_AMA_DOCUMENTATION 

Definition at line 1197 of file channel.h.

1197 {
1198 AST_AMA_NONE = 0,
1202};
@ AST_AMA_DOCUMENTATION
Definition channel.h:1201
@ AST_AMA_OMIT
Definition channel.h:1199
@ AST_AMA_NONE
Definition channel.h:1198
@ AST_AMA_BILLING
Definition channel.h:1200

◆ ast_bridge_result

Enumerator
AST_BRIDGE_COMPLETE 
AST_BRIDGE_FAILED 
AST_BRIDGE_FAILED_NOWARN 
AST_BRIDGE_RETRY 

Definition at line 208 of file channel.h.

208 {
212 AST_BRIDGE_RETRY = -3,
213};
@ AST_BRIDGE_FAILED_NOWARN
Definition channel.h:211
@ AST_BRIDGE_RETRY
Definition channel.h:212
@ AST_BRIDGE_COMPLETE
Definition channel.h:209
@ AST_BRIDGE_FAILED
Definition channel.h:210

◆ ast_channel_adsicpe

Enumerator
AST_ADSI_UNKNOWN 
AST_ADSI_AVAILABLE 
AST_ADSI_UNAVAILABLE 
AST_ADSI_OFFHOOKONLY 

Definition at line 888 of file channel.h.

888 {
893};
@ AST_ADSI_UNKNOWN
Definition channel.h:889
@ AST_ADSI_UNAVAILABLE
Definition channel.h:891
@ AST_ADSI_AVAILABLE
Definition channel.h:890
@ AST_ADSI_OFFHOOKONLY
Definition channel.h:892

◆ ast_channel_error

Enumerator
AST_CHANNEL_ERROR_UNKNOWN 
AST_CHANNEL_ERROR_ID_EXISTS 

Definition at line 4911 of file channel.h.

4911 {
4912 /* Unable to determine what error occurred. */
4914 /* Channel with this ID already exists */
4916};

◆ ast_channel_requestor_relationship

Enumerator
AST_CHANNEL_REQUESTOR_BRIDGE_PEER 

The requestor is the future bridge peer of the channel.

AST_CHANNEL_REQUESTOR_REPLACEMENT 

The requestor is to be replaced by the channel.

Definition at line 1523 of file channel.h.

1523 {
1524 /*! The requestor is the future bridge peer of the channel. */
1526 /*! The requestor is to be replaced by the channel. */
1528};

◆ AST_MONITORING_STATE

Enumerator
AST_MONITOR_RUNNING 
AST_MONITOR_PAUSED 

Definition at line 4123 of file channel.h.

4123 {
4126};

◆ AST_PARTY_CHAR_SET

Party name character set enumeration values (values from Q.SIG)

Enumerator
AST_PARTY_CHAR_SET_UNKNOWN 
AST_PARTY_CHAR_SET_ISO8859_1 
AST_PARTY_CHAR_SET_WITHDRAWN 
AST_PARTY_CHAR_SET_ISO8859_2 
AST_PARTY_CHAR_SET_ISO8859_3 
AST_PARTY_CHAR_SET_ISO8859_4 
AST_PARTY_CHAR_SET_ISO8859_5 
AST_PARTY_CHAR_SET_ISO8859_7 
AST_PARTY_CHAR_SET_ISO10646_BMPSTRING 
AST_PARTY_CHAR_SET_ISO10646_UTF_8STRING 

Definition at line 244 of file channel.h.

244 {
247 AST_PARTY_CHAR_SET_WITHDRAWN = 2,/* ITU withdrew this enum value. */
255};
@ AST_PARTY_CHAR_SET_UNKNOWN
Definition channel.h:245
@ AST_PARTY_CHAR_SET_ISO8859_4
Definition channel.h:250
@ AST_PARTY_CHAR_SET_WITHDRAWN
Definition channel.h:247
@ AST_PARTY_CHAR_SET_ISO8859_5
Definition channel.h:251
@ AST_PARTY_CHAR_SET_ISO8859_7
Definition channel.h:252
@ AST_PARTY_CHAR_SET_ISO8859_2
Definition channel.h:248
@ AST_PARTY_CHAR_SET_ISO8859_1
Definition channel.h:246
@ AST_PARTY_CHAR_SET_ISO10646_UTF_8STRING
Definition channel.h:254
@ AST_PARTY_CHAR_SET_ISO10646_BMPSTRING
Definition channel.h:253
@ AST_PARTY_CHAR_SET_ISO8859_3
Definition channel.h:249

◆ ast_t38_state

Possible T38 states on channels.

Enumerator
T38_STATE_UNAVAILABLE 

T38 is unavailable on this channel or disabled by configuration

T38_STATE_UNKNOWN 

The channel supports T38 but the current status is unknown

T38_STATE_NEGOTIATING 

T38 is being negotiated

T38_STATE_REJECTED 

Remote side has rejected our offer

T38_STATE_NEGOTIATED 

T38 established

Definition at line 898 of file channel.h.

898 {
899 T38_STATE_UNAVAILABLE, /*!< T38 is unavailable on this channel or disabled by configuration */
900 T38_STATE_UNKNOWN, /*!< The channel supports T38 but the current status is unknown */
901 T38_STATE_NEGOTIATING, /*!< T38 is being negotiated */
902 T38_STATE_REJECTED, /*!< Remote side has rejected our offer */
903 T38_STATE_NEGOTIATED, /*!< T38 established */
904};
@ T38_STATE_UNKNOWN
Definition channel.h:900
@ T38_STATE_REJECTED
Definition channel.h:902
@ T38_STATE_NEGOTIATED
Definition channel.h:903
@ T38_STATE_NEGOTIATING
Definition channel.h:901

◆ channelreloadreason

Channel reload reasons for manager events at load or reload of configuration.

Enumerator
CHANNEL_MODULE_LOAD 
CHANNEL_MODULE_RELOAD 
CHANNEL_CLI_RELOAD 
CHANNEL_MANAGER_RELOAD 
CHANNEL_ACL_RELOAD 

Definition at line 1186 of file channel.h.

1186 {
1192};
@ CHANNEL_CLI_RELOAD
Definition channel.h:1189
@ CHANNEL_MODULE_RELOAD
Definition channel.h:1188
@ CHANNEL_MODULE_LOAD
Definition channel.h:1187
@ CHANNEL_ACL_RELOAD
Definition channel.h:1191
@ CHANNEL_MANAGER_RELOAD
Definition channel.h:1190

Function Documentation

◆ __ast_answer()

int __ast_answer ( struct ast_channel chan,
unsigned int  delay 
)

Answer a channel, with a selectable delay before returning.

Parameters
chanchannel to answer
delaymaximum amount of time to wait for incoming media

This function answers a channel and handles all necessary call setup functions.

Note
The channel passed does not need to be locked, but is locked by the function when needed.
This function will wait up to 'delay' milliseconds for media to arrive on the channel before returning to the caller, so that the caller can properly assume the channel is 'ready' for media flow. If 'delay' is less than 500, the function will wait up to 500 milliseconds.
Return values
0on success
non-zeroon failure

Definition at line 2707 of file channel.c.

2708{
2709 int res = 0;
2710 enum ast_channel_state old_state;
2711 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2712
2713 old_state = ast_channel_state(chan);
2714 if ((res = ast_raw_answer(chan))) {
2715 return res;
2716 }
2717
2718 switch (old_state) {
2719 case AST_STATE_RINGING:
2720 case AST_STATE_RING:
2721 /* wait for media to start flowing, but don't wait any longer
2722 * than 'delay' or 500 milliseconds, whichever is longer
2723 */
2724 do {
2726 struct ast_frame *cur;
2727 struct ast_frame *new_frame;
2728 int timeout_ms = MAX(delay, 500);
2729 unsigned int done = 0;
2730 struct timeval start;
2731
2733
2734 start = ast_tvnow();
2735 for (;;) {
2736 int ms = ast_remaining_ms(start, timeout_ms);
2737 ms = ast_waitfor(chan, ms);
2738 if (ms < 0) {
2739 ast_log(LOG_WARNING, "Error condition occurred when polling channel %s for a voice frame: %s\n", ast_channel_name(chan), strerror(errno));
2740 res = -1;
2741 break;
2742 }
2743 if (ms == 0) {
2744 ast_debug(2, "Didn't receive a media frame from %s within %u ms of answering. Continuing anyway\n", ast_channel_name(chan), MAX(delay, 500));
2745 break;
2746 }
2747 cur = ast_read(chan);
2748 if (!cur || ((cur->frametype == AST_FRAME_CONTROL) &&
2749 (cur->subclass.integer == AST_CONTROL_HANGUP))) {
2750 if (cur) {
2751 ast_frfree(cur);
2752 }
2753 res = -1;
2754 ast_debug(2, "Hangup of channel %s detected in answer routine\n", ast_channel_name(chan));
2755 break;
2756 }
2757
2758 if ((new_frame = ast_frisolate(cur)) != cur) {
2759 ast_frfree(cur);
2760 }
2761
2763
2764 /* if a specific delay period was requested, continue
2765 * until that delay has passed. don't stop just because
2766 * incoming media has arrived.
2767 */
2768 if (delay) {
2769 continue;
2770 }
2771
2772 switch (new_frame->frametype) {
2773 /* all of these frametypes qualify as 'media' */
2774 case AST_FRAME_VOICE:
2775 case AST_FRAME_VIDEO:
2776 case AST_FRAME_TEXT:
2779 case AST_FRAME_DTMF_END:
2780 case AST_FRAME_IMAGE:
2781 case AST_FRAME_HTML:
2782 case AST_FRAME_MODEM:
2783 case AST_FRAME_RTCP:
2784 done = 1;
2785 break;
2786 case AST_FRAME_CONTROL:
2787 case AST_FRAME_IAX:
2790 case AST_FRAME_NULL:
2791 case AST_FRAME_CNG:
2792 break;
2793 }
2794
2795 if (done) {
2796 break;
2797 }
2798 }
2799
2800 ast_channel_lock(chan);
2801 while ((cur = AST_LIST_REMOVE_HEAD(&frames, frame_list))) {
2802 if (res == 0) {
2803 ast_queue_frame_head(chan, cur);
2804 }
2805 ast_frfree(cur);
2806 }
2807 ast_channel_unlock(chan);
2808 } while (0);
2809 break;
2810 default:
2811 break;
2812 }
2813
2814 return res;
2815}
#define ast_log
Definition astobj2.c:42
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition channel.c:4290
int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to the head of a channel's frame queue.
Definition channel.c:1176
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition channel.c:3178
int ast_raw_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2702
#define ast_channel_lock(chan)
Definition channel.h:2982
#define ast_channel_unlock(chan)
Definition channel.h:2983
@ AST_STATE_RING
@ AST_STATE_RINGING
#define SCOPE_TRACE(__level,...)
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
#define ast_frfree(fr)
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_BRIDGE_ACTION_SYNC
@ AST_FRAME_TEXT_DATA
@ AST_FRAME_CONTROL
@ AST_FRAME_BRIDGE_ACTION
@ AST_CONTROL_HANGUP
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_WARNING
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
int errno
static int frames
Definition parser.c:51
enum ast_frame_type frametype
int done
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition utils.c:2315
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition time.h:159
#define MAX(a, b)
Definition utils.h:254

References ast_channel_lock, ast_channel_name(), ast_channel_unlock, AST_CONTROL_HANGUP, ast_debug, AST_FRAME_BRIDGE_ACTION, AST_FRAME_BRIDGE_ACTION_SYNC, AST_FRAME_CNG, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_HTML, AST_FRAME_IAX, AST_FRAME_IMAGE, AST_FRAME_MODEM, AST_FRAME_NULL, AST_FRAME_RTCP, AST_FRAME_TEXT, AST_FRAME_TEXT_DATA, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_frfree, ast_frisolate, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_HEAD_NOLOCK, AST_LIST_INSERT_HEAD, AST_LIST_REMOVE_HEAD, ast_log, ast_queue_frame_head(), ast_raw_answer(), ast_read(), ast_remaining_ms(), AST_STATE_RING, AST_STATE_RINGING, ast_tvnow(), ast_waitfor(), done, errno, frames, ast_frame::frametype, ast_frame_subclass::integer, LOG_WARNING, MAX, SCOPE_TRACE, and ast_frame::subclass.

Referenced by ast_answer(), pbx_builtin_answer(), and pbx_builtin_incomplete().

◆ __ast_channel_alloc()

struct ast_channel * __ast_channel_alloc ( int  needqueue,
int  state,
const char *  cid_num,
const char *  cid_name,
const char *  acctcode,
const char *  exten,
const char *  context,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
enum ama_flags  amaflag,
struct ast_endpoint endpoint,
const char *  file,
int  line,
const char *  function,
const char *  name_fmt,
  ... 
)

Create a channel structure.

Since
1.8
Return values
NULLfailure
non-NULLsuccessfully allocated channel
Note
Absolutely NO channel locks should be held before calling this function.
By default, new channels are set to the "s" extension and "default" context.
Since 12.0.0 this function returns with the newly created channel locked.

Definition at line 967 of file channel.c.

974{
975 va_list ap;
976 struct ast_channel *result;
977
978 va_start(ap, name_fmt);
979 result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
980 assignedids, requestor, amaflag, endpoint, NULL, file, line, function, name_fmt, ap);
981 va_end(ap);
982
983 return result;
984}
static PGresult * result
Definition cel_pgsql.c:84
static struct ast_channel * __ast_channel_alloc_ap(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt, va_list ap)
Create a new channel structure.
Definition channel.c:746

References __ast_channel_alloc_ap(), ast_channel::context, ast_channel::endpoint, ast_channel::exten, NULL, and result.

◆ __ast_channel_alloc_with_initializers()

struct ast_channel * __ast_channel_alloc_with_initializers ( int  needqueue,
int  state,
const char *  cid_num,
const char *  cid_name,
const char *  acctcode,
const char *  exten,
const char *  context,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
enum ama_flags  amaflag,
struct ast_endpoint endpoint,
struct ast_channel_initializers initializers,
const char *  file,
int  line,
const char *  function,
const char *  name_fmt,
  ... 
)

Create a channel structure.

Since
18.25.0
Return values
NULLfailure
non-NULLsuccessfully allocated channel
Note
Absolutely NO channel locks should be held before calling this function.
By default, new channels are set to the "s" extension and "default" context.
Same as __ast_channel_alloc but with ast_channel_initializers struct.

Definition at line 986 of file channel.c.

993{
994 va_list ap;
995 struct ast_channel *result;
996
997 va_start(ap, name_fmt);
998 result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
999 assignedids, requestor, amaflag, endpoint, initializers, file, line, function, name_fmt, ap);
1000 va_end(ap);
1001
1002 return result;
1003}

References __ast_channel_alloc_ap(), ast_channel::context, ast_channel::endpoint, ast_channel::exten, and result.

◆ __ast_dummy_channel_alloc()

struct ast_channel * __ast_dummy_channel_alloc ( const char *  file,
int  line,
const char *  function 
)

Definition at line 1007 of file channel.c.

1008{
1009 struct ast_channel *tmp;
1010 struct varshead *headp;
1011
1013 file, line, function);
1014 if (!tmp) {
1015 /* Dummy channel structure allocation failure. */
1016 return NULL;
1017 }
1018
1021
1022 /*
1023 * Init file descriptors to unopened state just in case
1024 * autoservice is called on the channel or something tries to
1025 * read a frame from it.
1026 */
1027 ast_channel_timingfd_set(tmp, -1);
1030
1032
1034
1035 headp = ast_channel_varshead(tmp);
1037
1038 return tmp;
1039}
static void ast_dummy_channel_destructor(void *obj)
Free a dummy channel structure.
Definition channel.c:2324
struct ast_channel * __ast_channel_internal_alloc(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *file, int line, const char *function)
int ast_channel_internal_setup_topics(struct ast_channel *chan)
@ AST_CONTROL_UNHOLD
void ast_pbx_hangup_handler_init(struct ast_channel *chan)
Init the hangup handler container on a channel.

References __ast_channel_internal_alloc(), ast_channel_datastores(), ast_channel_hold_state_set(), ast_channel_internal_alertpipe_clear(), ast_channel_internal_fd_clear_all(), ast_channel_internal_setup_topics(), ast_channel_timingfd_set(), ast_channel_varshead(), AST_CONTROL_UNHOLD, ast_dummy_channel_destructor(), AST_LIST_HEAD_INIT_NOLOCK, ast_pbx_hangup_handler_init(), and NULL.

◆ __ast_request_and_dial()

struct ast_channel * __ast_request_and_dial ( const char *  type,
struct ast_format_cap cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  addr,
int  timeout,
int *  reason,
const char *  cid_num,
const char *  cid_name,
struct outgoing_helper oh 
)

Request a channel of a given type, with data as optional information used by the low level module and attempt to place a call on it.

Parameters
typetype of channel to request
capformat capabilities for requested channel
assignedidsUnique Id to assign to channel
requestorchannel requesting data
addrdestination of the call
timeoutmaximum amount of time to wait for an answer
reasonwhy unsuccessful (if unsuccessful)
cid_numCaller-ID Number
cid_nameCaller-ID Name (ascii)
ohOutgoing helper
Returns
Returns an ast_channel on success or no answer, NULL on failure. Check the value of chan->_state to know if the call was answered or not.

Definition at line 6011 of file channel.c.

6012{
6013 int dummy_outstate;
6014 int cause = 0;
6015 struct ast_channel *chan;
6016 int res = 0;
6017 int last_subclass = 0;
6019
6020 if (outstate)
6021 *outstate = 0;
6022 else
6023 outstate = &dummy_outstate; /* make outstate always a valid pointer */
6024
6025 chan = ast_request(type, cap, assignedids, requestor, addr, &cause);
6026 if (!chan) {
6027 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, addr);
6028 handle_cause(cause, outstate);
6029 return NULL;
6030 }
6031
6032 if (oh) {
6033 if (oh->vars) {
6034 ast_channel_lock(chan);
6035 ast_set_variables(chan, oh->vars);
6036 ast_channel_unlock(chan);
6037 }
6038 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name)) {
6039 /*
6040 * Use the oh values instead of the function parameters for the
6041 * outgoing CallerID.
6042 */
6043 cid_num = oh->cid_num;
6044 cid_name = oh->cid_name;
6045 }
6046 if (oh->parent_channel) {
6047 /* Safely inherit variables and datastores from the parent channel. */
6053 ast_channel_unlock(chan);
6054 }
6055 if (!ast_strlen_zero(oh->account)) {
6056 ast_channel_lock(chan);
6058 ast_channel_accountcode_set(chan, oh->account);
6059 ast_channel_peeraccount_set(chan, oh->account);
6061 ast_channel_unlock(chan);
6062 }
6063 }
6064
6065 /*
6066 * It seems strange to set the CallerID on an outgoing call leg
6067 * to whom we are calling, but this function's callers are doing
6068 * various Originate methods. This call leg goes to the local
6069 * user. Once the local user answers, the dialplan needs to be
6070 * able to access the CallerID from the CALLERID function as if
6071 * the local user had placed this call.
6072 */
6073 ast_set_callerid(chan, cid_num, cid_name, cid_num);
6074
6075 ast_channel_lock(chan);
6077 ast_channel_unlock(chan);
6079 if (cid_num) {
6080 connected.id.number.valid = 1;
6081 connected.id.number.str = (char *) cid_num;
6083 }
6084 if (cid_name) {
6085 connected.id.name.valid = 1;
6086 connected.id.name.str = (char *) cid_name;
6088 }
6090 if (requestor) {
6091 ast_channel_lock_both(chan, (struct ast_channel *) requestor);
6093 ast_channel_unlock(chan);
6094 ast_channel_unlock((struct ast_channel *) requestor);
6095 }
6096
6097 if (ast_call(chan, addr, 0)) { /* ast_call failed... */
6098 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, addr);
6099 } else {
6100 struct timeval start = ast_tvnow();
6101 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
6102 while (timeout && ast_channel_state(chan) != AST_STATE_UP) {
6103 struct ast_frame *f;
6104 int ms = ast_remaining_ms(start, timeout);
6105
6106 res = ast_waitfor(chan, ms);
6107 if (res == 0) { /* timeout, treat it like ringing */
6108 *outstate = AST_CONTROL_RINGING;
6109 break;
6110 }
6111 if (res < 0) /* error or done */
6112 break;
6114 if (!(chan = ast_call_forward(NULL, chan, NULL, cap, oh, outstate))) {
6115 return NULL;
6116 }
6117 continue;
6118 }
6119
6120 f = ast_read(chan);
6121 if (!f) {
6122 *outstate = AST_CONTROL_HANGUP;
6123 res = 0;
6124 break;
6125 }
6126 if (f->frametype == AST_FRAME_CONTROL) {
6127 switch (f->subclass.integer) {
6128 case AST_CONTROL_RINGING: /* record but keep going */
6129 *outstate = f->subclass.integer;
6130 break;
6131
6132 case AST_CONTROL_BUSY:
6133 *outstate = f->subclass.integer;
6134 timeout = 0;
6135 break;
6136
6138 *outstate = AST_CONTROL_CONGESTION;
6139 timeout = 0;
6140 break;
6141
6143 *outstate = f->subclass.integer;
6144 timeout = 0;
6145 break;
6146
6147 case AST_CONTROL_ANSWER:
6148 *outstate = f->subclass.integer;
6149 timeout = 0; /* trick to force exit from the while() */
6150 break;
6151
6154 break;
6155
6157 if (oh && oh->connect_on_early_media) {
6158 *outstate = f->subclass.integer;
6159 timeout = 0; /* trick to force exit from the while() */
6160 break;
6161 }
6162 /* Fallthrough */
6163 /* Ignore these */
6165 case AST_CONTROL_HOLD:
6166 case AST_CONTROL_UNHOLD:
6172 case AST_CONTROL_CC:
6173 case -1: /* Ignore -- just stopping indications */
6174 break;
6175
6176 default:
6177 ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass.integer);
6178 }
6179 last_subclass = f->subclass.integer;
6180 }
6181 ast_frfree(f);
6182 }
6183 }
6184
6185 /* Final fixups */
6186 if (oh) {
6187 if (!ast_strlen_zero(oh->context))
6189 if (!ast_strlen_zero(oh->exten))
6190 ast_channel_exten_set(chan, oh->exten);
6191 if (oh->priority)
6193 }
6194 if (ast_channel_state(chan) == AST_STATE_UP)
6195 *outstate = AST_CONTROL_ANSWER;
6196
6197 if (res <= 0) {
6198 ast_channel_lock(chan);
6199 if (AST_CONTROL_RINGING == last_subclass) {
6201 }
6202 ast_channel_unlock(chan);
6203 ast_hangup(chan);
6204 chan = NULL;
6205 }
6206 return chan;
6207}
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition callerid.h:437
#define AST_CAUSE_NO_ANSWER
Definition causes.h:109
int ast_call(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition channel.c:6496
static void handle_cause(int cause, int *outstate)
Definition channel.c:5884
struct ast_channel * ast_call_forward(struct ast_channel *caller, struct ast_channel *orig, int *timeout, struct ast_format_cap *cap, struct outgoing_helper *oh, int *outstate)
Forwards a call to a new channel specified by the original channel's call_forward str....
Definition channel.c:5933
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition channel.c:2552
void ast_channel_set_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Set the connected line information in the Asterisk channel.
Definition channel.c:8392
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition channel.c:8199
int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
Inherit datastores from a parent to a child.
Definition channel.c:2359
void ast_channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
Setup new channel accountcodes from the requestor channel after ast_request().
Definition channel.c:6469
void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
Set caller ID number, name and ANI and generate AMI event.
Definition channel.c:7386
void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
Inherits channel variable from parent to child channel.
Definition channel.c:6811
void ast_channel_hangupcause_hash_set(struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.
Definition channel.c:4380
void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
Initialize the given connected line structure using the given guide for a set update operation.
Definition channel.c:2032
struct ast_channel * ast_request(const char *type, struct ast_format_cap *request_cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
Requests a channel.
Definition channel.c:6389
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition channel.h:2989
@ AST_STATE_UP
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
@ AST_CONTROL_SRCUPDATE
@ AST_CONTROL_PROGRESS
@ AST_CONTROL_VIDUPDATE
@ AST_CONTROL_PROCEEDING
@ AST_CONTROL_REDIRECTING
@ AST_CONTROL_CONGESTION
@ AST_CONTROL_ANSWER
@ AST_CONTROL_RINGING
@ AST_CONTROL_CONNECTED_LINE
@ AST_CONTROL_SRCCHANGE
@ AST_CONTROL_INCOMPLETE
@ AST_CONTROL_PVT_CAUSE_CODE
#define LOG_NOTICE
int ast_max_forwards_decrement(struct ast_channel *chan)
Decrement the max forwards count for a particular channel.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
const char * cid_num
Definition channel.h:1129
struct ast_variable * vars
Definition channel.h:1132
int connect_on_early_media
Definition channel.h:1128
const char * account
Definition channel.h:1131
const char * cid_name
Definition channel.h:1130
const char * exten
Definition channel.h:1126
const char * context
Definition channel.h:1125
struct ast_channel * parent_channel
Definition channel.h:1133
#define ast_set_flag(p, flag)
Definition utils.h:71

References outgoing_helper::account, ast_call(), ast_call_forward(), AST_CAUSE_NO_ANSWER, ast_channel_call_forward(), ast_channel_connected(), ast_channel_context_set(), ast_channel_datastore_inherit(), ast_channel_exten_set(), ast_channel_flags(), ast_channel_hangupcause_hash_set(), ast_channel_hangupcause_set(), ast_channel_inherit_variables(), ast_channel_lock, ast_channel_lock_both, ast_channel_priority_set(), ast_channel_req_accountcodes(), AST_CHANNEL_REQUESTOR_BRIDGE_PEER, ast_channel_set_connected_line(), ast_channel_stage_snapshot(), ast_channel_stage_snapshot_done(), ast_channel_unlock, AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_CC, AST_CONTROL_CONGESTION, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_INCOMPLETE, AST_CONTROL_PROCEEDING, AST_CONTROL_PROGRESS, AST_CONTROL_PVT_CAUSE_CODE, AST_CONTROL_REDIRECTING, AST_CONTROL_RINGING, AST_CONTROL_SRCCHANGE, AST_CONTROL_SRCUPDATE, AST_CONTROL_UNHOLD, AST_CONTROL_VIDUPDATE, AST_FLAG_ORIGINATED, AST_FRAME_CONTROL, ast_frfree, ast_hangup(), ast_log, ast_max_forwards_decrement(), ast_party_connected_line_set_init(), AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, ast_read(), ast_remaining_ms(), ast_request(), ast_set_callerid(), ast_set_flag, ast_set_variables(), AST_STATE_UP, ast_strlen_zero(), ast_tvnow(), ast_waitfor(), outgoing_helper::cid_name, outgoing_helper::cid_num, outgoing_helper::connect_on_early_media, connected, outgoing_helper::context, ast_frame::data, ast_frame::datalen, outgoing_helper::exten, ast_frame::frametype, handle_cause(), ast_frame_subclass::integer, LOG_NOTICE, NULL, outgoing_helper::parent_channel, outgoing_helper::priority, ast_frame::ptr, ast_frame::subclass, type, and outgoing_helper::vars.

Referenced by announce_to_dial(), and ast_request_and_dial().

◆ ast_activate_generator()

int ast_activate_generator ( struct ast_channel chan,
struct ast_generator gen,
void *  params 
)

Activate a given generator

Definition at line 2967 of file channel.c.

2968{
2969 int res = 0;
2970 void *generatordata = NULL;
2971
2972 ast_channel_lock(chan);
2973 if (ast_channel_generatordata(chan)) {
2974 struct ast_generator *generator_old = ast_channel_generator(chan);
2975
2976 if (generator_old && generator_old->release) {
2977 generator_old->release(chan, ast_channel_generatordata(chan));
2978 }
2979 }
2980 if (gen->alloc && !(generatordata = gen->alloc(chan, params))) {
2981 res = -1;
2982 }
2983 ast_channel_generatordata_set(chan, generatordata);
2984 if (!res) {
2985 ast_settimeout(chan, 50, generator_force, chan);
2987 }
2988 ast_channel_unlock(chan);
2989
2990 ast_prod(chan);
2991
2992 return res;
2993}
int ast_prod(struct ast_channel *chan)
Send empty audio to prime a channel driver.
Definition channel.c:5035
static int generator_force(const void *data)
Definition channel.c:2932
int ast_settimeout(struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data)
Enable or disable timer ticks for a channel.
Definition channel.c:3196
void *(* alloc)(struct ast_channel *chan, void *params)
Definition channel.h:228
void(* release)(struct ast_channel *chan, void *data)
Definition channel.h:230

References ast_generator::alloc, ast_channel_generator(), ast_channel_generator_set(), ast_channel_generatordata(), ast_channel_generatordata_set(), ast_channel_lock, ast_channel_unlock, ast_prod(), ast_settimeout(), gen, generator_force(), ast_channel::generatordata, NULL, and ast_generator::release.

Referenced by app_exec(), ast_channel_start_silence_generator(), ast_linear_stream(), ast_playtones_start(), ast_tonepair_start(), channel_spy(), do_broadcast(), eivr_comm(), local_ast_moh_start(), old_milliwatt_exec(), and spandsp_fax_gateway_start().

◆ ast_active_channels()

int ast_active_channels ( void  )

returns number of active/allocated channels

Returns
number of channels available for lookup

Definition at line 500 of file channel.c.

501{
503}
struct ast_channelstorage_instance * current_channel_storage_instance
The current channel storage instance.
#define CHANNELSTORAGE_API(_instance, _func,...)
static int active_channels(struct ast_channelstorage_instance *driver, int rdlock)
returns number of active/allocated channels

References active_channels(), CHANNELSTORAGE_API, and current_channel_storage_instance.

Referenced by action_corestatus(), ast_var_channels(), ast_var_channels_table(), dahdi_restart(), handle_chanlist(), handle_show_settings(), and really_quit().

◆ ast_add_fd()

static int ast_add_fd ( struct pollfd *  pfd,
int  fd 
)
inlinestatic

if fd is a valid descriptor, set *pfd with the descriptor

Returns
Return 1 (not -1!) if added, 0 otherwise (so we can add the return value to the index into the array)

Definition at line 2879 of file channel.h.

2880{
2881 pfd->fd = fd;
2882 pfd->events = POLLIN | POLLPRI;
2883 return fd >= 0;
2884}

Referenced by ast_waitfor_nandfds().

◆ ast_answer()

int ast_answer ( struct ast_channel chan)

Answer a channel.

Parameters
chanchannel to answer

This function answers a channel and handles all necessary call setup functions.

Note
The channel passed does not need to be locked, but is locked by the function when needed.
This function will wait up to 500 milliseconds for media to arrive on the channel before returning to the caller, so that the caller can properly assume the channel is 'ready' for media flow.
Return values
0on success
non-zeroon failure

Definition at line 2817 of file channel.c.

2818{
2819 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2820 return __ast_answer(chan, 0);
2821}
int __ast_answer(struct ast_channel *chan, unsigned int delay)
Answer a channel, with a selectable delay before returning.
Definition channel.c:2707

References __ast_answer(), ast_channel_name(), and SCOPE_TRACE.

Referenced by agent_login_exec(), agi_exec_full(), alarmreceiver_exec(), announce_request(), app_exec(), app_exec(), ast_auto_answer(), ast_bridge_add_channel(), ast_do_pickup(), ast_pickup_call(), auth_exec(), background_detect_exec(), bridge_channel_handle_control(), bridge_parking_push(), bridgeadd_exec(), bridgewait_exec(), common_exec(), conf_exec(), conf_start_record(), confbridge_exec(), count_exec(), dial_exec_full(), dictate_exec(), directory_exec(), disa_exec(), eivr_comm(), handle_answer(), leave_voicemail(), local_call(), media_request_helper(), minivm_accmess_exec(), minivm_greet_exec(), minivm_record_exec(), old_milliwatt_exec(), park_app_exec(), parked_call_app_exec(), pbx_builtin_background(), playback_exec(), privacy_exec(), read_exec(), readexten_exec(), receivefax_exec(), record_exec(), sayunixtime_exec(), send_waveform_to_channel(), sendfax_exec(), setup_privacy_args(), skel_exec(), sla_station_exec(), speech_background(), testclient_exec(), testserver_exec(), vm_exec(), vm_execmain(), vm_playmsgexec(), waitfor_exec(), and zapateller_exec().

◆ ast_auto_answer()

int ast_auto_answer ( struct ast_channel chan)
inline

Answer a channel, if it's not already answered.

Parameters
chanchannel to answer

See ast_answer()

Return values
0on success
non-zeroon failure

Definition at line 2823 of file channel.c.

2824{
2825 if (ast_channel_state(chan) == AST_STATE_UP) {
2826 /* Already answered */
2827 return 0;
2828 }
2829 return ast_answer(chan);
2830}
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2817

References ast_answer(), and AST_STATE_UP.

Referenced by record_file(), and senddtmf_exec().

◆ ast_autoservice_chan_hangup_peer()

void ast_autoservice_chan_hangup_peer ( struct ast_channel chan,
struct ast_channel peer 
)

Put chan into autoservice while hanging up peer.

Since
11.0
Parameters
chanChan to put into autoservice.
peerChan to run hangup handlers and hangup.

Definition at line 349 of file autoservice.c.

350{
351 if (chan && !ast_autoservice_start(chan)) {
352 ast_hangup(peer);
354 } else {
355 ast_hangup(peer);
356 }
357}
int ast_autoservice_stop(struct ast_channel *chan)
Stop servicing a channel for us...
int ast_autoservice_start(struct ast_channel *chan)
Automatically service a channel for us...

References ast_autoservice_start(), ast_autoservice_stop(), and ast_hangup().

Referenced by app_exec(), bridge_failed_peer_goto(), dial_exec_full(), and try_calling().

◆ ast_autoservice_ignore()

int ast_autoservice_ignore ( struct ast_channel chan,
enum ast_frame_type  ftype 
)

Ignore certain frame types.

Note
Normally, we cache DTMF, IMAGE, HTML, TEXT, and CONTROL frames while a channel is in autoservice and queue them up when taken out of autoservice. When this is not desireable, this API may be used to cause the channel to ignore those frametypes after the channel is put into autoservice, but before autoservice is stopped.
Return values
0success
-1channel is not in autoservice

Definition at line 359 of file autoservice.c.

360{
361 struct asent *as;
362 int res = -1;
363
366 if (as->chan == chan) {
367 res = 0;
368 as->ignore_frame_types |= (1 << ftype);
369 break;
370 }
371 }
373 return res;
374}
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_LIST_LOCK(head)
Locks a list.
Definition linkedlists.h:40
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
unsigned int ignore_frame_types
Definition autoservice.c:62
struct asent::@324 list
struct ast_channel * chan
Definition autoservice.c:55

References AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, asent::chan, asent::ignore_frame_types, and asent::list.

◆ ast_autoservice_start()

int ast_autoservice_start ( struct ast_channel chan)

Automatically service a channel for us...

Return values
0success
-1failure, or the channel is already being autoserviced

Definition at line 200 of file autoservice.c.

201{
202 int res = 0;
203 struct asent *as;
204
206 /* User interface threads do not handle channel media. */
207 ast_debug(1, "Thread is a user interface, not putting channel %s into autoservice\n",
209 return 0;
210 }
211
214 if (as->chan == chan) {
215 as->use_count++;
216 break;
217 }
218 }
220
221 if (as) {
222 /* Entry exists, autoservice is already handling this channel */
223 return 0;
224 }
225
226 if (!(as = ast_calloc(1, sizeof(*as))))
227 return -1;
228
229 /* New entry created */
230 as->chan = chan;
231 as->use_count = 1;
232
235 if (!as->orig_end_dtmf_flag)
238
240
243 }
244
246
247 if (asthread == AST_PTHREADT_NULL) { /* need start the thread */
249 ast_log(LOG_WARNING, "Unable to create autoservice thread :(\n");
250 /* There will only be a single member in the list at this point,
251 the one we just added. */
253 ast_free(as);
255 res = -1;
256 } else {
257 pthread_kill(asthread, SIGURG);
258 }
259 }
260
262
263 return res;
264}
#define ast_free(a)
Definition astmm.h:180
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
static void * autoservice_run(void *ign)
Definition autoservice.c:78
static ast_cond_t as_cond
Definition autoservice.c:71
static pthread_t asthread
Definition autoservice.c:73
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_PTHREADT_NULL
Definition lock.h:73
#define ast_cond_signal(cond)
Definition lock.h:210
unsigned int use_count
Definition autoservice.c:59
unsigned int orig_end_dtmf_flag
Definition autoservice.c:60
int ast_thread_is_user_interface(void)
Indicates whether the current thread is a user interface.
Definition utils.c:3282
#define ast_pthread_create_background(a, b, c, d)
Definition utils.h:632

References as_cond, ast_calloc, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_cond_signal, ast_debug, AST_FLAG_END_DTMF_ONLY, ast_free, AST_LIST_EMPTY, AST_LIST_INSERT_HEAD, AST_LIST_LOCK, AST_LIST_REMOVE, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log, ast_pthread_create_background, AST_PTHREADT_NULL, ast_set_flag, ast_test_flag, ast_thread_is_user_interface(), asthread, autoservice_run(), asent::chan, asent::list, LOG_WARNING, NULL, asent::orig_end_dtmf_flag, and asent::use_count.

Referenced by acf_curl_helper(), acf_jabberreceive_read(), acf_odbc_read(), acf_odbc_write(), action_toggle_mute_participants(), app_exec(), ast_app_exec_sub(), ast_audiosocket_connect(), ast_autoservice_chan_hangup_peer(), ast_dtmf_stream(), ast_get_enum(), ast_get_srv(), ast_get_txt(), ast_mf_stream(), ast_sf_stream(), begin_dial_prerun(), conf_play(), confbridge_exec(), dial_exec_full(), exec(), findmeexec(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), join_conference_bridge(), lock_read(), lua_autoservice_start(), lua_get_variable_value(), lua_pbx_exec(), lua_set_variable(), lua_set_variable_value(), mf_stream(), originate_exec(), pbx_find_extension(), playback_common(), post_join_play_begin(), push_announcer(), realtimefield_read(), reload_exec(), ring_one(), sf_stream(), shell_helper(), smdi_msg_retrieve_read(), srv_datastore_setup(), system_exec_helper(), try_calling(), and trylock_read().

◆ ast_autoservice_stop()

int ast_autoservice_stop ( struct ast_channel chan)

Stop servicing a channel for us...

Note
if chan is locked prior to calling ast_autoservice_stop, it is likely that there will be a deadlock between the thread that calls ast_autoservice_stop and the autoservice thread. It is important that chan is not locked prior to this call
Parameters
chan
Return values
0success
-1error, or the channel has been hungup

Definition at line 266 of file autoservice.c.

267{
268 int res = -1;
269 struct asent *as, *removed = NULL;
270 struct ast_frame *f;
271 int chan_list_state;
272
274 /* User interface threads do not handle channel media. */
275 ast_debug(1, "Thread is a user interface, not removing channel %s from autoservice\n",
276 ast_channel_name(chan));
277 return 0;
278 }
279
281
282 /* Save the autoservice channel list state. We _must_ verify that the channel
283 * list has been rebuilt before we return. Because, after we return, the channel
284 * could get destroyed and we don't want our poor autoservice thread to step on
285 * it after its gone! */
286 chan_list_state = as_chan_list_state;
287
288 /* Find the entry, but do not free it because it still can be in the
289 autoservice thread array */
291 if (as->chan == chan) {
292 as->use_count--;
293 if (as->use_count < 1) {
295 removed = as;
296 }
297 break;
298 }
299 }
301
302 if (removed && asthread != AST_PTHREADT_NULL) {
303 pthread_kill(asthread, SIGURG);
304 }
305
307
308 if (!removed) {
309 return 0;
310 }
311
312 if (asthread != AST_PTHREADT_NULL && pthread_equal(pthread_self(), asthread)) {
313 /* Do not sleep if ast_autoservice_stop is called within the autoservice thread,
314 otherwise the thread will be stuck in an endless sleep. */
315 ast_debug(1, "ast_autoservice_stop is called within the autoservice thread, channel %s\n",
316 ast_channel_name(chan));
317 } else {
318 /* Wait while autoservice thread rebuilds its list. */
319 while (chan_list_state == as_chan_list_state) {
320 usleep(1000);
321 }
322 }
323
324 /* Now autoservice thread should have no references to our entry
325 and we can safely destroy it */
326
328 res = 0;
329 }
330
331 ast_channel_lock(chan);
332 if (!as->orig_end_dtmf_flag) {
334 }
335
336 while ((f = AST_LIST_REMOVE_HEAD(&as->deferred_frames, frame_list))) {
337 if (!((1 << f->frametype) & as->ignore_frame_types)) {
338 ast_queue_frame_head(chan, f);
339 }
340 ast_frfree(f);
341 }
342 ast_channel_unlock(chan);
343
344 ast_free(as);
345
346 return res;
347}
static int as_chan_list_state
Definition autoservice.c:76
int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to the head of a channel's frame queue.
Definition channel.c:1176
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
struct asent::@323 deferred_frames
#define ast_clear_flag(p, flag)
Definition utils.h:78

References as_chan_list_state, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_softhangup_internal_flag(), ast_channel_unlock, ast_clear_flag, ast_debug, AST_FLAG_END_DTMF_ONLY, ast_free, ast_frfree, AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_REMOVE_HEAD, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_LIST_UNLOCK, AST_PTHREADT_NULL, ast_queue_frame_head(), ast_thread_is_user_interface(), asthread, asent::chan, asent::deferred_frames, ast_frame::frametype, asent::ignore_frame_types, NULL, asent::orig_end_dtmf_flag, and asent::use_count.

Referenced by acf_curl_helper(), acf_jabberreceive_read(), acf_odbc_read(), acf_odbc_write(), action_toggle_mute_participants(), app_exec(), array(), ast_app_exec_sub(), ast_audiosocket_connect(), ast_autoservice_chan_hangup_peer(), ast_dtmf_stream(), ast_get_enum(), ast_get_srv(), ast_get_txt(), ast_hangup(), ast_mf_stream(), ast_sf_stream(), begin_dial_prerun(), conf_play(), confbridge_exec(), dial_exec_full(), exec(), findmeexec(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), hangup_playback(), join_conference_bridge(), lock_read(), lua_autoservice_stop(), lua_get_variable_value(), lua_pbx_exec(), lua_set_variable(), lua_set_variable_value(), mf_stream(), originate_exec(), pbx_find_extension(), playback_common(), post_join_play_begin(), realtimefield_read(), reload_exec(), ring_one(), sf_stream(), shell_helper(), smdi_msg_retrieve_read(), srv_datastore_setup(), system_exec_helper(), try_calling(), and trylock_read().

◆ ast_call()

int ast_call ( struct ast_channel chan,
const char *  addr,
int  timeout 
)

Make a call.

Note
Absolutely NO channel locks should be held before calling this function.
Parameters
chanwhich channel to make the call on
addrdestination of the call
timeouttime to wait on for connect (Doesn't seem to be used.)

Place a call, take no longer than timeout ms.

Return values
0on success
-1on failure

Definition at line 6496 of file channel.c.

6497{
6498 /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
6499 If the remote end does not answer within the timeout, then do NOT hang up, but
6500 return anyway. */
6501 int res = -1;
6502 /* Stop if we're a zombie or need a soft hangup */
6503 ast_channel_lock(chan);
6505 if (ast_channel_tech(chan)->call)
6506 res = ast_channel_tech(chan)->call(chan, addr, timeout);
6508 }
6509 ast_channel_unlock(chan);
6510 return res;
6511}
static int call(void *data)
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition channel.c:446
int(*const call)(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition channel.h:721

References ast_channel_flags(), ast_channel_lock, ast_channel_unlock, ast_check_hangup(), AST_FLAG_OUTGOING, AST_FLAG_ZOMBIE, ast_set_flag, ast_test_flag, call(), and ast_channel_tech::call.

Referenced by __ast_request_and_dial(), app_control_dial(), ast_call_forward(), attended_transfer_bridge(), begin_dial_channel(), blind_transfer_bridge(), dial_exec_full(), do_forward(), feature_attended_transfer(), findmeexec(), park_local_transfer(), retransfer_enter(), ring_entry(), and wait_for_answer().

◆ ast_call_forward()

struct ast_channel * ast_call_forward ( struct ast_channel caller,
struct ast_channel orig,
int *  timeout,
struct ast_format_cap cap,
struct outgoing_helper oh,
int *  outstate 
)

Forwards a call to a new channel specified by the original channel's call_forward str. If possible, the new forwarded channel is created and returned while the original one is terminated.

Parameters
callerin channel that requested orig
origchannel being replaced by the call forward channel
timeoutmaximum amount of time to wait for setup of new forward channel
capformat capabilities for requested channel
ohoutgoing helper used with original channel
outstatereason why unsuccessful (if unsuccessful)
Returns
Returns the forwarded call's ast_channel on success or NULL on failure

Definition at line 5933 of file channel.c.

5934{
5935 char tmpchan[256];
5936 char forwarder[AST_CHANNEL_NAME];
5937 struct ast_channel *new_chan = NULL;
5938 char *data, *type;
5939 int cause = 0;
5940 int res;
5941
5942 /* gather data and request the new forward channel */
5943 ast_copy_string(tmpchan, ast_channel_call_forward(orig), sizeof(tmpchan));
5944 ast_copy_string(forwarder, ast_channel_name(orig), sizeof(forwarder));
5945 if ((data = strchr(tmpchan, '/'))) {
5946 *data++ = '\0';
5947 type = tmpchan;
5948 } else {
5949 const char *forward_context;
5950 ast_channel_lock(orig);
5951 forward_context = pbx_builtin_getvar_helper(orig, "FORWARD_CONTEXT");
5952 snprintf(tmpchan, sizeof(tmpchan), "%s@%s", ast_channel_call_forward(orig), S_OR(forward_context, ast_channel_context(orig)));
5953 ast_channel_unlock(orig);
5954 data = tmpchan;
5955 type = "Local";
5956 }
5957 if (!(new_chan = ast_request(type, cap, NULL, orig, data, &cause))) {
5958 ast_log(LOG_NOTICE, "Unable to create channel for call forward to '%s/%s' (cause = %d)\n", type, data, cause);
5959 handle_cause(cause, outstate);
5960 ast_hangup(orig);
5961 return NULL;
5962 }
5963
5964 /* Copy/inherit important information into new channel */
5965 if (oh) {
5966 if (oh->vars) {
5967 ast_channel_lock(new_chan);
5968 ast_set_variables(new_chan, oh->vars);
5969 ast_channel_unlock(new_chan);
5970 }
5971 if (oh->parent_channel) {
5972 call_forward_inherit(new_chan, oh->parent_channel, orig);
5973 }
5974 if (!ast_strlen_zero(oh->account)) {
5975 ast_channel_lock(new_chan);
5977 ast_channel_accountcode_set(new_chan, oh->account);
5978 ast_channel_peeraccount_set(new_chan, oh->account);
5980 ast_channel_unlock(new_chan);
5981 }
5982 } else if (caller) { /* no outgoing helper so use caller if available */
5983 call_forward_inherit(new_chan, caller, orig);
5984 }
5985
5986 ast_channel_lock_both(orig, new_chan);
5988 pbx_builtin_setvar_helper(new_chan, "FORWARDERNAME", forwarder);
5992 ast_channel_unlock(new_chan);
5993 ast_channel_unlock(orig);
5994
5995 /* call new channel */
5996 res = ast_call(new_chan, data, 0);
5997 if (timeout) {
5998 *timeout = res;
5999 }
6000 if (res) {
6001 ast_log(LOG_NOTICE, "Unable to call forward to channel %s/%s\n", type, (char *)data);
6002 ast_hangup(orig);
6003 ast_hangup(new_chan);
6004 return NULL;
6005 }
6006 ast_hangup(orig);
6007
6008 return new_chan;
6009}
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition channel.c:2018
static void call_forward_inherit(struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
Definition channel.c:5905
void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
Set a flag on a channel.
Definition channel.c:11115
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition channel.c:2122
#define AST_CHANNEL_NAME
Definition channel.h:173
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
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.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425

References outgoing_helper::account, ast_call(), ast_channel_call_forward(), ast_channel_connected(), ast_channel_context(), ast_channel_lock, ast_channel_lock_both, AST_CHANNEL_NAME, ast_channel_name(), ast_channel_redirecting(), ast_channel_req_accountcodes(), AST_CHANNEL_REQUESTOR_REPLACEMENT, ast_channel_set_flag(), ast_channel_stage_snapshot(), ast_channel_stage_snapshot_done(), ast_channel_unlock, ast_copy_string(), AST_FLAG_ORIGINATED, ast_hangup(), ast_log, ast_party_connected_line_copy(), ast_party_redirecting_copy(), ast_request(), ast_set_variables(), ast_strlen_zero(), call_forward_inherit(), ast_channel::caller, ast_channel::data, handle_cause(), LOG_NOTICE, NULL, outgoing_helper::parent_channel, pbx_builtin_getvar_helper(), pbx_builtin_setvar_helper(), S_OR, type, and outgoing_helper::vars.

Referenced by __ast_request_and_dial().

◆ ast_cause2str()

const char * ast_cause2str ( int  cause)

Gives the string form of a given cause code.

Parameters
causecause to get the description of
Returns
the text form of the binary cause code given

Gives the string form of a given cause code.

Definition at line 613 of file channel.c.

614{
615 int x;
616
617 for (x = 0; x < ARRAY_LEN(causes); x++) {
618 if (causes[x].cause == cause)
619 return causes[x].desc;
620 }
621
622 return "Unknown";
623}
static const struct causes_map causes[]
Definition channel.c:137
const char * desc
Definition channel.c:134
#define ARRAY_LEN(a)
Definition utils.h:706

References ARRAY_LEN, causes, and causes_map::desc.

Referenced by _websocket_request_hangup(), bridge_dissolve(), channel_destroyed_event(), channel_state_change(), dial_exec_full(), findmeexec(), hangupcause_read(), and rfc3326_add_reason_header().

◆ ast_change_name()

void ast_change_name ( struct ast_channel chan,
const char *  newname 
)

Change channel name.

Precondition
Absolutely all channels and the channel storage backend MUST be unlocked before calling this function.
Parameters
chanthe channel to change the name of
newnamethe name to change to
Note
this function must NEVER be used when any channels or the channel storage backend are locked regardless if it is the channel who's name is being changed or not because it invalidates our channel container locking order... lock container first, then the individual channels, never the other way around.

Definition at line 6799 of file channel.c.

6800{
6801 /* We must re-link, as the hash value will change here. */
6803 ast_channel_lock(chan);
6805 __ast_change_name_nolink(chan, newname);
6807 ast_channel_unlock(chan);
6809}
static void __ast_change_name_nolink(struct ast_channel *chan, const char *newname)
this function simply changes the name of the channel and issues a manager_event with out unlinking an...
Definition channel.c:6777
#define remove

References __ast_change_name_nolink(), ast_channel_lock, ast_channel_unlock, CHANNELSTORAGE_API, current_channel_storage_instance, and remove.

◆ ast_channel__bridge()

struct ast_channel * ast_channel__bridge ( const struct ast_channel chan)

◆ ast_channel__bridge_set()

void ast_channel__bridge_set ( struct ast_channel chan,
struct ast_channel value 
)

◆ ast_channel_accountcode()

const char * ast_channel_accountcode ( const struct ast_channel chan)

◆ ast_channel_adsicpe()

enum ast_channel_adsicpe ast_channel_adsicpe ( const struct ast_channel chan)

Definition at line 648 of file channel_internal_api.c.

649{
650 return chan->adsicpe;
651}
enum ast_channel_adsicpe adsicpe

References ast_channel::adsicpe.

◆ ast_channel_adsicpe_set()

void ast_channel_adsicpe_set ( struct ast_channel chan,
enum ast_channel_adsicpe  value 
)

◆ ast_channel_alert_writable()

int ast_channel_alert_writable ( struct ast_channel chan)

Definition at line 992 of file channel_internal_api.c.

993{
994 return ast_alertpipe_writable(chan->alertpipe);
995}
int attribute_pure ast_alertpipe_writable(int alert_pipe[2])
Determine if the alert pipe is writable.
Definition alertpipe.h:130

References ast_channel::alertpipe, and ast_alertpipe_writable().

Referenced by __ast_queue_frame().

◆ ast_channel_alert_write()

int ast_channel_alert_write ( struct ast_channel chan)

Definition at line 977 of file channel_internal_api.c.

978{
979 return ast_alertpipe_write(chan->alertpipe);
980}
ssize_t ast_alertpipe_write(int alert_pipe[2])
Write an event to an alert pipe.
Definition alertpipe.c:120

References ast_channel::alertpipe, and ast_alertpipe_write().

Referenced by __ast_queue_frame(), __ast_read(), and channel_do_masquerade().

◆ ast_channel_amaflags()

enum ama_flags ast_channel_amaflags ( const struct ast_channel chan)

◆ ast_channel_amaflags2string()

const char * ast_channel_amaflags2string ( enum ama_flags  flags)

Convert the enum representation of an AMA flag to a string representation.

Since
12
Parameters
flagsinteger flag
Return values
Astring representation of the flag

Definition at line 4407 of file channel.c.

4408{
4409 switch (flag) {
4410 case AST_AMA_OMIT:
4411 return "OMIT";
4412 case AST_AMA_BILLING:
4413 return "BILLING";
4415 return "DOCUMENTATION";
4416 default:
4417 return "Unknown";
4418 }
4419}

References AST_AMA_BILLING, AST_AMA_DOCUMENTATION, and AST_AMA_OMIT.

Referenced by ast_cdr_format_var(), beanstalk_put(), build_csv_record(), build_radius_record(), build_radius_record(), cdr_read_callback(), cel_bs_put(), format_amaflags(), handle_cli_ooh323_show_config(), handle_cli_ooh323_show_peer(), handle_cli_ooh323_show_user(), manager_log(), manager_log(), tds_log(), and tds_log().

◆ ast_channel_amaflags_set()

void ast_channel_amaflags_set ( struct ast_channel chan,
enum ama_flags  value 
)
Precondition
chan is locked

Definition at line 282 of file channel_internal_api.c.

283{
284 if (chan->amaflags == value) {
285 return;
286 }
287 chan->amaflags = value;
289}
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.

References ast_channel::amaflags, ast_channel_publish_snapshot(), and value.

Referenced by __ast_channel_alloc_ap(), ast_cel_fabricate_channel_from_event(), ast_iax2_new(), AST_TEST_DEFINE(), cdr_write(), dahdi_new(), func_channel_write_real(), and ooh323_new().

◆ ast_channel_answertime()

struct timeval ast_channel_answertime ( struct ast_channel chan)

Definition at line 853 of file channel_internal_api.c.

854{
855 return chan->answertime;
856}
struct timeval answertime

Referenced by ast_channel_get_up_time_ms(), and set_channel_answer_time().

◆ ast_channel_answertime_set()

void ast_channel_answertime_set ( struct ast_channel chan,
struct timeval *  value 
)

Definition at line 858 of file channel_internal_api.c.

859{
860 chan->answertime = *value;
861}

References ast_channel::answertime, and value.

Referenced by set_channel_answer_time().

◆ ast_channel_appl()

const char * ast_channel_appl ( const struct ast_channel chan)

◆ ast_channel_appl_set()

void ast_channel_appl_set ( struct ast_channel chan,
const char *  value 
)

Definition at line 192 of file channel_internal_api.c.

193{
194 chan->appl = value;
196}
void ast_channel_snapshot_invalidate_segment(struct ast_channel *chan, enum ast_channel_snapshot_segment_invalidation segment)
Invalidate a channel snapshot segment from being reused.
@ AST_CHANNEL_SNAPSHOT_INVALIDATE_DIALPLAN

References ast_channel::appl, AST_CHANNEL_SNAPSHOT_INVALIDATE_DIALPLAN, ast_channel_snapshot_invalidate_segment(), and value.

Referenced by ast_cel_fabricate_channel_from_event(), AST_TEST_DEFINE(), begin_dial_prerun(), dial_exec_full(), do_forward(), pbx_exec(), realtime_exec(), and ring_entry().

◆ ast_channel_audiohooks()

struct ast_audiohook_list * ast_channel_audiohooks ( const struct ast_channel chan)

◆ ast_channel_audiohooks_set()

void ast_channel_audiohooks_set ( struct ast_channel chan,
struct ast_audiohook_list value 
)

Definition at line 460 of file channel_internal_api.c.

461{
462 chan->audiohooks = value;
463}

References ast_channel::audiohooks, and value.

Referenced by __ast_read(), ast_audiohook_attach(), ast_write_stream(), and destroy_hooks().

◆ ast_channel_autochans()

struct ast_autochan_list * ast_channel_autochans ( struct ast_channel chan)

Definition at line 739 of file channel_internal_api.c.

740{
741 return &chan->autochans;
742}
struct ast_autochan_list autochans

References ast_channel::autochans.

Referenced by __ast_channel_alloc_ap(), ast_autochan_destroy(), ast_autochan_new_channel(), and ast_autochan_setup().

◆ ast_channel_blocker()

pthread_t ast_channel_blocker ( const struct ast_channel chan)

Definition at line 1080 of file channel_internal_api.c.

1081{
1082 return chan->blocker;
1083}
pthread_t blocker

References ast_channel::blocker.

Referenced by __ast_queue_frame(), ast_softhangup_nolock(), and channel_do_masquerade().

◆ ast_channel_blocker_set()

void ast_channel_blocker_set ( struct ast_channel chan,
pthread_t  value 
)

Definition at line 1084 of file channel_internal_api.c.

1085{
1086 chan->blocker = value;
1087}

References ast_channel::blocker, and value.

◆ ast_channel_blocker_tid()

int ast_channel_blocker_tid ( const struct ast_channel chan)

Definition at line 1089 of file channel_internal_api.c.

1090{
1091 return chan->blocker_tid;
1092}

References ast_channel::blocker_tid.

Referenced by ast_hangup().

◆ ast_channel_blocker_tid_set()

void ast_channel_blocker_tid_set ( struct ast_channel chan,
int  tid 
)

Definition at line 1093 of file channel_internal_api.c.

1094{
1095 chan->blocker_tid = value;
1096}

References ast_channel::blocker_tid, and value.

◆ ast_channel_blockproc()

const char * ast_channel_blockproc ( const struct ast_channel chan)

Definition at line 197 of file channel_internal_api.c.

198{
199 return chan->blockproc;
200}
const char * blockproc

References ast_channel::blockproc.

Referenced by ast_hangup(), and serialize_showchan().

◆ ast_channel_blockproc_set()

void ast_channel_blockproc_set ( struct ast_channel chan,
const char *  value 
)

Definition at line 201 of file channel_internal_api.c.

202{
203 chan->blockproc = value;
204}

References ast_channel::blockproc, and value.

◆ ast_channel_bridge_peer()

struct ast_channel * ast_channel_bridge_peer ( struct ast_channel chan)

Get the channel's bridge peer only if the bridge is two-party.

Since
12.0.0
Parameters
chanChannel desiring the bridge peer channel.
Note
The returned peer channel is the current peer in the bridge when called.
Absolutely NO channel locks should be held when calling this function.
Return values
NULLChannel not in a bridge or the bridge is not two-party.
non-NULLReffed peer channel at time of calling.

Definition at line 10652 of file channel.c.

10653{
10654 struct ast_channel *peer;
10655 struct ast_bridge *bridge;
10656
10657 /* Get the bridge the channel is in. */
10658 ast_channel_lock(chan);
10659 bridge = ast_channel_get_bridge(chan);
10660 ast_channel_unlock(chan);
10661 if (!bridge) {
10662 return NULL;
10663 }
10664
10665 peer = ast_bridge_peer(bridge, chan);
10666 ao2_ref(bridge, -1);
10667 return peer;
10668}
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
struct ast_channel * ast_bridge_peer(struct ast_bridge *bridge, struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
Definition bridge.c:4154
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition channel.c:10622

References ao2_ref, ast_bridge_peer(), ast_channel_get_bridge(), ast_channel_lock, ast_channel_unlock, and NULL.

Referenced by analog_ss_thread(), ast_rtp_instance_set_stats_vars(), ast_set_hangupsource(), ast_unreal_queryoption(), ast_var_channels_table(), attach_barge(), attach_barge(), channel_do_masquerade(), create_jb(), fax_detect_framehook(), fax_gateway_framehook(), func_channel_read(), handle_incoming_request(), manager_park(), my_get_sigpvt_bridged_channel(), and spandsp_fax_gateway_start().

◆ ast_channel_call_forward()

const char * ast_channel_call_forward ( const struct ast_channel chan)

◆ ast_channel_callback()

struct ast_channel * ast_channel_callback ( ao2_callback_data_fn cb_fn,
void *  arg,
void *  data,
int  ao2_flags 
)

Call a function with every active channel.

Channel search functions

Warning
Absolutely NO channel locks should be held while calling any of these functions.

This function executes a callback one time for each active channel on the system. The channel is provided as an argument to the function.

Since
1.8

Definition at line 1336 of file channel.c.

1338{
1340 return NULL;
1341 }
1342 if (!cb_fn) {
1343 ast_log(LOG_ERROR, "callback function must be provided\n");
1344 return NULL;
1345 }
1346 return CHANNELSTORAGE_API(current_channel_storage_instance, callback, cb_fn, arg, data, ao2_flags, 1);
1347}
static struct ast_channel * callback(struct ast_channelstorage_instance *driver, ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags, int rdlock)
#define LOG_ERROR

References ast_log, callback(), CHANNELSTORAGE_API, current_channel_storage_instance, ast_channel::data, LOG_ERROR, and NULL.

Referenced by ast_pickup_find_by_group(), ast_softhangup_all(), find_by_channel(), find_by_part(), handle_core_set_debug_channel(), and pickup_by_mark().

◆ ast_channel_caller()

struct ast_party_caller * ast_channel_caller ( struct ast_channel chan)

Definition at line 755 of file channel_internal_api.c.

756{
757 return &chan->caller;
758}

References ast_channel::caller.

Referenced by __analog_handle_event(), __analog_ss_thread(), __ast_channel_alloc_ap(), __ast_goto_if_exists(), __ast_pbx_run(), action_meetmelist(), after_bridge_move_channel(), agent_request_exec(), analog_ss_thread(), app_exec(), ast_app_dtget(), ast_ari_channels_dial(), ast_bridge_setup_after_goto(), ast_cel_fabricate_channel_from_event(), ast_channel_destructor(), ast_channel_set_caller(), ast_channel_set_caller_event(), ast_do_pickup(), ast_dummy_channel_destructor(), ast_iax2_new(), ast_pbx_h_exten_run(), ast_set_callerid(), ast_str_retrieve_variable(), AST_TEST_DEFINE(), ast_unreal_call_setup(), ast_var_channels_table(), background_detect_exec(), begin_dial_prerun(), blacklist_read(), bridge_reconfigured_connected_line_update(), callerid_read(), callerid_write(), cc_generic_agent_init(), chan_pjsip_cng_tone_detected(), chan_pjsip_new(), channel_do_masquerade(), channel_snapshot_caller_create(), collect_digits(), console_call(), copy_caller_data(), copy_message(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_new(), dial_exec_full(), dial_trunk(), dialog_info_generate_body_content(), disa_exec(), do_forward(), fax_detect_framehook(), find_matching_endif(), find_matching_endwhile(), findmeexec(), forward_message(), gosub_exec(), gosub_run(), grab_transfer(), handle_cli_confbridge_list_item(), handle_gosub(), handle_setpriority(), handle_showchan(), incoming_in_dialog_request(), isAnsweringMachine(), isexten_function_read(), launch_monitor_thread(), leave_voicemail(), leave_voicemail(), local_call(), manager_queues_status(), meetme_show_cmd(), minivm_greet_exec(), minivm_notify_exec(), my_get_callerid(), my_handle_dtmf(), onModeChanged(), ooh323_rtp_read(), originate_exec(), park_local_transfer(), pbx_builtin_background(), pbx_builtin_waitexten(), pbx_outgoing_attempt(), pbx_parse_location(), privacy_exec(), queue_connected_line_update(), queue_exec(), readexten_exec(), recalling_enter(), ring_entry(), run_externnotify(), serialize_showchan(), setup_env(), setup_privacy_args(), sla_ring_station(), sms_exec(), socket_process_helper(), start_automixmonitor(), try_calling(), unistim_new(), unreal_colp_redirect_indicate(), update_connected_line_from_peer(), update_connected_line_from_peer(), update_initial_connected_line(), valid_exit(), vm_authenticate(), wait_for_answer(), waitstream_core(), write_metadata(), and zapateller_exec().

◆ ast_channel_caller_set()

void ast_channel_caller_set ( struct ast_channel chan,
struct ast_party_caller value 
)

◆ ast_channel_callgroup()

ast_group_t ast_channel_callgroup ( const struct ast_channel chan)

◆ ast_channel_callgroup_set()

void ast_channel_callgroup_set ( struct ast_channel chan,
ast_group_t  value 
)
Precondition
chan is locked

Definition at line 945 of file channel_internal_api.c.

946{
947 chan->callgroup = value;
948}

References ast_channel::callgroup, and value.

Referenced by chan_pjsip_new(), dahdi_new(), func_channel_write_real(), jingle_new(), and unistim_new().

◆ ast_channel_callid()

ast_callid ast_channel_callid ( const struct ast_channel chan)

◆ ast_channel_callid_cleanup()

void ast_channel_callid_cleanup ( struct ast_channel chan)

Definition at line 935 of file channel_internal_api.c.

936{
937 chan->callid = 0;
938}

References ast_channel::callid.

Referenced by ast_channel_destructor().

◆ ast_channel_callid_set()

void ast_channel_callid_set ( struct ast_channel chan,
ast_callid  value 
)
Precondition
chan is locked

Definition at line 664 of file channel_internal_api.c.

665{
666 char call_identifier_from[AST_CALLID_BUFFER_LENGTH];
667 char call_identifier_to[AST_CALLID_BUFFER_LENGTH];
668 call_identifier_from[0] = '\0';
669 ast_callid_strnprint(call_identifier_to, sizeof(call_identifier_to), callid);
670 if (chan->callid) {
671 ast_callid_strnprint(call_identifier_from, sizeof(call_identifier_from), chan->callid);
672 ast_debug(3, "Channel Call ID changing from %s to %s\n", call_identifier_from, call_identifier_to);
673 }
674
675 chan->callid = callid;
676
677 ast_test_suite_event_notify("CallIDChange",
678 "State: CallIDChange\r\n"
679 "Channel: %s\r\n"
680 "CallID: %s\r\n"
681 "PriorCallID: %s",
682 ast_channel_name(chan),
683 call_identifier_to,
684 call_identifier_from);
685}
void ast_callid_strnprint(char *buffer, size_t buffer_size, ast_callid callid)
copy a string representation of the callid into a target string
Definition logger.c:2258
#define AST_CALLID_BUFFER_LENGTH
#define ast_test_suite_event_notify(s, f,...)
Definition test.h:189

References AST_CALLID_BUFFER_LENGTH, ast_callid_strnprint(), ast_channel_name(), ast_debug, ast_test_suite_event_notify, and ast_channel::callid.

Referenced by __ast_pbx_run(), ast_iax2_new(), ast_unreal_channel_push_to_bridge(), ast_unreal_new_channels(), common_recall_channel_setup(), dahdi_new(), iax2_request(), jingle_new(), and request_channel().

◆ ast_channel_cc_params_init()

int ast_channel_cc_params_init ( struct ast_channel chan,
const struct ast_cc_config_params base_params 
)

Set up datastore with CCSS parameters for a channel.

Since
1.8
Note
If base_params is NULL, the channel will get the default values for all CCSS parameters.

This function makes use of datastore operations on the channel, so it is important to lock the channel before calling this function.

Warning
You should call this function only if ast_cc_is_enabled() returns true.
Parameters
chanThe channel to create the datastore on
base_paramsCCSS parameters we wish to copy into the channel
Return values
0Success
-1Failure or CCSS is globally disabled.

Definition at line 10535 of file channel.c.

10537{
10538 struct ast_cc_config_params *cc_params;
10539 struct ast_datastore *cc_datastore;
10540
10541 if (!(cc_params = ast_cc_config_params_init())) {
10542 return -1;
10543 }
10544
10545 if (!(cc_datastore = ast_datastore_alloc(&cc_channel_datastore_info, NULL))) {
10547 return -1;
10548 }
10549
10550 if (base_params) {
10551 ast_cc_copy_config_params(cc_params, base_params);
10552 }
10553 cc_datastore->data = cc_params;
10554 ast_channel_datastore_add(chan, cc_datastore);
10555 return 0;
10556}
#define ast_cc_config_params_init()
Allocate and initialize an ast_cc_config_params structure.
Definition ccss.h:135
void ast_cc_config_params_destroy(struct ast_cc_config_params *params)
Free memory from CCSS configuration params.
Definition ccss.c:714
void ast_cc_copy_config_params(struct ast_cc_config_params *dest, const struct ast_cc_config_params *src)
copy CCSS configuration parameters from one structure to another
Definition ccss.c:876
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition channel.c:2376
static const struct ast_datastore_info cc_channel_datastore_info
Definition channel.c:10529
#define ast_datastore_alloc(info, uid)
Definition datastore.h:85
Structure for a data store object.
Definition datastore.h:64
void * data
Definition datastore.h:66

References ast_cc_config_params_destroy(), ast_cc_config_params_init, ast_cc_copy_config_params(), ast_channel_datastore_add(), ast_datastore_alloc, cc_channel_datastore_info, ast_datastore::data, and NULL.

Referenced by ast_channel_get_cc_config_params(), ast_unreal_call_setup(), ast_unreal_new_channels(), and dahdi_new().

◆ ast_channel_cdr()

struct ast_cdr * ast_channel_cdr ( const struct ast_channel chan)

Definition at line 464 of file channel_internal_api.c.

465{
466 return chan->cdr;
467}
struct ast_cdr * cdr

References ast_channel::cdr.

Referenced by ast_channel_destructor(), ast_channel_log(), ast_dummy_channel_destructor(), cdr_read_callback(), and cdr_retrieve_time().

◆ ast_channel_cdr_set()

void ast_channel_cdr_set ( struct ast_channel chan,
struct ast_cdr value 
)

Definition at line 468 of file channel_internal_api.c.

469{
470 chan->cdr = value;
471}

References ast_channel::cdr, and value.

Referenced by ast_channel_destructor(), ast_dummy_channel_destructor(), dummy_chan_alloc_cdr(), and manager_log().

◆ ast_channel_clear_flag()

void ast_channel_clear_flag ( struct ast_channel chan,
unsigned int  flag 
)

Clear a flag on a channel.

Since
13.17.0
Parameters
chanThe channel to clear the flag from
flagThe flag to clear
Note
This will lock the channel internally. If the channel is already locked it is still safe to call.

Definition at line 11122 of file channel.c.

11123{
11124 ast_channel_lock(chan);
11126 ast_channel_unlock(chan);
11127}

References ast_channel_flags(), ast_channel_lock, ast_channel_unlock, and ast_clear_flag.

Referenced by action_redirect(), ast_bridge_setup_after_goto(), ast_channel_undefer_dtmf(), ast_waitfordigit_full(), bridge_channel_internal_pull(), channel_spy(), common_exec(), dial_exec_full(), disa_exec(), do_broadcast(), handle_exec(), and waitstream_core().

◆ ast_channel_clear_softhangup()

void ast_channel_clear_softhangup ( struct ast_channel chan,
int  flag 
)

Clear a set of softhangup flags from a channel.

Never clear a softhangup flag from a channel directly. Instead, use this function. This ensures that all aspects of the softhangup process are aborted.

Parameters
chanthe channel to clear the flag on
flagthe flag or flags to clear

Definition at line 2423 of file channel.c.

2424{
2425 ast_channel_lock(chan);
2426
2428
2430 struct ast_frame *fr;
2431
2432 /* If we have completely cleared the softhangup flag,
2433 * then we need to fully abort the hangup process. This requires
2434 * pulling the END_OF_Q frame out of the channel frame queue if it
2435 * still happens to be there. */
2436
2437 fr = AST_LIST_LAST(ast_channel_readq(chan));
2438 if (fr && fr->frametype == AST_FRAME_CONTROL &&
2441 ast_frfree(fr);
2442 }
2443 }
2444
2445 ast_channel_unlock(chan);
2446}
@ AST_CONTROL_END_OF_Q
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.

References ast_channel_lock, ast_channel_readq(), ast_channel_softhangup_internal_flag(), ast_channel_softhangup_internal_flag_clear(), ast_channel_unlock, AST_CONTROL_END_OF_Q, AST_FRAME_CONTROL, ast_frfree, AST_LIST_LAST, AST_LIST_REMOVE, ast_frame::frametype, ast_frame_subclass::integer, and ast_frame::subclass.

Referenced by __ast_pbx_run(), ast_bridge_setup_after_goto(), chan_cleanup(), collect_digits(), gosub_run(), and stasis_app_exec().

◆ ast_channel_cmpwhentohangup_tv()

int ast_channel_cmpwhentohangup_tv ( struct ast_channel chan,
struct timeval  offset 
)

Compare a offset with the settings of when to hang a channel up.

Parameters
chanchannel on which to check for hangup
offsetoffset in seconds and microseconds from current time
Return values
1
0
-1This function compares a offset from current time with the absolute time out on a channel (when to hang up). If the absolute time out on a channel is earlier than current time plus the offset, it returns 1, if the two time values are equal, it return 0, otherwise, it return -1.
Since
1.6.1

Compare a offset with the settings of when to hang a channel up.

Definition at line 524 of file channel.c.

525{
526 struct timeval whentohangup;
527
529 return ast_tvzero(offset) ? 0 : -1;
530
531 if (ast_tvzero(offset))
532 return 1;
533
534 whentohangup = ast_tvadd(offset, ast_tvnow());
535
536 return ast_tvdiff_ms(whentohangup, *ast_channel_whentohangup(chan));
537}
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition time.h:117
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition extconf.c:2280
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition time.h:107

References ast_channel_whentohangup(), ast_tvadd(), ast_tvdiff_ms(), ast_tvnow(), and ast_tvzero().

◆ ast_channel_connected()

struct ast_party_connected_line * ast_channel_connected ( struct ast_channel chan)

◆ ast_channel_connected_effective_id()

struct ast_party_id ast_channel_connected_effective_id ( struct ast_channel chan)

Definition at line 767 of file channel_internal_api.c.

768{
769 return ast_party_id_merge(&chan->connected.id, &chan->connected.priv);
770}
struct ast_party_id priv
Private connected party ID.
Definition channel.h:470
struct ast_party_id id
Connected party ID.
Definition channel.h:460

References ast_party_id_merge().

Referenced by caller_id_outgoing_request(), caller_id_outgoing_response(), generate_status(), handle_showchan(), is_colp_update_allowed(), set_from_header(), and stir_shaken_outgoing_request().

◆ ast_channel_connected_indicated()

struct ast_party_connected_line * ast_channel_connected_indicated ( struct ast_channel chan)

Definition at line 763 of file channel_internal_api.c.

764{
765 return &chan->connected_indicated;
766}
struct ast_party_connected_line connected_indicated
Channel Connected Line ID information that was last indicated.

References ast_channel::connected_indicated.

Referenced by __ast_channel_alloc_ap(), after_bridge_move_channel(), ast_channel_destructor(), ast_dummy_channel_destructor(), and indicate_connected_line().

◆ ast_channel_connected_line_sub()

int ast_channel_connected_line_sub ( struct ast_channel autoservice_chan,
struct ast_channel sub_chan,
const void *  connected_info,
int  frame 
)

Run a connected line interception subroutine and update a channel's connected line information.

Since
11

Whenever we want to update a channel's connected line information, we may need to run a subroutine so that an administrator can manipulate the information before sending it out. This function both runs the subroutine specified by CONNECTED_LINE_SEND_SUB and sends the update to the channel.

Parameters
autoservice_chanChannel to place into autoservice while the sub is running. It is perfectly safe for this to be NULL
sub_chanThe channel to run the subroutine on. Also the channel from which we determine which subroutine we need to run.
connected_infoEither an ast_party_connected_line or ast_frame pointer of type AST_CONTROL_CONNECTED_LINE
frameIf true, then connected_info is an ast_frame pointer, otherwise it is an ast_party_connected_line pointer.
Return values
0Success
-1Either the subroutine does not exist, or there was an error while attempting to run the subroutine

Definition at line 10422 of file channel.c.

10423{
10424 const char *sub;
10425 const char *sub_args;
10426 int retval;
10427
10428 ast_channel_lock(sub_chan);
10429 sub = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB");
10430 sub = ast_strdupa(S_OR(sub, ""));
10431 sub_args = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB_ARGS");
10432 sub_args = ast_strdupa(S_OR(sub_args, ""));
10433
10434 if (ast_strlen_zero(sub)) {
10435 ast_channel_unlock(sub_chan);
10436 return -1;
10437 }
10438
10439 if (is_frame) {
10440 const struct ast_frame *frame = connected_info;
10441
10443 } else {
10444 const struct ast_party_connected_line *connected = connected_info;
10445
10447 }
10448 ast_channel_unlock(sub_chan);
10449
10451 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10453 if (!retval) {
10454 struct ast_party_connected_line saved_connected;
10455
10456 ast_party_connected_line_init(&saved_connected);
10457 ast_channel_lock(sub_chan);
10458 ast_party_connected_line_copy(&saved_connected, ast_channel_connected(sub_chan));
10459 ast_channel_unlock(sub_chan);
10460 ast_channel_update_connected_line(sub_chan, &saved_connected, NULL);
10461 ast_party_connected_line_free(&saved_connected);
10462 }
10463
10464 return retval;
10465}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition channel.c:2059
void ast_channel_update_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Indicate that the connected line information has changed.
Definition channel.c:9177
int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected)
Parse connected line indication frame data.
Definition channel.c:8869
static void channel_set_intercept_mode(int in_intercept_mode)
Definition channel.c:10406
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition channel.c:2009
int ast_app_run_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_location, const char *sub_args, int ignore_hangup)
Run a subroutine on a channel, placing an optional second channel into autoservice.
Definition main/app.c:328
static struct stasis_subscription * sub
Statsd channel stats. Exmaple of how to subscribe to Stasis events.

References ast_app_run_sub(), ast_channel_connected(), ast_channel_lock, ast_channel_unlock, ast_channel_update_connected_line(), ast_connected_line_parse_data(), ast_party_connected_line_copy(), ast_party_connected_line_free(), ast_party_connected_line_init(), ast_strdupa, ast_strlen_zero(), channel_set_intercept_mode(), connected, ast_frame::data, ast_frame::datalen, NULL, pbx_builtin_getvar_helper(), ast_frame::ptr, S_OR, and sub.

Referenced by __ast_read(), app_exec(), ast_do_pickup(), bridge_channel_handle_control(), dial_exec_full(), handle_frame(), update_connected_line_from_peer(), update_connected_line_from_peer(), wait_for_answer(), and wait_for_answer().

◆ ast_channel_connected_set()

void ast_channel_connected_set ( struct ast_channel chan,
struct ast_party_connected_line value 
)

◆ ast_channel_context()

const char * ast_channel_context ( const struct ast_channel chan)

Definition at line 215 of file channel_internal_api.c.

216{
217 return chan->context;
218}

References ast_channel::context.

Referenced by __analog_ss_thread(), __ast_goto_if_exists(), __ast_pbx_run(), _while_exec(), action_blind_transfer(), action_bridge(), action_dialplan_exec(), analog_ss_thread(), ast_bridge_setup_after_goto(), ast_call_forward(), ast_cc_call_init(), ast_channel_log(), ast_channel_yank(), ast_pbx_h_exten_run(), ast_str_retrieve_variable(), AST_TEST_DEFINE(), ast_var_channels_table(), ast_waitstream_exten(), background_detect_exec(), blind_transfer_exec(), bridge_exec(), by_exten_cb(), cc_generic_agent_init(), cc_interfaces_datastore_init(), chan_pjsip_cng_tone_detected(), channel_snapshot_dialplan_create(), channelstorage_exten_cb(), collect_digits(), common_exec(), conf_run(), dahdi_handle_dtmf(), dial_exec_full(), dialout(), do_forward(), eval_exten_read(), expand_gosub_args(), extenspy_exec(), fax_detect_framehook(), feature_blind_transfer(), find_matching_endif(), find_matching_endwhile(), forward_message(), func_channel_read(), func_channel_write_real(), get_cid_name(), get_transfer_context(), gosub_exec(), gosub_run(), goto_exten(), goto_parser(), handle_call_forward(), handle_gosub(), handle_setpriority(), handle_showchan(), iax2_call(), if_helper(), launch_monitor_thread(), leave_voicemail(), leave_voicemail(), log_exec(), lua_pbx_exec(), minivm_greet_exec(), my_handle_dtmf(), onedigit_goto(), onModeChanged(), ooh323_rtp_read(), pbx_builtin_background(), pbx_builtin_goto(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_extension_helper(), pbx_parse_location(), pickup_exec(), raise_exception(), readexten_exec(), realtime_exec(), ring_entry(), serialize_showchan(), setup_env(), setup_peer_after_bridge_goto(), setup_peer_after_bridge_goto(), try_calling(), vm_authenticate(), vm_execmain(), vmauthenticate(), and wait_for_answer().

◆ ast_channel_context_set()

void ast_channel_context_set ( struct ast_channel chan,
const char *  value 
)

◆ ast_channel_creationtime()

struct timeval ast_channel_creationtime ( struct ast_channel chan)

◆ ast_channel_creationtime_set()

void ast_channel_creationtime_set ( struct ast_channel chan,
struct timeval *  value 
)

◆ ast_channel_data()

const char * ast_channel_data ( const struct ast_channel chan)

◆ ast_channel_data_set()

void ast_channel_data_set ( struct ast_channel chan,
const char *  value 
)

◆ ast_channel_datastore_add()

int ast_channel_datastore_add ( struct ast_channel chan,
struct ast_datastore datastore 
)

Add a datastore to a channel.

Note
The channel should be locked before calling this function.
Return values
0success
non-zerofailure

Definition at line 2376 of file channel.c.

2377{
2378 int res = 0;
2379
2380 AST_LIST_INSERT_HEAD(ast_channel_datastores(chan), datastore, entry);
2381
2382 return res;
2383}

References ast_channel_datastores(), AST_LIST_INSERT_HEAD, and ast_datastore::entry.

Referenced by __after_bridge_set_goto(), acf_curlopt_write(), acf_iaxvar_write(), acf_odbc_read(), add_eprofile_to_channel(), add_features_datastore(), add_inheritable_header(), add_masquerade_store(), add_to_agi(), after_bridge_cb_setup(), apply_plc(), ast_cel_fabricate_channel_from_event(), ast_channel_cc_params_init(), ast_channel_suppress(), ast_do_pickup(), ast_iax2_new(), ast_jb_create_framehook(), ast_setup_cc_recall_datastore(), ast_stir_shaken_add_result_to_channel(), attach_framehook(), audiohook_volume_get(), authenticate_reply(), bridge_channel_impart_add(), bridge_features_ds_set_full(), calendar_query_exec(), cc_interfaces_datastore_init(), chan_cleanup(), channel_feature_hooks_set_full(), command_prestart_queue_command(), create_msg_q_chan(), create_parked_subscription_full(), create_transaction(), detect_write(), dial_exec_full(), dial_masquerade_datastore_add(), do_notify(), dtmfstore_exec(), dundi_query_read(), enable_jack_hook(), enum_query_read(), find_or_create_details(), frame_drop_helper(), frame_trace_helper(), func_channel_write_real(), func_confbridge_helper(), func_write_attestation(), geoloc_profile_write(), get_feature_ds(), get_lock(), get_replace_channel_store(), gosub_exec(), handle_remb_set(), init_hook(), lua_get_state(), max_forwards_datastore_alloc(), msg_datastore_find_or_create(), pitchshift_helper(), raise_exception(), record_exec(), save_dialstring(), scramble_write(), set_hold_intercept(), set_internal_datastore(), set_talk_detect(), set_timeout(), setup_async_playback_datastore(), setup_bridge_roles_datastore(), setup_mixmonitor_ds(), setup_park_common_datastore(), shared_write(), smdi_msg_retrieve_read(), socket_process_helper(), speech_create(), speex_write(), srv_datastore_setup(), stasis_app_channel_set_stasis_end_published(), t38_attach_framehook(), unicast_rtp_request(), and volume_write().

◆ ast_channel_datastore_find()

struct ast_datastore * ast_channel_datastore_find ( struct ast_channel chan,
const struct ast_datastore_info info,
const char *  uid 
)

Find a datastore on a channel.

Note
The channel should be locked before calling this function.
The datastore returned from this function must not be used if the reference to the channel is released.
Return values
pointerto the datastore if found
NULLif not found

Definition at line 2390 of file channel.c.

2391{
2392 struct ast_datastore *datastore = NULL;
2393
2394 if (info == NULL)
2395 return NULL;
2396
2398 if (datastore->info != info) {
2399 continue;
2400 }
2401
2402 if (uid == NULL) {
2403 /* matched by type only */
2404 break;
2405 }
2406
2407 if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
2408 /* Matched by type AND uid */
2409 break;
2410 }
2411 }
2412
2413 return datastore;
2414}
const struct ast_datastore_info * info
Definition datastore.h:67
const char * uid
Definition datastore.h:65
struct ast_datastore::@223 entry

References ast_channel_datastores(), AST_LIST_TRAVERSE, ast_datastore::entry, ast_datastore::info, NULL, and ast_datastore::uid.

Referenced by acf_curl_helper(), acf_curlopt_helper(), acf_curlopt_write(), acf_exception_read(), acf_fetch(), acf_iaxvar_read(), acf_iaxvar_write(), acf_odbc_read(), add_agi_cmd(), add_features_datastore(), add_inheritable_header(), add_masquerade_store(), add_to_agi(), after_bridge_cb_find(), after_bridge_cb_setup(), after_bridge_goto_remove(), apply_plc(), ast_bridge_features_ds_get(), ast_bridge_read_after_goto(), ast_can_pickup(), ast_cc_agent_set_interfaces_chanvar(), ast_cc_call_init(), ast_cc_completed(), ast_cc_extension_monitor_add_dialstring(), ast_cc_get_current_core_id(), ast_cc_is_recall(), ast_cc_offer(), ast_channel_feature_hooks_get(), ast_channel_get_cc_config_params(), ast_channel_suppress(), ast_channel_unsuppress(), ast_geoloc_datastore_find(), ast_handle_cc_control_frame(), ast_ignore_cc(), ast_jb_create_framehook(), ast_odbc_retrieve_transaction_obj(), ast_set_cc_interfaces_chanvar(), ast_stir_shaken_add_result_to_channel(), ast_stir_shaken_get_attestation_datastore(), async_play_sound_ready(), attach_framehook(), audiohook_volume_callback(), audiohook_volume_get(), balance_stack(), bridge_channel_impart_add(), bridge_channel_impart_signal(), bridge_features_ds_set_full(), bridge_timeout(), calendar_event_read(), calendar_query_exec(), calendar_query_result_exec(), cc_build_payload(), chan_cleanup(), chan_rtp_get_rtp_peer(), channel_feature_hooks_set_full(), command_prestart_get_container(), command_prestart_queue_command(), conf_find_bridge_profile(), conf_find_user_profile(), conf_set_menu_to_user(), create_transaction(), detect_callback(), detect_read(), detect_write(), dial_exec_full(), dial_masquerade_datastore_find(), dialplan_handle_msg_cb(), disable_jack_hook(), dtmfstore_exec(), dundi_result_read(), enable_jack_hook(), enum_result_read(), exec_odbcfinish(), fetch_bridge_roles_datastore(), find_details(), find_speech(), find_transaction(), fixup_callback(), frame_drop_helper(), frame_trace_helper(), func_channel_read(), func_channel_write_real(), func_confbridge_helper(), func_mixmonitor_read(), func_read_verification(), func_write_attestation(), get_agi_cmd(), get_feature_chan_ds(), get_feature_ds(), get_lock(), get_park_common_datastore_copy(), get_replace_channel_store(), gosub_exec(), gosub_run(), handle_gosub(), handle_remb_set(), has_masquerade_store(), hook_off(), hook_re_enable(), iax2_call(), jack_hook_callback(), local_read(), local_write(), lock_fixup(), lua_get_state(), mark_transaction_active(), max_forwards_datastore_find_or_alloc(), mixmonitor_ds_remove_and_free(), msg_data_func_read(), msg_datastore_find_or_create(), msg_func_read(), msg_send_exec(), mute_mixmonitor_instance(), outgoing_request(), pitchshift_cb(), pitchshift_helper(), pop_exec(), raise_exception(), record_exec(), recording_info_read(), remb_hook_event_cb(), remove_detect(), remove_dtmf_store(), remove_framehook(), remove_hold_intercept(), remove_inheritable_header(), remove_masquerade_store(), remove_scrambler(), remove_stasis_end_published(), remove_talk_detect(), restore_dialstring(), return_exec(), scramble_callback(), scramble_write(), set_hold_intercept(), set_internal_datastore(), set_interval_hook(), set_security_requirements(), set_talk_detect(), setup_async_playback_datastore(), shared_read(), shared_write(), smdi_msg_read(), speech_datastore_destroy(), speex_callback(), speex_read(), speex_write(), srv_query_read(), srv_result_read(), stackpeek_read(), stasis_app_channel_is_internal(), stasis_app_channel_is_stasis_end_published(), stop_mixmonitor_full(), t38_attach_framehook(), talk_detect_audiohook_cb(), unlock_read(), update_inheritable_header(), volume_callback(), volume_read(), volume_write(), wait_for_initiator(), wipe_park_common_datastore(), and wipe_subscription_datastore().

◆ ast_channel_datastore_inherit()

int ast_channel_datastore_inherit ( struct ast_channel from,
struct ast_channel to 
)

Inherit datastores from a parent to a child.

Note
None of the datastore API calls lock the ast_channel they are using. So, the channel should be locked before calling the functions that take a channel argument.

Definition at line 2359 of file channel.c.

2360{
2361 struct ast_datastore *datastore = NULL, *datastore2;
2362
2364 if (datastore->inheritance > 0) {
2365 datastore2 = ast_datastore_alloc(datastore->info, datastore->uid);
2366 if (datastore2) {
2367 datastore2->data = datastore->info->duplicate ? datastore->info->duplicate(datastore->data) : NULL;
2368 datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
2370 }
2371 }
2372 }
2373 return 0;
2374}
#define DATASTORE_INHERIT_FOREVER
Definition channel.h:194
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
void *(* duplicate)(void *data)
Definition datastore.h:33
unsigned int inheritance
Definition datastore.h:69

References ast_channel_datastores(), ast_datastore_alloc, AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_datastore::data, DATASTORE_INHERIT_FOREVER, ast_datastore_info::duplicate, ast_datastore::entry, ast_datastore::info, ast_datastore::inheritance, NULL, and ast_datastore::uid.

Referenced by __ast_request_and_dial(), ast_ari_channels_dial(), ast_unreal_call_setup(), begin_dial_prerun(), call_forward_inherit(), common_recall_channel_setup(), copy_caller_data(), dial_exec_full(), do_forward(), findmeexec(), park_local_transfer(), ring_entry(), and wait_for_answer().

◆ ast_channel_datastore_remove()

int ast_channel_datastore_remove ( struct ast_channel chan,
struct ast_datastore datastore 
)

◆ ast_channel_datastores()

struct ast_datastore_list * ast_channel_datastores ( struct ast_channel chan)

◆ ast_channel_defer_dtmf()

int ast_channel_defer_dtmf ( struct ast_channel chan)

Defers DTMF so that you only read things like hangups and audio.

Returns
non-zero if channel was already DTMF-deferred or 0 if channel is just now being DTMF-deferred

Defers DTMF so that you only read things like hangups and audio.

Definition at line 1315 of file channel.c.

1316{
1317 int pre = 0;
1318
1319 if (chan) {
1320 ast_channel_lock(chan);
1323 ast_channel_unlock(chan);
1324 }
1325 return pre;
1326}

References ast_channel_flags(), ast_channel_lock, ast_channel_unlock, AST_FLAG_DEFER_DTMF, ast_set_flag, and ast_test_flag.

Referenced by __adsi_transmit_messages().

◆ ast_channel_dialcontext()

const char * ast_channel_dialcontext ( const struct ast_channel chan)

Referenced by ast_channel_log().

◆ ast_channel_dialed()

struct ast_party_dialed * ast_channel_dialed ( struct ast_channel chan)

◆ ast_channel_dialed_causes_add()

int ast_channel_dialed_causes_add ( const struct ast_channel chan,
const struct ast_control_pvt_cause_code cause_code,
int  datalen 
)

Add cause code information to the channel.

Since
11

This function makes use of datastore operations on the channel, so it is important to lock the channel before calling this function. The passed in data is copied and so is still owned by the caller.

Parameters
chanThe channel on which to add information
cause_codeThe cause information to be added to the channel
datalenThe total length of the structure since its length is variable
Return values
0on success
-1on error

Definition at line 1165 of file channel_internal_api.c.

1166{
1167 struct ast_control_pvt_cause_code *ao2_cause_code;
1169 ao2_cause_code = ao2_alloc(datalen, NULL);
1170
1171 if (ao2_cause_code) {
1172 memcpy(ao2_cause_code, cause_code, datalen);
1173 ao2_link(chan->dialed_causes, ao2_cause_code);
1174 ao2_ref(ao2_cause_code, -1);
1175 return 0;
1176 } else {
1177 return -1;
1178 }
1179}
#define ao2_link(container, obj)
Add an object to a container.
Definition astobj2.h:1532
#define OBJ_KEY
Definition astobj2.h:1151
#define ao2_find(container, arg, flags)
Definition astobj2.h:1736
@ OBJ_NODATA
Definition astobj2.h:1044
@ OBJ_UNLINK
Definition astobj2.h:1039
#define ao2_alloc(data_size, destructor_fn)
Definition astobj2.h:409
struct ao2_container * dialed_causes

References ao2_alloc, ao2_find, ao2_link, ao2_ref, ast_control_pvt_cause_code::chan_name, ast_channel::dialed_causes, NULL, OBJ_KEY, OBJ_NODATA, and OBJ_UNLINK.

Referenced by ast_channel_hangupcause_hash_set().

◆ ast_channel_dialed_causes_channels()

struct ast_str * ast_channel_dialed_causes_channels ( const struct ast_channel chan)

Retrieve a comma-separated list of channels for which dialed cause information is available.

Since
11

This function makes use of datastore operations on the channel, so it is important to lock the channel before calling this function.

Parameters
chanThe channel from which to retrieve information
Return values
NULLon allocation failure
Pointerto an ast_str object containing the desired information which must be freed

Definition at line 1147 of file channel_internal_api.c.

1148{
1149 struct ast_str *chanlist = ast_str_create(128);
1150
1151 if (!chanlist) {
1152 return NULL;
1153 }
1154
1156
1157 return chanlist;
1158}
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
Definition astobj2.h:1693
static int collect_names_cb(void *obj, void *arg, int flags)
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
List of channel drivers.
Definition app_dial.c:804

References ao2_callback, ast_str_create, collect_names_cb(), ast_channel::dialed_causes, and NULL.

Referenced by hangupcause_keys_read().

◆ ast_channel_dialed_causes_clear()

void ast_channel_dialed_causes_clear ( const struct ast_channel chan)

Clear all cause information from the channel.

Since
11

This function makes use of datastore operations on the channel, so it is important to lock the channel before calling this function.

Parameters
chanThe channel from which to clear information

Definition at line 1181 of file channel_internal_api.c.

1182{
1184}
@ OBJ_MULTIPLE
Definition astobj2.h:1049

References ao2_callback, ast_channel::dialed_causes, NULL, OBJ_MULTIPLE, OBJ_NODATA, and OBJ_UNLINK.

Referenced by hangupcause_clear_exec().

◆ ast_channel_dialed_causes_find()

struct ast_control_pvt_cause_code * ast_channel_dialed_causes_find ( const struct ast_channel chan,
const char *  chan_name 
)

Retrieve a ref-counted cause code information structure.

Since
11

This function makes use of datastore operations on the channel, so it is important to lock the channel before calling this function. This function increases the ref count of the returned object, so the calling function must decrease the reference count when it is finished with the object.

Parameters
chanThe channel from which to retrieve information
chan_nameThe name of the channel about which to retrieve information
Return values
NULLon search failure
Pointerto a ref-counted ast_control_pvt_cause_code object containing the desired information

Definition at line 1160 of file channel_internal_api.c.

1161{
1162 return ao2_find(chan->dialed_causes, chan_name, OBJ_KEY);
1163}

References ao2_find, ast_control_pvt_cause_code::chan_name, ast_channel::dialed_causes, and OBJ_KEY.

Referenced by hangupcause_read().

◆ ast_channel_dialed_causes_iterator()

struct ao2_iterator ast_channel_dialed_causes_iterator ( const struct ast_channel chan)

Retrieve an iterator for dialed cause information.

Since
20.19.0
22.9.0
23.3.0

Each call to ao2_iterator_next() will return a pointer to an ast_control_pvt_cause_code structure containing the dialed cause information for one channel. One of the entries may be for the channel itself if the channel was hung up because of a non-2XX SIP response code. The rest of the entries will be for channels bridged to the channel for which dialed cause information is being retrieved. The caller is responsible for cleaning up the reference count of each entry returned and destroying the returned iterator with ao2_iterator_destroy() when it is finished with it.

Parameters
chanThe channel from which to retrieve cause information
Return values
ao2_iterator

Definition at line 1142 of file channel_internal_api.c.

1143{
1144 return ao2_iterator_init(chan->dialed_causes, 0);
1145}
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.

References ao2_iterator_init().

Referenced by chan_pjsip_session_end().

◆ ast_channel_dialed_set()

void ast_channel_dialed_set ( struct ast_channel chan,
struct ast_party_dialed value 
)

◆ ast_channel_dtmf_digit_to_emulate()

char ast_channel_dtmf_digit_to_emulate ( const struct ast_channel chan)

Definition at line 250 of file channel_internal_api.c.

251{
252 return chan->dtmf_digit_to_emulate;
253}
char dtmf_digit_to_emulate

References ast_channel::dtmf_digit_to_emulate.

Referenced by __ast_read().

◆ ast_channel_dtmf_digit_to_emulate_set()

void ast_channel_dtmf_digit_to_emulate_set ( struct ast_channel chan,
char  value 
)

Definition at line 254 of file channel_internal_api.c.

255{
257}

References ast_channel::dtmf_digit_to_emulate, and value.

Referenced by __ast_read().

◆ ast_channel_dtmf_tv()

struct timeval * ast_channel_dtmf_tv ( struct ast_channel chan)

Definition at line 791 of file channel_internal_api.c.

792{
793 return &chan->dtmf_tv;
794}
struct timeval dtmf_tv

References ast_channel::dtmf_tv.

Referenced by __ast_read(), should_skip_dtmf(), and should_trigger_dtmf_emulating().

◆ ast_channel_dtmf_tv_set()

void ast_channel_dtmf_tv_set ( struct ast_channel chan,
struct timeval *  value 
)

Definition at line 831 of file channel_internal_api.c.

832{
833 chan->dtmf_tv = *value;
834}

References ast_channel::dtmf_tv, and value.

Referenced by __ast_read().

◆ ast_channel_dtmff()

struct ast_frame * ast_channel_dtmff ( struct ast_channel chan)

Definition at line 747 of file channel_internal_api.c.

748{
749 return &chan->dtmff;
750}
struct ast_frame dtmff

References ast_channel::dtmff.

Referenced by __ast_read(), and queue_dtmf_readq().

◆ ast_channel_dtmff_set()

void ast_channel_dtmff_set ( struct ast_channel chan,
struct ast_frame value 
)

Definition at line 803 of file channel_internal_api.c.

804{
805 chan->dtmff = *value;
806}

References ast_channel::dtmff, and value.

◆ ast_channel_early_bridge()

int ast_channel_early_bridge ( struct ast_channel c0,
struct ast_channel c1 
)

Bridge two channels together (early)

Parameters
c0first channel to bridge
c1second channel to bridge

Bridge two channels (c0 and c1) together early. This implies either side may not be answered yet.

Returns
Returns 0 on success and -1 if it could not be done

Definition at line 7464 of file channel.c.

7465{
7466 /* Make sure we can early bridge, if not error out */
7467 if (!ast_channel_tech(c0)->early_bridge || (c1 && (!ast_channel_tech(c1)->early_bridge || ast_channel_tech(c0)->early_bridge != ast_channel_tech(c1)->early_bridge)))
7468 return -1;
7469
7470 return ast_channel_tech(c0)->early_bridge(c0, c1);
7471}
enum ast_bridge_result(*const early_bridge)(struct ast_channel *c0, struct ast_channel *c1)
Bridge two channels of the same type together (early)
Definition channel.h:788

References ast_channel_tech::early_bridge.

Referenced by dial_exec_full(), and wait_for_answer().

◆ ast_channel_emulate_dtmf_duration()

unsigned int ast_channel_emulate_dtmf_duration ( const struct ast_channel chan)

Definition at line 381 of file channel_internal_api.c.

382{
383 return chan->emulate_dtmf_duration;
384}
unsigned int emulate_dtmf_duration

References ast_channel::emulate_dtmf_duration.

Referenced by __ast_read().

◆ ast_channel_emulate_dtmf_duration_set()

void ast_channel_emulate_dtmf_duration_set ( struct ast_channel chan,
unsigned int  value 
)

Definition at line 385 of file channel_internal_api.c.

386{
388}

References ast_channel::emulate_dtmf_duration, and value.

Referenced by __ast_read().

◆ ast_channel_end_dtmf()

void ast_channel_end_dtmf ( struct ast_channel chan,
char  digit,
struct timeval  start,
const char *  why 
)

Simulate a DTMF end on a broken bridge channel.

Parameters
chanChannel sending DTMF that has not ended.
digitDTMF digit to stop.
startDTMF digit start time.
whyReason bridge broken.

Definition at line 10957 of file channel.c.

10958{
10959 int dead;
10960 long duration;
10961
10962 ast_channel_lock(chan);
10965 & ~AST_SOFTHANGUP_ASYNCGOTO);
10966 ast_channel_unlock(chan);
10967 if (dead) {
10968 /* Channel is a zombie or a real hangup. */
10969 return;
10970 }
10971
10972 duration = ast_tvdiff_ms(ast_tvnow(), start);
10973 if (duration < option_dtmfminduration) {
10974 duration = option_dtmfminduration;
10975 }
10976 ast_senddigit_end(chan, digit, duration);
10977 ast_log(LOG_DTMF, "DTMF end '%c' simulated on %s due to %s, duration %ld ms\n",
10978 digit, ast_channel_name(chan), why, duration);
10979}
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition channel.c:4959
unsigned int option_dtmfminduration
Definition options.c:84
#define LOG_DTMF

References ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_softhangup_internal_flag(), ast_channel_unlock, AST_FLAG_ZOMBIE, ast_log, ast_senddigit_end(), ast_test_flag, ast_tvdiff_ms(), ast_tvnow(), digit, LOG_DTMF, and option_dtmfminduration.

Referenced by bridge_channel_internal_join(), and channel_do_masquerade().

◆ ast_channel_endpoint()

struct ast_endpoint * ast_channel_endpoint ( const struct ast_channel chan)

Definition at line 1580 of file channel_internal_api.c.

1581{
1582 return chan->endpoint;
1583}

References ast_channel::endpoint.

◆ ast_channel_endpoint_set()

void ast_channel_endpoint_set ( struct ast_channel chan,
struct ast_endpoint endpoint 
)

Definition at line 1585 of file channel_internal_api.c.

1586{
1587 if (chan->endpoint) {
1589 ao2_ref(chan->endpoint, -1);
1590 }
1591
1592 chan->endpoint = ao2_bump(endpoint);
1593
1594 if (chan->endpoint) {
1596 }
1597}
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition astobj2.h:480
int ast_endpoint_add_channel(struct ast_endpoint *endpoint, struct ast_channel *chan)
Adds a channel to the given endpoint.
int ast_endpoint_remove_channel(struct ast_endpoint *endpoint, struct ast_channel *chan)
Removes a channel from the given endpoint.

References ao2_bump, ao2_ref, ast_endpoint_add_channel(), ast_endpoint_remove_channel(), and ast_channel::endpoint.

Referenced by __ast_channel_alloc_ap(), and ast_channel_destructor().

◆ ast_channel_epfd()

int ast_channel_epfd ( const struct ast_channel chan)

◆ ast_channel_epfd_set()

void ast_channel_epfd_set ( struct ast_channel chan,
int  value 
)

◆ ast_channel_errno()

enum ast_channel_error ast_channel_errno ( void  )

Get error code for latest channel operation.

Definition at line 11049 of file channel.c.

11050{
11052}
enum ast_channel_error ast_channel_internal_errno(void)

References ast_channel_internal_errno().

Referenced by ari_channels_handle_originate_with_id(), and ast_ari_channels_create().

◆ ast_channel_exten()

const char * ast_channel_exten ( const struct ast_channel chan)

◆ ast_channel_exten_set()

void ast_channel_exten_set ( struct ast_channel chan,
const char *  value 
)

Definition at line 240 of file channel_internal_api.c.

241{
242 if (!*chan->lastexten || strcmp(value, chan->exten)) {
243 /* only copy to last exten when it changes, unless it's empty to begin with */
244 ast_copy_string(chan->lastexten, chan->exten, sizeof(chan->lastexten));
245 }
246 ast_copy_string(chan->exten, value, sizeof(chan->exten));
248}
char lastexten[AST_MAX_EXTENSION]

References AST_CHANNEL_SNAPSHOT_INVALIDATE_DIALPLAN, ast_channel_snapshot_invalidate_segment(), ast_copy_string(), ast_channel::exten, ast_channel::lastexten, and value.

Referenced by __analog_ss_thread(), __ast_channel_alloc_ap(), __ast_request_and_dial(), action_dialplan_exec(), analog_ss_thread(), ari_originate_dial(), ast_add_extension2_lockopt(), ast_bridge_setup_after_goto(), ast_cel_fabricate_channel_from_event(), ast_explicit_goto(), ast_iax2_new(), ast_pbx_h_exten_run(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), dahdi_new(), dial_exec_full(), dialout(), do_monitor_headset(), do_notify(), forward_message(), generic_recall(), gosub_exec(), gosub_run(), handle_gosub(), handle_response_cmgr(), handle_setextension(), jingle_new(), leave_voicemail(), minivm_greet_exec(), ooh323_new(), pbx_builtin_background(), pbx_extension_helper(), pbx_outgoing_exec(), return_exec(), ring_entry(), select_entry(), set_ext_pri(), unistim_ss(), and wait_for_answer().

◆ ast_channel_fd()

int ast_channel_fd ( const struct ast_channel chan,
int  which 
)

Definition at line 1053 of file channel_internal_api.c.

1054{
1055 return (which >= AST_VECTOR_SIZE(&chan->fds)) ? -1 : AST_VECTOR_GET(&chan->fds, which);
1056}
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition vector.h:620
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition vector.h:691

References AST_VECTOR_GET, and AST_VECTOR_SIZE.

Referenced by __dahdi_exception(), analog_exception(), ast_channel_fd_isset(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_waitfor_nandfds(), build_conf(), channel_do_masquerade(), conf_run(), flash_exec(), meetme_menu_admin_extended(), native_chan_changed(), native_start(), serialize_showchan(), and swap_subs().

◆ ast_channel_fd_add()

int ast_channel_fd_add ( struct ast_channel chan,
int  value 
)

Add a file descriptor to the channel without a fixed position.

Since
15
Parameters
chanThe channel to add the file descriptor to
valueThe file descriptor
Precondition
chan is locked
Returns
The position of the file descriptor

Definition at line 1067 of file channel_internal_api.c.

1068{
1069 int pos = AST_EXTENDED_FDS;
1070
1071 while (ast_channel_fd_isset(chan, pos)) {
1072 pos += 1;
1073 }
1074
1075 AST_VECTOR_REPLACE(&chan->fds, pos, value);
1076
1077 return pos;
1078}
#define AST_EXTENDED_FDS
Definition channel.h:197
int ast_channel_fd_isset(const struct ast_channel *chan, int which)
#define AST_VECTOR_REPLACE(vec, idx, elem)
Replace an element at a specific position in a vector, growing the vector if needed.
Definition vector.h:295

References ast_channel_fd_isset(), AST_EXTENDED_FDS, AST_VECTOR_REPLACE, and value.

Referenced by AST_TEST_DEFINE().

◆ ast_channel_fd_count()

int ast_channel_fd_count ( const struct ast_channel chan)

Retrieve the number of file decriptor positions present on the channel.

Since
15
Parameters
chanThe channel to get the count of
Precondition
chan is locked
Returns
The number of file descriptor positions

Definition at line 1062 of file channel_internal_api.c.

1063{
1064 return AST_VECTOR_SIZE(&chan->fds);
1065}

References AST_VECTOR_SIZE.

Referenced by AST_TEST_DEFINE(), ast_waitfor_nandfds(), and channel_do_masquerade().

◆ ast_channel_fd_isset()

int ast_channel_fd_isset ( const struct ast_channel chan,
int  which 
)

Definition at line 1057 of file channel_internal_api.c.

1058{
1059 return ast_channel_fd(chan, which) > -1;
1060}
int ast_channel_fd(const struct ast_channel *chan, int which)

References ast_channel_fd().

Referenced by __ast_read(), and ast_channel_fd_add().

◆ ast_channel_fdno()

int ast_channel_fdno ( const struct ast_channel chan)

◆ ast_channel_fdno_set()

void ast_channel_fdno_set ( struct ast_channel chan,
int  value 
)

Definition at line 294 of file channel_internal_api.c.

295{
296 chan->fdno = value;
297}

References ast_channel::fdno, and value.

Referenced by __ast_read(), ast_settimeout_full(), ast_waitfor_nandfds(), channel_do_masquerade(), and read_test().

◆ ast_channel_feature_hooks_append()

int ast_channel_feature_hooks_append ( struct ast_channel chan,
struct ast_bridge_features features 
)

Appends to the channel-attached features a channel has access to upon being bridged.

Note
The channel must be locked when calling this function.
Parameters
chanWhich channel to set features for
featuresThe feature set to append to the channel's features
Return values
0on success
-1on failure

Definition at line 11039 of file channel.c.

11040{
11041 return channel_feature_hooks_set_full(chan, features, 0);
11042}
static int channel_feature_hooks_set_full(struct ast_channel *chan, struct ast_bridge_features *features, int replace)
Definition channel.c:11002

References channel_feature_hooks_set_full().

Referenced by AST_TEST_DEFINE(), and AST_TEST_DEFINE().

◆ ast_channel_feature_hooks_get()

struct ast_bridge_features * ast_channel_feature_hooks_get ( struct ast_channel chan)

Gets the channel-attached features a channel has access to upon being bridged.

Note
The channel must be locked when calling this function.
Parameters
chanWhich channel to get features for
Return values
non-NULLThe features currently set for this channel
NULLif the features have not been set

Definition at line 10991 of file channel.c.

10992{
10993 struct ast_datastore *datastore;
10994
10996 if (!datastore) {
10997 return NULL;
10998 }
10999 return datastore->data;
11000}
static const struct ast_datastore_info bridge_features_info
Definition channel.c:10986
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Definition channel.c:2390

References ast_channel_datastore_find(), bridge_features_info, ast_datastore::data, and NULL.

Referenced by bridge_channel_internal_join().

◆ ast_channel_feature_hooks_replace()

int ast_channel_feature_hooks_replace ( struct ast_channel chan,
struct ast_bridge_features features 
)

Sets the channel-attached features a channel has access to upon being bridged.

Note
The channel must be locked when calling this function.
Parameters
chanWhich channel to set features for
featuresThe feature set with which to replace the channel's features
Return values
0on success
-1on failure

Definition at line 11044 of file channel.c.

11045{
11046 return channel_feature_hooks_set_full(chan, features, 1);
11047}

References channel_feature_hooks_set_full().

◆ ast_channel_fin()

unsigned int ast_channel_fin ( const struct ast_channel chan)

Definition at line 389 of file channel_internal_api.c.

390{
391 return chan->fin;
392}
unsigned int fin

References ast_channel::fin.

Referenced by __ast_read(), channel_set_debug(), and serialize_showchan().

◆ ast_channel_fin_set()

void ast_channel_fin_set ( struct ast_channel chan,
unsigned int  value 
)

Definition at line 393 of file channel_internal_api.c.

394{
395 chan->fin = value;
396}

References ast_channel::fin, and value.

Referenced by __ast_channel_alloc_ap(), __ast_read(), and channel_set_debug().

◆ ast_channel_flags()

struct ast_flags * ast_channel_flags ( struct ast_channel chan)

Definition at line 1127 of file channel_internal_api.c.

1128{
1129 return &chan->flags;
1130}
struct ast_flags flags

References ast_channel::flags.

Referenced by __analog_ss_thread(), __ast_pbx_run(), __ast_queue_frame(), __ast_read(), __ast_request_and_dial(), action_bridge(), action_redirect(), agent_request_exec(), analog_ss_thread(), ari_channels_handle_originate_with_id(), ast_async_goto(), ast_audiohook_attach(), ast_autoservice_start(), ast_autoservice_stop(), ast_bridge_channel_playfile(), ast_bridge_join(), ast_bridge_setup_after_goto(), ast_call(), ast_can_pickup(), ast_channel_clear_flag(), ast_channel_defer_dtmf(), ast_channel_destructor(), ast_channel_end_dtmf(), ast_channel_move(), ast_channel_publish_snapshot(), ast_channel_set_flag(), ast_channel_snapshot_create(), ast_channel_stage_snapshot(), ast_channel_stage_snapshot_done(), ast_channel_yank(), ast_explicit_goto(), ast_hangup(), ast_iax2_new(), ast_indicate_data(), ast_pbx_h_exten_run(), ast_raw_answer_with_stream_topology(), ast_readstring_full(), ast_rtp_instance_set_stats_vars(), ast_sendtext_data(), ast_setstate(), ast_settimeout_full(), ast_softhangup_nolock(), ast_streamfile(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_transfer_protocol(), ast_unreal_new_channels(), ast_var_channels_table(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write_stream(), audiosocket_request(), bridge_channel_internal_join(), bridge_channel_internal_pull(), bridge_impart_internal(), bridge_reconfigured_connected_line_update(), call_forward_inherit(), channel_do_masquerade(), channel_spy(), common_exec(), dahdi_new(), dahdi_read(), deactivate_generator_nolock(), dial_exec_full(), eivr_comm(), gosub_exec(), gosub_run(), handle_exec(), handle_gosub(), limits_interval_playback(), linear_alloc(), local_ast_moh_start(), local_ast_moh_stop(), multicast_rtp_request(), optimize_lock_chan_stack(), optimize_lock_peer_stack(), pbx_builtin_background(), pbx_outgoing_attempt(), playtones_alloc(), retrydial_exec(), return_exec(), serialize_showchan(), should_skip_dtmf(), should_trigger_dtmf_emulating(), stasis_app_control_snoop(), tonepair_alloc(), unicast_rtp_request(), waitstream_core(), and webchan_request().

◆ ast_channel_forward_endpoint()

int ast_channel_forward_endpoint ( struct ast_channel chan,
struct ast_endpoint endpoint 
)

Forward channel stasis messages to the given endpoint.

Since
12
Parameters
chanThe channel to forward from
endpointThe endpoint to forward to
Return values
0Success
non-zeroFailure

Definition at line 1427 of file channel_internal_api.c.

1429{
1430 ast_assert(chan != NULL);
1431 ast_assert(endpoint != NULL);
1432
1433 chan->endpoint_forward =
1435 ast_endpoint_topic(endpoint));
1436 if (!chan->endpoint_forward) {
1437 return -1;
1438 }
1439
1440 return 0;
1441}
struct stasis_topic * ast_channel_topic(struct ast_channel *chan)
A topic which publishes the events for a particular channel.
struct stasis_topic * ast_endpoint_topic(struct ast_endpoint *endpoint)
Returns the topic for a specific endpoint.
struct stasis_forward * stasis_forward_all(struct stasis_topic *from_topic, struct stasis_topic *to_topic)
Create a subscription which forwards all messages from one topic to another.
Definition stasis.c:1645
struct stasis_forward * endpoint_forward
#define ast_assert(a)
Definition utils.h:779

References ast_assert, ast_channel_topic(), ast_endpoint_topic(), ast_channel::endpoint_forward, NULL, and stasis_forward_all().

Referenced by ast_endpoint_add_channel().

◆ ast_channel_fout()

unsigned int ast_channel_fout ( const struct ast_channel chan)

Definition at line 397 of file channel_internal_api.c.

398{
399 return chan->fout;
400}
unsigned int fout

References ast_channel::fout.

Referenced by ast_write_stream(), channel_set_debug(), and serialize_showchan().

◆ ast_channel_fout_set()

void ast_channel_fout_set ( struct ast_channel chan,
unsigned int  value 
)

Definition at line 401 of file channel_internal_api.c.

402{
403 chan->fout = value;
404}

References ast_channel::fout, and value.

Referenced by __ast_channel_alloc_ap(), ast_write_stream(), and channel_set_debug().

◆ ast_channel_framehooks()

struct ast_framehook_list * ast_channel_framehooks ( const struct ast_channel chan)

◆ ast_channel_framehooks_set()

void ast_channel_framehooks_set ( struct ast_channel chan,
struct ast_framehook_list value 
)

Definition at line 576 of file channel_internal_api.c.

577{
578 chan->framehooks = value;
579}

References ast_channel::framehooks, and value.

Referenced by ast_framehook_attach(), and ast_framehook_list_destroy().

◆ ast_channel_generator()

struct ast_generator * ast_channel_generator ( const struct ast_channel chan)

◆ ast_channel_generator_set()

void ast_channel_generator_set ( struct ast_channel chan,
struct ast_generator value 
)

Definition at line 584 of file channel_internal_api.c.

585{
586 chan->generator = value;
587}

References ast_channel::generator, and value.

Referenced by ast_activate_generator(), ast_hangup(), and deactivate_generator_nolock().

◆ ast_channel_generatordata()

void * ast_channel_generatordata ( const struct ast_channel chan)

◆ ast_channel_generatordata_set()

void ast_channel_generatordata_set ( struct ast_channel chan,
void *  value 
)

◆ ast_channel_get_ari_vars()

struct varshead * ast_channel_get_ari_vars ( struct ast_channel chan)

Gets the variables for a given channel, as specified by ast_channel_set_ari_vars().

Since
14.2.0

The returned variable list is an AO2 object, so ao2_cleanup() to free it.

Parameters
chanChannel to get variables for.
Returns
List of channel variables.
Return values
NULLon error

Definition at line 8013 of file channel.c.

8014{
8015 return channel_get_external_vars(&ari_vars, chan);
8016}
static struct varshead * channel_get_external_vars(struct external_vars *channelvars, struct ast_channel *chan)
Definition channel.c:7961
static struct external_vars ari_vars
Definition channel.c:7857

References ari_vars, and channel_get_external_vars().

Referenced by ast_channel_snapshot_create().

◆ ast_channel_get_bridge()

struct ast_bridge * ast_channel_get_bridge ( const struct ast_channel chan)

Get the bridge associated with a channel.

Since
12.0.0
Parameters
chanThe channel whose bridge we want

The bridge returned has its reference count incremented. Use ao2_cleanup() or ao2_ref() in order to decrement the reference count when you are finished with the bridge.

Note
This function expects the channel to be locked prior to being called and will not grab the channel lock.
Return values
NULLNo bridge present on the channel
non-NULLThe bridge the channel is in

Definition at line 10622 of file channel.c.

10623{
10624 struct ast_bridge *bridge;
10625
10626 bridge = ast_channel_internal_bridge(chan);
10627 if (bridge) {
10628 ao2_ref(bridge, +1);
10629 }
10630 return bridge;
10631}

References ao2_ref, and ast_channel_internal_bridge().

Referenced by ast_bridge_add_channel(), ast_bridge_transfer_acquire_bridge(), ast_channel_bridge_peer(), bridgeadd_exec(), channel_snapshot_bridge_create(), generate_status(), get_transfer_parties(), handle_showchan(), manager_bridge_kick(), native_rtp_framehook(), and serialize_showchan().

◆ ast_channel_get_bridge_channel()

struct ast_bridge_channel * ast_channel_get_bridge_channel ( struct ast_channel chan)

Get a reference to the channel's bridge pointer.

Since
12.0.0
Parameters
chanThe channel whose bridge channel is desired
Note
This increases the reference count of the bridge_channel. Use ao2_ref() or ao2_cleanup() to decrement the refcount when you are finished with it.
It is expected that the channel is locked prior to placing this call.
Return values
NULLThe channel has no bridge_channel
non-NULLA reference to the bridge_channel

Definition at line 10670 of file channel.c.

10671{
10672 struct ast_bridge_channel *bridge_channel;
10673
10674 bridge_channel = ast_channel_internal_bridge_channel(chan);
10675 if (bridge_channel) {
10676 ao2_ref(bridge_channel, +1);
10677 }
10678 return bridge_channel;
10679}

References ao2_ref, ast_channel_internal_bridge_channel(), and ast_bridge_channel::chan.

Referenced by __analog_ss_thread(), agent_bridge_channel_get_lock(), analog_ss_thread(), ast_bridge_add_channel(), ast_bridge_notify_masquerade(), ast_bridge_transfer_attended(), ast_bridge_transfer_blind(), bridge_channel_internal_queue_attended_transfer(), bridge_channel_internal_queue_blind_transfer(), bridge_move(), dial_bridge_after_cb(), hold(), internal_bridge_after_cb(), manager_park_bridged(), parker_parked_call_message_response(), play_sound(), recall_pull(), ringing(), send_message(), set_interval_hook(), transfer_pull(), try_parking(), and unhold().

◆ ast_channel_get_by_exten()

struct ast_channel * ast_channel_get_by_exten ( const char *  exten,
const char *  context 
)

Find a channel by extension and context.

Parameters
extenthe extension to search for
contextthe context to search for

Return a channel that is currently at the specified extension and context.

Return values
achannel that is at the specified extension and context
NULLif no channel was found
Since
1.8

Definition at line 1430 of file channel.c.

1431{
1433 return NULL;
1434 }
1435 if (ast_strlen_zero(exten) || ast_strlen_zero(context)) {
1436 ast_log(LOG_ERROR, "exten and context must be provided\n");
1437 return NULL;
1438 }
1440}
static struct ast_channel * get_by_exten(struct ast_channelstorage_instance *driver, const char *exten, const char *context, int rdlock)

References ast_log, ast_strlen_zero(), CHANNELSTORAGE_API, ast_channel::context, current_channel_storage_instance, ast_channel::exten, get_by_exten(), LOG_ERROR, and NULL.

◆ ast_channel_get_by_name()

struct ast_channel * ast_channel_get_by_name ( const char *  search)

Find a channel by name or uniqueid.

Parameters
searchthe name or uniqueid of the channel to search for

First searches for a channel with a matching name. If not found a search for a channel with a matching uniqueid is done.

Return values
achannel with a matching name or uniqueid
NULLif no channel was found
Note
The fallback search by uniqueid is a historical thing. If you know the search term is a uniqueid, use ast_channel_get_by_uniqueid instead.
Since
1.8

Definition at line 1417 of file channel.c.

1418{
1420 return NULL;
1421 }
1422 if (ast_strlen_zero(name)) {
1423 ast_log(LOG_ERROR, "name must be provided\n");
1424 return NULL;
1425 }
1426
1427 return CHANNELSTORAGE_API(current_channel_storage_instance, get_by_name_prefix_or_uniqueid, name, 0, 1);
1428}

References ast_log, ast_strlen_zero(), CHANNELSTORAGE_API, current_channel_storage_instance, LOG_ERROR, name, and NULL.

Referenced by action_add_agi_cmd(), action_aocmessage(), action_atxfer(), action_blind_transfer(), action_cancel_atxfer(), action_getvar(), action_redirect(), action_sendtext(), action_setvar(), action_status(), action_timeout(), ari_channels_handle_originate_with_id(), ari_channels_handle_snoop_channel(), assign_uuid(), ast_ari_channels_create(), ast_ari_channels_dial(), ast_ari_channels_get_channel_var(), ast_ari_channels_hangup(), ast_ari_channels_rtpstatistics(), ast_ari_channels_transfer_progress(), ast_async_goto_by_name(), ast_manager_hangup_helper(), asyncgoto_exec(), bridge_channel_attended_transfer(), call_forwarded_handler(), channel_find(), channel_hangup_matches(), cli_channelstats_print_body(), common_exec(), controlplayback_manager(), do_broadcast(), find_control(), func_chan_exists_read(), func_export_write(), func_mchan_read(), func_mchan_write(), handle_cli_agi_add_cmd(), handle_core_set_debug_channel(), handle_dump_frames(), handle_getvariablefull(), handle_hangup(), handle_hangup(), handle_redirect(), handle_remb_set(), handle_set_chanvar(), handle_show_chanvar(), handle_show_hangup_channel(), handle_showchan(), handle_softhangup(), import_helper(), inherit_channel_vars_from_id(), manager_bridge_kick(), manager_mixmonitor(), manager_mute_mixmonitor(), manager_mutestream(), manager_optimize_away(), manager_park(), manager_play_dtmf(), manager_play_mf(), manager_send_flash(), manager_stop_mixmonitor(), moh_channel_thread(), parker_parked_call_message_response(), parking_park_bridge_channel(), push_notify_channel(), refer_progress_bridge(), rtp_check_timeout(), senddtmf_exec(), sendmf_exec(), sendsf_exec(), shared_read(), shared_write(), stasis_app_bridge_moh_channel(), stasis_app_bridge_moh_stop(), and stasis_app_bridge_playback_channel_find().

◆ ast_channel_get_by_name_prefix()

struct ast_channel * ast_channel_get_by_name_prefix ( const char *  name,
size_t  name_len 
)

Find a channel by a name prefix.

Parameters
searchThe channel name or uniqueid prefix to search for
lenOnly search for up to this many characters from the search term

Search for a channel that has the same name prefix as specified by the search term. If not found, search for an exact match on the uniqueid. Searching by partial uniqueid doesn't make any sense as it's usually a system-name plus a timestamp and is not supported.

Return values
achannel with a matching name or uniqueid
NULLif no channel was found
Note
The fallback search by uniqueid is a historical thing. If you know the search term is a uniqueid, use ast_channel_get_by_uniqueid instead.
Since
1.8

Definition at line 1400 of file channel.c.

1401{
1403 return NULL;
1404 }
1405 if (ast_strlen_zero(name)) {
1406 ast_log(LOG_ERROR, "name must be provided\n");
1407 return NULL;
1408 }
1409
1410 return CHANNELSTORAGE_API(current_channel_storage_instance, get_by_name_prefix_or_uniqueid, name, name_len, 1);
1411}

References ast_log, ast_strlen_zero(), CHANNELSTORAGE_API, current_channel_storage_instance, LOG_ERROR, name, and NULL.

Referenced by action_aocmessage(), action_bridge(), ast_parse_device_state(), bridge_exec(), bridgeadd_exec(), cc_generic_agent_stop_ringing(), common_exec(), handle_bridge_kick_channel(), handle_cli_mixmonitor(), shared_read(), and shared_write().

◆ ast_channel_get_by_uniqueid()

struct ast_channel * ast_channel_get_by_uniqueid ( const char *  uniqueid)

Find a channel by a uniqueid.

Parameters
uniqueidThe uniqueid to search for
Return values
achannel with the uniqueid specified by the arguments
NULLif no channel was found

Definition at line 1442 of file channel.c.

1443{
1445 return NULL;
1446 }
1447 if (ast_strlen_zero(uniqueid)) {
1448 ast_log(LOG_ERROR, "uniqueid must be provided\n");
1449 return NULL;
1450 }
1452}
static struct ast_channel * get_by_uniqueid(struct ast_channelstorage_instance *driver, const char *uniqueid, int lock)

References ast_log, ast_strlen_zero(), CHANNELSTORAGE_API, current_channel_storage_instance, get_by_uniqueid(), LOG_ERROR, NULL, and ast_channel::uniqueid.

◆ ast_channel_get_cc_agent_type()

int ast_channel_get_cc_agent_type ( struct ast_channel chan,
char *  agent_type,
size_t  size 
)

Find the appropriate CC agent type to use given a channel.

Since
1.8

During call completion, we will need to create a call completion agent structure. To figure out the type of agent to construct, we need to ask the channel driver for the appropriate type.

Prior to adding this function, the call completion core attempted to figure this out for itself by stripping the technology off the channel's name. However, in the case of chan_dahdi, there are multiple agent types registered, and so simply searching for an agent type called "DAHDI" is not possible. In a case where multiple agent types are defined, the channel driver must have a queryoption callback defined in its channel_tech, and the queryoption callback must handle AST_OPTION_CC_AGENT_TYPE

If a channel driver does not have a queryoption callback or if the queryoption callback does not handle AST_OPTION_CC_AGENT_TYPE, then the old behavior of using the technology portion of the channel name is used instead. This is perfectly suitable for channel drivers whose channel technologies are a one-to-one match with the agent types defined within.

Note that this function is only called when the agent policy on a given channel is set to "native." Generic agents' type can be determined automatically by the core.

Parameters
chanThe channel for which we wish to retrieve the agent type
[out]agent_typeThe type of agent the channel driver wants us to use
sizeThe size of the buffer to write to

Definition at line 10601 of file channel.c.

10602{
10603 int len = size;
10604 char *slash;
10605
10607 return 0;
10608 }
10609
10611 if ((slash = strchr(agent_type, '/'))) {
10612 *slash = '\0';
10613 }
10614 return 0;
10615}
int ast_channel_queryoption(struct ast_channel *chan, int option, void *data, int *datalen, int block)
Checks the value of an option.
Definition channel.c:7494
#define AST_OPTION_CC_AGENT_TYPE

References agent_type, ast_channel_name(), ast_channel_queryoption(), ast_copy_string(), AST_OPTION_CC_AGENT_TYPE, and len().

Referenced by find_agent_callbacks().

◆ ast_channel_get_cc_config_params()

struct ast_cc_config_params * ast_channel_get_cc_config_params ( struct ast_channel chan)

Get the CCSS parameters from a channel.

Since
1.8

This function makes use of datastore operations on the channel, so it is important to lock the channel before calling this function.

Warning
You should call this function only if ast_cc_is_enabled() returns true.
Parameters
chanChannel to retrieve parameters from
Return values
NULLFailure or CCSS is globally disabled.
non-NULLThe parameters desired

Definition at line 10558 of file channel.c.

10559{
10560 struct ast_datastore *cc_datastore;
10561
10562 if (!ast_cc_is_enabled()) {
10563 return NULL;
10564 }
10565
10566 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10567 /* If we can't find the datastore, it almost definitely means that the channel type being
10568 * used has not had its driver modified to parse CC config parameters. The best action
10569 * to take here is to create the parameters on the spot with the defaults set.
10570 */
10571 if (ast_channel_cc_params_init(chan, NULL)) {
10572 return NULL;
10573 }
10574 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10575 /* Should be impossible */
10576 return NULL;
10577 }
10578 }
10579
10580 ast_assert(cc_datastore->data != NULL);
10581 return cc_datastore->data;
10582}
int ast_cc_is_enabled(void)
Determine if CCSS is enabled.
Definition ccss.c:4540
int ast_channel_cc_params_init(struct ast_channel *chan, const struct ast_cc_config_params *base_params)
Set up datastore with CCSS parameters for a channel.
Definition channel.c:10535

References ast_assert, ast_cc_is_enabled(), ast_channel_cc_params_init(), ast_channel_datastore_find(), cc_channel_datastore_info, ast_datastore::data, and NULL.

Referenced by acf_cc_read(), acf_cc_write(), analog_call(), ast_cc_call_failed(), ast_cc_call_init(), ast_queue_cc_frame(), ast_unreal_call_setup(), ast_unreal_new_channels(), cc_agent_init(), cc_core_init_instance(), and find_agent_callbacks().

◆ ast_channel_get_current_storage_driver_name()

const char * ast_channel_get_current_storage_driver_name ( void  )

Get the name of the current channel storage driver.

Returns
The name of the current channel storage driver

Definition at line 8057 of file channel.c.

8058{
8061}
const struct ast_channelstorage_driver * current_channel_storage_driver
The current channel storage driver.

References current_channel_storage_driver, and ast_channelstorage_driver::driver_name.

Referenced by handle_show_settings().

◆ ast_channel_get_default_stream()

struct ast_stream * ast_channel_get_default_stream ( struct ast_channel chan,
enum ast_media_type  type 
)

Retrieve the default stream of a specific media type on a channel.

Parameters
chanThe channel to get the stream from
typeThe media type of the default stream
Precondition
chan is locked
Return values
non-NULLsuccess
NULLfailure

Definition at line 1535 of file channel_internal_api.c.

1537{
1538 ast_assert(chan != NULL);
1540
1541 return chan->default_streams[type];
1542}
@ AST_MEDIA_TYPE_END
Definition codec.h:36
struct ast_stream * default_streams[AST_MEDIA_TYPE_END]

References ast_assert, AST_MEDIA_TYPE_END, ast_channel::default_streams, NULL, and type.

Referenced by __ast_read(), ast_unreal_write_stream(), ast_write_stream(), and stream_echo_write_error().

◆ ast_channel_get_device_name()

int ast_channel_get_device_name ( struct ast_channel chan,
char *  device_name,
size_t  name_buffer_length 
)

Get a device name given its channel structure.

Since
1.8

A common practice in Asterisk is to determine the device being talked to by dissecting the channel name. For certain channel types, this is not accurate. For instance, an ISDN channel is named based on what B channel is used, not the device being communicated with.

This function interfaces with a channel tech's queryoption callback to retrieve the name of the device being communicated with. If the channel does not implement this specific option, then the traditional method of using the channel name is used instead.

Parameters
chanThe channel to retrieve the information from
[out]device_nameThe buffer to place the device's name into
name_buffer_lengthThe allocated space for the device_name
Returns
0 always

Definition at line 10584 of file channel.c.

10585{
10586 int len = name_buffer_length;
10587 char *dash;
10588 if (!ast_channel_queryoption(chan, AST_OPTION_DEVICE_NAME, device_name, &len, 0)) {
10589 return 0;
10590 }
10591
10592 /* Dang. Do it the old-fashioned way */
10593 ast_copy_string(device_name, ast_channel_name(chan), name_buffer_length);
10594 if ((dash = strrchr(device_name, '-'))) {
10595 *dash = '\0';
10596 }
10597
10598 return 0;
10599}
#define AST_OPTION_DEVICE_NAME

References ast_channel_name(), ast_channel_queryoption(), ast_copy_string(), AST_OPTION_DEVICE_NAME, and len().

Referenced by ast_cc_call_failed(), ast_cc_is_recall(), ast_queue_cc_frame(), cc_core_init_instance(), cccancel_exec(), ccreq_exec(), chan_pjsip_indicate(), dial_exec_full(), and func_channel_read().

◆ ast_channel_get_duration()

int ast_channel_get_duration ( struct ast_channel chan)

Obtain how long the channel since the channel was created.

Since
12
Parameters
chanThe channel object
Return values
0if the time value cannot be computed (or you called this really fast)
Thenumber of seconds the channel has been up

Definition at line 2842 of file channel.c.

2843{
2844 return (ast_channel_get_duration_ms(chan) / 1000);
2845}
int64_t ast_channel_get_duration_ms(struct ast_channel *chan)
Obtain how long it's been, in milliseconds, since the channel was created.
Definition channel.c:2832

References ast_channel_get_duration_ms().

Referenced by end_bridge_callback(), and serialize_showchan().

◆ ast_channel_get_duration_ms()

int64_t ast_channel_get_duration_ms ( struct ast_channel chan)

Obtain how long it's been, in milliseconds, since the channel was created.

Since
13.27.0
16.4.0
Parameters
chanThe channel object
Return values
0if the time value cannot be computed (or you called this really fast)
Thenumber of milliseconds since channel creation

Definition at line 2832 of file channel.c.

2833{
2834 ast_assert(NULL != chan);
2835
2837 return 0;
2838 }
2840}

References ast_assert, ast_channel_creationtime(), ast_tvdiff_ms(), ast_tvnow(), ast_tvzero(), and NULL.

Referenced by ast_channel_get_duration(), end_bridge_callback(), end_bridge_callback(), and queue_exec().

◆ ast_channel_get_intercept_mode()

int ast_channel_get_intercept_mode ( void  )

Am I currently running an intercept dialplan routine.

Since
13.14.0

A dialplan intercept routine is equivalent to an interrupt routine. As such, the routine must be done quickly and you do not have access to the media stream. These restrictions are necessary because the media stream is the responsibility of some other code and interfering with or delaying that processing is bad.

Return values
0Not in an intercept routine.
1In an intercept routine.

Definition at line 10417 of file channel.c.

10418{
10419 return ast_threadstorage_get_ptr(&in_intercept_routine) ? 1 : 0;
10420}
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.

References ast_threadstorage_get_ptr().

Referenced by run_agi().

◆ ast_channel_get_manager_vars()

struct varshead * ast_channel_get_manager_vars ( struct ast_channel chan)

Gets the variables for a given channel, as specified by ast_channel_set_manager_vars().

Since
12

The returned variable list is an AO2 object, so ao2_cleanup() to free it.

Parameters
chanChannel to get variables for.
Returns
List of channel variables.
Return values
NULLon error

Definition at line 8008 of file channel.c.

8009{
8010 return channel_get_external_vars(&ami_vars, chan);
8011}
static struct external_vars ami_vars
Definition channel.c:7856

References ami_vars, and channel_get_external_vars().

Referenced by append_channel_vars(), and ast_channel_snapshot_create().

◆ ast_channel_get_stream_topology()

struct ast_stream_topology * ast_channel_get_stream_topology ( const struct ast_channel chan)

◆ ast_channel_get_stream_topology_change_source()

void * ast_channel_get_stream_topology_change_source ( struct ast_channel chan)

Retrieve the source that initiated the last stream topology change.

Parameters
chanThe channel
Return values
Thechannel's stream topology change source

Definition at line 539 of file channel_internal_api.c.

540{
542}
void * stream_topology_change_source

References ast_channel::stream_topology_change_source.

Referenced by native_rtp_stream_topology_changed(), and simple_bridge_stream_topology_changed().

◆ ast_channel_get_t38_state()

static enum ast_t38_state ast_channel_get_t38_state ( struct ast_channel chan)
inlinestatic

Retrieves the current T38 state of a channel.

Note
Absolutely NO channel locks should be held before calling this function.

Definition at line 2910 of file channel.h.

2911{
2913 int datalen = sizeof(state);
2914
2916
2917 return state;
2918}

References ast_channel_queryoption(), AST_OPTION_T38_STATE, ast_channel::state, and T38_STATE_UNAVAILABLE.

Referenced by fax_gateway_detect_t38(), fax_gateway_detect_v21(), fax_gateway_framehook(), generic_fax_exec(), receivefax_exec(), receivefax_t38_init(), sendfax_exec(), sendfax_t38_init(), set_fax_t38_caps(), and spandsp_fax_gateway_start().

◆ ast_channel_get_up_time()

int ast_channel_get_up_time ( struct ast_channel chan)

Obtain how long it has been since the channel was answered.

Since
12
Parameters
chanThe channel object
Return values
0if the channel isn't answered (or you called this really fast)
Thenumber of seconds the channel has been up

Definition at line 2857 of file channel.c.

2858{
2859 return (ast_channel_get_up_time_ms(chan) / 1000);
2860}
int64_t ast_channel_get_up_time_ms(struct ast_channel *chan)
Obtain how long it has been since the channel was answered in ms.
Definition channel.c:2847

References ast_channel_get_up_time_ms().

Referenced by action_confbridgelist_item(), chan_pjsip_read_stream(), dahdi_read(), and end_bridge_callback().

◆ ast_channel_get_up_time_ms()

int64_t ast_channel_get_up_time_ms ( struct ast_channel chan)

Obtain how long it has been since the channel was answered in ms.

Since
13.27.0
16.4.0
Parameters
chanThe channel object
Return values
0if the channel isn't answered (or you called this really fast)
Thenumber of milliseconds the channel has been up

Definition at line 2847 of file channel.c.

2848{
2849 ast_assert(NULL != chan);
2850
2852 return 0;
2853 }
2855}

References ast_assert, ast_channel_answertime(), ast_tvdiff_ms(), ast_tvnow(), ast_tvzero(), and NULL.

Referenced by ast_channel_get_up_time(), and end_bridge_callback().

◆ ast_channel_get_vars()

struct varshead * ast_channel_get_vars ( struct ast_channel chan)

Gets the variables for a given channel, as set using pbx_builtin_setvar_helper().

Since
12

The returned variable list is an AO2 object, so ao2_cleanup() to free it.

Parameters
chanChannel to get variables for
Returns
List of channel variables.
Return values
NULLon error

Definition at line 7936 of file channel.c.

7937{
7938 RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
7939 struct ast_var_t *cv;
7940
7941 ret = ao2_alloc(sizeof(*ret), varshead_dtor);
7942
7943 if (!ret) {
7944 return NULL;
7945 }
7946
7949
7950 if (!var) {
7951 return NULL;
7952 }
7953
7955 }
7956
7957 ao2_ref(ret, +1);
7958 return ret;
7959}
#define var
Definition ast_expr2f.c:605
#define ao2_cleanup(obj)
Definition astobj2.h:1934
static void varshead_dtor(void *obj)
Destructor for lists of variables.
Definition channel.c:7926
const char * ast_var_name(const struct ast_var_t *var)
Definition chanvars.c:60
#define ast_var_assign(name, value)
Definition chanvars.h:40
const char * ast_var_value(const struct ast_var_t *var)
Definition chanvars.c:80
struct ast_var_t::@220 entries
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:981

References ao2_alloc, ao2_cleanup, ao2_ref, ast_channel_varshead(), AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_var_assign, ast_var_name(), ast_var_value(), ast_var_t::entries, NULL, RAII_VAR, var, and varshead_dtor().

◆ ast_channel_hangup_handlers()

struct ast_hangup_handler_list * ast_channel_hangup_handlers ( struct ast_channel chan)

◆ ast_channel_hangupcause()

int ast_channel_hangupcause ( const struct ast_channel chan)

◆ ast_channel_hangupcause_hash_set()

void ast_channel_hangupcause_hash_set ( struct ast_channel chan,
const struct ast_control_pvt_cause_code cause_code,
int  datalen 
)

Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.

Parameters
chanchannel on which to set the cause information
cause_codeast_control_pvt_cause_code structure containing cause information
datalentotal length of the structure since it may vary

Definition at line 4380 of file channel.c.

4381{
4382 char causevar[256];
4383
4384 if (ast_channel_dialed_causes_add(chan, cause_code, datalen)) {
4385 ast_log(LOG_WARNING, "Unable to store hangup cause for %s on %s\n", cause_code->chan_name, ast_channel_name(chan));
4386 }
4387
4388 if (cause_code->emulate_sip_cause) {
4389 snprintf(causevar, sizeof(causevar), "HASH(SIP_CAUSE,%s)", cause_code->chan_name);
4390 ast_func_write(chan, causevar, cause_code->code);
4391 }
4392}
int ast_func_write(struct ast_channel *chan, const char *function, const char *value)
executes a write operation on a function

References ast_channel_dialed_causes_add(), ast_channel_name(), ast_func_write(), ast_log, ast_control_pvt_cause_code::chan_name, ast_control_pvt_cause_code::code, ast_frame::datalen, ast_control_pvt_cause_code::emulate_sip_cause, and LOG_WARNING.

Referenced by __analog_handle_event(), __ast_request_and_dial(), chan_pjsip_incoming_response_update_cause(), indicate_data_internal(), jingle_action_session_terminate(), and socket_process_helper().

◆ ast_channel_hangupcause_set()

void ast_channel_hangupcause_set ( struct ast_channel chan,
int  value 
)

◆ ast_channel_hangupsource()

const char * ast_channel_hangupsource ( const struct ast_channel chan)

◆ ast_channel_has_ari_vars()

int ast_channel_has_ari_vars ( void  )

Return whether or not any ARI variables have been set.

Since
14.2.0
Return values
0if no ARI variables are expected
1if ARI variables are expected

Definition at line 7885 of file channel.c.

7886{
7888}
static int channel_has_external_vars(struct external_vars *channelvars)
Definition channel.c:7869

References ari_vars, and channel_has_external_vars().

◆ ast_channel_has_audio_frame_or_monitor()

int ast_channel_has_audio_frame_or_monitor ( struct ast_channel chan)

Check if the channel has active audiohooks, active framehooks, or a monitor.

Since
12.0.0
Parameters
chanThe channel to check.
Return values
non-zeroif channel has active audiohooks, framehooks, or monitor.

Definition at line 2529 of file channel.c.

2530{
2533}
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition audiohook.c:1108
int ast_framehook_list_contains_no_active(struct ast_framehook_list *framehooks)
Determine if a framehook list is free of active framehooks or not.
Definition framehook.c:282

References ast_audiohook_write_list_empty(), ast_channel_audiohooks(), ast_channel_framehooks(), and ast_framehook_list_contains_no_active().

Referenced by native_bridge_is_capable(), optimize_lock_chan_stack(), and optimize_lock_peer_stack().

◆ ast_channel_has_hook_requiring_audio()

int ast_channel_has_hook_requiring_audio ( struct ast_channel chan)

Check if the channel has any active hooks that require audio.

Since
12.3.0
Parameters
chanThe channel to check.
Return values
non-zeroif channel has active audiohooks, audio framehooks, or monitor.

Definition at line 2535 of file channel.c.

2536{
2539}
int ast_framehook_list_contains_no_active_of_type(struct ast_framehook_list *framehooks, enum ast_frame_type type)
Determine if a framehook list is free of active framehooks consuming a specific type of frame.
Definition framehook.c:287

References ast_audiohook_write_list_empty(), ast_channel_audiohooks(), ast_channel_framehooks(), AST_FRAME_VOICE, and ast_framehook_list_contains_no_active_of_type().

Referenced by native_rtp_bridge_capable().

◆ ast_channel_has_manager_vars()

int ast_channel_has_manager_vars ( void  )

Return whether or not any manager variables have been set.

Since
12.4.0
Return values
0if no manager variables are expected
1if manager variables are expected

Definition at line 7880 of file channel.c.

7881{
7883}

References ami_vars, and channel_has_external_vars().

Referenced by ast_channel_publish_varset().

◆ ast_channel_hold_state()

int ast_channel_hold_state ( const struct ast_channel chan)

◆ ast_channel_hold_state_set()

void ast_channel_hold_state_set ( struct ast_channel chan,
int  value 
)

Definition at line 361 of file channel_internal_api.c.

362{
363 chan->hold_state = value;
364}

References ast_channel::hold_state, and value.

Referenced by __ast_channel_alloc_ap(), __ast_dummy_channel_alloc(), and indicate_data_internal().

◆ ast_channel_inherit_variables()

void ast_channel_inherit_variables ( const struct ast_channel parent,
struct ast_channel child 
)

Inherits channel variable from parent to child channel.

Parameters
parentParent channel
childChild channel

Scans all channel variables in the parent channel, looking for those that should be copied into the child channel. Variables whose names begin with a single '_' are copied into the child channel with the prefix removed. Variables whose names begin with '__' are copied into the child channel with their names unchanged.

Definition at line 6811 of file channel.c.

6812{
6813 struct ast_var_t *current;
6814 struct ast_var_t *newvar;
6815 const char *varname;
6816 int vartype;
6817
6819 varname = ast_var_full_name(current);
6820 if (!varname) {
6821 continue;
6822 }
6823
6824 vartype = 0;
6825 if (varname[0] == '_') {
6826 vartype = 1;
6827 if (varname[1] == '_') {
6828 vartype = 2;
6829 }
6830 }
6831
6832 switch (vartype) {
6833 case 1:
6834 newvar = ast_var_assign(&varname[1], ast_var_value(current));
6835 break;
6836 case 2:
6837 newvar = ast_var_assign(varname, ast_var_value(current));
6838 break;
6839 default:
6840 continue;
6841 }
6842 if (newvar) {
6843 ast_debug(1, "Inheriting variable %s from %s to %s.\n",
6844 ast_var_full_name(newvar), ast_channel_name(parent),
6845 ast_channel_name(child));
6848 ast_var_value(newvar));
6849 }
6850 }
6851}
size_t current
const char * ast_var_full_name(const struct ast_var_t *var)
Definition chanvars.c:75
void ast_channel_publish_varset(struct ast_channel *chan, const char *variable, const char *value)
Publish a ast_channel_publish_varset for a channel.

References ast_channel_name(), ast_channel_publish_varset(), ast_channel_varshead(), ast_debug, AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_var_assign, ast_var_full_name(), ast_var_value(), current, and ast_var_t::entries.

Referenced by __ast_request_and_dial(), ast_ari_channels_dial(), begin_dial_prerun(), call_forward_inherit(), common_recall_channel_setup(), copy_caller_data(), dial_exec_full(), do_forward(), findmeexec(), park_local_transfer(), ring_entry(), and wait_for_answer().

◆ ast_channel_insmpl()

unsigned long ast_channel_insmpl ( const struct ast_channel chan)

Definition at line 405 of file channel_internal_api.c.

406{
407 return chan->insmpl;
408}
unsigned long insmpl

References ast_channel::insmpl.

◆ ast_channel_insmpl_set()

void ast_channel_insmpl_set ( struct ast_channel chan,
unsigned long  value 
)

Definition at line 409 of file channel_internal_api.c.

410{
411 chan->insmpl = value;
412}

References ast_channel::insmpl, and value.

◆ ast_channel_internal_alert_flush()

ast_alert_status_t ast_channel_internal_alert_flush ( struct ast_channel chan)

Definition at line 982 of file channel_internal_api.c.

983{
984 return ast_alertpipe_flush(chan->alertpipe);
985}
ast_alert_status_t ast_alertpipe_flush(int alert_pipe[2])
Consume all alerts written to the alert pipe.
Definition alertpipe.c:134

References ast_channel::alertpipe, and ast_alertpipe_flush().

Referenced by chan_cleanup().

◆ ast_channel_internal_alert_read()

ast_alert_status_t ast_channel_internal_alert_read ( struct ast_channel chan)

Definition at line 987 of file channel_internal_api.c.

988{
989 return ast_alertpipe_read(chan->alertpipe);
990}
ast_alert_status_t ast_alertpipe_read(int alert_pipe[2])
Read an event from an alert pipe.
Definition alertpipe.c:102

References ast_channel::alertpipe, and ast_alertpipe_read().

Referenced by __ast_queue_frame(), and __ast_read().

◆ ast_channel_internal_alert_readable()

int ast_channel_internal_alert_readable ( struct ast_channel chan)

Definition at line 997 of file channel_internal_api.c.

998{
999 return ast_alertpipe_readable(chan->alertpipe);
1000}
int attribute_pure ast_alertpipe_readable(int alert_pipe[2])
Determine if the alert pipe is readable.
Definition alertpipe.h:114

References ast_channel::alertpipe, and ast_alertpipe_readable().

◆ ast_channel_internal_alert_readfd()

int ast_channel_internal_alert_readfd ( struct ast_channel chan)

Definition at line 1017 of file channel_internal_api.c.

1018{
1019 return ast_alertpipe_readfd(chan->alertpipe);
1020}
int attribute_pure ast_alertpipe_readfd(int alert_pipe[2])
Get the alert pipe's read file descriptor.
Definition alertpipe.h:146

References ast_channel::alertpipe, and ast_alertpipe_readfd().

Referenced by __ast_channel_alloc_ap().

◆ ast_channel_internal_alertpipe_clear()

void ast_channel_internal_alertpipe_clear ( struct ast_channel chan)

Definition at line 1002 of file channel_internal_api.c.

1003{
1005}
void ast_alertpipe_clear(int alert_pipe[2])
Sets the alert pipe file descriptors to default values.
Definition alertpipe.h:98

References ast_channel::alertpipe, and ast_alertpipe_clear().

Referenced by __ast_channel_alloc_ap(), and __ast_dummy_channel_alloc().

◆ ast_channel_internal_alertpipe_close()

void ast_channel_internal_alertpipe_close ( struct ast_channel chan)

Definition at line 1007 of file channel_internal_api.c.

1008{
1010}
void ast_alertpipe_close(int alert_pipe[2])
Close an alert pipe.
Definition alertpipe.c:79

References ast_channel::alertpipe, and ast_alertpipe_close().

Referenced by ast_channel_destructor().

◆ ast_channel_internal_alertpipe_init()

int ast_channel_internal_alertpipe_init ( struct ast_channel chan)

Definition at line 1012 of file channel_internal_api.c.

1013{
1014 return ast_alertpipe_init(chan->alertpipe);
1015}
int ast_alertpipe_init(int alert_pipe[2])
Initialize an alert pipe.
Definition alertpipe.c:38

References ast_channel::alertpipe, and ast_alertpipe_init().

Referenced by __ast_channel_alloc_ap().

◆ ast_channel_internal_alertpipe_swap()

void ast_channel_internal_alertpipe_swap ( struct ast_channel chan1,
struct ast_channel chan2 
)

Swap the interal alertpipe between two channels.

Note
Handle all of the necessary locking before calling this

Definition at line 1022 of file channel_internal_api.c.

1023{
1024 ast_alertpipe_swap(chan1->alertpipe, chan2->alertpipe);
1025}
void ast_alertpipe_swap(int alert_pipe_1[2], int alert_pipe_2[2])
Swap the file descriptors from two alert pipes.
Definition alertpipe.h:161

References ast_channel::alertpipe, and ast_alertpipe_swap().

Referenced by channel_do_masquerade().

◆ ast_channel_internal_bridge()

struct ast_bridge * ast_channel_internal_bridge ( const struct ast_channel chan)

Definition at line 1107 of file channel_internal_api.c.

1108{
1109 return chan->bridge;
1110}
struct ast_bridge * bridge

References ast_channel::bridge.

Referenced by ast_channel_get_bridge(), ast_channel_is_bridged(), ast_unreal_fixup(), bridge_channel_internal_join(), and try_merge_optimize_out().

◆ ast_channel_internal_bridge_channel()

struct ast_bridge_channel * ast_channel_internal_bridge_channel ( const struct ast_channel chan)

◆ ast_channel_internal_bridge_channel_set()

void ast_channel_internal_bridge_channel_set ( struct ast_channel chan,
struct ast_bridge_channel value 
)

◆ ast_channel_internal_bridge_set()

void ast_channel_internal_bridge_set ( struct ast_channel chan,
struct ast_bridge value 
)

◆ ast_channel_internal_bridged_channel()

struct ast_channel * ast_channel_internal_bridged_channel ( const struct ast_channel chan)

◆ ast_channel_internal_bridged_channel_set()

void ast_channel_internal_bridged_channel_set ( struct ast_channel chan,
struct ast_channel value 
)

◆ ast_channel_internal_copy_linkedid()

void ast_channel_internal_copy_linkedid ( struct ast_channel dest,
struct ast_channel source 
)

Copy the full linkedid channel id structure from one channel to another.

Parameters
destDestination to copy linkedid to
sourceSource channel to copy linkedid from

Definition at line 1304 of file channel_internal_api.c.

1305{
1306 if (dest->linkedid.creation_time == source->linkedid.creation_time
1308 && !strcmp(dest->linkedid.unique_id, source->linkedid.unique_id)) {
1309 return;
1310 }
1311 dest->linkedid = source->linkedid;
1314}
@ AST_CHANNEL_SNAPSHOT_INVALIDATE_PEER
char unique_id[AST_MAX_UNIQUEID]

References ast_channel_publish_snapshot(), AST_CHANNEL_SNAPSHOT_INVALIDATE_PEER, ast_channel_snapshot_invalidate_segment(), ast_channel_id::creation_time, ast_channel_id::creation_unique, ast_channel::linkedid, and ast_channel_id::unique_id.

Referenced by ast_bridge_channel_update_linkedids().

◆ ast_channel_internal_fd_clear()

void ast_channel_internal_fd_clear ( struct ast_channel chan,
int  which 
)

Definition at line 1041 of file channel_internal_api.c.

1042{
1043 if (which >= AST_VECTOR_SIZE(&chan->fds)) {
1044 return;
1045 }
1046
1047 AST_VECTOR_REPLACE(&chan->fds, which, -1);
1048}

References AST_VECTOR_REPLACE, and AST_VECTOR_SIZE.

Referenced by handle_command(), and handle_negotiated_sdp().

◆ ast_channel_internal_fd_clear_all()

void ast_channel_internal_fd_clear_all ( struct ast_channel chan)

Definition at line 1049 of file channel_internal_api.c.

1050{
1052}
#define AST_VECTOR_RESET(vec, cleanup)
Reset vector.
Definition vector.h:636
#define AST_VECTOR_ELEM_CLEANUP_NOOP(elem)
Vector element cleanup that does nothing.
Definition vector.h:582

References AST_VECTOR_ELEM_CLEANUP_NOOP, and AST_VECTOR_RESET.

Referenced by __ast_channel_alloc_ap(), __ast_dummy_channel_alloc(), and channel_do_masquerade().

◆ ast_channel_internal_fd_set()

void ast_channel_internal_fd_set ( struct ast_channel chan,
int  which,
int  value 
)

Definition at line 1028 of file channel_internal_api.c.

1029{
1030 int pos;
1031
1032 /* This ensures that if the vector has to grow with unused positions they will be
1033 * initialized to -1.
1034 */
1035 for (pos = AST_VECTOR_SIZE(&chan->fds); pos < which; pos++) {
1036 AST_VECTOR_REPLACE(&chan->fds, pos, -1);
1037 }
1038
1039 AST_VECTOR_REPLACE(&chan->fds, which, value);
1040}

References AST_VECTOR_REPLACE, AST_VECTOR_SIZE, and value.

Referenced by ast_channel_set_fd(), handle_negotiated_sdp(), start_rtp(), swap_subs(), and unistim_new().

◆ ast_channel_internal_oldest_linkedid()

struct ast_channel * ast_channel_internal_oldest_linkedid ( struct ast_channel a,
struct ast_channel b 
)

Determine which channel has an older linkedid.

Parameters
aFirst channel
bSecond channel
Returns
Returns an ast_channel structure that has oldest linkedid

Definition at line 1287 of file channel_internal_api.c.

1288{
1289 ast_assert(a->linkedid.creation_time != 0);
1290 ast_assert(b->linkedid.creation_time != 0);
1291
1292 if (a->linkedid.creation_time < b->linkedid.creation_time) {
1293 return a;
1294 }
1295 if (b->linkedid.creation_time < a->linkedid.creation_time) {
1296 return b;
1297 }
1298 if (a->linkedid.creation_unique < b->linkedid.creation_unique) {
1299 return a;
1300 }
1301 return b;
1302}

References a, ast_assert, and b.

Referenced by ast_bridge_channel_update_linkedids().

◆ ast_channel_internal_set_fake_ids()

void ast_channel_internal_set_fake_ids ( struct ast_channel chan,
const char *  uniqueid,
const char *  linkedid 
)

Set uniqueid and linkedid string value only (not time)

Parameters
chanThe channel to set the uniqueid to
uniqueidThe uniqueid to set
linkedidThe linkedid to set
Note
This is used only by ast_cel_fabricate_channel_from_event() to create a temporary fake channel - time values are invalid

Definition at line 1381 of file channel_internal_api.c.

1382{
1383 ast_copy_string(chan->uniqueid.unique_id, uniqueid, sizeof(chan->uniqueid.unique_id));
1384 ast_copy_string(chan->linkedid.unique_id, linkedid, sizeof(chan->linkedid.unique_id));
1385}

References ast_copy_string(), ast_channel::linkedid, ast_channel_id::unique_id, and ast_channel::uniqueid.

Referenced by ast_cel_fabricate_channel_from_event().

◆ ast_channel_internal_swap_endpoint_forward()

void ast_channel_internal_swap_endpoint_forward ( struct ast_channel a,
struct ast_channel b 
)

Swap endpoint_forward between two channels.

Parameters
aFirst channel
bSecond channel
Note
This is used in masquerade to exchange endpoint details if one of the two or both the channels were created with endpoint

Definition at line 1354 of file channel_internal_api.c.

1355{
1356 struct stasis_forward *temp;
1357
1358 temp = a->endpoint_forward;
1359 a->endpoint_forward = b->endpoint_forward;
1360 b->endpoint_forward = temp;
1361}
Forwarding information.
Definition stasis.c:1598

References a, and b.

Referenced by channel_do_masquerade().

◆ ast_channel_internal_swap_endpoints()

void ast_channel_internal_swap_endpoints ( struct ast_channel a,
struct ast_channel b 
)

Swap endpoints between two channels.

Parameters
aFirst channel
bSecond channel
Note
This is used in masquerade to exchange endpoints

Definition at line 1372 of file channel_internal_api.c.

1373{
1374 struct ast_endpoint *endpoint;
1375
1376 endpoint = a->endpoint;
1377 a->endpoint = b->endpoint;
1378 b->endpoint = endpoint;
1379}

References a, and b.

Referenced by channel_do_masquerade().

◆ ast_channel_internal_swap_snapshots()

void ast_channel_internal_swap_snapshots ( struct ast_channel a,
struct ast_channel b 
)

Swap snapshots beteween two channels.

Parameters
aFirst channel
bSecond channel
Note
This is used in masquerade to exchange snapshots

Definition at line 1363 of file channel_internal_api.c.

1364{
1365 struct ast_channel_snapshot *snapshot;
1366
1367 snapshot = a->snapshot;
1368 a->snapshot = b->snapshot;
1369 b->snapshot = snapshot;
1370}

References a, and b.

Referenced by channel_do_masquerade().

◆ ast_channel_internal_swap_topics()

void ast_channel_internal_swap_topics ( struct ast_channel a,
struct ast_channel b 
)

Swap topics beteween two channels.

Parameters
aFirst channel
bSecond channel
Note
This is used in masquerade to exchange topics for message routing

Definition at line 1340 of file channel_internal_api.c.

1341{
1342 struct stasis_topic *topic;
1343 struct stasis_forward *forward;
1344
1345 topic = a->topic;
1346 a->topic = b->topic;
1347 b->topic = topic;
1348
1349 forward = a->channel_forward;
1350 a->channel_forward = b->channel_forward;
1351 b->channel_forward = forward;
1352}

References a, and b.

Referenced by channel_do_masquerade().

◆ ast_channel_internal_swap_uniqueid_and_linkedid()

void ast_channel_internal_swap_uniqueid_and_linkedid ( struct ast_channel a,
struct ast_channel b 
)

Swap uniqueid and linkedid beteween two channels.

Parameters
aFirst channel
bSecond channel
Note
This is used in masquerade to exchange identities

Definition at line 1316 of file channel_internal_api.c.

1317{
1318 struct ast_channel_id temp;
1319
1320 /* This operation is used as part of masquerading and so does not invalidate the peer
1321 * segment. This is due to the masquerade process invalidating all segments.
1322 */
1323
1324 /*
1325 * Since unique ids can be a key in the channel storage backend,
1326 * ensure that neither channel is linked in or the keys will be
1327 * invalid.
1328 */
1329 ast_assert(!a->linked_in_container && !b->linked_in_container);
1330
1331 temp = a->uniqueid;
1332 a->uniqueid = b->uniqueid;
1333 b->uniqueid = temp;
1334
1335 temp = a->linkedid;
1336 a->linkedid = b->linkedid;
1337 b->linkedid = temp;
1338}
Channel UniqueId structure.

References a, ast_assert, and b.

Referenced by channel_do_masquerade().

◆ ast_channel_is_bridged()

int ast_channel_is_bridged ( const struct ast_channel chan)

Determine if a channel is in a bridge.

Since
12.0.0
Parameters
chanThe channel to test
Note
This function expects the channel to be locked prior to being called and will not grab the channel lock.
Return values
0The channel is not bridged
non-zeroThe channel is bridged

Definition at line 10633 of file channel.c.

10634{
10635 return ast_channel_internal_bridge(chan) != NULL;
10636}

References ast_channel_internal_bridge(), and NULL.

Referenced by __ast_read(), action_redirect(), app_control_dial(), ast_async_goto(), ast_audiohook_attach(), ast_audiohook_remove(), ast_framehook_attach(), ast_framehook_detach(), ast_framehook_list_fixup(), ast_var_channel_bridge(), attach_barge(), audio_audiohook_write_list(), chan_pjsip_read_stream(), chan_pjsip_set_rtp_peer(), common_exec(), dtmf_audiohook_write_list(), mixmonitor_autochan_is_bridged(), set_caps(), set_timeout(), wait_for_bridged(), wait_for_bridged(), wait_for_unbridged(), and wait_for_unbridged().

◆ ast_channel_is_leaving_bridge()

int ast_channel_is_leaving_bridge ( struct ast_channel chan)

Determine if a channel is leaving a bridge, but not hung up.

Since
12.4.0
Parameters
chanThe channel to test
Note
If a channel is hung up, it is implicitly leaving any bridge it may be in. This function is used to test if a channel is leaving a bridge but may survive the experience, if it has a place to go to (dialplan or otherwise)
Return values
0The channel is not leaving the bridge or is hung up
non-zeroThe channel is leaving the bridge

Definition at line 10638 of file channel.c.

10639{
10640 int hangup_flags = ast_channel_softhangup_internal_flag(chan);
10641 int hangup_test = hangup_flags & AST_SOFTHANGUP_ASYNCGOTO;
10642 int unbridge = ast_channel_unbridged(chan);
10643
10644 /* This function should only return true if either the unbridged flag or
10645 * the ASYNCGOTO soft hangup flag is set and when no other soft hangup
10646 * flags are set. Any other soft hangup flags being set should make it
10647 * return false.
10648 */
10649 return ((hangup_test || unbridge) && (hangup_test == hangup_flags));
10650}

References ast_channel_softhangup_internal_flag(), ast_channel_unbridged(), and AST_SOFTHANGUP_ASYNCGOTO.

Referenced by ast_indicate_data(), and bridge_channel_internal_pull().

◆ ast_channel_is_multistream()

int ast_channel_is_multistream ( struct ast_channel chan)

Determine if a channel is multi-stream capable.

Parameters
chanThe channel to test
Precondition
chan is locked
Return values
trueif the channel is multi-stream capable.

Definition at line 1559 of file channel_internal_api.c.

1560{
1561 return (chan && chan->tech && chan->tech->read_stream && chan->tech->write_stream);
1562}
int(*const write_stream)(struct ast_channel *chan, int stream_num, struct ast_frame *frame)
Write a frame on a specific stream, in standard format (see frame.h)
Definition channel.h:773
struct ast_frame *(*const read_stream)(struct ast_channel *chan)
Read a frame (or chain of frames from the same stream), in standard format (see frame....
Definition channel.h:767

References ast_channel_tech::read_stream, ast_channel::tech, and ast_channel_tech::write_stream.

Referenced by ast_channel_nativeformats_set(), ast_channel_request_stream_topology_change(), ast_channel_set_stream_topology(), ast_channel_stream_topology_changed(), ast_channel_stream_topology_changed_externally(), ast_unreal_indicate(), ast_unreal_new_channels(), bridge_channel_write_frame(), bridge_handle_trip(), and stream_echo_write().

◆ ast_channel_is_t38_active()

int ast_channel_is_t38_active ( struct ast_channel chan)

This function will check if T.38 is active on the channel.

Parameters
chanChannel on which to check the unbridge_eval flag
Returns
Returns 0 if the flag is down or 1 if the flag is up.

Definition at line 913 of file channel_internal_api.c.

914{
915 int res;
916
917 ast_channel_lock(chan);
919 ast_channel_unlock(chan);
920 return res;
921}
int ast_channel_is_t38_active_nolock(struct ast_channel *chan)
ast_channel_is_t38_active variant. Use this if the channel is already locked prior to calling.

References ast_channel_is_t38_active_nolock(), ast_channel_lock, and ast_channel_unlock.

Referenced by bridge_channel_internal_join().

◆ ast_channel_is_t38_active_nolock()

int ast_channel_is_t38_active_nolock ( struct ast_channel chan)

ast_channel_is_t38_active variant. Use this if the channel is already locked prior to calling.

Parameters
chanChannel on which to check the is_t38_active flag
Returns
Returns 0 if the flag is down or 1 if the flag is up.

Definition at line 908 of file channel_internal_api.c.

909{
910 return chan->is_t38_active;
911}

References ast_channel::is_t38_active.

Referenced by ast_channel_is_t38_active().

◆ ast_channel_iterator_all_new()

struct ast_channel_iterator * ast_channel_iterator_all_new ( void  )

Create a new channel iterator.

After creating an iterator using this function, the ast_channel_iterator_next() function can be used to iterate through all channels that exist.

Note
You must call ast_channel_iterator_destroy() when done.
Return values
NULLon failure
anew channel iterator
Since
1.8

Definition at line 1380 of file channel.c.

1381{
1383 return NULL;
1384 }
1386}
static struct ast_channel_iterator * iterator_all_new(struct ast_channelstorage_instance *driver)

References CHANNELSTORAGE_API, current_channel_storage_instance, iterator_all_new(), and NULL.

Referenced by action_status(), ast_manager_hangup_helper(), ast_var_channel_bridge(), ast_var_channel_types_table(), ast_var_channels_table(), common_exec(), func_channels_read(), and handle_show_hangup_all().

◆ ast_channel_iterator_by_exten_new()

struct ast_channel_iterator * ast_channel_iterator_by_exten_new ( const char *  exten,
const char *  context 
)

Create a new channel iterator based on extension.

Parameters
extenThe extension that channels must be in
contextThe context that channels must be in

After creating an iterator using this function, the ast_channel_iterator_next() function can be used to iterate through all channels that are currently in the specified context and extension.

Note
You must call ast_channel_iterator_destroy() when done.
Return values
NULLon failure
anew channel iterator based on the specified parameters
Since
1.8

Definition at line 1357 of file channel.c.

1358{
1360 return NULL;
1361 }
1362 if (ast_strlen_zero(exten) || ast_strlen_zero(context)) {
1363 ast_log(LOG_ERROR, "exten and context must be provided\n");
1364 return NULL;
1365 }
1367}
static struct ast_channel_iterator * iterator_by_exten_new(struct ast_channelstorage_instance *driver, const char *exten, const char *context)

References ast_log, ast_strlen_zero(), CHANNELSTORAGE_API, current_channel_storage_instance, iterator_by_exten_new(), LOG_ERROR, and NULL.

Referenced by common_exec(), and pickup_by_exten().

◆ ast_channel_iterator_by_name_new()

struct ast_channel_iterator * ast_channel_iterator_by_name_new ( const char *  name,
size_t  name_len 
)

Create a new channel iterator based on name.

Parameters
namechannel name or channel uniqueid to match
name_lennumber of characters in the channel name to match on. This would be used to match based on name prefix. If matching on the full channel name is desired, then this parameter should be 0.

After creating an iterator using this function, the ast_channel_iterator_next() function can be used to iterate through all channels that exist that have the specified name or name prefix.

Note
You must call ast_channel_iterator_destroy() when done.
Return values
NULLon failure
anew channel iterator based on the specified parameters
Since
1.8

Definition at line 1368 of file channel.c.

1369{
1371 return NULL;
1372 }
1373 if (ast_strlen_zero(name)) {
1374 ast_log(LOG_ERROR, "name must be provided\n");
1375 return NULL;
1376 }
1378}
static struct ast_channel_iterator * iterator_by_name_new(struct ast_channelstorage_instance *driver, const char *name, size_t name_len)

References ast_log, ast_strlen_zero(), CHANNELSTORAGE_API, current_channel_storage_instance, iterator_by_name_new(), LOG_ERROR, name, and NULL.

Referenced by common_exec(), get_device_state_causing_channels(), and softhangup_exec().

◆ ast_channel_iterator_destroy()

struct ast_channel_iterator * ast_channel_iterator_destroy ( struct ast_channel_iterator i)

Destroy a channel iterator.

Parameters
ithe itereator to destroy

This function is used to destroy a channel iterator that was retrieved by using one of the channel_iterator_xxx_new() functions.

Return values
NULLfor convenience to clear out the pointer to the iterator that was just destroyed.
Since
1.8

Definition at line 1349 of file channel.c.

1350{
1352 return NULL;
1353 }
1355}
static struct ast_channel_iterator * iterator_destroy(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)

References CHANNELSTORAGE_API, current_channel_storage_instance, iterator_destroy(), and NULL.

Referenced by action_status(), ast_manager_hangup_helper(), ast_var_channel_bridge(), ast_var_channel_types_table(), ast_var_channels_table(), common_exec(), func_channels_read(), get_device_state_causing_channels(), handle_show_hangup_all(), pickup_by_exten(), and softhangup_exec().

◆ ast_channel_iterator_next()

struct ast_channel * ast_channel_iterator_next ( struct ast_channel_iterator i)

Get the next channel for a channel iterator.

Parameters
ithe channel iterator that was created using one of the channel_iterator_xxx_new() functions.

This function should be used to iterate through all channels that match a specified set of parameters that were provided when the iterator was created.

Return values
thenext channel that matches the parameters used when the iterator was created.
NULLif no more channels match the iterator parameters.
Since
1.8

Definition at line 1388 of file channel.c.

1389{
1391 return NULL;
1392 }
1394}
static struct ast_channel * iterator_next(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)

References CHANNELSTORAGE_API, current_channel_storage_instance, iterator_next(), and NULL.

Referenced by action_status(), ast_manager_hangup_helper(), ast_var_channel_bridge(), ast_var_channel_types_table(), ast_var_channels_table(), func_channels_read(), get_device_state_causing_channels(), handle_show_hangup_all(), next_channel(), pickup_by_exten(), and softhangup_exec().

◆ ast_channel_jb()

struct ast_jb * ast_channel_jb ( struct ast_channel chan)

◆ ast_channel_jb_set()

void ast_channel_jb_set ( struct ast_channel chan,
struct ast_jb value 
)

Definition at line 807 of file channel_internal_api.c.

808{
809 chan->jb = *value;
810}

References ast_channel::jb, and value.

◆ ast_channel_language()

const char * ast_channel_language ( const struct ast_channel chan)
Examples
app_skel.c.

Referenced by __analog_ss_thread(), acf_vm_info(), action_playback_and_continue(), action_toggle_mute_participants(), analog_ss_thread(), announce_to_dial(), announce_user_count(), app_exec(), app_exec(), ast_app_getdata_full(), ast_app_getdata_terminator(), ast_ari_channels_dial(), ast_play_and_wait(), ast_say_counted_adjective(), ast_say_counted_noun(), ast_say_date_with_format_gr(), ast_say_number_full_gr(), ast_send_image(), ast_stream_and_wait(), ast_unreal_call_setup(), ast_var_channels_table(), auth_exec(), background_detect_exec(), begin_dial_prerun(), channel_do_masquerade(), channel_snapshot_base_create(), common_exec(), conf_exec(), conf_get_pin(), conf_run(), confbridge_exec(), control_streamfile(), copy_message(), count_exec(), dial_exec_full(), dictate_exec(), do_directory(), eivr_comm(), find_conf_realtime(), findmeexec(), forward_message(), func_channel_read(), gen_nextfile(), get_folder(), get_folder2(), get_folder_ja(), handle_getoption(), handle_recordfile(), handle_sayalpha(), handle_saydate(), handle_saydatetime(), handle_saydigits(), handle_saynumber(), handle_sayphonetic(), handle_saytime(), handle_showchan(), handle_speechrecognize(), handle_streamfile(), iax2_call(), invent_message(), invent_message(), isAnsweringMachine(), leave_voicemail(), leave_voicemail(), limits_interval_playback(), meetme_menu_admin(), meetme_menu_admin_extended(), meetme_menu_normal(), minivm_greet_exec(), moh_files_next(), page_exec(), pbx_builtin_background(), pbx_builtin_saycharacters(), pbx_builtin_saycharacters_case(), pbx_builtin_saydigits(), pbx_builtin_saymoney(), pbx_builtin_saynumber(), pbx_builtin_sayordinal(), pbx_builtin_sayphonetic(), play_and_wait(), play_file(), play_mailbox_owner(), play_message(), play_message_callerid(), play_message_datetime(), play_message_duration(), play_record_review(), playback_common(), playback_exec(), privacy_exec(), readexten_exec(), record_exec(), retrydial_exec(), say_parking_space(), say_position(), sayfile_exec(), sayunixtime_exec(), select_item_menu(), serialize_showchan(), setup_env(), setup_privacy_args(), speech_background(), try_calling(), vm_authenticate(), vm_browse_messages(), vm_execmain(), vm_instructions(), vm_intro(), vm_intro_cs(), vm_intro_da(), vm_intro_de(), vm_intro_en(), vm_intro_es(), vm_intro_fr(), vm_intro_gr(), vm_intro_he(), vm_intro_is(), vm_intro_it(), vm_intro_ja(), vm_intro_multilang(), vm_intro_nl(), vm_intro_no(), vm_intro_pl(), vm_intro_pt(), vm_intro_pt_BR(), vm_intro_se(), vm_intro_vi(), vm_intro_zh(), vm_play_folder_name(), vmsayname_exec(), wait_for_answer(), and wait_for_winner().

◆ ast_channel_lastcontext()

const char * ast_channel_lastcontext ( const struct ast_channel chan)

Definition at line 219 of file channel_internal_api.c.

220{
221 return chan->lastcontext;
222}

References ast_channel::lastcontext.

Referenced by func_channel_read().

◆ ast_channel_lastexten()

const char * ast_channel_lastexten ( const struct ast_channel chan)

Definition at line 236 of file channel_internal_api.c.

237{
238 return chan->lastexten;
239}

References ast_channel::lastexten.

Referenced by func_channel_read().

◆ ast_channel_latest_musicclass()

const char * ast_channel_latest_musicclass ( const struct ast_channel chan)

◆ ast_channel_linkedid()

const char * ast_channel_linkedid ( const struct ast_channel chan)

◆ ast_channel_make_compatible()

int ast_channel_make_compatible ( struct ast_channel chan,
struct ast_channel peer 
)

Make the frame formats of two channels compatible.

Parameters
chanFirst channel to make compatible. Should be the calling party.
peerOther channel to make compatible. Should be the called party.
Note
Absolutely NO channel locks should be held before calling this function.

Set two channels to compatible frame formats in both directions. The path from peer to chan is made compatible first to allow for in-band audio in case the other direction cannot be made compatible.

Return values
0on success.
-1on error.

Definition at line 6755 of file channel.c.

6756{
6757 /*
6758 * Set up translation from the peer to the chan first in case we
6759 * need to hear any in-band tones and the other direction fails.
6760 */
6761 if (ast_channel_make_compatible_helper(peer, chan)) {
6762 return -1;
6763 }
6764
6765 /* Set up translation from the chan to the peer */
6766 if (ast_channel_make_compatible_helper(chan, peer)) {
6767 return -1;
6768 }
6769
6770 return 0;
6771}
static int ast_channel_make_compatible_helper(struct ast_channel *from, struct ast_channel *to)
Set up translation from one channel to another.
Definition channel.c:6676

References ast_channel_make_compatible_helper().

Referenced by app_exec(), dial_exec_full(), do_forward(), fax_detect_framehook(), fax_gateway_framehook(), native_bridge_join(), simple_bridge_join(), try_calling(), and wait_for_answer().

◆ ast_channel_masq()

struct ast_channel * ast_channel_masq ( const struct ast_channel chan)

Definition at line 472 of file channel_internal_api.c.

473{
474 return chan->masq;
475}
struct ast_channel * masq

References ast_channel::masq.

Referenced by ast_can_pickup(), ast_channel_log(), ast_hangup(), and ast_var_channels_table().

◆ ast_channel_masq_set()

void ast_channel_masq_set ( struct ast_channel chan,
struct ast_channel value 
)

Definition at line 476 of file channel_internal_api.c.

477{
478 chan->masq = value;
479}

References ast_channel::masq, and value.

Referenced by ast_channel_move(), and channel_do_masquerade().

◆ ast_channel_masqr()

struct ast_channel * ast_channel_masqr ( const struct ast_channel chan)

Definition at line 480 of file channel_internal_api.c.

481{
482 return chan->masqr;
483}
struct ast_channel * masqr

References ast_channel::masqr.

Referenced by ast_channel_log(), ast_hangup(), and ast_var_channels_table().

◆ ast_channel_masqr_set()

void ast_channel_masqr_set ( struct ast_channel chan,
struct ast_channel value 
)

Definition at line 484 of file channel_internal_api.c.

485{
486 chan->masqr = value;
487}

References ast_channel::masqr, and value.

Referenced by ast_channel_move(), and channel_do_masquerade().

◆ ast_channel_move()

int ast_channel_move ( struct ast_channel dest,
struct ast_channel source 
)

Move a channel from its current location to a new location.

Since
12

The intention of this function is to have the destination channel take on the identity of the source channel.

Note
This function is NOT intended to be used on bridged channels. If you wish to move an unbridged channel into the place of a bridged channel, then use ast_bridge_join() or ast_bridge_impart(). If you wish to move a bridged channel into the place of another bridged channel, then use ast_bridge_move().
When this function returns succesfully, the source channel is in a state where its continued use is unreliable.
absolutely NO channel locks should be held before calling this function.
Parameters
destThe place to move the source channel
sourceThe channel to move
Return values
0Success
non-zeroFailure

Definition at line 10754 of file channel.c.

10755{
10756 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
10758
10759 if (dest == source) {
10760 ast_log(LOG_WARNING, "Can't move channel '%s' into itself!\n",
10761 ast_channel_name(dest));
10762 return -1;
10763 }
10764
10765 ast_channel_lock_both(dest, source);
10766
10769 /* Zombies! Run! */
10771 "Can't move channel. One or both is dead (%s <-- %s)\n",
10772 ast_channel_name(dest), ast_channel_name(source));
10773 ast_channel_unlock(source);
10774 ast_channel_unlock(dest);
10775 return -1;
10776 }
10777
10778 ast_channel_masq_set(dest, source);
10779 ast_channel_masqr_set(source, dest);
10780
10781 blob = ast_json_pack("{s: s}",
10782 "newchanneluniqueid", ast_channel_uniqueid(dest));
10784
10785 ast_channel_unlock(dest);
10786 ast_channel_unlock(source);
10787
10788 channel_do_masquerade(dest, source);
10789 return 0;
10790}
ast_mutex_t lock
Definition app_sla.c:337
static void channel_do_masquerade(struct ast_channel *original, struct ast_channel *clonechan)
Masquerade a channel.
Definition channel.c:6897
static ast_mutex_t channel_move_lock
Definition channel.c:10752
struct stasis_message_type * ast_channel_masquerade_type(void)
Message type for when a channel is being masqueraded.
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition json.c:612
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition lock.h:596
Abstract JSON element (object, array, string, int, ...).

References ast_channel_flags(), ast_channel_lock_both, ast_channel_masq_set(), ast_channel_masqr_set(), ast_channel_masquerade_type(), ast_channel_name(), ast_channel_publish_blob(), ast_channel_uniqueid(), ast_channel_unlock, AST_FLAG_ZOMBIE, ast_json_pack(), ast_json_unref(), ast_log, ast_test_flag, channel_do_masquerade(), channel_move_lock, lock, LOG_WARNING, NULL, RAII_VAR, and SCOPED_MUTEX.

Referenced by after_bridge_move_channel(), ast_channel_yank(), ast_do_pickup(), local_call(), and refer_incoming_invite_request().

◆ ast_channel_music_state()

void * ast_channel_music_state ( const struct ast_channel chan)

◆ ast_channel_music_state_set()

void ast_channel_music_state_set ( struct ast_channel chan,
void *  value 
)

Definition at line 433 of file channel_internal_api.c.

434{
435 chan->music_state = value;
436}

References ast_channel::music_state, and value.

Referenced by local_ast_moh_cleanup(), moh_alloc(), and moh_files_alloc().

◆ ast_channel_musicclass()

const char * ast_channel_musicclass ( const struct ast_channel chan)

◆ ast_channel_name()

const char * ast_channel_name ( const struct ast_channel chan)

Referenced by __adsi_transmit_messages(), __analog_handle_event(), __analog_ss_thread(), __ast_answer(), __ast_change_name_nolink(), __ast_channel_alloc_ap(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __attempt_transmit(), __dahdi_exception(), __get_from_jb(), __print_debug_details(), _analog_get_index(), _create_event_MEDIA_START(), _dahdi_get_index(), _websocket_request_hangup(), acf_curl_helper(), acf_faxopt_read(), acf_faxopt_write(), acf_jabberreceive_read(), action_add_agi_cmd(), action_bridge(), action_confbridgesetsinglevideosrc(), action_dahdishowchannels(), action_kick_last(), action_meetmelist(), add_agi_cmd(), add_inheritable_header(), adsi_prog(), adsi_search_input(), agent_after_bridge_cb(), agent_after_bridge_cb_failed(), agent_function_read(), agent_handle_show_specific(), agent_request_exec(), agent_run(), agent_show_requested(), agents_sweep(), alarmreceiver_exec(), alloc_playback_chan(), analog_answer(), analog_attempt_transfer(), analog_call(), analog_callwaiting_deluxe(), analog_exception(), analog_fixup(), analog_handle_dtmf(), analog_hangup(), analog_ss_thread(), announce_to_dial(), answer(), aoc_attach_framehook(), aoc_display_decoded_debug(), aoc_framehook(), app_control_redirect(), app_exec(), app_exec(), app_notify(), append_channel_vars(), aqm_exec(), ari_bridges_play_new(), ari_originate_dial(), assign_uuid(), ast_agi_send(), ast_answer(), ast_ari_create_per_call_websocket(), ast_async_goto(), ast_audiohook_set_mute_all(), ast_audiosocket_connect(), ast_autochan_new_channel(), ast_autochan_setup(), ast_autoservice_start(), ast_autoservice_stop(), ast_bridge_add_channel(), ast_bridge_call_with_flags(), ast_bridge_channel_feature_digit(), ast_bridge_channel_kick(), ast_bridge_channel_leave_bridge_nolock(), ast_bridge_channel_queue_frame(), ast_bridge_channel_restore_formats(), ast_bridge_depart(), ast_bridge_features_ds_set_string(), ast_bridge_impart(), ast_bridge_join(), ast_bridge_remove(), ast_bridge_set_single_src_video_mode(), ast_bridge_transfer_attended(), ast_bridge_transfer_blind(), ast_bridge_update_talker_src_video_mode(), ast_call_forward(), ast_cc_call_init(), ast_cc_offer(), ast_channel_add_bridge_role(), ast_channel_callid_set(), ast_channel_clear_bridge_roles(), ast_channel_destructor(), ast_channel_end_dtmf(), ast_channel_get_cc_agent_type(), ast_channel_get_device_name(), ast_channel_hangupcause_hash_set(), ast_channel_inherit_variables(), ast_channel_log(), ast_channel_make_compatible_helper(), ast_channel_move(), ast_channel_nativeformats_set(), ast_channel_publish_final_snapshot(), ast_channel_publish_snapshot(), ast_channel_publish_varset(), ast_channel_remove_bridge_role(), ast_channel_request_stream_topology_change(), ast_channel_set_stream_topology(), ast_channel_softhangup_withcause_locked(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_channel_yank(), ast_check_hangup(), ast_cli_netstats(), ast_dial_append_channel(), ast_do_pickup(), ast_dsp_process(), ast_get_chan_applicationmap(), ast_hangup(), ast_iax2_new(), ast_jb_destroy(), ast_jb_put(), ast_manager_hangup_helper(), ast_pbx_h_exten_run(), ast_pbx_hangup_handler_show(), ast_pbx_outgoing_exten_predial(), ast_pickup_call(), ast_prod(), ast_raw_answer_with_stream_topology(), ast_readaudio_callback(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), ast_senddigit_begin(), ast_senddigit_mf_begin(), ast_sendtext_data(), ast_set_read_format_path(), ast_set_write_format_path(), ast_setstate(), ast_sip_session_get_name(), ast_sip_session_is_pending_stream_default(), ast_sip_session_regenerate_answer(), ast_softhangup_nolock(), ast_stir_shaken_add_result_to_channel(), ast_stir_shaken_as_ctx_create(), ast_stir_shaken_vs_ctx_create(), ast_str_retrieve_variable(), ast_streamfile(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_unreal_answer(), ast_unreal_fixup(), ast_unreal_hangup(), ast_var_channels_table(), ast_waitfor_nandfds(), ast_write_stream(), async_agi_read_frame(), attach_barge(), attach_framehook(), attempt_transfer(), attended_transfer_bridge(), attended_transfer_properties_alloc(), audiosocket_exec(), audiosocket_read(), audiosocket_run(), audiosocket_send_dtmf(), audiosocket_write(), background_detect_exec(), begin_dial_channel(), begin_dial_prerun(), blind_transfer_bridge(), bridge_channel_complete_join(), bridge_channel_dtmf_stream(), bridge_channel_feature_digit_add(), bridge_channel_handle_interval(), bridge_channel_handle_write(), bridge_channel_internal_join(), bridge_channel_internal_pull(), bridge_channel_internal_push_full(), bridge_channel_internal_queue_attended_transfer(), bridge_channel_moving(), bridge_channel_park(), bridge_channel_settle_owed_events(), bridge_channel_talking(), bridge_channel_wait(), bridge_dissolve(), bridge_do_move(), bridge_exec(), bridge_features_duration_callback(), bridge_impart_internal(), bridge_move_locked(), bridge_parking_push(), bridge_stasis_push(), bridge_stasis_push_peek(), bridge_stasis_run_cb(), bridgeadd_exec(), bridgewait_exec(), bridgewait_timeout_callback(), broadcast_exec(), builtin_features_helper(), by_name_cb(), calendar_event_read(), calendar_query_result_exec(), call(), cdr_prop_write(), cdr_prop_write_callback(), cdr_read(), cdr_read_callback(), cdr_retrieve_time(), cdr_write(), cdr_write_callback(), chan_pjsip_answer(), chan_pjsip_cng_tone_detected(), chan_pjsip_digit_end(), chan_pjsip_get_codec(), chan_pjsip_hangup(), chan_pjsip_incoming_response_update_cause(), chan_pjsip_indicate(), chan_pjsip_read_stream(), chan_pjsip_request_with_stream_topology(), chan_pjsip_sendtext_data(), chan_pjsip_session_end(), chan_pjsip_set_rtp_peer(), chan_pjsip_write_stream(), chan_rtp_get_codec(), chanavail_exec(), change_priority_caller_on_queue(), channel_cmp(), channel_cmp_cb(), channel_do_masquerade(), channel_fill_empty_accountcode(), channel_fill_empty_peeraccount(), channel_hash(), channel_read_pjsip(), channel_read_rtcp(), channel_read_rtp(), channel_set_debug(), channel_snapshot_base_create(), channel_spy(), channel_update_peeraccount(), channelstorage_name_cb(), comeback_goto(), common_exec(), complete_bridge_participant(), complete_confbridge_participant(), conf_exec(), conf_play(), conf_queue_dtmf(), conf_run(), conf_run(), conf_send_event_to_participants(), conf_update_user_mute(), confbridge_exec(), confbridge_handle_atxfer(), console_indicate(), control_streamfile(), cpeid_exec(), create_channel_name(), create_jb(), dahdi_call(), dahdi_digit_begin(), dahdi_digit_end(), dahdi_fake_event(), dahdi_fixup(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_new(), dahdi_queryoption(), dahdi_read(), dahdi_setoption(), dahdi_show_channel(), dahdi_softhangup_all(), dahdi_write(), dahdichan_helper(), deactivate_silence_generator(), defer_action(), defer_incoming_sdp_stream(), dequeue_frame(), detect_callback(), dial_bridge_after_cb(), dial_bridge_after_cb_failed(), dial_exec_full(), dial_masquerade_breakdown(), dial_masquerade_fixup(), dial_transfer(), dial_trunk(), directory_exec(), disa_exec(), disable_t38(), display_parked_call(), do_broadcast(), do_forward(), do_ids_conflict(), do_monitor(), do_waiting(), dtmf_mode_refresh_cb(), dtmfstore_exec(), dumpchan_exec(), dundi_lookup_internal(), dynamic_dtmf_hook_trip(), eagi_exec(), enable_jack_hook(), execute_menu_entry(), fast_originate(), fax_detect_framehook(), fax_gateway_detect_t38(), fax_gateway_detect_v21(), fax_gateway_framehook(), fax_gateway_new(), fax_gateway_request_t38(), fax_session_new(), feature_attended_transfer(), feature_automixmonitor(), feature_blind_transfer(), find_by_name(), find_details(), find_or_create_details(), flash_exec(), forkcdr_exec(), forward_message(), func_channel_read(), func_channels_read(), func_confbridge_channels(), func_get_parkingslot_channel(), func_read_header(), func_read_headers(), func_read_param(), func_read_verification(), func_response_read_header(), func_response_read_headers(), func_write_attestation(), func_write_header(), func_write_param(), generic_fax_exec(), generic_mute_unmute_helper(), generic_mute_unmute_user(), geoloc_profile_read(), geoloc_profile_write(), get_agi_cmd(), gosub_exec(), gosub_run(), grab_transfer(), group_count_function_read(), group_show_channels(), handle_bridge_kick_channel(), handle_call_outgoing(), handle_cli_agi_add_cmd(), handle_cli_confbridge_list_item(), handle_cli_iax2_show_channels(), handle_cli_locks_show(), handle_command(), handle_dump_frames(), handle_frame(), handle_gosub(), handle_incoming_request(), handle_participant_join(), handle_recordfile(), handle_showchan(), handle_softhangup(), handle_streamfile(), hangup(), hash_cb(), holding_bridge_join(), hook_callback(), hook_event_cb(), hook_off(), hook_on(), hook_re_enable(), hook_thread_arg_alloc(), iax2_call(), iax2_hangup(), iax2_request(), iax2_transfer(), incoming_in_dialog_request(), incoming_ws_http_callback(), increase_call_count(), indicate_connected_line(), indicate_data_internal(), inherit_channel_vars_from_id(), init_jack_data(), is_our_turn(), isAnsweringMachine(), jack_hook_callback(), jingle_action_session_terminate(), jingle_queue_hangup_with_cause(), jingle_read(), join_queue(), kick_conference_participant(), launch_asyncagi(), launch_monitor_thread(), leave_queue(), leave_voicemail(), leave_voicemail(), linear_alloc(), linear_release(), local_ast_moh_start(), locals_show(), log_caps(), log_group_write(), log_jitterstats(), lua_get_state(), lua_pbx_exec(), manager_park(), manager_queues_status(), map_source_to_destinations(), mbl_call(), meetme_menu_admin(), meetme_show_cmd(), meetmemute(), milliwatt_generate(), moh_alloc(), moh_files_generator(), moh_files_next(), moh_files_release(), moh_generate(), moh_post_start(), moh_post_stop(), moh_release(), my_handle_dtmf(), my_set_cadence(), native_bridge_changed(), native_bridge_compatible(), native_bridge_is_capable(), native_rtp_bridge_compatible_check(), native_rtp_bridge_framehook_attach(), native_rtp_bridge_framehook_detach(), native_rtp_bridge_join(), native_rtp_bridge_leave(), native_rtp_bridge_start(), native_rtp_bridge_stop(), native_rtp_bridge_suspend(), native_rtp_bridge_unsuspend(), native_start(), native_stop(), next_channel(), notify_channel(), old_milliwatt_exec(), on_personality_change_normal(), onModeChanged(), ooh323_answer(), ooh323_call(), ooh323_destroy(), ooh323_get_codec(), ooh323_get_rtp_peer(), ooh323_new(), ooh323_queryoption(), ooh323_rtp_read(), ooh323_set_rtp_peer(), ooh323_write(), outgoing_request(), page_exec(), park_local_transfer(), parking_park_bridge_channel(), parking_park_call(), participant_idle_mode_setup(), participant_reaction_announcer_join(), pbx_builtin_background(), pbx_builtin_waitexten(), pbx_extension_helper(), pbx_outgoing_exec(), pbx_outgoing_state_callback(), pbx_start_incoming_request(), pickup_by_exten(), pickup_by_group(), pjsip_acf_channel_read(), pjsip_acf_dtmf_mode_read(), pjsip_acf_dtmf_mode_write(), pjsip_acf_session_refresh_write(), pjsip_app_hangup(), pjsip_app_hangup_handler(), pjsip_transfer_handling_write(), play_message(), play_moh_exec(), play_on_channel(), play_record_review(), playback_exec(), playtones_alloc(), polarity_read(), polarity_write(), pre_bridge_setup(), print_escaped_uri(), print_queue(), print_subchannel(), prnt_channel_key(), process_binary_message(), process_text_message(), publish_app_cdr_message(), publish_transfer_fail(), publish_transfer_success(), publish_transfer_threeway(), queue_exec(), queue_frame_from_buffer(), queue_function_queuegetchannel(), queue_option_frame(), read_from_ws_and_queue(), read_mf_digits(), read_pjsip(), read_sf_digits(), readexten_exec(), realtime_exec(), receive_dtmf_digits(), receivefax_exec(), receivefax_t38_init(), record_exec(), recording_info_read(), refer_ari_progress_framehook(), refer_attended_task(), refer_blind_callback(), refer_incoming_ari_request(), refer_incoming_attended_request(), refer_incoming_blind_request(), refer_incoming_invite_request(), refer_incoming_refer_request(), refer_progress_alloc(), refer_progress_bridge(), refer_progress_framehook(), remove_detect(), remove_dtmf_store(), remove_framehook(), remove_header(), remove_hold_intercept(), remove_inheritable_header(), remove_scrambler(), remove_talk_detect(), request_withdraw_caller_from_queue(), resetcdr_exec(), revert_fax_buffers(), ring_entry(), rqm_exec(), rtp_check_timeout(), run_agi(), say_number_full(), say_position(), scan_exec(), send_direct_media_request(), send_dtmf_end_event(), send_message(), send_start_msg_snapshots(), sendfax_exec(), sendfax_t38_init(), serialize_showchan(), session_inv_on_media_update(), session_inv_on_tsx_state_changed(), set_bridge_peer_vars_multiparty(), set_channel_timer(), set_fax_t38_caps(), set_format(), set_hangup_source_and_cause(), set_hold_intercept(), set_transfer_variables_all(), setup_env(), setup_privacy_args(), setup_udptl_connection(), sfu_topologies_on_join(), sfu_topologies_on_leave(), sfu_topologies_on_source_change(), simple_bridge_join(), smart_bridge_operation(), sms_generate(), socket_process_helper(), softhangup_exec(), softmix_bridge_join(), softmix_bridge_stream_sources_update(), softmix_bridge_stream_topology_changed(), softmix_bridge_write_text(), softmix_bridge_write_voice(), softmix_mixing_loop(), start_automixmonitor(), start_moh_exec(), start_spying(), start_spying(), start_whispering(), start_whispering(), stasis_app_exec(), stop_automixmonitor(), stream_echo_perform(), stream_echo_write_error(), t38_attach_framehook(), t38_automatic_reject(), t38_change_state(), t38_framehook(), t38_initialize_session(), t38_interpret_parameters(), t38_reinvite_response_cb(), talk_detect_audiohook_cb(), testclient_exec(), testserver_exec(), tonepair_alloc(), transfer_exec(), transfer_redirect(), try_calling(), try_merge_optimize_out(), try_swap_optimize_out(), unistim_answer(), unistim_call(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), update_header(), update_inheritable_header(), update_qe_rule(), user_chan_cb(), vm_exec(), vm_execmain(), vm_options(), wait_exec(), wait_for_answer(), wait_for_answer(), wait_for_signal_or_hangup(), wait_for_winner(), waitsignal_exec(), waitstream_control(), waitstream_core(), webchan_call(), webchan_hangup(), webchan_read(), webchan_request(), webchan_write(), websocket_handoff_to_channel(), and xfer_client_on_evsub_state().

◆ ast_channel_name_to_dial_string()

void ast_channel_name_to_dial_string ( char *  channel_name)

Removes the trailing identifiers from a channel name string.

Since
12.0.0
Parameters
channel_namestring that you wish to turn into a dial string. This string will be edited in place.

Definition at line 6879 of file channel.c.

6880{
6881 char *dash;
6882
6883 /* Truncate after the dash */
6884 dash = strrchr(channel_name, '-');
6885 if (dash) {
6886 *dash = '\0';
6887 }
6888}

Referenced by parked_user_set_parker_dial_string(), and setup_park_common_datastore().

◆ ast_channel_named_callgroups()

struct ast_namedgroups * ast_channel_named_callgroups ( const struct ast_channel chan)

Definition at line 957 of file channel_internal_api.c.

958{
959 return chan->named_callgroups;
960}
struct ast_namedgroups * named_callgroups

References ast_channel::named_callgroups.

Referenced by find_channel_by_group(), and func_channel_read().

◆ ast_channel_named_callgroups_set()

void ast_channel_named_callgroups_set ( struct ast_channel chan,
struct ast_namedgroups *  value 
)

◆ ast_channel_named_pickupgroups()

struct ast_namedgroups * ast_channel_named_pickupgroups ( const struct ast_channel chan)

Definition at line 966 of file channel_internal_api.c.

967{
968 return chan->named_pickupgroups;
969}
struct ast_namedgroups * named_pickupgroups

References ast_channel::named_pickupgroups.

Referenced by find_channel_by_group(), and func_channel_read().

◆ ast_channel_named_pickupgroups_set()

void ast_channel_named_pickupgroups_set ( struct ast_channel chan,
struct ast_namedgroups *  value 
)

◆ ast_channel_nativeformats()

struct ast_format_cap * ast_channel_nativeformats ( const struct ast_channel chan)

◆ ast_channel_nativeformats_set()

void ast_channel_nativeformats_set ( struct ast_channel chan,
struct ast_format_cap value 
)

Definition at line 544 of file channel_internal_api.c.

546{
547 SCOPE_ENTER(2, "%s: %sFormats: %s\n", S_OR(ast_channel_name(chan), "<initializing>"),
548 S_COR(ast_channel_is_multistream(chan), "Multistream", ""),
550
551 ast_assert(chan != NULL);
552
554
555 /* If chan->stream_topology is NULL, the channel is being destroyed
556 * and topology is destroyed.
557 */
558 if (!chan->stream_topology) {
559 SCOPE_EXIT_RTN("Channel is being initialized or destroyed\n");
560 }
561
562 if (!ast_channel_is_multistream(chan) || !value) {
563 struct ast_stream_topology *new_topology;
564
567 SCOPE_EXIT_RTN("New %stopology set\n", value ? "" : "empty ");
568 }
569 SCOPE_EXIT_RTN("Set native formats but not topology\n");
570}
#define ao2_replace(dst, src)
Replace one object reference with another cleaning up the original.
Definition astobj2.h:501
void ast_channel_internal_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
int ast_channel_is_multistream(struct ast_channel *chan)
Determine if a channel is multi-stream capable.
const char * ast_format_cap_get_names(const struct ast_format_cap *cap, struct ast_str **buf)
Get the names of codecs of a set of formats.
Definition format_cap.c:734
#define SCOPE_EXIT_RTN(...)
#define SCOPE_ENTER(level,...)
struct ast_stream_topology * ast_stream_topology_create_from_format_cap(struct ast_format_cap *cap)
A helper function that, given a format capabilities structure, creates a topology and separates the m...
Definition stream.c:851
#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:87
#define ast_str_tmp(init_len, __expr)
Provides a temporary ast_str and returns a copy of its buffer.
Definition strings.h:1189

References ao2_replace, ast_assert, ast_channel_internal_set_stream_topology(), ast_channel_is_multistream(), ast_channel_name(), ast_format_cap_get_names(), ast_str_tmp, ast_stream_topology_create_from_format_cap(), ast_channel::nativeformats, NULL, S_COR, S_OR, SCOPE_ENTER, SCOPE_EXIT_RTN, ast_channel::stream_topology, and value.

Referenced by __ast_channel_alloc_ap(), ast_channel_destructor(), ast_iax2_new(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_unreal_new_channels(), audiosocket_request(), chan_pjsip_new(), chan_pjsip_read_stream(), channel_do_masquerade(), console_new(), dahdi_new(), do_notify(), handle_eval_function(), handle_exec(), iax2_request(), jingle_interpret_content(), jingle_new(), jingle_read(), make_channel(), mbl_new(), multicast_rtp_request(), ooh323_new(), ooh323_rtp_read(), ooh323_set_read_format(), ooh323_set_write_format(), rec_request(), set_caps(), set_format(), socket_process_helper(), stasis_app_control_snoop(), unicast_rtp_request(), unistim_new(), unistim_rtp_read(), and webchan_request().

◆ ast_channel_oldest_linkedid()

const char * ast_channel_oldest_linkedid ( const char *  a,
const char *  b 
)

Return the oldest linkedid between two channels.

A channel linkedid is derived from the channel uniqueid which is formed like this: [systemname-]ctime.seq

The systemname, and the dash are optional, followed by the epoch time followed by an integer sequence. Note that this is not a decimal number, since 1.2 is less than 1.11 in uniqueid land.

To compare two uniqueids, we parse out the integer values of the time and the sequence numbers and compare them, with time trumping sequence.

Parameters
aThe linkedid value of the first channel to compare
bThe linkedid value of the second channel to compare
Return values
NULLon failure
Theoldest linkedid value
Since
12.0.0

◆ ast_channel_oldwriteformat()

struct ast_format * ast_channel_oldwriteformat ( struct ast_channel chan)

Definition at line 711 of file channel_internal_api.c.

712{
713 return chan->oldwriteformat;
714}
struct ast_format * oldwriteformat

References ast_channel::oldwriteformat.

Referenced by ast_stopstream().

◆ ast_channel_outsmpl()

unsigned long ast_channel_outsmpl ( const struct ast_channel chan)

Definition at line 413 of file channel_internal_api.c.

414{
415 return chan->outsmpl;
416}
unsigned long outsmpl

References ast_channel::outsmpl.

◆ ast_channel_outsmpl_set()

void ast_channel_outsmpl_set ( struct ast_channel chan,
unsigned long  value 
)

Definition at line 417 of file channel_internal_api.c.

418{
419 chan->outsmpl = value;
420}

References ast_channel::outsmpl, and value.

◆ ast_channel_parkinglot()

const char * ast_channel_parkinglot ( const struct ast_channel chan)

◆ ast_channel_pbx()

struct ast_pbx * ast_channel_pbx ( const struct ast_channel chan)

◆ ast_channel_pbx_set()

void ast_channel_pbx_set ( struct ast_channel chan,
struct ast_pbx value 
)

◆ ast_channel_peeraccount()

const char * ast_channel_peeraccount ( const struct ast_channel chan)

◆ ast_channel_pickupgroup()

ast_group_t ast_channel_pickupgroup ( const struct ast_channel chan)

◆ ast_channel_pickupgroup_set()

void ast_channel_pickupgroup_set ( struct ast_channel chan,
ast_group_t  value 
)
Precondition
chan is locked

Definition at line 953 of file channel_internal_api.c.

954{
955 chan->pickupgroup = value;
956}

References ast_channel::pickupgroup, and value.

Referenced by chan_pjsip_new(), dahdi_new(), func_channel_write_real(), jingle_new(), and unistim_new().

◆ ast_channel_priority()

int ast_channel_priority ( const struct ast_channel chan)

◆ ast_channel_priority_set()

void ast_channel_priority_set ( struct ast_channel chan,
int  value 
)

◆ ast_channel_queryoption()

int ast_channel_queryoption ( struct ast_channel channel,
int  option,
void *  data,
int *  datalen,
int  block 
)

Checks the value of an option.

Query the value of an option Works similarly to setoption except only reads the options.

Definition at line 7494 of file channel.c.

7495{
7496 int res;
7497
7498 ast_channel_lock(chan);
7499 if (!ast_channel_tech(chan)->queryoption) {
7500 errno = ENOSYS;
7501 ast_channel_unlock(chan);
7502 return -1;
7503 }
7504
7505 if (block)
7506 ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7507
7508 res = ast_channel_tech(chan)->queryoption(chan, option, data, datalen);
7509 ast_channel_unlock(chan);
7510
7511 return res;
7512}
int(*const queryoption)(struct ast_channel *chan, int option, void *data, int *datalen)
Query a given option. Called with chan locked.
Definition channel.h:800

References ast_channel_lock, ast_channel_unlock, ast_log, ast_datastore::data, errno, LOG_ERROR, and ast_channel_tech::queryoption.

Referenced by ast_channel_get_cc_agent_type(), ast_channel_get_device_name(), ast_channel_get_t38_state(), ast_unreal_queryoption(), and func_channel_read().

◆ ast_channel_queue_connected_line_update()

void ast_channel_queue_connected_line_update ( struct ast_channel chan,
const struct ast_party_connected_line connected,
const struct ast_set_party_connected_line update 
)

Queue a connected line update frame on a channel.

Since
1.8
Parameters
chanAsterisk channel to indicate connected line information
connectedConnected line information
updateWhat connected line information to update. NULL if all.

Definition at line 9190 of file channel.c.

9191{
9192 unsigned char data[1024]; /* This should be large enough */
9193 size_t datalen;
9194
9195 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9196 if (datalen == (size_t) -1) {
9197 return;
9198 }
9199
9201}
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
Definition channel.c:1296
int ast_connected_line_build_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Build the connected line information data frame.
Definition channel.c:8781

References ast_connected_line_build_data(), AST_CONTROL_CONNECTED_LINE, ast_queue_control_data(), connected, and update().

Referenced by after_bridge_move_channel(), ast_do_pickup(), onAlerting(), onCallEstablished(), onProgress(), queue_connected_line_update(), and update_initial_connected_line().

◆ ast_channel_queue_redirecting_update()

void ast_channel_queue_redirecting_update ( struct ast_channel chan,
const struct ast_party_redirecting redirecting,
const struct ast_set_party_redirecting update 
)

Queue a redirecting update frame on a channel.

Since
1.8
Parameters
chanAsterisk channel to indicate redirecting id information
redirectingRedirecting id information
updateWhat redirecting information to update. NULL if all.

Definition at line 10381 of file channel.c.

10382{
10383 unsigned char data[1024]; /* This should be large enough */
10384 size_t datalen;
10385
10386 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10387 if (datalen == (size_t) -1) {
10388 return;
10389 }
10390
10391 ast_queue_control_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10392}
int ast_redirecting_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Build the redirecting id data frame.
Definition channel.c:9352

References AST_CONTROL_REDIRECTING, ast_queue_control_data(), ast_redirecting_build_data(), and update().

Referenced by set_redirecting().

◆ ast_channel_rawreadformat()

struct ast_format * ast_channel_rawreadformat ( struct ast_channel chan)

◆ ast_channel_rawwriteformat()

struct ast_format * ast_channel_rawwriteformat ( struct ast_channel chan)

◆ ast_channel_readformat()

struct ast_format * ast_channel_readformat ( struct ast_channel chan)

◆ ast_channel_readq()

struct ast_readq_list * ast_channel_readq ( struct ast_channel chan)

◆ ast_channel_readtrans()

struct ast_trans_pvt * ast_channel_readtrans ( const struct ast_channel chan)

◆ ast_channel_readtrans_set()

void ast_channel_readtrans_set ( struct ast_channel chan,
struct ast_trans_pvt value 
)

Definition at line 624 of file channel_internal_api.c.

625{
626 chan->readtrans = value;
627}

References ast_channel::readtrans, and value.

Referenced by ast_set_read_format_path(), and free_translation().

◆ ast_channel_reason2str()

const char * ast_channel_reason2str ( int  reason)

return an english explanation of the code returned thru __ast_request_and_dial's 'outstate' argument

Parameters
reasonThe integer argument, usually taken from AST_CONTROL_ macros
Returns
char pointer explaining the code

Definition at line 5861 of file channel.c.

5862{
5863 switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
5864 {
5865 case 0:
5866 return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
5867 case AST_CONTROL_HANGUP:
5868 return "Hangup";
5869 case AST_CONTROL_RING:
5870 return "Local Ring";
5872 return "Remote end Ringing";
5873 case AST_CONTROL_ANSWER:
5874 return "Remote end has Answered";
5875 case AST_CONTROL_BUSY:
5876 return "Remote end is Busy";
5878 return "Congestion (circuits busy)";
5879 default:
5880 return "Unknown Reason!!";
5881 }
5882}

References AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_HANGUP, AST_CONTROL_RING, and AST_CONTROL_RINGING.

Referenced by attempt_thread().

◆ ast_channel_redirecting()

struct ast_party_redirecting * ast_channel_redirecting ( struct ast_channel chan)

◆ ast_channel_redirecting_effective_from()

struct ast_party_id ast_channel_redirecting_effective_from ( struct ast_channel chan)

Definition at line 783 of file channel_internal_api.c.

784{
786}
struct ast_party_id priv_from
Who is redirecting the call (Sent to the party the call is redirected toward) - private representatio...
Definition channel.h:538
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition channel.h:529

References ast_party_id_merge().

◆ ast_channel_redirecting_effective_orig()

struct ast_party_id ast_channel_redirecting_effective_orig ( struct ast_channel chan)

Definition at line 779 of file channel_internal_api.c.

780{
782}
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward)
Definition channel.h:526
struct ast_party_id priv_orig
Who originally redirected the call (Sent to the party the call is redirected toward) - private repres...
Definition channel.h:535

References ast_party_id_merge().

◆ ast_channel_redirecting_effective_to()

struct ast_party_id ast_channel_redirecting_effective_to ( struct ast_channel chan)

Definition at line 787 of file channel_internal_api.c.

788{
789 return ast_party_id_merge(&chan->redirecting.to, &chan->redirecting.priv_to);
790}
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation.
Definition channel.h:541
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition channel.h:532

References ast_party_id_merge().

◆ ast_channel_redirecting_set()

void ast_channel_redirecting_set ( struct ast_channel chan,
struct ast_party_redirecting value 
)

◆ ast_channel_redirecting_sub()

int ast_channel_redirecting_sub ( struct ast_channel autoservice_chan,
struct ast_channel sub_chan,
const void *  redirecting_info,
int  is_frame 
)

Run a redirecting interception subroutine and update a channel's redirecting information.

Since
11

Whenever we want to update a channel's redirecting information, we may need to run a subroutine so that an administrator can manipulate the information before sending it out. This function both runs the subroutine specified by REDIRECTING_SEND_SUB and sends the update to the channel.

Parameters
autoservice_chanChannel to place into autoservice while the subroutine is running. It is perfectly safe for this to be NULL
sub_chanThe channel to run the subroutine on. Also the channel from which we determine which subroutine we need to run.
redirecting_infoEither an ast_party_redirecting or ast_frame pointer of type AST_CONTROL_REDIRECTING
is_frameIf true, then redirecting_info is an ast_frame pointer, otherwise it is an ast_party_redirecting pointer.
Return values
0Success
-1Either the subroutine does not exist, or there was an error while attempting to run the subroutine

Definition at line 10467 of file channel.c.

10468{
10469 const char *sub;
10470 const char *sub_args;
10471 int retval;
10472
10473 ast_channel_lock(sub_chan);
10474 sub = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB");
10475 sub = ast_strdupa(S_OR(sub, ""));
10476 sub_args = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB_ARGS");
10477 sub_args = ast_strdupa(S_OR(sub_args, ""));
10478
10479 if (ast_strlen_zero(sub)) {
10480 ast_channel_unlock(sub_chan);
10481 return -1;
10482 }
10483
10484 if (is_frame) {
10485 const struct ast_frame *frame = redirecting_info;
10486
10488 } else {
10489 const struct ast_party_redirecting *redirecting = redirecting_info;
10490
10492 }
10493 ast_channel_unlock(sub_chan);
10494
10496 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10498 if (!retval) {
10499 struct ast_party_redirecting saved_redirecting;
10500
10501 ast_party_redirecting_init(&saved_redirecting);
10502 ast_channel_lock(sub_chan);
10503 ast_party_redirecting_copy(&saved_redirecting, ast_channel_redirecting(sub_chan));
10504 ast_channel_unlock(sub_chan);
10505 ast_channel_update_redirecting(sub_chan, &saved_redirecting, NULL);
10506 ast_party_redirecting_free(&saved_redirecting);
10507 }
10508
10509 return retval;
10510}
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition channel.c:2109
void ast_channel_update_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Indicate that the redirecting id has changed.
Definition channel.c:10368
int ast_redirecting_parse_data(const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting)
Parse redirecting indication frame data.
Definition channel.c:9563
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition channel.c:2166

References ast_app_run_sub(), ast_channel_lock, ast_channel_redirecting(), ast_channel_unlock, ast_channel_update_redirecting(), ast_party_redirecting_copy(), ast_party_redirecting_free(), ast_party_redirecting_init(), ast_redirecting_parse_data(), ast_strdupa, ast_strlen_zero(), channel_set_intercept_mode(), ast_frame::data, ast_frame::datalen, NULL, pbx_builtin_getvar_helper(), ast_frame::ptr, S_OR, and sub.

Referenced by bridge_channel_handle_control(), call_forward_inherit(), do_forward(), handle_frame(), wait_for_answer(), and wait_for_answer().

◆ ast_channel_register()

int ast_channel_register ( const struct ast_channel_tech tech)

Register a channel technology (a new channel driver) Called by a channel module to register the kind of channels it supports.

Parameters
techStructure defining channel technology or "type"
Returns
Returns 0 on success, -1 on failure.

Register a channel technology (a new channel driver) Called by a channel module to register the kind of channels it supports.

Definition at line 540 of file channel.c.

541{
542 struct chanlist *chan;
543
545
547 if (!strcasecmp(tech->type, chan->tech->type)) {
548 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
550 return -1;
551 }
552 }
553
554 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
556 return -1;
557 }
558 chan->tech = tech;
560
561 ast_debug(5, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
562
563 ast_verb(5, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
564
566
567 return 0;
568}
#define ast_verb(level,...)
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_RWLIST_TRAVERSE
#define AST_RWLIST_INSERT_HEAD
const char *const type
Definition channel.h:649
const char *const description
Definition channel.h:650
the list of registered channel types
Definition channel.c:125
struct ast_channel * chan
Definition app_dial.c:806
struct chanlist::@348 list
const char * tech
Definition app_dial.c:810

References ast_calloc, ast_debug, ast_log, AST_RWLIST_INSERT_HEAD, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, chanlist::chan, ast_channel_tech::description, chanlist::list, LOG_WARNING, chanlist::tech, ast_channel::tech, and ast_channel_tech::type.

Referenced by ast_channels_init(), ast_local_init(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), and register_channel_tech().

◆ ast_channel_release()

struct ast_channel * ast_channel_release ( struct ast_channel chan)

Unlink and release reference to a channel.

This function will unlink the channel from the global channels container if it is still there and also release the current reference to the channel.

Return values
NULLconvenient for clearing invalid pointers
Note
Absolutely NO channel locks should be held before calling this function.
Since
1.8

Definition at line 1571 of file channel.c.

1572{
1573 /* Safe, even if already unlinked. */
1574 ast_channel_unlink(chan);
1575 return ast_channel_unref(chan);
1576}
void ast_channel_unlink(struct ast_channel *chan)
Remove a channel from the global channels container.
Definition channel.c:10617
#define ast_channel_unref(c)
Decrease channel reference count.
Definition channel.h:3018

References ast_channel_unlink(), and ast_channel_unref.

Referenced by ast_iax2_new(), ast_unreal_new_channels(), destroy_msg_q_chan(), do_notify(), rec_request(), safe_channel_release(), safe_channel_release(), safe_channel_release(), safe_channel_release(), and safe_channel_release().

◆ ast_channel_req_accountcodes()

void ast_channel_req_accountcodes ( struct ast_channel chan,
const struct ast_channel requestor,
enum ast_channel_requestor_relationship  relationship 
)

Setup new channel accountcodes from the requestor channel after ast_request().

Since
13.0.0
Parameters
chanNew channel to get accountcodes setup.
requestorRequesting channel to get accountcodes from.
relationshipWhat the new channel was created for.
Precondition
The chan and requestor channels are already locked.
Note
Pre-existing accountcodes on chan will be overwritten.

Definition at line 6469 of file channel.c.

6470{
6471 channel_req_accountcodes(chan, requestor, relationship, 0);
6472}
static void channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship, int precious)
Definition channel.c:6411

References channel_req_accountcodes().

Referenced by __ast_request_and_dial(), ast_ari_channels_dial(), ast_call_forward(), attended_transfer_bridge(), begin_dial_prerun(), blind_transfer_bridge(), common_recall_channel_setup(), dial_exec_full(), dial_transfer(), do_forward(), findmeexec(), park_local_transfer(), and wait_for_answer().

◆ ast_channel_req_accountcodes_precious()

void ast_channel_req_accountcodes_precious ( struct ast_channel chan,
const struct ast_channel requestor,
enum ast_channel_requestor_relationship  relationship 
)

Setup new channel accountcodes from the requestor channel after ast_request().

Since
13.0.0
Parameters
chanNew channel to get accountcodes setup.
requestorRequesting channel to get accountcodes from.
relationshipWhat the new channel was created for.
Precondition
The chan and requestor channels are already locked.
Note
Pre-existing accountcodes on chan will not be overwritten.

Definition at line 6474 of file channel.c.

6475{
6476 channel_req_accountcodes(chan, requestor, relationship, 1);
6477}

References channel_req_accountcodes().

Referenced by ring_entry().

◆ ast_channel_request_stream_topology_change()

int ast_channel_request_stream_topology_change ( struct ast_channel chan,
struct ast_stream_topology topology,
void *  change_source 
)

Request that the stream topology of a channel change.

Parameters
chanThe channel to change
topologyThe new stream topology
change_sourceThe source that initiated the change
Note
Absolutely NO channel locks should be held before calling this function.
Return values
0request has been accepted to be attempted
-1request could not be attempted
Note
This function initiates an asynchronous request to change the stream topology. It is not guaranteed that the topology will change and until an AST_CONTROL_STREAM_TOPOLOGY_CHANGED frame is received from the channel the current handler of the channel must tolerate the stream topology as it currently exists.
This interface is provided for applications and resources to request that the topology change. It is not for use by the channel driver itself.

Definition at line 11054 of file channel.c.

11056{
11057 int res;
11058
11059 ast_assert(chan != NULL);
11060 ast_assert(topology != NULL);
11061
11062 ast_channel_lock(chan);
11064 ast_channel_unlock(chan);
11065 return -1;
11066 }
11067
11069 ast_debug(2, "%s: Topologies already match. Current: %s Requested: %s\n",
11070 ast_channel_name(chan),
11072 ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
11073 ast_channel_unlock(chan);
11074 return 0;
11075 }
11076
11078
11079 res = ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, topology, sizeof(topology));
11080 ast_channel_unlock(chan);
11081 return res;
11082}
static int indicate(void *data)
void ast_channel_internal_set_stream_topology_change_source(struct ast_channel *chan, void *change_source)
@ AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE
const char * ast_stream_topology_to_str(const struct ast_stream_topology *topology, struct ast_str **buf)
Get a string representing the topology for debugging/display purposes.
Definition stream.c:939
int ast_stream_topology_equal(const struct ast_stream_topology *left, const struct ast_stream_topology *right)
Compare two stream topologies to see if they are equal.
Definition stream.c:699
int(*const indicate)(struct ast_channel *c, int condition, const void *data, size_t datalen)
Indicate a particular condition (e.g. AST_CONTROL_BUSY or AST_CONTROL_RINGING or AST_CONTROL_CONGESTI...
Definition channel.h:791

References ast_assert, ast_channel_get_stream_topology(), ast_channel_internal_set_stream_topology_change_source(), ast_channel_is_multistream(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, ast_debug, ast_str_tmp, ast_stream_topology_equal(), ast_stream_topology_to_str(), indicate(), ast_channel_tech::indicate, and NULL.

Referenced by AST_TEST_DEFINE(), AST_TEST_DEFINE(), native_rtp_bridge_join(), native_rtp_stream_topology_changed(), sfu_topologies_on_join(), sfu_topologies_on_leave(), sfu_topologies_on_source_change(), simple_bridge_join(), simple_bridge_stream_topology_changed(), softmix_bridge_stream_sources_update(), and stream_echo_perform().

◆ ast_channel_rings()

int ast_channel_rings ( const struct ast_channel chan)

Definition at line 325 of file channel_internal_api.c.

326{
327 return chan->rings;
328}

References ast_channel::rings.

Referenced by __analog_handle_event(), ast_var_channels_table(), and serialize_showchan().

◆ ast_channel_rings_set()

void ast_channel_rings_set ( struct ast_channel chan,
int  value 
)

◆ ast_channel_sched()

struct ast_sched_context * ast_channel_sched ( const struct ast_channel chan)

◆ ast_channel_sched_set()

void ast_channel_sched_set ( struct ast_channel chan,
struct ast_sched_context value 
)

Definition at line 600 of file channel_internal_api.c.

601{
602 chan->sched = value;
603}

References ast_channel::sched, and value.

Referenced by __ast_channel_alloc_ap(), and ast_hangup().

◆ ast_channel_sendhtml()

int ast_channel_sendhtml ( struct ast_channel channel,
int  subclass,
const char *  data,
int  datalen 
)

Sends HTML on given channel Send HTML or URL on link.

Returns
0 on success or -1 on failure

Definition at line 6663 of file channel.c.

6664{
6665 if (ast_channel_tech(chan)->send_html)
6666 return ast_channel_tech(chan)->send_html(chan, subclass, data, datalen);
6667 return -1;
6668}
int(*const send_html)(struct ast_channel *chan, int subclass, const char *data, int len)
Send HTML data.
Definition channel.h:782

References ast_channel_tech::send_html.

Referenced by ast_channel_sendurl(), and wait_for_answer().

◆ ast_channel_sending_dtmf_digit()

char ast_channel_sending_dtmf_digit ( const struct ast_channel chan)

Definition at line 259 of file channel_internal_api.c.

260{
261 return chan->sending_dtmf_digit;
262}

References ast_channel::sending_dtmf_digit.

Referenced by ast_senddigit_end(), bridge_channel_internal_join(), and channel_do_masquerade().

◆ ast_channel_sending_dtmf_digit_set()

void ast_channel_sending_dtmf_digit_set ( struct ast_channel chan,
char  value 
)

Definition at line 263 of file channel_internal_api.c.

264{
266}

References ast_channel::sending_dtmf_digit, and value.

Referenced by ast_senddigit_begin(), and ast_senddigit_end().

◆ ast_channel_sending_dtmf_tv()

struct timeval ast_channel_sending_dtmf_tv ( const struct ast_channel chan)

Definition at line 268 of file channel_internal_api.c.

269{
270 return chan->sending_dtmf_tv;
271}
struct timeval sending_dtmf_tv

Referenced by bridge_channel_internal_join(), and channel_do_masquerade().

◆ ast_channel_sending_dtmf_tv_set()

void ast_channel_sending_dtmf_tv_set ( struct ast_channel chan,
struct timeval  value 
)

Definition at line 272 of file channel_internal_api.c.

273{
274 chan->sending_dtmf_tv = value;
275}

References ast_channel::sending_dtmf_tv, and value.

Referenced by ast_senddigit_begin().

◆ ast_channel_sendurl()

int ast_channel_sendurl ( struct ast_channel channel,
const char *  url 
)

Sends a URL on a given link Send URL on link.

Returns
0 on success or -1 on failure

Definition at line 6670 of file channel.c.

6671{
6672 return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
6673}
int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
Sends HTML on given channel Send HTML or URL on link.
Definition channel.c:6663
#define AST_HTML_URL

References ast_channel_sendhtml(), AST_HTML_URL, and url.

Referenced by dial_exec_full(), and try_calling().

◆ ast_channel_set_ari_vars()

void ast_channel_set_ari_vars ( size_t  varc,
char **  vars 
)

Sets the variables to be stored in the ari_vars field of all snapshots.

Since
14.2.0
Parameters
varcNumber of variable names.
varsArray of variable names.

Definition at line 7917 of file channel.c.

7918{
7919 channel_set_external_vars(&ari_vars, varc, vars);
7920}
static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
Definition channel.c:7890

References ari_vars, and channel_set_external_vars().

Referenced by general_apply().

◆ ast_channel_set_caller()

void ast_channel_set_caller ( struct ast_channel chan,
const struct ast_party_caller caller,
const struct ast_set_party_caller update 
)

Set the caller id information in the Asterisk channel.

Since
1.8
Parameters
chanAsterisk channel to set caller id information
callerCaller id information
updateWhat caller information to update. NULL if all.
Note
The channel does not need to be locked before calling this function.

Definition at line 7411 of file channel.c.

7412{
7413 if (ast_channel_caller(chan) == caller) {
7414 /* Don't set to self */
7415 return;
7416 }
7417
7418 ast_channel_lock(chan);
7421 ast_channel_unlock(chan);
7422}
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
Set the caller information based on another caller source.
Definition channel.c:1994

References ast_channel_caller(), ast_channel_lock, AST_CHANNEL_SNAPSHOT_INVALIDATE_CALLER, ast_channel_snapshot_invalidate_segment(), ast_channel_unlock, ast_party_caller_set(), and update().

◆ ast_channel_set_caller_event()

void ast_channel_set_caller_event ( struct ast_channel chan,
const struct ast_party_caller caller,
const struct ast_set_party_caller update 
)

Set the caller id information in the Asterisk channel and generate an AMI event if the caller id name or number changed.

Since
1.8
Parameters
chanAsterisk channel to set caller id information
callerCaller id information
updateWhat caller information to update. NULL if all.
Note
The channel does not need to be locked before calling this function.

Definition at line 7424 of file channel.c.

7425{
7426 if (ast_channel_caller(chan) == caller) {
7427 /* Don't set to self */
7428 return;
7429 }
7430
7431 ast_channel_lock(chan);
7435 ast_channel_unlock(chan);
7436}

References ast_channel_caller(), ast_channel_lock, ast_channel_publish_snapshot(), AST_CHANNEL_SNAPSHOT_INVALIDATE_CALLER, ast_channel_snapshot_invalidate_segment(), ast_channel_unlock, ast_party_caller_set(), and update().

Referenced by callerid_write(), dial_exec_full(), do_forward(), queue_connected_line_update(), and ring_entry().

◆ ast_channel_set_connected_line()

void ast_channel_set_connected_line ( struct ast_channel chan,
const struct ast_party_connected_line connected,
const struct ast_set_party_connected_line update 
)

Set the connected line information in the Asterisk channel.

Since
1.8
Parameters
chanAsterisk channel to set connected line information
connectedConnected line information
updateWhat connected line information to update. NULL if all.
Note
The channel does not need to be locked before calling this function.

Definition at line 8392 of file channel.c.

8393{
8394 if (ast_channel_connected(chan) == connected) {
8395 /* Don't set to self */
8396 return;
8397 }
8398
8399 ast_channel_lock(chan);
8403 ast_channel_unlock(chan);
8404}
void ast_party_connected_line_set(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src, const struct ast_set_party_connected_line *update)
Set the connected line information based on another connected line source.
Definition channel.c:2041

References ast_channel_connected(), ast_channel_lock, ast_channel_publish_snapshot(), AST_CHANNEL_SNAPSHOT_INVALIDATE_CONNECTED, ast_channel_snapshot_invalidate_segment(), ast_channel_unlock, ast_party_connected_line_set(), connected, and update().

Referenced by __ast_request_and_dial(), ari_channels_handle_originate_with_id(), connectedline_write(), dial_exec_full(), indicate_connected_line(), and pbx_outgoing_attempt().

◆ ast_channel_set_fd()

void ast_channel_set_fd ( struct ast_channel chan,
int  which,
int  fd 
)

◆ ast_channel_set_flag()

void ast_channel_set_flag ( struct ast_channel chan,
unsigned int  flag 
)

Set a flag on a channel.

Since
13.17.0
Parameters
chanThe channel to set the flag on
flagThe flag to set
Note
This will lock the channel internally. If the channel is already locked it is still safe to call.

Definition at line 11115 of file channel.c.

11116{
11117 ast_channel_lock(chan);
11119 ast_channel_unlock(chan);
11120}

References ast_channel_flags(), ast_channel_lock, ast_channel_unlock, and ast_set_flag.

Referenced by ast_call_forward(), ast_waitfordigit_full(), channel_spy(), common_exec(), dial_exec_full(), disa_exec(), do_broadcast(), and waitstream_core().

◆ ast_channel_set_is_t38_active()

void ast_channel_set_is_t38_active ( struct ast_channel chan,
int  is_t38_active 
)

Sets the is_t38_active flag.

Parameters
chanWhich channel is having its is_t38_active value set
is_t38_activeNon-zero if T.38 is active

Definition at line 928 of file channel_internal_api.c.

929{
930 ast_channel_lock(chan);
931 ast_channel_set_is_t38_active_nolock(chan, is_t38_active);
932 ast_channel_unlock(chan);
933}
void ast_channel_set_is_t38_active_nolock(struct ast_channel *chan, int is_t38_active)
Variant of ast_channel_set_is_t38_active. Use this if the channel is already locked prior to calling.

References ast_channel_lock, ast_channel_set_is_t38_active_nolock(), and ast_channel_unlock.

◆ ast_channel_set_is_t38_active_nolock()

void ast_channel_set_is_t38_active_nolock ( struct ast_channel chan,
int  is_t38_active 
)

Variant of ast_channel_set_is_t38_active. Use this if the channel is already locked prior to calling.

Parameters
chanWhich channel is having its is_t38_active value set
is_t38_activeNon-zero if T.38 is active

Definition at line 923 of file channel_internal_api.c.

924{
925 chan->is_t38_active = !!is_t38_active;
926}

References ast_channel::is_t38_active.

Referenced by ast_channel_set_is_t38_active(), and indicate_data_internal().

◆ ast_channel_set_manager_vars()

void ast_channel_set_manager_vars ( size_t  varc,
char **  vars 
)

Sets the variables to be stored in the manager_vars field of all snapshots.

Since
12
Parameters
varcNumber of variable names.
varsArray of variable names.

Definition at line 7912 of file channel.c.

7913{
7914 channel_set_external_vars(&ami_vars, varc, vars);
7915}

References ami_vars, and channel_set_external_vars().

Referenced by load_channelvars().

◆ ast_channel_set_oldwriteformat()

void ast_channel_set_oldwriteformat ( struct ast_channel chan,
struct ast_format format 
)

Definition at line 691 of file channel_internal_api.c.

692{
693 ao2_replace(chan->oldwriteformat, format);
694}

References ao2_replace, and ast_channel::oldwriteformat.

Referenced by ast_channel_destructor(), and openstream_internal().

◆ ast_channel_set_rawreadformat()

void ast_channel_set_rawreadformat ( struct ast_channel chan,
struct ast_format format 
)

◆ ast_channel_set_rawwriteformat()

void ast_channel_set_rawwriteformat ( struct ast_channel chan,
struct ast_format format 
)

◆ ast_channel_set_readformat()

void ast_channel_set_readformat ( struct ast_channel chan,
struct ast_format format 
)

◆ ast_channel_set_redirecting()

void ast_channel_set_redirecting ( struct ast_channel chan,
const struct ast_party_redirecting redirecting,
const struct ast_set_party_redirecting update 
)

Set the redirecting id information in the Asterisk channel.

Since
1.8
Parameters
chanAsterisk channel to set redirecting id information
redirectingRedirecting id information
updateWhat redirecting information to update. NULL if all.
Note
The channel does not need to be locked before calling this function.

Definition at line 9203 of file channel.c.

9204{
9205 if (ast_channel_redirecting(chan) == redirecting) {
9206 /* Don't set to self */
9207 return;
9208 }
9209
9210 ast_channel_lock(chan);
9214 ast_channel_unlock(chan);
9215}
void ast_party_redirecting_set(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src, const struct ast_set_party_redirecting *update)
Set the redirecting information based on another redirecting source.
Definition channel.c:2153

References ast_channel_lock, ast_channel_publish_snapshot(), ast_channel_redirecting(), AST_CHANNEL_SNAPSHOT_INVALIDATE_CALLER, ast_channel_snapshot_invalidate_segment(), ast_channel_unlock, ast_party_redirecting_set(), and update().

Referenced by AST_TEST_DEFINE(), indicate_redirecting(), redirecting_write(), and set_redirecting().

◆ ast_channel_set_stream_topology()

struct ast_stream_topology * ast_channel_set_stream_topology ( struct ast_channel chan,
struct ast_stream_topology topology 
)

Set the topology of streams on a channel.

Parameters
chanThe channel to set the stream topology on
topologyThe stream topology to set
Precondition
chan is locked
Note
If topology is NULL a new empty topology will be created and returned.
Return values
non-NULLSuccess
NULLfailure

Definition at line 1507 of file channel_internal_api.c.

1509{
1510 struct ast_stream_topology *new_topology;
1511 SCOPE_ENTER(1, "%s: %s\n", ast_channel_name(chan),
1512 ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
1513
1514 ast_assert(chan != NULL);
1515
1516 /* A non-MULTISTREAM channel can't manipulate topology directly */
1518
1519 /* Unless the channel is being destroyed, we always want a topology on
1520 * it even if its empty.
1521 */
1522 if (!topology) {
1523 new_topology = ast_stream_topology_alloc();
1524 } else {
1525 new_topology = topology;
1526 }
1527
1528 if (new_topology) {
1529 ast_channel_internal_set_stream_topology(chan, new_topology);
1530 }
1531
1532 SCOPE_EXIT_RTN_VALUE(new_topology, "Used %s topology\n", topology ? "provided" : "empty");
1533}
#define SCOPE_EXIT_RTN_VALUE(__return_value,...)
struct ast_stream_topology * ast_stream_topology_alloc(void)
Create a stream topology.
Definition stream.c:652

References ast_assert, ast_channel_internal_set_stream_topology(), ast_channel_is_multistream(), ast_channel_name(), ast_str_tmp, ast_stream_topology_alloc(), ast_stream_topology_to_str(), NULL, SCOPE_ENTER, and SCOPE_EXIT_RTN_VALUE.

Referenced by AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_unreal_indicate(), ast_unreal_new_channels(), chan_pjsip_new(), handle_negotiated_sdp(), make_channel(), and unreal_colp_stream_topology_request_change().

◆ ast_channel_set_unbridged()

void ast_channel_set_unbridged ( struct ast_channel chan,
int  value 
)

Sets the unbridged flag and queues a NULL frame on the channel to trigger a check by bridge_channel_wait.

Parameters
chanWhich channel is having its unbridged value set
valueWhat the unbridge value is being set to

Definition at line 901 of file channel_internal_api.c.

902{
903 ast_channel_lock(chan);
905 ast_channel_unlock(chan);
906}
void ast_channel_set_unbridged_nolock(struct ast_channel *chan, int value)
Variant of ast_channel_set_unbridged. Use this if the channel is already locked prior to calling.

References ast_channel_lock, ast_channel_set_unbridged_nolock(), ast_channel_unlock, and value.

Referenced by ast_bridge_setup_after_goto(), bridge_channel_wait(), and t38_change_state().

◆ ast_channel_set_unbridged_nolock()

void ast_channel_set_unbridged_nolock ( struct ast_channel chan,
int  value 
)

Variant of ast_channel_set_unbridged. Use this if the channel is already locked prior to calling.

Parameters
chanWhich channel is having its unbridged value set
valueWhat the unbridge value is being set to

Definition at line 895 of file channel_internal_api.c.

896{
897 chan->unbridged = !!value;
899}
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to a channel's frame queue.
Definition channel.c:1171
struct ast_frame ast_null_frame
Definition main/frame.c:79

References ast_null_frame, ast_queue_frame(), ast_channel::unbridged, and value.

Referenced by ast_audiohook_attach(), ast_audiohook_remove(), ast_channel_set_unbridged(), ast_framehook_attach(), ast_framehook_detach(), ast_framehook_list_fixup(), audio_audiohook_write_list(), chan_pjsip_read_stream(), dtmf_audiohook_write_list(), and set_caps().

◆ ast_channel_set_writeformat()

void ast_channel_set_writeformat ( struct ast_channel chan,
struct ast_format format 
)

◆ ast_channel_setoption()

int ast_channel_setoption ( struct ast_channel channel,
int  option,
void *  data,
int  datalen,
int  block 
)

Sets an option on a channel.

Parameters
channelchannel to set options on
optionoption to change
datadata specific to option
datalenlength of the data
blockblocking or not

Set an option on a channel (see frame.h), optionally blocking awaiting the reply

Returns
0 on success and -1 on failure

Definition at line 7474 of file channel.c.

7475{
7476 int res;
7477
7478 ast_channel_lock(chan);
7479 if (!ast_channel_tech(chan)->setoption) {
7480 errno = ENOSYS;
7481 ast_channel_unlock(chan);
7482 return -1;
7483 }
7484
7485 if (block)
7486 ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7487
7488 res = ast_channel_tech(chan)->setoption(chan, option, data, datalen);
7489 ast_channel_unlock(chan);
7490
7491 return res;
7492}
int(*const setoption)(struct ast_channel *chan, int option, void *data, int datalen)
Set a given option. Called with chan locked.
Definition channel.h:797

References ast_channel_lock, ast_channel_unlock, ast_log, ast_datastore::data, errno, LOG_ERROR, and ast_channel_tech::setoption.

Referenced by analog_hangup(), bridge_channel_handle_control(), common_exec(), conf_run(), dahdi_hangup(), dial_exec_full(), func_channel_write(), func_channel_write_real(), handle_tddmode(), play_record_review(), play_record_review(), reset_volumes(), set_format(), set_listen_volume(), set_security_requirements(), set_talk_volume(), try_calling(), and vm_forwardoptions().

◆ ast_channel_setwhentohangup_tv()

void ast_channel_setwhentohangup_tv ( struct ast_channel chan,
struct timeval  offset 
)

Set when to hang a channel up.

Parameters
chanchannel on which to check for hang up
offsetoffset in seconds and useconds relative to the current time of when to hang up

This function sets the absolute time out on a channel (when to hang up).

Precondition
chan is locked
Since
1.6.1

Set when to hang a channel up.

Definition at line 511 of file channel.c.

512{
513 if (ast_tvzero(offset)) {
514 ast_channel_whentohangup_set(chan, &offset);
515 } else {
516 struct timeval tv = ast_tvadd(offset, ast_tvnow());
518 }
520 return;
521}
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel's frame queue.
Definition channel.c:1171

References ast_channel_whentohangup_set(), ast_null_frame, ast_queue_frame(), ast_tvadd(), ast_tvnow(), and ast_tvzero().

Referenced by action_timeout(), handle_autohangup(), and timeout_write().

◆ ast_channel_snapshot()

struct ast_channel_snapshot * ast_channel_snapshot ( const struct ast_channel chan)

Definition at line 1564 of file channel_internal_api.c.

1565{
1566 return chan->snapshot;
1567}
struct ast_channel_snapshot * snapshot

References ast_channel::snapshot.

◆ ast_channel_snapshot_segment_flags()

struct ast_flags * ast_channel_snapshot_segment_flags ( struct ast_channel chan)

◆ ast_channel_snapshot_set()

void ast_channel_snapshot_set ( struct ast_channel chan,
struct ast_channel_snapshot snapshot 
)

Definition at line 1569 of file channel_internal_api.c.

1570{
1571 ao2_cleanup(chan->snapshot);
1572 chan->snapshot = ao2_bump(snapshot);
1573}

References ao2_bump, ao2_cleanup, and ast_channel::snapshot.

Referenced by ast_channel_publish_final_snapshot(), and ast_channel_publish_snapshot().

◆ ast_channel_softhangup_internal_flag()

int ast_channel_softhangup_internal_flag ( struct ast_channel chan)

◆ ast_channel_softhangup_internal_flag_add()

void ast_channel_softhangup_internal_flag_add ( struct ast_channel chan,
int  value 
)

◆ ast_channel_softhangup_internal_flag_clear()

void ast_channel_softhangup_internal_flag_clear ( struct ast_channel chan,
int  value 
)

Definition at line 876 of file channel_internal_api.c.

877{
878 chan ->softhangup &= ~value;
879}

References ast_channel::softhangup.

Referenced by ast_channel_clear_softhangup().

◆ ast_channel_softhangup_internal_flag_set()

void ast_channel_softhangup_internal_flag_set ( struct ast_channel chan,
int  value 
)

Definition at line 868 of file channel_internal_api.c.

869{
870 chan->softhangup = value;
871}

References ast_channel::softhangup, and value.

Referenced by channel_do_masquerade().

◆ ast_channel_softhangup_withcause_locked()

void ast_channel_softhangup_withcause_locked ( struct ast_channel chan,
int  causecode 
)

Lock the given channel, then request softhangup on the channel with the given causecode.

Parameters
chanchannel on which to hang up
causecodecause code to use (Zero if don't use cause code)

Definition at line 469 of file channel.c.

470{
471 ast_channel_lock(chan);
472
473 if (causecode > 0) {
474 ast_debug(1, "Setting hangupcause of channel %s to %d (is %d now)\n",
475 ast_channel_name(chan), causecode, ast_channel_hangupcause(chan));
476
477 ast_channel_hangupcause_set(chan, causecode);
478 }
479
481
482 ast_channel_unlock(chan);
483}
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
Softly hangup a channel, don't lock.
Definition channel.c:2449

References ast_channel_hangupcause(), ast_channel_hangupcause_set(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_debug, AST_SOFTHANGUP_EXPLICIT, and ast_softhangup_nolock().

Referenced by action_hangup().

◆ ast_channel_start_silence_generator()

struct ast_silence_generator * ast_channel_start_silence_generator ( struct ast_channel chan)

Starts a silence generator on the given channel.

Parameters
chanThe channel to generate silence on
Returns
An ast_silence_generator pointer, or NULL if an error occurs

This function will cause SLINEAR silence to be generated on the supplied channel until it is disabled; if the channel cannot be put into SLINEAR mode then the function will fail.

Note
The pointer returned by this function must be preserved and passed to ast_channel_stop_silence_generator when you wish to stop the silence generation.

Definition at line 8248 of file channel.c.

8249{
8251
8252 if (!(state = ast_calloc(1, sizeof(*state)))) {
8253 return NULL;
8254 }
8255
8256 state->old_write_format = ao2_bump(ast_channel_writeformat(chan));
8257
8258 if (ast_set_write_format(chan, ast_format_slin) < 0) {
8259 ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
8260 ast_free(state);
8261 return NULL;
8262 }
8263
8265
8266 ast_debug(1, "Started silence generator on '%s'\n", ast_channel_name(chan));
8267
8268 return state;
8269}
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition channel.c:2967
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition channel.c:5838
static struct ast_generator silence_generator
Definition channel.c:8238
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.

References ao2_bump, ast_activate_generator(), ast_calloc, ast_channel_name(), ast_channel_writeformat(), ast_debug, ast_format_slin, ast_free, ast_log, ast_set_write_format(), LOG_ERROR, NULL, and silence_generator.

Referenced by __ast_play_and_record(), app_control_silence_start(), ast_readstring_full(), channel_spy(), control_streamfile(), do_broadcast(), dtmf_stream(), handle_recordfile(), mf_stream(), participant_entertainment_start(), record_exec(), safe_sleep_conditional(), sf_stream(), sub_start_silence(), waitfor_exec(), and waitforring_exec().

◆ ast_channel_state()

enum ast_channel_state ast_channel_state ( const struct ast_channel chan)

Definition at line 656 of file channel_internal_api.c.

657{
658 return chan->state;
659}

References ast_channel::state.

◆ ast_channel_state_set()

void ast_channel_state_set ( struct ast_channel chan,
enum  ast_channel_state 
)

◆ ast_channel_stop_silence_generator()

void ast_channel_stop_silence_generator ( struct ast_channel chan,
struct ast_silence_generator state 
)

Stops a previously-started silence generator on the given channel.

Parameters
chanThe channel to operate on
stateThe ast_silence_generator pointer return by a previous call to ast_channel_start_silence_generator.

This function will stop the operating silence generator and return the channel to its previous write format.

Definition at line 8294 of file channel.c.

8295{
8296 if (!state) {
8297 return;
8298 }
8299
8300 if (deactivate_silence_generator(chan)) {
8301 ast_debug(1, "Stopped silence generator on '%s'\n", ast_channel_name(chan));
8302 if (ast_set_write_format(chan, state->old_write_format) < 0) {
8303 ast_log(LOG_ERROR, "Could not return write format to its original state\n");
8304 }
8305 }
8306 ao2_cleanup(state->old_write_format);
8307 ast_free(state);
8308}
static int deactivate_silence_generator(struct ast_channel *chan)
Definition channel.c:8271

References ao2_cleanup, ast_channel_name(), ast_debug, ast_free, ast_log, ast_set_write_format(), deactivate_silence_generator(), and LOG_ERROR.

Referenced by __ast_play_and_record(), app_control_silence_start(), ast_readstring_full(), channel_spy(), control_silence_stop_now(), control_streamfile(), do_broadcast(), dtmf_stream(), handle_recordfile(), mf_stream(), participant_entertainment_stop(), record_exec(), safe_sleep_conditional(), sf_stream(), sub_stop_silence(), waitfor_exec(), and waitforring_exec().

◆ ast_channel_stream()

struct ast_filestream * ast_channel_stream ( const struct ast_channel chan)

◆ ast_channel_stream_set()

void ast_channel_stream_set ( struct ast_channel chan,
struct ast_filestream value 
)

◆ ast_channel_stream_topology_changed()

int ast_channel_stream_topology_changed ( struct ast_channel chan,
struct ast_stream_topology topology 
)

Provide notice to a channel that the stream topology has changed.

Parameters
chanThe channel to provide notice to
topologyThe new stream topology
Precondition
chan is locked Absolutely NO other channels can be locked.
Return values
0success
-1failure
Note
This interface is provided for applications and resources to accept a topology change. It is not for use by the channel driver itself.

Definition at line 11084 of file channel.c.

11085{
11086 ast_assert(chan != NULL);
11087 ast_assert(topology != NULL);
11088
11090 return -1;
11091 }
11092
11093 return ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, topology, sizeof(topology));
11094}
@ AST_CONTROL_STREAM_TOPOLOGY_CHANGED

References ast_assert, ast_channel_is_multistream(), AST_CONTROL_STREAM_TOPOLOGY_CHANGED, indicate(), ast_channel_tech::indicate, and NULL.

Referenced by __ast_read(), AST_TEST_DEFINE(), and AST_TEST_DEFINE().

◆ ast_channel_stream_topology_changed_externally()

int ast_channel_stream_topology_changed_externally ( struct ast_channel chan)

Provide notice from a channel that the topology has changed on it as a result of the remote party renegotiating.

Parameters
chanThe channel to provide notice from
Return values
0success
-1failure
Note
This interface is provided for channels to provide notice that a topology change has occurred as a result of a remote party renegotiating the stream topology.

Definition at line 11096 of file channel.c.

11097{
11098 int res;
11100
11101 ast_assert(chan != NULL);
11102
11103 if (!ast_channel_is_multistream(chan)) {
11104 return -1;
11105 }
11106
11107 ast_channel_lock(chan);
11109 res = ast_queue_frame(chan, &f);
11110 ast_channel_unlock(chan);
11111
11112 return res;
11113}
static const char ast_stream_topology_changed_external[]
Set as the change source reason when a channel stream topology has been changed externally as a resul...
Definition channel.h:223

References ast_assert, ast_channel_internal_set_stream_topology_change_source(), ast_channel_is_multistream(), ast_channel_lock, ast_channel_unlock, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, AST_FRAME_CONTROL, ast_queue_frame(), ast_stream_topology_changed_external, ast_frame_subclass::integer, NULL, and ast_frame::subclass.

Referenced by handle_negotiated_sdp(), and unreal_colp_stream_topology_request_change().

◆ ast_channel_streamid()

int ast_channel_streamid ( const struct ast_channel chan)

Definition at line 333 of file channel_internal_api.c.

334{
335 return chan->streamid;
336}

References ast_channel::streamid.

Referenced by filestream_close(), handle_speechrecognize(), and speech_background().

◆ ast_channel_streamid_set()

void ast_channel_streamid_set ( struct ast_channel chan,
int  value 
)

Definition at line 337 of file channel_internal_api.c.

338{
339 chan->streamid = value;
340}

References ast_channel::streamid, and value.

Referenced by __ast_channel_alloc_ap(), ast_readaudio_callback(), and filestream_close().

◆ ast_channel_string2amaflag()

enum ama_flags ast_channel_string2amaflag ( const char *  flag)

Convert a string to a detail record AMA flag.

Since
12
Parameters
flagstring form of flag
Return values
theenum (integer) form of the flag

Definition at line 4394 of file channel.c.

4395{
4396 if (!strcasecmp(flag, "default"))
4397 return DEFAULT_AMA_FLAGS;
4398 if (!strcasecmp(flag, "omit"))
4399 return AST_AMA_OMIT;
4400 if (!strcasecmp(flag, "billing"))
4401 return AST_AMA_BILLING;
4402 if (!strcasecmp(flag, "documentation"))
4403 return AST_AMA_DOCUMENTATION;
4404 return AST_AMA_NONE;
4405}
#define DEFAULT_AMA_FLAGS
Definition channel.c:112

References AST_AMA_BILLING, AST_AMA_DOCUMENTATION, AST_AMA_NONE, AST_AMA_OMIT, and DEFAULT_AMA_FLAGS.

Referenced by build_device(), build_peer(), build_user(), build_user(), cdr_write(), func_channel_write_real(), process_dahdi(), reload_config(), and set_config().

◆ ast_channel_supports_html()

int ast_channel_supports_html ( struct ast_channel channel)

Checks for HTML support on a channel.

Returns
0 if channel does not support HTML or non-zero if it does

Definition at line 6658 of file channel.c.

6659{
6660 return (ast_channel_tech(chan)->send_html) ? 1 : 0;
6661}

Referenced by dial_exec_full(), and try_calling().

◆ ast_channel_suppress()

int ast_channel_suppress ( struct ast_channel chan,
unsigned int  direction,
enum ast_frame_type  frametype 
)

Suppress passing of a frame type on a channel.

Note
The channel should be locked before calling this function.
Parameters
chanThe channel to suppress
directionThe direction in which to suppress
frametypeThe type of frame (AST_FRAME_VOICE, etc) to suppress
Return values
0Success
-1Failure

Definition at line 10865 of file channel.c.

10866{
10867 struct suppress_data *suppress;
10868 const struct ast_datastore_info *datastore_info = NULL;
10869 struct ast_datastore *datastore = NULL;
10870 struct ast_framehook_interface interface = {
10872 .event_cb = suppress_framehook_event_cb,
10873 .destroy_cb = suppress_framehook_destroy_cb,
10874 .chan_fixup_cb = suppress_framehook_fixup_cb,
10875 };
10876 int framehook_id;
10877
10878 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10879 ast_log(LOG_WARNING, "Attempted to suppress an unsupported frame type (%u).\n", frametype);
10880 return -1;
10881 }
10882
10883 if ((datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10884 suppress = datastore->data;
10885 suppress->direction |= direction;
10886 return 0;
10887 }
10888
10889 if (!(suppress = ao2_alloc(sizeof(*suppress), NULL))) {
10890 ast_log(LOG_WARNING, "Failed to allocate data while attempting to suppress a stream.\n");
10891 return -1;
10892 }
10893
10894 suppress->frametype = frametype;
10895 suppress->direction |= direction;
10896
10897 interface.data = suppress;
10898
10899 framehook_id = ast_framehook_attach(chan, &interface);
10900 if (framehook_id < 0) {
10901 /* Hook attach failed. Get rid of the evidence. */
10902 ast_log(LOG_WARNING, "Failed to attach framehook while attempting to suppress a stream.\n");
10903 ao2_ref(suppress, -1);
10904 return -1;
10905 }
10906
10907 /* One ref for the framehook */
10908 ao2_ref(suppress, +1);
10909
10910 suppress->framehook_id = framehook_id;
10911
10912 if (!(datastore = ast_datastore_alloc(datastore_info, NULL))) {
10913 ast_log(LOG_WARNING, "Failed to allocate datastore while attempting to suppress a stream.\n");
10914 ast_framehook_detach(chan, framehook_id);
10915 ao2_ref(suppress, -1);
10916 return -1;
10917 }
10918
10919 /* the ref provided by the allocation is taken by the datastore */
10920 datastore->data = suppress;
10921
10922 ast_channel_datastore_add(chan, datastore);
10923
10924 return 0;
10925}
static void suppress_framehook_fixup_cb(void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
Definition channel.c:10813
static const struct ast_datastore_info * suppress_get_datastore_information(enum ast_frame_type frametype)
Definition channel.c:10855
static void suppress_framehook_destroy_cb(void *data)
Definition channel.c:10802
static struct ast_frame * suppress_framehook_event_cb(struct ast_channel *chan, struct ast_frame *frame, enum ast_framehook_event event, void *data)
Definition channel.c:10820
int ast_framehook_attach(struct ast_channel *chan, struct ast_framehook_interface *i)
Attach an framehook onto a channel for frame interception.
Definition framehook.c:132
int ast_framehook_detach(struct ast_channel *chan, int framehook_id)
Detach an framehook from a channel.
Definition framehook.c:177
#define AST_FRAMEHOOK_INTERFACE_VERSION
Definition framehook.h:227
Structure for a data store type.
Definition datastore.h:31
enum ast_frame_type frametype
Definition channel.c:10808
unsigned int direction
Definition channel.c:10809

References ao2_alloc, ao2_ref, ast_channel_datastore_add(), ast_channel_datastore_find(), ast_datastore_alloc, ast_framehook_attach(), ast_framehook_detach(), AST_FRAMEHOOK_INTERFACE_VERSION, ast_log, ast_datastore::data, ast_framehook_interface::data, suppress_data::direction, suppress_data::framehook_id, suppress_data::frametype, LOG_WARNING, NULL, suppress_framehook_destroy_cb(), suppress_framehook_event_cb(), suppress_framehook_fixup_cb(), suppress_get_datastore_information(), and ast_framehook_interface::version.

Referenced by app_control_mute(), and mute_channel().

◆ ast_channel_tech()

const struct ast_channel_tech * ast_channel_tech ( const struct ast_channel chan)

Definition at line 636 of file channel_internal_api.c.

637{
638 return chan->tech;
639}

References ast_channel::tech.

◆ ast_channel_tech_hangupcause()

int ast_channel_tech_hangupcause ( const struct ast_channel chan)

◆ ast_channel_tech_hangupcause_set()

void ast_channel_tech_hangupcause_set ( struct ast_channel chan,
int  value 
)

◆ ast_channel_tech_pvt()

void * ast_channel_tech_pvt ( const struct ast_channel chan)

Definition at line 437 of file channel_internal_api.c.

438{
439 return chan->tech_pvt;
440}

References ast_channel::tech_pvt.

Referenced by __analog_ss_thread(), __dahdi_exception(), acf_channel_read(), analog_hangup(), analog_ss_thread(), announce_hangup(), aoc_framehook(), ast_channel_destructor(), ast_local_get_peer(), ast_local_lock_all(), ast_local_setup_bridge(), ast_local_setup_masquerade(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_unreal_answer(), ast_unreal_channel_push_to_bridge(), ast_unreal_digit_begin(), ast_unreal_digit_end(), ast_unreal_fixup(), ast_unreal_indicate(), ast_unreal_queryoption(), ast_unreal_sendhtml(), ast_unreal_sendtext(), ast_unreal_setoption(), ast_unreal_write_stream(), audiosocket_call(), audiosocket_hangup(), audiosocket_read(), audiosocket_send_dtmf(), audiosocket_write(), chan_pjsip_answer(), chan_pjsip_call(), chan_pjsip_digit_begin(), chan_pjsip_digit_end(), chan_pjsip_fixup(), chan_pjsip_get_rtp_peer(), chan_pjsip_get_uniqueid(), chan_pjsip_get_vrtp_peer(), chan_pjsip_hangup(), chan_pjsip_indicate(), chan_pjsip_queryoption(), chan_pjsip_read_stream(), chan_pjsip_sendtext_data(), chan_pjsip_set_rtp_peer(), chan_pjsip_transfer(), chan_pjsip_write_stream(), chan_rtp_get_rtp_peer(), channel_do_masquerade(), channel_read_pjsip(), channel_read_rtcp(), channel_read_rtp(), channel_to_session(), cli_channelstats_print_body(), conf_announce_channel_push(), console_answer(), console_call(), console_fixup(), console_hangup(), console_indicate(), console_write(), dahdi_answer(), dahdi_call(), dahdi_callwait(), dahdi_digit_begin(), dahdi_digit_end(), dahdi_exception(), dahdi_fixup(), dahdi_func_read(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_queryoption(), dahdi_read(), dahdi_sendtext(), dahdi_setoption(), dahdi_write(), dahdichan_helper(), func_read_header(), func_read_headers(), func_read_param(), func_response_read_header(), func_response_read_headers(), func_write_header(), func_write_param(), function_iaxpeer(), function_ooh323_read(), function_ooh323_write(), hangup(), iax2_answer(), iax2_call(), iax2_digit_begin(), iax2_digit_end(), iax2_fixup(), iax2_hangup(), iax2_indicate(), iax2_prov_app(), iax2_queryoption(), iax2_sendhtml(), iax2_sendimage(), iax2_sendtext(), iax2_setoption(), iax2_transfer(), iax2_write(), jingle_answer(), jingle_call(), jingle_digit_begin(), jingle_digit_end(), jingle_fixup(), jingle_get_rtp_peer(), jingle_hangup(), jingle_indicate(), jingle_read(), jingle_sendtext(), jingle_write(), load_stream_readqueue(), local_call(), local_hangup(), manager_optimize_away(), mbl_answer(), mbl_call(), mbl_digit_end(), mbl_fixup(), mbl_hangup(), mbl_read(), mbl_write(), media_hangup(), mock_channel_hangup(), mock_channel_indicate(), mock_channel_read(), mock_channel_write(), mock_channel_write_stream(), my_get_sigpvt_bridged_channel(), native_bridge_is_capable(), native_chan_changed(), native_start(), native_stop(), ooh323_answer(), ooh323_call(), ooh323_digit_begin(), ooh323_digit_end(), ooh323_fixup(), ooh323_get_codec(), ooh323_get_rtp_peer(), ooh323_get_vrtp_peer(), ooh323_hangup(), ooh323_indicate(), ooh323_queryoption(), ooh323_read(), ooh323_set_rtp_peer(), ooh323_write(), pjsip_acf_channel_read(), pjsip_acf_dtmf_mode_read(), pjsip_acf_dtmf_mode_write(), pjsip_acf_media_offer_read(), pjsip_acf_media_offer_write(), pjsip_acf_moh_passthrough_read(), pjsip_acf_moh_passthrough_write(), pjsip_acf_session_refresh_write(), pjsip_app_hangup_handler(), pjsip_transfer_handling_write(), polarity_read(), polarity_write(), push_notify_channel(), read_test(), rtp_call(), rtp_hangup(), rtp_read(), rtp_write(), send_direct_media_request(), sendtext_data_create(), snoop_fixup(), snoop_hangup(), snoop_read(), snoop_write(), stasis_app_channel_unreal_set_internal(), t38_framehook(), test_bridging_chan_hangup(), test_bridging_chan_indicate(), unistim_answer(), unistim_call(), unistim_fixup(), unistim_get_rtp_peer(), unistim_hangup(), unistim_indicate(), unistim_read(), unistim_set_rtp_peer(), unistim_ss(), unistim_write(), webchan_call(), webchan_hangup(), webchan_read(), webchan_send_dtmf_text(), and webchan_write().

◆ ast_channel_tech_pvt_set()

void ast_channel_tech_pvt_set ( struct ast_channel chan,
void *  value 
)

◆ ast_channel_tech_set()

void ast_channel_tech_set ( struct ast_channel chan,
const struct ast_channel_tech value 
)

◆ ast_channel_tenantid()

const char * ast_channel_tenantid ( const struct ast_channel chan)

Definition at line 173 of file channel_internal_api.c.

174{
175 /* It's ok for tenantid to be empty, so no need to assert */
176 return chan->linkedid.tenant_id;
177}
char tenant_id[AST_MAX_TENANT_ID]

References ast_channel::linkedid, and ast_channel_id::tenant_id.

Referenced by channel_snapshot_base_create(), func_channel_read(), and handle_showchan().

◆ ast_channel_tenantid_set()

void ast_channel_tenantid_set ( struct ast_channel chan,
const char *  value 
)

◆ ast_channel_timer()

struct ast_timer * ast_channel_timer ( const struct ast_channel chan)

◆ ast_channel_timer_set()

void ast_channel_timer_set ( struct ast_channel chan,
struct ast_timer value 
)

Definition at line 608 of file channel_internal_api.c.

609{
610 chan->timer = value;
611}

References ast_channel::timer, and value.

Referenced by __ast_channel_alloc_ap(), and ast_channel_destructor().

◆ ast_channel_timingdata()

void * ast_channel_timingdata ( const struct ast_channel chan)

Definition at line 448 of file channel_internal_api.c.

449{
450 return chan->timingdata;
451}

References ast_channel::timingdata.

Referenced by __ast_read(), and ast_settimeout_full().

◆ ast_channel_timingdata_set()

void ast_channel_timingdata_set ( struct ast_channel chan,
void *  value 
)

Definition at line 452 of file channel_internal_api.c.

453{
454 chan->timingdata = value;
455}

References ast_channel::timingdata, and value.

Referenced by ast_settimeout_full().

◆ ast_channel_timingfd()

int ast_channel_timingfd ( const struct ast_channel chan)

◆ ast_channel_timingfd_set()

void ast_channel_timingfd_set ( struct ast_channel chan,
int  value 
)

Definition at line 345 of file channel_internal_api.c.

346{
347 chan->timingfd = value;
348}

References ast_channel::timingfd, and value.

Referenced by __ast_channel_alloc_ap(), and __ast_dummy_channel_alloc().

◆ ast_channel_timingfunc()

ast_timing_func_t ast_channel_timingfunc ( const struct ast_channel chan)

◆ ast_channel_timingfunc_set()

void ast_channel_timingfunc_set ( struct ast_channel chan,
ast_timing_func_t  value 
)

Definition at line 1102 of file channel_internal_api.c.

1103{
1104 chan->timingfunc = value;
1105}

References ast_channel::timingfunc, and value.

Referenced by ast_settimeout_full().

◆ ast_channel_topic()

struct stasis_topic * ast_channel_topic ( struct ast_channel chan)

A topic which publishes the events for a particular channel.

Since
12

If the given chan is NULL, ast_channel_topic_all() is returned.

Parameters
chanChannel, or NULL.
Return values
Topicfor channel's events.
ast_channel_topic_all()if chan is NULL.

Definition at line 1418 of file channel_internal_api.c.

1419{
1420 if (!chan) {
1421 return ast_channel_topic_all();
1422 }
1423
1424 return chan->topic;
1425}
struct stasis_topic * ast_channel_topic_all(void)
A topic which publishes the events for all channels.
struct stasis_topic * topic

References ast_channel_topic_all(), and ast_channel::topic.

Referenced by ari_bridges_play_new(), ast_ari_bridges_record(), ast_channel_forward_endpoint(), ast_channel_internal_setup_topics(), ast_channel_publish_blob(), ast_channel_publish_cached_blob(), ast_channel_publish_final_snapshot(), ast_channel_publish_snapshot(), ast_multi_object_blob_single_channel_publish(), ast_refer_notify_transfer_request(), AST_TEST_DEFINE(), detect_callback(), forwards_create_channel(), local_optimization_finished_cb(), local_optimization_started_cb(), manager_mute_mixmonitor(), meetme_stasis_generate_msg(), mixmonitor_exec(), moh_post_start(), moh_post_stop(), publish_chanspy_message(), publish_chanspy_message(), publish_local_bridge_message(), publish_message_for_channel_topics(), queue_publish_multi_channel_blob(), report_fax_status(), report_receive_fax_status(), report_send_fax_status(), send_call_pickup_stasis_message(), send_conf_stasis(), stasis_app_control_publish(), stop_mixmonitor_full(), and talk_detect_audiohook_cb().

◆ ast_channel_transfercapability()

unsigned short ast_channel_transfercapability ( const struct ast_channel chan)

◆ ast_channel_transfercapability_set()

void ast_channel_transfercapability_set ( struct ast_channel chan,
unsigned short  value 
)

◆ ast_channel_unbridged()

int ast_channel_unbridged ( struct ast_channel chan)

This function will check if the bridge needs to be re-evaluated due to external changes.

Parameters
chanChannel on which to check the unbridge_eval flag
Returns
Returns 0 if the flag is down or 1 if the flag is up.

Definition at line 886 of file channel_internal_api.c.

887{
888 int res;
889 ast_channel_lock(chan);
891 ast_channel_unlock(chan);
892 return res;
893}
int ast_channel_unbridged_nolock(struct ast_channel *chan)
ast_channel_unbridged variant. Use this if the channel is already locked prior to calling.

References ast_channel_lock, ast_channel_unbridged_nolock(), and ast_channel_unlock.

Referenced by ast_channel_is_leaving_bridge(), and bridge_channel_wait().

◆ ast_channel_unbridged_nolock()

int ast_channel_unbridged_nolock ( struct ast_channel chan)

ast_channel_unbridged variant. Use this if the channel is already locked prior to calling.

Parameters
chanChannel on which to check the unbridge flag
Returns
Returns 0 if the flag is down or 1 if the flag is up.

Definition at line 881 of file channel_internal_api.c.

882{
883 return chan->unbridged;
884}

References ast_channel::unbridged.

Referenced by ast_channel_unbridged().

◆ ast_channel_undefer_dtmf()

void ast_channel_undefer_dtmf ( struct ast_channel chan)

Unset defer DTMF flag on channel.

Undo defer. ast_read will return any DTMF characters that were queued

Definition at line 1329 of file channel.c.

1330{
1331 if (chan) {
1333 }
1334}
void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag)
Clear a flag on a channel.
Definition channel.c:11122

References ast_channel_clear_flag(), and AST_FLAG_DEFER_DTMF.

Referenced by __adsi_transmit_messages().

◆ ast_channel_uniqueid()

const char * ast_channel_uniqueid ( const struct ast_channel chan)

Definition at line 161 of file channel_internal_api.c.

162{
163 ast_assert(chan->uniqueid.unique_id[0] != '\0');
164 return chan->uniqueid.unique_id;
165}

References ast_assert, ast_channel_id::unique_id, and ast_channel::uniqueid.

Referenced by __ast_change_name_nolink(), _create_event_DTMF_END(), _create_event_ERROR(), _create_event_MEDIA_BUFFERING_COMPLETED(), _create_event_MEDIA_MARK_PROCESSED(), _create_event_MEDIA_START(), _create_event_nodata(), _create_event_STATUS(), action_confbridgelist_item(), action_dahdishowchannels(), app_exec(), app_subscribe_channel(), app_unsubscribe_channel(), apply_negotiated_sdp_stream(), aqm_exec(), ari_channels_handle_originate_with_id(), ari_channels_handle_snoop_channel(), ast_ari_channels_create(), ast_ari_create_per_call_websocket(), ast_attended_transfer_message_add_app(), ast_attended_transfer_message_add_link(), ast_attended_transfer_message_add_threeway(), ast_attended_transfer_message_create(), ast_blind_transfer_message_create(), ast_bridge_blob_create(), ast_bridge_publish_enter(), ast_bridge_set_single_src_video_mode(), ast_bridge_snapshot_create(), ast_bridge_transfer_blind(), ast_bridge_update_talker_src_video_mode(), ast_cel_publish_event(), ast_channel_log(), ast_channel_move(), ast_channel_publish_cached_blob(), ast_channel_publish_dial_internal(), ast_channel_publish_final_snapshot(), ast_channel_publish_snapshot(), ast_do_pickup(), ast_endpoint_add_channel(), ast_endpoint_remove_channel(), ast_str_retrieve_variable(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_var_channels_table(), blind_transfer_bridge(), bridge_channel_depart(), bridge_channel_snapshot_pair_init(), bridge_moh_create(), bridge_stasis_push_peek(), build_conf(), by_uniqueid_cb(), call(), chan_pjsip_fixup(), chan_pjsip_indicate(), chan_pjsip_new(), chan_pjsip_session_end(), channel_replaced_cb(), channel_snapshot_base_create(), channelstorage_uniqueid_cb(), conf_rec_name(), conf_run(), conf_send_event_to_participants(), create_parked_subscription_full(), detect_callback(), fast_originate(), fax_session_new(), find_by_uniqueid(), find_conf_realtime(), forwards_create_channel(), func_channel_read(), generate_status(), handle_showchan(), internal_bridge_after_cb(), jingle_enable_video(), jingle_set_owner(), local_channel_optimization_blob(), local_optimization_started_cb(), manager_mute_mixmonitor(), manager_park(), manager_park_bridged(), manager_queues_status(), masq_match_cb(), meetme_menu_admin_extended(), meetmemute(), minivm_mwi_exec(), mixmonitor_exec(), moh_post_start(), moh_post_stop(), multicast_rtp_request(), notify_new_message(), notify_new_message(), pack_channel_into_message(), park_and_announce_app_exec(), park_common_setup2(), park_local_transfer(), parking_blind_transfer_park(), parking_park_bridge_channel(), play_on_channel(), publish_chanspy_message(), publish_local_bridge_message(), queue_exec(), queue_stasis_data_alloc(), record_file(), refer_blind_callback(), report_fax_status(), report_receive_fax_status(), report_send_fax_status(), rna(), rqm_exec(), serialize_showchan(), setup_env(), setup_mixmonitor(), sfu_topologies_on_join(), sfu_topologies_on_source_change(), softmix_bridge_stream_sources_update(), start_rtp(), stasis_app_bridge_playback_channel_add(), stasis_app_control_find_by_channel(), stasis_app_control_get_channel_id(), stasis_app_control_snoop(), stasis_app_exec(), stasis_app_subscribe_channel(), stop_mixmonitor_full(), talk_detect_audiohook_cb(), test_cel_generate_peer_str(), try_calling(), unicast_rtp_request(), unistim_set_owner(), vm_execmain(), wait_for_answer(), and wait_our_turn().

◆ ast_channel_unlink()

void ast_channel_unlink ( struct ast_channel chan)

Remove a channel from the global channels container.

Parameters
chanchannel to remove

In a case where it is desired that a channel not be available in any lookups in the global channels conatiner, use this function.

Definition at line 10617 of file channel.c.

References CHANNELSTORAGE_API, current_channel_storage_instance, and remove.

Referenced by ast_channel_release(), ast_hangup(), and create_msg_q_chan().

◆ ast_channel_unregister()

void ast_channel_unregister ( const struct ast_channel_tech tech)

Unregister a channel technology.

Parameters
techStructure defining channel technology or "type" that was previously registered

Unregister a channel technology.

Definition at line 571 of file channel.c.

572{
573 struct chanlist *chan;
574
575 ast_debug(5, "Unregistering channel type '%s'\n", tech->type);
576
578
580 if (chan->tech == tech) {
582 ast_free(chan);
583 ast_verb(5, "Unregistered channel type '%s'\n", tech->type);
584 break;
585 }
586 }
588
590}
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN

References ast_debug, ast_free, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_END, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, chanlist::chan, chanlist::list, chanlist::tech, and ast_channel::tech.

Referenced by __unload_module(), __unload_module(), channels_shutdown(), load_module(), load_module(), local_shutdown(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), and unregister_channel_tech().

◆ ast_channel_unsuppress()

int ast_channel_unsuppress ( struct ast_channel chan,
unsigned int  direction,
enum ast_frame_type  frametype 
)

Stop suppressing of a frame type on a channel.

Note
The channel should be locked before calling this function.
Parameters
chanThe channel to stop suppressing
directionThe direction in which to stop suppressing
frametypeThe type of frame (AST_FRAME_VOICE, etc) to stop suppressing
Return values
0Success
-1Failure

Definition at line 10927 of file channel.c.

10928{
10929 const struct ast_datastore_info *datastore_info = NULL;
10930 struct ast_datastore *datastore = NULL;
10931 struct suppress_data *suppress;
10932
10933 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10934 ast_log(LOG_WARNING, "Attempted to unsuppress an unsupported frame type (%u).\n", frametype);
10935 return -1;
10936 }
10937
10938 if (!(datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10939 /* Nothing to do! */
10940 return 0;
10941 }
10942
10943 suppress = datastore->data;
10944
10945 suppress->direction &= ~(direction);
10946
10947 if (suppress->direction == 0) {
10948 /* Nothing left to suppress. Bye! */
10949 ast_framehook_detach(chan, suppress->framehook_id);
10950 ast_channel_datastore_remove(chan, datastore);
10951 ast_datastore_free(datastore);
10952 }
10953
10954 return 0;
10955}
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition channel.c:2385
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition datastore.c:68

References ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_datastore_free(), ast_framehook_detach(), ast_log, ast_datastore::data, suppress_data::direction, suppress_data::framehook_id, suppress_data::frametype, LOG_WARNING, NULL, and suppress_get_datastore_information().

Referenced by app_control_unmute(), and mute_channel().

◆ ast_channel_update_connected_line()

void ast_channel_update_connected_line ( struct ast_channel chan,
const struct ast_party_connected_line connected,
const struct ast_set_party_connected_line update 
)

Indicate that the connected line information has changed.

Since
1.8
Parameters
chanAsterisk channel to indicate connected line information
connectedConnected line information
updateWhat connected line information to update. NULL if all.

Definition at line 9177 of file channel.c.

9178{
9179 unsigned char data[1024]; /* This should be large enough */
9180 size_t datalen;
9181
9182 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9183 if (datalen == (size_t) -1) {
9184 return;
9185 }
9186
9187 ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
9188}
int ast_indicate_data(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Indicates condition of channel, with payload.
Definition channel.c:4688

References ast_connected_line_build_data(), AST_CONTROL_CONNECTED_LINE, ast_indicate_data(), connected, and update().

Referenced by agent_run(), app_exec(), ast_channel_connected_line_sub(), ast_do_pickup(), connectedline_write(), update_connected_line_from_peer(), update_connected_line_from_peer(), wait_for_answer(), and wait_for_answer().

◆ ast_channel_update_redirecting()

void ast_channel_update_redirecting ( struct ast_channel chan,
const struct ast_party_redirecting redirecting,
const struct ast_set_party_redirecting update 
)

Indicate that the redirecting id has changed.

Since
1.8
Parameters
chanAsterisk channel to indicate redirecting id information
redirectingRedirecting id information
updateWhat redirecting information to update. NULL if all.

Definition at line 10368 of file channel.c.

10369{
10370 unsigned char data[1024]; /* This should be large enough */
10371 size_t datalen;
10372
10373 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10374 if (datalen == (size_t) -1) {
10375 return;
10376 }
10377
10378 ast_indicate_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10379}

References AST_CONTROL_REDIRECTING, ast_indicate_data(), ast_redirecting_build_data(), and update().

Referenced by ast_channel_redirecting_sub(), call_forward_inherit(), do_forward(), redirecting_write(), and wait_for_answer().

◆ ast_channel_userfield()

const char * ast_channel_userfield ( const struct ast_channel chan)

◆ ast_channel_varshead()

struct varshead * ast_channel_varshead ( struct ast_channel chan)

◆ ast_channel_varshead_set()

void ast_channel_varshead_set ( struct ast_channel chan,
struct varshead value 
)

Definition at line 839 of file channel_internal_api.c.

840{
841 chan->varshead = *value;
842}

References value, and ast_channel::varshead.

◆ ast_channel_visible_indication()

int ast_channel_visible_indication ( const struct ast_channel chan)

Definition at line 349 of file channel_internal_api.c.

350{
351 return chan->visible_indication;
352}

References ast_channel::visible_indication.

Referenced by channel_do_masquerade(), and pre_bridge_setup().

◆ ast_channel_visible_indication_set()

void ast_channel_visible_indication_set ( struct ast_channel chan,
int  value 
)

Definition at line 353 of file channel_internal_api.c.

354{
356}

References value, and ast_channel::visible_indication.

Referenced by dial_exec_full(), and indicate_data_internal().

◆ ast_channel_vstream()

struct ast_filestream * ast_channel_vstream ( const struct ast_channel chan)

Definition at line 496 of file channel_internal_api.c.

497{
498 return chan->vstream;
499}
struct ast_filestream * vstream

References ast_channel::vstream.

Referenced by ast_hangup(), ast_openvstream(), ast_stopstream(), and filehelper().

◆ ast_channel_vstream_set()

void ast_channel_vstream_set ( struct ast_channel chan,
struct ast_filestream value 
)

Definition at line 500 of file channel_internal_api.c.

501{
502 chan->vstream = value;
503}

References value, and ast_channel::vstream.

Referenced by ast_hangup(), ast_stopstream(), filehelper(), and filestream_close().

◆ ast_channel_vstreamid()

int ast_channel_vstreamid ( const struct ast_channel chan)

Definition at line 365 of file channel_internal_api.c.

366{
367 return chan->vstreamid;
368}

References ast_channel::vstreamid.

Referenced by filestream_close().

◆ ast_channel_vstreamid_set()

void ast_channel_vstreamid_set ( struct ast_channel chan,
int  value 
)

Definition at line 369 of file channel_internal_api.c.

370{
371 chan->vstreamid = value;
372}

References value, and ast_channel::vstreamid.

Referenced by __ast_channel_alloc_ap(), ast_readvideo_callback(), and filestream_close().

◆ ast_channel_whentohangup()

struct timeval * ast_channel_whentohangup ( struct ast_channel chan)

◆ ast_channel_whentohangup_set()

void ast_channel_whentohangup_set ( struct ast_channel chan,
struct timeval *  value 
)
Precondition
chan is locked

Definition at line 835 of file channel_internal_api.c.

836{
837 chan->whentohangup = *value;
838}

References value, and ast_channel::whentohangup.

Referenced by ast_channel_setwhentohangup_tv(), and dial_exec_full().

◆ ast_channel_writeformat()

struct ast_format * ast_channel_writeformat ( struct ast_channel chan)

◆ ast_channel_writetrans()

struct ast_trans_pvt * ast_channel_writetrans ( const struct ast_channel chan)

◆ ast_channel_writetrans_set()

void ast_channel_writetrans_set ( struct ast_channel chan,
struct ast_trans_pvt value 
)

Definition at line 632 of file channel_internal_api.c.

633{
634 chan->writetrans = value;
635}

References value, and ast_channel::writetrans.

Referenced by ast_set_write_format_path(), and free_translation().

◆ ast_channel_yank()

struct ast_channel * ast_channel_yank ( struct ast_channel yankee)

Gain control of a channel in the system.

Since
12

The intention of this function is to take a channel that currently is running in one thread and gain control of it in the current thread. This can be used to redirect a channel to a different place in the dialplan, for instance.

Note
This function is NOT intended to be used on bridged channels. If you need to control a bridged channel, you can set a callback to be called once the channel exits the bridge, and run your controlling logic in that callback

XXX Put name of callback-setting function in above paragraph once it is written

Note
When this function returns successfully, the yankee channel is in a state where it cannot be used any further. Always use the returned channel instead.
absolutely NO channel locks should be held before calling this function.
The dialplan location on the returned channel is where the channel should be started in the dialplan if it is returned to it.
Parameters
yankeeThe channel to gain control of
Return values
NULLCould not gain control of the channel
non-NULLThe channel

Definition at line 10681 of file channel.c.

10682{
10683 struct ast_channel *yanked_chan;
10684 struct {
10685 char *accountcode;
10686 char *exten;
10687 char *context;
10688 char *name;
10689 int amaflags;
10690 int priority;
10691 struct ast_format *readformat;
10692 struct ast_format *writeformat;
10693 } my_vars = { 0, };
10694
10695 ast_channel_lock(yankee);
10696 my_vars.accountcode = ast_strdupa(ast_channel_accountcode(yankee));
10697 my_vars.exten = ast_strdupa(ast_channel_exten(yankee));
10698 my_vars.context = ast_strdupa(ast_channel_context(yankee));
10699 my_vars.name = ast_strdupa(ast_channel_name(yankee));
10700 my_vars.amaflags = ast_channel_amaflags(yankee);
10701 my_vars.priority = ast_channel_priority(yankee);
10702 /* The priority as returned by ast_channel_yank is where the channel
10703 * should go if the dialplan is executed on it. If the channel is
10704 * already executing dialplan then the priority currently set is
10705 * where it is currently. We increment it so it becomes where it should
10706 * execute.
10707 */
10709 my_vars.priority++;
10710 }
10711 my_vars.writeformat = ao2_bump(ast_channel_writeformat(yankee));
10712 my_vars.readformat = ao2_bump(ast_channel_readformat(yankee));
10713 ast_channel_unlock(yankee);
10714
10715 /* Do not hold any channel locks while calling channel_alloc() since the function
10716 * locks the channel container when linking the new channel in. */
10717 if (!(yanked_chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, my_vars.accountcode,
10718 my_vars.exten, my_vars.context, NULL, yankee, my_vars.amaflags,
10719 "Surrogate/%s", my_vars.name))) {
10720 ao2_cleanup(my_vars.writeformat);
10721 ao2_cleanup(my_vars.readformat);
10722 return NULL;
10723 }
10724
10725 /* Make formats okay */
10726 ast_channel_set_readformat(yanked_chan, my_vars.readformat);
10727 ast_channel_set_writeformat(yanked_chan, my_vars.writeformat);
10728 ao2_cleanup(my_vars.readformat);
10729 ao2_cleanup(my_vars.writeformat);
10730 ast_channel_priority_set(yanked_chan, my_vars.priority);
10731
10732 ast_channel_unlock(yanked_chan);
10733
10734 if (ast_channel_move(yanked_chan, yankee)) {
10735 ast_hangup(yanked_chan);
10736 return NULL;
10737 }
10738
10739 return yanked_chan;
10740}
int ast_channel_move(struct ast_channel *dest, struct ast_channel *source)
Move a channel from its current location to a new location.
Definition channel.c:10754
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
Definition channel.h:1299
@ AST_STATE_DOWN

References accountcode, ast_channel::amaflags, ao2_bump, ao2_cleanup, ast_channel_accountcode(), ast_channel_alloc, ast_channel_amaflags(), ast_channel_context(), ast_channel_exten(), ast_channel_flags(), ast_channel_lock, ast_channel_move(), ast_channel_name(), ast_channel_priority(), ast_channel_priority_set(), ast_channel_readformat(), ast_channel_set_readformat(), ast_channel_set_writeformat(), ast_channel_unlock, ast_channel_writeformat(), AST_FLAG_IN_AUTOLOOP, ast_hangup(), AST_STATE_DOWN, ast_strdupa, ast_test_flag, ast_channel::context, ast_channel::exten, name, NULL, ast_channel::priority, ast_channel::readformat, and ast_channel::writeformat.

Referenced by ast_async_goto(), and ast_bridge_add_channel().

◆ ast_channel_zone()

struct ast_tone_zone * ast_channel_zone ( const struct ast_channel chan)

◆ ast_channel_zone_set()

void ast_channel_zone_set ( struct ast_channel chan,
struct ast_tone_zone value 
)

Definition at line 616 of file channel_internal_api.c.

617{
618 chan->zone = value;
619}

References value, and ast_channel::zone.

Referenced by ast_channel_destructor(), chan_pjsip_new(), and func_channel_write_real().

◆ ast_channeltype_list()

struct ast_variable * ast_channeltype_list ( void  )

return an ast_variable list of channeltypes

Definition at line 189 of file channel.c.

190{
191 struct chanlist *cl;
192 struct ast_variable *var = NULL, *prev = NULL;
193
195 AST_RWLIST_TRAVERSE(&backends, cl, list) {
196 if (prev) {
197 if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description, "")))
198 prev = prev->next;
199 } else {
200 var = ast_variable_new(cl->tech->type, cl->tech->description, "");
201 prev = var;
202 }
203 }
205
206 return var;
207}
#define ast_variable_new(name, value, filename)
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition linkedlists.h:78

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_variable_new, NULL, chanlist::tech, and var.

Referenced by ast_var_channel_types(), and ast_var_channel_types_table().

◆ ast_check_hangup()

int ast_check_hangup ( struct ast_channel chan)

Check to see if a channel is needing hang up.

Parameters
chanchannel on which to check for hang up This function determines if the channel is being requested to be hung up.
Returns
Returns 0 if not, or 1 if hang up is requested (including time-out).

Check to see if a channel is needing hang up.

Definition at line 446 of file channel.c.

447{
448 if (ast_channel_softhangup_internal_flag(chan)) /* yes if soft hangup flag set */
449 return 1;
450 if (ast_tvzero(*ast_channel_whentohangup(chan))) /* no if no hangup scheduled */
451 return 0;
452 if (ast_tvdiff_ms(*ast_channel_whentohangup(chan), ast_tvnow()) > 0) /* no if hangup time has not come yet. */
453 return 0;
454 ast_debug(4, "Hangup time has come: %" PRIi64 "\n", ast_tvdiff_ms(*ast_channel_whentohangup(chan), ast_tvnow()));
455 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(chan));
457 return 1;
458}

References ast_channel_name(), ast_channel_softhangup_internal_flag(), ast_channel_softhangup_internal_flag_add(), ast_channel_whentohangup(), ast_debug, AST_SOFTHANGUP_TIMEOUT, ast_test_suite_event_notify, ast_tvdiff_ms(), ast_tvnow(), and ast_tvzero().

Referenced by __ast_pbx_run(), __ast_read(), agent_request_exec(), agi_exec(), announce_thread(), app_exec(), ast_bridge_setup_after_goto(), ast_call(), ast_check_hangup_locked(), ast_indicate_data(), ast_raw_answer_with_stream_topology(), ast_readstring_full(), ast_recvtext(), ast_sendtext_data(), ast_transfer_protocol(), ast_unreal_fixup(), ast_waitfordigit_full(), ast_write_stream(), autoservice_run(), call_forward_inherit(), channel_spy(), common_exec(), conf_play(), conf_run(), confbridge_exec(), dahdi_sendtext(), dahdi_setoption(), depart_channel(), dial_exec_full(), directory_exec(), dundi_lookup_internal(), eagi_exec(), eivr_comm(), fax_gateway_framehook(), find_cache(), findmeexec(), func_channel_read(), gosub_run(), handle_sendimage(), join_conference_bridge(), launch_asyncagi(), lua_check_hangup(), pbx_builtin_incomplete(), pbx_builtin_waitexten(), play_on_channel(), playback_exec(), read_exec(), readexten_exec(), run_agi(), stasis_app_exec(), transfer_target_framehook_cb(), try_calling(), vm_authenticate(), and wait_for_answer().

◆ ast_check_hangup_locked()

int ast_check_hangup_locked ( struct ast_channel chan)

◆ ast_connected_line_build_data()

int ast_connected_line_build_data ( unsigned char *  data,
size_t  datalen,
const struct ast_party_connected_line connected,
const struct ast_set_party_connected_line update 
)

Build the connected line information data frame.

Since
1.8
Parameters
dataBuffer to fill with the frame data
datalenSize of the buffer to fill
connectedConnected line information
updateWhat connected line information to build. NULL if all.
Return values
-1if error
Amountof data buffer used

Definition at line 8781 of file channel.c.

8782{
8783 int32_t value;
8784 size_t pos = 0;
8785 int res;
8786
8787 static const struct ast_party_id_ies ies = {
8789 .name.char_set = AST_CONNECTED_LINE_NAME_CHAR_SET,
8790 .name.presentation = AST_CONNECTED_LINE_NAME_PRESENTATION,
8791 .name.valid = AST_CONNECTED_LINE_NAME_VALID,
8792
8793 .number.str = AST_CONNECTED_LINE_NUMBER,
8794 .number.plan = AST_CONNECTED_LINE_NUMBER_PLAN,
8795 .number.presentation = AST_CONNECTED_LINE_NUMBER_PRESENTATION,
8796 .number.valid = AST_CONNECTED_LINE_NUMBER_VALID,
8797
8798 .subaddress.str = AST_CONNECTED_LINE_SUBADDRESS,
8799 .subaddress.type = AST_CONNECTED_LINE_SUBADDRESS_TYPE,
8800 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN,
8801 .subaddress.valid = AST_CONNECTED_LINE_SUBADDRESS_VALID,
8802
8804 .combined_presentation = AST_CONNECTED_LINE_ID_PRESENTATION,
8805 };
8806
8807 static const struct ast_party_id_ies priv_ies = {
8810 .name.presentation = AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION,
8812
8813 .number.str = AST_CONNECTED_LINE_PRIV_NUMBER,
8815 .number.presentation = AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION,
8817
8818 .subaddress.str = AST_CONNECTED_LINE_PRIV_SUBADDRESS,
8819 .subaddress.type = AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE,
8820 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN,
8821 .subaddress.valid = AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID,
8822
8824 .combined_presentation = 0,/* Not sent. */
8825 };
8826
8827 /*
8828 * The size of integer values must be fixed in case the frame is
8829 * shipped to another machine.
8830 */
8831
8832 /* Connected line frame version */
8833 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8834 ast_log(LOG_WARNING, "No space left for connected line frame version\n");
8835 return -1;
8836 }
8837 data[pos++] = AST_CONNECTED_LINE_VERSION;
8838 data[pos++] = 1;
8839 data[pos++] = 2;/* Version 1 did not have a version ie */
8840
8841 res = party_id_build_data(data + pos, datalen - pos, &connected->id,
8842 "connected line", &ies, update ? &update->id : NULL);
8843 if (res < 0) {
8844 return -1;
8845 }
8846 pos += res;
8847
8848 res = party_id_build_data(data + pos, datalen - pos, &connected->priv,
8849 "connected line priv", &priv_ies, update ? &update->priv : NULL);
8850 if (res < 0) {
8851 return -1;
8852 }
8853 pos += res;
8854
8855 /* Connected line source */
8856 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
8857 ast_log(LOG_WARNING, "No space left for connected line source\n");
8858 return -1;
8859 }
8860 data[pos++] = AST_CONNECTED_LINE_SOURCE;
8861 data[pos++] = sizeof(value);
8862 value = htonl(connected->source);
8863 memcpy(data + pos, &value, sizeof(value));
8864 pos += sizeof(value);
8865
8866 return pos;
8867}
@ AST_CONNECTED_LINE_NUMBER_VALID
Definition channel.c:8764
@ AST_CONNECTED_LINE_SOURCE
Definition channel.c:8750
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID
Definition channel.c:8777
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN
Definition channel.c:8776
@ AST_CONNECTED_LINE_PRIV_NAME_VALID
Definition channel.c:8771
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE
Definition channel.c:8775
@ AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION
Definition channel.c:8769
@ AST_CONNECTED_LINE_NAME_CHAR_SET
Definition channel.c:8762
@ AST_CONNECTED_LINE_SUBADDRESS_VALID
Definition channel.c:8754
@ AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN
Definition channel.c:8753
@ AST_CONNECTED_LINE_SUBADDRESS
Definition channel.c:8751
@ AST_CONNECTED_LINE_PRIV_NUMBER_PLAN
Definition channel.c:8767
@ AST_CONNECTED_LINE_NUMBER
Definition channel.c:8746
@ AST_CONNECTED_LINE_ID_PRESENTATION
Definition channel.c:8749
@ AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION
Definition channel.c:8773
@ AST_CONNECTED_LINE_PRIV_NAME
Definition channel.c:8770
@ AST_CONNECTED_LINE_TAG
Definition channel.c:8755
@ AST_CONNECTED_LINE_PRIV_NUMBER_VALID
Definition channel.c:8768
@ AST_CONNECTED_LINE_NUMBER_PRESENTATION
Definition channel.c:8765
@ AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET
Definition channel.c:8772
@ AST_CONNECTED_LINE_NAME
Definition channel.c:8747
@ AST_CONNECTED_LINE_NAME_PRESENTATION
Definition channel.c:8763
@ AST_CONNECTED_LINE_SUBADDRESS_TYPE
Definition channel.c:8752
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS
Definition channel.c:8774
@ AST_CONNECTED_LINE_PRIV_TAG
Definition channel.c:8778
@ AST_CONNECTED_LINE_NAME_VALID
Definition channel.c:8761
@ AST_CONNECTED_LINE_PRIV_NUMBER
Definition channel.c:8766
@ AST_CONNECTED_LINE_NUMBER_PLAN
Definition channel.c:8748
@ AST_CONNECTED_LINE_VERSION
Definition channel.c:8756
static int party_id_build_data(unsigned char *data, size_t datalen, const struct ast_party_id *id, const char *label, const struct ast_party_id_ies *ies, const struct ast_set_party_id *update)
Definition channel.c:8661
struct ast_party_name_ies name
Subscriber name ies.
Definition channel.c:8632
int str
Subscriber name ie.
Definition channel.c:8409

References AST_CONNECTED_LINE_ID_PRESENTATION, AST_CONNECTED_LINE_NAME, AST_CONNECTED_LINE_NAME_CHAR_SET, AST_CONNECTED_LINE_NAME_PRESENTATION, AST_CONNECTED_LINE_NAME_VALID, AST_CONNECTED_LINE_NUMBER, AST_CONNECTED_LINE_NUMBER_PLAN, AST_CONNECTED_LINE_NUMBER_PRESENTATION, AST_CONNECTED_LINE_NUMBER_VALID, AST_CONNECTED_LINE_PRIV_NAME, AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET, AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION, AST_CONNECTED_LINE_PRIV_NAME_VALID, AST_CONNECTED_LINE_PRIV_NUMBER, AST_CONNECTED_LINE_PRIV_NUMBER_PLAN, AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION, AST_CONNECTED_LINE_PRIV_NUMBER_VALID, AST_CONNECTED_LINE_PRIV_SUBADDRESS, AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN, AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE, AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID, AST_CONNECTED_LINE_PRIV_TAG, AST_CONNECTED_LINE_SOURCE, AST_CONNECTED_LINE_SUBADDRESS, AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN, AST_CONNECTED_LINE_SUBADDRESS_TYPE, AST_CONNECTED_LINE_SUBADDRESS_VALID, AST_CONNECTED_LINE_TAG, AST_CONNECTED_LINE_VERSION, ast_log, connected, LOG_WARNING, ast_party_id_ies::name, NULL, party_id_build_data(), ast_party_name_ies::str, update(), and value.

Referenced by after_bridge_move_channel(), ast_channel_queue_connected_line_update(), ast_channel_update_connected_line(), bridge_reconfigured_connected_line_update(), indicate_connected_line(), send_colp_to_agent(), and unreal_colp_redirect_indicate().

◆ ast_connected_line_copy_from_caller()

void ast_connected_line_copy_from_caller ( struct ast_party_connected_line dest,
const struct ast_party_caller src 
)

Copy the caller information to the connected line information.

Since
1.8
Parameters
destDestination connected line information
srcSource caller information
Note
Assumes locks are already acquired

Definition at line 8377 of file channel.c.

8378{
8379 ast_party_id_copy(&dest->id, &src->id);
8380 ast_party_id_copy(&dest->ani, &src->ani);
8381 dest->ani2 = src->ani2;
8382}
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition channel.c:1752
struct ast_party_id id
Caller party ID.
Definition channel.h:422
int ani2
Automatic Number Identification 2 (Info Digits)
Definition channel.h:435
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition channel.h:429
int ani2
Automatic Number Identification 2 (Info Digits)
Definition channel.h:477
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition channel.h:467

References ast_party_caller::ani, ast_party_connected_line::ani, ast_party_caller::ani2, ast_party_connected_line::ani2, ast_party_id_copy(), ast_party_caller::id, and ast_party_connected_line::id.

Referenced by after_bridge_move_channel(), agent_request_exec(), app_exec(), ast_ari_channels_dial(), ast_do_pickup(), ast_unreal_call_setup(), begin_dial_prerun(), bridge_reconfigured_connected_line_update(), copy_caller_data(), dial_exec_full(), do_forward(), findmeexec(), park_local_transfer(), ring_entry(), update_connected_line_from_peer(), update_connected_line_from_peer(), and wait_for_answer().

◆ ast_connected_line_copy_to_caller()

void ast_connected_line_copy_to_caller ( struct ast_party_caller dest,
const struct ast_party_connected_line src 
)

Copy the connected line information to the caller information.

Since
1.8
Parameters
destDestination caller information
srcSource connected line information
Note
Assumes locks are already acquired

Definition at line 8384 of file channel.c.

8385{
8386 ast_party_id_copy(&dest->id, &src->id);
8387 ast_party_id_copy(&dest->ani, &src->ani);
8388
8389 dest->ani2 = src->ani2;
8390}

References ast_party_caller::ani, ast_party_connected_line::ani, ast_party_caller::ani2, ast_party_connected_line::ani2, ast_party_id_copy(), ast_party_caller::id, and ast_party_connected_line::id.

Referenced by ast_unreal_call_setup(), and unreal_colp_redirect_indicate().

◆ ast_connected_line_parse_data()

int ast_connected_line_parse_data ( const unsigned char *  data,
size_t  datalen,
struct ast_party_connected_line connected 
)

Parse connected line indication frame data.

Since
1.8
Parameters
dataBuffer with the frame data to parse
datalenSize of the buffer
connectedExtracted connected line information
Return values
0on success.
-1on error.
Note
The filled in connected line structure needs to be initialized by ast_party_connected_line_set_init() before calling. If defaults are not required use ast_party_connected_line_init().
The filled in connected line structure needs to be destroyed by ast_party_connected_line_free() when it is no longer needed.

Definition at line 8869 of file channel.c.

8870{
8871 size_t pos;
8872 unsigned char ie_len;
8873 unsigned char ie_id;
8874 int32_t value;
8875 int frame_version = 1;
8876 int combined_presentation = 0;
8877 int got_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
8878
8879 for (pos = 0; pos < datalen; pos += ie_len) {
8880 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
8881 ast_log(LOG_WARNING, "Invalid connected line update\n");
8882 return -1;
8883 }
8884 ie_id = data[pos++];
8885 ie_len = data[pos++];
8886 if (datalen < pos + ie_len) {
8887 ast_log(LOG_WARNING, "Invalid connected line update\n");
8888 return -1;
8889 }
8890
8891 switch (ie_id) {
8892/* Connected line party frame version */
8894 if (ie_len != 1) {
8895 ast_log(LOG_WARNING, "Invalid connected line frame version (%u)\n",
8896 (unsigned) ie_len);
8897 break;
8898 }
8899 frame_version = data[pos];
8900 break;
8901/* Connected line party id name */
8903 ast_free(connected->id.name.str);
8904 connected->id.name.str = ast_malloc(ie_len + 1);
8905 if (connected->id.name.str) {
8906 memcpy(connected->id.name.str, data + pos, ie_len);
8907 connected->id.name.str[ie_len] = 0;
8908 }
8909 break;
8911 if (ie_len != 1) {
8912 ast_log(LOG_WARNING, "Invalid connected line name char set (%u)\n",
8913 (unsigned) ie_len);
8914 break;
8915 }
8916 connected->id.name.char_set = data[pos];
8917 break;
8919 if (ie_len != 1) {
8920 ast_log(LOG_WARNING, "Invalid connected line name presentation (%u)\n",
8921 (unsigned) ie_len);
8922 break;
8923 }
8924 connected->id.name.presentation = data[pos];
8925 break;
8927 if (ie_len != 1) {
8928 ast_log(LOG_WARNING, "Invalid connected line name valid (%u)\n",
8929 (unsigned) ie_len);
8930 break;
8931 }
8932 connected->id.name.valid = data[pos];
8933 break;
8934/* Connected line party id number */
8936 ast_free(connected->id.number.str);
8937 connected->id.number.str = ast_malloc(ie_len + 1);
8938 if (connected->id.number.str) {
8939 memcpy(connected->id.number.str, data + pos, ie_len);
8940 connected->id.number.str[ie_len] = 0;
8941 }
8942 break;
8944 if (ie_len != 1) {
8945 ast_log(LOG_WARNING, "Invalid connected line numbering plan (%u)\n",
8946 (unsigned) ie_len);
8947 break;
8948 }
8949 connected->id.number.plan = data[pos];
8950 break;
8952 if (ie_len != 1) {
8953 ast_log(LOG_WARNING, "Invalid connected line number presentation (%u)\n",
8954 (unsigned) ie_len);
8955 break;
8956 }
8957 connected->id.number.presentation = data[pos];
8958 break;
8960 if (ie_len != 1) {
8961 ast_log(LOG_WARNING, "Invalid connected line number valid (%u)\n",
8962 (unsigned) ie_len);
8963 break;
8964 }
8965 connected->id.number.valid = data[pos];
8966 break;
8967/* Connected line party id subaddress */
8969 ast_free(connected->id.subaddress.str);
8970 connected->id.subaddress.str = ast_malloc(ie_len + 1);
8971 if (connected->id.subaddress.str) {
8972 memcpy(connected->id.subaddress.str, data + pos, ie_len);
8973 connected->id.subaddress.str[ie_len] = 0;
8974 }
8975 break;
8977 if (ie_len != 1) {
8978 ast_log(LOG_WARNING, "Invalid connected line type of subaddress (%u)\n",
8979 (unsigned) ie_len);
8980 break;
8981 }
8982 connected->id.subaddress.type = data[pos];
8983 break;
8985 if (ie_len != 1) {
8987 "Invalid connected line subaddress odd-even indicator (%u)\n",
8988 (unsigned) ie_len);
8989 break;
8990 }
8991 connected->id.subaddress.odd_even_indicator = data[pos];
8992 break;
8994 if (ie_len != 1) {
8995 ast_log(LOG_WARNING, "Invalid connected line subaddress valid (%u)\n",
8996 (unsigned) ie_len);
8997 break;
8998 }
8999 connected->id.subaddress.valid = data[pos];
9000 break;
9001/* Connected line party tag */
9003 ast_free(connected->id.tag);
9004 connected->id.tag = ast_malloc(ie_len + 1);
9005 if (connected->id.tag) {
9006 memcpy(connected->id.tag, data + pos, ie_len);
9007 connected->id.tag[ie_len] = 0;
9008 }
9009 break;
9010/* Connected line party id combined presentation */
9012 if (ie_len != 1) {
9013 ast_log(LOG_WARNING, "Invalid connected line combined presentation (%u)\n",
9014 (unsigned) ie_len);
9015 break;
9016 }
9017 combined_presentation = data[pos];
9018 got_combined_presentation = 1;
9019 break;
9020/* Private connected line party id name */
9022 ast_free(connected->priv.name.str);
9023 connected->priv.name.str = ast_malloc(ie_len + 1);
9024 if (connected->priv.name.str) {
9025 memcpy(connected->priv.name.str, data + pos, ie_len);
9026 connected->priv.name.str[ie_len] = 0;
9027 }
9028 break;
9030 if (ie_len != 1) {
9031 ast_log(LOG_WARNING, "Invalid connected line private name char set (%u)\n",
9032 (unsigned) ie_len);
9033 break;
9034 }
9035 connected->priv.name.char_set = data[pos];
9036 break;
9038 if (ie_len != 1) {
9039 ast_log(LOG_WARNING, "Invalid connected line private name presentation (%u)\n",
9040 (unsigned) ie_len);
9041 break;
9042 }
9043 connected->priv.name.presentation = data[pos];
9044 break;
9046 if (ie_len != 1) {
9047 ast_log(LOG_WARNING, "Invalid connected line private name valid (%u)\n",
9048 (unsigned) ie_len);
9049 break;
9050 }
9051 connected->priv.name.valid = data[pos];
9052 break;
9053/* Private connected line party id number */
9055 ast_free(connected->priv.number.str);
9056 connected->priv.number.str = ast_malloc(ie_len + 1);
9057 if (connected->priv.number.str) {
9058 memcpy(connected->priv.number.str, data + pos, ie_len);
9059 connected->priv.number.str[ie_len] = 0;
9060 }
9061 break;
9063 if (ie_len != 1) {
9064 ast_log(LOG_WARNING, "Invalid connected line private numbering plan (%u)\n",
9065 (unsigned) ie_len);
9066 break;
9067 }
9068 connected->priv.number.plan = data[pos];
9069 break;
9071 if (ie_len != 1) {
9072 ast_log(LOG_WARNING, "Invalid connected line private number presentation (%u)\n",
9073 (unsigned) ie_len);
9074 break;
9075 }
9076 connected->priv.number.presentation = data[pos];
9077 break;
9079 if (ie_len != 1) {
9080 ast_log(LOG_WARNING, "Invalid connected line private number valid (%u)\n",
9081 (unsigned) ie_len);
9082 break;
9083 }
9084 connected->priv.number.valid = data[pos];
9085 break;
9086/* Private connected line party id subaddress */
9088 ast_free(connected->priv.subaddress.str);
9089 connected->priv.subaddress.str = ast_malloc(ie_len + 1);
9090 if (connected->priv.subaddress.str) {
9091 memcpy(connected->priv.subaddress.str, data + pos, ie_len);
9092 connected->priv.subaddress.str[ie_len] = 0;
9093 }
9094 break;
9096 if (ie_len != 1) {
9097 ast_log(LOG_WARNING, "Invalid connected line private type of subaddress (%u)\n",
9098 (unsigned) ie_len);
9099 break;
9100 }
9101 connected->priv.subaddress.type = data[pos];
9102 break;
9104 if (ie_len != 1) {
9106 "Invalid connected line private subaddress odd-even indicator (%u)\n",
9107 (unsigned) ie_len);
9108 break;
9109 }
9110 connected->priv.subaddress.odd_even_indicator = data[pos];
9111 break;
9113 if (ie_len != 1) {
9114 ast_log(LOG_WARNING, "Invalid connected line private subaddress valid (%u)\n",
9115 (unsigned) ie_len);
9116 break;
9117 }
9118 connected->priv.subaddress.valid = data[pos];
9119 break;
9120/* Private connected line party tag */
9122 ast_free(connected->priv.tag);
9123 connected->priv.tag = ast_malloc(ie_len + 1);
9124 if (connected->priv.tag) {
9125 memcpy(connected->priv.tag, data + pos, ie_len);
9126 connected->priv.tag[ie_len] = 0;
9127 }
9128 break;
9129/* Connected line party source */
9131 if (ie_len != sizeof(value)) {
9132 ast_log(LOG_WARNING, "Invalid connected line source (%u)\n",
9133 (unsigned) ie_len);
9134 break;
9135 }
9136 memcpy(&value, data + pos, sizeof(value));
9137 connected->source = ntohl(value);
9138 break;
9139/* Connected line party unknown element */
9140 default:
9141 ast_debug(1, "Unknown connected line element: %u (%u)\n",
9142 (unsigned) ie_id, (unsigned) ie_len);
9143 break;
9144 }
9145 }
9146
9147 switch (frame_version) {
9148 case 1:
9149 /*
9150 * The other end is an earlier version that we need to adjust
9151 * for compatibility.
9152 */
9153 connected->id.name.valid = 1;
9154 connected->id.name.char_set = AST_PARTY_CHAR_SET_ISO8859_1;
9155 connected->id.number.valid = 1;
9156 if (got_combined_presentation) {
9157 connected->id.name.presentation = combined_presentation;
9158 connected->id.number.presentation = combined_presentation;
9159 }
9160 break;
9161 case 2:
9162 /* The other end is at the same level as we are. */
9163 break;
9164 default:
9165 /*
9166 * The other end is newer than we are.
9167 * We need to assume that they are compatible with us.
9168 */
9169 ast_debug(1, "Connected line frame has newer version: %u\n",
9170 (unsigned) frame_version);
9171 break;
9172 }
9173
9174 return 0;
9175}
#define ast_malloc(len)
A wrapper for malloc()
Definition astmm.h:191

References AST_CONNECTED_LINE_ID_PRESENTATION, AST_CONNECTED_LINE_NAME, AST_CONNECTED_LINE_NAME_CHAR_SET, AST_CONNECTED_LINE_NAME_PRESENTATION, AST_CONNECTED_LINE_NAME_VALID, AST_CONNECTED_LINE_NUMBER, AST_CONNECTED_LINE_NUMBER_PLAN, AST_CONNECTED_LINE_NUMBER_PRESENTATION, AST_CONNECTED_LINE_NUMBER_VALID, AST_CONNECTED_LINE_PRIV_NAME, AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET, AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION, AST_CONNECTED_LINE_PRIV_NAME_VALID, AST_CONNECTED_LINE_PRIV_NUMBER, AST_CONNECTED_LINE_PRIV_NUMBER_PLAN, AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION, AST_CONNECTED_LINE_PRIV_NUMBER_VALID, AST_CONNECTED_LINE_PRIV_SUBADDRESS, AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN, AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE, AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID, AST_CONNECTED_LINE_PRIV_TAG, AST_CONNECTED_LINE_SOURCE, AST_CONNECTED_LINE_SUBADDRESS, AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN, AST_CONNECTED_LINE_SUBADDRESS_TYPE, AST_CONNECTED_LINE_SUBADDRESS_VALID, AST_CONNECTED_LINE_TAG, AST_CONNECTED_LINE_VERSION, ast_debug, ast_free, ast_log, ast_malloc, AST_PARTY_CHAR_SET_ISO8859_1, ast_party_id_ies::combined_presentation, connected, LOG_WARNING, and value.

Referenced by __ast_read(), ast_channel_connected_line_sub(), indicate_connected_line(), socket_process_helper(), wait_for_answer(), wait_for_answer(), and wait_for_winner().

◆ ast_deactivate_generator()

void ast_deactivate_generator ( struct ast_channel chan)

Deactivate an active generator

Definition at line 2904 of file channel.c.

2905{
2906 ast_channel_lock(chan);
2909 /* if in the middle of dtmf emulation keep 50 tick per sec timer on rolling */
2910 struct ast_timer *timer = ast_channel_timer(chan);
2911 if (timer) {
2913 } else {
2914 ast_log(LOG_WARNING, "No timing module loaded, DTMF length may be inaccurate\n");
2915 }
2916 }
2917 ast_channel_unlock(chan);
2918}
static struct ast_timer * timer
Definition chan_iax2.c:388
static void deactivate_generator_nolock(struct ast_channel *chan)
Definition channel.c:2889
static int should_trigger_dtmf_emulating(struct ast_channel *chan)
Determine whether or not we have to trigger dtmf emulating using 50 fps timer events especially when ...
Definition channel.c:2867
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
Definition timing.c:166

References ast_channel_lock, ast_channel_timer(), ast_channel_unlock, ast_log, ast_timer_set_rate(), deactivate_generator_nolock(), LOG_WARNING, should_trigger_dtmf_emulating(), and timer.

Referenced by __ast_read(), app_exec(), app_exec(), ast_playtones_stop(), ast_read_generator_actions(), ast_tonepair_stop(), ast_write_stream(), channel_spy(), dial_exec_full(), do_broadcast(), generator_force(), local_ast_moh_stop(), old_milliwatt_exec(), openstream_internal(), and wait_for_answer().

◆ ast_fdisset()

static int ast_fdisset ( struct pollfd *  pfds,
int  fd,
int  maximum,
int *  start 
)
inlinestatic

Helper function for migrating select to poll.

Definition at line 2887 of file channel.h.

2888{
2889 int x;
2890 int dummy = 0;
2891
2892 if (fd < 0)
2893 return 0;
2894 if (!start)
2895 start = &dummy;
2896 for (x = *start; x < maximum; x++)
2897 if (pfds[x].fd == fd) {
2898 if (x == *start)
2899 (*start)++;
2900 return pfds[x].revents;
2901 }
2902 return 0;
2903}

References dummy(), and ast_channel::x.

Referenced by do_monitor().

◆ ast_get_channel_tech()

const struct ast_channel_tech * ast_get_channel_tech ( const char *  name)

Get a channel technology structure by name.

Parameters
namename of technology to find
Returns
a pointer to the structure, or NULL if no matching technology found

Get a channel technology structure by name.

Definition at line 593 of file channel.c.

594{
595 struct chanlist *chanls;
596 const struct ast_channel_tech *ret = NULL;
597
599
600 AST_RWLIST_TRAVERSE(&backends, chanls, list) {
601 if (!strcasecmp(name, chanls->tech->type)) {
602 ret = chanls->tech;
603 break;
604 }
605 }
606
608
609 return ret;
610}

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, name, NULL, and chanlist::tech.

Referenced by __ast_channel_alloc_ap(), _ast_device_state(), ast_cc_callback(), ast_presence_state_helper(), and ast_var_channel_types_table().

◆ ast_get_group()

ast_group_t ast_get_group ( const char *  s)

Definition at line 7670 of file channel.c.

7671{
7672 char *piece;
7673 char *c;
7674 int start=0, finish=0, x;
7675 ast_group_t group = 0;
7676
7677 if (ast_strlen_zero(s))
7678 return 0;
7679
7680 c = ast_strdupa(s);
7681
7682 while ((piece = strsep(&c, ","))) {
7683 if (sscanf(piece, "%30d-%30d", &start, &finish) == 2) {
7684 /* Range */
7685 } else if (sscanf(piece, "%30d", &start)) {
7686 /* Just one */
7687 finish = start;
7688 } else {
7689 ast_log(LOG_ERROR, "Syntax error parsing group configuration '%s' at '%s'. Ignoring.\n", s, piece);
7690 continue;
7691 }
7692 for (x = start; x <= finish; x++) {
7693 if ((x > 63) || (x < 0)) {
7694 ast_log(LOG_WARNING, "Ignoring invalid group %d (maximum group is 63)\n", x);
7695 } else
7696 group |= ((ast_group_t) 1 << x);
7697 }
7698 }
7699 return group;
7700}
char * strsep(char **str, const char *delims)

References ast_log, ast_strdupa, ast_strlen_zero(), c, LOG_ERROR, LOG_WARNING, and strsep().

Referenced by build_device(), custom_group_handler(), func_channel_write_real(), group_handler(), and process_dahdi().

◆ ast_get_namedgroups()

struct ast_namedgroups * ast_get_namedgroups ( const char *  s)

Create an ast_namedgroups set with group names from comma separated string.

Remove leading and trailing whitespace

Definition at line 7727 of file channel.c.

7728{
7729 struct ao2_container *namedgroups;
7730 char *piece;
7731 char *c;
7732
7733 if (!s) {
7734 return NULL;
7735 }
7736
7737 /*! \brief Remove leading and trailing whitespace */
7739 if (ast_strlen_zero(c)) {
7740 return NULL;
7741 }
7742
7745 if (!namedgroups) {
7746 return NULL;
7747 }
7748
7749 while ((piece = strsep(&c, ","))) {
7750 struct namedgroup_member *member;
7751 size_t len;
7752
7753 /* remove leading/trailing whitespace */
7754 piece = ast_strip(piece);
7755
7756 len = strlen(piece);
7757 if (!len) {
7758 continue;
7759 }
7760
7762 if (!member) {
7763 ao2_ref(namedgroups, -1);
7764 return NULL;
7765 }
7766 strcpy(member->name, piece);/* Safe */
7767 member->hash = ast_str_hash(member->name);
7768
7769 /* every group name may exist only once, delete duplicates */
7770 ao2_find(namedgroups, member, OBJ_POINTER | OBJ_UNLINK | OBJ_NODATA);
7771 ao2_link(namedgroups, member);
7772 ao2_ref(member, -1);
7773 }
7774
7775 if (!ao2_container_count(namedgroups)) {
7776 /* There were no group names specified. */
7777 ao2_ref(namedgroups, -1);
7778 namedgroups = NULL;
7779 }
7780
7781 return (struct ast_namedgroups *) namedgroups;
7782}
#define OBJ_POINTER
Definition astobj2.h:1150
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition astobj2.h:404
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition astobj2.h:1303
static int namedgroup_cmp_cb(void *obj, void *arg, int flags)
Comparison function used for named group container.
Definition channel.c:7711
static int namedgroup_hash_cb(const void *obj, const int flags)
Hashing function used for named group container.
Definition channel.c:7720
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition strings.h:1259
char * ast_trim_blanks(char *str)
Trims trailing whitespace characters from a string.
Definition strings.h:186
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition strings.h:223
char *attribute_pure ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition strings.h:161
Generic container type.
Named group member structure.
Definition channel.c:7703

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_container_alloc_hash, ao2_container_count(), ao2_find, ao2_link, ao2_ref, ast_skip_blanks(), ast_str_hash(), ast_strdupa, ast_strip(), ast_strlen_zero(), ast_trim_blanks(), c, len(), namedgroup_cmp_cb(), namedgroup_hash_cb(), NULL, OBJ_NODATA, OBJ_POINTER, OBJ_UNLINK, and strsep().

Referenced by func_channel_write_real(), named_groups_handler(), and process_dahdi().

◆ ast_hangup()

void ast_hangup ( struct ast_channel chan)

Hang up a channel.

Note
Absolutely NO channel locks should be held before calling this function.
This function performs a hard hangup on a channel. Unlike the soft-hangup, this function performs all stream stopping, etc, on the channel that needs to end. chan is no longer valid after this call.
Parameters
chanchannel to hang up (NULL tolerant)

Hang up a channel.

Definition at line 2552 of file channel.c.

2553{
2554 /* Be NULL safe for RAII_VAR() usage. */
2555 if (!chan) {
2556 return;
2557 }
2558
2559 ast_debug(1, "Channel %p '%s' hanging up. Refs: %d\n", chan, ast_channel_name(chan),
2560 ao2_ref(chan, 0));
2561
2563
2564 ast_channel_lock(chan);
2565
2566 while (ast_channel_masq(chan) || ast_channel_masqr(chan)) {
2568 }
2569
2570 /* Mark as a zombie so a masquerade cannot be setup on this channel. */
2572
2573 ast_channel_unlock(chan);
2574
2575 /*
2576 * XXX if running the hangup handlers here causes problems
2577 * because the handlers take too long to execute, we could move
2578 * the meat of this function into another thread. A thread
2579 * where channels go to die.
2580 *
2581 * If this is done, ast_autoservice_chan_hangup_peer() will no
2582 * longer be needed.
2583 */
2585 ast_channel_unlink(chan);
2586 ast_channel_lock(chan);
2587
2588 destroy_hooks(chan);
2589
2590 free_translation(chan);
2591 /* Close audio stream */
2592 if (ast_channel_stream(chan)) {
2595 }
2596 /* Close video stream */
2597 if (ast_channel_vstream(chan)) {
2600 }
2601 if (ast_channel_sched(chan)) {
2604 }
2605
2606 if (ast_channel_generatordata(chan)) { /* Clear any tone stuff remaining */
2607 if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
2609 }
2610 }
2613
2615 ast_log(LOG_WARNING, "Hard hangup called by thread LWP %d on %s, while blocked by thread LWP %d in procedure %s! Expect a failure\n",
2617 ast_channel_blockproc(chan));
2618 ast_assert(0);
2619 }
2620
2621 if (ast_channel_tech(chan)->hangup) {
2622 ast_channel_tech(chan)->hangup(chan);
2623 }
2624
2625 ast_channel_unlock(chan);
2626
2627 ast_cc_offer(chan);
2628
2629 ast_channel_unref(chan);
2630}
int ast_cc_offer(struct ast_channel *caller_chan)
Offer CC to a caller.
Definition ccss.c:3780
static int hangup(void *data)
static void destroy_hooks(struct ast_channel *chan)
Definition channel.c:2541
static void free_translation(struct ast_channel *clonechan)
Definition channel.c:2498
int ast_closestream(struct ast_filestream *f)
Closes a stream.
Definition file.c:1130
#define CHANNEL_DEADLOCK_AVOIDANCE(chan)
Definition lock.h:481
int ast_pbx_hangup_handler_run(struct ast_channel *chan)
Run all hangup handlers on the channel.
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
Definition sched.c:271
int(*const hangup)(struct ast_channel *chan)
Hangup (and possibly destroy) the channel.
Definition channel.h:724

References ao2_ref, ast_assert, ast_autoservice_stop(), ast_cc_offer(), ast_channel_blocker_tid(), ast_channel_blockproc(), ast_channel_flags(), ast_channel_generator(), ast_channel_generator_set(), ast_channel_generatordata(), ast_channel_generatordata_set(), ast_channel_lock, ast_channel_masq(), ast_channel_masqr(), ast_channel_name(), ast_channel_sched(), ast_channel_sched_set(), ast_channel_stream(), ast_channel_stream_set(), ast_channel_unlink(), ast_channel_unlock, ast_channel_unref, ast_channel_vstream(), ast_channel_vstream_set(), ast_closestream(), ast_debug, AST_FLAG_BLOCKING, AST_FLAG_ZOMBIE, ast_get_tid(), ast_log, ast_pbx_hangup_handler_run(), ast_sched_context_destroy(), ast_set_flag, ast_test_flag, CHANNEL_DEADLOCK_AVOIDANCE, destroy_hooks(), free_translation(), hangup(), ast_channel_tech::hangup, LOG_WARNING, NULL, and ast_generator::release.

Referenced by __analog_handle_event(), __analog_ss_thread(), __ast_pbx_run(), __ast_request_and_dial(), alloc_playback_chan(), analog_handle_init_event(), analog_ss_thread(), announce_request(), announce_to_dial(), answer_exec_run(), ari_bridges_play_new(), ast_ari_bridges_record(), ast_async_goto(), ast_autoservice_chan_hangup_peer(), ast_bridge_add_channel(), ast_bridge_run_after_goto(), ast_call_forward(), ast_channel_yank(), ast_dial_destroy(), ast_dial_hangup(), ast_iax2_new(), ast_pbx_outgoing_exten_predial(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_unreal_hangup(), attended_transfer_bridge(), begin_dial_channel(), blind_transfer_bridge(), bridge_channel_control_thread(), bridge_moh_create(), build_conf(), call_pickup_incoming_request(), chan_data_destroy(), chan_pjsip_new(), chanavail_exec(), clear_caller(), conf_free(), conf_run(), conf_start_record(), console_new(), create_msg_q_chan(), dahdi_handle_event(), dahdi_new(), destroy_conference_bridge(), dial_exec_full(), do_forward(), do_hang(), do_monitor(), do_monitor_headset(), feature_attended_transfer(), generic_recall(), handle_call_forward(), handle_call_outgoing(), handle_eval_function(), handle_exec(), handle_frame(), handle_init_event(), handle_timeout_trip(), hangup_playback(), hangupcalls(), hanguptree(), iax2_request(), jingle_action_session_initiate(), local_call(), make_channel(), mbl_ast_hangup(), media_request_helper(), meetme_menu_admin_extended(), moh_channel_thread(), monitor_dial(), mwi_thread(), my_distinctive_ring(), my_handle_notify_message(), ooh323_new(), park_local_transfer(), parking_blind_transfer_park(), pbx_outgoing_exec(), pbx_start_incoming_request(), push_announcer(), read_test(), recalling_exit(), refer_incoming_invite_request(), reject_incoming_call(), request_channel(), retransfer_enter(), safe_hangup(), snoop_stasis_thread(), stasis_app_control_snoop(), unistim_new(), wait_for_answer(), and wait_for_answer().

◆ ast_indicate()

int ast_indicate ( struct ast_channel chan,
int  condition 
)

Indicates condition of channel.

Note
Absolutely NO channel locks should be held before calling this function.
Indicate a condition such as AST_CONTROL_BUSY, AST_CONTROL_RINGING, or AST_CONTROL_CONGESTION on a channel
Parameters
chanchannel to change the indication
conditionwhich condition to indicate on the channel
Returns
Returns 0 on success, -1 on failure

Definition at line 4310 of file channel.c.

4311{
4312 return ast_indicate_data(chan, condition, NULL, 0);
4313}

References ast_indicate_data(), and NULL.

Referenced by __ast_play_and_record(), answer_trunk_chan(), app_control_dtmf(), app_control_hold(), app_control_moh_start(), app_control_progress(), app_control_ring(), app_control_ring_stop(), app_control_silence_start(), app_control_unhold(), app_exec(), ast_bridge_channel_feature_digit(), ast_bridge_set_single_src_video_mode(), ast_bridge_update_talker_src_video_mode(), ast_raw_answer_with_stream_topology(), bridge_channel_do_callback(), bridge_channel_event_join_leave(), bridge_channel_handle_action(), bridge_channel_handle_control(), bridge_channel_handle_interval(), bridge_channel_internal_join(), caller_joined_bridge(), channel_do_masquerade(), cli_console_answer(), conf_run(), console_call(), dial_exec_full(), dial_trunk(), disa_exec(), do_forward(), dtmf_stream(), handle_frame(), handle_recordfile(), indicate_busy(), indicate_congestion(), mf_stream(), monitor_dial(), participant_entertainment_start(), participant_entertainment_stop(), pbx_builtin_incomplete(), pbx_builtin_proceeding(), pbx_builtin_progress(), pbx_builtin_ringing(), pbx_builtin_waitexten(), play_on_channel(), pre_bridge_setup(), queue_exec(), record_exec(), rna(), say_periodic_announcement(), say_position(), send_waveform_to_channel(), sf_stream(), simple_bridge_join(), sla_handle_hold_event(), sla_station_exec(), sla_trunk_exec(), softmix_bridge_join(), try_calling(), vm_exec(), wait_for_answer(), and wait_for_answer().

◆ ast_indicate_data()

int ast_indicate_data ( struct ast_channel chan,
int  condition,
const void *  data,
size_t  datalen 
)

Indicates condition of channel, with payload.

Note
Absolutely NO channel locks should be held before calling this function.
Indicate a condition such as AST_CONTROL_HOLD with payload being music on hold class
Parameters
chanchannel to change the indication
conditionwhich condition to indicate on the channel
datapointer to payload data
datalensize of payload data
Returns
Returns 0 on success, -1 on failure

Definition at line 4688 of file channel.c.

4689{
4690 int res;
4691 /* this frame is used by framehooks. if it is set, we must free it at the end of this function */
4692 struct ast_frame *awesome_frame = NULL;
4693
4694 ast_channel_lock(chan);
4695
4696 /* Don't bother if the channel is about to go away, anyway. */
4699 && _condition != AST_CONTROL_MASQUERADE_NOTIFY) {
4700 res = -1;
4701 goto indicate_cleanup;
4702 }
4703
4705 /* Do framehooks now, do it, go, go now */
4706 struct ast_frame frame = {
4708 .subclass.integer = _condition,
4709 .data.ptr = (void *) data, /* this cast from const is only okay because we do the ast_frdup below */
4710 .datalen = datalen
4711 };
4712
4713 /* we have now committed to freeing this frame */
4714 awesome_frame = ast_frdup(&frame);
4715
4716 /* who knows what we will get back! the anticipation is killing me. */
4718 awesome_frame);
4719 if (!awesome_frame
4720 || awesome_frame->frametype != AST_FRAME_CONTROL) {
4721 res = 0;
4722 goto indicate_cleanup;
4723 }
4724
4725 _condition = awesome_frame->subclass.integer;
4726 data = awesome_frame->data.ptr;
4727 datalen = awesome_frame->datalen;
4728 }
4729
4730 res = indicate_data_internal(chan, _condition, data, datalen);
4731
4732indicate_cleanup:
4733 ast_channel_unlock(chan);
4734 if (awesome_frame) {
4735 ast_frfree(awesome_frame);
4736 }
4737
4738 return res;
4739}
int ast_channel_is_leaving_bridge(struct ast_channel *chan)
Determine if a channel is leaving a bridge, but not hung up.
Definition channel.c:10638
static int indicate_data_internal(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Definition channel.c:4504
int ast_framehook_list_is_empty(struct ast_framehook_list *framehooks)
Determine if an framehook list is empty or not.
Definition framehook.c:274
struct ast_frame * ast_framehook_list_write_event(struct ast_framehook_list *framehooks, struct ast_frame *frame)
This is used by the channel API push a frame write event to a channel's framehook list.
Definition framehook.c:313
#define ast_frdup(fr)
Copies a frame.
@ AST_CONTROL_MASQUERADE_NOTIFY

References ast_channel_flags(), ast_channel_framehooks(), ast_channel_is_leaving_bridge(), ast_channel_lock, ast_channel_unlock, ast_check_hangup(), AST_CONTROL_MASQUERADE_NOTIFY, AST_FLAG_ZOMBIE, AST_FRAME_CONTROL, ast_framehook_list_is_empty(), ast_framehook_list_write_event(), ast_frdup, ast_frfree, ast_test_flag, ast_frame::data, ast_frame::datalen, ast_frame::frametype, indicate_data_internal(), ast_frame_subclass::integer, NULL, ast_frame::ptr, and ast_frame::subclass.

Referenced by __ast_read(), action_aocmessage(), app_exec(), ast_ari_channels_transfer_progress(), ast_channel_update_connected_line(), ast_channel_update_redirecting(), ast_handle_cc_control_frame(), ast_indicate(), bridge_channel_handle_control(), bridge_channel_internal_join(), channel_do_masquerade(), dial_exec_full(), disable_t38(), fax_gateway_indicate_t38(), generic_fax_exec(), handle_frame(), participant_entertainment_start(), pbx_builtin_waitexten(), receivefax_t38_init(), sendfax_t38_init(), set_fax_t38_caps(), wait_for_answer(), wait_for_answer(), and wait_for_winner().

◆ ast_is_deferrable_frame()

int ast_is_deferrable_frame ( const struct ast_frame frame)

Should we keep this frame for later?

There are functions such as ast_safe_sleep which will service a channel to ensure that it does not have a large backlog of queued frames. When this happens, we want to hold on to specific frame types and just drop others. This function will tell if the frame we just read should be held onto.

Parameters
frameThe frame we just read
Return values
1frame should be kept
0frame should be dropped

Definition at line 1454 of file channel.c.

1455{
1456 /* Do not add a default entry in this switch statement. Each new
1457 * frame type should be addressed directly as to whether it should
1458 * be queued up or not.
1459 */
1460 switch (frame->frametype) {
1463 case AST_FRAME_CONTROL:
1464 case AST_FRAME_TEXT:
1466 case AST_FRAME_IMAGE:
1467 case AST_FRAME_HTML:
1468 return 1;
1469
1470 case AST_FRAME_DTMF_END:
1472 case AST_FRAME_VOICE:
1473 case AST_FRAME_VIDEO:
1474 case AST_FRAME_NULL:
1475 case AST_FRAME_IAX:
1476 case AST_FRAME_CNG:
1477 case AST_FRAME_MODEM:
1478 case AST_FRAME_RTCP:
1479 return 0;
1480 }
1481 return 0;
1482}

References AST_FRAME_BRIDGE_ACTION, AST_FRAME_BRIDGE_ACTION_SYNC, AST_FRAME_CNG, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_HTML, AST_FRAME_IAX, AST_FRAME_IMAGE, AST_FRAME_MODEM, AST_FRAME_NULL, AST_FRAME_RTCP, AST_FRAME_TEXT, AST_FRAME_TEXT_DATA, AST_FRAME_VIDEO, AST_FRAME_VOICE, and ast_frame::frametype.

Referenced by ast_bridge_channel_queue_frame(), autoservice_run(), and safe_sleep_conditional().

◆ ast_namedgroups_intersect()

int ast_namedgroups_intersect ( struct ast_namedgroups *  a,
struct ast_namedgroups *  b 
)

Return TRUE if group a and b contain at least one common groupname.

Definition at line 8174 of file channel.c.

8175{
8176 void *match;
8177 struct ao2_container *group_a = (struct ao2_container *) a;
8178 struct ao2_container *group_b = (struct ao2_container *) b;
8179
8180 if (!a || !b) {
8181 return 0;
8182 }
8183
8184 /*
8185 * Do groups a and b intersect? Since a and b are hash tables,
8186 * the average time complexity is:
8187 * O(a.count <= b.count ? a.count : b.count)
8188 */
8189 if (ao2_container_count(group_b) < ao2_container_count(group_a)) {
8190 /* Traverse over the smaller group. */
8191 SWAP(group_a, group_b);
8192 }
8193 match = ao2_callback(group_a, 0, namedgroup_match, group_b);
8195
8196 return match != NULL;
8197}
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
Definition chan_iax2.c:2388
static int namedgroup_match(void *obj, void *arg, int flags)
Definition channel.c:8164
#define SWAP(a, b)
Definition utils.h:256

References a, ao2_callback, ao2_cleanup, ao2_container_count(), b, match(), namedgroup_match(), NULL, and SWAP.

Referenced by find_channel_by_group().

◆ ast_party_caller_copy()

void ast_party_caller_copy ( struct ast_party_caller dest,
const struct ast_party_caller src 
)

Copy the source caller information to the destination caller.

Since
1.8
Parameters
destDestination caller
srcSource caller

Definition at line 1973 of file channel.c.

1974{
1975 if (dest == src) {
1976 /* Don't copy to self */
1977 return;
1978 }
1979
1980 ast_party_id_copy(&dest->id, &src->id);
1981 ast_party_id_copy(&dest->ani, &src->ani);
1982 ast_party_id_copy(&dest->priv, &src->priv);
1983 dest->ani2 = src->ani2;
1984}
struct ast_party_id priv
Private caller party ID.
Definition channel.h:432

References ast_party_caller::ani, ast_party_caller::ani2, ast_party_id_copy(), ast_party_caller::id, and ast_party_caller::priv.

Referenced by recalling_enter().

◆ ast_party_caller_free()

void ast_party_caller_free ( struct ast_party_caller doomed)

Destroy the caller party contents.

Since
1.8
Parameters
doomedThe caller party to destroy.

Definition at line 2002 of file channel.c.

2003{
2004 ast_party_id_free(&doomed->id);
2005 ast_party_id_free(&doomed->ani);
2006 ast_party_id_free(&doomed->priv);
2007}
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition channel.c:1798

References ast_party_caller::ani, ast_party_id_free(), ast_party_caller::id, and ast_party_caller::priv.

Referenced by ast_channel_destructor(), ast_dummy_channel_destructor(), callerid_write(), dial_trunk(), my_get_callerid(), and sla_ring_station().

◆ ast_party_caller_init()

void ast_party_caller_init ( struct ast_party_caller init)

Initialize the given caller structure.

Since
1.8
Parameters
initCaller structure to initialize.

Definition at line 1965 of file channel.c.

1966{
1967 ast_party_id_init(&init->id);
1968 ast_party_id_init(&init->ani);
1969 ast_party_id_init(&init->priv);
1970 init->ani2 = 0;
1971}
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition channel.c:1744

References ast_party_caller::ani, ast_party_caller::ani2, ast_party_id_init(), ast_party_caller::id, and ast_party_caller::priv.

Referenced by __ast_channel_alloc_ap(), dial_trunk(), queue_connected_line_update(), and sla_ring_station().

◆ ast_party_caller_set()

void ast_party_caller_set ( struct ast_party_caller dest,
const struct ast_party_caller src,
const struct ast_set_party_caller update 
)

Set the caller information based on another caller source.

Since
1.8

This is similar to ast_party_caller_copy, except that NULL values for strings in the src parameter indicate not to update the corresponding dest values.

Parameters
destThe caller one wishes to update
srcThe new caller values to update the dest
updateWhat caller information to update. NULL if all.

Definition at line 1994 of file channel.c.

1995{
1996 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
1997 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
1998 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
1999 dest->ani2 = src->ani2;
2000}
void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
Set the source party id information into the destination party id.
Definition channel.c:1775

References ast_party_caller::ani, ast_party_caller::ani2, ast_party_id_set(), ast_party_caller::id, NULL, ast_party_caller::priv, and update().

Referenced by ast_channel_set_caller(), ast_channel_set_caller_event(), callerid_write(), and my_get_callerid().

◆ ast_party_caller_set_init()

void ast_party_caller_set_init ( struct ast_party_caller init,
const struct ast_party_caller guide 
)

Initialize the given caller structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initCaller structure to initialize.
guideSource caller to use as a guide in initializing.

Definition at line 1986 of file channel.c.

1987{
1988 ast_party_id_set_init(&init->id, &guide->id);
1989 ast_party_id_set_init(&init->ani, &guide->ani);
1990 ast_party_id_set_init(&init->priv, &guide->priv);
1991 init->ani2 = guide->ani2;
1992}
void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
Initialize the given party id structure using the given guide for a set update operation.
Definition channel.c:1767

References ast_party_caller::ani, ast_party_caller::ani2, ast_party_id_set_init(), ast_party_caller::id, and ast_party_caller::priv.

Referenced by callerid_write(), dial_exec_full(), do_forward(), my_get_callerid(), and ring_entry().

◆ ast_party_connected_line_collect_caller()

void ast_party_connected_line_collect_caller ( struct ast_party_connected_line connected,
struct ast_party_caller caller 
)

Collect the caller party information into a connected line structure.

Since
1.8
Parameters
connectedCollected caller information for the connected line
callerCaller information.
Warning
This is a shallow copy.
DO NOT call ast_party_connected_line_free() on the filled in connected line structure!

Definition at line 2050 of file channel.c.

2051{
2052 connected->id = caller->id;
2053 connected->ani = caller->ani;
2054 connected->priv = caller->priv;
2055 connected->ani2 = caller->ani2;
2057}
@ AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN
Definition callerid.h:552

References ast_party_caller::ani, ast_party_caller::ani2, AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN, connected, ast_party_caller::id, and ast_party_caller::priv.

◆ ast_party_connected_line_copy()

void ast_party_connected_line_copy ( struct ast_party_connected_line dest,
const struct ast_party_connected_line src 
)

Copy the source connected line information to the destination connected line.

Since
1.8
Parameters
destDestination connected line
srcSource connected line

Definition at line 2018 of file channel.c.

2019{
2020 if (dest == src) {
2021 /* Don't copy to self */
2022 return;
2023 }
2024
2025 ast_party_id_copy(&dest->id, &src->id);
2026 ast_party_id_copy(&dest->ani, &src->ani);
2027 ast_party_id_copy(&dest->priv, &src->priv);
2028 dest->ani2 = src->ani2;
2029 dest->source = src->source;
2030}
int source
Information about the source of an update.
Definition channel.h:484

References ast_party_connected_line::ani, ast_party_connected_line::ani2, ast_party_id_copy(), ast_party_connected_line::id, ast_party_connected_line::priv, and ast_party_connected_line::source.

Referenced by __ast_read(), after_bridge_move_channel(), agent_login_channel_config(), ast_call_forward(), ast_channel_connected_line_sub(), ast_do_pickup(), attended_transfer_properties_alloc(), dial_exec_full(), do_forward(), indicate_connected_line(), recalling_enter(), retransfer_enter(), try_calling(), wait_for_answer(), and wait_for_answer().

◆ ast_party_connected_line_free()

void ast_party_connected_line_free ( struct ast_party_connected_line doomed)

◆ ast_party_connected_line_init()

void ast_party_connected_line_init ( struct ast_party_connected_line init)

◆ ast_party_connected_line_set()

void ast_party_connected_line_set ( struct ast_party_connected_line dest,
const struct ast_party_connected_line src,
const struct ast_set_party_connected_line update 
)

Set the connected line information based on another connected line source.

Since
1.8

This is similar to ast_party_connected_line_copy, except that NULL values for strings in the src parameter indicate not to update the corresponding dest values.

Parameters
destThe connected line one wishes to update
srcThe new connected line values to update the dest
updateWhat connected line information to update. NULL if all.

Definition at line 2041 of file channel.c.

2042{
2043 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2044 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2045 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2046 dest->ani2 = src->ani2;
2047 dest->source = src->source;
2048}

References ast_party_connected_line::ani, ast_party_connected_line::ani2, ast_party_id_set(), ast_party_connected_line::id, NULL, ast_party_connected_line::priv, ast_party_connected_line::source, and update().

Referenced by ast_channel_set_connected_line(), wait_for_answer(), wait_for_answer(), and wait_for_winner().

◆ ast_party_connected_line_set_init()

void ast_party_connected_line_set_init ( struct ast_party_connected_line init,
const struct ast_party_connected_line guide 
)

Initialize the given connected line structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initConnected line structure to initialize.
guideSource connected line to use as a guide in initializing.

Definition at line 2032 of file channel.c.

2033{
2034 ast_party_id_set_init(&init->id, &guide->id);
2035 ast_party_id_set_init(&init->ani, &guide->ani);
2036 ast_party_id_set_init(&init->priv, &guide->priv);
2037 init->ani2 = guide->ani2;
2038 init->source = guide->source;
2039}

References ast_party_connected_line::ani, ast_party_connected_line::ani2, ast_party_id_set_init(), ast_party_connected_line::id, ast_party_connected_line::priv, and ast_party_connected_line::source.

Referenced by __ast_request_and_dial(), ari_channels_handle_originate_with_id(), connectedline_write(), dial_exec_full(), indicate_connected_line(), pbx_outgoing_attempt(), wait_for_answer(), wait_for_answer(), and wait_for_winner().

◆ ast_party_dialed_copy()

void ast_party_dialed_copy ( struct ast_party_dialed dest,
const struct ast_party_dialed src 
)

Copy the source dialed party information to the destination dialed party.

Since
1.8
Parameters
destDestination dialed party
srcSource dialed party

Definition at line 1923 of file channel.c.

1924{
1925 if (dest == src) {
1926 /* Don't copy to self */
1927 return;
1928 }
1929
1930 ast_free(dest->number.str);
1931 dest->number.str = ast_strdup(src->number.str);
1932 dest->number.plan = src->number.plan;
1935}
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
void ast_party_subaddress_copy(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Copy the source party subaddress information to the destination party subaddress.
Definition channel.c:1692
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition channel.h:393
char * str
Subscriber phone number (Malloced)
Definition channel.h:388
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition channel.h:390
struct ast_party_dialed::@217 number
Dialed/Called number.
int transit_network_select
Transit Network Select.
Definition channel.h:399

References ast_free, ast_party_subaddress_copy(), ast_strdup, ast_party_dialed::number, ast_party_dialed::plan, ast_party_dialed::str, ast_party_dialed::subaddress, and ast_party_dialed::transit_network_select.

Referenced by ast_unreal_call_setup().

◆ ast_party_dialed_free()

void ast_party_dialed_free ( struct ast_party_dialed doomed)

Destroy the dialed party contents.

Since
1.8
Parameters
doomedThe dialed party to destroy.

Definition at line 1958 of file channel.c.

1959{
1960 ast_free(doomed->number.str);
1961 doomed->number.str = NULL;
1963}
void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
Destroy the party subaddress contents.
Definition channel.c:1731

References ast_free, ast_party_subaddress_free(), NULL, ast_party_dialed::number, ast_party_dialed::str, and ast_party_dialed::subaddress.

Referenced by ast_channel_destructor(), ast_dummy_channel_destructor(), and callerid_write().

◆ ast_party_dialed_init()

void ast_party_dialed_init ( struct ast_party_dialed init)

Initialize the given dialed structure.

Since
1.8
Parameters
initDialed structure to initialize.

Definition at line 1915 of file channel.c.

1916{
1917 init->number.str = NULL;
1918 init->number.plan = 0;/* Unknown */
1920 init->transit_network_select = 0;
1921}
void ast_party_subaddress_init(struct ast_party_subaddress *init)
Initialize the given subaddress structure.
Definition channel.c:1684

References ast_party_subaddress_init(), NULL, ast_party_dialed::number, ast_party_dialed::plan, ast_party_dialed::str, ast_party_dialed::subaddress, and ast_party_dialed::transit_network_select.

Referenced by __ast_channel_alloc_ap().

◆ ast_party_dialed_set()

void ast_party_dialed_set ( struct ast_party_dialed dest,
const struct ast_party_dialed src 
)

Set the dialed information based on another dialed source.

Since
1.8

This is similar to ast_party_dialed_copy, except that NULL values for strings in the src parameter indicate not to update the corresponding dest values.

Parameters
destThe dialed one wishes to update
srcThe new dialed values to update the dest

Definition at line 1945 of file channel.c.

1946{
1947 if (src->number.str && src->number.str != dest->number.str) {
1948 ast_free(dest->number.str);
1949 dest->number.str = ast_strdup(src->number.str);
1950 }
1951 dest->number.plan = src->number.plan;
1952
1954
1956}
void ast_party_subaddress_set(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Set the source party subaddress information into the destination party subaddress.
Definition channel.c:1714

References ast_free, ast_party_subaddress_set(), ast_strdup, ast_party_dialed::number, ast_party_dialed::plan, ast_party_dialed::str, ast_party_dialed::subaddress, and ast_party_dialed::transit_network_select.

Referenced by callerid_write().

◆ ast_party_dialed_set_init()

void ast_party_dialed_set_init ( struct ast_party_dialed init,
const struct ast_party_dialed guide 
)

Initialize the given dialed structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initCaller structure to initialize.
guideSource dialed to use as a guide in initializing.

Definition at line 1937 of file channel.c.

1938{
1939 init->number.str = NULL;
1940 init->number.plan = guide->number.plan;
1943}
void ast_party_subaddress_set_init(struct ast_party_subaddress *init, const struct ast_party_subaddress *guide)
Initialize the given party subaddress structure using the given guide for a set update operation.
Definition channel.c:1706

References ast_party_subaddress_set_init(), NULL, ast_party_dialed::number, ast_party_dialed::plan, ast_party_dialed::str, ast_party_dialed::subaddress, and ast_party_dialed::transit_network_select.

Referenced by callerid_write().

◆ ast_party_id_copy()

void ast_party_id_copy ( struct ast_party_id dest,
const struct ast_party_id src 
)

Copy the source party id information to the destination party id.

Since
1.8
Parameters
destDestination party id
srcSource party id

Definition at line 1752 of file channel.c.

1753{
1754 if (dest == src) {
1755 /* Don't copy to self */
1756 return;
1757 }
1758
1759 ast_party_name_copy(&dest->name, &src->name);
1760 ast_party_number_copy(&dest->number, &src->number);
1762
1763 ast_free(dest->tag);
1764 dest->tag = ast_strdup(src->tag);
1765}
void ast_party_number_copy(struct ast_party_number *dest, const struct ast_party_number *src)
Copy the source party number information to the destination party number.
Definition channel.c:1639
void ast_party_name_copy(struct ast_party_name *dest, const struct ast_party_name *src)
Copy the source party name information to the destination party name.
Definition channel.c:1586
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition channel.h:346
char * tag
User-set "tag".
Definition channel.h:356
struct ast_party_name name
Subscriber name.
Definition channel.h:342
struct ast_party_number number
Subscriber phone number.
Definition channel.h:344

References ast_free, ast_party_name_copy(), ast_party_number_copy(), ast_party_subaddress_copy(), ast_strdup, ast_party_id::name, ast_party_id::number, ast_party_id::subaddress, and ast_party_id::tag.

Referenced by ast_connected_line_copy_from_caller(), ast_connected_line_copy_to_caller(), ast_party_caller_copy(), ast_party_connected_line_copy(), ast_party_id_merge_copy(), ast_party_redirecting_copy(), ast_sip_session_create_outgoing(), ast_sip_set_id_from_invite(), caller_id_outgoing_request(), caller_id_outgoing_response(), chan_pjsip_new(), copy_redirecting_id(), queue_connected_line_update(), set_from_header(), stir_shaken_outgoing_request(), and update_initial_connected_line().

◆ ast_party_id_free()

void ast_party_id_free ( struct ast_party_id doomed)

Destroy the party id contents.

Since
1.8
Parameters
doomedThe party id to destroy.

Definition at line 1798 of file channel.c.

1799{
1800 ast_party_name_free(&doomed->name);
1801 ast_party_number_free(&doomed->number);
1803
1804 ast_free(doomed->tag);
1805 doomed->tag = NULL;
1806}
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
Definition channel.c:1625
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
Definition channel.c:1678

References ast_free, ast_party_name_free(), ast_party_number_free(), ast_party_subaddress_free(), ast_party_id::name, NULL, ast_party_id::number, ast_party_id::subaddress, and ast_party_id::tag.

Referenced by ast_party_caller_free(), ast_party_connected_line_free(), ast_party_id_reset(), ast_party_redirecting_free(), caller_id_outgoing_request(), caller_id_outgoing_response(), endpoint_destructor(), fetch_callerid_num(), session_destructor(), set_from_header(), stir_shaken_outgoing_request(), and update_incoming_connected_line().

◆ ast_party_id_init()

void ast_party_id_init ( struct ast_party_id init)

Initialize the given party id structure.

Since
1.8
Parameters
initParty id structure to initialize.

Definition at line 1744 of file channel.c.

1745{
1746 ast_party_name_init(&init->name);
1749 init->tag = NULL;
1750}
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
Definition channel.c:1578
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
Definition channel.c:1631

References ast_party_name_init(), ast_party_number_init(), ast_party_subaddress_init(), ast_party_id::name, NULL, ast_party_id::number, ast_party_id::subaddress, and ast_party_id::tag.

Referenced by ast_party_caller_init(), ast_party_connected_line_init(), ast_party_id_reset(), ast_party_redirecting_init(), ast_sip_endpoint_alloc(), ast_sip_session_alloc(), caller_id_outgoing_request(), caller_id_outgoing_response(), dial_exec_full(), fetch_callerid_num(), set_from_header(), stir_shaken_outgoing_request(), and update_incoming_connected_line().

◆ ast_party_id_invalidate()

void ast_party_id_invalidate ( struct ast_party_id id)

Invalidate all components of the given party id.

Since
11.0
Parameters
idThe party id to invalidate.

Definition at line 1876 of file channel.c.

1877{
1878 id->name.valid = 0;
1879 id->number.valid = 0;
1880 id->subaddress.valid = 0;
1881}

◆ ast_party_id_merge()

struct ast_party_id ast_party_id_merge ( struct ast_party_id base,
struct ast_party_id overlay 
)

Merge a given party id into another given party id.

Since
11.0

This function will generate an effective party id.

Each party id component of the party id 'base' is overwritten by components of the party id 'overlay' if the overlay component is marked as valid. However the component 'tag' of the base party id remains untouched.

Parameters
baseThe party id which is merged.
overlayThe party id which is used to merge into.
Returns
The merged party id as a struct, not as a pointer.
Note
The merged party id returned is a shallow copy and must not be freed.

Definition at line 1889 of file channel.c.

1890{
1891 struct ast_party_id merged;
1892
1893 merged = *base;
1894 if (overlay->name.valid) {
1895 merged.name = overlay->name;
1896 }
1897 if (overlay->number.valid) {
1898 merged.number = overlay->number;
1899 }
1900 if (overlay->subaddress.valid) {
1901 merged.subaddress = overlay->subaddress;
1902 }
1903 /* Note the actual structure is returned and not a pointer to it! */
1904 return merged;
1905}
unsigned char valid
TRUE if the name information is valid/present.
Definition channel.h:281
unsigned char valid
TRUE if the number information is valid/present.
Definition channel.h:299
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition channel.h:330

References ast_party_id::name, ast_party_id::number, and ast_party_id::subaddress.

Referenced by ast_channel_connected_effective_id(), ast_channel_redirecting_effective_from(), ast_channel_redirecting_effective_orig(), ast_channel_redirecting_effective_to(), and ast_party_id_merge_copy().

◆ ast_party_id_merge_copy()

void ast_party_id_merge_copy ( struct ast_party_id dest,
struct ast_party_id base,
struct ast_party_id overlay 
)

Copy a merge of a given party id into another given party id to a given destination party id.

Since
11.0

Each party id component of the party id 'base' is overwritten by components of the party id 'overlay' if the 'overlay' component is marked as valid. However the component 'tag' of the 'base' party id remains untouched. The result is copied into the given party id 'dest'.

Note
The resulting merged party id is a real copy and has to be freed.
Parameters
destThe resulting merged party id.
baseThe party id which is merged.
overlayThe party id which is used to merge into.

Definition at line 1907 of file channel.c.

1908{
1909 struct ast_party_id merged;
1910
1911 merged = ast_party_id_merge(base, overlay);
1912 ast_party_id_copy(dest, &merged);
1913}
struct ast_party_id ast_party_id_merge(struct ast_party_id *base, struct ast_party_id *overlay)
Merge a given party id into another given party id.
Definition channel.c:1889

References ast_party_id_copy(), and ast_party_id_merge().

◆ ast_party_id_presentation()

int ast_party_id_presentation ( const struct ast_party_id id)

Determine the overall presentation value for the given party.

Since
1.8
Parameters
idParty to determine the overall presentation value.
Returns
Overall presentation value for the given party.

Definition at line 1808 of file channel.c.

1809{
1810 int number_priority;
1811 int number_value;
1812 int number_screening;
1813 int name_priority;
1814 int name_value;
1815
1816 /* Determine name presentation priority. */
1817 if (!id->name.valid) {
1818 name_value = AST_PRES_UNAVAILABLE;
1819 name_priority = 3;
1820 } else {
1821 name_value = id->name.presentation & AST_PRES_RESTRICTION;
1822 switch (name_value) {
1824 name_priority = 0;
1825 break;
1826 case AST_PRES_ALLOWED:
1827 name_priority = 1;
1828 break;
1830 name_priority = 2;
1831 break;
1832 default:
1833 name_value = AST_PRES_UNAVAILABLE;
1834 name_priority = 3;
1835 break;
1836 }
1837 }
1838
1839 /* Determine number presentation priority. */
1840 if (!id->number.valid) {
1841 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1842 number_value = AST_PRES_UNAVAILABLE;
1843 number_priority = 3;
1844 } else {
1845 number_screening = id->number.presentation & AST_PRES_NUMBER_TYPE;
1846 number_value = id->number.presentation & AST_PRES_RESTRICTION;
1847 switch (number_value) {
1849 number_priority = 0;
1850 break;
1851 case AST_PRES_ALLOWED:
1852 number_priority = 1;
1853 break;
1855 number_priority = 2;
1856 break;
1857 default:
1858 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1859 number_value = AST_PRES_UNAVAILABLE;
1860 number_priority = 3;
1861 break;
1862 }
1863 }
1864
1865 /* Select the wining presentation value. */
1866 if (name_priority < number_priority) {
1867 number_value = name_value;
1868 }
1869 if (number_value == AST_PRES_UNAVAILABLE) {
1871 }
1872
1873 return number_value | number_screening;
1874}
enum queue_result id
Definition app_queue.c:1790
#define AST_PRES_USER_NUMBER_UNSCREENED
Definition callerid.h:426
#define AST_PRES_UNAVAILABLE
Definition callerid.h:434
#define AST_PRES_RESTRICTED
Definition callerid.h:433
#define AST_PRES_ALLOWED
Definition callerid.h:432
#define AST_PRES_NUMBER_NOT_AVAILABLE
Definition callerid.h:461
#define AST_PRES_NUMBER_TYPE
Definition callerid.h:425
#define AST_PRES_RESTRICTION
Definition callerid.h:431

References AST_PRES_ALLOWED, AST_PRES_NUMBER_NOT_AVAILABLE, AST_PRES_NUMBER_TYPE, AST_PRES_RESTRICTED, AST_PRES_RESTRICTION, AST_PRES_UNAVAILABLE, AST_PRES_USER_NUMBER_UNSCREENED, and id.

Referenced by add_privacy_header(), add_privacy_params(), ast_json_party_id(), ast_sip_can_present_connected_id(), ast_str_retrieve_variable(), ast_var_channels_table(), channel_snapshot_caller_create(), iax2_call(), is_colp_update_allowed(), my_send_callerid(), party_id_build_data(), party_id_read(), queue_exec(), redirecting_read(), set_from_header(), setup_env(), and socket_process_helper().

◆ ast_party_id_reset()

void ast_party_id_reset ( struct ast_party_id id)

Destroy and initialize the given party id structure.

Since
11.0
Parameters
idThe party id to reset.

Definition at line 1883 of file channel.c.

1884{
1887}

References ast_party_id_free(), and ast_party_id_init().

Referenced by after_bridge_move_channel(), ast_do_pickup(), channel_do_masquerade(), and retransfer_enter().

◆ ast_party_id_set()

void ast_party_id_set ( struct ast_party_id dest,
const struct ast_party_id src,
const struct ast_set_party_id update 
)

Set the source party id information into the destination party id.

Since
1.8
Parameters
destThe id one wishes to update
srcThe new id values to update the dest
updateWhat id information to update. NULL if all.

Definition at line 1775 of file channel.c.

1776{
1777 if (dest == src) {
1778 /* Don't set to self */
1779 return;
1780 }
1781
1782 if (!update || update->name) {
1783 ast_party_name_set(&dest->name, &src->name);
1784 }
1785 if (!update || update->number) {
1786 ast_party_number_set(&dest->number, &src->number);
1787 }
1788 if (!update || update->subaddress) {
1790 }
1791
1792 if (src->tag && src->tag != dest->tag) {
1793 ast_free(dest->tag);
1794 dest->tag = ast_strdup(src->tag);
1795 }
1796}
void ast_party_number_set(struct ast_party_number *dest, const struct ast_party_number *src)
Set the source party number information into the destination party number.
Definition channel.c:1661
void ast_party_name_set(struct ast_party_name *dest, const struct ast_party_name *src)
Set the source party name information into the destination party name.
Definition channel.c:1608

References ast_free, ast_party_name_set(), ast_party_number_set(), ast_party_subaddress_set(), ast_strdup, ast_party_id::name, ast_party_id::number, ast_party_id::subaddress, ast_party_id::tag, and update().

Referenced by ast_party_caller_set(), ast_party_connected_line_set(), and ast_party_redirecting_set().

◆ ast_party_id_set_init()

void ast_party_id_set_init ( struct ast_party_id init,
const struct ast_party_id guide 
)

Initialize the given party id structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initParty id structure to initialize.
guideSource party id to use as a guide in initializing.

Definition at line 1767 of file channel.c.

1768{
1769 ast_party_name_set_init(&init->name, &guide->name);
1770 ast_party_number_set_init(&init->number, &guide->number);
1772 init->tag = NULL;
1773}
void ast_party_name_set_init(struct ast_party_name *init, const struct ast_party_name *guide)
Initialize the given party name structure using the given guide for a set update operation.
Definition channel.c:1600
void ast_party_number_set_init(struct ast_party_number *init, const struct ast_party_number *guide)
Initialize the given party number structure using the given guide for a set update operation.
Definition channel.c:1653

References ast_party_name_set_init(), ast_party_number_set_init(), ast_party_subaddress_set_init(), ast_party_id::name, NULL, ast_party_id::number, ast_party_id::subaddress, and ast_party_id::tag.

Referenced by ast_party_caller_set_init(), ast_party_connected_line_set_init(), ast_party_redirecting_set_init(), and dial_exec_full().

◆ ast_party_name_copy()

void ast_party_name_copy ( struct ast_party_name dest,
const struct ast_party_name src 
)

Copy the source party name information to the destination party name.

Since
1.8
Parameters
destDestination party name
srcSource party name

Definition at line 1586 of file channel.c.

1587{
1588 if (dest == src) {
1589 /* Don't copy to self */
1590 return;
1591 }
1592
1593 ast_free(dest->str);
1594 dest->str = ast_strdup(src->str);
1595 dest->char_set = src->char_set;
1596 dest->presentation = src->presentation;
1597 dest->valid = src->valid;
1598}
int char_set
Character set the name is using.
Definition channel.h:274
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition channel.h:279
char * str
Subscriber name (Malloced)
Definition channel.h:266

References ast_free, ast_strdup, ast_party_name::char_set, ast_party_name::presentation, ast_party_name::str, and ast_party_name::valid.

Referenced by ast_party_id_copy().

◆ ast_party_name_free()

void ast_party_name_free ( struct ast_party_name doomed)

Destroy the party name contents.

Since
1.8
Parameters
doomedThe party name to destroy.

Definition at line 1625 of file channel.c.

1626{
1627 ast_free(doomed->str);
1628 doomed->str = NULL;
1629}

References ast_free, NULL, and ast_party_name::str.

Referenced by analog_ss_thread(), and ast_party_id_free().

◆ ast_party_name_init()

void ast_party_name_init ( struct ast_party_name init)

Initialize the given name structure.

Since
1.8
Parameters
initName structure to initialize.

Definition at line 1578 of file channel.c.

1579{
1580 init->str = NULL;
1583 init->valid = 0;
1584}

References AST_PARTY_CHAR_SET_ISO8859_1, AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, ast_party_name::char_set, NULL, ast_party_name::presentation, ast_party_name::str, and ast_party_name::valid.

Referenced by analog_ss_thread(), and ast_party_id_init().

◆ ast_party_name_set()

void ast_party_name_set ( struct ast_party_name dest,
const struct ast_party_name src 
)

Set the source party name information into the destination party name.

Since
1.8
Parameters
destThe name one wishes to update
srcThe new name values to update the dest

Definition at line 1608 of file channel.c.

1609{
1610 if (dest == src) {
1611 /* Don't set to self */
1612 return;
1613 }
1614
1615 if (src->str && src->str != dest->str) {
1616 ast_free(dest->str);
1617 dest->str = ast_strdup(src->str);
1618 }
1619
1620 dest->char_set = src->char_set;
1621 dest->presentation = src->presentation;
1622 dest->valid = src->valid;
1623}

References ast_free, ast_strdup, ast_party_name::char_set, ast_party_name::presentation, ast_party_name::str, and ast_party_name::valid.

Referenced by ast_party_id_set().

◆ ast_party_name_set_init()

void ast_party_name_set_init ( struct ast_party_name init,
const struct ast_party_name guide 
)

Initialize the given party name structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initParty name structure to initialize.
guideSource party name to use as a guide in initializing.

Definition at line 1600 of file channel.c.

1601{
1602 init->str = NULL;
1603 init->char_set = guide->char_set;
1604 init->presentation = guide->presentation;
1605 init->valid = guide->valid;
1606}

References ast_party_name::char_set, NULL, ast_party_name::presentation, ast_party_name::str, and ast_party_name::valid.

Referenced by ast_party_id_set_init().

◆ ast_party_number_copy()

void ast_party_number_copy ( struct ast_party_number dest,
const struct ast_party_number src 
)

Copy the source party number information to the destination party number.

Since
1.8
Parameters
destDestination party number
srcSource party number

Definition at line 1639 of file channel.c.

1640{
1641 if (dest == src) {
1642 /* Don't copy to self */
1643 return;
1644 }
1645
1646 ast_free(dest->str);
1647 dest->str = ast_strdup(src->str);
1648 dest->plan = src->plan;
1649 dest->presentation = src->presentation;
1650 dest->valid = src->valid;
1651}
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition channel.h:297
char * str
Subscriber phone number (Malloced)
Definition channel.h:293
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition channel.h:295

References ast_free, ast_strdup, ast_party_number::plan, ast_party_number::presentation, ast_party_number::str, and ast_party_number::valid.

Referenced by ast_party_id_copy().

◆ ast_party_number_free()

void ast_party_number_free ( struct ast_party_number doomed)

Destroy the party number contents.

Since
1.8
Parameters
doomedThe party number to destroy.

Definition at line 1678 of file channel.c.

1679{
1680 ast_free(doomed->str);
1681 doomed->str = NULL;
1682}

References ast_free, NULL, and ast_party_number::str.

Referenced by analog_ss_thread(), ast_party_id_free(), do_forward(), and wait_for_answer().

◆ ast_party_number_init()

void ast_party_number_init ( struct ast_party_number init)

Initialize the given number structure.

Since
1.8
Parameters
initNumber structure to initialize.

Definition at line 1631 of file channel.c.

1632{
1633 init->str = NULL;
1634 init->plan = 0;/* Unknown */
1636 init->valid = 0;
1637}

References AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, NULL, ast_party_number::plan, ast_party_number::presentation, ast_party_number::str, and ast_party_number::valid.

Referenced by analog_ss_thread(), ast_party_id_init(), do_forward(), and wait_for_answer().

◆ ast_party_number_set()

void ast_party_number_set ( struct ast_party_number dest,
const struct ast_party_number src 
)

Set the source party number information into the destination party number.

Since
1.8
Parameters
destThe number one wishes to update
srcThe new number values to update the dest

Definition at line 1661 of file channel.c.

1662{
1663 if (dest == src) {
1664 /* Don't set to self */
1665 return;
1666 }
1667
1668 if (src->str && src->str != dest->str) {
1669 ast_free(dest->str);
1670 dest->str = ast_strdup(src->str);
1671 }
1672
1673 dest->plan = src->plan;
1674 dest->presentation = src->presentation;
1675 dest->valid = src->valid;
1676}

References ast_free, ast_strdup, ast_party_number::plan, ast_party_number::presentation, ast_party_number::str, and ast_party_number::valid.

Referenced by ast_party_id_set().

◆ ast_party_number_set_init()

void ast_party_number_set_init ( struct ast_party_number init,
const struct ast_party_number guide 
)

Initialize the given party number structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initParty number structure to initialize.
guideSource party number to use as a guide in initializing.

Definition at line 1653 of file channel.c.

1654{
1655 init->str = NULL;
1656 init->plan = guide->plan;
1657 init->presentation = guide->presentation;
1658 init->valid = guide->valid;
1659}

References NULL, ast_party_number::plan, ast_party_number::presentation, ast_party_number::str, and ast_party_number::valid.

Referenced by ast_party_id_set_init().

◆ ast_party_redirecting_copy()

void ast_party_redirecting_copy ( struct ast_party_redirecting dest,
const struct ast_party_redirecting src 
)

Copy the source redirecting information to the destination redirecting.

Since
1.8
Parameters
destDestination redirecting
srcSource redirecting

Definition at line 2122 of file channel.c.

2123{
2124 if (dest == src) {
2125 /* Don't copy to self */
2126 return;
2127 }
2128
2129 ast_party_id_copy(&dest->orig, &src->orig);
2130 ast_party_id_copy(&dest->from, &src->from);
2131 ast_party_id_copy(&dest->to, &src->to);
2132 ast_party_id_copy(&dest->priv_orig, &src->priv_orig);
2133 ast_party_id_copy(&dest->priv_from, &src->priv_from);
2134 ast_party_id_copy(&dest->priv_to, &src->priv_to);
2137 dest->count = src->count;
2138}
void ast_party_redirecting_reason_copy(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Copy the source redirecting reason information to the destination redirecting reason.
Definition channel.c:2072
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition channel.h:547
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition channel.h:544
int count
Number of times the call was redirected.
Definition channel.h:550

References ast_party_id_copy(), ast_party_redirecting_reason_copy(), ast_party_redirecting::count, ast_party_redirecting::from, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, and ast_party_redirecting::to.

Referenced by ast_ari_channels_dial(), ast_call_forward(), ast_channel_redirecting_sub(), ast_unreal_call_setup(), begin_dial_prerun(), call_forward_inherit(), dial_exec_full(), do_forward(), ring_entry(), and wait_for_answer().

◆ ast_party_redirecting_free()

void ast_party_redirecting_free ( struct ast_party_redirecting doomed)

◆ ast_party_redirecting_init()

void ast_party_redirecting_init ( struct ast_party_redirecting init)

Initialize the given redirecting structure.

Since
1.8
Parameters
initRedirecting structure to initialize.

Definition at line 2109 of file channel.c.

2110{
2111 ast_party_id_init(&init->orig);
2112 ast_party_id_init(&init->from);
2113 ast_party_id_init(&init->to);
2116 ast_party_id_init(&init->priv_to);
2119 init->count = 0;
2120}
void ast_party_redirecting_reason_init(struct ast_party_redirecting_reason *init)
Initialize the given redirecting reason structure.
Definition channel.c:2066

References ast_party_id_init(), ast_party_redirecting_reason_init(), ast_party_redirecting::count, ast_party_redirecting::from, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, and ast_party_redirecting::to.

Referenced by __ast_channel_alloc_ap(), ast_channel_redirecting_sub(), AST_TEST_DEFINE(), call_forward_inherit(), do_forward(), set_redirecting(), and wait_for_answer().

◆ ast_party_redirecting_reason_copy()

void ast_party_redirecting_reason_copy ( struct ast_party_redirecting_reason dest,
const struct ast_party_redirecting_reason src 
)

Copy the source redirecting reason information to the destination redirecting reason.

Parameters
destDestination redirecting reason
srcSource redirecting reason

Definition at line 2072 of file channel.c.

2073{
2074 if (dest == src) {
2075 return;
2076 }
2077
2078 ast_free(dest->str);
2079 dest->str = ast_strdup(src->str);
2080 dest->code = src->code;
2081}
int code
enum AST_REDIRECTING_REASON value for redirection
Definition channel.h:512
char * str
a string value for the redirecting reason
Definition channel.h:509

References ast_free, ast_strdup, ast_party_redirecting_reason::code, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_copy().

◆ ast_party_redirecting_reason_free()

void ast_party_redirecting_reason_free ( struct ast_party_redirecting_reason doomed)

Destroy the redirecting reason contents.

Parameters
doomedThe redirecting reason to destroy.

Definition at line 2103 of file channel.c.

2104{
2105 ast_free(doomed->str);
2106}

References ast_free, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_free().

◆ ast_party_redirecting_reason_init()

void ast_party_redirecting_reason_init ( struct ast_party_redirecting_reason init)

Initialize the given redirecting reason structure.

Parameters
initRedirecting reason structure to initialize

Definition at line 2066 of file channel.c.

2067{
2068 init->str = NULL;
2070}
@ AST_REDIRECTING_REASON_UNKNOWN
Definition callerid.h:499

References AST_REDIRECTING_REASON_UNKNOWN, ast_party_redirecting_reason::code, NULL, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_init().

◆ ast_party_redirecting_reason_set()

void ast_party_redirecting_reason_set ( struct ast_party_redirecting_reason dest,
const struct ast_party_redirecting_reason src 
)

Set the redirecting reason information based on another redirecting reason source.

This is similar to ast_party_redirecting_reason_copy, except that NULL values for strings in the src parameter indicate not to update the corresponding dest values.

Parameters
destThe redirecting reason one wishes to update
srcThe new redirecting reason values to update the dest

Definition at line 2089 of file channel.c.

2090{
2091 if (dest == src) {
2092 return;
2093 }
2094
2095 if (src->str && src->str != dest->str) {
2096 ast_free(dest->str);
2097 dest->str = ast_strdup(src->str);
2098 }
2099
2100 dest->code = src->code;
2101}

References ast_free, ast_strdup, ast_party_redirecting_reason::code, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_set().

◆ ast_party_redirecting_reason_set_init()

void ast_party_redirecting_reason_set_init ( struct ast_party_redirecting_reason init,
const struct ast_party_redirecting_reason guide 
)

Initialize the given redirecting reason structure using the given guide for a set update operation.

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initRedirecting reason structure to initialize.
guideSource redirecting reason to use as a guide in initializing.

Definition at line 2083 of file channel.c.

2084{
2085 init->str = NULL;
2086 init->code = guide->code;
2087}

References ast_party_redirecting_reason::code, NULL, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_set_init().

◆ ast_party_redirecting_set()

void ast_party_redirecting_set ( struct ast_party_redirecting dest,
const struct ast_party_redirecting src,
const struct ast_set_party_redirecting update 
)

Set the redirecting information based on another redirecting source.

Since
1.8

This is similar to ast_party_redirecting_copy, except that NULL values for strings in the src parameter indicate not to update the corresponding dest values.

Parameters
destThe redirecting one wishes to update
srcThe new redirecting values to update the dest
updateWhat redirecting information to update. NULL if all.

Definition at line 2153 of file channel.c.

2154{
2155 ast_party_id_set(&dest->orig, &src->orig, update ? &update->orig : NULL);
2156 ast_party_id_set(&dest->from, &src->from, update ? &update->from : NULL);
2157 ast_party_id_set(&dest->to, &src->to, update ? &update->to : NULL);
2158 ast_party_id_set(&dest->priv_orig, &src->priv_orig, update ? &update->priv_orig : NULL);
2159 ast_party_id_set(&dest->priv_from, &src->priv_from, update ? &update->priv_from : NULL);
2160 ast_party_id_set(&dest->priv_to, &src->priv_to, update ? &update->priv_to : NULL);
2163 dest->count = src->count;
2164}
void ast_party_redirecting_reason_set(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Set the redirecting reason information based on another redirecting reason source.
Definition channel.c:2089

References ast_party_id_set(), ast_party_redirecting_reason_set(), ast_party_redirecting::count, ast_party_redirecting::from, NULL, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, ast_party_redirecting::to, and update().

Referenced by ast_channel_set_redirecting().

◆ ast_party_redirecting_set_init()

void ast_party_redirecting_set_init ( struct ast_party_redirecting init,
const struct ast_party_redirecting guide 
)

Initialize the given redirecting id structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initRedirecting id structure to initialize.
guideSource redirecting id to use as a guide in initializing.

Definition at line 2140 of file channel.c.

2141{
2142 ast_party_id_set_init(&init->orig, &guide->orig);
2143 ast_party_id_set_init(&init->from, &guide->from);
2144 ast_party_id_set_init(&init->to, &guide->to);
2145 ast_party_id_set_init(&init->priv_orig, &guide->priv_orig);
2146 ast_party_id_set_init(&init->priv_from, &guide->priv_from);
2147 ast_party_id_set_init(&init->priv_to, &guide->priv_to);
2150 init->count = guide->count;
2151}
void ast_party_redirecting_reason_set_init(struct ast_party_redirecting_reason *init, const struct ast_party_redirecting_reason *guide)
Initialize the given redirecting reason structure using the given guide for a set update operation.
Definition channel.c:2083

References ast_party_id_set_init(), ast_party_redirecting_reason_set_init(), ast_party_redirecting::count, ast_party_redirecting::from, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, and ast_party_redirecting::to.

Referenced by indicate_redirecting(), and redirecting_write().

◆ ast_party_subaddress_copy()

void ast_party_subaddress_copy ( struct ast_party_subaddress dest,
const struct ast_party_subaddress src 
)

Copy the source party subaddress information to the destination party subaddress.

Since
1.8
Parameters
destDestination party subaddress
srcSource party subaddress

Definition at line 1692 of file channel.c.

1693{
1694 if (dest == src) {
1695 /* Don't copy to self */
1696 return;
1697 }
1698
1699 ast_free(dest->str);
1700 dest->str = ast_strdup(src->str);
1701 dest->type = src->type;
1703 dest->valid = src->valid;
1704}
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition channel.h:328
char * str
Malloced subaddress string.
Definition channel.h:315
int type
Q.931 subaddress type.
Definition channel.h:322

References ast_free, ast_strdup, ast_party_subaddress::odd_even_indicator, ast_party_subaddress::str, ast_party_subaddress::type, and ast_party_subaddress::valid.

Referenced by ast_party_dialed_copy(), and ast_party_id_copy().

◆ ast_party_subaddress_free()

void ast_party_subaddress_free ( struct ast_party_subaddress doomed)

Destroy the party subaddress contents.

Since
1.8
Parameters
doomedThe party subaddress to destroy.

Definition at line 1731 of file channel.c.

1732{
1733 ast_free(doomed->str);
1734 doomed->str = NULL;
1735}

References ast_free, NULL, and ast_party_subaddress::str.

Referenced by ast_party_dialed_free(), and ast_party_id_free().

◆ ast_party_subaddress_init()

void ast_party_subaddress_init ( struct ast_party_subaddress init)

Initialize the given subaddress structure.

Since
1.8
Parameters
initSubaddress structure to initialize.

Definition at line 1684 of file channel.c.

1685{
1686 init->str = NULL;
1687 init->type = 0;
1688 init->odd_even_indicator = 0;
1689 init->valid = 0;
1690}

References NULL, ast_party_subaddress::odd_even_indicator, ast_party_subaddress::str, ast_party_subaddress::type, and ast_party_subaddress::valid.

Referenced by ast_party_dialed_init(), and ast_party_id_init().

◆ ast_party_subaddress_set()

void ast_party_subaddress_set ( struct ast_party_subaddress dest,
const struct ast_party_subaddress src 
)

Set the source party subaddress information into the destination party subaddress.

Since
1.8
Parameters
destThe subaddress one wishes to update
srcThe new subaddress values to update the dest

Definition at line 1714 of file channel.c.

1715{
1716 if (dest == src) {
1717 /* Don't set to self */
1718 return;
1719 }
1720
1721 if (src->str && src->str != dest->str) {
1722 ast_free(dest->str);
1723 dest->str = ast_strdup(src->str);
1724 }
1725
1726 dest->type = src->type;
1728 dest->valid = src->valid;
1729}

References ast_free, ast_strdup, ast_party_subaddress::odd_even_indicator, ast_party_subaddress::str, ast_party_subaddress::type, and ast_party_subaddress::valid.

Referenced by ast_party_dialed_set(), and ast_party_id_set().

◆ ast_party_subaddress_set_init()

void ast_party_subaddress_set_init ( struct ast_party_subaddress init,
const struct ast_party_subaddress guide 
)

Initialize the given party subaddress structure using the given guide for a set update operation.

Since
1.8

The initialization is needed to allow a set operation to know if a value needs to be updated. Simple integers need the guide's original value in case the set operation is not trying to set a new value. String values are simply set to NULL pointers if they are not going to be updated.

Parameters
initParty subaddress structure to initialize.
guideSource party subaddress to use as a guide in initializing.

Definition at line 1706 of file channel.c.

1707{
1708 init->str = NULL;
1709 init->type = guide->type;
1711 init->valid = guide->valid;
1712}

References NULL, ast_party_subaddress::odd_even_indicator, ast_party_subaddress::str, ast_party_subaddress::type, and ast_party_subaddress::valid.

Referenced by ast_party_dialed_set_init(), and ast_party_id_set_init().

◆ ast_pre_call()

int ast_pre_call ( struct ast_channel chan,
const char *  sub_args 
)

Execute a Gosub call on the channel before a call is placed.

Since
11.0

This is called between ast_request() and ast_call() to execute a predial routine on the newly created channel.

Parameters
chanChannel to execute Gosub.
sub_argsGosub application parameter string.
Note
Absolutely NO channel locks should be held before calling this function.
Return values
0on success.
-1on error.

Definition at line 6479 of file channel.c.

6480{
6481 int (*pre_call)(struct ast_channel *chan, const char *sub_args);
6482
6483 ast_channel_lock(chan);
6484 pre_call = ast_channel_tech(chan)->pre_call;
6485 if (pre_call) {
6486 int res;
6487
6488 res = pre_call(chan, sub_args);
6489 ast_channel_unlock(chan);
6490 return res;
6491 }
6492 ast_channel_unlock(chan);
6493 return ast_app_exec_sub(NULL, chan, sub_args, 0);
6494}
int ast_app_exec_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_args, int ignore_hangup)
Run a subroutine on a channel, placing an optional second channel into autoservice.
Definition main/app.c:297
int(* pre_call)(struct ast_channel *chan, const char *sub_args)
Execute a Gosub call on the channel in a technology specific way before a call is placed.
Definition channel.h:861

References ast_app_exec_sub(), ast_channel_lock, ast_channel_unlock, NULL, and ast_channel_tech::pre_call.

Referenced by begin_dial_prerun(), dial_exec_full(), findmeexec(), and ring_entry().

◆ ast_print_group()

char * ast_print_group ( char *  buf,
int  buflen,
ast_group_t  group 
)

Print call and pickup groups into buffer.

Print call and pickup groups into buffer.

Definition at line 8115 of file channel.c.

8116{
8117 unsigned int i;
8118 int first = 1;
8119 char num[3];
8120
8121 buf[0] = '\0';
8122
8123 if (!group) /* Return empty string if no group */
8124 return buf;
8125
8126 for (i = 0; i <= 63; i++) { /* Max group is 63 */
8127 if (group & ((ast_group_t) 1 << i)) {
8128 if (!first) {
8129 strncat(buf, ", ", buflen - strlen(buf) - 1);
8130 } else {
8131 first = 0;
8132 }
8133 snprintf(num, sizeof(num), "%u", i);
8134 strncat(buf, num, buflen - strlen(buf) - 1);
8135 }
8136 }
8137 return buf;
8138}
struct sla_ringing_trunk * first
Definition app_sla.c:338

References buf, and first.

Referenced by callgroup_to_str(), func_channel_read(), pickupgroup_to_str(), and serialize_showchan().

◆ ast_print_namedgroups()

char * ast_print_namedgroups ( struct ast_str **  buf,
struct ast_namedgroups *  groups 
)

Print named call groups and named pickup groups.

Definition at line 8140 of file channel.c.

8141{
8142 struct ao2_container *grp = (struct ao2_container *) group;
8143 struct namedgroup_member *ng;
8144 int first = 1;
8145 struct ao2_iterator it;
8146
8147 if (!grp) {
8148 return ast_str_buffer(*buf);
8149 }
8150
8151 for (it = ao2_iterator_init(grp, 0); (ng = ao2_iterator_next(&it)); ao2_ref(ng, -1)) {
8152 if (!first) {
8153 ast_str_append(buf, 0, ", ");
8154 } else {
8155 first = 0;
8156 }
8157 ast_str_append(buf, 0, "%s", ng->name);
8158 }
8160
8161 return ast_str_buffer(*buf);
8162}
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition strings.h:1139
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_str_append(), ast_str_buffer(), buf, first, and namedgroup_member::name.

Referenced by func_channel_read(), named_callgroups_to_str(), and named_pickupgroups_to_str().

◆ ast_prod()

int ast_prod ( struct ast_channel chan)

Send empty audio to prime a channel driver.

Definition at line 5035 of file channel.c.

5036{
5037 struct ast_frame a = { AST_FRAME_VOICE };
5038 char nothing[128];
5039
5040 /* Send an empty audio frame to get things moving */
5041 if (ast_channel_state(chan) != AST_STATE_UP) {
5042 ast_debug(3, "Prodding channel '%s'\n", ast_channel_name(chan));
5043 a.subclass.format = ast_channel_rawwriteformat(chan);
5044 a.data.ptr = nothing + AST_FRIENDLY_OFFSET;
5045 a.src = "ast_prod"; /* this better match check in ast_write */
5046 if (ast_write(chan, &a))
5047 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", ast_channel_name(chan));
5048 }
5049 return 0;
5050}
int ast_write(struct ast_channel *chan, struct ast_frame *fr)
Write a frame to a channel This function writes the given frame to the indicated channel.
Definition channel.c:5179
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.

References a, ast_channel_name(), ast_channel_rawwriteformat(), ast_debug, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log, AST_STATE_UP, ast_write(), and LOG_WARNING.

Referenced by ast_activate_generator().

◆ ast_queue_answer()

int ast_queue_answer ( struct ast_channel chan,
const struct ast_stream_topology topology 
)

Queue an ANSWER control frame with topology.

Parameters
chanchannel to queue frame onto
topologytopology to be passed through the core to the peer channel
Return values
0success
non-zerofailure

Definition at line 1304 of file channel.c.

1305{
1306 struct ast_frame f = {
1309 .subclass.topology = (struct ast_stream_topology *)topology,
1310 };
1311 return ast_queue_frame(chan, &f);
1312}

References AST_CONTROL_ANSWER, AST_FRAME_CONTROL, ast_queue_frame(), ast_frame_subclass::integer, and ast_frame::subclass.

◆ ast_queue_control()

int ast_queue_control ( struct ast_channel chan,
enum ast_control_frame_type  control 
)

◆ ast_queue_control_data()

int ast_queue_control_data ( struct ast_channel chan,
enum ast_control_frame_type  control,
const void *  data,
size_t  datalen 
)

Queue a control frame with payload.

Parameters
chanchannel to queue frame onto
controltype of control frame
datapointer to payload data to be included in frame
datalennumber of bytes of payload data
Return values
0success
non-zerofailure

The supplied payload data is copied into the frame, so the caller's copy is not modified nor freed, and the resulting frame will retain a copy of the data even if the caller frees their local copy.

Note
This method should be treated as a 'network transport'; in other words, your frames may be transferred across an IAX2 channel to another system, which may be a different endianness than yours. Because of this, you should ensure that either your frames will never be expected to work across systems, or that you always put your payload data into 'network byte order' before calling this function.
The channel does not need to be locked before calling this function.

Definition at line 1296 of file channel.c.

1298{
1299 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control, .data.ptr = (void *) data, .datalen = datalen };
1300 return ast_queue_frame(chan, &f);
1301}

References AST_FRAME_CONTROL, ast_queue_frame(), ast_frame::data, ast_frame::datalen, ast_frame_subclass::integer, and ast_frame::subclass.

Referenced by __analog_handle_event(), after_bridge_move_channel(), analog_callwaiting_deluxe(), ast_channel_queue_connected_line_update(), ast_channel_queue_redirecting_update(), chan_pjsip_incoming_response_update_cause(), close_udptl_connection(), fax_gateway_indicate_t38(), iax2_transfer(), jingle_action_session_terminate(), onModeChanged(), ooh323_indicate(), queue_read_action_payload(), setup_udptl_connection(), socket_process_helper(), t38_change_state(), t38_framehook(), t38_interpret_parameters(), transfer_redirect(), transfer_refer(), and xfer_client_on_evsub_state().

◆ ast_queue_frame()

int ast_queue_frame ( struct ast_channel chan,
struct ast_frame f 
)

Queue one or more frames to a channel's frame queue.

Parameters
chanthe channel to queue the frame(s) on
fthe frame(s) to queue. Note that the frame(s) will be duplicated by this function. It is the responsibility of the caller to handle freeing the memory associated with the frame(s) being passed if necessary.
Return values
0success
non-zerofailure

Definition at line 1171 of file channel.c.

1172{
1173 return __ast_queue_frame(chan, fin, 0, NULL);
1174}
static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
Definition channel.c:1041

References __ast_queue_frame(), and NULL.

Referenced by __ast_read(), action_atxfer(), action_cancel_atxfer(), apply_negotiated_sdp_stream(), ast_channel_set_unbridged_nolock(), ast_channel_setwhentohangup_tv(), ast_channel_stream_topology_changed_externally(), ast_dsp_process(), ast_msg_data_queue_frame(), ast_queue_answer(), ast_queue_cc_frame(), ast_queue_control(), ast_queue_control_data(), ast_queue_hangup(), ast_queue_hangup_with_cause(), ast_queue_hold(), ast_queue_unhold(), ast_softhangup_nolock(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), attended_transfer_exec(), bridge_channel_internal_push_full(), bridge_channel_poke(), channel_do_masquerade(), cli_console_dial(), cli_console_sendtext(), conf_stop_record(), dahdi_queue_frame(), dahdi_read(), dictate_exec(), dtmf_info_incoming_request(), exec_command_on_condition(), handle_command(), handle_incoming_request(), handle_negotiated_sdp(), iax2_queue_frame(), load_stream_readqueue(), manager_play_dtmf(), manager_send_flash(), ooh323_onReceivedDigit(), queue_dtmf_readq(), refer_incoming_invite_request(), set_interval_hook(), stream_monitor(), stream_periodic_frames(), stream_periodic_frames(), t38_tx_packet_handler(), unistim_do_senddigit(), unreal_queue_frame(), and wakeup_sub().

◆ ast_queue_frame_head()

int ast_queue_frame_head ( struct ast_channel chan,
struct ast_frame f 
)

Queue one or more frames to the head of a channel's frame queue.

Parameters
chanthe channel to queue the frame(s) on
fthe frame(s) to queue. Note that the frame(s) will be duplicated by this function. It is the responsibility of the caller to handle freeing the memory associated with the frame(s) being passed if necessary.
Return values
0success
non-zerofailure

Definition at line 1176 of file channel.c.

1177{
1178 return __ast_queue_frame(chan, fin, 1, NULL);
1179}

References __ast_queue_frame(), and NULL.

Referenced by __ast_answer(), __ast_read(), ast_autoservice_stop(), bridge_channel_queue_deferred_frames(), and safe_sleep_conditional().

◆ ast_queue_hangup()

int ast_queue_hangup ( struct ast_channel chan)

Queue a hangup frame.

Note
The channel does not need to be locked before calling this function.

Queue a hangup frame.

Definition at line 1182 of file channel.c.

1183{
1186 int res, cause, tech_cause;
1187
1188 if (!blob) {
1189 return -1;
1190 }
1191
1192 /* Yeah, let's not change a lock-critical value without locking */
1193 ast_channel_lock(chan);
1195
1196 cause = ast_channel_hangupcause(chan);
1197 if (cause) {
1198 ast_json_object_set(blob, "cause", ast_json_integer_create(cause));
1199 }
1200 tech_cause = ast_channel_tech_hangupcause(chan);
1201 if (tech_cause) {
1202 ast_json_object_set(blob, "tech_cause", ast_json_integer_create(tech_cause));
1203 }
1204
1206
1207 res = ast_queue_frame(chan, &f);
1208 ast_channel_unlock(chan);
1209 return res;
1210}
struct stasis_message_type * ast_channel_hangup_request_type(void)
Message type for when a hangup is requested on a channel.
struct ast_json * ast_json_object_create(void)
Create a new JSON object.
Definition json.c:399
struct ast_json * ast_json_integer_create(intmax_t value)
Create a JSON integer.
Definition json.c:327
int ast_json_object_set(struct ast_json *object, const char *key, struct ast_json *value)
Set a field in a JSON object.
Definition json.c:414

References ast_channel_hangup_request_type(), ast_channel_hangupcause(), ast_channel_lock, ast_channel_publish_blob(), ast_channel_softhangup_internal_flag_add(), ast_channel_tech_hangupcause(), ast_channel_unlock, AST_CONTROL_HANGUP, AST_FRAME_CONTROL, ast_json_integer_create(), ast_json_object_create(), ast_json_object_set(), ast_json_unref(), ast_queue_frame(), AST_SOFTHANGUP_DEV, ast_frame_subclass::integer, RAII_VAR, and ast_frame::subclass.

Referenced by analog_callwaiting_deluxe(), ast_app_exec_sub(), ast_unreal_fixup(), call(), chan_pjsip_session_end(), cli_console_hangup(), close_call(), iax2_destroy(), iax2_queue_hangup(), mbl_queue_hangup(), refer_incoming_invite_request(), and session_inv_on_media_update().

◆ ast_queue_hangup_with_cause()

int ast_queue_hangup_with_cause ( struct ast_channel chan,
int  cause 
)

Queue a hangup frame with hangupcause set.

Note
The channel does not need to be locked before calling this function.
Parameters
[in]chanchannel to queue frame onto
[in]causethe hangup cause
Return values
0on success
-1on error
Since
1.6.1

Queue a hangup frame with hangupcause set.

Definition at line 1213 of file channel.c.

1214{
1215 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
1217 int res;
1218 int tech_cause = 0;
1219
1220 if (cause >= 0) {
1221 f.data.uint32 = cause;
1222 }
1223
1224 /* Yeah, let's not change a lock-critical value without locking */
1225 ast_channel_lock(chan);
1227 if (cause < 0) {
1229 }
1230 blob = ast_json_pack("{s: i}",
1231 "cause", cause);
1232 if (!blob) {
1233 ast_channel_unlock(chan);
1234 return -1;
1235 }
1236
1237 tech_cause = ast_channel_tech_hangupcause(chan);
1238 if (tech_cause) {
1239 ast_json_object_set(blob, "tech_cause", ast_json_integer_create(tech_cause));
1240 }
1241
1243
1244 res = ast_queue_frame(chan, &f);
1245 ast_channel_unlock(chan);
1246 return res;
1247}

References ast_channel_hangup_request_type(), ast_channel_hangupcause(), ast_channel_lock, ast_channel_publish_blob(), ast_channel_softhangup_internal_flag_add(), ast_channel_tech_hangupcause(), ast_channel_unlock, AST_CONTROL_HANGUP, AST_FRAME_CONTROL, ast_json_integer_create(), ast_json_object_set(), ast_json_pack(), ast_json_unref(), ast_queue_frame(), AST_SOFTHANGUP_DEV, ast_frame::data, ast_frame_subclass::integer, NULL, RAII_VAR, ast_frame::subclass, and ast_frame::uint32.

Referenced by __analog_handle_event(), _websocket_request_hangup(), ast_unreal_hangup(), close_call(), close_client(), dahdi_handle_event(), discard_call(), handle_call_outgoing(), jingle_action_session_terminate(), jingle_queue_hangup_with_cause(), onCallCleared(), and transfer_cancel_step2().

◆ ast_queue_hold()

int ast_queue_hold ( struct ast_channel chan,
const char *  musicclass 
)

Queue a hold frame.

Parameters
chanchannel to queue frame onto
musicclassThe suggested musicclass for the other end to use
Note
The channel does not need to be locked before calling this function.
Return values
zeroon success
non-zeroon failure

Definition at line 1249 of file channel.c.

1250{
1252 struct ast_json *blob = NULL;
1253 int res;
1254
1255 if (!ast_strlen_zero(musicclass)) {
1256 f.data.ptr = (void *) musicclass;
1257 f.datalen = strlen(musicclass) + 1;
1258
1259 blob = ast_json_pack("{s: s}",
1260 "musicclass", musicclass);
1261 }
1262
1263 ast_channel_lock(chan);
1265 ast_channel_unlock(chan);
1266
1267 res = ast_queue_frame(chan, &f);
1268
1269 ast_json_unref(blob);
1270
1271 return res;
1272}
struct stasis_message_type * ast_channel_hold_type(void)
Message type for when a channel is placed on hold.

References ast_channel_hold_type(), ast_channel_lock, ast_channel_publish_blob(), ast_channel_unlock, AST_CONTROL_HOLD, AST_FRAME_CONTROL, ast_json_pack(), ast_json_unref(), ast_queue_frame(), ast_strlen_zero(), ast_frame::data, ast_frame::datalen, ast_frame_subclass::integer, NULL, ast_frame::ptr, and ast_frame::subclass.

Referenced by __analog_handle_event(), analog_callwaiting_deluxe(), analog_hangup(), apply_negotiated_sdp_stream(), dahdi_handle_event(), dahdi_hangup(), iax2_queue_hold(), jingle_action_session_info(), sub_hold(), and transfer_call_step1().

◆ ast_queue_unhold()

int ast_queue_unhold ( struct ast_channel chan)

Queue an unhold frame.

Parameters
chanchannel to queue frame onto
Note
The channel does not need to be locked before calling this function.
Return values
zeroon success
non-zeroon failure

Definition at line 1274 of file channel.c.

1275{
1277 int res;
1278
1279 ast_channel_lock(chan);
1281 ast_channel_unlock(chan);
1282
1283 res = ast_queue_frame(chan, &f);
1284
1285 return res;
1286}
struct stasis_message_type * ast_channel_unhold_type(void)
Message type for when a channel is removed from hold.

References ast_channel_lock, ast_channel_publish_blob(), ast_channel_unhold_type(), ast_channel_unlock, AST_CONTROL_UNHOLD, AST_FRAME_CONTROL, ast_queue_frame(), ast_frame_subclass::integer, NULL, and ast_frame::subclass.

Referenced by __analog_handle_event(), __analog_ss_thread(), __dahdi_exception(), analog_callwaiting_deluxe(), analog_exception(), analog_hangup(), analog_ss_thread(), apply_negotiated_sdp_stream(), dahdi_handle_event(), dahdi_hangup(), iax2_queue_unhold(), jingle_action_session_info(), key_dial_page(), refer_incoming_invite_request(), session_inv_on_create_offer(), sub_unhold(), transfer_cancel_step2(), and unistim_hangup().

◆ ast_raw_answer()

int ast_raw_answer ( struct ast_channel chan)

Answer a channel.

Parameters
chanchannel to answer

This function answers a channel and handles all necessary call setup functions.

Note
The channel passed does not need to be locked, but is locked by the function when needed.
Unlike ast_answer(), this function will not wait for media flow to begin. The caller should be careful before sending media to the channel before incoming media arrives, as the outgoing media may be lost.
Return values
0on success
non-zeroon failure

Definition at line 2702 of file channel.c.

2703{
2705}
int ast_raw_answer_with_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer a channel passing in a stream topology.
Definition channel.c:2650

References ast_raw_answer_with_stream_topology(), and NULL.

Referenced by __ast_answer(), answer_trunk_chan(), app_control_answer(), pbx_builtin_answer(), and refer_incoming_invite_request().

◆ ast_raw_answer_with_stream_topology()

int ast_raw_answer_with_stream_topology ( struct ast_channel chan,
struct ast_stream_topology topology 
)

Answer a channel passing in a stream topology.

Since
18.0.0
Parameters
chanchannel to answer
topologythe peer's stream topology

This function answers a channel and handles all necessary call setup functions.

Note
The channel passed does not need to be locked, but is locked by the function when needed.
Unlike ast_answer(), this function will not wait for media flow to begin. The caller should be careful before sending media to the channel before incoming media arrives, as the outgoing media may be lost.
The topology is usually that of the peer channel and may be NULL.
Return values
0on success
non-zeroon failure

Definition at line 2650 of file channel.c.

2651{
2652 int res = 0;
2653 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2654
2655 ast_channel_lock(chan);
2656
2657 /* You can't answer an outbound call */
2659 ast_channel_unlock(chan);
2660 return 0;
2661 }
2662
2663 /* Stop if we're a zombie or need a soft hangup */
2665 ast_channel_unlock(chan);
2666 return -1;
2667 }
2668
2669 /*
2670 * Mark when incoming channel answered so we can know how
2671 * long the channel has been up.
2672 */
2674
2675 ast_channel_unlock(chan);
2676
2677 switch (ast_channel_state(chan)) {
2678 case AST_STATE_RINGING:
2679 case AST_STATE_RING:
2680 ast_channel_lock(chan);
2681 if (ast_channel_tech(chan)->answer_with_stream_topology) {
2682 res = ast_channel_tech(chan)->answer_with_stream_topology(chan, topology);
2683
2684 } else if (ast_channel_tech(chan)->answer) {
2685 res = ast_channel_tech(chan)->answer(chan);
2686 }
2688 ast_channel_unlock(chan);
2689 break;
2690 case AST_STATE_UP:
2691 /* Fall through */
2692 default:
2693 ast_debug(2, "Skipping answer, since channel state on %s is %s\n", ast_channel_name(chan), ast_state2str(ast_channel_state(chan)));
2694 break;
2695 }
2696
2697 ast_indicate(chan, -1);
2698
2699 return res;
2700}
static int answer(void *data)
Definition chan_pjsip.c:687
int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
Change the state of a channel.
Definition channel.c:7438
const char * ast_state2str(enum ast_channel_state state)
Gives the string form of a given channel state.
Definition channel.c:637
static void set_channel_answer_time(struct ast_channel *chan)
Definition channel.c:2639
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition channel.c:4310
int(*const answer)(struct ast_channel *chan)
Answer the channel.
Definition channel.h:727
int(*const answer_with_stream_topology)(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer the channel with topology.
Definition channel.h:740

References answer(), ast_channel_tech::answer, ast_channel_tech::answer_with_stream_topology, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_check_hangup(), ast_debug, AST_FLAG_OUTGOING, AST_FLAG_ZOMBIE, ast_indicate(), ast_setstate(), ast_state2str(), AST_STATE_RING, AST_STATE_RINGING, AST_STATE_UP, ast_test_flag, SCOPE_TRACE, and set_channel_answer_time().

Referenced by ast_raw_answer(), and pre_bridge_setup().

◆ ast_read()

struct ast_frame * ast_read ( struct ast_channel chan)

Reads a frame.

Parameters
chanchannel to read a frame from
Returns
Returns a frame, or NULL on error. If it returns NULL, you best just stop reading frames and assume the channel has been disconnected.
Note
This function will filter frames received from the channel so that only frames from the default stream for each media type are returned. All other media frames from other streams will be absorbed internally and a NULL frame returned instead.

Definition at line 4290 of file channel.c.

4291{
4292 return __ast_read(chan, 0, 1);
4293}
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition channel.c:3553

References __ast_read().

Referenced by __adsi_transmit_messages(), __analog_ss_thread(), __ast_answer(), __ast_play_and_record(), __ast_request_and_dial(), adsi_careful_send(), analog_ss_thread(), ast_recvtext(), AST_TEST_DEFINE(), ast_tonepair(), ast_transfer_protocol(), ast_waitfordigit_full(), async_agi_read_frame(), audiosocket_run(), autoservice_run(), background_detect_exec(), channel_spy(), conf_flush(), conf_run(), dial_exec_full(), dial_trunk(), dictate_exec(), disa_exec(), disable_t38(), do_broadcast(), do_waiting(), echo_exec(), eivr_comm(), generic_fax_exec(), handle_recordfile(), handle_speechrecognize(), isAnsweringMachine(), jack_exec(), measurenoise(), moh_channel_thread(), monitor_dial(), mp3_exec(), read_from_chan(), read_mf_digits(), read_sf_digits(), receive_dtmf_digits(), receivefax_t38_init(), record_exec(), recordthread(), run_agi(), safe_sleep_conditional(), scan_exec(), send_waveform_to_channel(), sendfax_t38_init(), speech_background(), stasis_app_exec(), wait_exec(), wait_for_answer(), wait_for_answer(), wait_for_hangup(), wait_for_signal_or_hangup(), wait_for_winner(), waitforring_exec(), and waitstream_core().

◆ ast_read_noaudio()

struct ast_frame * ast_read_noaudio ( struct ast_channel chan)

Reads a frame, returning AST_FRAME_NULL frame if audio.

Parameters
chanchannel to read a frame from
Returns
Returns a frame, or NULL on error. If it returns NULL, you best just stop reading frames and assume the channel has been disconnected.
Note
Audio is replaced with AST_FRAME_NULL to avoid transcode when the resulting audio is not necessary.

Definition at line 4300 of file channel.c.

4301{
4302 return __ast_read(chan, 1, 1);
4303}

References __ast_read().

Referenced by ast_control_tone(), and conf_run().

◆ ast_read_stream()

struct ast_frame * ast_read_stream ( struct ast_channel chan)

Reads a frame, but does not filter to just the default streams.

Parameters
chanchannel to read a frame from
Returns
Returns a frame, or NULL on error. If it returns NULL, you best just stop reading frames and assume the channel has been disconnected.
Note
This function will not perform any filtering and will return media frames from all streams on the channel. To determine which stream a frame originated from the stream_num on it can be examined.

Definition at line 4295 of file channel.c.

4296{
4297 return __ast_read(chan, 0, 0);
4298}

References __ast_read().

Referenced by AST_TEST_DEFINE(), bridge_handle_trip(), read_from_chan(), and stream_echo_perform().

◆ ast_read_stream_noaudio()

struct ast_frame * ast_read_stream_noaudio ( struct ast_channel chan)

Reads a frame, but does not filter to just the default streams, returning AST_FRAME_NULL frame if audio.

Parameters
chanchannel to read a frame from
Returns
Returns a frame, or NULL on error. If it returns NULL, you best just stop reading frames and assume the channel has been disconnected.
Note
This function will not perform any filtering and will return media frames from all streams on the channel. To determine which stream a frame originated from the stream_num on it can be examined.
Audio is replaced with AST_FRAME_NULL to avoid transcode when the resulting audio is not necessary.

Definition at line 4305 of file channel.c.

4306{
4307 return __ast_read(chan, 1, 0);
4308}

References __ast_read().

Referenced by bridge_handle_trip().

◆ ast_readstring()

int ast_readstring ( struct ast_channel c,
char *  s,
int  len,
int  timeout,
int  rtimeout,
char *  enders 
)

Reads multiple digits.

Parameters
cchannel to read from
sstring to read in to. Must be at least the size of your length
lenhow many digits to read (maximum)
timeouthow long to timeout between digits
rtimeouttimeout to wait on the first digit
endersdigits to end the string

Read in a digit string "s", max length "len", maximum timeout between digits "timeout" (-1 for none), terminated by anything in "enders". Give them rtimeout for the first digit.

Returns
Returns 0 on normal return, or 1 on a timeout. In the case of a timeout, any digits that were read before the timeout will still be available in s. RETURNS 2 in full version when ctrlfd is available, NOT 1
Examples
app_skel.c.

Definition at line 6593 of file channel.c.

6594{
6595 return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
6596}
int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
Definition channel.c:6598

References ast_readstring_full(), c, and len().

Referenced by __adsi_transmit_messages(), adsi_begin_download(), adsi_get_cpeinfo(), adsi_load_session(), app_exec(), ast_app_getdata_terminator(), dialout(), do_directory(), forward_message(), privacy_exec(), vm_authenticate(), vm_newuser_setup(), and vm_options().

◆ ast_readstring_full()

int ast_readstring_full ( struct ast_channel c,
char *  s,
int  len,
int  timeout,
int  rtimeout,
char *  enders,
int  audiofd,
int  ctrlfd 
)

Definition at line 6598 of file channel.c.

6599{
6600 int pos = 0; /* index in the buffer where we accumulate digits */
6601 int to = ftimeout;
6602
6603 struct ast_silence_generator *silgen = NULL;
6604
6605 /* Stop if we're a zombie or need a soft hangup */
6607 return -1;
6608 if (!len)
6609 return -1;
6610 for (;;) {
6611 int d;
6612 if (ast_channel_stream(c)) {
6613 d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
6615 if (!silgen && ast_opt_transmit_silence)
6617 usleep(1000);
6618 if (!d)
6619 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6620 } else {
6621 if (!silgen && ast_opt_transmit_silence)
6623 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6624 }
6625 if (d < 0) {
6627 return AST_GETDATA_FAILED;
6628 }
6629 if (d == 0) {
6630 s[pos] = '\0';
6632 return AST_GETDATA_TIMEOUT;
6633 }
6634 if (d == 1) {
6635 s[pos] = '\0';
6638 }
6639 if (strchr(enders, d) && (pos == 0)) {
6640 s[pos] = '\0';
6643 }
6644 if (!strchr(enders, d)) {
6645 s[pos++] = d;
6646 }
6647 if (strchr(enders, d) || (pos >= len)) {
6648 s[pos] = '\0';
6650 return AST_GETDATA_COMPLETE;
6651 }
6652 to = timeout;
6653 }
6654 /* Never reached */
6655 return 0;
6656}
struct ast_silence_generator * ast_channel_start_silence_generator(struct ast_channel *chan)
Starts a silence generator on the given channel.
Definition channel.c:8248
void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_silence_generator *state)
Stops a previously-started silence generator on the given channel.
Definition channel.c:8294
int ast_waitfordigit_full(struct ast_channel *c, int timeout_ms, const char *breakon, int audiofd, int cmdfd)
Wait for a digit Same as ast_waitfordigit() with audio fd for outputting read audio and ctrlfd to mon...
Definition channel.c:3256
int ast_waitstream_full(struct ast_channel *c, const char *breakon, int audiofd, int monfd)
Definition file.c:1883
int ast_stopstream(struct ast_channel *c)
Stops a stream.
Definition file.c:223
#define AST_DIGIT_ANY
Definition file.h:48
@ AST_GETDATA_FAILED
@ AST_GETDATA_INTERRUPTED
@ AST_GETDATA_COMPLETE
@ AST_GETDATA_TIMEOUT
@ AST_GETDATA_EMPTY_END_TERMINATED
#define ast_opt_transmit_silence
Definition options.h:134
static struct test_val d

References ast_channel_flags(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_channel_stream(), ast_check_hangup(), AST_DIGIT_ANY, AST_FLAG_ZOMBIE, AST_GETDATA_COMPLETE, AST_GETDATA_EMPTY_END_TERMINATED, AST_GETDATA_FAILED, AST_GETDATA_INTERRUPTED, AST_GETDATA_TIMEOUT, ast_opt_transmit_silence, ast_stopstream(), ast_test_flag, ast_waitfordigit_full(), ast_waitstream_full(), c, d, len(), and NULL.

Referenced by ast_app_getdata_full(), and ast_readstring().

◆ ast_recvchar()

int ast_recvchar ( struct ast_channel chan,
int  timeout 
)

Receives a text character from a channel.

Parameters
chanchannel to act upon
timeouttimeout in milliseconds (0 for infinite wait)

Read a char of text from a channel

Returns
0 on success, -1 on failure

Definition at line 4741 of file channel.c.

4742{
4743 int c;
4744 char *buf = ast_recvtext(chan, timeout);
4745 if (buf == NULL)
4746 return -1; /* error or timeout */
4747 c = *(unsigned char *)buf;
4748 ast_free(buf);
4749 return c;
4750}
char * ast_recvtext(struct ast_channel *chan, int timeout)
Receives a text string from a channel Read a string of text from a channel.
Definition channel.c:4752

References ast_free, ast_recvtext(), buf, c, and NULL.

Referenced by handle_recvchar().

◆ ast_recvtext()

char * ast_recvtext ( struct ast_channel chan,
int  timeout 
)

Receives a text string from a channel Read a string of text from a channel.

Parameters
chanchannel to act upon
timeouttimeout in milliseconds (0 for infinite wait)
Returns
the received text, or NULL to signify failure.

Definition at line 4752 of file channel.c.

4753{
4754 int res;
4755 char *buf = NULL;
4756 struct timeval start = ast_tvnow();
4757 int ms;
4758
4759 while ((ms = ast_remaining_ms(start, timeout))) {
4760 struct ast_frame *f;
4761
4762 if (ast_check_hangup(chan)) {
4763 break;
4764 }
4765 res = ast_waitfor(chan, ms);
4766 if (res <= 0) {/* timeout or error */
4767 break;
4768 }
4769 f = ast_read(chan);
4770 if (f == NULL) {
4771 break; /* no frame */
4772 }
4774 ast_frfree(f);
4775 break;
4776 } else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
4777 buf = ast_strndup((char *) f->data.ptr, f->datalen); /* dup and break */
4778 ast_frfree(f);
4779 break;
4780 }
4781 ast_frfree(f);
4782 }
4783 return buf;
4784}
#define ast_strndup(str, len)
A wrapper for strndup()
Definition astmm.h:256

References ast_check_hangup(), AST_CONTROL_HANGUP, AST_FRAME_CONTROL, AST_FRAME_TEXT, ast_frfree, ast_read(), ast_remaining_ms(), ast_strndup, ast_tvnow(), ast_waitfor(), buf, ast_frame::data, ast_frame::datalen, ast_frame::frametype, ast_frame_subclass::integer, NULL, ast_frame::ptr, and ast_frame::subclass.

Referenced by ast_recvchar(), handle_recvtext(), and recvtext_exec().

◆ ast_redirecting_build_data()

int ast_redirecting_build_data ( unsigned char *  data,
size_t  datalen,
const struct ast_party_redirecting redirecting,
const struct ast_set_party_redirecting update 
)

Build the redirecting id data frame.

Since
1.8
Parameters
dataBuffer to fill with the frame data
datalenSize of the buffer to fill
redirectingRedirecting id information
updateWhat redirecting information to build. NULL if all.
Return values
-1if error
Amountof data buffer used

Definition at line 9352 of file channel.c.

9353{
9354 int32_t value;
9355 size_t pos = 0;
9356 int res;
9357
9358 static const struct ast_party_id_ies orig_ies = {
9360 .name.char_set = AST_REDIRECTING_ORIG_NAME_CHAR_SET,
9361 .name.presentation = AST_REDIRECTING_ORIG_NAME_PRESENTATION,
9362 .name.valid = AST_REDIRECTING_ORIG_NAME_VALID,
9363
9364 .number.str = AST_REDIRECTING_ORIG_NUMBER,
9365 .number.plan = AST_REDIRECTING_ORIG_NUMBER_PLAN,
9366 .number.presentation = AST_REDIRECTING_ORIG_NUMBER_PRESENTATION,
9367 .number.valid = AST_REDIRECTING_ORIG_NUMBER_VALID,
9368
9369 .subaddress.str = AST_REDIRECTING_ORIG_SUBADDRESS,
9370 .subaddress.type = AST_REDIRECTING_ORIG_SUBADDRESS_TYPE,
9371 .subaddress.odd_even_indicator = AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN,
9372 .subaddress.valid = AST_REDIRECTING_ORIG_SUBADDRESS_VALID,
9373
9375 .combined_presentation = 0,/* Not sent. */
9376 };
9377 static const struct ast_party_id_ies from_ies = {
9379 .name.char_set = AST_REDIRECTING_FROM_NAME_CHAR_SET,
9380 .name.presentation = AST_REDIRECTING_FROM_NAME_PRESENTATION,
9381 .name.valid = AST_REDIRECTING_FROM_NAME_VALID,
9382
9383 .number.str = AST_REDIRECTING_FROM_NUMBER,
9384 .number.plan = AST_REDIRECTING_FROM_NUMBER_PLAN,
9385 .number.presentation = AST_REDIRECTING_FROM_NUMBER_PRESENTATION,
9386 .number.valid = AST_REDIRECTING_FROM_NUMBER_VALID,
9387
9388 .subaddress.str = AST_REDIRECTING_FROM_SUBADDRESS,
9389 .subaddress.type = AST_REDIRECTING_FROM_SUBADDRESS_TYPE,
9390 .subaddress.odd_even_indicator = AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN,
9391 .subaddress.valid = AST_REDIRECTING_FROM_SUBADDRESS_VALID,
9392
9394 .combined_presentation = AST_REDIRECTING_FROM_ID_PRESENTATION,
9395 };
9396 static const struct ast_party_id_ies to_ies = {
9398 .name.char_set = AST_REDIRECTING_TO_NAME_CHAR_SET,
9399 .name.presentation = AST_REDIRECTING_TO_NAME_PRESENTATION,
9400 .name.valid = AST_REDIRECTING_TO_NAME_VALID,
9401
9402 .number.str = AST_REDIRECTING_TO_NUMBER,
9403 .number.plan = AST_REDIRECTING_TO_NUMBER_PLAN,
9404 .number.presentation = AST_REDIRECTING_TO_NUMBER_PRESENTATION,
9405 .number.valid = AST_REDIRECTING_TO_NUMBER_VALID,
9406
9407 .subaddress.str = AST_REDIRECTING_TO_SUBADDRESS,
9408 .subaddress.type = AST_REDIRECTING_TO_SUBADDRESS_TYPE,
9409 .subaddress.odd_even_indicator = AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN,
9410 .subaddress.valid = AST_REDIRECTING_TO_SUBADDRESS_VALID,
9411
9413 .combined_presentation = AST_REDIRECTING_TO_ID_PRESENTATION,
9414 };
9415 static const struct ast_party_id_ies priv_orig_ies = {
9420
9423 .number.presentation = AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION,
9425
9426 .subaddress.str = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS,
9428 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN,
9430
9432 .combined_presentation = 0,/* Not sent. */
9433 };
9434 static const struct ast_party_id_ies priv_from_ies = {
9439
9442 .number.presentation = AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION,
9444
9445 .subaddress.str = AST_REDIRECTING_PRIV_FROM_SUBADDRESS,
9447 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN,
9449
9451 .combined_presentation = 0,/* Not sent. */
9452 };
9453 static const struct ast_party_id_ies priv_to_ies = {
9456 .name.presentation = AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION,
9458
9459 .number.str = AST_REDIRECTING_PRIV_TO_NUMBER,
9461 .number.presentation = AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION,
9463
9464 .subaddress.str = AST_REDIRECTING_PRIV_TO_SUBADDRESS,
9465 .subaddress.type = AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE,
9466 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN,
9467 .subaddress.valid = AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID,
9468
9470 .combined_presentation = 0,/* Not sent. */
9471 };
9472 static const struct ast_party_redirecting_reason_ies reason_ies = {
9475 };
9476
9477 static const struct ast_party_redirecting_reason_ies orig_reason_ies = {
9480 };
9481
9482 /* Redirecting frame version */
9483 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
9484 ast_log(LOG_WARNING, "No space left for redirecting frame version\n");
9485 return -1;
9486 }
9487 data[pos++] = AST_REDIRECTING_VERSION;
9488 data[pos++] = 1;
9489 data[pos++] = 2;/* Version 1 did not have a version ie */
9490
9491 res = party_id_build_data(data + pos, datalen - pos, &redirecting->orig,
9492 "redirecting-orig", &orig_ies, update ? &update->orig : NULL);
9493 if (res < 0) {
9494 return -1;
9495 }
9496 pos += res;
9497
9498 res = party_id_build_data(data + pos, datalen - pos, &redirecting->from,
9499 "redirecting-from", &from_ies, update ? &update->from : NULL);
9500 if (res < 0) {
9501 return -1;
9502 }
9503 pos += res;
9504
9505 res = party_id_build_data(data + pos, datalen - pos, &redirecting->to,
9506 "redirecting-to", &to_ies, update ? &update->to : NULL);
9507 if (res < 0) {
9508 return -1;
9509 }
9510 pos += res;
9511
9512 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_orig,
9513 "redirecting-priv-orig", &priv_orig_ies, update ? &update->priv_orig : NULL);
9514 if (res < 0) {
9515 return -1;
9516 }
9517 pos += res;
9518
9519 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_from,
9520 "redirecting-priv-from", &priv_from_ies, update ? &update->priv_from : NULL);
9521 if (res < 0) {
9522 return -1;
9523 }
9524 pos += res;
9525
9526 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_to,
9527 "redirecting-priv-to", &priv_to_ies, update ? &update->priv_to : NULL);
9528 if (res < 0) {
9529 return -1;
9530 }
9531 pos += res;
9532
9533 /* Redirecting reason */
9534 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->reason,
9535 "redirecting-reason", &reason_ies);
9536 if (res < 0) {
9537 return -1;
9538 }
9539 pos += res;
9540
9541 /* Redirecting original reason */
9542 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->orig_reason,
9543 "redirecting-orig-reason", &orig_reason_ies);
9544 if (res < 0) {
9545 return -1;
9546 }
9547 pos += res;
9548
9549 /* Redirecting count */
9550 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9551 ast_log(LOG_WARNING, "No space left for redirecting count\n");
9552 return -1;
9553 }
9554 data[pos++] = AST_REDIRECTING_COUNT;
9555 data[pos++] = sizeof(value);
9556 value = htonl(redirecting->count);
9557 memcpy(data + pos, &value, sizeof(value));
9558 pos += sizeof(value);
9559
9560 return pos;
9561}
@ AST_REDIRECTING_FROM_NAME_PRESENTATION
Definition channel.c:9249
@ AST_REDIRECTING_TO_NAME
Definition channel.c:9227
@ AST_REDIRECTING_VERSION
Definition channel.c:9242
@ AST_REDIRECTING_PRIV_FROM_NAME_VALID
Definition channel.c:9289
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN
Definition channel.c:9294
@ AST_REDIRECTING_TO_TAG
Definition channel.c:9241
@ AST_REDIRECTING_FROM_NUMBER_PLAN
Definition channel.c:9224
@ AST_REDIRECTING_PRIV_TO_NAME_VALID
Definition channel.c:9276
@ AST_REDIRECTING_ORIG_TAG
Definition channel.c:9269
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN
Definition channel.c:9307
@ AST_REDIRECTING_REASON_CODE
Definition channel.c:9230
@ AST_REDIRECTING_PRIV_TO_NUMBER_VALID
Definition channel.c:9273
@ AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION
Definition channel.c:9274
@ AST_REDIRECTING_ORIG_REASON_CODE
Definition channel.c:9270
@ AST_REDIRECTING_TO_NAME_PRESENTATION
Definition channel.c:9254
@ AST_REDIRECTING_PRIV_TO_NAME
Definition channel.c:9275
@ AST_REDIRECTING_PRIV_ORIG_NAME_VALID
Definition channel.c:9302
@ AST_REDIRECTING_ORIG_NUMBER_VALID
Definition channel.c:9258
@ AST_REDIRECTING_FROM_NUMBER_PRESENTATION
Definition channel.c:9251
@ AST_REDIRECTING_ORIG_SUBADDRESS_VALID
Definition channel.c:9268
@ AST_REDIRECTING_FROM_NUMBER_VALID
Definition channel.c:9250
@ AST_REDIRECTING_TO_NAME_VALID
Definition channel.c:9252
@ AST_REDIRECTING_PRIV_FROM_NAME
Definition channel.c:9288
@ AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN
Definition channel.c:9238
@ AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN
Definition channel.c:9267
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE
Definition channel.c:9293
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID
Definition channel.c:9282
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN
Definition channel.c:9281
@ AST_REDIRECTING_ORIG_NAME_CHAR_SET
Definition channel.c:9263
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS
Definition channel.c:9292
@ AST_REDIRECTING_TO_NUMBER_PLAN
Definition channel.c:9228
@ AST_REDIRECTING_PRIV_TO_NUMBER
Definition channel.c:9271
@ AST_REDIRECTING_PRIV_FROM_NUMBER_VALID
Definition channel.c:9286
@ AST_REDIRECTING_ORIG_NAME
Definition channel.c:9261
@ AST_REDIRECTING_ORIG_SUBADDRESS
Definition channel.c:9265
@ AST_REDIRECTING_FROM_TAG
Definition channel.c:9240
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN
Definition channel.c:9299
@ AST_REDIRECTING_TO_NUMBER
Definition channel.c:9226
@ AST_REDIRECTING_ORIG_SUBADDRESS_TYPE
Definition channel.c:9266
@ AST_REDIRECTING_FROM_NAME_CHAR_SET
Definition channel.c:9248
@ AST_REDIRECTING_PRIV_FROM_TAG
Definition channel.c:9296
@ AST_REDIRECTING_FROM_ID_PRESENTATION
Definition channel.c:9225
@ AST_REDIRECTING_PRIV_FROM_NUMBER
Definition channel.c:9284
@ AST_REDIRECTING_PRIV_TO_NUMBER_PLAN
Definition channel.c:9272
@ AST_REDIRECTING_TO_NUMBER_VALID
Definition channel.c:9255
@ AST_REDIRECTING_FROM_SUBADDRESS_VALID
Definition channel.c:9235
@ AST_REDIRECTING_FROM_NAME_VALID
Definition channel.c:9247
@ AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET
Definition channel.c:9277
@ AST_REDIRECTING_PRIV_ORIG_TAG
Definition channel.c:9309
@ AST_REDIRECTING_FROM_SUBADDRESS_TYPE
Definition channel.c:9233
@ AST_REDIRECTING_PRIV_TO_TAG
Definition channel.c:9283
@ AST_REDIRECTING_COUNT
Definition channel.c:9231
@ AST_REDIRECTING_FROM_SUBADDRESS
Definition channel.c:9232
@ AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET
Definition channel.c:9303
@ AST_REDIRECTING_ORIG_NAME_VALID
Definition channel.c:9262
@ AST_REDIRECTING_TO_ID_PRESENTATION
Definition channel.c:9229
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN
Definition channel.c:9285
@ AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION
Definition channel.c:9278
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION
Definition channel.c:9287
@ AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION
Definition channel.c:9291
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE
Definition channel.c:9306
@ AST_REDIRECTING_ORIG_REASON_STR
Definition channel.c:9311
@ AST_REDIRECTING_ORIG_NAME_PRESENTATION
Definition channel.c:9264
@ AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET
Definition channel.c:9290
@ AST_REDIRECTING_ORIG_NUMBER
Definition channel.c:9257
@ AST_REDIRECTING_PRIV_ORIG_NAME
Definition channel.c:9301
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE
Definition channel.c:9280
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID
Definition channel.c:9298
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION
Definition channel.c:9300
@ AST_REDIRECTING_TO_SUBADDRESS_VALID
Definition channel.c:9239
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID
Definition channel.c:9308
@ AST_REDIRECTING_TO_SUBADDRESS_TYPE
Definition channel.c:9237
@ AST_REDIRECTING_REASON_STR
Definition channel.c:9310
@ AST_REDIRECTING_FROM_NAME
Definition channel.c:9223
@ AST_REDIRECTING_PRIV_ORIG_NUMBER
Definition channel.c:9297
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID
Definition channel.c:9295
@ AST_REDIRECTING_ORIG_NUMBER_PRESENTATION
Definition channel.c:9260
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS
Definition channel.c:9279
@ AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION
Definition channel.c:9304
@ AST_REDIRECTING_TO_NUMBER_PRESENTATION
Definition channel.c:9256
@ AST_REDIRECTING_FROM_NUMBER
Definition channel.c:9222
@ AST_REDIRECTING_ORIG_NUMBER_PLAN
Definition channel.c:9259
@ AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN
Definition channel.c:9234
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS
Definition channel.c:9305
@ AST_REDIRECTING_TO_SUBADDRESS
Definition channel.c:9236
@ AST_REDIRECTING_TO_NAME_CHAR_SET
Definition channel.c:9253
static int redirecting_reason_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting_reason *reason, const char *label, const struct ast_party_redirecting_reason_ies *ies)
Definition channel.c:9319

References ast_log, AST_REDIRECTING_COUNT, AST_REDIRECTING_FROM_ID_PRESENTATION, AST_REDIRECTING_FROM_NAME, AST_REDIRECTING_FROM_NAME_CHAR_SET, AST_REDIRECTING_FROM_NAME_PRESENTATION, AST_REDIRECTING_FROM_NAME_VALID, AST_REDIRECTING_FROM_NUMBER, AST_REDIRECTING_FROM_NUMBER_PLAN, AST_REDIRECTING_FROM_NUMBER_PRESENTATION, AST_REDIRECTING_FROM_NUMBER_VALID, AST_REDIRECTING_FROM_SUBADDRESS, AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_FROM_SUBADDRESS_TYPE, AST_REDIRECTING_FROM_SUBADDRESS_VALID, AST_REDIRECTING_FROM_TAG, AST_REDIRECTING_ORIG_NAME, AST_REDIRECTING_ORIG_NAME_CHAR_SET, AST_REDIRECTING_ORIG_NAME_PRESENTATION, AST_REDIRECTING_ORIG_NAME_VALID, AST_REDIRECTING_ORIG_NUMBER, AST_REDIRECTING_ORIG_NUMBER_PLAN, AST_REDIRECTING_ORIG_NUMBER_PRESENTATION, AST_REDIRECTING_ORIG_NUMBER_VALID, AST_REDIRECTING_ORIG_REASON_CODE, AST_REDIRECTING_ORIG_REASON_STR, AST_REDIRECTING_ORIG_SUBADDRESS, AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_ORIG_SUBADDRESS_TYPE, AST_REDIRECTING_ORIG_SUBADDRESS_VALID, AST_REDIRECTING_ORIG_TAG, AST_REDIRECTING_PRIV_FROM_NAME, AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET, AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION, AST_REDIRECTING_PRIV_FROM_NAME_VALID, AST_REDIRECTING_PRIV_FROM_NUMBER, AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN, AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION, AST_REDIRECTING_PRIV_FROM_NUMBER_VALID, AST_REDIRECTING_PRIV_FROM_SUBADDRESS, AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE, AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID, AST_REDIRECTING_PRIV_FROM_TAG, AST_REDIRECTING_PRIV_ORIG_NAME, AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET, AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION, AST_REDIRECTING_PRIV_ORIG_NAME_VALID, AST_REDIRECTING_PRIV_ORIG_NUMBER, AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN, AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION, AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID, AST_REDIRECTING_PRIV_ORIG_TAG, AST_REDIRECTING_PRIV_TO_NAME, AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET, AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION, AST_REDIRECTING_PRIV_TO_NAME_VALID, AST_REDIRECTING_PRIV_TO_NUMBER, AST_REDIRECTING_PRIV_TO_NUMBER_PLAN, AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION, AST_REDIRECTING_PRIV_TO_NUMBER_VALID, AST_REDIRECTING_PRIV_TO_SUBADDRESS, AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE, AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID, AST_REDIRECTING_PRIV_TO_TAG, AST_REDIRECTING_REASON_CODE, AST_REDIRECTING_REASON_STR, AST_REDIRECTING_TO_ID_PRESENTATION, AST_REDIRECTING_TO_NAME, AST_REDIRECTING_TO_NAME_CHAR_SET, AST_REDIRECTING_TO_NAME_PRESENTATION, AST_REDIRECTING_TO_NAME_VALID, AST_REDIRECTING_TO_NUMBER, AST_REDIRECTING_TO_NUMBER_PLAN, AST_REDIRECTING_TO_NUMBER_PRESENTATION, AST_REDIRECTING_TO_NUMBER_VALID, AST_REDIRECTING_TO_SUBADDRESS, AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_TO_SUBADDRESS_TYPE, AST_REDIRECTING_TO_SUBADDRESS_VALID, AST_REDIRECTING_TO_TAG, AST_REDIRECTING_VERSION, ast_party_redirecting_reason_ies::code, ast_party_redirecting::count, ast_party_redirecting::from, LOG_WARNING, ast_party_id_ies::name, NULL, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, party_id_build_data(), ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, redirecting_reason_build_data(), ast_party_name_ies::str, ast_party_redirecting::to, update(), and value.

Referenced by ast_channel_queue_redirecting_update(), ast_channel_update_redirecting(), and unreal_colp_redirect_indicate().

◆ ast_redirecting_parse_data()

int ast_redirecting_parse_data ( const unsigned char *  data,
size_t  datalen,
struct ast_party_redirecting redirecting 
)

Parse redirecting indication frame data.

Since
1.8
Parameters
dataBuffer with the frame data to parse
datalenSize of the buffer
redirectingExtracted redirecting id information
Return values
0on success.
-1on error.
Note
The filled in id structure needs to be initialized by ast_party_redirecting_set_init() before calling.
The filled in id structure needs to be destroyed by ast_party_redirecting_free() when it is no longer needed.

Definition at line 9563 of file channel.c.

9564{
9565 size_t pos;
9566 unsigned char ie_len;
9567 unsigned char ie_id;
9568 int32_t value;
9569 int frame_version = 1;
9570 int from_combined_presentation = 0;
9571 int got_from_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9572 int to_combined_presentation = 0;
9573 int got_to_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9574
9575 for (pos = 0; pos < datalen; pos += ie_len) {
9576 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
9577 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9578 return -1;
9579 }
9580 ie_id = data[pos++];
9581 ie_len = data[pos++];
9582 if (datalen < pos + ie_len) {
9583 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9584 return -1;
9585 }
9586
9587 switch (ie_id) {
9588/* Redirecting frame version */
9590 if (ie_len != 1) {
9591 ast_log(LOG_WARNING, "Invalid redirecting frame version (%u)\n",
9592 (unsigned) ie_len);
9593 break;
9594 }
9595 frame_version = data[pos];
9596 break;
9597/* Redirecting-orig party id name */
9599 ast_free(redirecting->orig.name.str);
9600 redirecting->orig.name.str = ast_malloc(ie_len + 1);
9601 if (redirecting->orig.name.str) {
9602 memcpy(redirecting->orig.name.str, data + pos, ie_len);
9603 redirecting->orig.name.str[ie_len] = 0;
9604 }
9605 break;
9607 if (ie_len != 1) {
9608 ast_log(LOG_WARNING, "Invalid redirecting-orig name char set (%u)\n",
9609 (unsigned) ie_len);
9610 break;
9611 }
9612 redirecting->orig.name.char_set = data[pos];
9613 break;
9615 if (ie_len != 1) {
9616 ast_log(LOG_WARNING, "Invalid redirecting-orig name presentation (%u)\n",
9617 (unsigned) ie_len);
9618 break;
9619 }
9620 redirecting->orig.name.presentation = data[pos];
9621 break;
9623 if (ie_len != 1) {
9624 ast_log(LOG_WARNING, "Invalid redirecting-orig name valid (%u)\n",
9625 (unsigned) ie_len);
9626 break;
9627 }
9628 redirecting->orig.name.valid = data[pos];
9629 break;
9630/* Redirecting-orig party id number */
9632 ast_free(redirecting->orig.number.str);
9633 redirecting->orig.number.str = ast_malloc(ie_len + 1);
9634 if (redirecting->orig.number.str) {
9635 memcpy(redirecting->orig.number.str, data + pos, ie_len);
9636 redirecting->orig.number.str[ie_len] = 0;
9637 }
9638 break;
9640 if (ie_len != 1) {
9641 ast_log(LOG_WARNING, "Invalid redirecting-orig numbering plan (%u)\n",
9642 (unsigned) ie_len);
9643 break;
9644 }
9645 redirecting->orig.number.plan = data[pos];
9646 break;
9648 if (ie_len != 1) {
9649 ast_log(LOG_WARNING, "Invalid redirecting-orig number presentation (%u)\n",
9650 (unsigned) ie_len);
9651 break;
9652 }
9653 redirecting->orig.number.presentation = data[pos];
9654 break;
9656 if (ie_len != 1) {
9657 ast_log(LOG_WARNING, "Invalid redirecting-orig number valid (%u)\n",
9658 (unsigned) ie_len);
9659 break;
9660 }
9661 redirecting->orig.number.valid = data[pos];
9662 break;
9663/* Redirecting-orig party id subaddress */
9665 ast_free(redirecting->orig.subaddress.str);
9666 redirecting->orig.subaddress.str = ast_malloc(ie_len + 1);
9667 if (redirecting->orig.subaddress.str) {
9668 memcpy(redirecting->orig.subaddress.str, data + pos, ie_len);
9669 redirecting->orig.subaddress.str[ie_len] = 0;
9670 }
9671 break;
9673 if (ie_len != 1) {
9674 ast_log(LOG_WARNING, "Invalid redirecting-orig type of subaddress (%u)\n",
9675 (unsigned) ie_len);
9676 break;
9677 }
9678 redirecting->orig.subaddress.type = data[pos];
9679 break;
9681 if (ie_len != 1) {
9683 "Invalid redirecting-orig subaddress odd-even indicator (%u)\n",
9684 (unsigned) ie_len);
9685 break;
9686 }
9687 redirecting->orig.subaddress.odd_even_indicator = data[pos];
9688 break;
9690 if (ie_len != 1) {
9691 ast_log(LOG_WARNING, "Invalid redirecting-orig subaddress valid (%u)\n",
9692 (unsigned) ie_len);
9693 break;
9694 }
9695 redirecting->orig.subaddress.valid = data[pos];
9696 break;
9697/* Redirecting-orig party id tag */
9699 ast_free(redirecting->orig.tag);
9700 redirecting->orig.tag = ast_malloc(ie_len + 1);
9701 if (redirecting->orig.tag) {
9702 memcpy(redirecting->orig.tag, data + pos, ie_len);
9703 redirecting->orig.tag[ie_len] = 0;
9704 }
9705 break;
9706/* Redirecting-from party id name */
9708 ast_free(redirecting->from.name.str);
9709 redirecting->from.name.str = ast_malloc(ie_len + 1);
9710 if (redirecting->from.name.str) {
9711 memcpy(redirecting->from.name.str, data + pos, ie_len);
9712 redirecting->from.name.str[ie_len] = 0;
9713 }
9714 break;
9716 if (ie_len != 1) {
9717 ast_log(LOG_WARNING, "Invalid redirecting-from name char set (%u)\n",
9718 (unsigned) ie_len);
9719 break;
9720 }
9721 redirecting->from.name.char_set = data[pos];
9722 break;
9724 if (ie_len != 1) {
9725 ast_log(LOG_WARNING, "Invalid redirecting-from name presentation (%u)\n",
9726 (unsigned) ie_len);
9727 break;
9728 }
9729 redirecting->from.name.presentation = data[pos];
9730 break;
9732 if (ie_len != 1) {
9733 ast_log(LOG_WARNING, "Invalid redirecting-from name valid (%u)\n",
9734 (unsigned) ie_len);
9735 break;
9736 }
9737 redirecting->from.name.valid = data[pos];
9738 break;
9739/* Redirecting-from party id number */
9741 ast_free(redirecting->from.number.str);
9742 redirecting->from.number.str = ast_malloc(ie_len + 1);
9743 if (redirecting->from.number.str) {
9744 memcpy(redirecting->from.number.str, data + pos, ie_len);
9745 redirecting->from.number.str[ie_len] = 0;
9746 }
9747 break;
9749 if (ie_len != 1) {
9750 ast_log(LOG_WARNING, "Invalid redirecting-from numbering plan (%u)\n",
9751 (unsigned) ie_len);
9752 break;
9753 }
9754 redirecting->from.number.plan = data[pos];
9755 break;
9757 if (ie_len != 1) {
9758 ast_log(LOG_WARNING, "Invalid redirecting-from number presentation (%u)\n",
9759 (unsigned) ie_len);
9760 break;
9761 }
9762 redirecting->from.number.presentation = data[pos];
9763 break;
9765 if (ie_len != 1) {
9766 ast_log(LOG_WARNING, "Invalid redirecting-from number valid (%u)\n",
9767 (unsigned) ie_len);
9768 break;
9769 }
9770 redirecting->from.number.valid = data[pos];
9771 break;
9772/* Redirecting-from party id combined presentation */
9774 if (ie_len != 1) {
9775 ast_log(LOG_WARNING, "Invalid redirecting-from combined presentation (%u)\n",
9776 (unsigned) ie_len);
9777 break;
9778 }
9779 from_combined_presentation = data[pos];
9780 got_from_combined_presentation = 1;
9781 break;
9782/* Redirecting-from party id subaddress */
9784 ast_free(redirecting->from.subaddress.str);
9785 redirecting->from.subaddress.str = ast_malloc(ie_len + 1);
9786 if (redirecting->from.subaddress.str) {
9787 memcpy(redirecting->from.subaddress.str, data + pos, ie_len);
9788 redirecting->from.subaddress.str[ie_len] = 0;
9789 }
9790 break;
9792 if (ie_len != 1) {
9793 ast_log(LOG_WARNING, "Invalid redirecting-from type of subaddress (%u)\n",
9794 (unsigned) ie_len);
9795 break;
9796 }
9797 redirecting->from.subaddress.type = data[pos];
9798 break;
9800 if (ie_len != 1) {
9802 "Invalid redirecting-from subaddress odd-even indicator (%u)\n",
9803 (unsigned) ie_len);
9804 break;
9805 }
9806 redirecting->from.subaddress.odd_even_indicator = data[pos];
9807 break;
9809 if (ie_len != 1) {
9810 ast_log(LOG_WARNING, "Invalid redirecting-from subaddress valid (%u)\n",
9811 (unsigned) ie_len);
9812 break;
9813 }
9814 redirecting->from.subaddress.valid = data[pos];
9815 break;
9816/* Redirecting-from party id tag */
9818 ast_free(redirecting->from.tag);
9819 redirecting->from.tag = ast_malloc(ie_len + 1);
9820 if (redirecting->from.tag) {
9821 memcpy(redirecting->from.tag, data + pos, ie_len);
9822 redirecting->from.tag[ie_len] = 0;
9823 }
9824 break;
9825/* Redirecting-to party id name */
9827 ast_free(redirecting->to.name.str);
9828 redirecting->to.name.str = ast_malloc(ie_len + 1);
9829 if (redirecting->to.name.str) {
9830 memcpy(redirecting->to.name.str, data + pos, ie_len);
9831 redirecting->to.name.str[ie_len] = 0;
9832 }
9833 break;
9835 if (ie_len != 1) {
9836 ast_log(LOG_WARNING, "Invalid redirecting-to name char set (%u)\n",
9837 (unsigned) ie_len);
9838 break;
9839 }
9840 redirecting->to.name.char_set = data[pos];
9841 break;
9843 if (ie_len != 1) {
9844 ast_log(LOG_WARNING, "Invalid redirecting-to name presentation (%u)\n",
9845 (unsigned) ie_len);
9846 break;
9847 }
9848 redirecting->to.name.presentation = data[pos];
9849 break;
9851 if (ie_len != 1) {
9852 ast_log(LOG_WARNING, "Invalid redirecting-to name valid (%u)\n",
9853 (unsigned) ie_len);
9854 break;
9855 }
9856 redirecting->to.name.valid = data[pos];
9857 break;
9858/* Redirecting-to party id number */
9860 ast_free(redirecting->to.number.str);
9861 redirecting->to.number.str = ast_malloc(ie_len + 1);
9862 if (redirecting->to.number.str) {
9863 memcpy(redirecting->to.number.str, data + pos, ie_len);
9864 redirecting->to.number.str[ie_len] = 0;
9865 }
9866 break;
9868 if (ie_len != 1) {
9869 ast_log(LOG_WARNING, "Invalid redirecting-to numbering plan (%u)\n",
9870 (unsigned) ie_len);
9871 break;
9872 }
9873 redirecting->to.number.plan = data[pos];
9874 break;
9876 if (ie_len != 1) {
9877 ast_log(LOG_WARNING, "Invalid redirecting-to number presentation (%u)\n",
9878 (unsigned) ie_len);
9879 break;
9880 }
9881 redirecting->to.number.presentation = data[pos];
9882 break;
9884 if (ie_len != 1) {
9885 ast_log(LOG_WARNING, "Invalid redirecting-to number valid (%u)\n",
9886 (unsigned) ie_len);
9887 break;
9888 }
9889 redirecting->to.number.valid = data[pos];
9890 break;
9891/* Redirecting-to party id combined presentation */
9893 if (ie_len != 1) {
9894 ast_log(LOG_WARNING, "Invalid redirecting-to combined presentation (%u)\n",
9895 (unsigned) ie_len);
9896 break;
9897 }
9898 to_combined_presentation = data[pos];
9899 got_to_combined_presentation = 1;
9900 break;
9901/* Redirecting-to party id subaddress */
9903 ast_free(redirecting->to.subaddress.str);
9904 redirecting->to.subaddress.str = ast_malloc(ie_len + 1);
9905 if (redirecting->to.subaddress.str) {
9906 memcpy(redirecting->to.subaddress.str, data + pos, ie_len);
9907 redirecting->to.subaddress.str[ie_len] = 0;
9908 }
9909 break;
9911 if (ie_len != 1) {
9912 ast_log(LOG_WARNING, "Invalid redirecting-to type of subaddress (%u)\n",
9913 (unsigned) ie_len);
9914 break;
9915 }
9916 redirecting->to.subaddress.type = data[pos];
9917 break;
9919 if (ie_len != 1) {
9921 "Invalid redirecting-to subaddress odd-even indicator (%u)\n",
9922 (unsigned) ie_len);
9923 break;
9924 }
9925 redirecting->to.subaddress.odd_even_indicator = data[pos];
9926 break;
9928 if (ie_len != 1) {
9929 ast_log(LOG_WARNING, "Invalid redirecting-to subaddress valid (%u)\n",
9930 (unsigned) ie_len);
9931 break;
9932 }
9933 redirecting->to.subaddress.valid = data[pos];
9934 break;
9935/* Redirecting-to party id tag */
9937 ast_free(redirecting->to.tag);
9938 redirecting->to.tag = ast_malloc(ie_len + 1);
9939 if (redirecting->to.tag) {
9940 memcpy(redirecting->to.tag, data + pos, ie_len);
9941 redirecting->to.tag[ie_len] = 0;
9942 }
9943 break;
9944/* Private redirecting-orig party id name */
9946 ast_free(redirecting->priv_orig.name.str);
9947 redirecting->priv_orig.name.str = ast_malloc(ie_len + 1);
9948 if (redirecting->priv_orig.name.str) {
9949 memcpy(redirecting->priv_orig.name.str, data + pos, ie_len);
9950 redirecting->priv_orig.name.str[ie_len] = 0;
9951 }
9952 break;
9954 if (ie_len != 1) {
9955 ast_log(LOG_WARNING, "Invalid private redirecting-orig name char set (%u)\n",
9956 (unsigned) ie_len);
9957 break;
9958 }
9959 redirecting->priv_orig.name.char_set = data[pos];
9960 break;
9962 if (ie_len != 1) {
9963 ast_log(LOG_WARNING, "Invalid private redirecting-orig name presentation (%u)\n",
9964 (unsigned) ie_len);
9965 break;
9966 }
9967 redirecting->priv_orig.name.presentation = data[pos];
9968 break;
9970 if (ie_len != 1) {
9971 ast_log(LOG_WARNING, "Invalid private redirecting-orig name valid (%u)\n",
9972 (unsigned) ie_len);
9973 break;
9974 }
9975 redirecting->priv_orig.name.valid = data[pos];
9976 break;
9977/* Private redirecting-orig party id number */
9979 ast_free(redirecting->priv_orig.number.str);
9980 redirecting->priv_orig.number.str = ast_malloc(ie_len + 1);
9981 if (redirecting->priv_orig.number.str) {
9982 memcpy(redirecting->priv_orig.number.str, data + pos, ie_len);
9983 redirecting->priv_orig.number.str[ie_len] = 0;
9984 }
9985 break;
9987 if (ie_len != 1) {
9988 ast_log(LOG_WARNING, "Invalid private redirecting-orig numbering plan (%u)\n",
9989 (unsigned) ie_len);
9990 break;
9991 }
9992 redirecting->priv_orig.number.plan = data[pos];
9993 break;
9995 if (ie_len != 1) {
9996 ast_log(LOG_WARNING, "Invalid private redirecting-orig number presentation (%u)\n",
9997 (unsigned) ie_len);
9998 break;
9999 }
10000 redirecting->priv_orig.number.presentation = data[pos];
10001 break;
10003 if (ie_len != 1) {
10004 ast_log(LOG_WARNING, "Invalid private redirecting-orig number valid (%u)\n",
10005 (unsigned) ie_len);
10006 break;
10007 }
10008 redirecting->priv_orig.number.valid = data[pos];
10009 break;
10010/* Private redirecting-orig party id subaddress */
10012 ast_free(redirecting->priv_orig.subaddress.str);
10013 redirecting->priv_orig.subaddress.str = ast_malloc(ie_len + 1);
10014 if (redirecting->priv_orig.subaddress.str) {
10015 memcpy(redirecting->priv_orig.subaddress.str, data + pos, ie_len);
10016 redirecting->priv_orig.subaddress.str[ie_len] = 0;
10017 }
10018 break;
10020 if (ie_len != 1) {
10021 ast_log(LOG_WARNING, "Invalid private redirecting-orig type of subaddress (%u)\n",
10022 (unsigned) ie_len);
10023 break;
10024 }
10025 redirecting->priv_orig.subaddress.type = data[pos];
10026 break;
10028 if (ie_len != 1) {
10030 "Invalid private redirecting-orig subaddress odd-even indicator (%u)\n",
10031 (unsigned) ie_len);
10032 break;
10033 }
10034 redirecting->priv_orig.subaddress.odd_even_indicator = data[pos];
10035 break;
10037 if (ie_len != 1) {
10038 ast_log(LOG_WARNING, "Invalid private redirecting-orig subaddress valid (%u)\n",
10039 (unsigned) ie_len);
10040 break;
10041 }
10042 redirecting->priv_orig.subaddress.valid = data[pos];
10043 break;
10044/* Private redirecting-orig party id tag */
10046 ast_free(redirecting->priv_orig.tag);
10047 redirecting->priv_orig.tag = ast_malloc(ie_len + 1);
10048 if (redirecting->priv_orig.tag) {
10049 memcpy(redirecting->priv_orig.tag, data + pos, ie_len);
10050 redirecting->priv_orig.tag[ie_len] = 0;
10051 }
10052 break;
10053/* Private redirecting-from party id name */
10055 ast_free(redirecting->priv_from.name.str);
10056 redirecting->priv_from.name.str = ast_malloc(ie_len + 1);
10057 if (redirecting->priv_from.name.str) {
10058 memcpy(redirecting->priv_from.name.str, data + pos, ie_len);
10059 redirecting->priv_from.name.str[ie_len] = 0;
10060 }
10061 break;
10063 if (ie_len != 1) {
10064 ast_log(LOG_WARNING, "Invalid private redirecting-from name char set (%u)\n",
10065 (unsigned) ie_len);
10066 break;
10067 }
10068 redirecting->priv_from.name.char_set = data[pos];
10069 break;
10071 if (ie_len != 1) {
10072 ast_log(LOG_WARNING, "Invalid private redirecting-from name presentation (%u)\n",
10073 (unsigned) ie_len);
10074 break;
10075 }
10076 redirecting->priv_from.name.presentation = data[pos];
10077 break;
10079 if (ie_len != 1) {
10080 ast_log(LOG_WARNING, "Invalid private redirecting-from name valid (%u)\n",
10081 (unsigned) ie_len);
10082 break;
10083 }
10084 redirecting->priv_from.name.valid = data[pos];
10085 break;
10086/* Private redirecting-from party id number */
10088 ast_free(redirecting->priv_from.number.str);
10089 redirecting->priv_from.number.str = ast_malloc(ie_len + 1);
10090 if (redirecting->priv_from.number.str) {
10091 memcpy(redirecting->priv_from.number.str, data + pos, ie_len);
10092 redirecting->priv_from.number.str[ie_len] = 0;
10093 }
10094 break;
10096 if (ie_len != 1) {
10097 ast_log(LOG_WARNING, "Invalid private redirecting-from numbering plan (%u)\n",
10098 (unsigned) ie_len);
10099 break;
10100 }
10101 redirecting->priv_from.number.plan = data[pos];
10102 break;
10104 if (ie_len != 1) {
10105 ast_log(LOG_WARNING, "Invalid private redirecting-from number presentation (%u)\n",
10106 (unsigned) ie_len);
10107 break;
10108 }
10109 redirecting->priv_from.number.presentation = data[pos];
10110 break;
10112 if (ie_len != 1) {
10113 ast_log(LOG_WARNING, "Invalid private redirecting-from number valid (%u)\n",
10114 (unsigned) ie_len);
10115 break;
10116 }
10117 redirecting->priv_from.number.valid = data[pos];
10118 break;
10119/* Private redirecting-from party id subaddress */
10121 ast_free(redirecting->priv_from.subaddress.str);
10122 redirecting->priv_from.subaddress.str = ast_malloc(ie_len + 1);
10123 if (redirecting->priv_from.subaddress.str) {
10124 memcpy(redirecting->priv_from.subaddress.str, data + pos, ie_len);
10125 redirecting->priv_from.subaddress.str[ie_len] = 0;
10126 }
10127 break;
10129 if (ie_len != 1) {
10130 ast_log(LOG_WARNING, "Invalid private redirecting-from type of subaddress (%u)\n",
10131 (unsigned) ie_len);
10132 break;
10133 }
10134 redirecting->priv_from.subaddress.type = data[pos];
10135 break;
10137 if (ie_len != 1) {
10139 "Invalid private redirecting-from subaddress odd-even indicator (%u)\n",
10140 (unsigned) ie_len);
10141 break;
10142 }
10143 redirecting->priv_from.subaddress.odd_even_indicator = data[pos];
10144 break;
10146 if (ie_len != 1) {
10147 ast_log(LOG_WARNING, "Invalid private redirecting-from subaddress valid (%u)\n",
10148 (unsigned) ie_len);
10149 break;
10150 }
10151 redirecting->priv_from.subaddress.valid = data[pos];
10152 break;
10153/* Private redirecting-from party id tag */
10155 ast_free(redirecting->priv_from.tag);
10156 redirecting->priv_from.tag = ast_malloc(ie_len + 1);
10157 if (redirecting->priv_from.tag) {
10158 memcpy(redirecting->priv_from.tag, data + pos, ie_len);
10159 redirecting->priv_from.tag[ie_len] = 0;
10160 }
10161 break;
10162/* Private redirecting-to party id name */
10164 ast_free(redirecting->priv_to.name.str);
10165 redirecting->priv_to.name.str = ast_malloc(ie_len + 1);
10166 if (redirecting->priv_to.name.str) {
10167 memcpy(redirecting->priv_to.name.str, data + pos, ie_len);
10168 redirecting->priv_to.name.str[ie_len] = 0;
10169 }
10170 break;
10172 if (ie_len != 1) {
10173 ast_log(LOG_WARNING, "Invalid private redirecting-to name char set (%u)\n",
10174 (unsigned) ie_len);
10175 break;
10176 }
10177 redirecting->priv_to.name.char_set = data[pos];
10178 break;
10180 if (ie_len != 1) {
10181 ast_log(LOG_WARNING, "Invalid private redirecting-to name presentation (%u)\n",
10182 (unsigned) ie_len);
10183 break;
10184 }
10185 redirecting->priv_to.name.presentation = data[pos];
10186 break;
10188 if (ie_len != 1) {
10189 ast_log(LOG_WARNING, "Invalid private redirecting-to name valid (%u)\n",
10190 (unsigned) ie_len);
10191 break;
10192 }
10193 redirecting->priv_to.name.valid = data[pos];
10194 break;
10195/* Private redirecting-to party id number */
10197 ast_free(redirecting->priv_to.number.str);
10198 redirecting->priv_to.number.str = ast_malloc(ie_len + 1);
10199 if (redirecting->priv_to.number.str) {
10200 memcpy(redirecting->priv_to.number.str, data + pos, ie_len);
10201 redirecting->priv_to.number.str[ie_len] = 0;
10202 }
10203 break;
10205 if (ie_len != 1) {
10206 ast_log(LOG_WARNING, "Invalid private redirecting-to numbering plan (%u)\n",
10207 (unsigned) ie_len);
10208 break;
10209 }
10210 redirecting->priv_to.number.plan = data[pos];
10211 break;
10213 if (ie_len != 1) {
10214 ast_log(LOG_WARNING, "Invalid private redirecting-to number presentation (%u)\n",
10215 (unsigned) ie_len);
10216 break;
10217 }
10218 redirecting->priv_to.number.presentation = data[pos];
10219 break;
10221 if (ie_len != 1) {
10222 ast_log(LOG_WARNING, "Invalid private redirecting-to number valid (%u)\n",
10223 (unsigned) ie_len);
10224 break;
10225 }
10226 redirecting->priv_to.number.valid = data[pos];
10227 break;
10228/* Private redirecting-to party id subaddress */
10230 ast_free(redirecting->priv_to.subaddress.str);
10231 redirecting->priv_to.subaddress.str = ast_malloc(ie_len + 1);
10232 if (redirecting->priv_to.subaddress.str) {
10233 memcpy(redirecting->priv_to.subaddress.str, data + pos, ie_len);
10234 redirecting->priv_to.subaddress.str[ie_len] = 0;
10235 }
10236 break;
10238 if (ie_len != 1) {
10239 ast_log(LOG_WARNING, "Invalid private redirecting-to type of subaddress (%u)\n",
10240 (unsigned) ie_len);
10241 break;
10242 }
10243 redirecting->priv_to.subaddress.type = data[pos];
10244 break;
10246 if (ie_len != 1) {
10248 "Invalid private redirecting-to subaddress odd-even indicator (%u)\n",
10249 (unsigned) ie_len);
10250 break;
10251 }
10252 redirecting->priv_to.subaddress.odd_even_indicator = data[pos];
10253 break;
10255 if (ie_len != 1) {
10256 ast_log(LOG_WARNING, "Invalid private redirecting-to subaddress valid (%u)\n",
10257 (unsigned) ie_len);
10258 break;
10259 }
10260 redirecting->priv_to.subaddress.valid = data[pos];
10261 break;
10262/* Private redirecting-to party id tag */
10264 ast_free(redirecting->priv_to.tag);
10265 redirecting->priv_to.tag = ast_malloc(ie_len + 1);
10266 if (redirecting->priv_to.tag) {
10267 memcpy(redirecting->priv_to.tag, data + pos, ie_len);
10268 redirecting->priv_to.tag[ie_len] = 0;
10269 }
10270 break;
10271/* Redirecting reason code */
10273 if (ie_len != sizeof(value)) {
10274 ast_log(LOG_WARNING, "Invalid redirecting reason (%u)\n",
10275 (unsigned) ie_len);
10276 break;
10277 }
10278 memcpy(&value, data + pos, sizeof(value));
10279 redirecting->reason.code = ntohl(value);
10280 break;
10281/* Redirecting reason string */
10283 ast_free(redirecting->reason.str);
10284 redirecting->reason.str = ast_malloc(ie_len + 1);
10285 if (redirecting->reason.str) {
10286 memcpy(redirecting->reason.str, data + pos, ie_len);
10287 redirecting->reason.str[ie_len] = 0;
10288 }
10289 break;
10290/* Redirecting orig-reason code */
10292 if (ie_len != sizeof(value)) {
10293 ast_log(LOG_WARNING, "Invalid redirecting original reason (%u)\n",
10294 (unsigned) ie_len);
10295 break;
10296 }
10297 memcpy(&value, data + pos, sizeof(value));
10298 redirecting->orig_reason.code = ntohl(value);
10299 break;
10300/* Redirecting orig-reason string */
10302 ast_free(redirecting->orig_reason.str);
10303 redirecting->orig_reason.str = ast_malloc(ie_len + 1);
10304 if (redirecting->orig_reason.str) {
10305 memcpy(redirecting->orig_reason.str, data + pos, ie_len);
10306 redirecting->orig_reason.str[ie_len] = 0;
10307 }
10308 break;
10309/* Redirecting count */
10311 if (ie_len != sizeof(value)) {
10312 ast_log(LOG_WARNING, "Invalid redirecting count (%u)\n",
10313 (unsigned) ie_len);
10314 break;
10315 }
10316 memcpy(&value, data + pos, sizeof(value));
10317 redirecting->count = ntohl(value);
10318 break;
10319/* Redirecting unknown element */
10320 default:
10321 ast_debug(1, "Unknown redirecting element: %u (%u)\n",
10322 (unsigned) ie_id, (unsigned) ie_len);
10323 break;
10324 }
10325 }
10326
10327 switch (frame_version) {
10328 case 1:
10329 /*
10330 * The other end is an earlier version that we need to adjust
10331 * for compatibility.
10332 *
10333 * The earlier version did not have the orig party id or
10334 * orig_reason value.
10335 */
10336 redirecting->from.name.valid = 1;
10338 redirecting->from.number.valid = 1;
10339 if (got_from_combined_presentation) {
10340 redirecting->from.name.presentation = from_combined_presentation;
10341 redirecting->from.number.presentation = from_combined_presentation;
10342 }
10343
10344 redirecting->to.name.valid = 1;
10346 redirecting->to.number.valid = 1;
10347 if (got_to_combined_presentation) {
10348 redirecting->to.name.presentation = to_combined_presentation;
10349 redirecting->to.number.presentation = to_combined_presentation;
10350 }
10351 break;
10352 case 2:
10353 /* The other end is at the same level as we are. */
10354 break;
10355 default:
10356 /*
10357 * The other end is newer than we are.
10358 * We need to assume that they are compatible with us.
10359 */
10360 ast_debug(1, "Redirecting frame has newer version: %u\n",
10361 (unsigned) frame_version);
10362 break;
10363 }
10364
10365 return 0;
10366}

References ast_debug, ast_free, ast_log, ast_malloc, AST_PARTY_CHAR_SET_ISO8859_1, AST_REDIRECTING_COUNT, AST_REDIRECTING_FROM_ID_PRESENTATION, AST_REDIRECTING_FROM_NAME, AST_REDIRECTING_FROM_NAME_CHAR_SET, AST_REDIRECTING_FROM_NAME_PRESENTATION, AST_REDIRECTING_FROM_NAME_VALID, AST_REDIRECTING_FROM_NUMBER, AST_REDIRECTING_FROM_NUMBER_PLAN, AST_REDIRECTING_FROM_NUMBER_PRESENTATION, AST_REDIRECTING_FROM_NUMBER_VALID, AST_REDIRECTING_FROM_SUBADDRESS, AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_FROM_SUBADDRESS_TYPE, AST_REDIRECTING_FROM_SUBADDRESS_VALID, AST_REDIRECTING_FROM_TAG, AST_REDIRECTING_ORIG_NAME, AST_REDIRECTING_ORIG_NAME_CHAR_SET, AST_REDIRECTING_ORIG_NAME_PRESENTATION, AST_REDIRECTING_ORIG_NAME_VALID, AST_REDIRECTING_ORIG_NUMBER, AST_REDIRECTING_ORIG_NUMBER_PLAN, AST_REDIRECTING_ORIG_NUMBER_PRESENTATION, AST_REDIRECTING_ORIG_NUMBER_VALID, AST_REDIRECTING_ORIG_REASON_CODE, AST_REDIRECTING_ORIG_REASON_STR, AST_REDIRECTING_ORIG_SUBADDRESS, AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_ORIG_SUBADDRESS_TYPE, AST_REDIRECTING_ORIG_SUBADDRESS_VALID, AST_REDIRECTING_ORIG_TAG, AST_REDIRECTING_PRIV_FROM_NAME, AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET, AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION, AST_REDIRECTING_PRIV_FROM_NAME_VALID, AST_REDIRECTING_PRIV_FROM_NUMBER, AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN, AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION, AST_REDIRECTING_PRIV_FROM_NUMBER_VALID, AST_REDIRECTING_PRIV_FROM_SUBADDRESS, AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE, AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID, AST_REDIRECTING_PRIV_FROM_TAG, AST_REDIRECTING_PRIV_ORIG_NAME, AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET, AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION, AST_REDIRECTING_PRIV_ORIG_NAME_VALID, AST_REDIRECTING_PRIV_ORIG_NUMBER, AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN, AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION, AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE, AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID, AST_REDIRECTING_PRIV_ORIG_TAG, AST_REDIRECTING_PRIV_TO_NAME, AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET, AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION, AST_REDIRECTING_PRIV_TO_NAME_VALID, AST_REDIRECTING_PRIV_TO_NUMBER, AST_REDIRECTING_PRIV_TO_NUMBER_PLAN, AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION, AST_REDIRECTING_PRIV_TO_NUMBER_VALID, AST_REDIRECTING_PRIV_TO_SUBADDRESS, AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE, AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID, AST_REDIRECTING_PRIV_TO_TAG, AST_REDIRECTING_REASON_CODE, AST_REDIRECTING_REASON_STR, AST_REDIRECTING_TO_ID_PRESENTATION, AST_REDIRECTING_TO_NAME, AST_REDIRECTING_TO_NAME_CHAR_SET, AST_REDIRECTING_TO_NAME_PRESENTATION, AST_REDIRECTING_TO_NAME_VALID, AST_REDIRECTING_TO_NUMBER, AST_REDIRECTING_TO_NUMBER_PLAN, AST_REDIRECTING_TO_NUMBER_PRESENTATION, AST_REDIRECTING_TO_NUMBER_VALID, AST_REDIRECTING_TO_SUBADDRESS, AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN, AST_REDIRECTING_TO_SUBADDRESS_TYPE, AST_REDIRECTING_TO_SUBADDRESS_VALID, AST_REDIRECTING_TO_TAG, AST_REDIRECTING_VERSION, ast_party_name::char_set, ast_party_redirecting_reason::code, ast_party_redirecting::count, ast_party_redirecting::from, LOG_WARNING, ast_party_id::name, ast_party_id::number, ast_party_subaddress::odd_even_indicator, ast_party_redirecting::orig, ast_party_redirecting::orig_reason, ast_party_number::plan, ast_party_name::presentation, ast_party_number::presentation, ast_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_party_redirecting::reason, ast_party_name::str, ast_party_number::str, ast_party_subaddress::str, ast_party_redirecting_reason::str, ast_party_id::subaddress, ast_party_id::tag, ast_party_redirecting::to, ast_party_subaddress::type, ast_party_name::valid, ast_party_number::valid, ast_party_subaddress::valid, and value.

Referenced by ast_channel_redirecting_sub(), and indicate_redirecting().

◆ ast_ref_namedgroups()

struct ast_namedgroups * ast_ref_namedgroups ( struct ast_namedgroups *  groups)

Definition at line 7790 of file channel.c.

7791{
7792 if (groups) {
7793 ao2_ref(groups, 1);
7794 }
7795 return groups;
7796}

References ao2_ref.

Referenced by ast_channel_named_callgroups_set(), ast_channel_named_pickupgroups_set(), and mkintf().

◆ ast_request()

struct ast_channel * ast_request ( const char *  type,
struct ast_format_cap request_cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  addr,
int *  cause 
)

Requests a channel.

Parameters
typetype of channel to request
request_capFormat capabilities for requested channel
assignedidsUnique ID to create channel with
requestorchannel asking for data
addrdestination of the call
causeCause of failure

Request a channel of a given type, with addr as optional information used by the low level module

Return values
NULLfailure
non-NULLchannel on success

Definition at line 6389 of file channel.c.

6390{
6391 return request_channel(type, request_cap, NULL, assignedids, requestor, addr, cause);
6392}
static struct ast_channel * request_channel(const char *type, struct ast_format_cap *request_cap, struct ast_stream_topology *topology, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
Definition channel.c:6254

References NULL, request_channel(), and type.

Referenced by __ast_request_and_dial(), alloc_playback_chan(), ast_ari_channels_create(), ast_call_forward(), attended_transfer_bridge(), begin_dial_prerun(), blind_transfer_bridge(), build_conf(), chanavail_exec(), conf_run(), conf_start_record(), dial_transfer(), findmeexec(), meetme_menu_admin_extended(), park_local_transfer(), prepare_bridge_media_channel(), prepare_bridge_moh_channel(), retransfer_enter(), ring_entry(), and wait_for_answer().

◆ ast_request_and_dial()

struct ast_channel * ast_request_and_dial ( const char *  type,
struct ast_format_cap cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  addr,
int  timeout,
int *  reason,
const char *  cid_num,
const char *  cid_name 
)

Request a channel of a given type, with data as optional information used by the low level module and attempt to place a call on it.

Parameters
typetype of channel to request
capformat capabilities for requested channel
assignedidsUnique Id to assign to channel
requestorchannel asking for data
addrdestination of the call
timeoutmaximum amount of time to wait for an answer
reasonwhy unsuccessful (if unsuccessful)
cid_numCaller-ID Number
cid_nameCaller-ID Name (ascii)
Returns
Returns an ast_channel on success or no answer, NULL on failure. Check the value of chan->_state to know if the call was answered or not.

Definition at line 6209 of file channel.c.

6210{
6211 return __ast_request_and_dial(type, cap, assignedids, requestor, addr, timeout, outstate, cidnum, cidname, NULL);
6212}
struct ast_channel * __ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
Request a channel of a given type, with data as optional information used by the low level module and...
Definition channel.c:6011

References __ast_request_and_dial(), NULL, and type.

Referenced by generic_recall().

◆ ast_request_with_stream_topology()

struct ast_channel * ast_request_with_stream_topology ( const char *  type,
struct ast_stream_topology topology,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  addr,
int *  cause 
)

Requests a channel (specifying stream topology)

Parameters
typetype of channel to request
topologyStream topology for requested channel
assignedidsUnique ID to create channel with
requestorchannel asking for data
addrdestination of the call
causeCause of failure

Request a channel of a given type, with addr as optional information used by the low level module

Return values
NULLfailure
non-NULLchannel on success

Definition at line 6394 of file channel.c.

6395{
6396 return request_channel(type, NULL, topology, assignedids, requestor, addr, cause);
6397}

References NULL, request_channel(), and type.

Referenced by dial_exec_full(), and do_forward().

◆ ast_safe_sleep()

int ast_safe_sleep ( struct ast_channel chan,
int  ms 
)

Wait for a specified amount of time, looking for hangups.

Parameters
chanchannel to wait for
mslength of time in milliseconds to sleep. This should never be less than zero.

Waits for a specified amount of time, servicing the channel as required.

Returns
returns -1 on hangup, otherwise 0.

Wait for a specified amount of time, looking for hangups.

Definition at line 1561 of file channel.c.

1562{
1563 return safe_sleep_conditional(chan, ms, NULL, NULL, 1);
1564}
static int safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int(*cond)(void *), void *data, unsigned int generate_silence)
Wait, look for hangups and condition arg.
Definition channel.c:1485

References NULL, and safe_sleep_conditional().

Referenced by __analog_ss_thread(), adsi_transmit_message_full(), alarmreceiver_exec(), analog_ss_thread(), ast_senddigit(), ast_senddigit_mf(), conf_run(), dictate_exec(), disa_exec(), dtmf_no_bridge(), dtmf_stream(), flash_exec(), mf_stream(), milliwatt_exec(), old_milliwatt_exec(), pbx_builtin_wait(), play_moh_exec(), playtone(), privacy_exec(), send_tone_burst(), sf_stream(), testclient_exec(), testserver_exec(), try_calling(), waitforcond_exec(), waituntil_exec(), and zapateller_exec().

◆ ast_safe_sleep_conditional()

int ast_safe_sleep_conditional ( struct ast_channel chan,
int  ms,
int(*)(void *)  cond,
void *  data 
)

Wait for a specified amount of time, looking for hangups and a condition argument.

Parameters
chanchannel to wait for
mslength of time in milliseconds to sleep.
conda function pointer for testing continue condition
dataargument to be passed to the condition test function
Returns
returns -1 on hangup, otherwise 0.

Waits for a specified amount of time, servicing the channel as required. If cond returns 0, this function returns.

Definition at line 1555 of file channel.c.

1556{
1557 return safe_sleep_conditional(chan, timeout_ms, cond, data, 1);
1558}

References cond, ast_frame::data, and safe_sleep_conditional().

◆ ast_safe_sleep_without_silence()

int ast_safe_sleep_without_silence ( struct ast_channel chan,
int  ms 
)

Wait for a specified amount of time, looking for hangups, and do not generate silence.

Parameters
chanchannel to wait for
mslength of time in milliseconds to sleep. This should never be less than zero.

Waits for a specified amount of time, servicing the channel as required.

Returns
returns -1 on hangup, otherwise 0.
Note
Unlike ast_safe_sleep this will not generate silence if Asterisk is configured to do so.

Definition at line 1566 of file channel.c.

1567{
1568 return safe_sleep_conditional(chan, ms, NULL, NULL, 0);
1569}

References NULL, and safe_sleep_conditional().

Referenced by wait_for_hangup().

◆ ast_senddigit()

int ast_senddigit ( struct ast_channel chan,
char  digit,
unsigned int  duration 
)

Send a DTMF digit to a channel.

Parameters
chanchannel to act upon
digitthe DTMF digit to send, encoded in ASCII
durationthe duration of the digit ending in ms
Precondition
This must only be called by the channel's media handler thread.
Returns
0 on success, -1 on failure

Definition at line 5009 of file channel.c.

5010{
5011 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
5013 }
5014 if (ast_channel_tech(chan)->send_digit_begin) {
5016 ast_safe_sleep(chan, duration);
5017 }
5018
5019 return ast_senddigit_end(chan, digit, duration);
5020}
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition channel.c:4909
#define AST_DEFAULT_EMULATE_DTMF_DURATION
Definition channel.c:106
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait, look for hangups.
Definition channel.c:1561

References AST_DEFAULT_EMULATE_DTMF_DURATION, ast_safe_sleep(), ast_senddigit_begin(), ast_senddigit_end(), and digit.

Referenced by dial_exec_full(), and dtmf_stream().

◆ ast_senddigit_begin()

int ast_senddigit_begin ( struct ast_channel chan,
char  digit 
)

Send a DTMF digit to a channel.

Parameters
chanchannel to act upon
digitthe DTMF digit to send, encoded in ASCII
Returns
0 on success, -1 on failure

Definition at line 4909 of file channel.c.

4910{
4911 /* Device does not support DTMF tones, lets fake
4912 * it by doing our own generation. */
4913 static const char * const dtmf_tones[] = {
4914 "941+1336", /* 0 */
4915 "697+1209", /* 1 */
4916 "697+1336", /* 2 */
4917 "697+1477", /* 3 */
4918 "770+1209", /* 4 */
4919 "770+1336", /* 5 */
4920 "770+1477", /* 6 */
4921 "852+1209", /* 7 */
4922 "852+1336", /* 8 */
4923 "852+1477", /* 9 */
4924 "697+1633", /* A */
4925 "770+1633", /* B */
4926 "852+1633", /* C */
4927 "941+1633", /* D */
4928 "941+1209", /* * */
4929 "941+1477" /* # */
4930 };
4931
4932 if (!ast_channel_tech(chan)->send_digit_begin)
4933 return 0;
4934
4935 ast_channel_lock(chan);
4938 ast_channel_unlock(chan);
4939
4940 if (!ast_channel_tech(chan)->send_digit_begin(chan, digit))
4941 return 0;
4942
4943 if (digit >= '0' && digit <='9')
4944 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
4945 else if (digit >= 'A' && digit <= 'D')
4946 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
4947 else if (digit == '*')
4948 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
4949 else if (digit == '#')
4950 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
4951 else {
4952 /* not handled */
4953 ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4954 }
4955
4956 return 0;
4957}
int ast_playtones_start(struct ast_channel *chan, int vol, const char *tonelist, int interruptible)
Start playing a list of tones on a channel.

References ast_channel_lock, ast_channel_name(), ast_channel_sending_dtmf_digit_set(), ast_channel_sending_dtmf_tv_set(), ast_channel_unlock, ast_debug, ast_playtones_start(), ast_tvnow(), and digit.

Referenced by ast_senddigit(), ast_senddigit_external(), and ast_write_stream().

◆ ast_senddigit_end()

int ast_senddigit_end ( struct ast_channel chan,
char  digit,
unsigned int  duration 
)

Send a DTMF digit to a channel.

Parameters
chanchannel to act upon
digitthe DTMF digit to send, encoded in ASCII
durationthe duration of the digit ending in ms
Returns
Returns 0 on success, -1 on failure

Definition at line 4959 of file channel.c.

4960{
4961 int res = -1;
4962
4963 if (ast_channel_tech(chan)->send_digit_end)
4964 res = ast_channel_tech(chan)->send_digit_end(chan, digit, duration);
4965
4966 ast_channel_lock(chan);
4969 }
4970 ast_channel_unlock(chan);
4971
4972 if (res && ast_channel_generator(chan))
4973 ast_playtones_stop(chan);
4974
4975 return 0;
4976}
void ast_playtones_stop(struct ast_channel *chan)
Stop playing tones on a channel.
int(*const send_digit_end)(struct ast_channel *chan, char digit, unsigned int duration)
Stop sending a literal DTMF digit.
Definition channel.h:710

References ast_channel_generator(), ast_channel_lock, ast_channel_sending_dtmf_digit(), ast_channel_sending_dtmf_digit_set(), ast_channel_unlock, ast_playtones_stop(), digit, and ast_channel_tech::send_digit_end.

Referenced by ast_channel_end_dtmf(), ast_senddigit(), ast_senddigit_external(), and ast_write_stream().

◆ ast_senddigit_external()

int ast_senddigit_external ( struct ast_channel chan,
char  digit,
unsigned int  duration 
)

Send a DTMF digit to a channel from an external thread.

Parameters
chanchannel to act upon
digitthe DTMF digit to send, encoded in ASCII
durationthe duration of the digit ending in ms
Precondition
This must only be called by threads that are not the channel's media handler thread.
Returns
0 on success, -1 on failure

Definition at line 5022 of file channel.c.

5023{
5024 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
5026 }
5027 if (ast_channel_tech(chan)->send_digit_begin) {
5029 usleep(duration * 1000);
5030 }
5031
5032 return ast_senddigit_end(chan, digit, duration);
5033}

References AST_DEFAULT_EMULATE_DTMF_DURATION, ast_senddigit_begin(), ast_senddigit_end(), and digit.

Referenced by dtmf_stream(), and manager_play_dtmf().

◆ ast_senddigit_mf()

int ast_senddigit_mf ( struct ast_channel chan,
char  digit,
unsigned int  duration,
unsigned int  durationkp,
unsigned int  durationst,
int  is_external 
)

Send an MF digit to a channel.

Parameters
chanchannel to act upon
digitthe MF digit to send, encoded in ASCII
durationthe duration of a numeric digit ending in ms
durationkpthe duration of a KP digit ending in ms
durationstthe duration of a ST, STP, ST2P, or ST3P digit ending in ms
is_external1 if called by a thread that is not the channel's media handler thread, 0 if called by the channel's media handler thread.
Returns
0 on success, -1 on failure

Definition at line 4987 of file channel.c.

4989{
4990 if (duration < DEFAULT_EMULATE_MF_DURATION) {
4991 duration = DEFAULT_EMULATE_MF_DURATION;
4992 }
4993 if (ast_channel_tech(chan)->send_digit_begin) {
4994 if (digit == '*') {
4995 duration = durationkp;
4996 } else if (digit == '#' || digit == 'A' || digit == 'B' || digit == 'C') {
4997 duration = durationst;
4998 }
5000 if (is_external) {
5001 usleep(duration * 1000);
5002 } else {
5003 ast_safe_sleep(chan, duration);
5004 }
5005 }
5006 return ast_senddigit_mf_end(chan);
5007}
int ast_senddigit_mf_begin(struct ast_channel *chan, char digit)
Send an MF digit to a channel.
Definition channel.c:4870
int ast_senddigit_mf_end(struct ast_channel *chan)
End sending an MF digit to a channel.
Definition channel.c:4978
#define DEFAULT_EMULATE_MF_DURATION
Definition channel.c:110

References ast_safe_sleep(), ast_senddigit_mf_begin(), ast_senddigit_mf_end(), DEFAULT_EMULATE_MF_DURATION, and digit.

Referenced by mf_stream().

◆ ast_senddigit_mf_begin()

int ast_senddigit_mf_begin ( struct ast_channel chan,
char  digit 
)

Send an MF digit to a channel.

Parameters
chanchannel to act upon
digitthe MF digit to send, encoded in ASCII
Returns
0 on success, -1 on failure

Definition at line 4870 of file channel.c.

4871{
4872 static const char * const mf_tones[] = {
4873 "1300+1500", /* 0 */
4874 "700+900", /* 1 */
4875 "700+1100", /* 2 */
4876 "900+1100", /* 3 */
4877 "700+1300", /* 4 */
4878 "900+1300", /* 5 */
4879 "1100+1300", /* 6 */
4880 "700+1500", /* 7 */
4881 "900+1500", /* 8 */
4882 "1100+1500", /* 9 */
4883 "1100+1700", /* * (KP) */
4884 "1500+1700", /* # (ST) */
4885 "900+1700", /* A (STP) */
4886 "1300+1700", /* B (ST2P) */
4887 "700+1700" /* C (ST3P) */
4888 };
4889
4890 if (digit >= '0' && digit <='9') {
4891 ast_playtones_start(chan, 0, mf_tones[digit-'0'], 0);
4892 } else if (digit == '*') {
4893 ast_playtones_start(chan, 0, mf_tones[10], 0);
4894 } else if (digit == '#') {
4895 ast_playtones_start(chan, 0, mf_tones[11], 0);
4896 } else if (digit == 'A') {
4897 ast_playtones_start(chan, 0, mf_tones[12], 0);
4898 } else if (digit == 'B') {
4899 ast_playtones_start(chan, 0, mf_tones[13], 0);
4900 } else if (digit == 'C') {
4901 ast_playtones_start(chan, 0, mf_tones[14], 0);
4902 } else {
4903 /* not handled */
4904 ast_log(LOG_WARNING, "Unable to generate MF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4905 }
4906 return 0;
4907}
static const float mf_tones[]
Definition dsp.c:332

References ast_channel_name(), ast_log, ast_playtones_start(), digit, LOG_WARNING, and mf_tones.

Referenced by ast_senddigit_mf().

◆ ast_senddigit_mf_end()

int ast_senddigit_mf_end ( struct ast_channel chan)

End sending an MF digit to a channel.

Parameters
chanchannel to act upon
Returns
Returns 0 on success, -1 on failure

Definition at line 4978 of file channel.c.

4979{
4980 if (ast_channel_generator(chan)) {
4981 ast_playtones_stop(chan);
4982 return 0;
4983 }
4984 return -1;
4985}

References ast_channel_generator(), and ast_playtones_stop().

Referenced by ast_senddigit_mf(), mf_stream(), and sf_stream().

◆ ast_sendtext()

int ast_sendtext ( struct ast_channel chan,
const char *  text 
)

Sends text to a channel.

Parameters
chanchannel to act upon
textstring of text to send on the channel

Write text to a display on a channel

Note
The channel does not need to be locked before calling this function.
Return values
0on success
-1on failure

Definition at line 4844 of file channel.c.

4845{
4846 struct ast_msg_data *msg;
4847 int rc;
4848 struct ast_msg_data_attribute attrs[] =
4849 {
4850 {
4852 .value = (char *)text,
4853 }
4854 };
4855
4856 if (ast_strlen_zero(text)) {
4857 return 0;
4858 }
4859
4861 if (!msg) {
4862 return -1;
4863 }
4864 rc = ast_sendtext_data(chan, msg);
4865 ast_free(msg);
4866
4867 return rc;
4868}
int ast_sendtext_data(struct ast_channel *chan, struct ast_msg_data *msg)
Sends text to a channel in an ast_msg_data structure wrapper with ast_sendtext as fallback.
Definition channel.c:4786
struct ast_msg_data * ast_msg_data_alloc(enum ast_msg_data_source_type source, struct ast_msg_data_attribute attributes[], size_t count)
Allocates an ast_msg_data structure.
@ AST_MSG_DATA_ATTR_BODY
Definition message.h:458
@ AST_MSG_DATA_SOURCE_TYPE_UNKNOWN
Definition message.h:447
enum ast_msg_data_attribute_type type
Definition message.h:463

References ARRAY_LEN, ast_free, ast_msg_data_alloc(), AST_MSG_DATA_ATTR_BODY, AST_MSG_DATA_SOURCE_TYPE_UNKNOWN, ast_sendtext_data(), ast_strlen_zero(), text, and ast_msg_data_attribute::type.

Referenced by __ast_read(), handle_sendtext(), sendtext_exec(), and sendtext_safe().

◆ ast_sendtext_data()

int ast_sendtext_data ( struct ast_channel chan,
struct ast_msg_data msg 
)

Sends text to a channel in an ast_msg_data structure wrapper with ast_sendtext as fallback.

Since
13.22.0
15.5.0
Parameters
chanchannel to act upon
msgast_msg_data structure

Write text to a display on a channel. If the channel driver doesn't support the send_text_data callback. then the original send_text callback will be used if available.

Note
The channel does not need to be locked before calling this function.
Return values
0on success
-1on failure

Definition at line 4786 of file channel.c.

4787{
4788 int res = 0;
4789 const char *body = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_BODY);
4790 const char *content_type = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_CONTENT_TYPE);
4791
4792 ast_channel_lock(chan);
4793 /* Stop if we're a zombie or need a soft hangup */
4795 ast_channel_unlock(chan);
4796 return -1;
4797 }
4798
4799 CHECK_BLOCKING(chan);
4800 if (ast_channel_tech(chan)->write_text
4801 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))
4803 struct ast_frame f;
4804 /* T.140 payload does not include the null byte terminator */
4805 size_t body_len = strlen(body);
4806
4807 /* Process as T.140 text (moved here from ast_sendtext() */
4808 memset(&f, 0, sizeof(f));
4809 f.src = "DIALPLAN";
4810 f.subclass.format = ast_format_t140;
4811 f.frametype = AST_FRAME_TEXT;
4812 f.datalen = body_len;
4813 f.mallocd = AST_MALLOCD_DATA;
4814 f.data.ptr = ast_strdup(body);
4815 if (f.data.ptr) {
4816 res = ast_channel_tech(chan)->write_text(chan, &f);
4817 } else {
4818 res = -1;
4819 }
4820 ast_frfree(&f);
4821 } else if ((ast_channel_tech(chan)->properties & AST_CHAN_TP_SEND_TEXT_DATA)
4822 && ast_channel_tech(chan)->send_text_data) {
4823 /* Send enhanced message to a channel driver that supports it */
4824 ast_debug(1, "Sending TEXT_DATA from '%s' to %s:%s %s\n",
4827 ast_channel_name(chan), body);
4828 res = ast_channel_tech(chan)->send_text_data(chan, msg);
4829 } else if (ast_channel_tech(chan)->send_text
4830 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))) {
4831 /* Send the body of an enhanced message to a channel driver that supports only a char str */
4832 ast_debug(1, "Sending TEXT to %s: %s\n", ast_channel_name(chan), body);
4833 res = ast_channel_tech(chan)->send_text(chan, body);
4834 } else {
4835 ast_debug(1, "Channel technology does not support sending content type '%s' on channel '%s'\n",
4836 S_OR(content_type, "text/plain"), ast_channel_name(chan));
4837 res = -1;
4838 }
4840 ast_channel_unlock(chan);
4841 return res;
4842}
static void send_text(unsigned char pos, unsigned char inverse, struct unistimsession *pte, const char *text)
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
Definition channel.h:2931
@ AST_MEDIA_TYPE_TEXT
Definition codec.h:35
struct ast_format * ast_format_t140
Built-in cached t140 format.
int ast_format_cap_has_type(const struct ast_format_cap *cap, enum ast_media_type type)
Find out if the capabilities structure has any formats of a specific type.
Definition format_cap.c:613
const char * ast_msg_data_get_attribute(struct ast_msg_data *msg, enum ast_msg_data_attribute_type attribute_type)
Get attribute from ast_msg_data.
@ AST_MSG_DATA_ATTR_TO
Definition message.h:455
@ AST_MSG_DATA_ATTR_FROM
Definition message.h:456
@ AST_MSG_DATA_ATTR_CONTENT_TYPE
Definition message.h:457
#define AST_MALLOCD_DATA
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
Definition strings.h:97
int(*const send_text)(struct ast_channel *chan, const char *text)
Display or transmit text.
Definition channel.h:776
int(*const write_text)(struct ast_channel *chan, struct ast_frame *frame)
Write a text frame, in standard format.
Definition channel.h:809
int(*const send_text_data)(struct ast_channel *chan, struct ast_msg_data *data)
Display or transmit text with data.
Definition channel.h:864

References ast_begins_with(), AST_CHAN_TP_SEND_TEXT_DATA, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_nativeformats(), ast_channel_unlock, ast_check_hangup(), ast_clear_flag, ast_debug, AST_FLAG_BLOCKING, AST_FLAG_ZOMBIE, ast_format_cap_has_type(), ast_format_t140, AST_FRAME_TEXT, ast_frfree, AST_MALLOCD_DATA, AST_MEDIA_TYPE_TEXT, AST_MSG_DATA_ATTR_BODY, AST_MSG_DATA_ATTR_CONTENT_TYPE, AST_MSG_DATA_ATTR_FROM, AST_MSG_DATA_ATTR_TO, ast_msg_data_get_attribute(), ast_strdup, ast_strlen_zero(), ast_test_flag, CHECK_BLOCKING, ast_frame::data, ast_frame::datalen, ast_frame_subclass::format, ast_frame::frametype, ast_frame::mallocd, ast_frame::ptr, S_OR, send_text(), ast_channel_tech::send_text, ast_channel_tech::send_text_data, ast_frame::src, ast_frame::subclass, and ast_channel_tech::write_text.

Referenced by __ast_read(), ast_sendtext(), bridge_channel_handle_write(), and sendtext_exec().

◆ ast_set_callerid()

void ast_set_callerid ( struct ast_channel chan,
const char *  cid_num,
const char *  cid_name,
const char *  cid_ani 
)

Set caller ID number, name and ANI and generate AMI event.

Note
Use ast_channel_set_caller() and ast_channel_set_caller_event() instead.
The channel does not need to be locked before calling this function.

Definition at line 7386 of file channel.c.

7387{
7388 ast_channel_lock(chan);
7389
7390 if (cid_num) {
7391 ast_channel_caller(chan)->id.number.valid = 1;
7392 ast_free(ast_channel_caller(chan)->id.number.str);
7393 ast_channel_caller(chan)->id.number.str = ast_strdup(cid_num);
7394 }
7395 if (cid_name) {
7396 ast_channel_caller(chan)->id.name.valid = 1;
7397 ast_free(ast_channel_caller(chan)->id.name.str);
7398 ast_channel_caller(chan)->id.name.str = ast_strdup(cid_name);
7399 }
7400 if (cid_ani) {
7402 ast_free(ast_channel_caller(chan)->ani.number.str);
7403 ast_channel_caller(chan)->ani.number.str = ast_strdup(cid_ani);
7404 }
7405
7407
7408 ast_channel_unlock(chan);
7409}
Number structure.

References ast_party_caller::ani, ast_channel_caller(), ast_channel_lock, ast_channel_publish_snapshot(), ast_channel_unlock, ast_free, ast_strdup, ast_party_caller::id, name, ast_party_id::name, ast_party_id::number, ast_party_name::str, ast_party_number::str, ast_party_name::valid, and ast_party_number::valid.

Referenced by __analog_ss_thread(), __ast_request_and_dial(), analog_ss_thread(), ari_channels_handle_originate_with_id(), disa_exec(), handle_setcallerid(), pbx_outgoing_attempt(), privacy_exec(), ring_entry(), and socket_process_helper().

◆ ast_set_hangupsource()

void ast_set_hangupsource ( struct ast_channel chan,
const char *  source,
int  force 
)

Set the source of the hangup in this channel and it's bridge.

Parameters
chanchannel to set the field on
sourcea string describing the source of the hangup for this channel
force
Note
Absolutely NO channel locks should be held before calling this function.
Since
1.8

Hangupsource is generally the channel name that caused the bridge to be hung up, but it can also be other things such as "dialplan/agi" This can then be logged in the CDR or CEL

Definition at line 2510 of file channel.c.

2511{
2513
2514 ast_channel_lock(chan);
2515 if (force || ast_strlen_zero(ast_channel_hangupsource(chan))) {
2516 ast_channel_hangupsource_set(chan, source);
2517 }
2518 ast_channel_unlock(chan);
2519
2520 if (bridge) {
2521 ast_channel_lock(bridge);
2522 if (force || ast_strlen_zero(ast_channel_hangupsource(bridge))) {
2523 ast_channel_hangupsource_set(bridge, source);
2524 }
2525 ast_channel_unlock(bridge);
2526 }
2527}
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
Definition channel.c:10652
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition channel.h:3029

References ast_channel_bridge_peer(), ast_channel_cleanup, ast_channel_hangupsource(), ast_channel_lock, ast_channel_unlock, ast_strlen_zero(), and RAII_VAR.

Referenced by __dahdi_exception(), analog_exception(), call(), chan_pjsip_session_end(), func_channel_write_real(), handle_hangup(), pbx_builtin_hangup(), session_inv_on_media_update(), and set_hangup_source_and_cause().

◆ ast_set_party_id_all()

void ast_set_party_id_all ( struct ast_set_party_id update_id)

Set the update marker to update all information of a corresponding party id.

Since
11.0
Parameters
update_idThe update marker for a corresponding party id.

Definition at line 1737 of file channel.c.

1738{
1739 update_id->name = 1;
1740 update_id->number = 1;
1741 update_id->subaddress = 1;
1742}
unsigned char subaddress
Definition channel.h:369
unsigned char number
Definition channel.h:367
unsigned char name
Definition channel.h:365

References ast_set_party_id::name, ast_set_party_id::number, and ast_set_party_id::subaddress.

Referenced by set_redirecting().

◆ ast_set_read_format()

int ast_set_read_format ( struct ast_channel chan,
struct ast_format format 
)

Sets read format on channel chan.

Parameters
chanchannel to change
formatformat to set for reading
Returns
Returns 0 on success, -1 on failure

Definition at line 5797 of file channel.c.

5798{
5800 int res;
5801
5802 ast_assert(format != NULL);
5803
5804 if (!cap) {
5805 return -1;
5806 }
5807 ast_format_cap_append(cap, format, 0);
5808
5809 res = set_format(chan, cap, 0, 0);
5810
5811 ao2_cleanup(cap);
5812 return res;
5813}
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition channel.c:5628
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition format_cap.h:38
#define ast_format_cap_append(cap, format, framing)
Add format capability to capabilities structure.
Definition format_cap.h:99
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition format_cap.h:49

References ao2_cleanup, ast_assert, ast_format_cap_alloc, ast_format_cap_append, AST_FORMAT_CAP_FLAG_DEFAULT, NULL, and set_format().

Referenced by __ast_play_and_record(), adsi_transmit_message_full(), alarmreceiver_exec(), ast_bridge_channel_restore_formats(), ast_channel_make_compatible_helper(), audiosocket_exec(), background_detect_exec(), build_conf(), channel_do_masquerade(), conf_run(), dictate_exec(), do_waiting(), eagi_exec(), fax_detect_framehook(), fax_gateway_framehook(), generic_fax_exec(), handle_recordfile(), handle_speechrecognize(), holding_bridge_join(), isAnsweringMachine(), jack_exec(), jingle_interpret_content(), jingle_read(), measurenoise(), meetme_menu_admin_extended(), old_milliwatt_exec(), ooh323_new(), ooh323_rtp_read(), ooh323_set_read_format(), ooh323_set_write_format(), record_exec(), set_caps(), set_read_to_slin(), socket_process_helper(), speech_background(), and unistim_rtp_read().

◆ ast_set_read_format_from_cap()

int ast_set_read_format_from_cap ( struct ast_channel chan,
struct ast_format_cap formats 
)

Sets read format on channel chan from capabilities Set read format for channel to whichever component of "format" is best.

Parameters
chanchannel to change
formatsnew formats to pick from for reading
Returns
Returns 0 on success, -1 on failure

Definition at line 5815 of file channel.c.

5816{
5817 return set_format(chan, cap, 0, 0);
5818}

References set_format().

◆ ast_set_read_format_path()

int ast_set_read_format_path ( struct ast_channel chan,
struct ast_format raw_format,
struct ast_format core_format 
)

Set specific read path on channel.

Since
13.4.0
Parameters
chanChannel to setup read path.
raw_formatFormat to expect from the channel driver.
core_formatWhat the core wants to read.
Precondition
chan is locked
Return values
0on success.
-1on error.

Definition at line 5523 of file channel.c.

5524{
5525 struct ast_trans_pvt *trans_old;
5526 struct ast_trans_pvt *trans_new;
5527
5530 /* Nothing to setup */
5531 return 0;
5532 }
5533
5534 ast_debug(1, "Channel %s setting read format path: %s -> %s\n",
5535 ast_channel_name(chan),
5536 ast_format_get_name(raw_format),
5537 ast_format_get_name(core_format));
5538
5539 /* Setup new translation path. */
5540 if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5541 trans_new = ast_translator_build_path(core_format, raw_format);
5542 if (!trans_new) {
5543 return -1;
5544 }
5545 } else {
5546 /* No translation needed. */
5547 trans_new = NULL;
5548 }
5549 trans_old = ast_channel_readtrans(chan);
5550 if (trans_old) {
5551 ast_translator_free_path(trans_old);
5552 }
5553 ast_channel_readtrans_set(chan, trans_new);
5554 ast_channel_set_rawreadformat(chan, raw_format);
5555 ast_channel_set_readformat(chan, core_format);
5556 return 0;
5557}
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition format.c:201
@ AST_FORMAT_CMP_EQUAL
Definition format.h:36
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition format.c:334
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition translate.c:476
struct ast_trans_pvt * ast_translator_build_path(struct ast_format *dest, struct ast_format *source)
Builds a translator path Build a path (possibly NULL) from source to dest.
Definition translate.c:486

References ast_channel_name(), ast_channel_rawreadformat(), ast_channel_readformat(), ast_channel_readtrans(), ast_channel_readtrans_set(), ast_channel_set_rawreadformat(), ast_channel_set_readformat(), ast_debug, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_format_get_name(), ast_translator_build_path(), ast_translator_free_path(), and NULL.

Referenced by __ast_read(), chan_pjsip_read_stream(), set_softmix_bridge_data(), and softmix_bridge_write_voice().

◆ ast_set_variables()

void ast_set_variables ( struct ast_channel chan,
struct ast_variable vars 
)

adds a list of channel variables to a channel

Parameters
chanthe channel
varsa linked list of variables
Precondition
chan is locked

Variable names can be for a regular channel variable or a dialplan function that has the ability to be written to.

Definition at line 8199 of file channel.c.

8200{
8201 struct ast_variable *cur;
8202
8203 for (cur = vars; cur; cur = cur->next) {
8204 pbx_builtin_setvar_helper(chan, cur->name, cur->value);
8205 }
8206}
struct ast_variable * next

References ast_variable::name, ast_variable::next, pbx_builtin_setvar_helper(), and ast_variable::value.

Referenced by __ast_request_and_dial(), ari_channels_handle_originate_with_id(), ast_ari_channels_create(), ast_call_forward(), ast_pbx_outgoing_exten_predial(), and pbx_outgoing_attempt().

◆ ast_set_write_format()

int ast_set_write_format ( struct ast_channel chan,
struct ast_format format 
)

Sets write format on channel chan.

Parameters
chanchannel to change
formatformat to set for writing
Returns
Returns 0 on success, -1 on failure

Definition at line 5838 of file channel.c.

5839{
5841 int res;
5842
5843 ast_assert(format != NULL);
5844
5845 if (!cap) {
5846 return -1;
5847 }
5848 ast_format_cap_append(cap, format, 0);
5849
5850 res = set_format(chan, cap, 1, 0);
5851
5852 ao2_cleanup(cap);
5853 return res;
5854}

References ao2_cleanup, ast_assert, ast_format_cap_alloc, ast_format_cap_append, AST_FORMAT_CAP_FLAG_DEFAULT, NULL, and set_format().

Referenced by adsi_transmit_message_full(), alarmreceiver_exec(), ast_bridge_channel_restore_formats(), ast_channel_make_compatible_helper(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_stopstream(), ast_write_stream(), audiosocket_exec(), broadcast_exec(), build_conf(), channel_do_masquerade(), chanspy_exec(), conf_run(), dahdiscan_exec(), extenspy_exec(), fax_gateway_framehook(), generic_fax_exec(), handle_participant_join(), jack_exec(), jingle_interpret_content(), jingle_read(), linear_alloc(), linear_release(), meetme_menu_admin_extended(), moh_alloc(), moh_files_release(), moh_files_write_format_change(), moh_release(), mp3_exec(), old_milliwatt_exec(), ooh323_new(), ooh323_rtp_read(), ooh323_set_write_format(), ooh323_write(), participant_reaction_announcer_join(), playtones_alloc(), playtones_release(), send_waveform_to_channel(), set_caps(), set_softmix_bridge_data(), socket_process_helper(), tonepair_alloc(), tonepair_release(), and unistim_rtp_read().

◆ ast_set_write_format_from_cap()

int ast_set_write_format_from_cap ( struct ast_channel chan,
struct ast_format_cap formats 
)

Sets write format on channel chan Set write format for channel to whichever component of "format" is best.

Parameters
chanchannel to change
formatsnew formats to pick from for writing
Returns
Returns 0 on success, -1 on failure

Definition at line 5856 of file channel.c.

5857{
5858 return set_format(chan, cap, 1, 0);
5859}

References set_format().

Referenced by openstream_internal().

◆ ast_set_write_format_interleaved_stereo()

int ast_set_write_format_interleaved_stereo ( struct ast_channel chan,
struct ast_format format 
)

Sets write format for a channel. All internal data will than be handled in an interleaved format. (needed by binaural opus)

Parameters
chanchannel to change
formatformat to set for writing
Returns
Returns 0 on success, -1 on failure

Definition at line 5820 of file channel.c.

5821{
5823 int res;
5824
5825 ast_assert(format != NULL);
5826
5827 if (!cap) {
5828 return -1;
5829 }
5830 ast_format_cap_append(cap, format, 0);
5831
5832 res = set_format(chan, cap, 1, 1);
5833
5834 ao2_cleanup(cap);
5835 return res;
5836}

References ao2_cleanup, ast_assert, ast_format_cap_alloc, ast_format_cap_append, AST_FORMAT_CAP_FLAG_DEFAULT, NULL, and set_format().

Referenced by set_softmix_bridge_data(), and softmix_bridge_unsuspend().

◆ ast_set_write_format_path()

int ast_set_write_format_path ( struct ast_channel chan,
struct ast_format core_format,
struct ast_format raw_format 
)

Set specific write path on channel.

Since
13.13.0
Parameters
chanChannel to setup write path.
core_formatWhat the core wants to write.
raw_formatRaw write format.
Precondition
chan is locked
Return values
0on success.
-1on error.

Definition at line 5559 of file channel.c.

5560{
5561 struct ast_trans_pvt *trans_old;
5562 struct ast_trans_pvt *trans_new;
5563
5566 /* Nothing to setup */
5567 return 0;
5568 }
5569
5570 ast_debug(1, "Channel %s setting write format path: %s -> %s\n",
5571 ast_channel_name(chan),
5572 ast_format_get_name(core_format),
5573 ast_format_get_name(raw_format));
5574
5575 /* Setup new translation path. */
5576 if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5577 trans_new = ast_translator_build_path(raw_format, core_format);
5578 if (!trans_new) {
5579 return -1;
5580 }
5581 } else {
5582 /* No translation needed. */
5583 trans_new = NULL;
5584 }
5585 trans_old = ast_channel_writetrans(chan);
5586 if (trans_old) {
5587 ast_translator_free_path(trans_old);
5588 }
5589 ast_channel_writetrans_set(chan, trans_new);
5590 ast_channel_set_rawwriteformat(chan, raw_format);
5591 ast_channel_set_writeformat(chan, core_format);
5592 return 0;
5593}

References ast_channel_name(), ast_channel_rawwriteformat(), ast_channel_set_rawwriteformat(), ast_channel_set_writeformat(), ast_channel_writeformat(), ast_channel_writetrans(), ast_channel_writetrans_set(), ast_debug, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_format_get_name(), ast_translator_build_path(), ast_translator_free_path(), and NULL.

Referenced by chan_pjsip_read_stream().

◆ ast_settimeout()

int ast_settimeout ( struct ast_channel c,
unsigned int  rate,
int(*)(const void *data)  func,
void *  data 
)

Enable or disable timer ticks for a channel.

Parameters
cchannel
ratenumber of timer ticks per second
funccallback function
data

If timers are supported, force a scheduled expiration on the timer fd, at which point we call the callback function / data

Note
Call this function with a rate of 0 to turn off the timer ticks
Version
1.6.1 changed samples parameter to rate, accommodates new timing methods

Definition at line 3196 of file channel.c.

3197{
3198 return ast_settimeout_full(c, rate, func, data, 0);
3199}
int ast_settimeout_full(struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data, unsigned int is_ao2_obj)
Definition channel.c:3201

References ast_settimeout_full(), c, and ast_channel::data.

Referenced by ast_activate_generator(), ast_readaudio_callback(), deactivate_generator_nolock(), and filestream_close().

◆ ast_settimeout_full()

int ast_settimeout_full ( struct ast_channel c,
unsigned int  rate,
int(*)(const void *data)  func,
void *  data,
unsigned int  is_ao2_obj 
)

Definition at line 3201 of file channel.c.

3202{
3203 int res;
3204 unsigned int real_rate = rate, max_rate;
3206
3208
3209 if (ast_channel_timingfd(c) == -1) {
3211 return -1;
3212 }
3213
3214 if (!func) {
3215 rate = 0;
3216 data = NULL;
3217 }
3218
3219 if (rate && rate > (max_rate = ast_timer_get_max_rate(timer))) {
3220 real_rate = max_rate;
3221 }
3222
3223 ast_debug(3, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
3224
3225 res = ast_timer_set_rate(timer, real_rate);
3226
3229 }
3230
3233
3234 if (data && is_ao2_obj) {
3235 ao2_ref(data, 1);
3237 } else {
3239 }
3240
3241 if (func == NULL && rate == 0 && ast_channel_fdno(c) == AST_TIMING_FD) {
3242 /* Clearing the timing func and setting the rate to 0
3243 * means that we don't want to be reading from the timingfd
3244 * any more. Setting c->fdno to -1 means we won't have any
3245 * errant reads from the timingfd, meaning we won't potentially
3246 * miss any important frames.
3247 */
3249 }
3250
3252
3253 return res;
3254}
#define AST_TIMING_FD
Definition channel.h:203
void * data
Definition timing.c:55
unsigned int ast_timer_get_max_rate(const struct ast_timer *handle)
Get maximum rate supported for a timer.
Definition timing.c:191

References ao2_ref, ast_channel_fdno(), ast_channel_fdno_set(), ast_channel_flags(), ast_channel_lock, ast_channel_timer(), ast_channel_timingdata(), ast_channel_timingdata_set(), ast_channel_timingfd(), ast_channel_timingfunc_set(), ast_channel_unlock, ast_clear_flag, ast_debug, AST_FLAG_TIMINGDATA_IS_AO2_OBJ, ast_set_flag, ast_test_flag, ast_timer_get_max_rate(), ast_timer_set_rate(), AST_TIMING_FD, c, ast_timer::data, NULL, and timer.

Referenced by ast_readaudio_callback(), and ast_settimeout().

◆ ast_softhangup()

int ast_softhangup ( struct ast_channel chan,
int  cause 
)

Softly hangup up a channel.

Parameters
chanchannel to be soft-hung-up
causean AST_SOFTHANGUP_* reason code

Call the protocol layer, but don't destroy the channel structure (use this if you are trying to safely hangup a channel managed by another thread.

Note
The channel passed to this function does not need to be locked.
Returns
Returns 0 regardless

Softly hangup up a channel.

Definition at line 2462 of file channel.c.

2463{
2464 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
2465 int res;
2466 int tech_cause = 0;
2467 struct ast_rtp_glue *glue;
2468 RAII_VAR(struct ast_rtp_instance *, rtp, NULL, ao2_cleanup);
2469 const struct ast_channel_tech *tech;
2470
2471 ast_channel_lock(chan);
2472
2473 tech = ast_channel_tech(chan);
2474 glue = ast_rtp_instance_get_glue(tech->type);
2475 if (glue) {
2476 glue->get_rtp_info(chan, &rtp);
2477 if (rtp) {
2479 }
2480 }
2481
2482 res = ast_softhangup_nolock(chan, cause);
2483 blob = ast_json_pack("{s: i, s: b}",
2484 "cause", cause,
2485 "soft", 1);
2486
2487 tech_cause = ast_channel_tech_hangupcause(chan);
2488 if (tech_cause) {
2489 ast_json_object_set(blob, "tech_cause", ast_json_integer_create(tech_cause));
2490 }
2491
2493 ast_channel_unlock(chan);
2494
2495 return res;
2496}
void ast_rtp_instance_set_stats_vars(struct ast_channel *chan, struct ast_rtp_instance *instance)
Set standard statistics from an RTP instance on a channel.
struct ast_rtp_glue * ast_rtp_instance_get_glue(const char *type)
Get the RTP glue that binds a channel to the RTP engine.
enum ast_rtp_glue_result(* get_rtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance)
Callback for retrieving the RTP instance carrying audio.
Definition rtp_engine.h:787

References ao2_cleanup, ast_channel_hangup_request_type(), ast_channel_lock, ast_channel_publish_blob(), ast_channel_tech_hangupcause(), ast_channel_unlock, ast_json_integer_create(), ast_json_object_set(), ast_json_pack(), ast_json_unref(), ast_rtp_instance_get_glue(), ast_rtp_instance_set_stats_vars(), ast_softhangup_nolock(), ast_rtp_glue::get_rtp_info, NULL, RAII_VAR, and ast_channel_tech::type.

Referenced by __analog_handle_event(), __ast_module_user_hangup_all(), __ast_pbx_run(), __unload_module(), after_bridge_move_channel(), after_bridge_move_channel_fail(), agent_logoff_request(), agents_sweep(), analog_attempt_transfer(), ast_ari_channels_hangup(), ast_bridge_transfer_attended(), ast_channel_softhangup_cb(), ast_dial_join(), attempt_transfer(), blond_nonfinal_exit(), bridge_channel_attended_transfer(), cc_generic_agent_stop_ringing(), channel_hangup_matches(), conf_free(), dahdi_handle_event(), handle_hangup(), handle_softhangup(), hangup_channel(), retransfer_exit(), rtp_check_timeout(), sla_handle_hold_event(), softhangup_exec(), stasis_app_bridge_moh_stop(), and unload_module().

◆ ast_softhangup_all()

void ast_softhangup_all ( void  )

Soft hangup all active channels.

Since
13.3.0

Definition at line 494 of file channel.c.

495{
497}
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition channel.c:1336
static int ast_channel_softhangup_cb(void *obj, void *arg, void *data, int flags)
Definition channel.c:485

References ast_channel_callback(), ast_channel_softhangup_cb(), and NULL.

Referenced by can_safely_quit().

◆ ast_softhangup_nolock()

int ast_softhangup_nolock ( struct ast_channel chan,
int  cause 
)

Softly hangup up a channel (no channel lock)

Parameters
chanchannel to be soft-hung-up
causean AST_SOFTHANGUP_* reason code

Softly hangup up a channel (no channel lock)

Definition at line 2449 of file channel.c.

2450{
2451 ast_debug(1, "Soft-Hanging (%#04x) up channel '%s'\n", (unsigned)cause, ast_channel_name(chan));
2452 /* Inform channel driver that we need to be hung up, if it cares */
2455 /* Interrupt any poll call or such */
2457 pthread_kill(ast_channel_blocker(chan), SIGURG);
2458 return 0;
2459}

References ast_channel_blocker(), ast_channel_flags(), ast_channel_name(), ast_channel_softhangup_internal_flag_add(), ast_debug, AST_FLAG_BLOCKING, ast_null_frame, ast_queue_frame(), and ast_test_flag.

Referenced by __analog_handle_event(), app_control_dial(), ast_async_goto(), ast_bridge_join(), ast_channel_softhangup_withcause_locked(), ast_pbx_h_exten_run(), ast_pbx_hangup_handler_run(), ast_softhangup(), attempt_transfer(), dahdi_softhangup_all(), do_monitor(), gosub_run(), internal_bridge_after_cb(), jingle_indicate(), and pbx_builtin_hangup().

◆ ast_state2str()

const char * ast_state2str ( enum ast_channel_state  state)

Gives the string form of a given channel state.

Parameters
statestate to get the name of
Returns
the text form of the binary state given
Note
This function is not reentrant.

Definition at line 637 of file channel.c.

638{
639 char *buf;
640
641 switch (state) {
642 case AST_STATE_DOWN:
643 return "Down";
645 return "Rsrvd";
647 return "OffHook";
649 return "Dialing";
650 case AST_STATE_RING:
651 return "Ring";
653 return "Ringing";
654 case AST_STATE_UP:
655 return "Up";
656 case AST_STATE_BUSY:
657 return "Busy";
659 return "Dialing Offhook";
661 return "Pre-ring";
662 case AST_STATE_MUTE:
663 return "Mute";
664 default:
665 if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
666 return "Unknown";
667 snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%u)", state);
668 return buf;
669 }
670}
#define STATE2STR_BUFSIZE
Definition channel.c:102
@ AST_STATE_MUTE
@ AST_STATE_DIALING_OFFHOOK
@ AST_STATE_PRERING
@ AST_STATE_OFFHOOK
@ AST_STATE_BUSY
@ AST_STATE_DIALING
@ AST_STATE_RESERVED
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.

References AST_STATE_BUSY, AST_STATE_DIALING, AST_STATE_DIALING_OFFHOOK, AST_STATE_DOWN, AST_STATE_MUTE, AST_STATE_OFFHOOK, AST_STATE_PRERING, AST_STATE_RESERVED, AST_STATE_RING, AST_STATE_RINGING, AST_STATE_UP, ast_threadstorage_get(), buf, and STATE2STR_BUFSIZE.

Referenced by ast_channel_snapshot_to_json(), ast_manager_build_channel_state_string_prefix(), ast_raw_answer_with_stream_topology(), cli_channel_print_body(), func_channel_read(), handle_chanlist(), handle_showchan(), and serialize_showchan().

◆ ast_str2cause()

int ast_str2cause ( const char *  name)

Convert the string form of a cause code to a number.

Parameters
namestring form of the cause
Returns
the cause code

Convert the string form of a cause code to a number.

Definition at line 626 of file channel.c.

627{
628 int x;
629
630 for (x = 0; x < ARRAY_LEN(causes); x++)
631 if (!strncasecmp(causes[x].name, name, strlen(causes[x].name)))
632 return causes[x].cause;
633
634 return -1;
635}

References ARRAY_LEN, causes, and name.

Referenced by dial_exec_full(), and pbx_builtin_hangup().

◆ ast_tonepair()

int ast_tonepair ( struct ast_channel chan,
int  freq1,
int  freq2,
int  duration,
int  vol 
)

Play a tone pair for a given amount of time

Definition at line 7652 of file channel.c.

7653{
7654 int res;
7655
7656 if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
7657 return res;
7658
7659 /* Give us some wiggle room */
7660 while (ast_channel_generatordata(chan) && ast_waitfor(chan, 100) >= 0) {
7661 struct ast_frame *f = ast_read(chan);
7662 if (f)
7663 ast_frfree(f);
7664 else
7665 return -1;
7666 }
7667 return 0;
7668}
int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition channel.c:7634

References ast_channel_generatordata(), ast_frfree, ast_read(), ast_tonepair_start(), ast_waitfor(), tonepair_def::duration, tonepair_def::freq1, tonepair_def::freq2, and tonepair_def::vol.

Referenced by zapateller_exec().

◆ ast_tonepair_start()

int ast_tonepair_start ( struct ast_channel chan,
int  freq1,
int  freq2,
int  duration,
int  vol 
)

Start a tone going

Definition at line 7634 of file channel.c.

7635{
7636 struct tonepair_def d = { 0, };
7637
7638 d.freq1 = freq1;
7639 d.freq2 = freq2;
7640 d.duration = duration;
7641 d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
7642 if (ast_activate_generator(chan, &tonepair, &d))
7643 return -1;
7644 return 0;
7645}
static struct ast_generator tonepair
Definition channel.c:7628

References ast_activate_generator(), d, tonepair_def::duration, tonepair_def::freq1, tonepair_def::freq2, tonepair, and tonepair_def::vol.

Referenced by ast_tonepair(), pbx_builtin_waitexten(), play_dialtone(), and sendnoise().

◆ ast_tonepair_stop()

void ast_tonepair_stop ( struct ast_channel chan)

Stop a tone from playing

Definition at line 7647 of file channel.c.

7648{
7650}
void ast_deactivate_generator(struct ast_channel *chan)
Definition channel.c:2904

References ast_deactivate_generator().

Referenced by sendnoise().

◆ ast_transfer()

int ast_transfer ( struct ast_channel chan,
char *  dest 
)

Transfer a channel (if supported).

Return values
-1on error
0if not supported
1if supported and requested
Parameters
chancurrent channel
destdestination extension for transfer

Transfer a channel (if supported).

Called by:

  • app_transfer
  • the manager interface

Definition at line 6520 of file channel.c.

6521{
6522 int protocol;
6523 return ast_transfer_protocol(chan, dest, &protocol);
6524}
int ast_transfer_protocol(struct ast_channel *chan, char *dest, int *protocol)
Transfer a call to dest, if the channel supports transfer.
Definition channel.c:6533

References ast_transfer_protocol().

Referenced by app_control_redirect().

◆ ast_transfer_protocol()

int ast_transfer_protocol ( struct ast_channel chan,
char *  dest,
int *  protocol 
)

Transfer a channel (if supported) receieve protocol result.

Return values
-1on error
0if not supported
1if supported and requested
Parameters
chanchannel to transfer
destdestination extension to transfer to
protocolprotocol is the protocol result SIP example, 0=success, 3xx-6xx is SIP error code

Transfer a channel (if supported) receieve protocol result.

Called by:

  • app_transfer
  • the manager interface

Definition at line 6533 of file channel.c.

6534{
6535 int res = -1;
6536
6537 if (protocol) {
6538 *protocol = 0;
6539 }
6540
6541 /* Stop if we're a zombie or need a soft hangup */
6542 ast_channel_lock(chan);
6544 if (ast_channel_tech(chan)->transfer) {
6545 res = ast_channel_tech(chan)->transfer(chan, dest);
6546 if (!res)
6547 res = 1;
6548 } else
6549 res = 0;
6550 }
6551 ast_channel_unlock(chan);
6552
6553 if (res <= 0) {
6554 return res;
6555 }
6556
6557 for (;;) {
6558 struct ast_frame *fr;
6559
6560 res = ast_waitfor(chan, -1);
6561
6562 if (res < 0 || !(fr = ast_read(chan))) {
6563 res = -1;
6564 break;
6565 }
6566
6569
6570 if (*message == AST_TRANSFER_SUCCESS) {
6571 res = 1;
6572 } else {
6573 res = -1;
6574 /* Message can contain a protocol specific code
6575 AST_TRANSFER_SUCCESS indicates success
6576 Else, failure. Protocol will be set to the failure reason.
6577 SIP example, 0 is success, else error code 3xx-6xx */
6578 if (protocol) {
6579 *protocol = *message;
6580 }
6581 }
6582
6583 ast_frfree(fr);
6584 break;
6585 }
6586
6587 ast_frfree(fr);
6588 }
6589
6590 return res;
6591}
static int transfer(void *data)
@ AST_TRANSFER_SUCCESS
@ AST_CONTROL_TRANSFER
int(*const transfer)(struct ast_channel *chan, const char *newdest)
Blind transfer other side (see app_transfer.c and ast_transfer()
Definition channel.h:803

References ast_channel_flags(), ast_channel_lock, ast_channel_unlock, ast_check_hangup(), AST_CONTROL_TRANSFER, AST_FLAG_ZOMBIE, AST_FRAME_CONTROL, ast_frfree, ast_read(), ast_test_flag, AST_TRANSFER_SUCCESS, ast_waitfor(), ast_frame::data, ast_frame::frametype, ast_frame_subclass::integer, ast_frame::ptr, ast_frame::subclass, transfer(), and ast_channel_tech::transfer.

Referenced by ast_transfer(), and transfer_exec().

◆ ast_transfercapability2str()

char * ast_transfercapability2str ( int  transfercapability) const

Gives the string form of a given transfer capability.

Parameters
transfercapabilitytransfer capability to get the name of
Returns
the text form of the binary transfer capability

Definition at line 673 of file channel.c.

674{
675 switch (transfercapability) {
677 return "SPEECH";
679 return "DIGITAL";
681 return "RESTRICTED_DIGITAL";
683 return "3K1AUDIO";
685 return "DIGITAL_W_TONES";
687 return "VIDEO";
688 default:
689 return "UNKNOWN";
690 }
691}
#define AST_TRANS_CAP_RESTRICTED_DIGITAL
Definition transcap.h:37
#define AST_TRANS_CAP_DIGITAL
Definition transcap.h:36
#define AST_TRANS_CAP_DIGITAL_W_TONES
Definition transcap.h:40
#define AST_TRANS_CAP_SPEECH
Definition transcap.h:35
#define AST_TRANS_CAP_3_1K_AUDIO
Definition transcap.h:38
#define AST_TRANS_CAP_VIDEO
Definition transcap.h:41

References AST_TRANS_CAP_3_1K_AUDIO, AST_TRANS_CAP_DIGITAL, AST_TRANS_CAP_DIGITAL_W_TONES, AST_TRANS_CAP_RESTRICTED_DIGITAL, AST_TRANS_CAP_SPEECH, and AST_TRANS_CAP_VIDEO.

◆ ast_undestroyed_channels()

int ast_undestroyed_channels ( void  )
Returns
the number of channels not yet destroyed

Definition at line 505 of file channel.c.

506{
508}
static int chancount
Definition channel.c:97
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition lock.h:764

References ast_atomic_fetchadd_int(), and chancount.

Referenced by wait_for_channels_to_die().

◆ ast_unref_namedgroups()

struct ast_namedgroups * ast_unref_namedgroups ( struct ast_namedgroups *  groups)

◆ ast_waitfor()

int ast_waitfor ( struct ast_channel chan,
int  ms 
)

Wait for input on a channel.

Parameters
chanchannel to wait on
mslength of time to wait on the channel

Wait for input on a channel for a given # of milliseconds (<0 for indefinite).

Return values
<0 on failure
0if nothing ever arrived
the# of ms remaining otherwise

Definition at line 3178 of file channel.c.

3179{
3180 if (ms < 0) {
3181 do {
3182 ms = 100000;
3183 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3184 } while (!ms);
3185 } else {
3186 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3187 }
3188 return ms;
3189}
struct ast_channel * ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds, int *exception, int *outfd, int *ms)
Wait for x amount of time on a file descriptor to have input.
Definition channel.c:3004

References ast_waitfor_nandfds(), c, and NULL.

Referenced by __adsi_transmit_messages(), __analog_ss_thread(), __ast_answer(), __ast_play_and_record(), __ast_request_and_dial(), adsi_careful_send(), analog_ss_thread(), ast_control_tone(), ast_recvtext(), ast_tonepair(), ast_transfer_protocol(), background_detect_exec(), channel_spy(), conf_flush(), dial_trunk(), dictate_exec(), disa_exec(), disable_t38(), do_broadcast(), do_waiting(), echo_exec(), handle_recordfile(), handle_speechrecognize(), isAnsweringMachine(), jack_exec(), launch_asyncagi(), measurenoise(), moh_channel_thread(), mp3_exec(), read_mf_digits(), read_sf_digits(), receive_dtmf_digits(), receivefax_t38_init(), record_exec(), recordthread(), safe_sleep_conditional(), scan_exec(), send_waveform_to_channel(), sendfax_t38_init(), speech_background(), stasis_app_exec(), stream_echo_perform(), wait_exec(), wait_for_hangup(), waitforring_exec(), and waitstream_core().

◆ ast_waitfor_n()

struct ast_channel * ast_waitfor_n ( struct ast_channel **  chan,
int  n,
int *  ms 
)

Waits for input on a group of channels Wait for input on an array of channels for a given # of milliseconds.

Returns
Return channel with activity, or NULL if none has activity.
Parameters
chanan array of pointers to channels
nnumber of channels that are to be waited upon
mstime "ms" is modified in-place, if applicable

Definition at line 3173 of file channel.c.

3174{
3175 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
3176}

References ast_waitfor_nandfds(), c, and NULL.

Referenced by autoservice_run(), dial_exec_full(), monitor_dial(), wait_for_answer(), wait_for_answer(), and wait_for_winner().

◆ ast_waitfor_n_fd()

int ast_waitfor_n_fd ( int *  fds,
int  n,
int *  ms,
int *  exception 
)

Waits for input on an fd.

Note
This version works on fd's only. Be careful with it.

Waits for input on an fd.

Definition at line 2996 of file channel.c.

2997{
2998 int winner = -1;
2999 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
3000 return winner;
3001}

References ast_waitfor_nandfds(), and NULL.

Referenced by dundi_lookup_internal(), dundi_precache_internal(), rfcomm_wait(), and softmix_mixing_loop().

◆ ast_waitfor_nandfds()

struct ast_channel * ast_waitfor_nandfds ( struct ast_channel **  c,
int  n,
int *  fds,
int  nfds,
int *  exception,
int *  outfd,
int *  ms 
)

Waits for activity on a group of channels.

Parameters
can array of pointers to channels
nnumber of channels that are to be waited upon
fdsan array of fds to wait upon
nfdsthe number of fds to wait upon
exceptionexception flag
outfdfd that had activity on it
msOn invocation, max wait time. Upon returning, how long the wait actually was (in/out parameter).

Big momma function here. Wait for activity on any of the n channels, or any of the nfds file descriptors. -1 can be passed as the ms timeout to wait forever, 0 to return instantly if theres no activity immediantely available.

Returns
Returns the channel with activity, or NULL on error or if an FD came first. If the FD came first, it will be returned in outfd, otherwise, outfd will be -1

Waits for activity on a group of channels.

Definition at line 3004 of file channel.c.

3006{
3007 struct timeval start = { 0 , 0 };
3008 struct pollfd *pfds = NULL;
3009 int res;
3010 long rms;
3011 int x, y, max;
3012 int sz = nfds;
3013 struct timeval now = { 0, 0 };
3014 struct timeval whentohangup = { 0, 0 }, diff;
3015 struct ast_channel *winner = NULL;
3016 struct fdmap {
3017 int chan;
3018 int fdno;
3019 } *fdmap = NULL;
3020
3021 if (outfd) {
3022 *outfd = -99999;
3023 }
3024 if (exception) {
3025 *exception = 0;
3026 }
3027
3028 for (x = 0; x < n; x++) {
3029 ast_channel_lock(c[x]);
3031 if (ast_tvzero(whentohangup))
3032 now = ast_tvnow();
3033 diff = ast_tvsub(*ast_channel_whentohangup(c[x]), now);
3034 if (diff.tv_sec < 0 || ast_tvzero(diff)) {
3035 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3036 /* Should already be hungup */
3039 return c[x];
3040 }
3041 if (ast_tvzero(whentohangup) || ast_tvcmp(diff, whentohangup) < 0)
3042 whentohangup = diff;
3043 }
3044 sz += ast_channel_fd_count(c[x]);
3046 }
3047
3048 if (!sz) {
3049 return NULL;
3050 }
3051
3052 pfds = ast_alloca(sizeof(*pfds) * sz);
3053 fdmap = ast_alloca(sizeof(*fdmap) * sz);
3054
3055 /* Wait full interval */
3056 rms = *ms;
3057 /* INT_MAX, not LONG_MAX, because it matters on 64-bit */
3058 if (!ast_tvzero(whentohangup) && whentohangup.tv_sec < INT_MAX / 1000) {
3059 rms = whentohangup.tv_sec * 1000 + whentohangup.tv_usec / 1000; /* timeout in milliseconds */
3060 if (*ms >= 0 && *ms < rms) { /* original *ms still smaller */
3061 rms = *ms;
3062 }
3063 } else if (!ast_tvzero(whentohangup) && rms < 0) {
3064 /* Tiny corner case... call would need to last >24 days */
3065 rms = INT_MAX;
3066 }
3067 /*
3068 * Build the pollfd array, putting the channels' fds first,
3069 * followed by individual fds. Order is important because
3070 * individual fd's must have priority over channel fds.
3071 */
3072 max = 0;
3073 for (x = 0; x < n; x++) {
3074 ast_channel_lock(c[x]);
3075 for (y = 0; y < ast_channel_fd_count(c[x]); y++) {
3076 fdmap[max].fdno = y; /* fd y is linked to this pfds */
3077 fdmap[max].chan = x; /* channel x is linked to this pfds */
3078 max += ast_add_fd(&pfds[max], ast_channel_fd(c[x], y));
3079 }
3080 CHECK_BLOCKING(c[x]);
3082 }
3083 /* Add the individual fds */
3084 for (x = 0; x < nfds; x++) {
3085 fdmap[max].chan = -1;
3086 max += ast_add_fd(&pfds[max], fds[x]);
3087 }
3088
3089 if (*ms > 0) {
3090 start = ast_tvnow();
3091 }
3092
3093 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
3094 do {
3095 int kbrms = rms;
3096 if (kbrms > 600000) {
3097 kbrms = 600000;
3098 }
3099 res = ast_poll(pfds, max, kbrms);
3100 if (!res) {
3101 rms -= kbrms;
3102 }
3103 } while (!res && (rms > 0));
3104 } else {
3105 res = ast_poll(pfds, max, rms);
3106 }
3107 for (x = 0; x < n; x++) {
3108 ast_channel_lock(c[x]);
3111 }
3112 if (res < 0) { /* Simulate a timeout if we were interrupted */
3113 if (errno != EINTR) {
3114 *ms = -1;
3115 }
3116 return NULL;
3117 }
3118 if (!ast_tvzero(whentohangup)) { /* if we have a timeout, check who expired */
3119 now = ast_tvnow();
3120 for (x = 0; x < n; x++) {
3122 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3124 if (winner == NULL) {
3125 winner = c[x];
3126 }
3127 }
3128 }
3129 }
3130 if (res == 0) { /* no fd ready, reset timeout and done */
3131 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
3132 return winner;
3133 }
3134 /*
3135 * Then check if any channel or fd has a pending event.
3136 * Remember to check channels first and fds last, as they
3137 * must have priority on setting 'winner'
3138 */
3139 for (x = 0; x < max; x++) {
3140 res = pfds[x].revents;
3141 if (res == 0) {
3142 continue;
3143 }
3144 if (fdmap[x].chan >= 0) { /* this is a channel */
3145 winner = c[fdmap[x].chan]; /* override previous winners */
3146 ast_channel_lock(winner);
3147 if (res & POLLPRI) {
3149 } else {
3151 }
3152 ast_channel_fdno_set(winner, fdmap[x].fdno);
3153 ast_channel_unlock(winner);
3154 } else { /* this is an fd */
3155 if (outfd) {
3156 *outfd = pfds[x].fd;
3157 }
3158 if (exception) {
3159 *exception = (res & POLLPRI) ? -1 : 0;
3160 }
3161 winner = NULL;
3162 }
3163 }
3164 if (*ms > 0) {
3165 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
3166 if (*ms < 0) {
3167 *ms = 0;
3168 }
3169 }
3170 return winner;
3171}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
#define max(a, b)
Definition f2c.h:198
#define ast_poll(a, b, c)
Definition poll-compat.h:88
int ast_tvcmp(struct timeval _a, struct timeval _b)
Compress two struct timeval instances returning -1, 0, 1 if the first arg is smaller,...
Definition time.h:137
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
Definition extconf.c:2295

References ast_add_fd(), ast_alloca, ast_channel_fd(), ast_channel_fd_count(), ast_channel_fdno_set(), ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_softhangup_internal_flag_add(), ast_channel_unlock, ast_channel_whentohangup(), ast_clear_flag, AST_FLAG_BLOCKING, AST_FLAG_EXCEPTION, ast_poll, ast_set_flag, AST_SOFTHANGUP_TIMEOUT, ast_test_suite_event_notify, ast_tvcmp(), ast_tvdiff_ms(), ast_tvnow(), ast_tvsub(), ast_tvzero(), c, CHECK_BLOCKING, errno, max, and NULL.

Referenced by ast_waitfor(), ast_waitfor_n(), ast_waitfor_n_fd(), ast_waitfordigit_full(), audiosocket_run(), bridge_channel_wait(), conf_run(), eivr_comm(), generic_fax_exec(), run_agi(), wait_for_signal_or_hangup(), and waitstream_core().

◆ ast_waitfordigit()

int ast_waitfordigit ( struct ast_channel c,
int  ms 
)

◆ ast_waitfordigit_full()

int ast_waitfordigit_full ( struct ast_channel c,
int  ms,
const char *  breakon,
int  audiofd,
int  ctrlfd 
)

Wait for a digit Same as ast_waitfordigit() with audio fd for outputting read audio and ctrlfd to monitor for reading.

Parameters
cchannel to wait for a digit on
mshow many milliseconds to wait (<0 for indefinite).
breakonstring of DTMF digits to break upon or NULL for any.
audiofdaudio file descriptor to write to if audio frames are received
ctrlfdcontrol file descriptor to monitor for reading
Returns
Returns 1 if ctrlfd becomes available

Definition at line 3256 of file channel.c.

3257{
3258 struct timeval start = ast_tvnow();
3259 int ms;
3260
3261 /* Stop if we're a zombie or need a soft hangup */
3263 return -1;
3264
3265 /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
3267
3268 /* Wait for a digit, no more than timeout_ms milliseconds total.
3269 * Or, wait indefinitely if timeout_ms is <0.
3270 */
3271 while ((ms = ast_remaining_ms(start, timeout_ms))) {
3272 struct ast_channel *rchan;
3273 int outfd = -1;
3274
3275 errno = 0;
3276 /* While ast_waitfor_nandfds tries to help by reducing the timeout by how much was waited,
3277 * it is unhelpful if it waited less than a millisecond.
3278 */
3279 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
3280
3281 if (!rchan && outfd < 0 && ms) {
3282 if (errno == 0 || errno == EINTR)
3283 continue;
3284 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
3286 return -1;
3287 } else if (outfd > -1) {
3288 /* The FD we were watching has something waiting */
3289 ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
3291 return 1;
3292 } else if (rchan) {
3293 int res;
3294 struct ast_frame *f = ast_read(c);
3295
3296 if (!f) {
3298
3299 return -1;
3300 }
3301
3302 switch (f->frametype) {
3304 break;
3305 case AST_FRAME_DTMF_END:
3306 res = f->subclass.integer;
3307 if (!breakon || strchr(breakon, res)) {
3308 ast_frfree(f);
3310 return res;
3311 }
3312 break;
3313 case AST_FRAME_CONTROL:
3314 switch (f->subclass.integer) {
3315 case AST_CONTROL_HANGUP:
3316 ast_frfree(f);
3318 return -1;
3324 /* Fall-through and treat as if it were a DTMF signal. Items
3325 * that perform stream control will handle this. */
3326 res = f->subclass.integer;
3327 ast_frfree(f);
3329 return res;
3333 case AST_CONTROL_ANSWER:
3339 case AST_CONTROL_HOLD:
3340 case AST_CONTROL_UNHOLD:
3341 case AST_CONTROL_FLASH:
3342 case -1:
3343 /* Unimportant */
3344 break;
3345 default:
3346 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass.integer);
3347 break;
3348 }
3349 break;
3350 case AST_FRAME_VOICE:
3351 /* Write audio if appropriate */
3352 if (audiofd > -1) {
3353 if (write(audiofd, f->data.ptr, f->datalen) < 0) {
3354 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
3355 }
3356 }
3357 default:
3358 /* Ignore */
3359 break;
3360 }
3361 ast_frfree(f);
3362 }
3363 }
3364
3366
3367 return 0; /* Time is up */
3368}
@ AST_CONTROL_STREAM_RESTART
@ AST_CONTROL_STREAM_SUSPEND
@ AST_CONTROL_STREAM_REVERSE
@ AST_CONTROL_STREAM_STOP
@ AST_CONTROL_STREAM_FORWARD
@ AST_CONTROL_FLASH
@ AST_CONTROL_UPDATE_RTP_PEER

References ast_channel_clear_flag(), ast_channel_flags(), ast_channel_set_flag(), ast_check_hangup(), AST_CONTROL_ANSWER, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_PROGRESS, AST_CONTROL_PVT_CAUSE_CODE, AST_CONTROL_REDIRECTING, AST_CONTROL_RINGING, AST_CONTROL_SRCCHANGE, AST_CONTROL_SRCUPDATE, AST_CONTROL_STREAM_FORWARD, AST_CONTROL_STREAM_RESTART, AST_CONTROL_STREAM_REVERSE, AST_CONTROL_STREAM_STOP, AST_CONTROL_STREAM_SUSPEND, AST_CONTROL_UNHOLD, AST_CONTROL_UPDATE_RTP_PEER, AST_FLAG_END_DTMF_ONLY, AST_FLAG_ZOMBIE, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_VOICE, ast_frfree, ast_log, ast_read(), ast_remaining_ms(), ast_test_flag, ast_tvnow(), ast_waitfor_nandfds(), c, ast_frame::data, ast_frame::datalen, errno, ast_frame::frametype, ast_frame_subclass::integer, LOG_WARNING, NULL, ast_frame::ptr, and ast_frame::subclass.

Referenced by ast_readstring_full(), ast_waitfordigit(), handle_getoption(), handle_waitfordigit(), and pbx_builtin_waitdigit().

◆ ast_write()

int ast_write ( struct ast_channel chan,
struct ast_frame frame 
)

Write a frame to a channel This function writes the given frame to the indicated channel.

Parameters
chandestination channel of the frame
frameframe that will be written
Returns
It returns 0 on success, -1 on failure.

Definition at line 5179 of file channel.c.

5180{
5181 return ast_write_stream(chan, -1, fr);
5182}
int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame *fr)
Write a frame to a stream This function writes the given frame to the indicated stream on the channel...
Definition channel.c:5184

References ast_write_stream().

Referenced by adsi_careful_send(), ast_prod(), ast_readaudio_callback(), ast_readvideo_callback(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_write_video(), audiosocket_run(), conf_queue_dtmf(), conf_run(), dictate_exec(), echo_exec(), fax_gateway_detect_v21(), gen_generate(), generic_fax_exec(), handle_jack_audio(), jb_get_and_deliver(), linear_generator(), manager_send_flash(), milliwatt_generate(), moh_files_generator(), moh_generate(), mp3_exec(), playtones_generator(), send_waveform_to_channel(), silence_generator_generate(), sms_generate(), spandsp_fax_gw_t30_gen(), spy_generate(), spy_generate(), t38_tx_packet_handler(), tonepair_generator(), and wait_for_answer().

◆ ast_write_stream()

int ast_write_stream ( struct ast_channel chan,
int  stream_num,
struct ast_frame frame 
)

Write a frame to a stream This function writes the given frame to the indicated stream on the channel.

Parameters
chandestination channel of the frame
stream_numdestination stream on the channel
frameframe that will be written
Returns
It returns 0 on success, -1 on failure.
Note
If -1 is provided as the stream number and a media frame is provided the function will write to the default stream of the type of media.

Definition at line 5184 of file channel.c.

5185{
5186 struct ast_stream *stream = NULL, *default_stream = NULL;
5187 int res = -1;
5188 struct ast_frame *f = NULL;
5189 int count = 0;
5190 int hooked = 0;
5191
5192 /*Deadlock avoidance*/
5193 while(ast_channel_trylock(chan)) {
5194 /*cannot goto done since the channel is not locked*/
5195 if(count++ > 10) {
5196 ast_debug(1, "Deadlock avoided for write to channel '%s'\n", ast_channel_name(chan));
5197 return 0;
5198 }
5199 usleep(1);
5200 }
5201
5202 /* Stop if we're a zombie or need a soft hangup */
5204 goto done;
5205 }
5206
5207 if (stream_num >= 0) {
5208 /* If we were told to write to an explicit stream then allow this frame through, no matter
5209 * if the type is expected or not (a framehook could change)
5210 */
5212 goto done;
5213 }
5215 default_stream = ast_channel_get_default_stream(chan, ast_stream_get_type(stream));
5216 } else if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO || fr->frametype == AST_FRAME_MODEM) {
5217 /* If we haven't been told of a stream then we need to figure out which once we need */
5219
5220 /* Some frame types have a fixed media type */
5221 if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO) {
5222 type = ast_format_get_type(fr->subclass.format);
5223 } else if (fr->frametype == AST_FRAME_MODEM) {
5225 }
5226
5227 /* No stream was specified, so use the default one */
5228 stream = default_stream = ast_channel_get_default_stream(chan, type);
5229 }
5230
5231 /* Perform the framehook write event here. After the frame enters the framehook list
5232 * there is no telling what will happen, how awesome is that!!! */
5233 if ((stream == default_stream) && !(fr = ast_framehook_list_write_event(ast_channel_framehooks(chan), fr))) {
5234 res = 0;
5235 goto done;
5236 }
5237
5238 if (ast_channel_generatordata(chan) && (fr->frametype != AST_FRAME_RTCP) && (!fr->src || strcasecmp(fr->src, "ast_prod"))) {
5241 } else {
5242 if (fr->frametype == AST_FRAME_DTMF_END) {
5243 /* There is a generator running while we're in the middle of a digit.
5244 * It's probably inband DTMF, so go ahead and pass it so it can
5245 * stop the generator */
5246 ast_channel_unlock(chan);
5247 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5248 ast_channel_lock(chan);
5249 } else if (fr->frametype == AST_FRAME_CONTROL
5250 && fr->subclass.integer == AST_CONTROL_UNHOLD) {
5251 /*
5252 * This is a side case where Echo is basically being called
5253 * and the person put themselves on hold and took themselves
5254 * off hold.
5255 */
5256 indicate_data_internal(chan, fr->subclass.integer, fr->data.ptr,
5257 fr->datalen);
5258 }
5259 res = 0; /* XXX explain, why 0 ? */
5260 goto done;
5261 }
5262 }
5263 /* High bit prints debugging */
5264 if (ast_channel_fout(chan) & DEBUGCHAN_FLAG)
5265 ast_frame_dump(ast_channel_name(chan), fr, ">>");
5266 switch (fr->frametype) {
5267 case AST_FRAME_CONTROL:
5268 indicate_data_internal(chan, fr->subclass.integer, fr->data.ptr, fr->datalen);
5269 res = 0;
5270 break;
5272 if (ast_channel_audiohooks(chan)) {
5273 struct ast_frame *old_frame = fr;
5275 if (old_frame != fr)
5276 f = fr;
5277 }
5278 send_dtmf_begin_event(chan, DTMF_SENT, fr->subclass.integer);
5279 ast_channel_unlock(chan);
5280 res = ast_senddigit_begin(chan, fr->subclass.integer);
5281 ast_channel_lock(chan);
5282 break;
5283 case AST_FRAME_DTMF_END:
5284 if (ast_channel_audiohooks(chan)) {
5285 struct ast_frame *new_frame = fr;
5286
5288 if (new_frame != fr) {
5289 ast_frfree(new_frame);
5290 }
5291 }
5292 send_dtmf_end_event(chan, DTMF_SENT, fr->subclass.integer, fr->len);
5293 ast_channel_unlock(chan);
5294 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5295 ast_channel_lock(chan);
5296 break;
5297 case AST_FRAME_TEXT:
5298 CHECK_BLOCKING(chan);
5299 if (ast_format_cmp(fr->subclass.format, ast_format_t140) == AST_FORMAT_CMP_EQUAL) {
5300 res = (ast_channel_tech(chan)->write_text == NULL) ? 0 :
5301 ast_channel_tech(chan)->write_text(chan, fr);
5302 } else {
5303 res = (ast_channel_tech(chan)->send_text == NULL) ? 0 :
5304 ast_channel_tech(chan)->send_text(chan, (char *) fr->data.ptr);
5305 }
5307 break;
5308 case AST_FRAME_HTML:
5309 CHECK_BLOCKING(chan);
5310 res = (ast_channel_tech(chan)->send_html == NULL) ? 0 :
5311 ast_channel_tech(chan)->send_html(chan, fr->subclass.integer, (char *) fr->data.ptr, fr->datalen);
5313 break;
5314 case AST_FRAME_VIDEO:
5315 /* XXX Handle translation of video codecs one day XXX */
5316 CHECK_BLOCKING(chan);
5317 if (ast_channel_tech(chan)->write_stream) {
5318 if (stream) {
5319 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5320 } else {
5321 res = 0;
5322 }
5323 } else if ((stream == default_stream) && ast_channel_tech(chan)->write_video) {
5324 res = ast_channel_tech(chan)->write_video(chan, fr);
5325 } else {
5326 res = 0;
5327 }
5329 break;
5330 case AST_FRAME_MODEM:
5331 CHECK_BLOCKING(chan);
5332 res = tech_write(chan, stream, default_stream, fr);
5334 break;
5335 case AST_FRAME_VOICE:
5337 apply_plc(chan, fr);
5338 }
5339
5340 f = fr;
5341
5342 /*
5343 * Send frame to audiohooks if present, if frametype is linear (else, later as per
5344 * previous behavior)
5345 */
5346 if ((stream == default_stream) && ast_channel_audiohooks(chan)) {
5347 if (ast_format_cache_is_slinear(fr->subclass.format)) {
5348 hooked = 1;
5350 }
5351 }
5352
5353 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
5354 if ((stream == default_stream) && ast_format_cmp(fr->subclass.format, ast_channel_rawwriteformat(chan)) != AST_FORMAT_CMP_EQUAL) {
5355 if (ast_format_cmp(ast_channel_writeformat(chan), fr->subclass.format) != AST_FORMAT_CMP_EQUAL) {
5356 struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5357
5358 /*
5359 * We are not setup to write this frame. Things may have changed
5360 * on the peer side of the world and we try to adjust the format to
5361 * make it compatible again. However, bad things can happen if we
5362 * cannot setup a new translation path. Problems range from no
5363 * audio, one-way audio, to garbled audio. The best we can do is
5364 * request the call to hangup since we could not make it compatible.
5365 *
5366 * Being continuously spammed by this message likely indicates a
5367 * problem with the peer because it cannot make up its mind about
5368 * which format to use.
5369 */
5370 ast_debug(1, "Channel %s changing write format from %s to %s, native formats %s\n",
5371 ast_channel_name(chan),
5373 ast_format_get_name(fr->subclass.format),
5375 if (ast_set_write_format(chan, fr->subclass.format)) {
5376 /* Could not handle the new write format. Induce a hangup. */
5377 break;
5378 }
5379 }
5380
5381 if (ast_channel_writetrans(chan)) {
5382 struct ast_frame *trans_frame = ast_translate(ast_channel_writetrans(chan), f, 0);
5383 if (trans_frame != f && f != fr) {
5384 /*
5385 * If translate gives us a new frame and so did the audio
5386 * hook then we need to free the one from the audio hook.
5387 */
5388 ast_frfree(f);
5389 }
5390 f = trans_frame;
5391 }
5392 }
5393
5394 if (!f) {
5395 res = 0;
5396 break;
5397 }
5398
5399 if ((stream == default_stream) && ast_channel_audiohooks(chan) && !hooked) {
5400 struct ast_frame *prev = NULL, *new_frame, *cur, *dup;
5401 int freeoldlist = 0;
5402
5403 if (f != fr) {
5404 freeoldlist = 1;
5405 }
5406
5407 /* Since ast_audiohook_write may return a new frame, and the cur frame is
5408 * an item in a list of frames, create a new list adding each cur frame back to it
5409 * regardless if the cur frame changes or not. */
5410 for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
5412
5413 /* if this frame is different than cur, preserve the end of the list,
5414 * free the old frames, and set cur to be the new frame */
5415 if (new_frame != cur) {
5416
5417 /* doing an ast_frisolate here seems silly, but we are not guaranteed the new_frame
5418 * isn't part of local storage, meaning if ast_audiohook_write is called multiple
5419 * times it may override the previous frame we got from it unless we dup it */
5420 if ((dup = ast_frisolate(new_frame))) {
5422 if (freeoldlist) {
5424 ast_frfree(cur);
5425 }
5426 if (new_frame != dup) {
5427 ast_frfree(new_frame);
5428 }
5429 cur = dup;
5430 }
5431 }
5432
5433 /* now, regardless if cur is new or not, add it to the new list,
5434 * if the new list has not started, cur will become the first item. */
5435 if (prev) {
5436 AST_LIST_NEXT(prev, frame_list) = cur;
5437 } else {
5438 f = cur; /* set f to be the beginning of our new list */
5439 }
5440 prev = cur;
5441 }
5442 }
5443
5444 /* the translator on chan->writetrans may have returned multiple frames
5445 from the single frame we passed in; if so, feed each one of them to the
5446 channel, freeing each one after it has been written */
5447 CHECK_BLOCKING(chan);
5448 if ((f != fr) && AST_LIST_NEXT(f, frame_list)) {
5449 struct ast_frame *cur, *next = NULL;
5450 unsigned int skip = 0;
5451
5452 cur = f;
5453 while (cur) {
5456 if (!skip) {
5457 res = tech_write(chan, stream, default_stream, cur);
5458 if (res < 0) {
5460 skip = 1;
5461 } else if (next) {
5462 /* don't do this for the last frame in the list,
5463 as the code outside the loop will do it once
5464 */
5466 }
5467 }
5468 ast_frfree(cur);
5469 cur = next;
5470 }
5471
5472 /* reset f so the code below doesn't attempt to free it */
5473 f = NULL;
5474 } else {
5475 res = tech_write(chan, stream, default_stream, f);
5476 }
5478 break;
5479 case AST_FRAME_NULL:
5480 case AST_FRAME_IAX:
5481 /* Ignore these */
5482 res = 0;
5483 break;
5484 case AST_FRAME_RTCP:
5485 /* RTCP information is on a per-stream basis and only available on multistream capable channels */
5486 CHECK_BLOCKING(chan);
5487 if (ast_channel_tech(chan)->write_stream && stream) {
5488 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5489 } else {
5490 res = 0;
5491 }
5493 break;
5494 default:
5495 /* At this point, fr is the incoming frame and f is NULL. Channels do
5496 * not expect to get NULL as a frame pointer and will segfault. Hence,
5497 * we output the original frame passed in. */
5498 CHECK_BLOCKING(chan);
5499 res = ast_channel_tech(chan)->write(chan, fr);
5501 break;
5502 }
5503
5504 if (f && f != fr)
5505 ast_frfree(f);
5506
5507 /* Consider a write failure to force a soft hangup */
5508 if (res < 0) {
5510 } else {
5512 }
5513done:
5515 /* The list gets recreated if audiohooks are added again later */
5518 }
5519 ast_channel_unlock(chan);
5520 return res;
5521}
struct ast_frame * ast_audiohook_write_list(struct ast_channel *chan, struct ast_audiohook_list *audiohook_list, enum ast_audiohook_direction direction, struct ast_frame *frame)
Pass a frame off to be handled by the audiohook core.
Definition audiohook.c:1116
@ AST_AUDIOHOOK_DIRECTION_WRITE
Definition audiohook.h:50
void ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list)
Detach audiohooks from list and destroy said list.
Definition audiohook.c:602
static void send_dtmf_begin_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit)
Definition channel.c:3387
@ DTMF_SENT
Definition channel.c:3372
static void send_dtmf_end_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit, long duration_ms)
Definition channel.c:3402
static int tech_write(struct ast_channel *chan, struct ast_stream *stream, struct ast_stream *default_stream, struct ast_frame *frame)
Definition channel.c:5167
static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
Definition channel.c:5141
#define DEBUGCHAN_FLAG
Definition channel.h:877
#define FRAMECOUNT_INC(x)
Definition channel.h:880
@ AST_MEDIA_TYPE_UNKNOWN
Definition codec.h:31
@ AST_MEDIA_TYPE_IMAGE
Definition codec.h:34
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition format.c:354
int ast_format_cache_is_slinear(struct ast_format *format)
Determines if a format is one of the cached slin formats.
#define AST_FORMAT_CAP_NAMES_LEN
Definition format_cap.h:324
static void write_stream(struct ogg_vorbis_desc *s, FILE *f)
Write out any pending encoded data.
void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix)
Definition main/frame.c:731
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
INT32 integer
Definition lpc10.h:80
#define ast_opt_generic_plc
Definition options.h:144
int ast_stream_get_position(const struct ast_stream *stream)
Get the position of the stream in the topology.
Definition stream.c:500
struct ast_stream * ast_stream_topology_get_stream(const struct ast_stream_topology *topology, unsigned int position)
Get a specific stream from the topology.
Definition stream.c:791
int ast_stream_topology_get_count(const struct ast_stream_topology *topology)
Get the number of streams in a topology.
Definition stream.c:768
enum ast_media_type ast_stream_get_type(const struct ast_stream *stream)
Get the media type of a stream.
Definition stream.c:316
#define ast_str_alloca(init_len)
Definition strings.h:848
int(*const write)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format (see frame.h)
Definition channel.h:770
int(*const write_video)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format.
Definition channel.h:806
struct ast_frame * next
struct ast_frame * ast_translate(struct ast_trans_pvt *tr, struct ast_frame *f, int consume)
translates one or more frames Apply an input frame into the translator and receive zero or one output...
Definition translate.c:566

References apply_plc(), ast_audiohook_detach_list(), AST_AUDIOHOOK_DIRECTION_WRITE, ast_audiohook_write_list(), ast_audiohook_write_list_empty(), ast_channel_audiohooks(), ast_channel_audiohooks_set(), ast_channel_flags(), ast_channel_fout(), ast_channel_fout_set(), ast_channel_framehooks(), ast_channel_generatordata(), ast_channel_get_default_stream(), ast_channel_get_stream_topology(), ast_channel_lock, ast_channel_name(), ast_channel_nativeformats(), ast_channel_rawwriteformat(), ast_channel_softhangup_internal_flag_add(), ast_channel_trylock, ast_channel_unlock, ast_channel_writeformat(), ast_channel_writetrans(), ast_check_hangup(), ast_clear_flag, AST_CONTROL_UNHOLD, ast_deactivate_generator(), ast_debug, AST_FLAG_BLOCKING, AST_FLAG_WRITE_INT, AST_FLAG_ZOMBIE, ast_format_cache_is_slinear(), ast_format_cap_get_names(), AST_FORMAT_CAP_NAMES_LEN, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_format_get_name(), ast_format_get_type(), ast_format_slin, ast_format_t140, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, ast_frame_dump(), AST_FRAME_HTML, AST_FRAME_IAX, AST_FRAME_MODEM, AST_FRAME_NULL, AST_FRAME_RTCP, AST_FRAME_TEXT, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_framehook_list_write_event(), ast_frfree, ast_frisolate, AST_LIST_NEXT, AST_MEDIA_TYPE_IMAGE, AST_MEDIA_TYPE_UNKNOWN, ast_opt_generic_plc, ast_senddigit_begin(), ast_senddigit_end(), ast_set_write_format(), AST_SOFTHANGUP_DEV, ast_str_alloca, ast_stream_get_position(), ast_stream_get_type(), ast_stream_topology_get_count(), ast_stream_topology_get_stream(), ast_test_flag, ast_translate(), CHECK_BLOCKING, ast_frame::data, ast_frame::datalen, DEBUGCHAN_FLAG, done, DTMF_SENT, ast_frame_subclass::format, FRAMECOUNT_INC, ast_frame::frametype, indicate_data_internal(), ast_frame_subclass::integer, ast_frame::len, ast_frame::next, NULL, ast_frame::ptr, send_dtmf_begin_event(), send_dtmf_end_event(), ast_channel_tech::send_html, ast_channel_tech::send_text, ast_frame::src, ast_frame::stream_num, ast_frame::subclass, tech_write(), type, ast_channel_tech::write, write_stream(), ast_channel_tech::write_stream, ast_channel_tech::write_text, and ast_channel_tech::write_video.

Referenced by AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_write(), bridge_channel_handle_write(), and stream_echo_write().

◆ ast_write_text()

int ast_write_text ( struct ast_channel chan,
struct ast_frame frame 
)

Write text frame to a channel This function writes the given frame to the indicated channel.

Parameters
chandestination channel of the frame
frameframe that will be written
Returns
It returns 1 on success, 0 if not implemented, and -1 on failure.

◆ ast_write_video()

int ast_write_video ( struct ast_channel chan,
struct ast_frame frame 
)

Write video frame to a channel This function writes the given frame to the indicated channel.

Parameters
chandestination channel of the frame
frameframe that will be written
Returns
It returns 1 on success, 0 if not implemented, and -1 on failure.

Definition at line 5052 of file channel.c.

5053{
5054 int res;
5055 if (!ast_channel_tech(chan)->write_video)
5056 return 0;
5057 res = ast_write(chan, fr);
5058 if (!res)
5059 res = 1;
5060 return res;
5061}

References ast_write().

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [1/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( accountcode  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [2/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( call_forward  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [3/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( dialcontext  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [4/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( hangupsource  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [5/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( language  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [6/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( latest_musicclass  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [7/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( linkedid  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [8/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( musicclass  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [9/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( name  )

The following string fields result in channel snapshot creation and should have the channel locked when called:

  • language
  • accountcode
  • peeraccount
  • linkedid

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [10/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( parkinglot  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [11/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( peeraccount  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [12/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( uniqueid  )

◆ DECLARE_STRINGFIELD_SETTERS_FOR() [13/13]

DECLARE_STRINGFIELD_SETTERS_FOR ( userfield  )

◆ internal_channel_set_current_storage_driver()

int internal_channel_set_current_storage_driver ( const char *  driver_name)

Definition at line 8063 of file channel.c.

8064{
8065 if (ast_fully_booted) {
8066 ast_log(LOG_ERROR, "Cannot change channel storage driver after Asterisk has started\n");
8067 return -1;
8068 }
8071 return 0;
8072 }
8074 "Invalid channel storage backend '%s' specified. Attempting to use default '%s'.\n",
8075 driver_name, AST_CHANNELSTORAGE_DEFAULT_TYPE);
8078 return 0;
8079 }
8080 ast_log(LOG_ERROR, "Unable to find default channel storage backend '%s'.\n",
8082 return -1;
8083}
const struct ast_channelstorage_driver * ast_channelstorage_get_driver(const char *driver_name)
#define AST_CHANNELSTORAGE_DEFAULT_TYPE
#define ast_fully_booted
Definition options.h:127

References AST_CHANNELSTORAGE_DEFAULT_TYPE, ast_channelstorage_get_driver(), ast_fully_booted, ast_log, current_channel_storage_driver, LOG_ERROR, and LOG_WARNING.

Referenced by ast_channel_open_storage(), and load_asterisk_conf().

Variable Documentation

◆ ast_kill_tech

const struct ast_channel_tech ast_kill_tech
extern

Kill the channel channel driver technology descriptor.

Kill the channel channel driver technology descriptor.

The purpose of this channel technology is to encourage the channel to hangup as quickly as possible.

Note
Used by DTMF atxfer and zombie channels.

Definition at line 435 of file channel.c.

435 {
436 .type = "Kill",
437 .description = "Kill channel (should not see this)",
438 .read = kill_read,
439 .exception = kill_exception,
440 .write = kill_write,
441 .fixup = kill_fixup,
442 .hangup = kill_hangup,
443};
static int kill_write(struct ast_channel *chan, struct ast_frame *frame)
Definition channel.c:408
static struct ast_frame * kill_exception(struct ast_channel *chan)
Definition channel.c:402
static struct ast_frame * kill_read(struct ast_channel *chan)
Definition channel.c:396
static int kill_hangup(struct ast_channel *chan)
Definition channel.c:420
static int kill_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
Definition channel.c:414

◆ ast_stream_topology_changed_external

const char ast_stream_topology_changed_external[] = "external"
static

Set as the change source reason when a channel stream topology has been changed externally as a result of the remote side renegotiating.

Definition at line 223 of file channel.h.

Referenced by ast_channel_stream_topology_changed_externally().

◆ global_fin

unsigned long global_fin
extern

The current value of the debug flags is stored in the two variables global_fin and global_fout (declared in main/channel.c)

Definition at line 99 of file channel.c.

Referenced by __ast_channel_alloc_ap(), and handle_core_set_debug_channel().

◆ global_fout

unsigned long global_fout

Definition at line 886 of file channel.h.

Referenced by handle_core_set_debug_channel().