Asterisk - The Open Source Telephony Project GIT-master-67613d1
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_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. More...
 
#define AST_BRIDGE_DTMF_CHANNEL_1   (1 << 1)
 Report DTMF on channel 1. More...
 
#define AST_CHAN_WRITE_INFO_T_VERSION   1
 ast_chan_write_info_t version. Must be incremented if structure is changed More...
 
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, ...)
 Create a channel structure. More...
 
#define ast_channel_alloc_with_endpoint(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, endpoint, ...)
 
#define ast_channel_cleanup(c)   ({ ao2_cleanup(c); (struct ast_channel *) (NULL); })
 Cleanup a channel reference. More...
 
#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. More...
 
#define ast_channel_lock(chan)   ao2_lock(chan)
 
#define ast_channel_lock_both(chan1, chan2)
 Lock two channels. More...
 
#define AST_CHANNEL_NAME   80
 
#define ast_channel_ref(c)   ({ ao2_ref(c, +1); (c); })
 Increase channel reference count. More...
 
#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. More...
 
#define ast_dummy_channel_alloc()   __ast_dummy_channel_alloc(__FILE__, __LINE__, __PRETTY_FUNCTION__)
 Create a fake channel structure. More...
 
#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_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. More...
 
#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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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 More...
 
static int ast_add_fd (struct pollfd *pfd, int fd)
 if fd is a valid descriptor, set *pfd with the descriptor More...
 
int ast_answer (struct ast_channel *chan)
 Answer a channel. More...
 
int ast_auto_answer (struct ast_channel *chan)
 Answer a channel, if it's not already answered. More...
 
void ast_autoservice_chan_hangup_peer (struct ast_channel *chan, struct ast_channel *peer)
 Put chan into autoservice while hanging up peer. More...
 
int ast_autoservice_ignore (struct ast_channel *chan, enum ast_frame_type ftype)
 Ignore certain frame types. More...
 
int ast_autoservice_start (struct ast_channel *chan)
 Automatically service a channel for us... More...
 
int ast_autoservice_stop (struct ast_channel *chan)
 Stop servicing a channel for us... More...
 
int ast_call (struct ast_channel *chan, const char *addr, int timeout)
 Make a call. More...
 
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. More...
 
const char * ast_cause2str (int cause) attribute_pure
 Gives the string form of a given cause code. More...
 
void ast_change_name (struct ast_channel *chan, const char *newname)
 Change channel name. More...
 
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. More...
 
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. More...
 
const char * ast_channel_call_forward (const struct ast_channel *chan)
 
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. More...
 
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. More...
 
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. More...
 
void ast_channel_clear_softhangup (struct ast_channel *chan, int flag)
 Clear a set of softhangup flags from a channel. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
int ast_channel_datastore_inherit (struct ast_channel *from, struct ast_channel *to)
 Inherit datastores from a parent to a child. More...
 
int ast_channel_datastore_remove (struct ast_channel *chan, struct ast_datastore *datastore)
 Remove a datastore from a channel. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_channel_dialed_causes_clear (const struct ast_channel *chan)
 Clear all cause information from the channel. More...
 
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. More...
 
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) More...
 
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. More...
 
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. More...
 
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. More...
 
int ast_channel_fd_count (const struct ast_channel *chan)
 Retrieve the number of file decriptor positions present on the channel. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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(). More...
 
struct ast_bridgeast_channel_get_bridge (const struct ast_channel *chan)
 Get the bridge associated with a channel. More...
 
struct ast_bridge_channelast_channel_get_bridge_channel (struct ast_channel *chan)
 Get a reference to the channel's bridge pointer. More...
 
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. More...
 
struct ast_cc_config_paramsast_channel_get_cc_config_params (struct ast_channel *chan)
 Get the CCSS parameters from a channel. More...
 
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. More...
 
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. More...
 
int ast_channel_get_duration (struct ast_channel *chan)
 Obtain how long the channel since the channel was created. More...
 
int64_t ast_channel_get_duration_ms (struct ast_channel *chan)
 Obtain how long it's been, in milliseconds, since the channel was created. More...
 
int ast_channel_get_intercept_mode (void)
 Am I currently running an intercept dialplan routine. More...
 
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(). More...
 
struct ast_stream_topologyast_channel_get_stream_topology (const struct ast_channel *chan)
 Retrieve the topology of streams on a channel. More...
 
void * ast_channel_get_stream_topology_change_source (struct ast_channel *chan)
 Retrieve the source that initiated the last stream topology change. More...
 
static enum ast_t38_state ast_channel_get_t38_state (struct ast_channel *chan)
 Retrieves the current T38 state of a channel. More...
 
int ast_channel_get_up_time (struct ast_channel *chan)
 Obtain how long it has been since the channel was answered. More...
 
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. More...
 
struct varsheadast_channel_get_vars (struct ast_channel *chan)
 Gets the variables for a given channel, as set using pbx_builtin_setvar_helper(). More...
 
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. More...
 
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. More...
 
int ast_channel_has_audio_frame_or_monitor (struct ast_channel *chan)
 Check if the channel has active audiohooks, active framehooks, or a monitor. More...
 
int ast_channel_has_hook_requiring_audio (struct ast_channel *chan)
 Check if the channel has any active hooks that require audio. More...
 
int ast_channel_has_manager_vars (void)
 Return whether or not any manager variables have been set. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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) More...
 
void ast_channel_internal_swap_endpoint_forward (struct ast_channel *a, struct ast_channel *b)
 Swap endpoint_forward between two channels. More...
 
void ast_channel_internal_swap_snapshots (struct ast_channel *a, struct ast_channel *b)
 Swap snapshots beteween two channels. More...
 
void ast_channel_internal_swap_topics (struct ast_channel *a, struct ast_channel *b)
 Swap topics beteween two channels. More...
 
void ast_channel_internal_swap_uniqueid_and_linkedid (struct ast_channel *a, struct ast_channel *b)
 Swap uniqueid and linkedid beteween two channels. More...
 
int ast_channel_is_bridged (const struct ast_channel *chan)
 Determine if a channel is in a bridge. More...
 
int ast_channel_is_leaving_bridge (struct ast_channel *chan)
 Determine if a channel is leaving a bridge, but not hung up. More...
 
int ast_channel_is_multistream (struct ast_channel *chan)
 Determine if a channel is multi-stream capable. More...
 
int ast_channel_is_t38_active (struct ast_channel *chan)
 This function will check if T.38 is active on the channel. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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 More...
 
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. More...
 
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. More...
 
struct ast_channelast_channel_release (struct ast_channel *chan)
 Unlink and release reference to a channel. More...
 
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(). More...
 
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(). More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_channel_set_is_t38_active (struct ast_channel *chan, int is_t38_active)
 Sets the is_t38_active flag. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_channel_setwhentohangup_tv (struct ast_channel *chan, struct timeval offset)
 Set when to hang a channel up. More...
 
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. More...
 
struct ast_silence_generatorast_channel_start_silence_generator (struct ast_channel *chan)
 Starts a silence generator on the given channel. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
int ast_channel_supports_html (struct ast_channel *channel)
 Checks for HTML support on a channel. More...
 
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. More...
 
const struct ast_channel_techast_channel_tech (const struct ast_channel *chan)
 
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)
 
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. More...
 
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. More...
 
int ast_channel_unbridged_nolock (struct ast_channel *chan)
 ast_channel_unbridged variant. Use this if the channel is already locked prior to calling. More...
 
void ast_channel_undefer_dtmf (struct ast_channel *chan)
 Unset defer DTMF flag on channel. More...
 
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. More...
 
void ast_channel_unregister (const struct ast_channel_tech *tech)
 Unregister a channel technology. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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 More...
 
int ast_check_hangup (struct ast_channel *chan)
 Check to see if a channel is needing hang up. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
const struct ast_channel_techast_get_channel_tech (const char *name)
 Get a channel technology structure by name. More...
 
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. More...
 
void ast_hangup (struct ast_channel *chan)
 Hang up a channel. More...
 
int ast_indicate (struct ast_channel *chan, int condition)
 Indicates condition of channel. More...
 
int ast_indicate_data (struct ast_channel *chan, int condition, const void *data, size_t datalen)
 Indicates condition of channel, with payload. More...
 
int ast_is_deferrable_frame (const struct ast_frame *frame)
 Should we keep this frame for later? More...
 
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. More...
 
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. More...
 
void ast_party_caller_free (struct ast_party_caller *doomed)
 Destroy the caller party contents. More...
 
void ast_party_caller_init (struct ast_party_caller *init)
 Initialize the given caller structure. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_party_connected_line_free (struct ast_party_connected_line *doomed)
 Destroy the connected line information contents. More...
 
void ast_party_connected_line_init (struct ast_party_connected_line *init)
 Initialize the given connected line structure. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_party_dialed_free (struct ast_party_dialed *doomed)
 Destroy the dialed party contents. More...
 
void ast_party_dialed_init (struct ast_party_dialed *init)
 Initialize the given dialed structure. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_party_id_free (struct ast_party_id *doomed)
 Destroy the party id contents. More...
 
void ast_party_id_init (struct ast_party_id *init)
 Initialize the given party id structure. More...
 
void ast_party_id_invalidate (struct ast_party_id *id)
 Invalidate all components of the given party id. More...
 
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. More...
 
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. More...
 
int ast_party_id_presentation (const struct ast_party_id *id)
 Determine the overall presentation value for the given party. More...
 
void ast_party_id_reset (struct ast_party_id *id)
 Destroy and initialize the given party id structure. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_party_name_free (struct ast_party_name *doomed)
 Destroy the party name contents. More...
 
void ast_party_name_init (struct ast_party_name *init)
 Initialize the given name structure. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_party_number_free (struct ast_party_number *doomed)
 Destroy the party number contents. More...
 
void ast_party_number_init (struct ast_party_number *init)
 Initialize the given number structure. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_party_redirecting_free (struct ast_party_redirecting *doomed)
 Destroy the redirecting information contents. More...
 
void ast_party_redirecting_init (struct ast_party_redirecting *init)
 Initialize the given redirecting structure. More...
 
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. More...
 
void ast_party_redirecting_reason_free (struct ast_party_redirecting_reason *doomed)
 Destroy the redirecting reason contents. More...
 
void ast_party_redirecting_reason_init (struct ast_party_redirecting_reason *init)
 Initialize the given redirecting reason structure. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_party_subaddress_free (struct ast_party_subaddress *doomed)
 Destroy the party subaddress contents. More...
 
void ast_party_subaddress_init (struct ast_party_subaddress *init)
 Initialize the given subaddress structure. More...
 
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. More...
 
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. More...
 
int ast_pre_call (struct ast_channel *chan, const char *sub_args)
 Execute a Gosub call on the channel before a call is placed. More...
 
char * ast_print_group (char *buf, int buflen, ast_group_t group)
 Print call and pickup groups into buffer. More...
 
char * ast_print_namedgroups (struct ast_str **buf, struct ast_namedgroups *groups)
 Print named call groups and named pickup groups. More...
 
int ast_prod (struct ast_channel *chan)
 Send empty audio to prime a channel driver. More...
 
int ast_queue_answer (struct ast_channel *chan, const struct ast_stream_topology *topology)
 Queue an ANSWER control frame with topology. More...
 
int ast_queue_control (struct ast_channel *chan, enum ast_control_frame_type control)
 Queue a control frame without payload. More...
 
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. More...
 
int ast_queue_frame (struct ast_channel *chan, struct ast_frame *f)
 Queue one or more frames to a channel's frame queue. More...
 
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. More...
 
int ast_queue_hangup (struct ast_channel *chan)
 Queue a hangup frame. More...
 
int ast_queue_hangup_with_cause (struct ast_channel *chan, int cause)
 Queue a hangup frame with hangupcause set. More...
 
int ast_queue_hold (struct ast_channel *chan, const char *musicclass)
 Queue a hold frame. More...
 
int ast_queue_unhold (struct ast_channel *chan)
 Queue an unhold frame. More...
 
int ast_raw_answer (struct ast_channel *chan)
 Answer a channel. More...
 
int ast_raw_answer_with_stream_topology (struct ast_channel *chan, struct ast_stream_topology *topology)
 Answer a channel passing in a stream topology. More...
 
struct ast_frameast_read (struct ast_channel *chan)
 Reads a frame. More...
 
struct ast_frameast_read_noaudio (struct ast_channel *chan)
 Reads a frame, returning AST_FRAME_NULL frame if audio. More...
 
struct ast_frameast_read_stream (struct ast_channel *chan)
 Reads a frame, but does not filter to just the default streams. More...
 
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. More...
 
int ast_readstring (struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders)
 Reads multiple digits. More...
 
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. More...
 
char * ast_recvtext (struct ast_channel *chan, int timeout)
 Receives a text string from a channel Read a string of text from a channel. More...
 
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. More...
 
int ast_redirecting_parse_data (const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting)
 Parse redirecting indication frame data. More...
 
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. More...
 
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. More...
 
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) More...
 
int ast_safe_sleep (struct ast_channel *chan, int ms)
 Wait for a specified amount of time, looking for hangups. More...
 
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. More...
 
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. More...
 
int ast_senddigit (struct ast_channel *chan, char digit, unsigned int duration)
 Send a DTMF digit to a channel. More...
 
int ast_senddigit_begin (struct ast_channel *chan, char digit)
 Send a DTMF digit to a channel. More...
 
int ast_senddigit_end (struct ast_channel *chan, char digit, unsigned int duration)
 Send a DTMF digit to a channel. More...
 
int ast_senddigit_external (struct ast_channel *chan, char digit, unsigned int duration)
 Send a DTMF digit to a channel from an external thread. More...
 
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. More...
 
int ast_senddigit_mf_begin (struct ast_channel *chan, char digit)
 Send an MF digit to a channel. More...
 
int ast_senddigit_mf_end (struct ast_channel *chan)
 End sending an MF digit to a channel. More...
 
int ast_sendtext (struct ast_channel *chan, const char *text)
 Sends text to a channel. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
int ast_set_read_format (struct ast_channel *chan, struct ast_format *format)
 Sets read format on channel chan. More...
 
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. More...
 
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. More...
 
void ast_set_variables (struct ast_channel *chan, struct ast_variable *vars)
 adds a list of channel variables to a channel More...
 
int ast_set_write_format (struct ast_channel *chan, struct ast_format *format)
 Sets write format on channel chan. More...
 
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. More...
 
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) More...
 
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. More...
 
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. More...
 
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. More...
 
void ast_softhangup_all (void)
 Soft hangup all active channels. More...
 
int ast_softhangup_nolock (struct ast_channel *chan, int cause)
 Softly hangup up a channel (no channel lock) More...
 
const char * ast_state2str (enum ast_channel_state state)
 Gives the string form of a given channel state. More...
 
int ast_str2cause (const char *name) attribute_pure
 Convert the string form of a cause code to a number. More...
 
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). More...
 
int ast_transfer_protocol (struct ast_channel *chan, char *dest, int *protocol)
 Transfer a channel (if supported) receieve protocol result. More...
 
char * ast_transfercapability2str (int transfercapability) attribute_const
 Gives the string form of a given transfer capability. More...
 
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. More...
 
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. More...
 
int ast_waitfor_n_fd (int *fds, int n, int *ms, int *exception)
 Waits for input on an fd. More...
 
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. More...
 
int ast_waitfordigit (struct ast_channel *c, int ms)
 Waits for a digit. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
 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)
 
struct ast_channel_iteratorast_channel_iterator_all_new (void)
 Create a new channel iterator. More...
 
struct ast_channel_iteratorast_channel_iterator_by_exten_new (const char *exten, const char *context)
 Create a new channel iterator based on extension. More...
 
struct ast_channel_iteratorast_channel_iterator_by_name_new (const char *name, size_t name_len)
 Create a new channel iterator based on name. More...
 
struct ast_channel_iteratorast_channel_iterator_destroy (struct ast_channel_iterator *i)
 Destroy a channel iterator. More...
 
struct ast_channelast_channel_iterator_next (struct ast_channel_iterator *i)
 Get the next channel for a channel iterator. More...
 
struct ast_channelast_channel_get_by_exten (const char *exten, const char *context)
 Find a channel by extension and context. More...
 
struct ast_channelast_channel_get_by_name (const char *name)
 Find a channel by name. More...
 
struct ast_channelast_channel_get_by_name_prefix (const char *name, size_t name_len)
 Find a channel by a name prefix. More...
 

Variables

const struct ast_channel_tech ast_kill_tech
 Kill the channel channel driver technology descriptor. More...
 
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. More...
 
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)

used by agents for pass through

Definition at line 202 of file channel.h.

◆ AST_ALERT_FD

#define AST_ALERT_FD   (AST_MAX_FDS-1)

used for alertpipe

Definition at line 200 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 2370 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 2372 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 591 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:954
#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 1258 of file channel.h.

◆ 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 1262 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 2969 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 4948 of file channel.h.

◆ ast_channel_lock

#define ast_channel_lock (   chan)    ao2_lock(chan)

Definition at line 2922 of file channel.h.

◆ ast_channel_lock_both

#define ast_channel_lock_both (   chan1,
  chan2 
)

Lock two channels.

Definition at line 2929 of file channel.h.

◆ AST_CHANNEL_NAME

#define AST_CHANNEL_NAME   80

Max length of an ast_channel name

Definition at line 171 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 2947 of file channel.h.

◆ ast_channel_trylock

#define ast_channel_trylock (   chan)    ao2_trylock(chan)

Definition at line 2924 of file channel.h.

◆ ast_channel_unlock

#define ast_channel_unlock (   chan)    ao2_unlock(chan)

Definition at line 2923 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 2958 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 1282 of file channel.h.

◆ AST_EXTENDED_FDS

#define AST_EXTENDED_FDS   12

the start of extended file descriptor positions

Definition at line 195 of file channel.h.

◆ AST_FEATURE_DTMF_MASK

#define AST_FEATURE_DTMF_MASK
Value:
@ AST_FEATURE_AUTOMIXMON
Definition: channel.h:1069
@ AST_FEATURE_REDIRECT
Definition: channel.h:1064
@ AST_FEATURE_PARKCALL
Definition: channel.h:1068
@ AST_FEATURE_AUTOMON
Definition: channel.h:1067
@ AST_FEATURE_DISCONNECT
Definition: channel.h:1065

Definition at line 1072 of file channel.h.

◆ AST_GENERATOR_FD

#define AST_GENERATOR_FD   (AST_MAX_FDS-4)

used by generator

Definition at line 203 of file channel.h.

◆ AST_JITTERBUFFER_FD

#define AST_JITTERBUFFER_FD   (AST_MAX_FDS-5)

used by generator

Definition at line 204 of file channel.h.

◆ AST_MAX_ACCOUNT_CODE

#define AST_MAX_ACCOUNT_CODE   80

Max length of an account code

Definition at line 170 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 194 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_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 168 of file channel.h.

◆ AST_MAX_USER_FIELD

#define AST_MAX_USER_FIELD   256

Max length of the channel user field

Definition at line 174 of file channel.h.

◆ AST_MUTE_DIRECTION_READ

#define AST_MUTE_DIRECTION_READ   (1 << 0)

Definition at line 4712 of file channel.h.

◆ AST_MUTE_DIRECTION_WRITE

#define AST_MUTE_DIRECTION_WRITE   (1 << 1)

Definition at line 4713 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 155 of file channel.h.

◆ AST_TIMING_FD

#define AST_TIMING_FD   (AST_MAX_FDS-2)

used for timingfd

Definition at line 201 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 2871 of file channel.h.

◆ DATASTORE_INHERIT_FOREVER

#define DATASTORE_INHERIT_FOREVER   INT_MAX

Definition at line 192 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 857 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)))
Main Channel structure associated with a channel.

Definition at line 4038 of file channel.h.

◆ FRAMECOUNT_INC

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

Definition at line 860 of file channel.h.

◆ MAX_LANGUAGE

#define MAX_LANGUAGE   40

Max length of the language setting

Definition at line 172 of file channel.h.

◆ MAX_MUSICCLASS

#define MAX_MUSICCLASS   80

Max length of the music class setting

Definition at line 173 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 580 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 574 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 586 of file channel.h.

◆ ast_group_t

typedef unsigned long long ast_group_t

Definition at line 213 of file channel.h.

◆ ast_timing_func_t

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

Definition at line 899 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 955 of file channel.h.

955 {
956 /*!
957 * \brief Channels have this property if they can accept input with jitter;
958 * i.e. most VoIP channels
959 */
960 AST_CHAN_TP_WANTSJITTER = (1 << 0),
961 /*!
962 * \brief Channels have this property if they can create jitter;
963 * i.e. most VoIP channels
964 */
965 AST_CHAN_TP_CREATESJITTER = (1 << 1),
966 /*!
967 * \brief Channels with this particular technology are an implementation detail of
968 * Asterisk and should generally not be exposed or manipulated by the outside
969 * world
970 */
971 AST_CHAN_TP_INTERNAL = (1 << 2),
972 /*!
973 * \brief Channels have this property if they implement send_text_data
974 */
976};
@ AST_CHAN_TP_INTERNAL
Channels with this particular technology are an implementation detail of Asterisk and should generall...
Definition: channel.h:971
@ AST_CHAN_TP_SEND_TEXT_DATA
Channels have this property if they implement send_text_data.
Definition: channel.h:975
@ AST_CHAN_TP_WANTSJITTER
Channels have this property if they can accept input with jitter; i.e. most VoIP channels.
Definition: channel.h:960
@ AST_CHAN_TP_CREATESJITTER
Channels have this property if they can create jitter; i.e. most VoIP channels.
Definition: channel.h:965

◆ 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 979 of file channel.h.

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

◆ 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 1062 of file channel.h.

1062 {
1063 AST_FEATURE_PLAY_WARNING = (1 << 0),
1064 AST_FEATURE_REDIRECT = (1 << 1),
1065 AST_FEATURE_DISCONNECT = (1 << 2),
1066 AST_FEATURE_ATXFER = (1 << 3),
1067 AST_FEATURE_AUTOMON = (1 << 4),
1068 AST_FEATURE_PARKCALL = (1 << 5),
1069 AST_FEATURE_AUTOMIXMON = (1 << 6),
1070};
@ AST_FEATURE_ATXFER
Definition: channel.h:1066
@ AST_FEATURE_PLAY_WARNING
Definition: channel.h:1063

◆ 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 1116 of file channel.h.

1116 {
1117 /*!
1118 * Soft hangup requested by device or other internal reason.
1119 * Actual hangup needed.
1120 */
1121 AST_SOFTHANGUP_DEV = (1 << 0),
1122 /*!
1123 * Used to break the normal frame flow so an async goto can be
1124 * done instead of actually hanging up.
1125 */
1126 AST_SOFTHANGUP_ASYNCGOTO = (1 << 1),
1127 /*!
1128 * Soft hangup requested by system shutdown. Actual hangup
1129 * needed.
1130 */
1131 AST_SOFTHANGUP_SHUTDOWN = (1 << 2),
1132 /*!
1133 * Used to break the normal frame flow after a timeout so an
1134 * implicit async goto can be done to the 'T' exten if it exists
1135 * instead of actually hanging up. If the exten does not exist
1136 * then actually hangup.
1137 */
1138 AST_SOFTHANGUP_TIMEOUT = (1 << 3),
1139 /*!
1140 * Soft hangup requested by application/channel-driver being
1141 * unloaded. Actual hangup needed.
1142 */
1143 AST_SOFTHANGUP_APPUNLOAD = (1 << 4),
1144 /*!
1145 * Soft hangup requested by non-associated party. Actual hangup
1146 * needed.
1147 */
1148 AST_SOFTHANGUP_EXPLICIT = (1 << 5),
1149 /*!
1150 * Used to indicate that the channel is currently executing hangup
1151 * logic in the dialplan. The channel has been hungup when this is
1152 * set.
1153 */
1154 AST_SOFTHANGUP_HANGUP_EXEC = (1 << 7),
1155 /*!
1156 * \brief All softhangup flags.
1157 *
1158 * This can be used as an argument to ast_channel_clear_softhangup()
1159 * to clear all softhangup flags from a channel.
1160 */
1161 AST_SOFTHANGUP_ALL = (0xFFFFFFFF)
1162};
@ AST_SOFTHANGUP_ASYNCGOTO
Definition: channel.h:1126
@ AST_SOFTHANGUP_EXPLICIT
Definition: channel.h:1148
@ AST_SOFTHANGUP_DEV
Definition: channel.h:1121
@ AST_SOFTHANGUP_HANGUP_EXEC
Definition: channel.h:1154
@ AST_SOFTHANGUP_ALL
All softhangup flags.
Definition: channel.h:1161
@ AST_SOFTHANGUP_TIMEOUT
Definition: channel.h:1138
@ AST_SOFTHANGUP_SHUTDOWN
Definition: channel.h:1131
@ AST_SOFTHANGUP_APPUNLOAD
Definition: channel.h:1143

◆ ama_flags

enum ama_flags

Channel AMA Flags.

Enumerator
AST_AMA_NONE 
AST_AMA_OMIT 
AST_AMA_BILLING 
AST_AMA_DOCUMENTATION 

Definition at line 1177 of file channel.h.

1177 {
1178 AST_AMA_NONE = 0,
1182};
@ AST_AMA_DOCUMENTATION
Definition: channel.h:1181
@ AST_AMA_OMIT
Definition: channel.h:1179
@ AST_AMA_NONE
Definition: channel.h:1178
@ AST_AMA_BILLING
Definition: channel.h:1180

◆ ast_bridge_result

Enumerator
AST_BRIDGE_COMPLETE 
AST_BRIDGE_FAILED 
AST_BRIDGE_FAILED_NOWARN 
AST_BRIDGE_RETRY 

Definition at line 206 of file channel.h.

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

◆ ast_channel_adsicpe

Enumerator
AST_ADSI_UNKNOWN 
AST_ADSI_AVAILABLE 
AST_ADSI_UNAVAILABLE 
AST_ADSI_OFFHOOKONLY 

Definition at line 868 of file channel.h.

868 {
873};
@ AST_ADSI_UNKNOWN
Definition: channel.h:869
@ AST_ADSI_UNAVAILABLE
Definition: channel.h:871
@ AST_ADSI_AVAILABLE
Definition: channel.h:870
@ AST_ADSI_OFFHOOKONLY
Definition: channel.h:872

◆ ast_channel_error

Enumerator
AST_CHANNEL_ERROR_UNKNOWN 
AST_CHANNEL_ERROR_ID_EXISTS 

Definition at line 4793 of file channel.h.

4793 {
4794 /* Unable to determine what error occurred. */
4796 /* Channel with this ID already exists */
4798};
@ AST_CHANNEL_ERROR_ID_EXISTS
Definition: channel.h:4797
@ AST_CHANNEL_ERROR_UNKNOWN
Definition: channel.h:4795

◆ 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 1475 of file channel.h.

1475 {
1476 /*! The requestor is the future bridge peer of the channel. */
1478 /*! The requestor is to be replaced by the channel. */
1480};
@ AST_CHANNEL_REQUESTOR_BRIDGE_PEER
Definition: channel.h:1477
@ AST_CHANNEL_REQUESTOR_REPLACEMENT
Definition: channel.h:1479

◆ AST_MONITORING_STATE

Enumerator
AST_MONITOR_RUNNING 
AST_MONITOR_PAUSED 

Definition at line 4031 of file channel.h.

4031 {
4034};
@ AST_MONITOR_PAUSED
Definition: channel.h:4033
@ AST_MONITOR_RUNNING
Definition: channel.h:4032

◆ 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 242 of file channel.h.

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

◆ 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 878 of file channel.h.

878 {
879 T38_STATE_UNAVAILABLE, /*!< T38 is unavailable on this channel or disabled by configuration */
880 T38_STATE_UNKNOWN, /*!< The channel supports T38 but the current status is unknown */
881 T38_STATE_NEGOTIATING, /*!< T38 is being negotiated */
882 T38_STATE_REJECTED, /*!< Remote side has rejected our offer */
883 T38_STATE_NEGOTIATED, /*!< T38 established */
884};
@ T38_STATE_UNAVAILABLE
Definition: channel.h:879
@ T38_STATE_UNKNOWN
Definition: channel.h:880
@ T38_STATE_REJECTED
Definition: channel.h:882
@ T38_STATE_NEGOTIATED
Definition: channel.h:883
@ T38_STATE_NEGOTIATING
Definition: channel.h:881

◆ 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 1166 of file channel.h.

1166 {
1172};
@ CHANNEL_CLI_RELOAD
Definition: channel.h:1169
@ CHANNEL_MODULE_RELOAD
Definition: channel.h:1168
@ CHANNEL_MODULE_LOAD
Definition: channel.h:1167
@ CHANNEL_ACL_RELOAD
Definition: channel.h:1171
@ CHANNEL_MANAGER_RELOAD
Definition: channel.h:1170

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 2695 of file channel.c.

2696{
2697 int res = 0;
2698 enum ast_channel_state old_state;
2699 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2700
2701 old_state = ast_channel_state(chan);
2702 if ((res = ast_raw_answer(chan))) {
2703 return res;
2704 }
2705
2706 switch (old_state) {
2707 case AST_STATE_RINGING:
2708 case AST_STATE_RING:
2709 /* wait for media to start flowing, but don't wait any longer
2710 * than 'delay' or 500 milliseconds, whichever is longer
2711 */
2712 do {
2714 struct ast_frame *cur;
2715 struct ast_frame *new_frame;
2716 int timeout_ms = MAX(delay, 500);
2717 unsigned int done = 0;
2718 struct timeval start;
2719
2721
2722 start = ast_tvnow();
2723 for (;;) {
2724 int ms = ast_remaining_ms(start, timeout_ms);
2725 ms = ast_waitfor(chan, ms);
2726 if (ms < 0) {
2727 ast_log(LOG_WARNING, "Error condition occurred when polling channel %s for a voice frame: %s\n", ast_channel_name(chan), strerror(errno));
2728 res = -1;
2729 break;
2730 }
2731 if (ms == 0) {
2732 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));
2733 break;
2734 }
2735 cur = ast_read(chan);
2736 if (!cur || ((cur->frametype == AST_FRAME_CONTROL) &&
2737 (cur->subclass.integer == AST_CONTROL_HANGUP))) {
2738 if (cur) {
2739 ast_frfree(cur);
2740 }
2741 res = -1;
2742 ast_debug(2, "Hangup of channel %s detected in answer routine\n", ast_channel_name(chan));
2743 break;
2744 }
2745
2746 if ((new_frame = ast_frisolate(cur)) != cur) {
2747 ast_frfree(cur);
2748 }
2749
2751
2752 /* if a specific delay period was requested, continue
2753 * until that delay has passed. don't stop just because
2754 * incoming media has arrived.
2755 */
2756 if (delay) {
2757 continue;
2758 }
2759
2760 switch (new_frame->frametype) {
2761 /* all of these frametypes qualify as 'media' */
2762 case AST_FRAME_VOICE:
2763 case AST_FRAME_VIDEO:
2764 case AST_FRAME_TEXT:
2767 case AST_FRAME_DTMF_END:
2768 case AST_FRAME_IMAGE:
2769 case AST_FRAME_HTML:
2770 case AST_FRAME_MODEM:
2771 case AST_FRAME_RTCP:
2772 done = 1;
2773 break;
2774 case AST_FRAME_CONTROL:
2775 case AST_FRAME_IAX:
2778 case AST_FRAME_NULL:
2779 case AST_FRAME_CNG:
2780 break;
2781 }
2782
2783 if (done) {
2784 break;
2785 }
2786 }
2787
2788 ast_channel_lock(chan);
2789 while ((cur = AST_LIST_REMOVE_HEAD(&frames, frame_list))) {
2790 if (res == 0) {
2791 ast_queue_frame_head(chan, cur);
2792 }
2793 ast_frfree(cur);
2794 }
2795 ast_channel_unlock(chan);
2796 } while (0);
2797 break;
2798 default:
2799 break;
2800 }
2801
2802 return res;
2803}
#define ast_log
Definition: astobj2.c:42
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4256
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:1144
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3162
int ast_raw_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2690
const char * ast_channel_name(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2922
#define ast_channel_unlock(chan)
Definition: channel.h:2923
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_STATE_RING
Definition: channelstate.h:40
@ AST_STATE_RINGING
Definition: channelstate.h:41
#define SCOPE_TRACE(__level,...)
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
#define ast_frfree(fr)
@ AST_FRAME_VIDEO
@ AST_FRAME_NULL
@ AST_FRAME_HTML
@ AST_FRAME_IMAGE
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_BRIDGE_ACTION_SYNC
@ AST_FRAME_VOICE
@ AST_FRAME_RTCP
@ AST_FRAME_MODEM
@ AST_FRAME_TEXT_DATA
@ AST_FRAME_CONTROL
@ AST_FRAME_BRIDGE_ACTION
@ AST_FRAME_TEXT
@ 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.
Definition: linkedlists.h:681
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
Definition: linkedlists.h:225
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:711
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:833
int errno
static int frames
Definition: parser.c:51
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
enum ast_frame_type frametype
int done
Definition: test_amihooks.c:48
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition: utils.c:2281
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:233

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 954 of file channel.c.

961{
962 va_list ap;
963 struct ast_channel *result;
964
965 va_start(ap, name_fmt);
966 result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
967 assignedids, requestor, amaflag, endpoint, file, line, function, name_fmt, ap);
968 va_end(ap);
969
970 return result;
971}
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, const char *file, int line, const char *function, const char *name_fmt, va_list ap)
Create a new channel structure.
Definition: channel.c:733
char exten[AST_MAX_EXTENSION]

References __ast_channel_alloc_ap(), voicemailpwcheck::context, ast_channel::exten, make_ari_stubs::file, and result.

◆ __ast_dummy_channel_alloc()

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

Definition at line 975 of file channel.c.

976{
977 struct ast_channel *tmp;
978 struct varshead *headp;
979
981 file, line, function);
982 if (!tmp) {
983 /* Dummy channel structure allocation failure. */
984 return NULL;
985 }
986
989
990 /*
991 * Init file descriptors to unopened state just in case
992 * autoservice is called on the channel or something tries to
993 * read a frame from it.
994 */
998
1000
1002
1003 headp = ast_channel_varshead(tmp);
1005
1006 return tmp;
1007}
static int tmp()
Definition: bt_open.c:389
static void ast_dummy_channel_destructor(void *obj)
Free a dummy channel structure.
Definition: channel.c:2333
struct varshead * ast_channel_varshead(struct ast_channel *chan)
void ast_channel_internal_fd_clear_all(struct ast_channel *chan)
void ast_channel_hold_state_set(struct ast_channel *chan, int value)
void ast_channel_timingfd_set(struct ast_channel *chan, int value)
void ast_channel_internal_alertpipe_clear(struct ast_channel *chan)
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
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(), make_ari_stubs::file, NULL, and tmp().

◆ __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 5975 of file channel.c.

5976{
5977 int dummy_outstate;
5978 int cause = 0;
5979 struct ast_channel *chan;
5980 int res = 0;
5981 int last_subclass = 0;
5983
5984 if (outstate)
5985 *outstate = 0;
5986 else
5987 outstate = &dummy_outstate; /* make outstate always a valid pointer */
5988
5989 chan = ast_request(type, cap, assignedids, requestor, addr, &cause);
5990 if (!chan) {
5991 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, addr);
5992 handle_cause(cause, outstate);
5993 return NULL;
5994 }
5995
5996 if (oh) {
5997 if (oh->vars) {
5998 ast_channel_lock(chan);
5999 ast_set_variables(chan, oh->vars);
6000 ast_channel_unlock(chan);
6001 }
6002 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name)) {
6003 /*
6004 * Use the oh values instead of the function parameters for the
6005 * outgoing CallerID.
6006 */
6007 cid_num = oh->cid_num;
6008 cid_name = oh->cid_name;
6009 }
6010 if (oh->parent_channel) {
6011 /* Safely inherit variables and datastores from the parent channel. */
6017 ast_channel_unlock(chan);
6018 }
6019 if (!ast_strlen_zero(oh->account)) {
6020 ast_channel_lock(chan);
6022 ast_channel_accountcode_set(chan, oh->account);
6023 ast_channel_peeraccount_set(chan, oh->account);
6025 ast_channel_unlock(chan);
6026 }
6027 }
6028
6029 /*
6030 * It seems strange to set the CallerID on an outgoing call leg
6031 * to whom we are calling, but this function's callers are doing
6032 * various Originate methods. This call leg goes to the local
6033 * user. Once the local user answers, the dialplan needs to be
6034 * able to access the CallerID from the CALLERID function as if
6035 * the local user had placed this call.
6036 */
6037 ast_set_callerid(chan, cid_num, cid_name, cid_num);
6038
6039 ast_channel_lock(chan);
6041 ast_channel_unlock(chan);
6043 if (cid_num) {
6044 connected.id.number.valid = 1;
6045 connected.id.number.str = (char *) cid_num;
6047 }
6048 if (cid_name) {
6049 connected.id.name.valid = 1;
6050 connected.id.name.str = (char *) cid_name;
6052 }
6054 if (requestor) {
6055 ast_channel_lock_both(chan, (struct ast_channel *) requestor);
6057 ast_channel_unlock(chan);
6058 ast_channel_unlock((struct ast_channel *) requestor);
6059 }
6060
6061 if (ast_call(chan, addr, 0)) { /* ast_call failed... */
6062 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, addr);
6063 } else {
6064 struct timeval start = ast_tvnow();
6065 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
6066 while (timeout && ast_channel_state(chan) != AST_STATE_UP) {
6067 struct ast_frame *f;
6068 int ms = ast_remaining_ms(start, timeout);
6069
6070 res = ast_waitfor(chan, ms);
6071 if (res == 0) { /* timeout, treat it like ringing */
6072 *outstate = AST_CONTROL_RINGING;
6073 break;
6074 }
6075 if (res < 0) /* error or done */
6076 break;
6078 if (!(chan = ast_call_forward(NULL, chan, NULL, cap, oh, outstate))) {
6079 return NULL;
6080 }
6081 continue;
6082 }
6083
6084 f = ast_read(chan);
6085 if (!f) {
6086 *outstate = AST_CONTROL_HANGUP;
6087 res = 0;
6088 break;
6089 }
6090 if (f->frametype == AST_FRAME_CONTROL) {
6091 switch (f->subclass.integer) {
6092 case AST_CONTROL_RINGING: /* record but keep going */
6093 *outstate = f->subclass.integer;
6094 break;
6095
6096 case AST_CONTROL_BUSY:
6097 *outstate = f->subclass.integer;
6098 timeout = 0;
6099 break;
6100
6102 *outstate = AST_CONTROL_CONGESTION;
6103 timeout = 0;
6104 break;
6105
6107 *outstate = f->subclass.integer;
6108 timeout = 0;
6109 break;
6110
6111 case AST_CONTROL_ANSWER:
6112 *outstate = f->subclass.integer;
6113 timeout = 0; /* trick to force exit from the while() */
6114 break;
6115
6118 break;
6119
6121 if (oh && oh->connect_on_early_media) {
6122 *outstate = f->subclass.integer;
6123 timeout = 0; /* trick to force exit from the while() */
6124 break;
6125 }
6126 /* Fallthrough */
6127 /* Ignore these */
6129 case AST_CONTROL_HOLD:
6130 case AST_CONTROL_UNHOLD:
6136 case AST_CONTROL_CC:
6137 case -1: /* Ignore -- just stopping indications */
6138 break;
6139
6140 default:
6141 ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass.integer);
6142 }
6143 last_subclass = f->subclass.integer;
6144 }
6145 ast_frfree(f);
6146 }
6147 }
6148
6149 /* Final fixups */
6150 if (oh) {
6151 if (!ast_strlen_zero(oh->context))
6153 if (!ast_strlen_zero(oh->exten))
6154 ast_channel_exten_set(chan, oh->exten);
6155 if (oh->priority)
6157 }
6158 if (ast_channel_state(chan) == AST_STATE_UP)
6159 *outstate = AST_CONTROL_ANSWER;
6160
6161 if (res <= 0) {
6162 ast_channel_lock(chan);
6163 if (AST_CONTROL_RINGING == last_subclass) {
6165 }
6166 ast_channel_unlock(chan);
6167 ast_hangup(chan);
6168 chan = NULL;
6169 }
6170 return chan;
6171}
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition: callerid.h:423
#define AST_CAUSE_NO_ANSWER
Definition: causes.h:109
static const char type[]
Definition: chan_ooh323.c:109
int ast_call(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition: channel.c:6460
static void handle_cause(int cause, int *outstate)
Definition: channel.c:5848
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:5897
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition: channel.c:2541
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:8307
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition: channel.c:8114
int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
Inherit datastores from a parent to a child.
Definition: channel.c:2368
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:6433
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:7333
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:6770
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:4345
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:2045
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:6353
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2929
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
void ast_channel_context_set(struct ast_channel *chan, const char *value)
const char * ast_channel_call_forward(const struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
@ AST_STATE_UP
Definition: channelstate.h:42
char connected
Definition: eagi_proxy.c:82
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_BUSY
@ AST_CONTROL_VIDUPDATE
@ AST_CONTROL_PROCEEDING
@ AST_CONTROL_REDIRECTING
@ AST_CONTROL_CONGESTION
@ AST_CONTROL_CC
@ AST_CONTROL_ANSWER
@ AST_CONTROL_RINGING
@ AST_CONTROL_HOLD
@ 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.
Definition: max_forwards.c:135
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
union ast_frame::@226 data
Connected Line/Party information.
Definition: channel.h:456
const char * cid_num
Definition: channel.h:1109
struct ast_variable * vars
Definition: channel.h:1112
int connect_on_early_media
Definition: channel.h:1108
const char * account
Definition: channel.h:1111
const char * cid_name
Definition: channel.h:1110
const char * exten
Definition: channel.h:1106
const char * context
Definition: channel.h:1105
struct ast_channel * parent_channel
Definition: channel.h:1113
#define ast_set_flag(p, flag)
Definition: utils.h:70

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 2951 of file channel.c.

2952{
2953 int res = 0;
2954 void *generatordata = NULL;
2955
2956 ast_channel_lock(chan);
2957 if (ast_channel_generatordata(chan)) {
2958 struct ast_generator *generator_old = ast_channel_generator(chan);
2959
2960 if (generator_old && generator_old->release) {
2961 generator_old->release(chan, ast_channel_generatordata(chan));
2962 }
2963 }
2964 if (gen->alloc && !(generatordata = gen->alloc(chan, params))) {
2965 res = -1;
2966 }
2967 ast_channel_generatordata_set(chan, generatordata);
2968 if (!res) {
2969 ast_settimeout(chan, 50, generator_force, chan);
2971 }
2972 ast_channel_unlock(chan);
2973
2974 ast_prod(chan);
2975
2976 return res;
2977}
static struct ast_generator gen
int ast_prod(struct ast_channel *chan)
Send empty audio to prime a channel driver.
Definition: channel.c:4999
static int generator_force(const void *data)
Definition: channel.c:2916
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:3180
void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value)
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
void * ast_channel_generatordata(const struct ast_channel *chan)
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
void *(* alloc)(struct ast_channel *chan, void *params)
Definition: channel.h:226
void(* release)(struct ast_channel *chan, void *data)
Definition: channel.h:228

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 499 of file channel.c.

500{
502}
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124

References ao2_container_count(), and channels.

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 2819 of file channel.h.

2820{
2821 pfd->fd = fd;
2822 pfd->events = POLLIN | POLLPRI;
2823 return fd >= 0;
2824}

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 2805 of file channel.c.

2806{
2807 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2808 return __ast_answer(chan, 0);
2809}
int __ast_answer(struct ast_channel *chan, unsigned int delay)
Answer a channel, with a selectable delay before returning.
Definition: channel.c:2695

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

Referenced by agent_login_exec(), agi_exec_full(), alarmreceiver_exec(), announce_request(), 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 2811 of file channel.c.

2812{
2813 if (ast_channel_state(chan) == AST_STATE_UP) {
2814 /* Already answered */
2815 return 0;
2816 }
2817 return ast_answer(chan);
2818}
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2805

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 342 of file autoservice.c.

343{
344 if (chan && !ast_autoservice_start(chan)) {
345 ast_hangup(peer);
347 } else {
348 ast_hangup(peer);
349 }
350}
int ast_autoservice_stop(struct ast_channel *chan)
Stop servicing a channel for us...
Definition: autoservice.c:266
int ast_autoservice_start(struct ast_channel *chan)
Automatically service a channel for us...
Definition: autoservice.c:200
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2541

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 352 of file autoservice.c.

353{
354 struct asent *as;
355 int res = -1;
356
359 if (as->chan == chan) {
360 res = 0;
361 as->ignore_frame_types |= (1 << ftype);
362 break;
363 }
364 }
366 return res;
367}
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:491
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:40
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:140
unsigned int ignore_frame_types
Definition: autoservice.c:62
struct asent::@306 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.
Definition: linkedlists.h:450
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: linkedlists.h:856
#define AST_PTHREADT_NULL
Definition: lock.h:66
#define ast_cond_signal(cond)
Definition: lock.h:203
unsigned int use_count
Definition: autoservice.c:59
unsigned int orig_end_dtmf_flag
Definition: autoservice.c:60
#define ast_test_flag(p, flag)
Definition: utils.h:63
int ast_thread_is_user_interface(void)
Indicates whether the current thread is a user interface.
Definition: utils.c:3248
#define ast_pthread_create_background(a, b, c, d)
Definition: utils.h:592

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 /* Wait while autoservice thread rebuilds its list. */
313 while (chan_list_state == as_chan_list_state) {
314 usleep(1000);
315 }
316
317 /* Now autoservice thread should have no references to our entry
318 and we can safely destroy it */
319
321 res = 0;
322 }
323
324 ast_channel_lock(chan);
325 if (!as->orig_end_dtmf_flag) {
327 }
328
329 while ((f = AST_LIST_REMOVE_HEAD(&as->deferred_frames, frame_list))) {
330 if (!((1 << f->frametype) & as->ignore_frame_types)) {
331 ast_queue_frame_head(chan, f);
332 }
333 ast_frfree(f);
334 }
335 ast_channel_unlock(chan);
336
337 ast_free(as);
338
339 return res;
340}
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:1144
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:529
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:557
struct asent::@305 deferred_frames
#define ast_clear_flag(p, flag)
Definition: utils.h:77

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 6460 of file channel.c.

6461{
6462 /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
6463 If the remote end does not answer within the timeout, then do NOT hang up, but
6464 return anyway. */
6465 int res = -1;
6466 /* Stop if we're a zombie or need a soft hangup */
6467 ast_channel_lock(chan);
6469 if (ast_channel_tech(chan)->call)
6470 res = ast_channel_tech(chan)->call(chan, addr, timeout);
6472 }
6473 ast_channel_unlock(chan);
6474 return res;
6475}
static int call(void *data)
Definition: chan_pjsip.c:2391
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
int(*const call)(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition: channel.h:701

References ast_channel_flags(), ast_channel_lock, ast_channel_tech(), 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 5897 of file channel.c.

5898{
5899 char tmpchan[256];
5900 char forwarder[AST_CHANNEL_NAME];
5901 struct ast_channel *new_chan = NULL;
5902 char *data, *type;
5903 int cause = 0;
5904 int res;
5905
5906 /* gather data and request the new forward channel */
5907 ast_copy_string(tmpchan, ast_channel_call_forward(orig), sizeof(tmpchan));
5908 ast_copy_string(forwarder, ast_channel_name(orig), sizeof(forwarder));
5909 if ((data = strchr(tmpchan, '/'))) {
5910 *data++ = '\0';
5911 type = tmpchan;
5912 } else {
5913 const char *forward_context;
5914 ast_channel_lock(orig);
5915 forward_context = pbx_builtin_getvar_helper(orig, "FORWARD_CONTEXT");
5916 snprintf(tmpchan, sizeof(tmpchan), "%s@%s", ast_channel_call_forward(orig), S_OR(forward_context, ast_channel_context(orig)));
5917 ast_channel_unlock(orig);
5918 data = tmpchan;
5919 type = "Local";
5920 }
5921 if (!(new_chan = ast_request(type, cap, NULL, orig, data, &cause))) {
5922 ast_log(LOG_NOTICE, "Unable to create channel for call forward to '%s/%s' (cause = %d)\n", type, data, cause);
5923 handle_cause(cause, outstate);
5924 ast_hangup(orig);
5925 return NULL;
5926 }
5927
5928 /* Copy/inherit important information into new channel */
5929 if (oh) {
5930 if (oh->vars) {
5931 ast_channel_lock(new_chan);
5932 ast_set_variables(new_chan, oh->vars);
5933 ast_channel_unlock(new_chan);
5934 }
5935 if (oh->parent_channel) {
5936 call_forward_inherit(new_chan, oh->parent_channel, orig);
5937 }
5938 if (!ast_strlen_zero(oh->account)) {
5939 ast_channel_lock(new_chan);
5941 ast_channel_accountcode_set(new_chan, oh->account);
5942 ast_channel_peeraccount_set(new_chan, oh->account);
5944 ast_channel_unlock(new_chan);
5945 }
5946 } else if (caller) { /* no outgoing helper so use caller if available */
5947 call_forward_inherit(new_chan, caller, orig);
5948 }
5949
5950 ast_channel_lock_both(orig, new_chan);
5952 pbx_builtin_setvar_helper(new_chan, "FORWARDERNAME", forwarder);
5956 ast_channel_unlock(new_chan);
5957 ast_channel_unlock(orig);
5958
5959 /* call new channel */
5960 res = ast_call(new_chan, data, 0);
5961 if (timeout) {
5962 *timeout = res;
5963 }
5964 if (res) {
5965 ast_log(LOG_NOTICE, "Unable to call forward to channel %s/%s\n", type, (char *)data);
5966 ast_hangup(orig);
5967 ast_hangup(new_chan);
5968 return NULL;
5969 }
5970 ast_hangup(orig);
5971
5972 return new_chan;
5973}
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:2031
static void call_forward_inherit(struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
Definition: channel.c:5869
void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
Set a flag on a channel.
Definition: channel.c:11026
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:2135
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
#define AST_CHANNEL_NAME
Definition: channel.h:171
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
const char * data
struct ast_party_caller caller
Channel Caller ID information.

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 612 of file channel.c.

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

References ARRAY_LEN, causes, and causes_map::desc.

Referenced by 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 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 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 6758 of file channel.c.

6759{
6760 /* We must re-link, as the hash value will change here. */
6762 ast_channel_lock(chan);
6763 ao2_unlink(channels, chan);
6764 __ast_change_name_nolink(chan, newname);
6765 ao2_link(channels, chan);
6766 ast_channel_unlock(chan);
6768}
#define ao2_link(container, obj)
Add an object to a container.
Definition: astobj2.h:1532
#define ao2_unlink(container, obj)
Remove an object from a container.
Definition: astobj2.h:1578
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
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:6741

References __ast_change_name_nolink(), ao2_link, ao2_lock, ao2_unlink, ao2_unlock, ast_channel_lock, ast_channel_unlock, and channels.

◆ 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 766 of file channel_internal_api.c.

767{
768 return chan->adsicpe;
769}
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 1110 of file channel_internal_api.c.

1111{
1112 return ast_alertpipe_writable(chan->alertpipe);
1113}
int 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 1095 of file channel_internal_api.c.

1096{
1097 return ast_alertpipe_write(chan->alertpipe);
1098}
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 4372 of file channel.c.

4373{
4374 switch (flag) {
4375 case AST_AMA_OMIT:
4376 return "OMIT";
4377 case AST_AMA_BILLING:
4378 return "BILLING";
4380 return "DOCUMENTATION";
4381 default:
4382 return "Unknown";
4383 }
4384}
long int flag
Definition: f2c.h:83

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(), cdr_read_callback(), cel_bs_put(), handle_cli_ooh323_show_config(), handle_cli_ooh323_show_peer(), handle_cli_ooh323_show_user(), manager_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 409 of file channel_internal_api.c.

410{
411 if (chan->amaflags == value) {
412 return;
413 }
414 chan->amaflags = value;
416}
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 971 of file channel_internal_api.c.

972{
973 return chan->answertime;
974}
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 976 of file channel_internal_api.c.

977{
978 chan->answertime = *value;
979}

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 319 of file channel_internal_api.c.

320{
321 chan->appl = value;
323}
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 578 of file channel_internal_api.c.

579{
580 chan->audiohooks = value;
581}

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 857 of file channel_internal_api.c.

858{
859 return &chan->autochans;
860}
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 1198 of file channel_internal_api.c.

1199{
1200 return chan->blocker;
1201}

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 1202 of file channel_internal_api.c.

1203{
1204 chan->blocker = value;
1205}

References ast_channel::blocker, and value.

◆ ast_channel_blocker_tid()

int ast_channel_blocker_tid ( const struct ast_channel chan)

Definition at line 1207 of file channel_internal_api.c.

1208{
1209 return chan->blocker_tid;
1210}

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 1211 of file channel_internal_api.c.

1212{
1213 chan->blocker_tid = value;
1214}

References ast_channel::blocker_tid, and value.

◆ ast_channel_blockproc()

const char * ast_channel_blockproc ( const struct ast_channel chan)

Definition at line 324 of file channel_internal_api.c.

325{
326 return chan->blockproc;
327}
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 328 of file channel_internal_api.c.

329{
330 chan->blockproc = value;
331}

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 10563 of file channel.c.

10564{
10565 struct ast_channel *peer;
10566 struct ast_bridge *bridge;
10567
10568 /* Get the bridge the channel is in. */
10569 ast_channel_lock(chan);
10570 bridge = ast_channel_get_bridge(chan);
10571 ast_channel_unlock(chan);
10572 if (!bridge) {
10573 return NULL;
10574 }
10575
10576 peer = ast_bridge_peer(bridge, chan);
10577 ao2_ref(bridge, -1);
10578 return peer;
10579}
#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:4075
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition: channel.c:10533
Structure that contains information about a bridge.
Definition: bridge.h:349

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

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

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

Definition at line 1278 of file channel.c.

1280{
1281 return ao2_callback_data(channels, ao2_flags, cb_fn, arg, data);
1282}
#define ao2_callback_data(container, flags, cb_fn, arg, data)
Definition: astobj2.h:1723

References ao2_callback_data, channels, and ast_channel::data.

Referenced by ast_channel_get_by_exten(), ast_channel_get_by_name_prefix(), ast_channel_iterator_by_exten_new(), ast_channel_iterator_by_name_new(), ast_pickup_find_by_group(), does_id_conflict(), 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 873 of file channel_internal_api.c.

874{
875 return &chan->caller;
876}

References ast_channel::caller.

Referenced by __analog_handle_event(), __analog_ss_thread(), __ast_channel_alloc_ap(), __ast_goto_if_exists(), __ast_pbx_run(), acf_isexten_exec(), 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(), 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_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 1063 of file channel_internal_api.c.

1064{
1065 chan->callgroup = value;
1066}

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

1054{
1055 chan->callid = 0;
1056}

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 782 of file channel_internal_api.c.

783{
784 char call_identifier_from[AST_CALLID_BUFFER_LENGTH];
785 char call_identifier_to[AST_CALLID_BUFFER_LENGTH];
786 call_identifier_from[0] = '\0';
787 ast_callid_strnprint(call_identifier_to, sizeof(call_identifier_to), callid);
788 if (chan->callid) {
789 ast_callid_strnprint(call_identifier_from, sizeof(call_identifier_from), chan->callid);
790 ast_debug(3, "Channel Call ID changing from %s to %s\n", call_identifier_from, call_identifier_to);
791 }
792
793 chan->callid = callid;
794
795 ast_test_suite_event_notify("CallIDChange",
796 "State: CallIDChange\r\n"
797 "Channel: %s\r\n"
798 "CallID: %s\r\n"
799 "PriorCallID: %s",
800 ast_channel_name(chan),
801 call_identifier_to,
802 call_identifier_from);
803}
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:2276
#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.

Parameters
chanThe channel to create the datastore on
base_paramsCCSS parameters we wish to copy into the channel
Return values
0Success
-1Failure

Definition at line 10450 of file channel.c.

10452{
10453 struct ast_cc_config_params *cc_params;
10454 struct ast_datastore *cc_datastore;
10455
10456 if (!(cc_params = ast_cc_config_params_init())) {
10457 return -1;
10458 }
10459
10460 if (!(cc_datastore = ast_datastore_alloc(&cc_channel_datastore_info, NULL))) {
10462 return -1;
10463 }
10464
10465 if (base_params) {
10466 ast_cc_copy_config_params(cc_params, base_params);
10467 }
10468 cc_datastore->data = cc_params;
10469 ast_channel_datastore_add(chan, cc_datastore);
10470 return 0;
10471}
#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:692
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:854
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2385
static const struct ast_datastore_info cc_channel_datastore_info
Definition: channel.c:10444
#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 582 of file channel_internal_api.c.

583{
584 return chan->cdr;
585}
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 586 of file channel_internal_api.c.

587{
588 chan->cdr = value;
589}

References ast_channel::cdr, and value.

Referenced by ast_channel_destructor(), ast_dummy_channel_destructor(), custom_log(), manager_log(), and write_cdr().

◆ 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 11033 of file channel.c.

11034{
11035 ast_channel_lock(chan);
11037 ast_channel_unlock(chan);
11038}

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 2432 of file channel.c.

2433{
2434 ast_channel_lock(chan);
2435
2437
2439 struct ast_frame *fr;
2440
2441 /* If we have completely cleared the softhangup flag,
2442 * then we need to fully abort the hangup process. This requires
2443 * pulling the END_OF_Q frame out of the channel frame queue if it
2444 * still happens to be there. */
2445
2446 fr = AST_LIST_LAST(ast_channel_readq(chan));
2447 if (fr && fr->frametype == AST_FRAME_CONTROL &&
2450 ast_frfree(fr);
2451 }
2452 }
2453
2454 ast_channel_unlock(chan);
2455}
void ast_channel_softhangup_internal_flag_clear(struct ast_channel *chan, int value)
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
@ AST_CONTROL_END_OF_Q
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:429

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 523 of file channel.c.

524{
525 struct timeval whentohangup;
526
528 return ast_tvzero(offset) ? 0 : -1;
529
530 if (ast_tvzero(offset))
531 return 1;
532
533 whentohangup = ast_tvadd(offset, ast_tvnow());
534
535 return ast_tvdiff_ms(whentohangup, *ast_channel_whentohangup(chan));
536}
struct timeval * ast_channel_whentohangup(struct ast_channel *chan)
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:2282
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 885 of file channel_internal_api.c.

886{
887 return ast_party_id_merge(&chan->connected.id, &chan->connected.priv);
888}
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:1902
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:468
struct ast_party_id id
Connected party ID.
Definition: channel.h:458

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 881 of file channel_internal_api.c.

882{
883 return &chan->connected_indicated;
884}
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 10337 of file channel.c.

10338{
10339 const char *sub;
10340 const char *sub_args;
10341 int retval;
10342
10343 ast_channel_lock(sub_chan);
10344 sub = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB");
10345 sub = ast_strdupa(S_OR(sub, ""));
10346 sub_args = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB_ARGS");
10347 sub_args = ast_strdupa(S_OR(sub_args, ""));
10348
10349 if (ast_strlen_zero(sub)) {
10350 ast_channel_unlock(sub_chan);
10351 return -1;
10352 }
10353
10354 if (is_frame) {
10355 const struct ast_frame *frame = connected_info;
10356
10358 } else {
10359 const struct ast_party_connected_line *connected = connected_info;
10360
10362 }
10363 ast_channel_unlock(sub_chan);
10364
10366 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10368 if (!retval) {
10369 struct ast_party_connected_line saved_connected;
10370
10371 ast_party_connected_line_init(&saved_connected);
10372 ast_channel_lock(sub_chan);
10373 ast_party_connected_line_copy(&saved_connected, ast_channel_connected(sub_chan));
10374 ast_channel_unlock(sub_chan);
10375 ast_channel_update_connected_line(sub_chan, &saved_connected, NULL);
10376 ast_party_connected_line_free(&saved_connected);
10377 }
10378
10379 return retval;
10380}
#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:2072
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:9092
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:8784
static void channel_set_intercept_mode(int in_intercept_mode)
Definition: channel.c:10321
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2022
static ENTRY retval
Definition: hsearch.c:50
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
struct stasis_forward * sub
Definition: res_corosync.c:240

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, retval, 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(), 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 342 of file channel_internal_api.c.

343{
344 return chan->context;
345}
char context[AST_MAX_CONTEXT]

References ast_channel::context.

Referenced by __analog_ss_thread(), __ast_goto_if_exists(), __ast_pbx_run(), _while_exec(), acf_isexten_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_by_exten_cb(), 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(), cc_generic_agent_init(), cc_interfaces_datastore_init(), chan_pjsip_cng_tone_detected(), channel_snapshot_dialplan_create(), 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(), 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(), 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 2385 of file channel.c.

2386{
2387 int res = 0;
2388
2390
2391 return res;
2392}
Definition: search.h:40

References ast_channel_datastores(), and AST_LIST_INSERT_HEAD.

Referenced by __after_bridge_set_goto(), acf_curlopt_write(), acf_iaxvar_write(), acf_odbc_read(), add_eprofile_to_channel(), add_features_datastore(), 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(), 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(), 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 2399 of file channel.c.

2400{
2401 struct ast_datastore *datastore = NULL;
2402
2403 if (info == NULL)
2404 return NULL;
2405
2407 if (datastore->info != info) {
2408 continue;
2409 }
2410
2411 if (uid == NULL) {
2412 /* matched by type only */
2413 break;
2414 }
2415
2416 if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
2417 /* Matched by type AND uid */
2418 break;
2419 }
2420 }
2421
2422 return datastore;
2423}
def info(msg)
const struct ast_datastore_info * info
Definition: datastore.h:67
const char * uid
Definition: datastore.h:65

References ast_channel_datastores(), AST_LIST_TRAVERSE, sip_to_pjsip::info(), 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_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(), 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(), 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(), pitchshift_cb(), pitchshift_helper(), pop_exec(), raise_exception(), remb_hook_event_cb(), remove_detect(), remove_dtmf_store(), remove_framehook(), remove_hold_intercept(), 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(), 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 2368 of file channel.c.

2369{
2370 struct ast_datastore *datastore = NULL, *datastore2;
2371
2373 if (datastore->inheritance > 0) {
2374 datastore2 = ast_datastore_alloc(datastore->info, datastore->uid);
2375 if (datastore2) {
2376 datastore2->data = datastore->info->duplicate ? datastore->info->duplicate(datastore->data) : NULL;
2377 datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
2379 }
2380 }
2381 }
2382 return 0;
2383}
#define DATASTORE_INHERIT_FOREVER
Definition: channel.h:192
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
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::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 1257 of file channel.c.

1258{
1259 int pre = 0;
1260
1261 if (chan) {
1262 ast_channel_lock(chan);
1265 ast_channel_unlock(chan);
1266 }
1267 return pre;
1268}

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 1278 of file channel_internal_api.c.

1279{
1280 struct ast_control_pvt_cause_code *ao2_cause_code;
1282 ao2_cause_code = ao2_alloc(datalen, NULL);
1283
1284 if (ao2_cause_code) {
1285 memcpy(ao2_cause_code, cause_code, datalen);
1286 ao2_link(chan->dialed_causes, ao2_cause_code);
1287 ao2_ref(ao2_cause_code, -1);
1288 return 0;
1289 } else {
1290 return -1;
1291 }
1292}
#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
char chan_name[AST_CHANNEL_NAME]

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

1261{
1262 struct ast_str *chanlist = ast_str_create(128);
1263
1264 if (!chanlist) {
1265 return NULL;
1266 }
1267
1269
1270 return chanlist;
1271}
#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
Support for dynamic strings.
Definition: strings.h:623
List of channel drivers.
Definition: app_dial.c:797

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 1294 of file channel_internal_api.c.

1295{
1297}
@ 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 1273 of file channel_internal_api.c.

1274{
1275 return ao2_find(chan->dialed_causes, chan_name, OBJ_KEY);
1276}

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

Referenced by hangupcause_read().

◆ 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 377 of file channel_internal_api.c.

378{
379 return chan->dtmf_digit_to_emulate;
380}

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 381 of file channel_internal_api.c.

382{
384}

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 909 of file channel_internal_api.c.

910{
911 return &chan->dtmf_tv;
912}
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 949 of file channel_internal_api.c.

950{
951 chan->dtmf_tv = *value;
952}

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 865 of file channel_internal_api.c.

866{
867 return &chan->dtmff;
868}
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 921 of file channel_internal_api.c.

922{
923 chan->dtmff = *value;
924}

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 7411 of file channel.c.

7412{
7413 /* Make sure we can early bridge, if not error out */
7414 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)))
7415 return -1;
7416
7417 return ast_channel_tech(c0)->early_bridge(c0, c1);
7418}
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:768

References ast_channel_tech(), and 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 499 of file channel_internal_api.c.

500{
501 return chan->emulate_dtmf_duration;
502}
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 503 of file channel_internal_api.c.

504{
506}

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 10868 of file channel.c.

10869{
10870 int dead;
10871 long duration;
10872
10873 ast_channel_lock(chan);
10876 & ~AST_SOFTHANGUP_ASYNCGOTO);
10877 ast_channel_unlock(chan);
10878 if (dead) {
10879 /* Channel is a zombie or a real hangup. */
10880 return;
10881 }
10882
10883 duration = ast_tvdiff_ms(ast_tvnow(), start);
10884 if (duration < option_dtmfminduration) {
10885 duration = option_dtmfminduration;
10886 }
10887 ast_senddigit_end(chan, digit, duration);
10888 ast_log(LOG_DTMF, "DTMF end '%c' simulated on %s due to %s, duration %ld ms\n",
10889 digit, ast_channel_name(chan), why, duration);
10890}
char digit
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition: channel.c:4923
unsigned int option_dtmfminduration
Definition: options.c:83
#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_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 10960 of file channel.c.

10961{
10963}
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 
)

◆ ast_channel_fd()

int ast_channel_fd ( const struct ast_channel chan,
int  which 
)

Definition at line 1171 of file channel_internal_api.c.

1172{
1173 return (which >= AST_VECTOR_SIZE(&chan->fds)) ? -1 : AST_VECTOR_GET(&chan->fds, which);
1174}
struct ast_channel::@331 fds
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

References AST_VECTOR_GET, AST_VECTOR_SIZE, and ast_channel::fds.

Referenced by __dahdi_exception(), analog_exception(), ast_channel_fd_isset(), AST_TEST_DEFINE(), ast_waitfor_nandfds(), build_conf(), channel_do_masquerade(), conf_run(), flash_exec(), fxo_pvt(), 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 1185 of file channel_internal_api.c.

1186{
1187 int pos = AST_EXTENDED_FDS;
1188
1189 while (ast_channel_fd_isset(chan, pos)) {
1190 pos += 1;
1191 }
1192
1193 AST_VECTOR_REPLACE(&chan->fds, pos, value);
1194
1195 return pos;
1196}
#define AST_EXTENDED_FDS
Definition: channel.h:195
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:284

References ast_channel_fd_isset(), AST_EXTENDED_FDS, AST_VECTOR_REPLACE, ast_channel::fds, 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 1180 of file channel_internal_api.c.

1181{
1182 return AST_VECTOR_SIZE(&chan->fds);
1183}

References AST_VECTOR_SIZE, and ast_channel::fds.

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

1176{
1177 return ast_channel_fd(chan, which) > -1;
1178}
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 421 of file channel_internal_api.c.

422{
423 chan->fdno = value;
424}

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 10950 of file channel.c.

10951{
10952 return channel_feature_hooks_set_full(chan, features, 0);
10953}
static int channel_feature_hooks_set_full(struct ast_channel *chan, struct ast_bridge_features *features, int replace)
Definition: channel.c:10913

References channel_feature_hooks_set_full().

Referenced by 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 10902 of file channel.c.

10903{
10904 struct ast_datastore *datastore;
10905
10907 if (!datastore) {
10908 return NULL;
10909 }
10910 return datastore->data;
10911}
static const struct ast_datastore_info bridge_features_info
Definition: channel.c:10897
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:2399

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 10955 of file channel.c.

10956{
10957 return channel_feature_hooks_set_full(chan, features, 1);
10958}

References channel_feature_hooks_set_full().

◆ ast_channel_fin()

unsigned int ast_channel_fin ( const struct ast_channel chan)

Definition at line 507 of file channel_internal_api.c.

508{
509 return chan->fin;
510}
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 511 of file channel_internal_api.c.

512{
513 chan->fin = value;
514}

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 1245 of file channel_internal_api.c.

1246{
1247 return &chan->flags;
1248}
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_sendtext_data(), ast_setstate(), ast_settimeout_full(), ast_softhangup_nolock(), ast_streamfile(), AST_TEST_DEFINE(), ast_transfer_protocol(), ast_unreal_new_channels(), ast_var_channels_table(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write_stream(), 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(), 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(), tonepair_alloc(), and waitstream_core().

◆ 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 1497 of file channel_internal_api.c.

1499{
1500 ast_assert(chan != NULL);
1501 ast_assert(endpoint != NULL);
1502
1503 chan->endpoint_forward =
1505 ast_endpoint_topic(endpoint));
1506 if (!chan->endpoint_forward) {
1507 return -1;
1508 }
1509
1510 return 0;
1511}
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:1578
struct stasis_forward * endpoint_forward
#define ast_assert(a)
Definition: utils.h:739

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 515 of file channel_internal_api.c.

516{
517 return chan->fout;
518}
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 519 of file channel_internal_api.c.

520{
521 chan->fout = value;
522}

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 694 of file channel_internal_api.c.

695{
696 chan->framehooks = value;
697}

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 702 of file channel_internal_api.c.

703{
704 chan->generator = value;
705}

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 7987 of file channel.c.

7988{
7989 return channel_get_external_vars(&ari_vars, chan);
7990}
static struct varshead * channel_get_external_vars(struct external_vars *channelvars, struct ast_channel *chan)
Definition: channel.c:7935
static struct external_vars ari_vars
Definition: channel.c:7831

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 10533 of file channel.c.

10534{
10535 struct ast_bridge *bridge;
10536
10537 bridge = ast_channel_internal_bridge(chan);
10538 if (bridge) {
10539 ao2_ref(bridge, +1);
10540 }
10541 return bridge;
10542}
struct ast_bridge * ast_channel_internal_bridge(const struct ast_channel *chan)

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 10581 of file channel.c.

10582{
10583 struct ast_bridge_channel *bridge_channel;
10584
10585 bridge_channel = ast_channel_internal_bridge_channel(chan);
10586 if (bridge_channel) {
10587 ao2_ref(bridge_channel, +1);
10588 }
10589 return bridge_channel;
10590}
struct ast_bridge_channel * ast_channel_internal_bridge_channel(const struct ast_channel *chan)
Structure that contains information regarding a channel in a bridge.
struct ast_channel * chan

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 1459 of file channel.c.

1460{
1461 char *l_exten = (char *) exten;
1462 char *l_context = (char *) context;
1463
1464 return ast_channel_callback(ast_channel_by_exten_cb, l_context, l_exten, 0);
1465}
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:1278
static int ast_channel_by_exten_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1306

References ast_channel_by_exten_cb(), ast_channel_callback(), voicemailpwcheck::context, and ast_channel::exten.

◆ ast_channel_get_by_name()

struct ast_channel * ast_channel_get_by_name ( const char *  name)

Find a channel by name.

Channel search functions

Parameters
namethe name or uniqueid of the channel to search for

Find a channel that has the same name as the provided argument.

Return values
achannel with the name specified by the argument
NULLif no channel was found
Since
1.8

Definition at line 1454 of file channel.c.

1455{
1457}
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:1434
static const char name[]
Definition: format_mp3.c:68

References ast_channel_get_by_name_prefix(), and name.

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_async_goto_by_name(), ast_manager_hangup_helper(), asyncgoto_exec(), bridge_channel_attended_transfer(), call_forwarded_handler(), channel_find(), 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_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
nameThe channel name or uniqueid prefix to search for
name_lenOnly search for up to this many characters from the name

Find a channel that has the same name prefix as specified by the arguments.

Return values
achannel with the name prefix specified by the arguments
NULLif no channel was found
Since
1.8

Definition at line 1434 of file channel.c.

1435{
1436 struct ast_channel *chan;
1437 char *l_name = (char *) name;
1438
1439 if (ast_strlen_zero(l_name)) {
1440 /* We didn't have a name to search for so quit. */
1441 return NULL;
1442 }
1443
1444 chan = ast_channel_callback(ast_channel_by_name_cb, l_name, &name_len,
1445 (name_len == 0) /* optimize if it is a complete name match */ ? OBJ_KEY : 0);
1446 if (chan) {
1447 return chan;
1448 }
1449
1450 /* Now try a search for uniqueid. */
1451 return ast_channel_callback(ast_channel_by_uniqueid_cb, l_name, &name_len, 0);
1452}
static int ast_channel_by_uniqueid_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1329
static int ast_channel_by_name_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1284

References ast_channel_by_name_cb(), ast_channel_by_uniqueid_cb(), ast_channel_callback(), ast_strlen_zero(), name, NULL, and OBJ_KEY.

Referenced by action_aocmessage(), action_bridge(), ast_channel_get_by_name(), 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_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 10512 of file channel.c.

10513{
10514 int len = size;
10515 char *slash;
10516
10518 return 0;
10519 }
10520
10522 if ((slash = strchr(agent_type, '/'))) {
10523 *slash = '\0';
10524 }
10525 return 0;
10526}
static struct aco_type agent_type
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:7441
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#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.

Parameters
chanChannel to retrieve parameters from
Return values
NULLFailure
non-NULLThe parameters desired

Definition at line 10473 of file channel.c.

10474{
10475 struct ast_datastore *cc_datastore;
10476
10477 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10478 /* If we can't find the datastore, it almost definitely means that the channel type being
10479 * used has not had its driver modified to parse CC config parameters. The best action
10480 * to take here is to create the parameters on the spot with the defaults set.
10481 */
10482 if (ast_channel_cc_params_init(chan, NULL)) {
10483 return NULL;
10484 }
10485 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10486 /* Should be impossible */
10487 return NULL;
10488 }
10489 }
10490
10491 ast_assert(cc_datastore->data != NULL);
10492 return cc_datastore->data;
10493}
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:10450

References ast_assert, 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_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 1605 of file channel_internal_api.c.

1607{
1608 ast_assert(chan != NULL);
1610
1611 return chan->default_streams[type];
1612}
@ 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 10495 of file channel.c.

10496{
10497 int len = name_buffer_length;
10498 char *dash;
10499 if (!ast_channel_queryoption(chan, AST_OPTION_DEVICE_NAME, device_name, &len, 0)) {
10500 return 0;
10501 }
10502
10503 /* Dang. Do it the old-fashioned way */
10504 ast_copy_string(device_name, ast_channel_name(chan), name_buffer_length);
10505 if ((dash = strrchr(device_name, '-'))) {
10506 *dash = '\0';
10507 }
10508
10509 return 0;
10510}
#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 2830 of file channel.c.

2831{
2832 return (ast_channel_get_duration_ms(chan) / 1000);
2833}
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:2820

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 2820 of file channel.c.

2821{
2822 ast_assert(NULL != chan);
2823
2825 return 0;
2826 }
2828}
struct timeval ast_channel_creationtime(struct ast_channel *chan)

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

Referenced by ast_channel_get_duration(), and end_bridge_callback().

◆ 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 10332 of file channel.c.

10333{
10334 return ast_threadstorage_get_ptr(&in_intercept_routine) ? 1 : 0;
10335}
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 7982 of file channel.c.

7983{
7984 return channel_get_external_vars(&ami_vars, chan);
7985}
static struct external_vars ami_vars
Definition: channel.c:7830

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 657 of file channel_internal_api.c.

658{
660}
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 2850 of file channel.h.

2851{
2853 int datalen = sizeof(state);
2854
2856
2857 return state;
2858}
enum cc_state state
Definition: ccss.c:393
ast_t38_state
Possible T38 states on channels.
Definition: channel.h:878
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:7441
#define AST_OPTION_T38_STATE

References ast_channel_queryoption(), AST_OPTION_T38_STATE, 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 2845 of file channel.c.

2846{
2847 return (ast_channel_get_up_time_ms(chan) / 1000);
2848}
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:2835

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 2835 of file channel.c.

2836{
2837 ast_assert(NULL != chan);
2838
2840 return 0;
2841 }
2843}
struct timeval ast_channel_answertime(struct ast_channel *chan)

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 7910 of file channel.c.

7911{
7912 RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
7913 struct ast_var_t *cv;
7914
7915 ret = ao2_alloc(sizeof(*ret), varshead_dtor);
7916
7917 if (!ret) {
7918 return NULL;
7919 }
7920
7923
7924 if (!var) {
7925 return NULL;
7926 }
7927
7929 }
7930
7931 ao2_ref(ret, +1);
7932 return ret;
7933}
#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:7900
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::@211 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:941

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 4345 of file channel.c.

4346{
4347 char causevar[256];
4348
4349 if (ast_channel_dialed_causes_add(chan, cause_code, datalen)) {
4350 ast_log(LOG_WARNING, "Unable to store hangup cause for %s on %s\n", cause_code->chan_name, ast_channel_name(chan));
4351 }
4352
4353 if (cause_code->emulate_sip_cause) {
4354 snprintf(causevar, sizeof(causevar), "HASH(SIP_CAUSE,%s)", cause_code->chan_name);
4355 ast_func_write(chan, causevar, cause_code->code);
4356 }
4357}
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.
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 7859 of file channel.c.

7860{
7862}
static int channel_has_external_vars(struct external_vars *channelvars)
Definition: channel.c:7843

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 2518 of file channel.c.

2519{
2522}
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition: audiohook.c:1071
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
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 2524 of file channel.c.

2525{
2528}
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 7854 of file channel.c.

7855{
7857}

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 479 of file channel_internal_api.c.

480{
481 chan->hold_state = value;
482}

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 6770 of file channel.c.

6771{
6772 struct ast_var_t *current;
6773 struct ast_var_t *newvar;
6774 const char *varname;
6775 int vartype;
6776
6778 varname = ast_var_full_name(current);
6779 if (!varname) {
6780 continue;
6781 }
6782
6783 vartype = 0;
6784 if (varname[0] == '_') {
6785 vartype = 1;
6786 if (varname[1] == '_') {
6787 vartype = 2;
6788 }
6789 }
6790
6791 switch (vartype) {
6792 case 1:
6793 newvar = ast_var_assign(&varname[1], ast_var_value(current));
6794 break;
6795 case 2:
6796 newvar = ast_var_assign(varname, ast_var_value(current));
6797 break;
6798 default:
6799 continue;
6800 }
6801 if (newvar) {
6802 ast_debug(1, "Inheriting variable %s from %s to %s.\n",
6803 ast_var_full_name(newvar), ast_channel_name(parent),
6804 ast_channel_name(child));
6807 ast_var_value(newvar));
6808 }
6809 }
6810}
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.
size_t current
Definition: main/cli.c:113

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 523 of file channel_internal_api.c.

524{
525 return chan->insmpl;
526}
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 527 of file channel_internal_api.c.

528{
529 chan->insmpl = value;
530}

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 1100 of file channel_internal_api.c.

1101{
1102 return ast_alertpipe_flush(chan->alertpipe);
1103}
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 1105 of file channel_internal_api.c.

1106{
1107 return ast_alertpipe_read(chan->alertpipe);
1108}
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 1115 of file channel_internal_api.c.

1116{
1117 return ast_alertpipe_readable(chan->alertpipe);
1118}
int 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 1135 of file channel_internal_api.c.

1136{
1137 return ast_alertpipe_readfd(chan->alertpipe);
1138}
int 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 1120 of file channel_internal_api.c.

1121{
1123}
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 1125 of file channel_internal_api.c.

1126{
1128}
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 1130 of file channel_internal_api.c.

1131{
1132 return ast_alertpipe_init(chan->alertpipe);
1133}
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 1140 of file channel_internal_api.c.

1141{
1142 ast_alertpipe_swap(chan1->alertpipe, chan2->alertpipe);
1143}
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)

◆ 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 1390 of file channel_internal_api.c.

1391{
1392 if (dest->linkedid.creation_time == source->linkedid.creation_time
1394 && !strcmp(dest->linkedid.unique_id, source->linkedid.unique_id)) {
1395 return;
1396 }
1397 dest->linkedid = source->linkedid;
1400}
@ AST_CHANNEL_SNAPSHOT_INVALIDATE_PEER
char unique_id[AST_MAX_UNIQUEID]
struct ast_channel_id linkedid

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 1159 of file channel_internal_api.c.

1160{
1161 if (which >= AST_VECTOR_SIZE(&chan->fds)) {
1162 return;
1163 }
1164
1165 AST_VECTOR_REPLACE(&chan->fds, which, -1);
1166}

References AST_VECTOR_REPLACE, AST_VECTOR_SIZE, and ast_channel::fds.

Referenced by handle_negotiated_sdp().

◆ ast_channel_internal_fd_clear_all()

void ast_channel_internal_fd_clear_all ( struct ast_channel chan)

Definition at line 1167 of file channel_internal_api.c.

1168{
1170}
#define AST_VECTOR_RESET(vec, cleanup)
Reset vector.
Definition: vector.h:625
#define AST_VECTOR_ELEM_CLEANUP_NOOP(elem)
Vector element cleanup that does nothing.
Definition: vector.h:571

References AST_VECTOR_ELEM_CLEANUP_NOOP, AST_VECTOR_RESET, and ast_channel::fds.

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 1146 of file channel_internal_api.c.

1147{
1148 int pos;
1149
1150 /* This ensures that if the vector has to grow with unused positions they will be
1151 * initialized to -1.
1152 */
1153 for (pos = AST_VECTOR_SIZE(&chan->fds); pos < which; pos++) {
1154 AST_VECTOR_REPLACE(&chan->fds, pos, -1);
1155 }
1156
1157 AST_VECTOR_REPLACE(&chan->fds, which, value);
1158}

References AST_VECTOR_REPLACE, AST_VECTOR_SIZE, ast_channel::fds, 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 1373 of file channel_internal_api.c.

1374{
1375 ast_assert(a->linkedid.creation_time != 0);
1376 ast_assert(b->linkedid.creation_time != 0);
1377
1378 if (a->linkedid.creation_time < b->linkedid.creation_time) {
1379 return a;
1380 }
1381 if (b->linkedid.creation_time < a->linkedid.creation_time) {
1382 return b;
1383 }
1384 if (a->linkedid.creation_unique < b->linkedid.creation_unique) {
1385 return a;
1386 }
1387 return b;
1388}
static struct test_val b
static struct test_val a

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 1451 of file channel_internal_api.c.

1452{
1453 ast_copy_string(chan->uniqueid.unique_id, uniqueid, sizeof(chan->uniqueid.unique_id));
1454 ast_copy_string(chan->linkedid.unique_id, linkedid, sizeof(chan->linkedid.unique_id));
1455}
struct ast_channel_id uniqueid

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 1433 of file channel_internal_api.c.

1434{
1435 struct stasis_forward *temp;
1436
1437 temp = a->endpoint_forward;
1438 a->endpoint_forward = b->endpoint_forward;
1439 b->endpoint_forward = temp;
1440}
Forwarding information.
Definition: stasis.c:1531

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 1442 of file channel_internal_api.c.

1443{
1444 struct ast_channel_snapshot *snapshot;
1445
1446 snapshot = a->snapshot;
1447 a->snapshot = b->snapshot;
1448 b->snapshot = snapshot;
1449}
Structure representing a snapshot of channel state.

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 1419 of file channel_internal_api.c.

1420{
1421 struct stasis_topic *topic;
1422 struct stasis_forward *forward;
1423
1424 topic = a->topic;
1425 a->topic = b->topic;
1426 b->topic = topic;
1427
1428 forward = a->channel_forward;
1429 a->channel_forward = b->channel_forward;
1430 b->channel_forward = forward;
1431}

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 1402 of file channel_internal_api.c.

1403{
1404 struct ast_channel_id temp;
1405
1406 /* This operation is used as part of masquerading and so does not invalidate the peer
1407 * segment. This is due to the masquerade process invalidating all segments.
1408 */
1409
1410 temp = a->uniqueid;
1411 a->uniqueid = b->uniqueid;
1412 b->uniqueid = temp;
1413
1414 temp = a->linkedid;
1415 a->linkedid = b->linkedid;
1416 b->linkedid = temp;
1417}
Channel UniqueId structure.

References a, 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 10544 of file channel.c.

10545{
10546 return ast_channel_internal_bridge(chan) != NULL;
10547}

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(), 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 10549 of file channel.c.

10550{
10551 int hangup_flags = ast_channel_softhangup_internal_flag(chan);
10552 int hangup_test = hangup_flags & AST_SOFTHANGUP_ASYNCGOTO;
10553 int unbridge = ast_channel_unbridged(chan);
10554
10555 /* This function should only return true if either the unbridged flag or
10556 * the ASYNCGOTO soft hangup flag is set and when no other soft hangup
10557 * flags are set. Any other soft hangup flags being set should make it
10558 * return false.
10559 */
10560 return ((hangup_test || unbridge) && (hangup_test == hangup_flags));
10561}
int ast_channel_unbridged(struct ast_channel *chan)
This function will check if the bridge needs to be re-evaluated due to external changes.

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 1629 of file channel_internal_api.c.

1630{
1631 return (chan && chan->tech && chan->tech->read_stream && chan->tech->write_stream);
1632}
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:753
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:747
const struct ast_channel_tech * tech

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 1031 of file channel_internal_api.c.

1032{
1033 int res;
1034
1035 ast_channel_lock(chan);
1037 ast_channel_unlock(chan);
1038 return res;
1039}
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 1026 of file channel_internal_api.c.

1027{
1028 return chan->is_t38_active;
1029}

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 1408 of file channel.c.

1409{
1410 struct ast_channel_iterator *i;
1411
1412 if (!(i = ast_calloc(1, sizeof(*i)))) {
1413 return NULL;
1414 }
1415
1418
1419 return i;
1420}
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
struct ao2_iterator simple_iterator
Definition: channel.c:1353
struct ao2_iterator * active_iterator
Definition: channel.c:1357

References ast_channel_iterator::active_iterator, ao2_iterator_init(), ast_calloc, channels, NULL, and ast_channel_iterator::simple_iterator.

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(), handle_show_hangup_all(), and handle_softhangup().

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

1369{
1370 struct ast_channel_iterator *i;
1371 char *l_exten = (char *) exten;
1372 char *l_context = (char *) context;
1373
1374 if (!(i = ast_calloc(1, sizeof(*i)))) {
1375 return NULL;
1376 }
1377
1379 l_context, l_exten, OBJ_MULTIPLE);
1380 if (!i->active_iterator) {
1381 ast_free(i);
1382 return NULL;
1383 }
1384
1385 return i;
1386}

References ast_channel_iterator::active_iterator, ast_calloc, ast_channel_by_exten_cb(), ast_channel_callback(), ast_free, voicemailpwcheck::context, NULL, and OBJ_MULTIPLE.

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 1388 of file channel.c.

1389{
1390 struct ast_channel_iterator *i;
1391 char *l_name = (char *) name;
1392
1393 if (!(i = ast_calloc(1, sizeof(*i)))) {
1394 return NULL;
1395 }
1396
1398 l_name, &name_len,
1399 OBJ_MULTIPLE | (name_len == 0 /* match the whole word, so optimize */ ? OBJ_KEY : 0));
1400 if (!i->active_iterator) {
1401 ast_free(i);
1402 return NULL;
1403 }
1404
1405 return i;
1406}

References ast_channel_iterator::active_iterator, ast_calloc, ast_channel_by_name_cb(), ast_channel_callback(), ast_free, name, NULL, OBJ_KEY, and OBJ_MULTIPLE.

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 1360 of file channel.c.

1361{
1363 ast_free(i);
1364
1365 return NULL;
1366}
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.

References ast_channel_iterator::active_iterator, ao2_iterator_destroy(), ast_free, 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(), handle_softhangup(), 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 1422 of file channel.c.

1423{
1425}
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911

References ast_channel_iterator::active_iterator, and ao2_iterator_next.

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(), handle_softhangup(), 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 925 of file channel_internal_api.c.

926{
927 chan->jb = *value;
928}

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(), ast_app_getdata_full(), ast_app_getdata_terminator(), ast_ari_channels_dial(), ast_moh_files_next(), 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(), isAnsweringMachine(), leave_voicemail(), limits_interval_playback(), meetme_menu_admin(), meetme_menu_admin_extended(), meetme_menu_normal(), minivm_greet_exec(), 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(), and wait_for_winner().

◆ ast_channel_lastcontext()

const char * ast_channel_lastcontext ( const struct ast_channel chan)

Definition at line 346 of file channel_internal_api.c.

347{
348 return chan->lastcontext;
349}

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 363 of file channel_internal_api.c.

364{
365 return chan->lastexten;
366}

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 6719 of file channel.c.

6720{
6721 /*
6722 * Set up translation from the peer to the chan first in case we
6723 * need to hear any in-band tones and the other direction fails.
6724 */
6725 if (ast_channel_make_compatible_helper(peer, chan)) {
6726 return -1;
6727 }
6728
6729 /* Set up translation from the chan to the peer */
6730 if (ast_channel_make_compatible_helper(chan, peer)) {
6731 return -1;
6732 }
6733
6734 return 0;
6735}
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:6640

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 590 of file channel_internal_api.c.

591{
592 return chan->masq;
593}
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 594 of file channel_internal_api.c.

595{
596 chan->masq = value;
597}

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 598 of file channel_internal_api.c.

599{
600 return chan->masqr;
601}
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 602 of file channel_internal_api.c.

603{
604 chan->masqr = value;
605}

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 10665 of file channel.c.

10666{
10667 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
10669
10670 if (dest == source) {
10671 ast_log(LOG_WARNING, "Can't move channel '%s' into itself!\n",
10672 ast_channel_name(dest));
10673 return -1;
10674 }
10675
10676 ast_channel_lock_both(dest, source);
10677
10680 /* Zombies! Run! */
10682 "Can't move channel. One or both is dead (%s <-- %s)\n",
10683 ast_channel_name(dest), ast_channel_name(source));
10684 ast_channel_unlock(source);
10685 ast_channel_unlock(dest);
10686 return -1;
10687 }
10688
10689 ast_channel_masq_set(dest, source);
10690 ast_channel_masqr_set(source, dest);
10691
10692 blob = ast_json_pack("{s: s}",
10693 "newchanneluniqueid", ast_channel_uniqueid(dest));
10695
10696 ast_channel_unlock(dest);
10697 ast_channel_unlock(source);
10698
10699 channel_do_masquerade(dest, source);
10700 return 0;
10701}
ast_mutex_t lock
Definition: app_sla.c:331
static void channel_do_masquerade(struct ast_channel *original, struct ast_channel *clonechan)
Masquerade a channel.
Definition: channel.c:6856
static ast_mutex_t channel_move_lock
Definition: channel.c:10663
const char * ast_channel_uniqueid(const struct ast_channel *chan)
void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value)
void ast_channel_masq_set(struct ast_channel *chan, struct ast_channel *value)
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:589
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 551 of file channel_internal_api.c.

552{
553 chan->music_state = value;
554}

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(), _dahdi_get_index(), 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(), 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_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(), append_channel_vars(), aqm_exec(), ari_bridges_play_new(), ari_originate_dial(), assign_uuid(), ast_agi_send(), ast_answer(), 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_by_name_cb(), 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_hash_cb(), ast_channel_inherit_variables(), ast_channel_log(), ast_channel_make_compatible_helper(), ast_channel_move(), ast_channel_nativeformats_set(), 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_moh_files_next(), 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_vs_ctx_create(), ast_str_retrieve_variable(), ast_streamfile(), 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_run(), 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_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(), 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_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(), comeback_goto(), common_exec(), complete_bridge_participant(), complete_confbridge_participant(), conf_exec(), conf_play(), conf_queue_dtmf(), 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(), deactivate_silence_generator(), defer_action(), defer_incoming_sdp_stream(), 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_monitor(), do_waiting(), does_id_conflict(), 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(), func_channel_read(), func_channels_read(), func_confbridge_channels(), func_get_parkingslot_channel(), func_read_header(), func_read_headers(), func_read_param(), func_response_read_header(), func_response_read_headers(), func_write_header(), func_write_param(), fxo_pvt(), 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_dump_frames(), handle_frame(), handle_gosub(), handle_incoming_request(), handle_participant_join(), handle_recordfile(), handle_showchan(), handle_softhangup(), handle_streamfile(), hangup(), 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(), 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(), 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_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(), 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(), play_moh_exec(), play_on_channel(), playback_exec(), playtones_alloc(), pre_bridge_setup(), print_escaped_uri(), print_queue(), prnt_channel_key(), publish_app_cdr_message(), publish_transfer_fail(), publish_transfer_success(), publish_transfer_threeway(), queue_exec(), queue_function_queuegetchannel(), read_mf_digits(), read_pjsip(), read_sf_digits(), readexten_exec(), realtime_exec(), receive_dtmf_digits(), receivefax_exec(), receivefax_t38_init(), record_exec(), refer_attended_task(), refer_blind_callback(), 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_hold_intercept(), 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_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_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(), 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_qe_rule(), user_chan_cb(), wait_exec(), wait_for_answer(), wait_for_signal_or_hangup(), wait_for_winner(), waitsignal_exec(), waitstream_control(), waitstream_core(), 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 6838 of file channel.c.

6839{
6840 char *dash;
6841
6842 /* Truncate after the dash */
6843 dash = strrchr(channel_name, '-');
6844 if (dash) {
6845 *dash = '\0';
6846 }
6847}

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 1075 of file channel_internal_api.c.

1076{
1077 return chan->named_callgroups;
1078}
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 
)

Definition at line 1079 of file channel_internal_api.c.

1080{
1083}
struct ast_namedgroups * ast_ref_namedgroups(struct ast_namedgroups *groups)
Definition: channel.c:7737
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
Definition: channel.c:7731

References ast_ref_namedgroups(), ast_unref_namedgroups(), ast_channel::named_callgroups, and value.

Referenced by ast_channel_destructor(), chan_pjsip_new(), dahdi_new(), and func_channel_write_real().

◆ ast_channel_named_pickupgroups()

struct ast_namedgroups * ast_channel_named_pickupgroups ( const struct ast_channel chan)

Definition at line 1084 of file channel_internal_api.c.

1085{
1086 return chan->named_pickupgroups;
1087}
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 662 of file channel_internal_api.c.

664{
665 SCOPE_ENTER(2, "%s: %sFormats: %s\n", S_OR(ast_channel_name(chan), "<initializing>"),
666 S_COR(ast_channel_is_multistream(chan), "Multistream", ""),
668
669 ast_assert(chan != NULL);
670
672
673 /* If chan->stream_topology is NULL, the channel is being destroyed
674 * and topology is destroyed.
675 */
676 if (!chan->stream_topology) {
677 SCOPE_EXIT_RTN("Channel is being initialized or destroyed\n");
678 }
679
680 if (!ast_channel_is_multistream(chan) || !value) {
681 struct ast_stream_topology *new_topology;
682
685 SCOPE_EXIT_RTN("New %stopology set\n", value ? "" : "empty ");
686 }
687 SCOPE_EXIT_RTN("Set native formats but not topology\n");
688}
#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:848
#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_unreal_new_channels(), audiosocket_request(), chan_pjsip_new(), chan_pjsip_read_stream(), channel_do_masquerade(), console_new(), dahdi_new(), do_notify(), 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(), and unistim_rtp_read().

◆ 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 829 of file channel_internal_api.c.

830{
831 return chan->oldwriteformat;
832}
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 531 of file channel_internal_api.c.

532{
533 return chan->outsmpl;
534}
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 535 of file channel_internal_api.c.

536{
537 chan->outsmpl = value;
538}

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 1071 of file channel_internal_api.c.

1072{
1073 chan->pickupgroup = value;
1074}

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 7441 of file channel.c.

7442{
7443 int res;
7444
7445 ast_channel_lock(chan);
7446 if (!ast_channel_tech(chan)->queryoption) {
7447 errno = ENOSYS;
7448 ast_channel_unlock(chan);
7449 return -1;
7450 }
7451
7452 if (block)
7453 ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7454
7455 res = ast_channel_tech(chan)->queryoption(chan, option, data, datalen);
7456 ast_channel_unlock(chan);
7457
7458 return res;
7459}
#define LOG_ERROR
int(*const queryoption)(struct ast_channel *chan, int option, void *data, int *datalen)
Query a given option. Called with chan locked.
Definition: channel.h:780

References ast_channel_lock, ast_channel_tech(), 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 9105 of file channel.c.

9106{
9107 unsigned char data[1024]; /* This should be large enough */
9108 size_t datalen;
9109
9110 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9111 if (datalen == (size_t) -1) {
9112 return;
9113 }
9114
9116}
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:1238
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:8696
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

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 10296 of file channel.c.

10297{
10298 unsigned char data[1024]; /* This should be large enough */
10299 size_t datalen;
10300
10301 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10302 if (datalen == (size_t) -1) {
10303 return;
10304 }
10305
10306 ast_queue_control_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10307}
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:9267

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 742 of file channel_internal_api.c.

743{
744 chan->readtrans = value;
745}

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 5825 of file channel.c.

5826{
5827 switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
5828 {
5829 case 0:
5830 return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
5831 case AST_CONTROL_HANGUP:
5832 return "Hangup";
5833 case AST_CONTROL_RING:
5834 return "Local Ring";
5836 return "Remote end Ringing";
5837 case AST_CONTROL_ANSWER:
5838 return "Remote end has Answered";
5839 case AST_CONTROL_BUSY:
5840 return "Remote end is Busy";
5842 return "Congestion (circuits busy)";
5843 default:
5844 return "Unknown Reason!!";
5845 }
5846}
@ AST_CONTROL_RING

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 901 of file channel_internal_api.c.

902{
904}
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:536
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:527

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 897 of file channel_internal_api.c.

898{
900}
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward)
Definition: channel.h:524
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:533

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 905 of file channel_internal_api.c.

906{
907 return ast_party_id_merge(&chan->redirecting.to, &chan->redirecting.priv_to);
908}
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation.
Definition: channel.h:539
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:530

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 10382 of file channel.c.

10383{
10384 const char *sub;
10385 const char *sub_args;
10386 int retval;
10387
10388 ast_channel_lock(sub_chan);
10389 sub = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB");
10390 sub = ast_strdupa(S_OR(sub, ""));
10391 sub_args = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB_ARGS");
10392 sub_args = ast_strdupa(S_OR(sub_args, ""));
10393
10394 if (ast_strlen_zero(sub)) {
10395 ast_channel_unlock(sub_chan);
10396 return -1;
10397 }
10398
10399 if (is_frame) {
10400 const struct ast_frame *frame = redirecting_info;
10401
10403 } else {
10404 const struct ast_party_redirecting *redirecting = redirecting_info;
10405
10407 }
10408 ast_channel_unlock(sub_chan);
10409
10411 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10413 if (!retval) {
10414 struct ast_party_redirecting saved_redirecting;
10415
10416 ast_party_redirecting_init(&saved_redirecting);
10417 ast_channel_lock(sub_chan);
10418 ast_party_redirecting_copy(&saved_redirecting, ast_channel_redirecting(sub_chan));
10419 ast_channel_unlock(sub_chan);
10420 ast_channel_update_redirecting(sub_chan, &saved_redirecting, NULL);
10421 ast_party_redirecting_free(&saved_redirecting);
10422 }
10423
10424 return retval;
10425}
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition: channel.c:2122
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:10283
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:9478
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2179
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition: channel.h:522

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, retval, S_OR, and sub.

Referenced by bridge_channel_handle_control(), call_forward_inherit(), do_forward(), handle_frame(), 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 539 of file channel.c.

540{
541 struct chanlist *chan;
542
544
546 if (!strcasecmp(tech->type, chan->tech->type)) {
547 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
549 return -1;
550 }
551 }
552
553 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
555 return -1;
556 }
557 chan->tech = tech;
559
560 ast_debug(5, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
561
562 ast_verb(5, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
563
565
566 return 0;
567}
#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.
Definition: linkedlists.h:151
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:494
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:718
const char *const type
Definition: channel.h:629
const char *const description
Definition: channel.h:630
the list of registered channel types
Definition: channel.c:121
struct ast_channel * chan
Definition: app_dial.c:799
const char * tech
Definition: app_dial.c:803
struct chanlist::@329 list

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(), 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 1584 of file channel.c.

1585{
1586 /* Safe, even if already unlinked. */
1587 ao2_unlink(channels, chan);
1588 return ast_channel_unref(chan);
1589}
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2958

References ao2_unlink, ast_channel_unref, and channels.

Referenced by ast_iax2_new(), ast_unreal_new_channels(), destroy_msg_q_chan(), do_notify(), rec_request(), 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 6433 of file channel.c.

6434{
6435 channel_req_accountcodes(chan, requestor, relationship, 0);
6436}
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:6375

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 6438 of file channel.c.

6439{
6440 channel_req_accountcodes(chan, requestor, relationship, 1);
6441}

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 10965 of file channel.c.

10967{
10968 int res;
10969
10970 ast_assert(chan != NULL);
10971 ast_assert(topology != NULL);
10972
10973 ast_channel_lock(chan);
10975 ast_channel_unlock(chan);
10976 return -1;
10977 }
10978
10980 ast_debug(2, "%s: Topologies already match. Current: %s Requested: %s\n",
10981 ast_channel_name(chan),
10983 ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
10984 ast_channel_unlock(chan);
10985 return 0;
10986 }
10987
10989
10990 res = ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, topology, sizeof(topology));
10991 ast_channel_unlock(chan);
10992 return res;
10993}
static int indicate(void *data)
Definition: chan_pjsip.c:1334
struct ast_stream_topology * ast_channel_get_stream_topology(const struct ast_channel *chan)
Retrieve the topology of streams on a channel.
int ast_channel_is_multistream(struct ast_channel *chan)
Determine if a channel is multi-stream capable.
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:936
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:696
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:771

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_tech(), 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(), 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 443 of file channel_internal_api.c.

444{
445 return chan->rings;
446}

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 718 of file channel_internal_api.c.

719{
720 chan->sched = value;
721}

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 6627 of file channel.c.

6628{
6629 if (ast_channel_tech(chan)->send_html)
6630 return ast_channel_tech(chan)->send_html(chan, subclass, data, datalen);
6631 return -1;
6632}
int(*const send_html)(struct ast_channel *chan, int subclass, const char *data, int len)
Send HTML data.
Definition: channel.h:762

References ast_channel_tech(), and 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)

◆ ast_channel_sending_dtmf_digit_set()

void ast_channel_sending_dtmf_digit_set ( struct ast_channel chan,
char  value 
)

Definition at line 390 of file channel_internal_api.c.

391{
393}

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 395 of file channel_internal_api.c.

396{
397 return chan->sending_dtmf_tv;
398}
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 399 of file channel_internal_api.c.

400{
401 chan->sending_dtmf_tv = value;
402}

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 6634 of file channel.c.

6635{
6636 return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
6637}
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:6627
#define AST_HTML_URL
static char url[512]

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 7891 of file channel.c.

7892{
7893 channel_set_external_vars(&ari_vars, varc, vars);
7894}
static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
Definition: channel.c:7864

References ari_vars, and channel_set_external_vars().

Referenced by channelvars_handler().

◆ 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 7358 of file channel.c.

7359{
7360 if (ast_channel_caller(chan) == caller) {
7361 /* Don't set to self */
7362 return;
7363 }
7364
7365 ast_channel_lock(chan);
7368 ast_channel_unlock(chan);
7369}
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:2007
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)

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 7371 of file channel.c.

7372{
7373 if (ast_channel_caller(chan) == caller) {
7374 /* Don't set to self */
7375 return;
7376 }
7377
7378 ast_channel_lock(chan);
7382 ast_channel_unlock(chan);
7383}

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 8307 of file channel.c.

8308{
8309 if (ast_channel_connected(chan) == connected) {
8310 /* Don't set to self */
8311 return;
8312 }
8313
8314 ast_channel_lock(chan);
8318 ast_channel_unlock(chan);
8319}
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:2054

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 11026 of file channel.c.

11027{
11028 ast_channel_lock(chan);
11030 ast_channel_unlock(chan);
11031}

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 1046 of file channel_internal_api.c.

1047{
1048 ast_channel_lock(chan);
1049 ast_channel_set_is_t38_active_nolock(chan, is_t38_active);
1050 ast_channel_unlock(chan);
1051}
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 1041 of file channel_internal_api.c.

1042{
1043 chan->is_t38_active = !!is_t38_active;
1044}

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 7886 of file channel.c.

7887{
7888 channel_set_external_vars(&ami_vars, varc, vars);
7889}

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 809 of file channel_internal_api.c.

810{
811 ao2_replace(chan->oldwriteformat, format);
812}

References ao2_replace, and ast_channel::oldwriteformat.

Referenced by ast_channel_destructor(), and ast_openstream_full().

◆ 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 9118 of file channel.c.

9119{
9120 if (ast_channel_redirecting(chan) == redirecting) {
9121 /* Don't set to self */
9122 return;
9123 }
9124
9125 ast_channel_lock(chan);
9129 ast_channel_unlock(chan);
9130}
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:2166

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 1577 of file channel_internal_api.c.

1579{
1580 struct ast_stream_topology *new_topology;
1581 SCOPE_ENTER(1, "%s: %s\n", ast_channel_name(chan),
1582 ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
1583
1584 ast_assert(chan != NULL);
1585
1586 /* A non-MULTISTREAM channel can't manipulate topology directly */
1588
1589 /* Unless the channel is being destroyed, we always want a topology on
1590 * it even if its empty.
1591 */
1592 if (!topology) {
1593 new_topology = ast_stream_topology_alloc();
1594 } else {
1595 new_topology = topology;
1596 }
1597
1598 if (new_topology) {
1599 ast_channel_internal_set_stream_topology(chan, new_topology);
1600 }
1601
1602 SCOPE_EXIT_RTN_VALUE(new_topology, "Used %s topology\n", topology ? "provided" : "empty");
1603}
#define SCOPE_EXIT_RTN_VALUE(__return_value,...)
struct ast_stream_topology * ast_stream_topology_alloc(void)
Create a stream topology.
Definition: stream.c:650

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_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 1019 of file channel_internal_api.c.

1020{
1021 ast_channel_lock(chan);
1023 ast_channel_unlock(chan);
1024}
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 1013 of file channel_internal_api.c.

1014{
1015 chan->unbridged = !!value;
1017}
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:1139
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 7421 of file channel.c.

7422{
7423 int res;
7424
7425 ast_channel_lock(chan);
7426 if (!ast_channel_tech(chan)->setoption) {
7427 errno = ENOSYS;
7428 ast_channel_unlock(chan);
7429 return -1;
7430 }
7431
7432 if (block)
7433 ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7434
7435 res = ast_channel_tech(chan)->setoption(chan, option, data, datalen);
7436 ast_channel_unlock(chan);
7437
7438 return res;
7439}
int(*const setoption)(struct ast_channel *chan, int option, void *data, int datalen)
Set a given option. Called with chan locked.
Definition: channel.h:777

References ast_channel_lock, ast_channel_tech(), 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(), 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 510 of file channel.c.

511{
512 if (ast_tvzero(offset)) {
513 ast_channel_whentohangup_set(chan, &offset);
514 } else {
515 struct timeval tv = ast_tvadd(offset, ast_tvnow());
517 }
519 return;
520}
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:1139
void ast_channel_whentohangup_set(struct ast_channel *chan, struct timeval *value)

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 1634 of file channel_internal_api.c.

1635{
1636 return chan->snapshot;
1637}
struct ast_channel_snapshot * snapshot

References ast_channel::snapshot.

Referenced by aoc_publish_blob(), ast_channel_blob_create(), ast_channel_snapshot_create(), and channel_snapshot_update_create().

◆ 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 1639 of file channel_internal_api.c.

1640{
1641 ao2_cleanup(chan->snapshot);
1642 chan->snapshot = ao2_bump(snapshot);
1643}
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480

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 994 of file channel_internal_api.c.

995{
996 chan ->softhangup &= ~value;
997}

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 986 of file channel_internal_api.c.

987{
988 chan->softhangup = value;
989}

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 468 of file channel.c.

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

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 8163 of file channel.c.

8164{
8166
8167 if (!(state = ast_calloc(1, sizeof(*state)))) {
8168 return NULL;
8169 }
8170
8171 state->old_write_format = ao2_bump(ast_channel_writeformat(chan));
8172
8173 if (ast_set_write_format(chan, ast_format_slin) < 0) {
8174 ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
8175 ast_free(state);
8176 return NULL;
8177 }
8178
8180
8181 ast_debug(1, "Started silence generator on '%s'\n", ast_channel_name(chan));
8182
8183 return state;
8184}
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition: channel.c:2951
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5802
static struct ast_generator silence_generator
Definition: channel.c:8153
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41

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, silence_generator, and state.

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 774 of file channel_internal_api.c.

775{
776 return chan->state;
777}
enum ast_channel_state state

References ast_channel::state.

◆ ast_channel_state_set()

void ast_channel_state_set ( struct ast_channel chan,
enum  ast_channel_state 
)

Definition at line 805 of file channel_internal_api.c.

806{
807 chan->state = value;
808}

References ast_channel::state, and value.

Referenced by __ast_channel_alloc_ap(), ast_setstate(), AST_TEST_DEFINE(), and channel_do_masquerade().

◆ 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 8209 of file channel.c.

8210{
8211 if (!state) {
8212 return;
8213 }
8214
8215 if (deactivate_silence_generator(chan)) {
8216 ast_debug(1, "Stopped silence generator on '%s'\n", ast_channel_name(chan));
8217 if (ast_set_write_format(chan, state->old_write_format) < 0) {
8218 ast_log(LOG_ERROR, "Could not return write format to its original state\n");
8219 }
8220 }
8221 ao2_cleanup(state->old_write_format);
8222 ast_free(state);
8223}
static int deactivate_silence_generator(struct ast_channel *chan)
Definition: channel.c:8186

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 10995 of file channel.c.

10996{
10997 ast_assert(chan != NULL);
10998 ast_assert(topology != NULL);
10999
11001 return -1;
11002 }
11003
11004 return ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, topology, sizeof(topology));
11005}
@ AST_CONTROL_STREAM_TOPOLOGY_CHANGED

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

Referenced by __ast_read(), 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 11007 of file channel.c.

11008{
11009 int res;
11010 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_STREAM_TOPOLOGY_CHANGED };
11011
11012 ast_assert(chan != NULL);
11013
11014 if (!ast_channel_is_multistream(chan)) {
11015 return -1;
11016 }
11017
11018 ast_channel_lock(chan);
11020 res = ast_queue_frame(chan, &f);
11021 ast_channel_unlock(chan);
11022
11023 return res;
11024}
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:221

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, and NULL.

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 451 of file channel_internal_api.c.

452{
453 return chan->streamid;
454}

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 455 of file channel_internal_api.c.

456{
457 chan->streamid = value;
458}

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 4359 of file channel.c.

4360{
4361 if (!strcasecmp(flag, "default"))
4362 return DEFAULT_AMA_FLAGS;
4363 if (!strcasecmp(flag, "omit"))
4364 return AST_AMA_OMIT;
4365 if (!strcasecmp(flag, "billing"))
4366 return AST_AMA_BILLING;
4367 if (!strcasecmp(flag, "documentation"))
4368 return AST_AMA_DOCUMENTATION;
4369 return AST_AMA_NONE;
4370}
#define DEFAULT_AMA_FLAGS
Definition: channel.c:108

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(), 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 6622 of file channel.c.

6623{
6624 return (ast_channel_tech(chan)->send_html) ? 1 : 0;
6625}

References ast_channel_tech().

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 10776 of file channel.c.

10777{
10778 struct suppress_data *suppress;
10779 const struct ast_datastore_info *datastore_info = NULL;
10780 struct ast_datastore *datastore = NULL;
10781 struct ast_framehook_interface interface = {
10783 .event_cb = suppress_framehook_event_cb,
10784 .destroy_cb = suppress_framehook_destroy_cb,
10785 .chan_fixup_cb = suppress_framehook_fixup_cb,
10786 };
10787 int framehook_id;
10788
10789 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10790 ast_log(LOG_WARNING, "Attempted to suppress an unsupported frame type (%u).\n", frametype);
10791 return -1;
10792 }
10793
10794 if ((datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10795 suppress = datastore->data;
10796 suppress->direction |= direction;
10797 return 0;
10798 }
10799
10800 if (!(suppress = ao2_alloc(sizeof(*suppress), NULL))) {
10801 ast_log(LOG_WARNING, "Failed to allocate data while attempting to suppress a stream.\n");
10802 return -1;
10803 }
10804
10805 suppress->frametype = frametype;
10806 suppress->direction |= direction;
10807
10808 interface.data = suppress;
10809
10810 framehook_id = ast_framehook_attach(chan, &interface);
10811 if (framehook_id < 0) {
10812 /* Hook attach failed. Get rid of the evidence. */
10813 ast_log(LOG_WARNING, "Failed to attach framehook while attempting to suppress a stream.\n");
10814 ao2_ref(suppress, -1);
10815 return -1;
10816 }
10817
10818 /* One ref for the framehook */
10819 ao2_ref(suppress, +1);
10820
10821 suppress->framehook_id = framehook_id;
10822
10823 if (!(datastore = ast_datastore_alloc(datastore_info, NULL))) {
10824 ast_log(LOG_WARNING, "Failed to allocate datastore while attempting to suppress a stream.\n");
10825 ast_framehook_detach(chan, framehook_id);
10826 ao2_ref(suppress, -1);
10827 return -1;
10828 }
10829
10830 /* the ref provided by the allocation is taken by the datastore */
10831 datastore->data = suppress;
10832
10833 ast_channel_datastore_add(chan, datastore);
10834
10835 return 0;
10836}
static void suppress_framehook_fixup_cb(void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
Definition: channel.c:10724
static const struct ast_datastore_info * suppress_get_datastore_information(enum ast_frame_type frametype)
Definition: channel.c:10766
static void suppress_framehook_destroy_cb(void *data)
Definition: channel.c:10713
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:10731
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
direction
Structure for a data store type.
Definition: datastore.h:31
int framehook_id
Definition: channel.c:10721
enum ast_frame_type frametype
Definition: channel.c:10719
unsigned int direction
Definition: channel.c:10720

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 754 of file channel_internal_api.c.

755{
756 return chan->tech;
757}

References ast_channel::tech.

Referenced by __ast_read(), acf_channel_read(), analog_ss_thread(), ast_ari_channels_rtpstatistics(), ast_call(), ast_channel_early_bridge(), ast_channel_queryoption(), ast_channel_request_stream_topology_change(), ast_channel_sendhtml(), ast_channel_setoption(), ast_channel_snapshot_create(), ast_channel_stream_topology_changed(), ast_channel_supports_html(), ast_hangup(), ast_jb_do_usecheck(), ast_pre_call(), ast_raw_answer_with_stream_topology(), ast_rtp_dtmf_compatible(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), ast_rtp_instance_make_compatible(), ast_send_image(), ast_senddigit(), ast_senddigit_begin(), ast_senddigit_end(), ast_senddigit_external(), ast_senddigit_mf(), ast_sendtext_data(), ast_supports_images(), ast_transfer_protocol(), ast_var_channel_types_table(), ast_var_channels_table(), ast_write_stream(), ast_write_video(), channel_do_masquerade(), channel_sanitizer(), channel_snapshot_base_create(), conf_run(), dahdi_setoption(), flash_exec(), func_channel_read(), func_channel_write_real(), function_iaxpeer(), function_ooh323_read(), function_ooh323_write(), fxo_pvt(), generate_status(), handle_showchan(), iax2_prov_app(), indicate_data_internal(), my_get_sigpvt_bridged_channel(), native_bridge_is_capable(), 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(), push_notify_channel(), rtp_glue_data_get(), sendtext_exec(), serialize_showchan(), setup_env(), softhangup_exec(), t38_masq(), tech_write(), transfer_exec(), and try_calling().

◆ ast_channel_tech_pvt()

void * ast_channel_tech_pvt ( const struct ast_channel chan)

Definition at line 555 of file channel_internal_api.c.

556{
557 return chan->tech_pvt;
558}

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_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_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(), 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(), fxo_pvt(), 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(), 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(), and unistim_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_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 726 of file channel_internal_api.c.

727{
728 chan->timer = value;
729}

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 566 of file channel_internal_api.c.

567{
568 return chan->timingdata;
569}

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 570 of file channel_internal_api.c.

571{
572 chan->timingdata = value;
573}

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 463 of file channel_internal_api.c.

464{
465 chan->timingfd = value;
466}

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 1220 of file channel_internal_api.c.

1221{
1222 chan->timingfunc = value;
1223}

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 1488 of file channel_internal_api.c.

1489{
1490 if (!chan) {
1491 return ast_channel_topic_all();
1492 }
1493
1494 return chan->topic;
1495}
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_TEST_DEFINE(), 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_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 1004 of file channel_internal_api.c.

1005{
1006 int res;
1007 ast_channel_lock(chan);
1008 res = ast_channel_unbridged_nolock(chan);
1009 ast_channel_unlock(chan);
1010 return res;
1011}
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 999 of file channel_internal_api.c.

1000{
1001 return chan->unbridged;
1002}

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 1271 of file channel.c.

1272{
1273 if (chan) {
1275 }
1276}
void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag)
Clear a flag on a channel.
Definition: channel.c:11033

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 303 of file channel_internal_api.c.

304{
305 ast_assert(chan->uniqueid.unique_id[0] != '\0');
306 return chan->uniqueid.unique_id;
307}

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

Referenced by __ast_change_name_nolink(), 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_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_by_uniqueid_cb(), ast_channel_log(), ast_channel_move(), ast_channel_publish_cached_blob(), ast_channel_publish_dial_internal(), ast_do_pickup(), ast_endpoint_add_channel(), ast_str_retrieve_variable(), 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(), call(), chan_pjsip_fixup(), chan_pjsip_indicate(), chan_pjsip_new(), chan_pjsip_session_end(), channel_replaced_cb(), channel_snapshot_base_create(), conf_rec_name(), conf_run(), conf_send_event_to_participants(), create_parked_subscription_full(), 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(), 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 10528 of file channel.c.

10529{
10530 ao2_unlink(channels, chan);
10531}

References ao2_unlink, and channels.

Referenced by 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 570 of file channel.c.

571{
572 struct chanlist *chan;
573
574 ast_debug(5, "Unregistering channel type '%s'\n", tech->type);
575
577
579 if (chan->tech == tech) {
581 ast_free(chan);
582 ast_verb(5, "Unregistered channel type '%s'\n", tech->type);
583 break;
584 }
585 }
587
589}
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:545

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(), channels_shutdown(), load_module(), local_shutdown(), 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 10838 of file channel.c.

10839{
10840 const struct ast_datastore_info *datastore_info = NULL;
10841 struct ast_datastore *datastore = NULL;
10842 struct suppress_data *suppress;
10843
10844 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10845 ast_log(LOG_WARNING, "Attempted to unsuppress an unsupported frame type (%u).\n", frametype);
10846 return -1;
10847 }
10848
10849 if (!(datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10850 /* Nothing to do! */
10851 return 0;
10852 }
10853
10854 suppress = datastore->data;
10855
10856 suppress->direction &= ~(direction);
10857
10858 if (suppress->direction == 0) {
10859 /* Nothing left to suppress. Bye! */
10860 ast_framehook_detach(chan, suppress->framehook_id);
10861 ast_channel_datastore_remove(chan, datastore);
10862 ast_datastore_free(datastore);
10863 }
10864
10865 return 0;
10866}
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition: channel.c:2394
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 9092 of file channel.c.

9093{
9094 unsigned char data[1024]; /* This should be large enough */
9095 size_t datalen;
9096
9097 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9098 if (datalen == (size_t) -1) {
9099 return;
9100 }
9101
9102 ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
9103}
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:4652

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(), 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 10283 of file channel.c.

10284{
10285 unsigned char data[1024]; /* This should be large enough */
10286 size_t datalen;
10287
10288 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10289 if (datalen == (size_t) -1) {
10290 return;
10291 }
10292
10293 ast_indicate_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10294}

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 957 of file channel_internal_api.c.

958{
959 chan->varshead = *value;
960}

References value, and ast_channel::varshead.

◆ ast_channel_visible_indication()

int ast_channel_visible_indication ( const struct ast_channel chan)

Definition at line 467 of file channel_internal_api.c.

468{
469 return chan->visible_indication;
470}

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 471 of file channel_internal_api.c.

472{
474}

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 614 of file channel_internal_api.c.

615{
616 return chan->vstream;
617}
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 618 of file channel_internal_api.c.

619{
620 chan->vstream = value;
621}

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 483 of file channel_internal_api.c.

484{
485 return chan->vstreamid;
486}

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 487 of file channel_internal_api.c.

488{
489 chan->vstreamid = value;
490}

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

954{
955 chan->whentohangup = *value;
956}

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 750 of file channel_internal_api.c.

751{
752 chan->writetrans = value;
753}

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 10592 of file channel.c.

10593{
10594 struct ast_channel *yanked_chan;
10595 struct {
10596 char *accountcode;
10597 char *exten;
10598 char *context;
10599 char *name;
10600 int amaflags;
10601 int priority;
10602 struct ast_format *readformat;
10603 struct ast_format *writeformat;
10604 } my_vars = { 0, };
10605
10606 ast_channel_lock(yankee);
10607 my_vars.accountcode = ast_strdupa(ast_channel_accountcode(yankee));
10608 my_vars.exten = ast_strdupa(ast_channel_exten(yankee));
10609 my_vars.context = ast_strdupa(ast_channel_context(yankee));
10610 my_vars.name = ast_strdupa(ast_channel_name(yankee));
10611 my_vars.amaflags = ast_channel_amaflags(yankee);
10612 my_vars.priority = ast_channel_priority(yankee);
10613 /* The priority as returned by ast_channel_yank is where the channel
10614 * should go if the dialplan is executed on it. If the channel is
10615 * already executing dialplan then the priority currently set is
10616 * where it is currently. We increment it so it becomes where it should
10617 * execute.
10618 */
10620 my_vars.priority++;
10621 }
10622 my_vars.writeformat = ao2_bump(ast_channel_writeformat(yankee));
10623 my_vars.readformat = ao2_bump(ast_channel_readformat(yankee));
10624 ast_channel_unlock(yankee);
10625
10626 /* Do not hold any channel locks while calling channel_alloc() since the function
10627 * locks the channel container when linking the new channel in. */
10628 if (!(yanked_chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, my_vars.accountcode,
10629 my_vars.exten, my_vars.context, NULL, yankee, my_vars.amaflags,
10630 "Surrogate/%s", my_vars.name))) {
10631 ao2_cleanup(my_vars.writeformat);
10632 ao2_cleanup(my_vars.readformat);
10633 return NULL;
10634 }
10635
10636 /* Make formats okay */
10637 ast_channel_set_readformat(yanked_chan, my_vars.readformat);
10638 ast_channel_set_writeformat(yanked_chan, my_vars.writeformat);
10639 ao2_cleanup(my_vars.readformat);
10640 ao2_cleanup(my_vars.writeformat);
10641 ast_channel_priority_set(yanked_chan, my_vars.priority);
10642
10643 ast_channel_unlock(yanked_chan);
10644
10645 if (ast_channel_move(yanked_chan, yankee)) {
10646 ast_hangup(yanked_chan);
10647 return NULL;
10648 }
10649
10650 return yanked_chan;
10651}
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:10665
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
Definition: channel.h:1258
int ast_channel_priority(const struct ast_channel *chan)
const char * ast_channel_accountcode(const struct ast_channel *chan)
enum ama_flags ast_channel_amaflags(const struct ast_channel *chan)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
const char * ast_channel_exten(const struct ast_channel *chan)
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
@ AST_STATE_DOWN
Definition: channelstate.h:36
const ast_string_field accountcode
const ast_string_field name
Definition of a media format.
Definition: format.c:43

References ast_channel::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, ast_channel::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 734 of file channel_internal_api.c.

735{
736 chan->zone = value;
737}

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 188 of file channel.c.

189{
190 struct chanlist *cl;
191 struct ast_variable *var = NULL, *prev = NULL;
192
194 AST_RWLIST_TRAVERSE(&backends, cl, list) {
195 if (prev) {
196 if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description, "")))
197 prev = prev->next;
198 } else {
199 var = ast_variable_new(cl->tech->type, cl->tech->description, "");
200 prev = var;
201 }
202 }
204
205 return var;
206}
#define ast_variable_new(name, value, filename)
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:78
Structure for variables, used for configurations and for channel variables.

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 445 of file channel.c.

446{
447 if (ast_channel_softhangup_internal_flag(chan)) /* yes if soft hangup flag set */
448 return 1;
449 if (ast_tvzero(*ast_channel_whentohangup(chan))) /* no if no hangup scheduled */
450 return 0;
451 if (ast_tvdiff_ms(*ast_channel_whentohangup(chan), ast_tvnow()) > 0) /* no if hangup time has not come yet. */
452 return 0;
453 ast_debug(4, "Hangup time has come: %" PRIi64 "\n", ast_tvdiff_ms(*ast_channel_whentohangup(chan), ast_tvnow()));
454 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(chan));
456 return 1;
457}
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)

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 8696 of file channel.c.

8697{
8698 int32_t value;
8699 size_t pos = 0;
8700 int res;
8701
8702 static const struct ast_party_id_ies ies = {
8704 .name.char_set = AST_CONNECTED_LINE_NAME_CHAR_SET,
8705 .name.presentation = AST_CONNECTED_LINE_NAME_PRESENTATION,
8706 .name.valid = AST_CONNECTED_LINE_NAME_VALID,
8707
8708 .number.str = AST_CONNECTED_LINE_NUMBER,
8709 .number.plan = AST_CONNECTED_LINE_NUMBER_PLAN,
8710 .number.presentation = AST_CONNECTED_LINE_NUMBER_PRESENTATION,
8711 .number.valid = AST_CONNECTED_LINE_NUMBER_VALID,
8712
8713 .subaddress.str = AST_CONNECTED_LINE_SUBADDRESS,
8714 .subaddress.type = AST_CONNECTED_LINE_SUBADDRESS_TYPE,
8715 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN,
8716 .subaddress.valid = AST_CONNECTED_LINE_SUBADDRESS_VALID,
8717
8719 .combined_presentation = AST_CONNECTED_LINE_ID_PRESENTATION,
8720 };
8721
8722 static const struct ast_party_id_ies priv_ies = {
8725 .name.presentation = AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION,
8727
8728 .number.str = AST_CONNECTED_LINE_PRIV_NUMBER,
8730 .number.presentation = AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION,
8732
8733 .subaddress.str = AST_CONNECTED_LINE_PRIV_SUBADDRESS,
8734 .subaddress.type = AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE,
8735 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN,
8736 .subaddress.valid = AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID,
8737
8739 .combined_presentation = 0,/* Not sent. */
8740 };
8741
8742 /*
8743 * The size of integer values must be fixed in case the frame is
8744 * shipped to another machine.
8745 */
8746
8747 /* Connected line frame version */
8748 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8749 ast_log(LOG_WARNING, "No space left for connected line frame version\n");
8750 return -1;
8751 }
8752 data[pos++] = AST_CONNECTED_LINE_VERSION;
8753 data[pos++] = 1;
8754 data[pos++] = 2;/* Version 1 did not have a version ie */
8755
8756 res = party_id_build_data(data + pos, datalen - pos, &connected->id,
8757 "connected line", &ies, update ? &update->id : NULL);
8758 if (res < 0) {
8759 return -1;
8760 }
8761 pos += res;
8762
8763 res = party_id_build_data(data + pos, datalen - pos, &connected->priv,
8764 "connected line priv", &priv_ies, update ? &update->priv : NULL);
8765 if (res < 0) {
8766 return -1;
8767 }
8768 pos += res;
8769
8770 /* Connected line source */
8771 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
8772 ast_log(LOG_WARNING, "No space left for connected line source\n");
8773 return -1;
8774 }
8775 data[pos++] = AST_CONNECTED_LINE_SOURCE;
8776 data[pos++] = sizeof(value);
8777 value = htonl(connected->source);
8778 memcpy(data + pos, &value, sizeof(value));
8779 pos += sizeof(value);
8780
8781 return pos;
8782}
@ AST_CONNECTED_LINE_NUMBER_VALID
Definition: channel.c:8679
@ AST_CONNECTED_LINE_SOURCE
Definition: channel.c:8665
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID
Definition: channel.c:8692
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN
Definition: channel.c:8691
@ AST_CONNECTED_LINE_PRIV_NAME_VALID
Definition: channel.c:8686
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE
Definition: channel.c:8690
@ AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION
Definition: channel.c:8684
@ AST_CONNECTED_LINE_NAME_CHAR_SET
Definition: channel.c:8677
@ AST_CONNECTED_LINE_SUBADDRESS_VALID
Definition: channel.c:8669
@ AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN
Definition: channel.c:8668
@ AST_CONNECTED_LINE_SUBADDRESS
Definition: channel.c:8666
@ AST_CONNECTED_LINE_PRIV_NUMBER_PLAN
Definition: channel.c:8682
@ AST_CONNECTED_LINE_NUMBER
Definition: channel.c:8661
@ AST_CONNECTED_LINE_ID_PRESENTATION
Definition: channel.c:8664
@ AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION
Definition: channel.c:8688
@ AST_CONNECTED_LINE_PRIV_NAME
Definition: channel.c:8685
@ AST_CONNECTED_LINE_TAG
Definition: channel.c:8670
@ AST_CONNECTED_LINE_PRIV_NUMBER_VALID
Definition: channel.c:8683
@ AST_CONNECTED_LINE_NUMBER_PRESENTATION
Definition: channel.c:8680
@ AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET
Definition: channel.c:8687
@ AST_CONNECTED_LINE_NAME
Definition: channel.c:8662
@ AST_CONNECTED_LINE_NAME_PRESENTATION
Definition: channel.c:8678
@ AST_CONNECTED_LINE_SUBADDRESS_TYPE
Definition: channel.c:8667
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS
Definition: channel.c:8689
@ AST_CONNECTED_LINE_PRIV_TAG
Definition: channel.c:8693
@ AST_CONNECTED_LINE_NAME_VALID
Definition: channel.c:8676
@ AST_CONNECTED_LINE_PRIV_NUMBER
Definition: channel.c:8681
@ AST_CONNECTED_LINE_NUMBER_PLAN
Definition: channel.c:8663
@ AST_CONNECTED_LINE_VERSION
Definition: channel.c:8671
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:8576
int int32_t
Definition: db.h:60
struct ast_party_name_ies name
Subscriber name ies.
Definition: channel.c:8547
int str
Subscriber name ie.
Definition: channel.c:8324

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 8292 of file channel.c.

8293{
8294 ast_party_id_copy(&dest->id, &src->id);
8295 ast_party_id_copy(&dest->ani, &src->ani);
8296 dest->ani2 = src->ani2;
8297}
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:1765
struct ast_party_id id
Caller party ID.
Definition: channel.h:420
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:433
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:427
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:475
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:465

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(), 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 8299 of file channel.c.

8300{
8301 ast_party_id_copy(&dest->id, &src->id);
8302 ast_party_id_copy(&dest->ani, &src->ani);
8303
8304 dest->ani2 = src->ani2;
8305}

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 8784 of file channel.c.

8785{
8786 size_t pos;
8787 unsigned char ie_len;
8788 unsigned char ie_id;
8789 int32_t value;
8790 int frame_version = 1;
8791 int combined_presentation = 0;
8792 int got_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
8793
8794 for (pos = 0; pos < datalen; pos += ie_len) {
8795 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
8796 ast_log(LOG_WARNING, "Invalid connected line update\n");
8797 return -1;
8798 }
8799 ie_id = data[pos++];
8800 ie_len = data[pos++];
8801 if (datalen < pos + ie_len) {
8802 ast_log(LOG_WARNING, "Invalid connected line update\n");
8803 return -1;
8804 }
8805
8806 switch (ie_id) {
8807/* Connected line party frame version */
8809 if (ie_len != 1) {
8810 ast_log(LOG_WARNING, "Invalid connected line frame version (%u)\n",
8811 (unsigned) ie_len);
8812 break;
8813 }
8814 frame_version = data[pos];
8815 break;
8816/* Connected line party id name */
8818 ast_free(connected->id.name.str);
8819 connected->id.name.str = ast_malloc(ie_len + 1);
8820 if (connected->id.name.str) {
8821 memcpy(connected->id.name.str, data + pos, ie_len);
8822 connected->id.name.str[ie_len] = 0;
8823 }
8824 break;
8826 if (ie_len != 1) {
8827 ast_log(LOG_WARNING, "Invalid connected line name char set (%u)\n",
8828 (unsigned) ie_len);
8829 break;
8830 }
8831 connected->id.name.char_set = data[pos];
8832 break;
8834 if (ie_len != 1) {
8835 ast_log(LOG_WARNING, "Invalid connected line name presentation (%u)\n",
8836 (unsigned) ie_len);
8837 break;
8838 }
8839 connected->id.name.presentation = data[pos];
8840 break;
8842 if (ie_len != 1) {
8843 ast_log(LOG_WARNING, "Invalid connected line name valid (%u)\n",
8844 (unsigned) ie_len);
8845 break;
8846 }
8847 connected->id.name.valid = data[pos];
8848 break;
8849/* Connected line party id number */
8851 ast_free(connected->id.number.str);
8852 connected->id.number.str = ast_malloc(ie_len + 1);
8853 if (connected->id.number.str) {
8854 memcpy(connected->id.number.str, data + pos, ie_len);
8855 connected->id.number.str[ie_len] = 0;
8856 }
8857 break;
8859 if (ie_len != 1) {
8860 ast_log(LOG_WARNING, "Invalid connected line numbering plan (%u)\n",
8861 (unsigned) ie_len);
8862 break;
8863 }
8864 connected->id.number.plan = data[pos];
8865 break;
8867 if (ie_len != 1) {
8868 ast_log(LOG_WARNING, "Invalid connected line number presentation (%u)\n",
8869 (unsigned) ie_len);
8870 break;
8871 }
8872 connected->id.number.presentation = data[pos];
8873 break;
8875 if (ie_len != 1) {
8876 ast_log(LOG_WARNING, "Invalid connected line number valid (%u)\n",
8877 (unsigned) ie_len);
8878 break;
8879 }
8880 connected->id.number.valid = data[pos];
8881 break;
8882/* Connected line party id subaddress */
8884 ast_free(connected->id.subaddress.str);
8885 connected->id.subaddress.str = ast_malloc(ie_len + 1);
8886 if (connected->id.subaddress.str) {
8887 memcpy(connected->id.subaddress.str, data + pos, ie_len);
8888 connected->id.subaddress.str[ie_len] = 0;
8889 }
8890 break;
8892 if (ie_len != 1) {
8893 ast_log(LOG_WARNING, "Invalid connected line type of subaddress (%u)\n",
8894 (unsigned) ie_len);
8895 break;
8896 }
8897 connected->id.subaddress.type = data[pos];
8898 break;
8900 if (ie_len != 1) {
8902 "Invalid connected line subaddress odd-even indicator (%u)\n",
8903 (unsigned) ie_len);
8904 break;
8905 }
8906 connected->id.subaddress.odd_even_indicator = data[pos];
8907 break;
8909 if (ie_len != 1) {
8910 ast_log(LOG_WARNING, "Invalid connected line subaddress valid (%u)\n",
8911 (unsigned) ie_len);
8912 break;
8913 }
8914 connected->id.subaddress.valid = data[pos];
8915 break;
8916/* Connected line party tag */
8918 ast_free(connected->id.tag);
8919 connected->id.tag = ast_malloc(ie_len + 1);
8920 if (connected->id.tag) {
8921 memcpy(connected->id.tag, data + pos, ie_len);
8922 connected->id.tag[ie_len] = 0;
8923 }
8924 break;
8925/* Connected line party id combined presentation */
8927 if (ie_len != 1) {
8928 ast_log(LOG_WARNING, "Invalid connected line combined presentation (%u)\n",
8929 (unsigned) ie_len);
8930 break;
8931 }
8932 combined_presentation = data[pos];
8933 got_combined_presentation = 1;
8934 break;
8935/* Private connected line party id name */
8937 ast_free(connected->priv.name.str);
8938 connected->priv.name.str = ast_malloc(ie_len + 1);
8939 if (connected->priv.name.str) {
8940 memcpy(connected->priv.name.str, data + pos, ie_len);
8941 connected->priv.name.str[ie_len] = 0;
8942 }
8943 break;
8945 if (ie_len != 1) {
8946 ast_log(LOG_WARNING, "Invalid connected line private name char set (%u)\n",
8947 (unsigned) ie_len);
8948 break;
8949 }
8950 connected->priv.name.char_set = data[pos];
8951 break;
8953 if (ie_len != 1) {
8954 ast_log(LOG_WARNING, "Invalid connected line private name presentation (%u)\n",
8955 (unsigned) ie_len);
8956 break;
8957 }
8958 connected->priv.name.presentation = data[pos];
8959 break;
8961 if (ie_len != 1) {
8962 ast_log(LOG_WARNING, "Invalid connected line private name valid (%u)\n",
8963 (unsigned) ie_len);
8964 break;
8965 }
8966 connected->priv.name.valid = data[pos];
8967 break;
8968/* Private connected line party id number */
8970 ast_free(connected->priv.number.str);
8971 connected->priv.number.str = ast_malloc(ie_len + 1);
8972 if (connected->priv.number.str) {
8973 memcpy(connected->priv.number.str, data + pos, ie_len);
8974 connected->priv.number.str[ie_len] = 0;
8975 }
8976 break;
8978 if (ie_len != 1) {
8979 ast_log(LOG_WARNING, "Invalid connected line private numbering plan (%u)\n",
8980 (unsigned) ie_len);
8981 break;
8982 }
8983 connected->priv.number.plan = data[pos];
8984 break;
8986 if (ie_len != 1) {
8987 ast_log(LOG_WARNING, "Invalid connected line private number presentation (%u)\n",
8988 (unsigned) ie_len);
8989 break;
8990 }
8991 connected->priv.number.presentation = data[pos];
8992 break;
8994 if (ie_len != 1) {
8995 ast_log(LOG_WARNING, "Invalid connected line private number valid (%u)\n",
8996 (unsigned) ie_len);
8997 break;
8998 }
8999 connected->priv.number.valid = data[pos];
9000 break;
9001/* Private connected line party id subaddress */
9003 ast_free(connected->priv.subaddress.str);
9004 connected->priv.subaddress.str = ast_malloc(ie_len + 1);
9005 if (connected->priv.subaddress.str) {
9006 memcpy(connected->priv.subaddress.str, data + pos, ie_len);
9007 connected->priv.subaddress.str[ie_len] = 0;
9008 }
9009 break;
9011 if (ie_len != 1) {
9012 ast_log(LOG_WARNING, "Invalid connected line private type of subaddress (%u)\n",
9013 (unsigned) ie_len);
9014 break;
9015 }
9016 connected->priv.subaddress.type = data[pos];
9017 break;
9019 if (ie_len != 1) {
9021 "Invalid connected line private subaddress odd-even indicator (%u)\n",
9022 (unsigned) ie_len);
9023 break;
9024 }
9025 connected->priv.subaddress.odd_even_indicator = data[pos];
9026 break;
9028 if (ie_len != 1) {
9029 ast_log(LOG_WARNING, "Invalid connected line private subaddress valid (%u)\n",
9030 (unsigned) ie_len);
9031 break;
9032 }
9033 connected->priv.subaddress.valid = data[pos];
9034 break;
9035/* Private connected line party tag */
9037 ast_free(connected->priv.tag);
9038 connected->priv.tag = ast_malloc(ie_len + 1);
9039 if (connected->priv.tag) {
9040 memcpy(connected->priv.tag, data + pos, ie_len);
9041 connected->priv.tag[ie_len] = 0;
9042 }
9043 break;
9044/* Connected line party source */
9046 if (ie_len != sizeof(value)) {
9047 ast_log(LOG_WARNING, "Invalid connected line source (%u)\n",
9048 (unsigned) ie_len);
9049 break;
9050 }
9051 memcpy(&value, data + pos, sizeof(value));
9052 connected->source = ntohl(value);
9053 break;
9054/* Connected line party unknown element */
9055 default:
9056 ast_debug(1, "Unknown connected line element: %u (%u)\n",
9057 (unsigned) ie_id, (unsigned) ie_len);
9058 break;
9059 }
9060 }
9061
9062 switch (frame_version) {
9063 case 1:
9064 /*
9065 * The other end is an earlier version that we need to adjust
9066 * for compatibility.
9067 */
9068 connected->id.name.valid = 1;
9069 connected->id.name.char_set = AST_PARTY_CHAR_SET_ISO8859_1;
9070 connected->id.number.valid = 1;
9071 if (got_combined_presentation) {
9072 connected->id.name.presentation = combined_presentation;
9073 connected->id.number.presentation = combined_presentation;
9074 }
9075 break;
9076 case 2:
9077 /* The other end is at the same level as we are. */
9078 break;
9079 default:
9080 /*
9081 * The other end is newer than we are.
9082 * We need to assume that they are compatible with us.
9083 */
9084 ast_debug(1, "Connected line frame has newer version: %u\n",
9085 (unsigned) frame_version);
9086 break;
9087 }
9088
9089 return 0;
9090}
#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(), and wait_for_winner().

◆ ast_deactivate_generator()

void ast_deactivate_generator ( struct ast_channel chan)

Deactivate an active generator

Definition at line 2893 of file channel.c.

2894{
2895 ast_channel_lock(chan);
2898 /* if in the middle of dtmf emulation keep 50 tick per sec timer on rolling */
2900 }
2901 ast_channel_unlock(chan);
2902}
static void deactivate_generator_nolock(struct ast_channel *chan)
Definition: channel.c:2877
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:2855
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)
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_timer_set_rate(), deactivate_generator_nolock(), and should_trigger_dtmf_emulating().

Referenced by __ast_read(), app_exec(), ast_openstream_full(), 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(), 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 2827 of file channel.h.

2828{
2829 int x;
2830 int dummy = 0;
2831
2832 if (fd < 0)
2833 return 0;
2834 if (!start)
2835 start = &dummy;
2836 for (x = *start; x < maximum; x++)
2837 if (pfds[x].fd == fd) {
2838 if (x == *start)
2839 (*start)++;
2840 return pfds[x].revents;
2841 }
2842 return 0;
2843}
static void dummy(char *unused,...)
Definition: chan_unistim.c:220

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 592 of file channel.c.

593{
594 struct chanlist *chanls;
595 const struct ast_channel_tech *ret = NULL;
596
598
599 AST_RWLIST_TRAVERSE(&backends, chanls, list) {
600 if (!strcasecmp(name, chanls->tech->type)) {
601 ret = chanls->tech;
602 break;
603 }
604 }
605
607
608 return ret;
609}
Structure to describe a channel "technology", ie a channel driver See for examples:
Definition: channel.h:628

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 7617 of file channel.c.

7618{
7619 char *piece;
7620 char *c;
7621 int start=0, finish=0, x;
7622 ast_group_t group = 0;
7623
7624 if (ast_strlen_zero(s))
7625 return 0;
7626
7627 c = ast_strdupa(s);
7628
7629 while ((piece = strsep(&c, ","))) {
7630 if (sscanf(piece, "%30d-%30d", &start, &finish) == 2) {
7631 /* Range */
7632 } else if (sscanf(piece, "%30d", &start)) {
7633 /* Just one */
7634 finish = start;
7635 } else {
7636 ast_log(LOG_ERROR, "Syntax error parsing group configuration '%s' at '%s'. Ignoring.\n", s, piece);
7637 continue;
7638 }
7639 for (x = start; x <= finish; x++) {
7640 if ((x > 63) || (x < 0)) {
7641 ast_log(LOG_WARNING, "Ignoring invalid group %d (maximum group is 63)\n", x);
7642 } else
7643 group |= ((ast_group_t) 1 << x);
7644 }
7645 }
7646 return group;
7647}
unsigned long long ast_group_t
Definition: channel.h:213
char * strsep(char **str, const char *delims)
static struct test_val c

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 7674 of file channel.c.

7675{
7676 struct ao2_container *namedgroups;
7677 char *piece;
7678 char *c;
7679
7680 if (!s) {
7681 return NULL;
7682 }
7683
7684 /*! \brief Remove leading and trailing whitespace */
7686 if (ast_strlen_zero(c)) {
7687 return NULL;
7688 }
7689
7692 if (!namedgroups) {
7693 return NULL;
7694 }
7695
7696 while ((piece = strsep(&c, ","))) {
7697 struct namedgroup_member *member;
7698 size_t len;
7699
7700 /* remove leading/trailing whitespace */
7701 piece = ast_strip(piece);
7702
7703 len = strlen(piece);
7704 if (!len) {
7705 continue;
7706 }
7707
7709 if (!member) {
7710 ao2_ref(namedgroups, -1);
7711 return NULL;
7712 }
7713 strcpy(member->name, piece);/* Safe */
7714 member->hash = ast_str_hash(member->name);
7715
7716 /* every group name may exist only once, delete duplicates */
7717 ao2_find(namedgroups, member, OBJ_POINTER | OBJ_UNLINK | OBJ_NODATA);
7718 ao2_link(namedgroups, member);
7719 ao2_ref(member, -1);
7720 }
7721
7722 if (!ao2_container_count(namedgroups)) {
7723 /* There were no group names specified. */
7724 ao2_ref(namedgroups, -1);
7725 namedgroups = NULL;
7726 }
7727
7728 return (struct ast_namedgroups *) namedgroups;
7729}
#define OBJ_POINTER
Definition: astobj2.h:1150
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#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:7658
static int namedgroup_hash_cb(const void *obj, const int flags)
Hashing function used for named group container.
Definition: channel.c:7667
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 * 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:7650

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 2541 of file channel.c.

2542{
2543 /* Be NULL safe for RAII_VAR() usage. */
2544 if (!chan) {
2545 return;
2546 }
2547
2548 ast_debug(1, "Channel %p '%s' hanging up. Refs: %d\n", chan, ast_channel_name(chan),
2549 ao2_ref(chan, 0));
2550
2552
2553 ast_channel_lock(chan);
2554
2555 while (ast_channel_masq(chan) || ast_channel_masqr(chan)) {
2557 }
2558
2559 /* Mark as a zombie so a masquerade cannot be setup on this channel. */
2561
2562 ast_channel_unlock(chan);
2563
2564 /*
2565 * XXX if running the hangup handlers here causes problems
2566 * because the handlers take too long to execute, we could move
2567 * the meat of this function into another thread. A thread
2568 * where channels go to die.
2569 *
2570 * If this is done, ast_autoservice_chan_hangup_peer() will no
2571 * longer be needed.
2572 */
2574 ao2_unlink(channels, chan);
2575 ast_channel_lock(chan);
2576
2577 destroy_hooks(chan);
2578
2579 free_translation(chan);
2580 /* Close audio stream */
2581 if (ast_channel_stream(chan)) {
2584 }
2585 /* Close video stream */
2586 if (ast_channel_vstream(chan)) {
2589 }
2590 if (ast_channel_sched(chan)) {
2593 }
2594
2595 if (ast_channel_generatordata(chan)) { /* Clear any tone stuff remaining */
2596 if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
2598 }
2599 }
2602
2604 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",
2606 ast_channel_blockproc(chan));
2607 ast_assert(0);
2608 }
2609
2610 if (ast_channel_tech(chan)->hangup) {
2611 ast_channel_tech(chan)->hangup(chan);
2612 }
2613
2614 ast_channel_unlock(chan);
2615
2616 ast_cc_offer(chan);
2617
2618 ast_channel_unref(chan);
2619}
int ast_cc_offer(struct ast_channel *caller_chan)
Offer CC to a caller.
Definition: ccss.c:3716
static int hangup(void *data)
Definition: chan_pjsip.c:2516
static void destroy_hooks(struct ast_channel *chan)
Definition: channel.c:2530
static void free_translation(struct ast_channel *clonechan)
Definition: channel.c:2487
int ast_autoservice_stop(struct ast_channel *chan)
Stop servicing a channel for us...
Definition: autoservice.c:266
struct ast_channel * ast_channel_masq(const struct ast_channel *chan)
int ast_channel_blocker_tid(const struct ast_channel *chan)
void ast_channel_stream_set(struct ast_channel *chan, struct ast_filestream *value)
const char * ast_channel_blockproc(const struct ast_channel *chan)
struct ast_filestream * ast_channel_vstream(const struct ast_channel *chan)
struct ast_sched_context * ast_channel_sched(const struct ast_channel *chan)
struct ast_filestream * ast_channel_stream(const struct ast_channel *chan)
struct ast_channel * ast_channel_masqr(const struct ast_channel *chan)
void ast_channel_sched_set(struct ast_channel *chan, struct ast_sched_context *value)
void ast_channel_vstream_set(struct ast_channel *chan, struct ast_filestream *value)
int ast_closestream(struct ast_filestream *f)
Closes a stream.
Definition: file.c:1111
#define CHANNEL_DEADLOCK_AVOIDANCE(chan)
Definition: lock.h:474
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:704
int ast_get_tid(void)
Get current thread ID.
Definition: utils.c:2752

References ao2_ref, ao2_unlink, 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_tech(), 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, channels, 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_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_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(), 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 4276 of file channel.c.

4277{
4278 return ast_indicate_data(chan, condition, NULL, 0);
4279}

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_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(), 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 4652 of file channel.c.

4653{
4654 int res;
4655 /* this frame is used by framehooks. if it is set, we must free it at the end of this function */
4656 struct ast_frame *awesome_frame = NULL;
4657
4658 ast_channel_lock(chan);
4659
4660 /* Don't bother if the channel is about to go away, anyway. */
4663 && _condition != AST_CONTROL_MASQUERADE_NOTIFY) {
4664 res = -1;
4665 goto indicate_cleanup;
4666 }
4667
4669 /* Do framehooks now, do it, go, go now */
4670 struct ast_frame frame = {
4672 .subclass.integer = _condition,
4673 .data.ptr = (void *) data, /* this cast from const is only okay because we do the ast_frdup below */
4674 .datalen = datalen
4675 };
4676
4677 /* we have now committed to freeing this frame */
4678 awesome_frame = ast_frdup(&frame);
4679
4680 /* who knows what we will get back! the anticipation is killing me. */
4682 awesome_frame);
4683 if (!awesome_frame
4684 || awesome_frame->frametype != AST_FRAME_CONTROL) {
4685 res = 0;
4686 goto indicate_cleanup;
4687 }
4688
4689 _condition = awesome_frame->subclass.integer;
4690 data = awesome_frame->data.ptr;
4691 datalen = awesome_frame->datalen;
4692 }
4693
4694 res = indicate_data_internal(chan, _condition, data, datalen);
4695
4696indicate_cleanup:
4697 ast_channel_unlock(chan);
4698 if (awesome_frame) {
4699 ast_frfree(awesome_frame);
4700 }
4701
4702 return res;
4703}
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:10549
static int indicate_data_internal(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Definition: channel.c:4469
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_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(), 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 1467 of file channel.c.

1468{
1469 /* Do not add a default entry in this switch statement. Each new
1470 * frame type should be addressed directly as to whether it should
1471 * be queued up or not.
1472 */
1473 switch (frame->frametype) {
1476 case AST_FRAME_CONTROL:
1477 case AST_FRAME_TEXT:
1479 case AST_FRAME_IMAGE:
1480 case AST_FRAME_HTML:
1481 return 1;
1482
1483 case AST_FRAME_DTMF_END:
1485 case AST_FRAME_VOICE:
1486 case AST_FRAME_VIDEO:
1487 case AST_FRAME_NULL:
1488 case AST_FRAME_IAX:
1489 case AST_FRAME_CNG:
1490 case AST_FRAME_MODEM:
1491 case AST_FRAME_RTCP:
1492 return 0;
1493 }
1494 return 0;
1495}

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 8089 of file channel.c.

8090{
8091 void *match;
8092 struct ao2_container *group_a = (struct ao2_container *) a;
8093 struct ao2_container *group_b = (struct ao2_container *) b;
8094
8095 if (!a || !b) {
8096 return 0;
8097 }
8098
8099 /*
8100 * Do groups a and b intersect? Since a and b are hash tables,
8101 * the average time complexity is:
8102 * O(a.count <= b.count ? a.count : b.count)
8103 */
8104 if (ao2_container_count(group_b) < ao2_container_count(group_a)) {
8105 /* Traverse over the smaller group. */
8106 SWAP(group_a, group_b);
8107 }
8108 match = ao2_callback(group_a, 0, namedgroup_match, group_b);
8110
8111 return match != NULL;
8112}
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:2365
static int namedgroup_match(void *obj, void *arg, int flags)
Definition: channel.c:8079
#define SWAP(a, b)
Definition: utils.h:235

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 1986 of file channel.c.

1987{
1988 if (dest == src) {
1989 /* Don't copy to self */
1990 return;
1991 }
1992
1993 ast_party_id_copy(&dest->id, &src->id);
1994 ast_party_id_copy(&dest->ani, &src->ani);
1995 ast_party_id_copy(&dest->priv, &src->priv);
1996 dest->ani2 = src->ani2;
1997}
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:430

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 2015 of file channel.c.

2016{
2017 ast_party_id_free(&doomed->id);
2018 ast_party_id_free(&doomed->ani);
2019 ast_party_id_free(&doomed->priv);
2020}
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1811

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 1978 of file channel.c.

1979{
1980 ast_party_id_init(&init->id);
1981 ast_party_id_init(&init->ani);
1982 ast_party_id_init(&init->priv);
1983 init->ani2 = 0;
1984}
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1757

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 2007 of file channel.c.

2008{
2009 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2010 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2011 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2012 dest->ani2 = src->ani2;
2013}
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:1788

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 1999 of file channel.c.

2000{
2001 ast_party_id_set_init(&init->id, &guide->id);
2002 ast_party_id_set_init(&init->ani, &guide->ani);
2003 ast_party_id_set_init(&init->priv, &guide->priv);
2004 init->ani2 = guide->ani2;
2005}
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:1780

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 2063 of file channel.c.

2064{
2065 connected->id = caller->id;
2066 connected->ani = caller->ani;
2067 connected->priv = caller->priv;
2068 connected->ani2 = caller->ani2;
2070}
@ AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN
Definition: callerid.h:538

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 2031 of file channel.c.

2032{
2033 if (dest == src) {
2034 /* Don't copy to self */
2035 return;
2036 }
2037
2038 ast_party_id_copy(&dest->id, &src->id);
2039 ast_party_id_copy(&dest->ani, &src->ani);
2040 ast_party_id_copy(&dest->priv, &src->priv);
2041 dest->ani2 = src->ani2;
2042 dest->source = src->source;
2043}
int source
Information about the source of an update.
Definition: channel.h:482

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(), 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 2054 of file channel.c.

2055{
2056 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2057 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2058 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2059 dest->ani2 = src->ani2;
2060 dest->source = src->source;
2061}

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(), 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 2045 of file channel.c.

2046{
2047 ast_party_id_set_init(&init->id, &guide->id);
2048 ast_party_id_set_init(&init->ani, &guide->ani);
2049 ast_party_id_set_init(&init->priv, &guide->priv);
2050 init->ani2 = guide->ani2;
2051 init->source = guide->source;
2052}

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(), 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 1936 of file channel.c.

1937{
1938 if (dest == src) {
1939 /* Don't copy to self */
1940 return;
1941 }
1942
1943 ast_free(dest->number.str);
1944 dest->number.str = ast_strdup(src->number.str);
1945 dest->number.plan = src->number.plan;
1948}
#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:1705
struct ast_party_dialed::@208 number
Dialed/Called number.
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition: channel.h:391
char * str
Subscriber phone number (Malloced)
Definition: channel.h:386
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:388
int transit_network_select
Transit Network Select.
Definition: channel.h:397

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 1971 of file channel.c.

1972{
1973 ast_free(doomed->number.str);
1974 doomed->number.str = NULL;
1976}
void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
Destroy the party subaddress contents.
Definition: channel.c:1744

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 1928 of file channel.c.

1929{
1930 init->number.str = NULL;
1931 init->number.plan = 0;/* Unknown */
1933 init->transit_network_select = 0;
1934}
void ast_party_subaddress_init(struct ast_party_subaddress *init)
Initialize the given subaddress structure.
Definition: channel.c:1697

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 1958 of file channel.c.

1959{
1960 if (src->number.str && src->number.str != dest->number.str) {
1961 ast_free(dest->number.str);
1962 dest->number.str = ast_strdup(src->number.str);
1963 }
1964 dest->number.plan = src->number.plan;
1965
1967
1969}
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:1727

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 1950 of file channel.c.

1951{
1952 init->number.str = NULL;
1953 init->number.plan = guide->number.plan;
1956}
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:1719

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 1765 of file channel.c.

1766{
1767 if (dest == src) {
1768 /* Don't copy to self */
1769 return;
1770 }
1771
1772 ast_party_name_copy(&dest->name, &src->name);
1773 ast_party_number_copy(&dest->number, &src->number);
1775
1776 ast_free(dest->tag);
1777 dest->tag = ast_strdup(src->tag);
1778}
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:1652
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:1599
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:344
char * tag
User-set "tag".
Definition: channel.h:354
struct ast_party_name name
Subscriber name.
Definition: channel.h:340
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:342

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

1812{
1813 ast_party_name_free(&doomed->name);
1814 ast_party_number_free(&doomed->number);
1816
1817 ast_free(doomed->tag);
1818 doomed->tag = NULL;
1819}
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
Definition: channel.c:1638
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
Definition: channel.c:1691

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 1757 of file channel.c.

1758{
1759 ast_party_name_init(&init->name);
1762 init->tag = NULL;
1763}
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
Definition: channel.c:1591
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
Definition: channel.c:1644

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 1889 of file channel.c.

1890{
1891 id->name.valid = 0;
1892 id->number.valid = 0;
1893 id->subaddress.valid = 0;
1894}

◆ 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 1902 of file channel.c.

1903{
1904 struct ast_party_id merged;
1905
1906 merged = *base;
1907 if (overlay->name.valid) {
1908 merged.name = overlay->name;
1909 }
1910 if (overlay->number.valid) {
1911 merged.number = overlay->number;
1912 }
1913 if (overlay->subaddress.valid) {
1914 merged.subaddress = overlay->subaddress;
1915 }
1916 /* Note the actual structure is returned and not a pointer to it! */
1917 return merged;
1918}
Information needed to identify an endpoint in a call.
Definition: channel.h:338
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:279
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:297
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:328

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 1920 of file channel.c.

1921{
1922 struct ast_party_id merged;
1923
1924 merged = ast_party_id_merge(base, overlay);
1925 ast_party_id_copy(dest, &merged);
1926}
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:1902

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 1821 of file channel.c.

1822{
1823 int number_priority;
1824 int number_value;
1825 int number_screening;
1826 int name_priority;
1827 int name_value;
1828
1829 /* Determine name presentation priority. */
1830 if (!id->name.valid) {
1831 name_value = AST_PRES_UNAVAILABLE;
1832 name_priority = 3;
1833 } else {
1834 name_value = id->name.presentation & AST_PRES_RESTRICTION;
1835 switch (name_value) {
1837 name_priority = 0;
1838 break;
1839 case AST_PRES_ALLOWED:
1840 name_priority = 1;
1841 break;
1843 name_priority = 2;
1844 break;
1845 default:
1846 name_value = AST_PRES_UNAVAILABLE;
1847 name_priority = 3;
1848 break;
1849 }
1850 }
1851
1852 /* Determine number presentation priority. */
1853 if (!id->number.valid) {
1854 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1855 number_value = AST_PRES_UNAVAILABLE;
1856 number_priority = 3;
1857 } else {
1858 number_screening = id->number.presentation & AST_PRES_NUMBER_TYPE;
1859 number_value = id->number.presentation & AST_PRES_RESTRICTION;
1860 switch (number_value) {
1862 number_priority = 0;
1863 break;
1864 case AST_PRES_ALLOWED:
1865 number_priority = 1;
1866 break;
1868 number_priority = 2;
1869 break;
1870 default:
1871 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1872 number_value = AST_PRES_UNAVAILABLE;
1873 number_priority = 3;
1874 break;
1875 }
1876 }
1877
1878 /* Select the wining presentation value. */
1879 if (name_priority < number_priority) {
1880 number_value = name_value;
1881 }
1882 if (number_value == AST_PRES_UNAVAILABLE) {
1884 }
1885
1886 return number_value | number_screening;
1887}
enum queue_result id
Definition: app_queue.c:1638
#define AST_PRES_USER_NUMBER_UNSCREENED
Definition: callerid.h:412
#define AST_PRES_UNAVAILABLE
Definition: callerid.h:420
#define AST_PRES_RESTRICTED
Definition: callerid.h:419
#define AST_PRES_ALLOWED
Definition: callerid.h:418
#define AST_PRES_NUMBER_NOT_AVAILABLE
Definition: callerid.h:447
#define AST_PRES_NUMBER_TYPE
Definition: callerid.h:411
#define AST_PRES_RESTRICTION
Definition: callerid.h:417

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(), 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 1896 of file channel.c.

1897{
1900}

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 1788 of file channel.c.

1789{
1790 if (dest == src) {
1791 /* Don't set to self */
1792 return;
1793 }
1794
1795 if (!update || update->name) {
1796 ast_party_name_set(&dest->name, &src->name);
1797 }
1798 if (!update || update->number) {
1799 ast_party_number_set(&dest->number, &src->number);
1800 }
1801 if (!update || update->subaddress) {
1803 }
1804
1805 if (src->tag && src->tag != dest->tag) {
1806 ast_free(dest->tag);
1807 dest->tag = ast_strdup(src->tag);
1808 }
1809}
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:1674
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:1621

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 1780 of file channel.c.

1781{
1782 ast_party_name_set_init(&init->name, &guide->name);
1783 ast_party_number_set_init(&init->number, &guide->number);
1785 init->tag = NULL;
1786}
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:1613
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:1666

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 1599 of file channel.c.

1600{
1601 if (dest == src) {
1602 /* Don't copy to self */
1603 return;
1604 }
1605
1606 ast_free(dest->str);
1607 dest->str = ast_strdup(src->str);
1608 dest->char_set = src->char_set;
1609 dest->presentation = src->presentation;
1610 dest->valid = src->valid;
1611}
int char_set
Character set the name is using.
Definition: channel.h:272
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:277
char * str
Subscriber name (Malloced)
Definition: channel.h:264

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 1638 of file channel.c.

1639{
1640 ast_free(doomed->str);
1641 doomed->str = NULL;
1642}

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 1591 of file channel.c.

1592{
1593 init->str = NULL;
1596 init->valid = 0;
1597}

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 1621 of file channel.c.

1622{
1623 if (dest == src) {
1624 /* Don't set to self */
1625 return;
1626 }
1627
1628 if (src->str && src->str != dest->str) {
1629 ast_free(dest->str);
1630 dest->str = ast_strdup(src->str);
1631 }
1632
1633 dest->char_set = src->char_set;
1634 dest->presentation = src->presentation;
1635 dest->valid = src->valid;
1636}

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 1613 of file channel.c.

1614{
1615 init->str = NULL;
1616 init->char_set = guide->char_set;
1617 init->presentation = guide->presentation;
1618 init->valid = guide->valid;
1619}

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 1652 of file channel.c.

1653{
1654 if (dest == src) {
1655 /* Don't copy to self */
1656 return;
1657 }
1658
1659 ast_free(dest->str);
1660 dest->str = ast_strdup(src->str);
1661 dest->plan = src->plan;
1662 dest->presentation = src->presentation;
1663 dest->valid = src->valid;
1664}
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:295
char * str
Subscriber phone number (Malloced)
Definition: channel.h:291
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:293

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 1691 of file channel.c.

1692{
1693 ast_free(doomed->str);
1694 doomed->str = NULL;
1695}

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 1644 of file channel.c.

1645{
1646 init->str = NULL;
1647 init->plan = 0;/* Unknown */
1649 init->valid = 0;
1650}

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 1674 of file channel.c.

1675{
1676 if (dest == src) {
1677 /* Don't set to self */
1678 return;
1679 }
1680
1681 if (src->str && src->str != dest->str) {
1682 ast_free(dest->str);
1683 dest->str = ast_strdup(src->str);
1684 }
1685
1686 dest->plan = src->plan;
1687 dest->presentation = src->presentation;
1688 dest->valid = src->valid;
1689}

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 1666 of file channel.c.

1667{
1668 init->str = NULL;
1669 init->plan = guide->plan;
1670 init->presentation = guide->presentation;
1671 init->valid = guide->valid;
1672}

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 2135 of file channel.c.

2136{
2137 if (dest == src) {
2138 /* Don't copy to self */
2139 return;
2140 }
2141
2142 ast_party_id_copy(&dest->orig, &src->orig);
2143 ast_party_id_copy(&dest->from, &src->from);
2144 ast_party_id_copy(&dest->to, &src->to);
2145 ast_party_id_copy(&dest->priv_orig, &src->priv_orig);
2146 ast_party_id_copy(&dest->priv_from, &src->priv_from);
2147 ast_party_id_copy(&dest->priv_to, &src->priv_to);
2150 dest->count = src->count;
2151}
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:2085
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:545
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:542
int count
Number of times the call was redirected.
Definition: channel.h:548

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 2122 of file channel.c.

2123{
2124 ast_party_id_init(&init->orig);
2125 ast_party_id_init(&init->from);
2126 ast_party_id_init(&init->to);
2129 ast_party_id_init(&init->priv_to);
2132 init->count = 0;
2133}
void ast_party_redirecting_reason_init(struct ast_party_redirecting_reason *init)
Initialize the given redirecting reason structure.
Definition: channel.c:2079

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 2085 of file channel.c.

2086{
2087 if (dest == src) {
2088 return;
2089 }
2090
2091 ast_free(dest->str);
2092 dest->str = ast_strdup(src->str);
2093 dest->code = src->code;
2094}
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:510
char * str
a string value for the redirecting reason
Definition: channel.h:507

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 2116 of file channel.c.

2117{
2118 ast_free(doomed->str);
2119}

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 2079 of file channel.c.

2080{
2081 init->str = NULL;
2083}
@ AST_REDIRECTING_REASON_UNKNOWN
Definition: callerid.h:485

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 2102 of file channel.c.

2103{
2104 if (dest == src) {
2105 return;
2106 }
2107
2108 if (src->str && src->str != dest->str) {
2109 ast_free(dest->str);
2110 dest->str = ast_strdup(src->str);
2111 }
2112
2113 dest->code = src->code;
2114}

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 2096 of file channel.c.

2097{
2098 init->str = NULL;
2099 init->code = guide->code;
2100}

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

2167{
2168 ast_party_id_set(&dest->orig, &src->orig, update ? &update->orig : NULL);
2169 ast_party_id_set(&dest->from, &src->from, update ? &update->from : NULL);
2170 ast_party_id_set(&dest->to, &src->to, update ? &update->to : NULL);
2171 ast_party_id_set(&dest->priv_orig, &src->priv_orig, update ? &update->priv_orig : NULL);
2172 ast_party_id_set(&dest->priv_from, &src->priv_from, update ? &update->priv_from : NULL);
2173 ast_party_id_set(&dest->priv_to, &src->priv_to, update ? &update->priv_to : NULL);
2176 dest->count = src->count;
2177}
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:2102

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 2153 of file channel.c.

2154{
2155 ast_party_id_set_init(&init->orig, &guide->orig);
2156 ast_party_id_set_init(&init->from, &guide->from);
2157 ast_party_id_set_init(&init->to, &guide->to);
2158 ast_party_id_set_init(&init->priv_orig, &guide->priv_orig);
2159 ast_party_id_set_init(&init->priv_from, &guide->priv_from);
2160 ast_party_id_set_init(&init->priv_to, &guide->priv_to);
2163 init->count = guide->count;
2164}
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:2096

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 1705 of file channel.c.

1706{
1707 if (dest == src) {
1708 /* Don't copy to self */
1709 return;
1710 }
1711
1712 ast_free(dest->str);
1713 dest->str = ast_strdup(src->str);
1714 dest->type = src->type;
1716 dest->valid = src->valid;
1717}
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:326
char * str
Malloced subaddress string.
Definition: channel.h:313
int type
Q.931 subaddress type.
Definition: channel.h:320

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 1744 of file channel.c.

1745{
1746 ast_free(doomed->str);
1747 doomed->str = NULL;
1748}

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 1697 of file channel.c.

1698{
1699 init->str = NULL;
1700 init->type = 0;
1701 init->odd_even_indicator = 0;
1702 init->valid = 0;
1703}

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 1727 of file channel.c.

1728{
1729 if (dest == src) {
1730 /* Don't set to self */
1731 return;
1732 }
1733
1734 if (src->str && src->str != dest->str) {
1735 ast_free(dest->str);
1736 dest->str = ast_strdup(src->str);
1737 }
1738
1739 dest->type = src->type;
1741 dest->valid = src->valid;
1742}

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 1719 of file channel.c.

1720{
1721 init->str = NULL;
1722 init->type = guide->type;
1724 init->valid = guide->valid;
1725}

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 6443 of file channel.c.

6444{
6445 int (*pre_call)(struct ast_channel *chan, const char *sub_args);
6446
6447 ast_channel_lock(chan);
6448 pre_call = ast_channel_tech(chan)->pre_call;
6449 if (pre_call) {
6450 int res;
6451
6452 res = pre_call(chan, sub_args);
6453 ast_channel_unlock(chan);
6454 return res;
6455 }
6456 ast_channel_unlock(chan);
6457 return ast_app_exec_sub(NULL, chan, sub_args, 0);
6458}
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:841

References ast_app_exec_sub(), ast_channel_lock, ast_channel_tech(), 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 8030 of file channel.c.

8031{
8032 unsigned int i;
8033 int first = 1;
8034 char num[3];
8035
8036 buf[0] = '\0';
8037
8038 if (!group) /* Return empty string if no group */
8039 return buf;
8040
8041 for (i = 0; i <= 63; i++) { /* Max group is 63 */
8042 if (group & ((ast_group_t) 1 << i)) {
8043 if (!first) {
8044 strncat(buf, ", ", buflen - strlen(buf) - 1);
8045 } else {
8046 first = 0;
8047 }
8048 snprintf(num, sizeof(num), "%u", i);
8049 strncat(buf, num, buflen - strlen(buf) - 1);
8050 }
8051 }
8052 return buf;
8053}
struct sla_ringing_trunk * first
Definition: app_sla.c:332
char buf[BUFSIZE]
Definition: eagi_proxy.c:66

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 8055 of file channel.c.

8056{
8057 struct ao2_container *grp = (struct ao2_container *) group;
8058 struct namedgroup_member *ng;
8059 int first = 1;
8060 struct ao2_iterator it;
8061
8062 if (!grp) {
8063 return ast_str_buffer(*buf);
8064 }
8065
8066 for (it = ao2_iterator_init(grp, 0); (ng = ao2_iterator_next(&it)); ao2_ref(ng, -1)) {
8067 if (!first) {
8068 ast_str_append(buf, 0, ", ");
8069 } else {
8070 first = 0;
8071 }
8072 ast_str_append(buf, 0, "%s", ng->name);
8073 }
8075
8076 return ast_str_buffer(*buf);
8077}
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821

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

5000{
5001 struct ast_frame a = { AST_FRAME_VOICE };
5002 char nothing[128];
5003
5004 /* Send an empty audio frame to get things moving */
5005 if (ast_channel_state(chan) != AST_STATE_UP) {
5006 ast_debug(3, "Prodding channel '%s'\n", ast_channel_name(chan));
5007 a.subclass.format = ast_channel_rawwriteformat(chan);
5008 a.data.ptr = nothing + AST_FRIENDLY_OFFSET;
5009 a.src = "ast_prod"; /* this better match check in ast_write */
5010 if (ast_write(chan, &a))
5011 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", ast_channel_name(chan));
5012 }
5013 return 0;
5014}
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:5143
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)
#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 1246 of file channel.c.

1247{
1248 struct ast_frame f = {
1250 .subclass.integer = AST_CONTROL_ANSWER,
1251 .subclass.topology = (struct ast_stream_topology *)topology,
1252 };
1253 return ast_queue_frame(chan, &f);
1254}

References AST_CONTROL_ANSWER, AST_FRAME_CONTROL, and ast_queue_frame().

◆ ast_queue_control()

int ast_queue_control ( struct ast_channel chan,
enum ast_control_frame_type  control 
)

Queue a control frame without payload.

Parameters
chanchannel to queue frame onto
controltype of control frame
Note
The channel does not need to be locked before calling this function.
Return values
zeroon success
non-zeroon failure

Queue a control frame without payload.

Definition at line 1231 of file channel.c.

1232{
1233 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control };
1234 return ast_queue_frame(chan, &f);
1235}

References AST_FRAME_CONTROL, and ast_queue_frame().

Referenced by __analog_handle_event(), __ast_read(), analog_call(), analog_exception(), analog_hangup(), apply_negotiated_sdp_stream(), ast_do_pickup(), audiosocket_call(), chan_pjsip_incoming_ack(), chan_pjsip_incoming_response(), cli_console_answer(), cli_console_flash(), console_call(), controlplayback_manager(), handle_call_incoming(), jingle_action_session_accept(), jingle_action_session_info(), jingle_outgoing_hook(), mbl_queue_control(), on_topology_change_response(), onAlerting(), onCallEstablished(), onProgress(), pbx_outgoing_state_callback(), rtp_call(), stasis_app_control_queue_control(), unistim_call(), unreal_colp_stream_topology_request_change(), and video_info_incoming_request().

◆ 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 1238 of file channel.c.

1240{
1241 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control, .data.ptr = (void *) data, .datalen = datalen };
1242 return ast_queue_frame(chan, &f);
1243}

References AST_FRAME_CONTROL, ast_queue_frame(), ast_frame::data, and ast_frame::datalen.

Referenced by __analog_handle_event(), after_bridge_move_channel(), 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 1139 of file channel.c.

1140{
1141 return __ast_queue_frame(chan, fin, 0, NULL);
1142}
static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
Definition: channel.c:1009

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(), 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(), 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(), 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 1144 of file channel.c.

1145{
1146 return __ast_queue_frame(chan, fin, 1, NULL);
1147}

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 1150 of file channel.c.

1151{
1152 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
1153 int res;
1154
1155 /* Yeah, let's not change a lock-critical value without locking */
1156 ast_channel_lock(chan);
1159
1160 res = ast_queue_frame(chan, &f);
1161 ast_channel_unlock(chan);
1162 return res;
1163}
struct stasis_message_type * ast_channel_hangup_request_type(void)
Message type for when a hangup is requested on a channel.

References ast_channel_hangup_request_type(), ast_channel_lock, ast_channel_publish_blob(), ast_channel_softhangup_internal_flag_add(), ast_channel_unlock, AST_CONTROL_HANGUP, AST_FRAME_CONTROL, ast_queue_frame(), AST_SOFTHANGUP_DEV, and NULL.

Referenced by 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 1166 of file channel.c.

1167{
1168 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
1169 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
1170 int res;
1171
1172 if (cause >= 0) {
1173 f.data.uint32 = cause;
1174 }
1175
1176 /* Yeah, let's not change a lock-critical value without locking */
1177 ast_channel_lock(chan);
1179 if (cause < 0) {
1181 }
1182 blob = ast_json_pack("{s: i}",
1183 "cause", cause);
1185
1186 res = ast_queue_frame(chan, &f);
1187 ast_channel_unlock(chan);
1188 return res;
1189}

References ast_channel_hangup_request_type(), ast_channel_hangupcause(), ast_channel_lock, ast_channel_publish_blob(), ast_channel_softhangup_internal_flag_add(), ast_channel_unlock, AST_CONTROL_HANGUP, AST_FRAME_CONTROL, ast_json_pack(), ast_json_unref(), ast_queue_frame(), AST_SOFTHANGUP_DEV, ast_frame::data, NULL, RAII_VAR, and ast_frame::uint32.

Referenced by __analog_handle_event(), ast_unreal_hangup(), chan_pjsip_session_end(), 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 1191 of file channel.c.

1192{
1193 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HOLD };
1194 struct ast_json *blob = NULL;
1195 int res;
1196
1197 if (!ast_strlen_zero(musicclass)) {
1198 f.data.ptr = (void *) musicclass;
1199 f.datalen = strlen(musicclass) + 1;
1200
1201 blob = ast_json_pack("{s: s}",
1202 "musicclass", musicclass);
1203 }
1204
1205 ast_channel_lock(chan);
1207 ast_channel_unlock(chan);
1208
1209 res = ast_queue_frame(chan, &f);
1210
1211 ast_json_unref(blob);
1212
1213 return res;
1214}
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, NULL, and ast_frame::ptr.

Referenced by __analog_handle_event(), 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 1216 of file channel.c.

1217{
1218 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_UNHOLD };
1219 int res;
1220
1221 ast_channel_lock(chan);
1223 ast_channel_unlock(chan);
1224
1225 res = ast_queue_frame(chan, &f);
1226
1227 return res;
1228}
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(), and NULL.

Referenced by __analog_handle_event(), __analog_ss_thread(), __dahdi_exception(), 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 2690 of file channel.c.

2691{
2693}
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:2639

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 2639 of file channel.c.

2640{
2641 int res = 0;
2642 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2643
2644 ast_channel_lock(chan);
2645
2646 /* You can't answer an outbound call */
2648 ast_channel_unlock(chan);
2649 return 0;
2650 }
2651
2652 /* Stop if we're a zombie or need a soft hangup */
2654 ast_channel_unlock(chan);
2655 return -1;
2656 }
2657
2658 /*
2659 * Mark when incoming channel answered so we can know how
2660 * long the channel has been up.
2661 */
2663
2664 ast_channel_unlock(chan);
2665
2666 switch (ast_channel_state(chan)) {
2667 case AST_STATE_RINGING:
2668 case AST_STATE_RING:
2669 ast_channel_lock(chan);
2670 if (ast_channel_tech(chan)->answer_with_stream_topology) {
2671 res = ast_channel_tech(chan)->answer_with_stream_topology(chan, topology);
2672
2673 } else if (ast_channel_tech(chan)->answer) {
2674 res = ast_channel_tech(chan)->answer(chan);
2675 }
2677 ast_channel_unlock(chan);
2678 break;
2679 case AST_STATE_UP:
2680 break;
2681 default:
2682 break;
2683 }
2684
2685 ast_indicate(chan, -1);
2686
2687 return res;
2688}
static int answer(void *data)
Definition: chan_pjsip.c:683
int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
Change the state of a channel.
Definition: channel.c:7385
static void set_channel_answer_time(struct ast_channel *chan)
Definition: channel.c:2628
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition: channel.c:4276
int(*const answer)(struct ast_channel *chan)
Answer the channel.
Definition: channel.h:707
int(*const answer_with_stream_topology)(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer the channel with topology.
Definition: channel.h:720

References answer(), ast_channel_tech::answer, ast_channel_tech::answer_with_stream_topology, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_tech(), ast_channel_unlock, ast_check_hangup(), AST_FLAG_OUTGOING, AST_FLAG_ZOMBIE, ast_indicate(), ast_setstate(), 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 4256 of file channel.c.

4257{
4258 return __ast_read(chan, 0, 1);
4259}
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition: channel.c:3524

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_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 4266 of file channel.c.

4267{
4268 return __ast_read(chan, 1, 1);
4269}

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 4261 of file channel.c.

4262{
4263 return __ast_read(chan, 0, 0);
4264}

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 4271 of file channel.c.

4272{
4273 return __ast_read(chan, 1, 0);
4274}

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 6557 of file channel.c.

6558{
6559 return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
6560}
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:6562

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 6562 of file channel.c.

6563{
6564 int pos = 0; /* index in the buffer where we accumulate digits */
6565 int to = ftimeout;
6566
6567 struct ast_silence_generator *silgen = NULL;
6568
6569 /* Stop if we're a zombie or need a soft hangup */
6571 return -1;
6572 if (!len)
6573 return -1;
6574 for (;;) {
6575 int d;
6576 if (ast_channel_stream(c)) {
6577 d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
6579 if (!silgen && ast_opt_transmit_silence)
6581 usleep(1000);
6582 if (!d)
6583 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6584 } else {
6585 if (!silgen && ast_opt_transmit_silence)
6587 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6588 }
6589 if (d < 0) {
6591 return AST_GETDATA_FAILED;
6592 }
6593 if (d == 0) {
6594 s[pos] = '\0';
6596 return AST_GETDATA_TIMEOUT;
6597 }
6598 if (d == 1) {
6599 s[pos] = '\0';
6602 }
6603 if (strchr(enders, d) && (pos == 0)) {
6604 s[pos] = '\0';
6607 }
6608 if (!strchr(enders, d)) {
6609 s[pos++] = d;
6610 }
6611 if (strchr(enders, d) || (pos >= len)) {
6612 s[pos] = '\0';
6614 return AST_GETDATA_COMPLETE;
6615 }
6616 to = timeout;
6617 }
6618 /* Never reached */
6619 return 0;
6620}
struct ast_silence_generator * ast_channel_start_silence_generator(struct ast_channel *chan)
Starts a silence generator on the given channel.
Definition: channel.c:8163
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:8209
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:3239
int ast_waitstream_full(struct ast_channel *c, const char *breakon, int audiofd, int monfd)
Definition: file.c:1848
int ast_stopstream(struct ast_channel *c)
Stops a stream.
Definition: file.c:222
#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:124
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 4705 of file channel.c.

4706{
4707 int c;
4708 char *buf = ast_recvtext(chan, timeout);
4709 if (buf == NULL)
4710 return -1; /* error or timeout */
4711 c = *(unsigned char *)buf;
4712 ast_free(buf);
4713 return c;
4714}
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:4716

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 4716 of file channel.c.

4717{
4718 int res;
4719 char *buf = NULL;
4720 struct timeval start = ast_tvnow();
4721 int ms;
4722
4723 while ((ms = ast_remaining_ms(start, timeout))) {
4724 struct ast_frame *f;
4725
4726 if (ast_check_hangup(chan)) {
4727 break;
4728 }
4729 res = ast_waitfor(chan, ms);
4730 if (res <= 0) {/* timeout or error */
4731 break;
4732 }
4733 f = ast_read(chan);
4734 if (f == NULL) {
4735 break; /* no frame */
4736 }
4738 ast_frfree(f);
4739 break;
4740 } else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
4741 buf = ast_strndup((char *) f->data.ptr, f->datalen); /* dup and break */
4742 ast_frfree(f);
4743 break;
4744 }
4745 ast_frfree(f);
4746 }
4747 return buf;
4748}
#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 9267 of file channel.c.

9268{
9269 int32_t value;
9270 size_t pos = 0;
9271 int res;
9272
9273 static const struct ast_party_id_ies orig_ies = {
9275 .name.char_set = AST_REDIRECTING_ORIG_NAME_CHAR_SET,
9276 .name.presentation = AST_REDIRECTING_ORIG_NAME_PRESENTATION,
9277 .name.valid = AST_REDIRECTING_ORIG_NAME_VALID,
9278
9279 .number.str = AST_REDIRECTING_ORIG_NUMBER,
9280 .number.plan = AST_REDIRECTING_ORIG_NUMBER_PLAN,
9281 .number.presentation = AST_REDIRECTING_ORIG_NUMBER_PRESENTATION,
9282 .number.valid = AST_REDIRECTING_ORIG_NUMBER_VALID,
9283
9284 .subaddress.str = AST_REDIRECTING_ORIG_SUBADDRESS,
9285 .subaddress.type = AST_REDIRECTING_ORIG_SUBADDRESS_TYPE,
9286 .subaddress.odd_even_indicator = AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN,
9287 .subaddress.valid = AST_REDIRECTING_ORIG_SUBADDRESS_VALID,
9288
9290 .combined_presentation = 0,/* Not sent. */
9291 };
9292 static const struct ast_party_id_ies from_ies = {
9294 .name.char_set = AST_REDIRECTING_FROM_NAME_CHAR_SET,
9295 .name.presentation = AST_REDIRECTING_FROM_NAME_PRESENTATION,
9296 .name.valid = AST_REDIRECTING_FROM_NAME_VALID,
9297
9298 .number.str = AST_REDIRECTING_FROM_NUMBER,
9299 .number.plan = AST_REDIRECTING_FROM_NUMBER_PLAN,
9300 .number.presentation = AST_REDIRECTING_FROM_NUMBER_PRESENTATION,
9301 .number.valid = AST_REDIRECTING_FROM_NUMBER_VALID,
9302
9303 .subaddress.str = AST_REDIRECTING_FROM_SUBADDRESS,
9304 .subaddress.type = AST_REDIRECTING_FROM_SUBADDRESS_TYPE,
9305 .subaddress.odd_even_indicator = AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN,
9306 .subaddress.valid = AST_REDIRECTING_FROM_SUBADDRESS_VALID,
9307
9309 .combined_presentation = AST_REDIRECTING_FROM_ID_PRESENTATION,
9310 };
9311 static const struct ast_party_id_ies to_ies = {
9313 .name.char_set = AST_REDIRECTING_TO_NAME_CHAR_SET,
9314 .name.presentation = AST_REDIRECTING_TO_NAME_PRESENTATION,
9315 .name.valid = AST_REDIRECTING_TO_NAME_VALID,
9316
9317 .number.str = AST_REDIRECTING_TO_NUMBER,
9318 .number.plan = AST_REDIRECTING_TO_NUMBER_PLAN,
9319 .number.presentation = AST_REDIRECTING_TO_NUMBER_PRESENTATION,
9320 .number.valid = AST_REDIRECTING_TO_NUMBER_VALID,
9321
9322 .subaddress.str = AST_REDIRECTING_TO_SUBADDRESS,
9323 .subaddress.type = AST_REDIRECTING_TO_SUBADDRESS_TYPE,
9324 .subaddress.odd_even_indicator = AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN,
9325 .subaddress.valid = AST_REDIRECTING_TO_SUBADDRESS_VALID,
9326
9328 .combined_presentation = AST_REDIRECTING_TO_ID_PRESENTATION,
9329 };
9330 static const struct ast_party_id_ies priv_orig_ies = {
9335
9338 .number.presentation = AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION,
9340
9341 .subaddress.str = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS,
9343 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN,
9345
9347 .combined_presentation = 0,/* Not sent. */
9348 };
9349 static const struct ast_party_id_ies priv_from_ies = {
9354
9357 .number.presentation = AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION,
9359
9360 .subaddress.str = AST_REDIRECTING_PRIV_FROM_SUBADDRESS,
9362 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN,
9364
9366 .combined_presentation = 0,/* Not sent. */
9367 };
9368 static const struct ast_party_id_ies priv_to_ies = {
9371 .name.presentation = AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION,
9373
9374 .number.str = AST_REDIRECTING_PRIV_TO_NUMBER,
9376 .number.presentation = AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION,
9378
9379 .subaddress.str = AST_REDIRECTING_PRIV_TO_SUBADDRESS,
9380 .subaddress.type = AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE,
9381 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN,
9382 .subaddress.valid = AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID,
9383
9385 .combined_presentation = 0,/* Not sent. */
9386 };
9387 static const struct ast_party_redirecting_reason_ies reason_ies = {
9390 };
9391
9392 static const struct ast_party_redirecting_reason_ies orig_reason_ies = {
9395 };
9396
9397 /* Redirecting frame version */
9398 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
9399 ast_log(LOG_WARNING, "No space left for redirecting frame version\n");
9400 return -1;
9401 }
9402 data[pos++] = AST_REDIRECTING_VERSION;
9403 data[pos++] = 1;
9404 data[pos++] = 2;/* Version 1 did not have a version ie */
9405
9406 res = party_id_build_data(data + pos, datalen - pos, &redirecting->orig,
9407 "redirecting-orig", &orig_ies, update ? &update->orig : NULL);
9408 if (res < 0) {
9409 return -1;
9410 }
9411 pos += res;
9412
9413 res = party_id_build_data(data + pos, datalen - pos, &redirecting->from,
9414 "redirecting-from", &from_ies, update ? &update->from : NULL);
9415 if (res < 0) {
9416 return -1;
9417 }
9418 pos += res;
9419
9420 res = party_id_build_data(data + pos, datalen - pos, &redirecting->to,
9421 "redirecting-to", &to_ies, update ? &update->to : NULL);
9422 if (res < 0) {
9423 return -1;
9424 }
9425 pos += res;
9426
9427 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_orig,
9428 "redirecting-priv-orig", &priv_orig_ies, update ? &update->priv_orig : NULL);
9429 if (res < 0) {
9430 return -1;
9431 }
9432 pos += res;
9433
9434 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_from,
9435 "redirecting-priv-from", &priv_from_ies, update ? &update->priv_from : NULL);
9436 if (res < 0) {
9437 return -1;
9438 }
9439 pos += res;
9440
9441 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_to,
9442 "redirecting-priv-to", &priv_to_ies, update ? &update->priv_to : NULL);
9443 if (res < 0) {
9444 return -1;
9445 }
9446 pos += res;
9447
9448 /* Redirecting reason */
9449 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->reason,
9450 "redirecting-reason", &reason_ies);
9451 if (res < 0) {
9452 return -1;
9453 }
9454 pos += res;
9455
9456 /* Redirecting original reason */
9457 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->orig_reason,
9458 "redirecting-orig-reason", &orig_reason_ies);
9459 if (res < 0) {
9460 return -1;
9461 }
9462 pos += res;
9463
9464 /* Redirecting count */
9465 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9466 ast_log(LOG_WARNING, "No space left for redirecting count\n");
9467 return -1;
9468 }
9469 data[pos++] = AST_REDIRECTING_COUNT;
9470 data[pos++] = sizeof(value);
9471 value = htonl(redirecting->count);
9472 memcpy(data + pos, &value, sizeof(value));
9473 pos += sizeof(value);
9474
9475 return pos;
9476}
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:9234
@ AST_REDIRECTING_FROM_NAME_PRESENTATION
Definition: channel.c:9164
@ AST_REDIRECTING_TO_NAME
Definition: channel.c:9142
@ AST_REDIRECTING_VERSION
Definition: channel.c:9157
@ AST_REDIRECTING_PRIV_FROM_NAME_VALID
Definition: channel.c:9204
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN
Definition: channel.c:9209
@ AST_REDIRECTING_TO_TAG
Definition: channel.c:9156
@ AST_REDIRECTING_FROM_NUMBER_PLAN
Definition: channel.c:9139
@ AST_REDIRECTING_PRIV_TO_NAME_VALID
Definition: channel.c:9191
@ AST_REDIRECTING_ORIG_TAG
Definition: channel.c:9184
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN
Definition: channel.c:9222
@ AST_REDIRECTING_REASON_CODE
Definition: channel.c:9145
@ AST_REDIRECTING_PRIV_TO_NUMBER_VALID
Definition: channel.c:9188
@ AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION
Definition: channel.c:9189
@ AST_REDIRECTING_ORIG_REASON_CODE
Definition: channel.c:9185
@ AST_REDIRECTING_TO_NAME_PRESENTATION
Definition: channel.c:9169
@ AST_REDIRECTING_PRIV_TO_NAME
Definition: channel.c:9190
@ AST_REDIRECTING_PRIV_ORIG_NAME_VALID
Definition: channel.c:9217
@ AST_REDIRECTING_ORIG_NUMBER_VALID
Definition: channel.c:9173
@ AST_REDIRECTING_FROM_NUMBER_PRESENTATION
Definition: channel.c:9166
@ AST_REDIRECTING_ORIG_SUBADDRESS_VALID
Definition: channel.c:9183
@ AST_REDIRECTING_FROM_NUMBER_VALID
Definition: channel.c:9165
@ AST_REDIRECTING_TO_NAME_VALID
Definition: channel.c:9167
@ AST_REDIRECTING_PRIV_FROM_NAME
Definition: channel.c:9203
@ AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN
Definition: channel.c:9153
@ AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN
Definition: channel.c:9182
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE
Definition: channel.c:9208
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID
Definition: channel.c:9197
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN
Definition: channel.c:9196
@ AST_REDIRECTING_ORIG_NAME_CHAR_SET
Definition: channel.c:9178
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS
Definition: channel.c:9207
@ AST_REDIRECTING_TO_NUMBER_PLAN
Definition: channel.c:9143
@ AST_REDIRECTING_PRIV_TO_NUMBER
Definition: channel.c:9186
@ AST_REDIRECTING_PRIV_FROM_NUMBER_VALID
Definition: channel.c:9201
@ AST_REDIRECTING_ORIG_NAME
Definition: channel.c:9176
@ AST_REDIRECTING_ORIG_SUBADDRESS
Definition: channel.c:9180
@ AST_REDIRECTING_FROM_TAG
Definition: channel.c:9155
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN
Definition: channel.c:9214
@ AST_REDIRECTING_TO_NUMBER
Definition: channel.c:9141
@ AST_REDIRECTING_ORIG_SUBADDRESS_TYPE
Definition: channel.c:9181
@ AST_REDIRECTING_FROM_NAME_CHAR_SET
Definition: channel.c:9163
@ AST_REDIRECTING_PRIV_FROM_TAG
Definition: channel.c:9211
@ AST_REDIRECTING_FROM_ID_PRESENTATION
Definition: channel.c:9140
@ AST_REDIRECTING_PRIV_FROM_NUMBER
Definition: channel.c:9199
@ AST_REDIRECTING_PRIV_TO_NUMBER_PLAN
Definition: channel.c:9187
@ AST_REDIRECTING_TO_NUMBER_VALID
Definition: channel.c:9170
@ AST_REDIRECTING_FROM_SUBADDRESS_VALID
Definition: channel.c:9150
@ AST_REDIRECTING_FROM_NAME_VALID
Definition: channel.c:9162
@ AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET
Definition: channel.c:9192
@ AST_REDIRECTING_PRIV_ORIG_TAG
Definition: channel.c:9224
@ AST_REDIRECTING_FROM_SUBADDRESS_TYPE
Definition: channel.c:9148
@ AST_REDIRECTING_PRIV_TO_TAG
Definition: channel.c:9198
@ AST_REDIRECTING_COUNT
Definition: channel.c:9146
@ AST_REDIRECTING_FROM_SUBADDRESS
Definition: channel.c:9147
@ AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET
Definition: channel.c:9218
@ AST_REDIRECTING_ORIG_NAME_VALID
Definition: channel.c:9177
@ AST_REDIRECTING_TO_ID_PRESENTATION
Definition: channel.c:9144
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN
Definition: channel.c:9200
@ AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION
Definition: channel.c:9193
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION
Definition: channel.c:9202
@ AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION
Definition: channel.c:9206
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE
Definition: channel.c:9221
@ AST_REDIRECTING_ORIG_REASON_STR
Definition: channel.c:9226
@ AST_REDIRECTING_ORIG_NAME_PRESENTATION
Definition: channel.c:9179
@ AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET
Definition: channel.c:9205
@ AST_REDIRECTING_ORIG_NUMBER
Definition: channel.c:9172
@ AST_REDIRECTING_PRIV_ORIG_NAME
Definition: channel.c:9216
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE
Definition: channel.c:9195
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID
Definition: channel.c:9213
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION
Definition: channel.c:9215
@ AST_REDIRECTING_TO_SUBADDRESS_VALID
Definition: channel.c:9154
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID
Definition: channel.c:9223
@ AST_REDIRECTING_TO_SUBADDRESS_TYPE
Definition: channel.c:9152
@ AST_REDIRECTING_REASON_STR
Definition: channel.c:9225
@ AST_REDIRECTING_FROM_NAME
Definition: channel.c:9138
@ AST_REDIRECTING_PRIV_ORIG_NUMBER
Definition: channel.c:9212
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID
Definition: channel.c:9210
@ AST_REDIRECTING_ORIG_NUMBER_PRESENTATION
Definition: channel.c:9175
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS
Definition: channel.c:9194
@ AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION
Definition: channel.c:9219
@ AST_REDIRECTING_TO_NUMBER_PRESENTATION
Definition: channel.c:9171
@ AST_REDIRECTING_FROM_NUMBER
Definition: channel.c:9137
@ AST_REDIRECTING_ORIG_NUMBER_PLAN
Definition: channel.c:9174
@ AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN
Definition: channel.c:9149
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS
Definition: channel.c:9220
@ AST_REDIRECTING_TO_SUBADDRESS
Definition: channel.c:9151
@ AST_REDIRECTING_TO_NAME_CHAR_SET
Definition: channel.c:9168

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 9478 of file channel.c.

9479{
9480 size_t pos;
9481 unsigned char ie_len;
9482 unsigned char ie_id;
9483 int32_t value;
9484 int frame_version = 1;
9485 int from_combined_presentation = 0;
9486 int got_from_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9487 int to_combined_presentation = 0;
9488 int got_to_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9489
9490 for (pos = 0; pos < datalen; pos += ie_len) {
9491 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
9492 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9493 return -1;
9494 }
9495 ie_id = data[pos++];
9496 ie_len = data[pos++];
9497 if (datalen < pos + ie_len) {
9498 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9499 return -1;
9500 }
9501
9502 switch (ie_id) {
9503/* Redirecting frame version */
9505 if (ie_len != 1) {
9506 ast_log(LOG_WARNING, "Invalid redirecting frame version (%u)\n",
9507 (unsigned) ie_len);
9508 break;
9509 }
9510 frame_version = data[pos];
9511 break;
9512/* Redirecting-orig party id name */
9514 ast_free(redirecting->orig.name.str);
9515 redirecting->orig.name.str = ast_malloc(ie_len + 1);
9516 if (redirecting->orig.name.str) {
9517 memcpy(redirecting->orig.name.str, data + pos, ie_len);
9518 redirecting->orig.name.str[ie_len] = 0;
9519 }
9520 break;
9522 if (ie_len != 1) {
9523 ast_log(LOG_WARNING, "Invalid redirecting-orig name char set (%u)\n",
9524 (unsigned) ie_len);
9525 break;
9526 }
9527 redirecting->orig.name.char_set = data[pos];
9528 break;
9530 if (ie_len != 1) {
9531 ast_log(LOG_WARNING, "Invalid redirecting-orig name presentation (%u)\n",
9532 (unsigned) ie_len);
9533 break;
9534 }
9535 redirecting->orig.name.presentation = data[pos];
9536 break;
9538 if (ie_len != 1) {
9539 ast_log(LOG_WARNING, "Invalid redirecting-orig name valid (%u)\n",
9540 (unsigned) ie_len);
9541 break;
9542 }
9543 redirecting->orig.name.valid = data[pos];
9544 break;
9545/* Redirecting-orig party id number */
9547 ast_free(redirecting->orig.number.str);
9548 redirecting->orig.number.str = ast_malloc(ie_len + 1);
9549 if (redirecting->orig.number.str) {
9550 memcpy(redirecting->orig.number.str, data + pos, ie_len);
9551 redirecting->orig.number.str[ie_len] = 0;
9552 }
9553 break;
9555 if (ie_len != 1) {
9556 ast_log(LOG_WARNING, "Invalid redirecting-orig numbering plan (%u)\n",
9557 (unsigned) ie_len);
9558 break;
9559 }
9560 redirecting->orig.number.plan = data[pos];
9561 break;
9563 if (ie_len != 1) {
9564 ast_log(LOG_WARNING, "Invalid redirecting-orig number presentation (%u)\n",
9565 (unsigned) ie_len);
9566 break;
9567 }
9568 redirecting->orig.number.presentation = data[pos];
9569 break;
9571 if (ie_len != 1) {
9572 ast_log(LOG_WARNING, "Invalid redirecting-orig number valid (%u)\n",
9573 (unsigned) ie_len);
9574 break;
9575 }
9576 redirecting->orig.number.valid = data[pos];
9577 break;
9578/* Redirecting-orig party id subaddress */
9580 ast_free(redirecting->orig.subaddress.str);
9581 redirecting->orig.subaddress.str = ast_malloc(ie_len + 1);
9582 if (redirecting->orig.subaddress.str) {
9583 memcpy(redirecting->orig.subaddress.str, data + pos, ie_len);
9584 redirecting->orig.subaddress.str[ie_len] = 0;
9585 }
9586 break;
9588 if (ie_len != 1) {
9589 ast_log(LOG_WARNING, "Invalid redirecting-orig type of subaddress (%u)\n",
9590 (unsigned) ie_len);
9591 break;
9592 }
9593 redirecting->orig.subaddress.type = data[pos];
9594 break;
9596 if (ie_len != 1) {
9598 "Invalid redirecting-orig subaddress odd-even indicator (%u)\n",
9599 (unsigned) ie_len);
9600 break;
9601 }
9602 redirecting->orig.subaddress.odd_even_indicator = data[pos];
9603 break;
9605 if (ie_len != 1) {
9606 ast_log(LOG_WARNING, "Invalid redirecting-orig subaddress valid (%u)\n",
9607 (unsigned) ie_len);
9608 break;
9609 }
9610 redirecting->orig.subaddress.valid = data[pos];
9611 break;
9612/* Redirecting-orig party id tag */
9614 ast_free(redirecting->orig.tag);
9615 redirecting->orig.tag = ast_malloc(ie_len + 1);
9616 if (redirecting->orig.tag) {
9617 memcpy(redirecting->orig.tag, data + pos, ie_len);
9618 redirecting->orig.tag[ie_len] = 0;
9619 }
9620 break;
9621/* Redirecting-from party id name */
9623 ast_free(redirecting->from.name.str);
9624 redirecting->from.name.str = ast_malloc(ie_len + 1);
9625 if (redirecting->from.name.str) {
9626 memcpy(redirecting->from.name.str, data + pos, ie_len);
9627 redirecting->from.name.str[ie_len] = 0;
9628 }
9629 break;
9631 if (ie_len != 1) {
9632 ast_log(LOG_WARNING, "Invalid redirecting-from name char set (%u)\n",
9633 (unsigned) ie_len);
9634 break;
9635 }
9636 redirecting->from.name.char_set = data[pos];
9637 break;
9639 if (ie_len != 1) {
9640 ast_log(LOG_WARNING, "Invalid redirecting-from name presentation (%u)\n",
9641 (unsigned) ie_len);
9642 break;
9643 }
9644 redirecting->from.name.presentation = data[pos];
9645 break;
9647 if (ie_len != 1) {
9648 ast_log(LOG_WARNING, "Invalid redirecting-from name valid (%u)\n",
9649 (unsigned) ie_len);
9650 break;
9651 }
9652 redirecting->from.name.valid = data[pos];
9653 break;
9654/* Redirecting-from party id number */
9656 ast_free(redirecting->from.number.str);
9657 redirecting->from.number.str = ast_malloc(ie_len + 1);
9658 if (redirecting->from.number.str) {
9659 memcpy(redirecting->from.number.str, data + pos, ie_len);
9660 redirecting->from.number.str[ie_len] = 0;
9661 }
9662 break;
9664 if (ie_len != 1) {
9665 ast_log(LOG_WARNING, "Invalid redirecting-from numbering plan (%u)\n",
9666 (unsigned) ie_len);
9667 break;
9668 }
9669 redirecting->from.number.plan = data[pos];
9670 break;
9672 if (ie_len != 1) {
9673 ast_log(LOG_WARNING, "Invalid redirecting-from number presentation (%u)\n",
9674 (unsigned) ie_len);
9675 break;
9676 }
9677 redirecting->from.number.presentation = data[pos];
9678 break;
9680 if (ie_len != 1) {
9681 ast_log(LOG_WARNING, "Invalid redirecting-from number valid (%u)\n",
9682 (unsigned) ie_len);
9683 break;
9684 }
9685 redirecting->from.number.valid = data[pos];
9686 break;
9687/* Redirecting-from party id combined presentation */
9689 if (ie_len != 1) {
9690 ast_log(LOG_WARNING, "Invalid redirecting-from combined presentation (%u)\n",
9691 (unsigned) ie_len);
9692 break;
9693 }
9694 from_combined_presentation = data[pos];
9695 got_from_combined_presentation = 1;
9696 break;
9697/* Redirecting-from party id subaddress */
9699 ast_free(redirecting->from.subaddress.str);
9700 redirecting->from.subaddress.str = ast_malloc(ie_len + 1);
9701 if (redirecting->from.subaddress.str) {
9702 memcpy(redirecting->from.subaddress.str, data + pos, ie_len);
9703 redirecting->from.subaddress.str[ie_len] = 0;
9704 }
9705 break;
9707 if (ie_len != 1) {
9708 ast_log(LOG_WARNING, "Invalid redirecting-from type of subaddress (%u)\n",
9709 (unsigned) ie_len);
9710 break;
9711 }
9712 redirecting->from.subaddress.type = data[pos];
9713 break;
9715 if (ie_len != 1) {
9717 "Invalid redirecting-from subaddress odd-even indicator (%u)\n",
9718 (unsigned) ie_len);
9719 break;
9720 }
9721 redirecting->from.subaddress.odd_even_indicator = data[pos];
9722 break;
9724 if (ie_len != 1) {
9725 ast_log(LOG_WARNING, "Invalid redirecting-from subaddress valid (%u)\n",
9726 (unsigned) ie_len);
9727 break;
9728 }
9729 redirecting->from.subaddress.valid = data[pos];
9730 break;
9731/* Redirecting-from party id tag */
9733 ast_free(redirecting->from.tag);
9734 redirecting->from.tag = ast_malloc(ie_len + 1);
9735 if (redirecting->from.tag) {
9736 memcpy(redirecting->from.tag, data + pos, ie_len);
9737 redirecting->from.tag[ie_len] = 0;
9738 }
9739 break;
9740/* Redirecting-to party id name */
9742 ast_free(redirecting->to.name.str);
9743 redirecting->to.name.str = ast_malloc(ie_len + 1);
9744 if (redirecting->to.name.str) {
9745 memcpy(redirecting->to.name.str, data + pos, ie_len);
9746 redirecting->to.name.str[ie_len] = 0;
9747 }
9748 break;
9750 if (ie_len != 1) {
9751 ast_log(LOG_WARNING, "Invalid redirecting-to name char set (%u)\n",
9752 (unsigned) ie_len);
9753 break;
9754 }
9755 redirecting->to.name.char_set = data[pos];
9756 break;
9758 if (ie_len != 1) {
9759 ast_log(LOG_WARNING, "Invalid redirecting-to name presentation (%u)\n",
9760 (unsigned) ie_len);
9761 break;
9762 }
9763 redirecting->to.name.presentation = data[pos];
9764 break;
9766 if (ie_len != 1) {
9767 ast_log(LOG_WARNING, "Invalid redirecting-to name valid (%u)\n",
9768 (unsigned) ie_len);
9769 break;
9770 }
9771 redirecting->to.name.valid = data[pos];
9772 break;
9773/* Redirecting-to party id number */
9775 ast_free(redirecting->to.number.str);
9776 redirecting->to.number.str = ast_malloc(ie_len + 1);
9777 if (redirecting->to.number.str) {
9778 memcpy(redirecting->to.number.str, data + pos, ie_len);
9779 redirecting->to.number.str[ie_len] = 0;
9780 }
9781 break;
9783 if (ie_len != 1) {
9784 ast_log(LOG_WARNING, "Invalid redirecting-to numbering plan (%u)\n",
9785 (unsigned) ie_len);
9786 break;
9787 }
9788 redirecting->to.number.plan = data[pos];
9789 break;
9791 if (ie_len != 1) {
9792 ast_log(LOG_WARNING, "Invalid redirecting-to number presentation (%u)\n",
9793 (unsigned) ie_len);
9794 break;
9795 }
9796 redirecting->to.number.presentation = data[pos];
9797 break;
9799 if (ie_len != 1) {
9800 ast_log(LOG_WARNING, "Invalid redirecting-to number valid (%u)\n",
9801 (unsigned) ie_len);
9802 break;
9803 }
9804 redirecting->to.number.valid = data[pos];
9805 break;
9806/* Redirecting-to party id combined presentation */
9808 if (ie_len != 1) {
9809 ast_log(LOG_WARNING, "Invalid redirecting-to combined presentation (%u)\n",
9810 (unsigned) ie_len);
9811 break;
9812 }
9813 to_combined_presentation = data[pos];
9814 got_to_combined_presentation = 1;
9815 break;
9816/* Redirecting-to party id subaddress */
9818 ast_free(redirecting->to.subaddress.str);
9819 redirecting->to.subaddress.str = ast_malloc(ie_len + 1);
9820 if (redirecting->to.subaddress.str) {
9821 memcpy(redirecting->to.subaddress.str, data + pos, ie_len);
9822 redirecting->to.subaddress.str[ie_len] = 0;
9823 }
9824 break;
9826 if (ie_len != 1) {
9827 ast_log(LOG_WARNING, "Invalid redirecting-to type of subaddress (%u)\n",
9828 (unsigned) ie_len);
9829 break;
9830 }
9831 redirecting->to.subaddress.type = data[pos];
9832 break;
9834 if (ie_len != 1) {
9836 "Invalid redirecting-to subaddress odd-even indicator (%u)\n",
9837 (unsigned) ie_len);
9838 break;
9839 }
9840 redirecting->to.subaddress.odd_even_indicator = data[pos];
9841 break;
9843 if (ie_len != 1) {
9844 ast_log(LOG_WARNING, "Invalid redirecting-to subaddress valid (%u)\n",
9845 (unsigned) ie_len);
9846 break;
9847 }
9848 redirecting->to.subaddress.valid = data[pos];
9849 break;
9850/* Redirecting-to party id tag */
9852 ast_free(redirecting->to.tag);
9853 redirecting->to.tag = ast_malloc(ie_len + 1);
9854 if (redirecting->to.tag) {
9855 memcpy(redirecting->to.tag, data + pos, ie_len);
9856 redirecting->to.tag[ie_len] = 0;
9857 }
9858 break;
9859/* Private redirecting-orig party id name */
9861 ast_free(redirecting->priv_orig.name.str);
9862 redirecting->priv_orig.name.str = ast_malloc(ie_len + 1);
9863 if (redirecting->priv_orig.name.str) {
9864 memcpy(redirecting->priv_orig.name.str, data + pos, ie_len);
9865 redirecting->priv_orig.name.str[ie_len] = 0;
9866 }
9867 break;
9869 if (ie_len != 1) {
9870 ast_log(LOG_WARNING, "Invalid private redirecting-orig name char set (%u)\n",
9871 (unsigned) ie_len);
9872 break;
9873 }
9874 redirecting->priv_orig.name.char_set = data[pos];
9875 break;
9877 if (ie_len != 1) {
9878 ast_log(LOG_WARNING, "Invalid private redirecting-orig name presentation (%u)\n",
9879 (unsigned) ie_len);
9880 break;
9881 }
9882 redirecting->priv_orig.name.presentation = data[pos];
9883 break;
9885 if (ie_len != 1) {
9886 ast_log(LOG_WARNING, "Invalid private redirecting-orig name valid (%u)\n",
9887 (unsigned) ie_len);
9888 break;
9889 }
9890 redirecting->priv_orig.name.valid = data[pos];
9891 break;
9892/* Private redirecting-orig party id number */
9894 ast_free(redirecting->priv_orig.number.str);
9895 redirecting->priv_orig.number.str = ast_malloc(ie_len + 1);
9896 if (redirecting->priv_orig.number.str) {
9897 memcpy(redirecting->priv_orig.number.str, data + pos, ie_len);
9898 redirecting->priv_orig.number.str[ie_len] = 0;
9899 }
9900 break;
9902 if (ie_len != 1) {
9903 ast_log(LOG_WARNING, "Invalid private redirecting-orig numbering plan (%u)\n",
9904 (unsigned) ie_len);
9905 break;
9906 }
9907 redirecting->priv_orig.number.plan = data[pos];
9908 break;
9910 if (ie_len != 1) {
9911 ast_log(LOG_WARNING, "Invalid private redirecting-orig number presentation (%u)\n",
9912 (unsigned) ie_len);
9913 break;
9914 }
9915 redirecting->priv_orig.number.presentation = data[pos];
9916 break;
9918 if (ie_len != 1) {
9919 ast_log(LOG_WARNING, "Invalid private redirecting-orig number valid (%u)\n",
9920 (unsigned) ie_len);
9921 break;
9922 }
9923 redirecting->priv_orig.number.valid = data[pos];
9924 break;
9925/* Private redirecting-orig party id subaddress */
9927 ast_free(redirecting->priv_orig.subaddress.str);
9928 redirecting->priv_orig.subaddress.str = ast_malloc(ie_len + 1);
9929 if (redirecting->priv_orig.subaddress.str) {
9930 memcpy(redirecting->priv_orig.subaddress.str, data + pos, ie_len);
9931 redirecting->priv_orig.subaddress.str[ie_len] = 0;
9932 }
9933 break;
9935 if (ie_len != 1) {
9936 ast_log(LOG_WARNING, "Invalid private redirecting-orig type of subaddress (%u)\n",
9937 (unsigned) ie_len);
9938 break;
9939 }
9940 redirecting->priv_orig.subaddress.type = data[pos];
9941 break;
9943 if (ie_len != 1) {
9945 "Invalid private redirecting-orig subaddress odd-even indicator (%u)\n",
9946 (unsigned) ie_len);
9947 break;
9948 }
9949 redirecting->priv_orig.subaddress.odd_even_indicator = data[pos];
9950 break;
9952 if (ie_len != 1) {
9953 ast_log(LOG_WARNING, "Invalid private redirecting-orig subaddress valid (%u)\n",
9954 (unsigned) ie_len);
9955 break;
9956 }
9957 redirecting->priv_orig.subaddress.valid = data[pos];
9958 break;
9959/* Private redirecting-orig party id tag */
9961 ast_free(redirecting->priv_orig.tag);
9962 redirecting->priv_orig.tag = ast_malloc(ie_len + 1);
9963 if (redirecting->priv_orig.tag) {
9964 memcpy(redirecting->priv_orig.tag, data + pos, ie_len);
9965 redirecting->priv_orig.tag[ie_len] = 0;
9966 }
9967 break;
9968/* Private redirecting-from party id name */
9970 ast_free(redirecting->priv_from.name.str);
9971 redirecting->priv_from.name.str = ast_malloc(ie_len + 1);
9972 if (redirecting->priv_from.name.str) {
9973 memcpy(redirecting->priv_from.name.str, data + pos, ie_len);
9974 redirecting->priv_from.name.str[ie_len] = 0;
9975 }
9976 break;
9978 if (ie_len != 1) {
9979 ast_log(LOG_WARNING, "Invalid private redirecting-from name char set (%u)\n",
9980 (unsigned) ie_len);
9981 break;
9982 }
9983 redirecting->priv_from.name.char_set = data[pos];
9984 break;
9986 if (ie_len != 1) {
9987 ast_log(LOG_WARNING, "Invalid private redirecting-from name presentation (%u)\n",
9988 (unsigned) ie_len);
9989 break;
9990 }
9991 redirecting->priv_from.name.presentation = data[pos];
9992 break;
9994 if (ie_len != 1) {
9995 ast_log(LOG_WARNING, "Invalid private redirecting-from name valid (%u)\n",
9996 (unsigned) ie_len);
9997 break;
9998 }
9999 redirecting->priv_from.name.valid = data[pos];
10000 break;
10001/* Private redirecting-from party id number */
10003 ast_free(redirecting->priv_from.number.str);
10004 redirecting->priv_from.number.str = ast_malloc(ie_len + 1);
10005 if (redirecting->priv_from.number.str) {
10006 memcpy(redirecting->priv_from.number.str, data + pos, ie_len);
10007 redirecting->priv_from.number.str[ie_len] = 0;
10008 }
10009 break;
10011 if (ie_len != 1) {
10012 ast_log(LOG_WARNING, "Invalid private redirecting-from numbering plan (%u)\n",
10013 (unsigned) ie_len);
10014 break;
10015 }
10016 redirecting->priv_from.number.plan = data[pos];
10017 break;
10019 if (ie_len != 1) {
10020 ast_log(LOG_WARNING, "Invalid private redirecting-from number presentation (%u)\n",
10021 (unsigned) ie_len);
10022 break;
10023 }
10024 redirecting->priv_from.number.presentation = data[pos];
10025 break;
10027 if (ie_len != 1) {
10028 ast_log(LOG_WARNING, "Invalid private redirecting-from number valid (%u)\n",
10029 (unsigned) ie_len);
10030 break;
10031 }
10032 redirecting->priv_from.number.valid = data[pos];
10033 break;
10034/* Private redirecting-from party id subaddress */
10036 ast_free(redirecting->priv_from.subaddress.str);
10037 redirecting->priv_from.subaddress.str = ast_malloc(ie_len + 1);
10038 if (redirecting->priv_from.subaddress.str) {
10039 memcpy(redirecting->priv_from.subaddress.str, data + pos, ie_len);
10040 redirecting->priv_from.subaddress.str[ie_len] = 0;
10041 }
10042 break;
10044 if (ie_len != 1) {
10045 ast_log(LOG_WARNING, "Invalid private redirecting-from type of subaddress (%u)\n",
10046 (unsigned) ie_len);
10047 break;
10048 }
10049 redirecting->priv_from.subaddress.type = data[pos];
10050 break;
10052 if (ie_len != 1) {
10054 "Invalid private redirecting-from subaddress odd-even indicator (%u)\n",
10055 (unsigned) ie_len);
10056 break;
10057 }
10058 redirecting->priv_from.subaddress.odd_even_indicator = data[pos];
10059 break;
10061 if (ie_len != 1) {
10062 ast_log(LOG_WARNING, "Invalid private redirecting-from subaddress valid (%u)\n",
10063 (unsigned) ie_len);
10064 break;
10065 }
10066 redirecting->priv_from.subaddress.valid = data[pos];
10067 break;
10068/* Private redirecting-from party id tag */
10070 ast_free(redirecting->priv_from.tag);
10071 redirecting->priv_from.tag = ast_malloc(ie_len + 1);
10072 if (redirecting->priv_from.tag) {
10073 memcpy(redirecting->priv_from.tag, data + pos, ie_len);
10074 redirecting->priv_from.tag[ie_len] = 0;
10075 }
10076 break;
10077/* Private redirecting-to party id name */
10079 ast_free(redirecting->priv_to.name.str);
10080 redirecting->priv_to.name.str = ast_malloc(ie_len + 1);
10081 if (redirecting->priv_to.name.str) {
10082 memcpy(redirecting->priv_to.name.str, data + pos, ie_len);
10083 redirecting->priv_to.name.str[ie_len] = 0;
10084 }
10085 break;
10087 if (ie_len != 1) {
10088 ast_log(LOG_WARNING, "Invalid private redirecting-to name char set (%u)\n",
10089 (unsigned) ie_len);
10090 break;
10091 }
10092 redirecting->priv_to.name.char_set = data[pos];
10093 break;
10095 if (ie_len != 1) {
10096 ast_log(LOG_WARNING, "Invalid private redirecting-to name presentation (%u)\n",
10097 (unsigned) ie_len);
10098 break;
10099 }
10100 redirecting->priv_to.name.presentation = data[pos];
10101 break;
10103 if (ie_len != 1) {
10104 ast_log(LOG_WARNING, "Invalid private redirecting-to name valid (%u)\n",
10105 (unsigned) ie_len);
10106 break;
10107 }
10108 redirecting->priv_to.name.valid = data[pos];
10109 break;
10110/* Private redirecting-to party id number */
10112 ast_free(redirecting->priv_to.number.str);
10113 redirecting->priv_to.number.str = ast_malloc(ie_len + 1);
10114 if (redirecting->priv_to.number.str) {
10115 memcpy(redirecting->priv_to.number.str, data + pos, ie_len);
10116 redirecting->priv_to.number.str[ie_len] = 0;
10117 }
10118 break;
10120 if (ie_len != 1) {
10121 ast_log(LOG_WARNING, "Invalid private redirecting-to numbering plan (%u)\n",
10122 (unsigned) ie_len);
10123 break;
10124 }
10125 redirecting->priv_to.number.plan = data[pos];
10126 break;
10128 if (ie_len != 1) {
10129 ast_log(LOG_WARNING, "Invalid private redirecting-to number presentation (%u)\n",
10130 (unsigned) ie_len);
10131 break;
10132 }
10133 redirecting->priv_to.number.presentation = data[pos];
10134 break;
10136 if (ie_len != 1) {
10137 ast_log(LOG_WARNING, "Invalid private redirecting-to number valid (%u)\n",
10138 (unsigned) ie_len);
10139 break;
10140 }
10141 redirecting->priv_to.number.valid = data[pos];
10142 break;
10143/* Private redirecting-to party id subaddress */
10145 ast_free(redirecting->priv_to.subaddress.str);
10146 redirecting->priv_to.subaddress.str = ast_malloc(ie_len + 1);
10147 if (redirecting->priv_to.subaddress.str) {
10148 memcpy(redirecting->priv_to.subaddress.str, data + pos, ie_len);
10149 redirecting->priv_to.subaddress.str[ie_len] = 0;
10150 }
10151 break;
10153 if (ie_len != 1) {
10154 ast_log(LOG_WARNING, "Invalid private redirecting-to type of subaddress (%u)\n",
10155 (unsigned) ie_len);
10156 break;
10157 }
10158 redirecting->priv_to.subaddress.type = data[pos];
10159 break;
10161 if (ie_len != 1) {
10163 "Invalid private redirecting-to subaddress odd-even indicator (%u)\n",
10164 (unsigned) ie_len);
10165 break;
10166 }
10167 redirecting->priv_to.subaddress.odd_even_indicator = data[pos];
10168 break;
10170 if (ie_len != 1) {
10171 ast_log(LOG_WARNING, "Invalid private redirecting-to subaddress valid (%u)\n",
10172 (unsigned) ie_len);
10173 break;
10174 }
10175 redirecting->priv_to.subaddress.valid = data[pos];
10176 break;
10177/* Private redirecting-to party id tag */
10179 ast_free(redirecting->priv_to.tag);
10180 redirecting->priv_to.tag = ast_malloc(ie_len + 1);
10181 if (redirecting->priv_to.tag) {
10182 memcpy(redirecting->priv_to.tag, data + pos, ie_len);
10183 redirecting->priv_to.tag[ie_len] = 0;
10184 }
10185 break;
10186/* Redirecting reason code */
10188 if (ie_len != sizeof(value)) {
10189 ast_log(LOG_WARNING, "Invalid redirecting reason (%u)\n",
10190 (unsigned) ie_len);
10191 break;
10192 }
10193 memcpy(&value, data + pos, sizeof(value));
10194 redirecting->reason.code = ntohl(value);
10195 break;
10196/* Redirecting reason string */
10198 ast_free(redirecting->reason.str);
10199 redirecting->reason.str = ast_malloc(ie_len + 1);
10200 if (redirecting->reason.str) {
10201 memcpy(redirecting->reason.str, data + pos, ie_len);
10202 redirecting->reason.str[ie_len] = 0;
10203 }
10204 break;
10205/* Redirecting orig-reason code */
10207 if (ie_len != sizeof(value)) {
10208 ast_log(LOG_WARNING, "Invalid redirecting original reason (%u)\n",
10209 (unsigned) ie_len);
10210 break;
10211 }
10212 memcpy(&value, data + pos, sizeof(value));
10213 redirecting->orig_reason.code = ntohl(value);
10214 break;
10215/* Redirecting orig-reason string */
10217 ast_free(redirecting->orig_reason.str);
10218 redirecting->orig_reason.str = ast_malloc(ie_len + 1);
10219 if (redirecting->orig_reason.str) {
10220 memcpy(redirecting->orig_reason.str, data + pos, ie_len);
10221 redirecting->orig_reason.str[ie_len] = 0;
10222 }
10223 break;
10224/* Redirecting count */
10226 if (ie_len != sizeof(value)) {
10227 ast_log(LOG_WARNING, "Invalid redirecting count (%u)\n",
10228 (unsigned) ie_len);
10229 break;
10230 }
10231 memcpy(&value, data + pos, sizeof(value));
10232 redirecting->count = ntohl(value);
10233 break;
10234/* Redirecting unknown element */
10235 default:
10236 ast_debug(1, "Unknown redirecting element: %u (%u)\n",
10237 (unsigned) ie_id, (unsigned) ie_len);
10238 break;
10239 }
10240 }
10241
10242 switch (frame_version) {
10243 case 1:
10244 /*
10245 * The other end is an earlier version that we need to adjust
10246 * for compatibility.
10247 *
10248 * The earlier version did not have the orig party id or
10249 * orig_reason value.
10250 */
10251 redirecting->from.name.valid = 1;
10253 redirecting->from.number.valid = 1;
10254 if (got_from_combined_presentation) {
10255 redirecting->from.name.presentation = from_combined_presentation;
10256 redirecting->from.number.presentation = from_combined_presentation;
10257 }
10258
10259 redirecting->to.name.valid = 1;
10261 redirecting->to.number.valid = 1;
10262 if (got_to_combined_presentation) {
10263 redirecting->to.name.presentation = to_combined_presentation;
10264 redirecting->to.number.presentation = to_combined_presentation;
10265 }
10266 break;
10267 case 2:
10268 /* The other end is at the same level as we are. */
10269 break;
10270 default:
10271 /*
10272 * The other end is newer than we are.
10273 * We need to assume that they are compatible with us.
10274 */
10275 ast_debug(1, "Redirecting frame has newer version: %u\n",
10276 (unsigned) frame_version);
10277 break;
10278 }
10279
10280 return 0;
10281}

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 7737 of file channel.c.

7738{
7739 if (groups) {
7740 ao2_ref(groups, 1);
7741 }
7742 return groups;
7743}
static struct groups groups

References ao2_ref, and groups.

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 6353 of file channel.c.

6354{
6355 return request_channel(type, request_cap, NULL, assignedids, requestor, addr, cause);
6356}
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:6218

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 6173 of file channel.c.

6174{
6175 return __ast_request_and_dial(type, cap, assignedids, requestor, addr, timeout, outstate, cidnum, cidname, NULL);
6176}
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:5975

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 6358 of file channel.c.

6359{
6360 return request_channel(type, NULL, topology, assignedids, requestor, addr, cause);
6361}

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 1574 of file channel.c.

1575{
1576 return safe_sleep_conditional(chan, ms, NULL, NULL, 1);
1577}
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:1498

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 1568 of file channel.c.

1569{
1570 return safe_sleep_conditional(chan, timeout_ms, cond, data, 1);
1571}
ast_cond_t cond
Definition: app_sla.c:330

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 1579 of file channel.c.

1580{
1581 return safe_sleep_conditional(chan, ms, NULL, NULL, 0);
1582}

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 4973 of file channel.c.

4974{
4975 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
4977 }
4978 if (ast_channel_tech(chan)->send_digit_begin) {
4980 ast_safe_sleep(chan, duration);
4981 }
4982
4983 return ast_senddigit_end(chan, digit, duration);
4984}
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition: channel.c:4873
#define AST_DEFAULT_EMULATE_DTMF_DURATION
Definition: channel.c:102
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait, look for hangups.
Definition: channel.c:1574

References ast_channel_tech(), 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 4873 of file channel.c.

4874{
4875 /* Device does not support DTMF tones, lets fake
4876 * it by doing our own generation. */
4877 static const char * const dtmf_tones[] = {
4878 "941+1336", /* 0 */
4879 "697+1209", /* 1 */
4880 "697+1336", /* 2 */
4881 "697+1477", /* 3 */
4882 "770+1209", /* 4 */
4883 "770+1336", /* 5 */
4884 "770+1477", /* 6 */
4885 "852+1209", /* 7 */
4886 "852+1336", /* 8 */
4887 "852+1477", /* 9 */
4888 "697+1633", /* A */
4889 "770+1633", /* B */
4890 "852+1633", /* C */
4891 "941+1633", /* D */
4892 "941+1209", /* * */
4893 "941+1477" /* # */
4894 };
4895
4896 if (!ast_channel_tech(chan)->send_digit_begin)
4897 return 0;
4898
4899 ast_channel_lock(chan);
4902 ast_channel_unlock(chan);
4903
4904 if (!ast_channel_tech(chan)->send_digit_begin(chan, digit))
4905 return 0;
4906
4907 if (digit >= '0' && digit <='9')
4908 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
4909 else if (digit >= 'A' && digit <= 'D')
4910 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
4911 else if (digit == '*')
4912 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
4913 else if (digit == '#')
4914 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
4915 else {
4916 /* not handled */
4917 ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4918 }
4919
4920 return 0;
4921}
void ast_channel_sending_dtmf_digit_set(struct ast_channel *chan, char value)
void ast_channel_sending_dtmf_tv_set(struct ast_channel *chan, struct timeval value)
int ast_playtones_start(struct ast_channel *chan, int vol, const char *tonelist, int interruptible)
Start playing a list of tones on a channel.
Definition: indications.c:302

References ast_channel_lock, ast_channel_name(), ast_channel_sending_dtmf_digit_set(), ast_channel_sending_dtmf_tv_set(), ast_channel_tech(), 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 4923 of file channel.c.

4924{
4925 int res = -1;
4926
4927 if (ast_channel_tech(chan)->send_digit_end)
4928 res = ast_channel_tech(chan)->send_digit_end(chan, digit, duration);
4929
4930 ast_channel_lock(chan);
4933 }
4934 ast_channel_unlock(chan);
4935
4936 if (res && ast_channel_generator(chan))
4937 ast_playtones_stop(chan);
4938
4939 return 0;
4940}
char ast_channel_sending_dtmf_digit(const struct ast_channel *chan)
void ast_playtones_stop(struct ast_channel *chan)
Stop playing tones on a channel.
Definition: indications.c:393
int(*const send_digit_end)(struct ast_channel *chan, char digit, unsigned int duration)
Stop sending a literal DTMF digit.
Definition: channel.h:690

References ast_channel_generator(), ast_channel_lock, ast_channel_sending_dtmf_digit(), ast_channel_sending_dtmf_digit_set(), ast_channel_tech(), 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 4986 of file channel.c.

4987{
4988 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
4990 }
4991 if (ast_channel_tech(chan)->send_digit_begin) {
4993 usleep(duration * 1000);
4994 }
4995
4996 return ast_senddigit_end(chan, digit, duration);
4997}

References ast_channel_tech(), 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 4951 of file channel.c.

4953{
4954 if (duration < DEFAULT_EMULATE_MF_DURATION) {
4955 duration = DEFAULT_EMULATE_MF_DURATION;
4956 }
4957 if (ast_channel_tech(chan)->send_digit_begin) {
4958 if (digit == '*') {
4959 duration = durationkp;
4960 } else if (digit == '#' || digit == 'A' || digit == 'B' || digit == 'C') {
4961 duration = durationst;
4962 }
4964 if (is_external) {
4965 usleep(duration * 1000);
4966 } else {
4967 ast_safe_sleep(chan, duration);
4968 }
4969 }
4970 return ast_senddigit_mf_end(chan);
4971}
int ast_senddigit_mf_begin(struct ast_channel *chan, char digit)
Send an MF digit to a channel.
Definition: channel.c:4834
int ast_senddigit_mf_end(struct ast_channel *chan)
End sending an MF digit to a channel.
Definition: channel.c:4942
#define DEFAULT_EMULATE_MF_DURATION
Definition: channel.c:106

References ast_channel_tech(), 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 4834 of file channel.c.

4835{
4836 static const char * const mf_tones[] = {
4837 "1300+1500", /* 0 */
4838 "700+900", /* 1 */
4839 "700+1100", /* 2 */
4840 "900+1100", /* 3 */
4841 "700+1300", /* 4 */
4842 "900+1300", /* 5 */
4843 "1100+1300", /* 6 */
4844 "700+1500", /* 7 */
4845 "900+1500", /* 8 */
4846 "1100+1500", /* 9 */
4847 "1100+1700", /* * (KP) */
4848 "1500+1700", /* # (ST) */
4849 "900+1700", /* A (STP) */
4850 "1300+1700", /* B (ST2P) */
4851 "700+1700" /* C (ST3P) */
4852 };
4853
4854 if (digit >= '0' && digit <='9') {
4855 ast_playtones_start(chan, 0, mf_tones[digit-'0'], 0);
4856 } else if (digit == '*') {
4857 ast_playtones_start(chan, 0, mf_tones[10], 0);
4858 } else if (digit == '#') {
4859 ast_playtones_start(chan, 0, mf_tones[11], 0);
4860 } else if (digit == 'A') {
4861 ast_playtones_start(chan, 0, mf_tones[12], 0);
4862 } else if (digit == 'B') {
4863 ast_playtones_start(chan, 0, mf_tones[13], 0);
4864 } else if (digit == 'C') {
4865 ast_playtones_start(chan, 0, mf_tones[14], 0);
4866 } else {
4867 /* not handled */
4868 ast_log(LOG_WARNING, "Unable to generate MF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4869 }
4870 return 0;
4871}
static const float mf_tones[]
Definition: dsp.c:325

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 4942 of file channel.c.

4943{
4944 if (ast_channel_generator(chan)) {
4945 ast_playtones_stop(chan);
4946 return 0;
4947 }
4948 return -1;
4949}

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 4808 of file channel.c.

4809{
4810 struct ast_msg_data *msg;
4811 int rc;
4812 struct ast_msg_data_attribute attrs[] =
4813 {
4814 {
4816 .value = (char *)text,
4817 }
4818 };
4819
4820 if (ast_strlen_zero(text)) {
4821 return 0;
4822 }
4823
4825 if (!msg) {
4826 return -1;
4827 }
4828 rc = ast_sendtext_data(chan, msg);
4829 ast_free(msg);
4830
4831 return rc;
4832}
char * text
Definition: app_queue.c:1639
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:4750
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
Structure used to transport a message through the frame core.

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 4750 of file channel.c.

4751{
4752 int res = 0;
4753 const char *body = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_BODY);
4754 const char *content_type = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_CONTENT_TYPE);
4755
4756 ast_channel_lock(chan);
4757 /* Stop if we're a zombie or need a soft hangup */
4759 ast_channel_unlock(chan);
4760 return -1;
4761 }
4762
4763 CHECK_BLOCKING(chan);
4764 if (ast_channel_tech(chan)->write_text
4765 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))
4767 struct ast_frame f;
4768 /* T.140 payload does not include the null byte terminator */
4769 size_t body_len = strlen(body);
4770
4771 /* Process as T.140 text (moved here from ast_sendtext() */
4772 memset(&f, 0, sizeof(f));
4773 f.src = "DIALPLAN";
4774 f.subclass.format = ast_format_t140;
4775 f.frametype = AST_FRAME_TEXT;
4776 f.datalen = body_len;
4777 f.mallocd = AST_MALLOCD_DATA;
4778 f.data.ptr = ast_strdup(body);
4779 if (f.data.ptr) {
4780 res = ast_channel_tech(chan)->write_text(chan, &f);
4781 } else {
4782 res = -1;
4783 }
4784 ast_frfree(&f);
4785 } else if ((ast_channel_tech(chan)->properties & AST_CHAN_TP_SEND_TEXT_DATA)
4786 && ast_channel_tech(chan)->send_text_data) {
4787 /* Send enhanced message to a channel driver that supports it */
4788 ast_debug(1, "Sending TEXT_DATA from '%s' to %s:%s %s\n",
4791 ast_channel_name(chan), body);
4792 res = ast_channel_tech(chan)->send_text_data(chan, msg);
4793 } else if (ast_channel_tech(chan)->send_text
4794 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))) {
4795 /* Send the body of an enhanced message to a channel driver that supports only a char str */
4796 ast_debug(1, "Sending TEXT to %s: %s\n", ast_channel_name(chan), body);
4797 res = ast_channel_tech(chan)->send_text(chan, body);
4798 } else {
4799 ast_debug(1, "Channel technology does not support sending content type '%s' on channel '%s'\n",
4800 S_OR(content_type, "text/plain"), ast_channel_name(chan));
4801 res = -1;
4802 }
4804 ast_channel_unlock(chan);
4805 return res;
4806}
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:2871
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
@ AST_MEDIA_TYPE_TEXT
Definition: codec.h:35
struct ast_format * ast_format_t140
Built-in cached t140 format.
Definition: format_cache.c:231
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:756
int(*const write_text)(struct ast_channel *chan, struct ast_frame *frame)
Write a text frame, in standard format.
Definition: channel.h:789
int(*const send_text_data)(struct ast_channel *chan, struct ast_msg_data *data)
Display or transmit text with data.
Definition: channel.h:844

References ast_begins_with(), AST_CHAN_TP_SEND_TEXT_DATA, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_nativeformats(), ast_channel_tech(), 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 7333 of file channel.c.

7334{
7335 ast_channel_lock(chan);
7336
7337 if (cid_num) {
7338 ast_channel_caller(chan)->id.number.valid = 1;
7339 ast_free(ast_channel_caller(chan)->id.number.str);
7340 ast_channel_caller(chan)->id.number.str = ast_strdup(cid_num);
7341 }
7342 if (cid_name) {
7343 ast_channel_caller(chan)->id.name.valid = 1;
7344 ast_free(ast_channel_caller(chan)->id.name.str);
7345 ast_channel_caller(chan)->id.name.str = ast_strdup(cid_name);
7346 }
7347 if (cid_ani) {
7349 ast_free(ast_channel_caller(chan)->ani.number.str);
7350 ast_channel_caller(chan)->ani.number.str = ast_strdup(cid_ani);
7351 }
7352
7354
7355 ast_channel_unlock(chan);
7356}
Number structure.
Definition: app_followme.c:154

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 2499 of file channel.c.

2500{
2502
2503 ast_channel_lock(chan);
2504 if (force || ast_strlen_zero(ast_channel_hangupsource(chan))) {
2505 ast_channel_hangupsource_set(chan, source);
2506 }
2507 ast_channel_unlock(chan);
2508
2509 if (bridge) {
2510 ast_channel_lock(bridge);
2511 if (force || ast_strlen_zero(ast_channel_hangupsource(bridge))) {
2512 ast_channel_hangupsource_set(bridge, source);
2513 }
2514 ast_channel_unlock(bridge);
2515 }
2516}
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:10563
const char * ast_channel_hangupsource(const struct ast_channel *chan)
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:2969

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 1750 of file channel.c.

1751{
1752 update_id->name = 1;
1753 update_id->number = 1;
1754 update_id->subaddress = 1;
1755}
unsigned char subaddress
Definition: channel.h:367
unsigned char number
Definition: channel.h:365
unsigned char name
Definition: channel.h:363

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 5761 of file channel.c.

5762{
5764 int res;
5765
5766 ast_assert(format != NULL);
5767
5768 if (!cap) {
5769 return -1;
5770 }
5771 ast_format_cap_append(cap, format, 0);
5772
5773 res = set_format(chan, cap, 0, 0);
5774
5775 ao2_cleanup(cap);
5776 return res;
5777}
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition: channel.c:5592
@ 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
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54

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 5779 of file channel.c.

5780{
5781 return set_format(chan, cap, 0, 0);
5782}

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 5487 of file channel.c.

5488{
5489 struct ast_trans_pvt *trans_old;
5490 struct ast_trans_pvt *trans_new;
5491
5494 /* Nothing to setup */
5495 return 0;
5496 }
5497
5498 ast_debug(1, "Channel %s setting read format path: %s -> %s\n",
5499 ast_channel_name(chan),
5500 ast_format_get_name(raw_format),
5501 ast_format_get_name(core_format));
5502
5503 /* Setup new translation path. */
5504 if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5505 trans_new = ast_translator_build_path(core_format, raw_format);
5506 if (!trans_new) {
5507 return -1;
5508 }
5509 } else {
5510 /* No translation needed. */
5511 trans_new = NULL;
5512 }
5513 trans_old = ast_channel_readtrans(chan);
5514 if (trans_old) {
5515 ast_translator_free_path(trans_old);
5516 }
5517 ast_channel_readtrans_set(chan, trans_new);
5518 ast_channel_set_rawreadformat(chan, raw_format);
5519 ast_channel_set_readformat(chan, core_format);
5520 return 0;
5521}
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_readtrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
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
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
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 8114 of file channel.c.

8115{
8116 struct ast_variable *cur;
8117
8118 for (cur = vars; cur; cur = cur->next) {
8119 pbx_builtin_setvar_helper(chan, cur->name, cur->value);
8120 }
8121}
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 5802 of file channel.c.

5803{
5805 int res;
5806
5807 ast_assert(format != NULL);
5808
5809 if (!cap) {
5810 return -1;
5811 }
5812 ast_format_cap_append(cap, format, 0);
5813
5814 res = set_format(chan, cap, 1, 0);
5815
5816 ao2_cleanup(cap);
5817 return res;
5818}

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 5820 of file channel.c.

5821{
5822 return set_format(chan, cap, 1, 0);
5823}

References set_format().

Referenced by ast_openstream_full().

◆ 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 5784 of file channel.c.

5785{
5787 int res;
5788
5789 ast_assert(format != NULL);
5790
5791 if (!cap) {
5792 return -1;
5793 }
5794 ast_format_cap_append(cap, format, 0);
5795
5796 res = set_format(chan, cap, 1, 1);
5797
5798 ao2_cleanup(cap);
5799 return res;
5800}

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 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 write format path: %s -> %s\n",
5535 ast_channel_name(chan),
5536 ast_format_get_name(core_format),
5537 ast_format_get_name(raw_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(raw_format, core_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_writetrans(chan);
5550 if (trans_old) {
5551 ast_translator_free_path(trans_old);
5552 }
5553 ast_channel_writetrans_set(chan, trans_new);
5554 ast_channel_set_rawwriteformat(chan, raw_format);
5555 ast_channel_set_writeformat(chan, core_format);
5556 return 0;
5557}
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
void ast_channel_writetrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)

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 3180 of file channel.c.

3181{
3182 return ast_settimeout_full(c, rate, func, data, 0);
3183}
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:3185

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 3185 of file channel.c.

3186{
3187 int res;
3188 unsigned int real_rate = rate, max_rate;
3189
3191
3192 if (ast_channel_timingfd(c) == -1) {
3194 return -1;
3195 }
3196
3197 if (!func) {
3198 rate = 0;
3199 data = NULL;
3200 }
3201
3202 if (rate && rate > (max_rate = ast_timer_get_max_rate(ast_channel_timer(c)))) {
3203 real_rate = max_rate;
3204 }
3205
3206 ast_debug(3, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
3207
3208 res = ast_timer_set_rate(ast_channel_timer(c), real_rate);
3209
3212 }
3213
3216
3217 if (data && is_ao2_obj) {
3218 ao2_ref(data, 1);
3220 } else {
3222 }
3223
3224 if (func == NULL && rate == 0 && ast_channel_fdno(c) == AST_TIMING_FD) {
3225 /* Clearing the timing func and setting the rate to 0
3226 * means that we don't want to be reading from the timingfd
3227 * any more. Setting c->fdno to -1 means we won't have any
3228 * errant reads from the timingfd, meaning we won't potentially
3229 * miss any important frames.
3230 */
3232 }
3233
3235
3236 return res;
3237}
void * ast_channel_timingdata(const struct ast_channel *chan)
int ast_channel_fdno(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_fdno_set(struct ast_channel *chan, int value)
#define AST_TIMING_FD
Definition: channel.h:201
void ast_channel_timingfunc_set(struct ast_channel *chan, ast_timing_func_t value)
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_channel::data, and NULL.

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 2471 of file channel.c.

2472{
2473 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
2474 int res;
2475
2476 ast_channel_lock(chan);
2477 res = ast_softhangup_nolock(chan, cause);
2478 blob = ast_json_pack("{s: i, s: b}",
2479 "cause", cause,
2480 "soft", 1);
2482 ast_channel_unlock(chan);
2483
2484 return res;
2485}

References ast_channel_hangup_request_type(), ast_channel_lock, ast_channel_publish_blob(), ast_channel_unlock, ast_json_pack(), ast_json_unref(), ast_softhangup_nolock(), NULL, and RAII_VAR.

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(), 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 493 of file channel.c.

494{
496}
static int ast_channel_softhangup_cb(void *obj, void *arg, int flags)
Definition: channel.c:484

References ao2_callback, ast_channel_softhangup_cb(), channels, NULL, OBJ_MULTIPLE, and OBJ_NODATA.

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 2458 of file channel.c.

2459{
2460 ast_debug(1, "Soft-Hanging (%#04x) up channel '%s'\n", (unsigned)cause, ast_channel_name(chan));
2461 /* Inform channel driver that we need to be hung up, if it cares */
2464 /* Interrupt any poll call or such */
2466 pthread_kill(ast_channel_blocker(chan), SIGURG);
2467 return 0;
2468}
pthread_t ast_channel_blocker(const struct ast_channel *chan)

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 636 of file channel.c.

637{
638 char *buf;
639
640 switch (state) {
641 case AST_STATE_DOWN:
642 return "Down";
644 return "Rsrvd";
646 return "OffHook";
648 return "Dialing";
649 case AST_STATE_RING:
650 return "Ring";
652 return "Ringing";
653 case AST_STATE_UP:
654 return "Up";
655 case AST_STATE_BUSY:
656 return "Busy";
658 return "Dialing Offhook";
660 return "Pre-ring";
661 case AST_STATE_MUTE:
662 return "Mute";
663 default:
665 return "Unknown";
666 snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%u)", state);
667 return buf;
668 }
669}
static struct ast_threadstorage state2str_threadbuf
Definition: channel.c:97
#define STATE2STR_BUFSIZE
Definition: channel.c:98
@ AST_STATE_MUTE
Definition: channelstate.h:47
@ AST_STATE_DIALING_OFFHOOK
Definition: channelstate.h:44
@ AST_STATE_PRERING
Definition: channelstate.h:45
@ AST_STATE_OFFHOOK
Definition: channelstate.h:38
@ AST_STATE_BUSY
Definition: channelstate.h:43
@ AST_STATE_DIALING
Definition: channelstate.h:39
@ AST_STATE_RESERVED
Definition: channelstate.h:37
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, STATE2STR_BUFSIZE, and state2str_threadbuf.

Referenced by ast_channel_snapshot_to_json(), ast_manager_build_channel_state_string_prefix(), 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 625 of file channel.c.

626{
627 int x;
628
629 for (x = 0; x < ARRAY_LEN(causes); x++)
630 if (!strncasecmp(causes[x].name, name, strlen(causes[x].name)))
631 return causes[x].cause;
632
633 return -1;
634}

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 7599 of file channel.c.

7600{
7601 int res;
7602
7603 if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
7604 return res;
7605
7606 /* Give us some wiggle room */
7607 while (ast_channel_generatordata(chan) && ast_waitfor(chan, 100) >= 0) {
7608 struct ast_frame *f = ast_read(chan);
7609 if (f)
7610 ast_frfree(f);
7611 else
7612 return -1;
7613 }
7614 return 0;
7615}
int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition: channel.c:7581

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 7581 of file channel.c.

7582{
7583 struct tonepair_def d = { 0, };
7584
7585 d.freq1 = freq1;
7586 d.freq2 = freq2;
7587 d.duration = duration;
7588 d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
7589 if (ast_activate_generator(chan, &tonepair, &d))
7590 return -1;
7591 return 0;
7592}
static struct ast_generator tonepair
Definition: channel.c:7575
int duration
Definition: channel.c:7464

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 7594 of file channel.c.

7595{
7597}
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2893

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 6484 of file channel.c.

6485{
6486 int protocol;
6487 return ast_transfer_protocol(chan, dest, &protocol);
6488}
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:6497

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 6497 of file channel.c.

6498{
6499 int res = -1;
6500
6501 if (protocol) {
6502 *protocol = 0;
6503 }
6504
6505 /* Stop if we're a zombie or need a soft hangup */
6506 ast_channel_lock(chan);
6508 if (ast_channel_tech(chan)->transfer) {
6509 res = ast_channel_tech(chan)->transfer(chan, dest);
6510 if (!res)
6511 res = 1;
6512 } else
6513 res = 0;
6514 }
6515 ast_channel_unlock(chan);
6516
6517 if (res <= 0) {
6518 return res;
6519 }
6520
6521 for (;;) {
6522 struct ast_frame *fr;
6523
6524 res = ast_waitfor(chan, -1);
6525
6526 if (res < 0 || !(fr = ast_read(chan))) {
6527 res = -1;
6528 break;
6529 }
6530
6533
6534 if (*message == AST_TRANSFER_SUCCESS) {
6535 res = 1;
6536 } else {
6537 res = -1;
6538 /* Message can contain a protocol specific code
6539 AST_TRANSFER_SUCCESS indicates success
6540 Else, failure. Protocol will be set to the failure reason.
6541 SIP example, 0 is success, else error code 3xx-6xx */
6542 if (protocol) {
6543 *protocol = *message;
6544 }
6545 }
6546
6547 ast_frfree(fr);
6548 break;
6549 }
6550
6551 ast_frfree(fr);
6552 }
6553
6554 return res;
6555}
static int transfer(void *data)
Definition: chan_pjsip.c:2129
ast_control_transfer
@ 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:783

References ast_channel_flags(), ast_channel_lock, ast_channel_tech(), 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 672 of file channel.c.

673{
674 switch (transfercapability) {
676 return "SPEECH";
678 return "DIGITAL";
680 return "RESTRICTED_DIGITAL";
682 return "3K1AUDIO";
684 return "DIGITAL_W_TONES";
686 return "VIDEO";
687 default:
688 return "UNKNOWN";
689 }
690}
#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 504 of file channel.c.

505{
507}
static int chancount
Definition: channel.c:93
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:757

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 3162 of file channel.c.

3163{
3164 if (ms < 0) {
3165 do {
3166 ms = 100000;
3167 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3168 } while (!ms);
3169 } else {
3170 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3171 }
3172 return ms;
3173}
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:2988

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 3157 of file channel.c.

3158{
3159 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
3160}

References ast_waitfor_nandfds(), c, and NULL.

Referenced by autoservice_run(), dial_exec_full(), monitor_dial(), 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 2980 of file channel.c.

2981{
2982 int winner = -1;
2983 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
2984 return winner;
2985}

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
mshow long the wait was

Big momma function here. Wait for activity on any of the n channels, or any of the nfds file descriptors.

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 2988 of file channel.c.

2990{
2991 struct timeval start = { 0 , 0 };
2992 struct pollfd *pfds = NULL;
2993 int res;
2994 long rms;
2995 int x, y, max;
2996 int sz = nfds;
2997 struct timeval now = { 0, 0 };
2998 struct timeval whentohangup = { 0, 0 }, diff;
2999 struct ast_channel *winner = NULL;
3000 struct fdmap {
3001 int chan;
3002 int fdno;
3003 } *fdmap = NULL;
3004
3005 if (outfd) {
3006 *outfd = -99999;
3007 }
3008 if (exception) {
3009 *exception = 0;
3010 }
3011
3012 for (x = 0; x < n; x++) {
3013 ast_channel_lock(c[x]);
3015 if (ast_tvzero(whentohangup))
3016 now = ast_tvnow();
3017 diff = ast_tvsub(*ast_channel_whentohangup(c[x]), now);
3018 if (diff.tv_sec < 0 || ast_tvzero(diff)) {
3019 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3020 /* Should already be hungup */
3023 return c[x];
3024 }
3025 if (ast_tvzero(whentohangup) || ast_tvcmp(diff, whentohangup) < 0)
3026 whentohangup = diff;
3027 }
3028 sz += ast_channel_fd_count(c[x]);
3030 }
3031
3032 if (!sz) {
3033 return NULL;
3034 }
3035
3036 pfds = ast_alloca(sizeof(*pfds) * sz);
3037 fdmap = ast_alloca(sizeof(*fdmap) * sz);
3038
3039 /* Wait full interval */
3040 rms = *ms;
3041 /* INT_MAX, not LONG_MAX, because it matters on 64-bit */
3042 if (!ast_tvzero(whentohangup) && whentohangup.tv_sec < INT_MAX / 1000) {
3043 rms = whentohangup.tv_sec * 1000 + whentohangup.tv_usec / 1000; /* timeout in milliseconds */
3044 if (*ms >= 0 && *ms < rms) { /* original *ms still smaller */
3045 rms = *ms;
3046 }
3047 } else if (!ast_tvzero(whentohangup) && rms < 0) {
3048 /* Tiny corner case... call would need to last >24 days */
3049 rms = INT_MAX;
3050 }
3051 /*
3052 * Build the pollfd array, putting the channels' fds first,
3053 * followed by individual fds. Order is important because
3054 * individual fd's must have priority over channel fds.
3055 */
3056 max = 0;
3057 for (x = 0; x < n; x++) {
3058 ast_channel_lock(c[x]);
3059 for (y = 0; y < ast_channel_fd_count(c[x]); y++) {
3060 fdmap[max].fdno = y; /* fd y is linked to this pfds */
3061 fdmap[max].chan = x; /* channel x is linked to this pfds */
3062 max += ast_add_fd(&pfds[max], ast_channel_fd(c[x], y));
3063 }
3064 CHECK_BLOCKING(c[x]);
3066 }
3067 /* Add the individual fds */
3068 for (x = 0; x < nfds; x++) {
3069 fdmap[max].chan = -1;
3070 max += ast_add_fd(&pfds[max], fds[x]);
3071 }
3072
3073 if (*ms > 0) {
3074 start = ast_tvnow();
3075 }
3076
3077 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
3078 do {
3079 int kbrms = rms;
3080 if (kbrms > 600000) {
3081 kbrms = 600000;
3082 }
3083 res = ast_poll(pfds, max, kbrms);
3084 if (!res) {
3085 rms -= kbrms;
3086 }
3087 } while (!res && (rms > 0));
3088 } else {
3089 res = ast_poll(pfds, max, rms);
3090 }
3091 for (x = 0; x < n; x++) {
3092 ast_channel_lock(c[x]);
3095 }
3096 if (res < 0) { /* Simulate a timeout if we were interrupted */
3097 if (errno != EINTR) {
3098 *ms = -1;
3099 }
3100 return NULL;
3101 }
3102 if (!ast_tvzero(whentohangup)) { /* if we have a timeout, check who expired */
3103 now = ast_tvnow();
3104 for (x = 0; x < n; x++) {
3106 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3108 if (winner == NULL) {
3109 winner = c[x];
3110 }
3111 }
3112 }
3113 }
3114 if (res == 0) { /* no fd ready, reset timeout and done */
3115 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
3116 return winner;
3117 }
3118 /*
3119 * Then check if any channel or fd has a pending event.
3120 * Remember to check channels first and fds last, as they
3121 * must have priority on setting 'winner'
3122 */
3123 for (x = 0; x < max; x++) {
3124 res = pfds[x].revents;
3125 if (res == 0) {
3126 continue;
3127 }
3128 if (fdmap[x].chan >= 0) { /* this is a channel */
3129 winner = c[fdmap[x].chan]; /* override previous winners */
3130 ast_channel_lock(winner);
3131 if (res & POLLPRI) {
3133 } else {
3135 }
3136 ast_channel_fdno_set(winner, fdmap[x].fdno);
3137 ast_channel_unlock(winner);
3138 } else { /* this is an fd */
3139 if (outfd) {
3140 *outfd = pfds[x].fd;
3141 }
3142 if (exception) {
3143 *exception = (res & POLLPRI) ? -1 : 0;
3144 }
3145 winner = NULL;
3146 }
3147 }
3148 if (*ms > 0) {
3149 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
3150 if (*ms < 0) {
3151 *ms = 0;
3152 }
3153 }
3154 return winner;
3155}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
int ast_channel_fd(const struct ast_channel *chan, int which)
int ast_channel_fd_count(const struct ast_channel *chan)
Retrieve the number of file decriptor positions present on the channel.
static int ast_add_fd(struct pollfd *pfd, int fd)
if fd is a valid descriptor, set *pfd with the descriptor
Definition: channel.h:2819
#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:2297

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 3239 of file channel.c.

3240{
3241 struct timeval start = ast_tvnow();
3242 int ms;
3243
3244 /* Stop if we're a zombie or need a soft hangup */
3246 return -1;
3247
3248 /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
3250
3251 /* Wait for a digit, no more than timeout_ms milliseconds total.
3252 * Or, wait indefinitely if timeout_ms is <0.
3253 */
3254 while ((ms = ast_remaining_ms(start, timeout_ms))) {
3255 struct ast_channel *rchan;
3256 int outfd = -1;
3257
3258 errno = 0;
3259 /* While ast_waitfor_nandfds tries to help by reducing the timeout by how much was waited,
3260 * it is unhelpful if it waited less than a millisecond.
3261 */
3262 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
3263
3264 if (!rchan && outfd < 0 && ms) {
3265 if (errno == 0 || errno == EINTR)
3266 continue;
3267 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
3269 return -1;
3270 } else if (outfd > -1) {
3271 /* The FD we were watching has something waiting */
3272 ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
3274 return 1;
3275 } else if (rchan) {
3276 int res;
3277 struct ast_frame *f = ast_read(c);
3278
3279 if (!f) {
3281
3282 return -1;
3283 }
3284
3285 switch (f->frametype) {
3287 break;
3288 case AST_FRAME_DTMF_END:
3289 res = f->subclass.integer;
3290 if (!breakon || strchr(breakon, res)) {
3291 ast_frfree(f);
3293 return res;
3294 }
3295 break;
3296 case AST_FRAME_CONTROL:
3297 switch (f->subclass.integer) {
3298 case AST_CONTROL_HANGUP:
3299 ast_frfree(f);
3301 return -1;
3307 /* Fall-through and treat as if it were a DTMF signal. Items
3308 * that perform stream control will handle this. */
3309 res = f->subclass.integer;
3310 ast_frfree(f);
3312 return res;
3315 case AST_CONTROL_ANSWER:
3321 case AST_CONTROL_HOLD:
3322 case AST_CONTROL_UNHOLD:
3323 case AST_CONTROL_FLASH:
3324 case -1:
3325 /* Unimportant */
3326 break;
3327 default:
3328 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass.integer);
3329 break;
3330 }
3331 break;
3332 case AST_FRAME_VOICE:
3333 /* Write audio if appropriate */
3334 if (audiofd > -1) {
3335 if (write(audiofd, f->data.ptr, f->datalen) < 0) {
3336 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
3337 }
3338 }
3339 default:
3340 /* Ignore */
3341 break;
3342 }
3343 ast_frfree(f);
3344 }
3345 }
3346
3348
3349 return 0; /* Time is up */
3350}
@ 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_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 5143 of file channel.c.

5144{
5145 return ast_write_stream(chan, -1, fr);
5146}
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:5148

References ast_write_stream().

Referenced by adsi_careful_send(), ast_prod(), ast_readaudio_callback(), ast_readvideo_callback(), 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(), 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 5148 of file channel.c.

5149{
5150 struct ast_stream *stream = NULL, *default_stream = NULL;
5151 int res = -1;
5152 struct ast_frame *f = NULL;
5153 int count = 0;
5154 int hooked = 0;
5155
5156 /*Deadlock avoidance*/
5157 while(ast_channel_trylock(chan)) {
5158 /*cannot goto done since the channel is not locked*/
5159 if(count++ > 10) {
5160 ast_debug(1, "Deadlock avoided for write to channel '%s'\n", ast_channel_name(chan));
5161 return 0;
5162 }
5163 usleep(1);
5164 }
5165
5166 /* Stop if we're a zombie or need a soft hangup */
5168 goto done;
5169 }
5170
5171 if (stream_num >= 0) {
5172 /* If we were told to write to an explicit stream then allow this frame through, no matter
5173 * if the type is expected or not (a framehook could change)
5174 */
5176 goto done;
5177 }
5179 default_stream = ast_channel_get_default_stream(chan, ast_stream_get_type(stream));
5180 } else if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO || fr->frametype == AST_FRAME_MODEM) {
5181 /* If we haven't been told of a stream then we need to figure out which once we need */
5183
5184 /* Some frame types have a fixed media type */
5185 if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO) {
5186 type = ast_format_get_type(fr->subclass.format);
5187 } else if (fr->frametype == AST_FRAME_MODEM) {
5189 }
5190
5191 /* No stream was specified, so use the default one */
5192 stream = default_stream = ast_channel_get_default_stream(chan, type);
5193 }
5194
5195 /* Perform the framehook write event here. After the frame enters the framehook list
5196 * there is no telling what will happen, how awesome is that!!! */
5197 if ((stream == default_stream) && !(fr = ast_framehook_list_write_event(ast_channel_framehooks(chan), fr))) {
5198 res = 0;
5199 goto done;
5200 }
5201
5202 if (ast_channel_generatordata(chan) && (fr->frametype != AST_FRAME_RTCP) && (!fr->src || strcasecmp(fr->src, "ast_prod"))) {
5205 } else {
5206 if (fr->frametype == AST_FRAME_DTMF_END) {
5207 /* There is a generator running while we're in the middle of a digit.
5208 * It's probably inband DTMF, so go ahead and pass it so it can
5209 * stop the generator */
5210 ast_channel_unlock(chan);
5211 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5212 ast_channel_lock(chan);
5213 } else if (fr->frametype == AST_FRAME_CONTROL
5214 && fr->subclass.integer == AST_CONTROL_UNHOLD) {
5215 /*
5216 * This is a side case where Echo is basically being called
5217 * and the person put themselves on hold and took themselves
5218 * off hold.
5219 */
5220 indicate_data_internal(chan, fr->subclass.integer, fr->data.ptr,
5221 fr->datalen);
5222 }
5223 res = 0; /* XXX explain, why 0 ? */
5224 goto done;
5225 }
5226 }
5227 /* High bit prints debugging */
5228 if (ast_channel_fout(chan) & DEBUGCHAN_FLAG)
5229 ast_frame_dump(ast_channel_name(chan), fr, ">>");
5230 switch (fr->frametype) {
5231 case AST_FRAME_CONTROL:
5232 indicate_data_internal(chan, fr->subclass.integer, fr->data.ptr, fr->datalen);
5233 res = 0;
5234 break;
5236 if (ast_channel_audiohooks(chan)) {
5237 struct ast_frame *old_frame = fr;
5239 if (old_frame != fr)
5240 f = fr;
5241 }
5242 send_dtmf_begin_event(chan, DTMF_SENT, fr->subclass.integer);
5243 ast_channel_unlock(chan);
5244 res = ast_senddigit_begin(chan, fr->subclass.integer);
5245 ast_channel_lock(chan);
5246 break;
5247 case AST_FRAME_DTMF_END:
5248 if (ast_channel_audiohooks(chan)) {
5249 struct ast_frame *new_frame = fr;
5250
5252 if (new_frame != fr) {
5253 ast_frfree(new_frame);
5254 }
5255 }
5256 send_dtmf_end_event(chan, DTMF_SENT, fr->subclass.integer, fr->len);
5257 ast_channel_unlock(chan);
5258 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5259 ast_channel_lock(chan);
5260 break;
5261 case AST_FRAME_TEXT:
5262 CHECK_BLOCKING(chan);
5263 if (ast_format_cmp(fr->subclass.format, ast_format_t140) == AST_FORMAT_CMP_EQUAL) {
5264 res = (ast_channel_tech(chan)->write_text == NULL) ? 0 :
5265 ast_channel_tech(chan)->write_text(chan, fr);
5266 } else {
5267 res = (ast_channel_tech(chan)->send_text == NULL) ? 0 :
5268 ast_channel_tech(chan)->send_text(chan, (char *) fr->data.ptr);
5269 }
5271 break;
5272 case AST_FRAME_HTML:
5273 CHECK_BLOCKING(chan);
5274 res = (ast_channel_tech(chan)->send_html == NULL) ? 0 :
5275 ast_channel_tech(chan)->send_html(chan, fr->subclass.integer, (char *) fr->data.ptr, fr->datalen);
5277 break;
5278 case AST_FRAME_VIDEO:
5279 /* XXX Handle translation of video codecs one day XXX */
5280 CHECK_BLOCKING(chan);
5281 if (ast_channel_tech(chan)->write_stream) {
5282 if (stream) {
5283 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5284 } else {
5285 res = 0;
5286 }
5287 } else if ((stream == default_stream) && ast_channel_tech(chan)->write_video) {
5288 res = ast_channel_tech(chan)->write_video(chan, fr);
5289 } else {
5290 res = 0;
5291 }
5293 break;
5294 case AST_FRAME_MODEM:
5295 CHECK_BLOCKING(chan);
5296 res = tech_write(chan, stream, default_stream, fr);
5298 break;
5299 case AST_FRAME_VOICE:
5301 apply_plc(chan, fr);
5302 }
5303
5304 f = fr;
5305
5306 /*
5307 * Send frame to audiohooks if present, if frametype is linear (else, later as per
5308 * previous behavior)
5309 */
5310 if ((stream == default_stream) && ast_channel_audiohooks(chan)) {
5311 if (ast_format_cache_is_slinear(fr->subclass.format)) {
5312 hooked = 1;
5314 }
5315 }
5316
5317 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
5318 if ((stream == default_stream) && ast_format_cmp(fr->subclass.format, ast_channel_rawwriteformat(chan)) != AST_FORMAT_CMP_EQUAL) {
5319 if (ast_format_cmp(ast_channel_writeformat(chan), fr->subclass.format) != AST_FORMAT_CMP_EQUAL) {
5320 struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5321
5322 /*
5323 * We are not setup to write this frame. Things may have changed
5324 * on the peer side of the world and we try to adjust the format to
5325 * make it compatible again. However, bad things can happen if we
5326 * cannot setup a new translation path. Problems range from no
5327 * audio, one-way audio, to garbled audio. The best we can do is
5328 * request the call to hangup since we could not make it compatible.
5329 *
5330 * Being continuously spammed by this message likely indicates a
5331 * problem with the peer because it cannot make up its mind about
5332 * which format to use.
5333 */
5334 ast_debug(1, "Channel %s changing write format from %s to %s, native formats %s\n",
5335 ast_channel_name(chan),
5337 ast_format_get_name(fr->subclass.format),
5339 if (ast_set_write_format(chan, fr->subclass.format)) {
5340 /* Could not handle the new write format. Induce a hangup. */
5341 break;
5342 }
5343 }
5344
5345 if (ast_channel_writetrans(chan)) {
5346 struct ast_frame *trans_frame = ast_translate(ast_channel_writetrans(chan), f, 0);
5347 if (trans_frame != f && f != fr) {
5348 /*
5349 * If translate gives us a new frame and so did the audio
5350 * hook then we need to free the one from the audio hook.
5351 */
5352 ast_frfree(f);
5353 }
5354 f = trans_frame;
5355 }
5356 }
5357
5358 if (!f) {
5359 res = 0;
5360 break;
5361 }
5362
5363 if ((stream == default_stream) && ast_channel_audiohooks(chan) && !hooked) {
5364 struct ast_frame *prev = NULL, *new_frame, *cur, *dup;
5365 int freeoldlist = 0;
5366
5367 if (f != fr) {
5368 freeoldlist = 1;
5369 }
5370
5371 /* Since ast_audiohook_write may return a new frame, and the cur frame is
5372 * an item in a list of frames, create a new list adding each cur frame back to it
5373 * regardless if the cur frame changes or not. */
5374 for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
5376
5377 /* if this frame is different than cur, preserve the end of the list,
5378 * free the old frames, and set cur to be the new frame */
5379 if (new_frame != cur) {
5380
5381 /* doing an ast_frisolate here seems silly, but we are not guaranteed the new_frame
5382 * isn't part of local storage, meaning if ast_audiohook_write is called multiple
5383 * times it may override the previous frame we got from it unless we dup it */
5384 if ((dup = ast_frisolate(new_frame))) {
5386 if (freeoldlist) {
5388 ast_frfree(cur);
5389 }
5390 if (new_frame != dup) {
5391 ast_frfree(new_frame);
5392 }
5393 cur = dup;
5394 }
5395 }
5396
5397 /* now, regardless if cur is new or not, add it to the new list,
5398 * if the new list has not started, cur will become the first item. */
5399 if (prev) {
5400 AST_LIST_NEXT(prev, frame_list) = cur;
5401 } else {
5402 f = cur; /* set f to be the beginning of our new list */
5403 }
5404 prev = cur;
5405 }
5406 }
5407
5408 /* the translator on chan->writetrans may have returned multiple frames
5409 from the single frame we passed in; if so, feed each one of them to the
5410 channel, freeing each one after it has been written */
5411 CHECK_BLOCKING(chan);
5412 if ((f != fr) && AST_LIST_NEXT(f, frame_list)) {
5413 struct ast_frame *cur, *next = NULL;
5414 unsigned int skip = 0;
5415
5416 cur = f;
5417 while (cur) {
5420 if (!skip) {
5421 res = tech_write(chan, stream, default_stream, cur);
5422 if (res < 0) {
5424 skip = 1;
5425 } else if (next) {
5426 /* don't do this for the last frame in the list,
5427 as the code outside the loop will do it once
5428 */
5430 }
5431 }
5432 ast_frfree(cur);
5433 cur = next;
5434 }
5435
5436 /* reset f so the code below doesn't attempt to free it */
5437 f = NULL;
5438 } else {
5439 res = tech_write(chan, stream, default_stream, f);
5440 }
5442 break;
5443 case AST_FRAME_NULL:
5444 case AST_FRAME_IAX:
5445 /* Ignore these */
5446 res = 0;
5447 break;
5448 case AST_FRAME_RTCP:
5449 /* RTCP information is on a per-stream basis and only available on multistream capable channels */
5450 CHECK_BLOCKING(chan);
5451 if (ast_channel_tech(chan)->write_stream && stream) {
5452 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5453 } else {
5454 res = 0;
5455 }
5457 break;
5458 default:
5459 /* At this point, fr is the incoming frame and f is NULL. Channels do
5460 * not expect to get NULL as a frame pointer and will segfault. Hence,
5461 * we output the original frame passed in. */
5462 CHECK_BLOCKING(chan);
5463 res = ast_channel_tech(chan)->write(chan, fr);
5465 break;
5466 }
5467
5468 if (f && f != fr)
5469 ast_frfree(f);
5470
5471 /* Consider a write failure to force a soft hangup */
5472 if (res < 0) {
5474 } else {
5476 }
5477done:
5479 /* The list gets recreated if audiohooks are added again later */
5482 }
5483 ast_channel_unlock(chan);
5484 return res;
5485}
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:1079
@ 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:565
static void send_dtmf_begin_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit)
Definition: channel.c:3369
@ DTMF_SENT
Definition: channel.c:3354
static void send_dtmf_end_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit, long duration_ms)
Definition: channel.c:3385
static int tech_write(struct ast_channel *chan, struct ast_stream *stream, struct ast_stream *default_stream, struct ast_frame *frame)
Definition: channel.c:5131
static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
Definition: channel.c:5105
#define DEBUGCHAN_FLAG
Definition: channel.h:857
#define ast_channel_trylock(chan)
Definition: channel.h:2924
void ast_channel_audiohooks_set(struct ast_channel *chan, struct ast_audiohook_list *value)
unsigned int ast_channel_fout(const struct ast_channel *chan)
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.
void ast_channel_fout_set(struct ast_channel *chan, unsigned int value)
#define FRAMECOUNT_INC(x)
Definition: channel.h:860
ast_media_type
Types of media.
Definition: codec.h:30
@ 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.
Definition: format_cache.c:534
#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.
Definition: linkedlists.h:439
#define ast_opt_generic_plc
Definition: options.h:134
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:788
int ast_stream_topology_get_count(const struct ast_stream_topology *topology)
Get the number of streams in a topology.
Definition: stream.c:765
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:750
int(*const write_video)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format.
Definition: channel.h:786
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_tech(), 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_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 5016 of file channel.c.

5017{
5018 int res;
5019 if (!ast_channel_tech(chan)->write_video)
5020 return 0;
5021 res = ast_write(chan, fr);
5022 if (!res)
5023 res = 1;
5024 return res;
5025}

References ast_channel_tech(), and 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  )

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 434 of file channel.c.

◆ 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 221 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 95 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 866 of file channel.h.

Referenced by handle_core_set_debug_channel().