Asterisk - The Open Source Telephony Project GIT-master-f36a736
Data Structures | Macros | Enumerations | Functions | Variables
channel.c File Reference

Channel Management. More...

#include "asterisk.h"
#include "asterisk/_private.h"
#include <sys/time.h>
#include <signal.h>
#include <math.h>
#include "asterisk/paths.h"
#include "asterisk/pbx.h"
#include "asterisk/frame.h"
#include "asterisk/mod_format.h"
#include "asterisk/sched.h"
#include "asterisk/channel.h"
#include "asterisk/musiconhold.h"
#include "asterisk/say.h"
#include "asterisk/file.h"
#include "asterisk/cli.h"
#include "asterisk/translate.h"
#include "asterisk/manager.h"
#include "asterisk/chanvars.h"
#include "asterisk/linkedlists.h"
#include "asterisk/indications.h"
#include "asterisk/causes.h"
#include "asterisk/callerid.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
#include "asterisk/transcap.h"
#include "asterisk/devicestate.h"
#include "asterisk/threadstorage.h"
#include "asterisk/slinfactory.h"
#include "asterisk/audiohook.h"
#include "asterisk/framehook.h"
#include "asterisk/timing.h"
#include "asterisk/autochan.h"
#include "asterisk/stringfields.h"
#include "asterisk/global_datastores.h"
#include "asterisk/channel_internal.h"
#include "asterisk/features.h"
#include "asterisk/bridge.h"
#include "asterisk/test.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/max_forwards.h"
#include "asterisk/stream.h"
#include "asterisk/message.h"
Include dependency graph for channel.c:

Go to the source code of this file.

Data Structures

struct  ast_channel_iterator
 
struct  ast_party_id_ies
 
struct  ast_party_name_ies
 
struct  ast_party_number_ies
 
struct  ast_party_redirecting_reason_ies
 
struct  ast_party_subaddress_ies
 
struct  ast_silence_generator
 
struct  backends
 the list of registered channel types More...
 
struct  causes_map
 map AST_CAUSE's to readable string representations More...
 
struct  chanlist
 List of channel drivers. More...
 
struct  external_vars
 
struct  manager_channel_variable
 List of channel variables to append to all channel-related events. More...
 
struct  namedgroup_member
 Named group member structure. More...
 
struct  plc_ds
 
struct  set_format_access
 
struct  suppress_data
 
struct  tonepair_def
 
struct  tonepair_state
 

Macros

#define AST_DEFAULT_EMULATE_DTMF_DURATION   100
 
#define AST_MIN_DTMF_GAP   45
 
#define DEFAULT_AMA_FLAGS   AST_AMA_DOCUMENTATION
 
#define DEFAULT_EMULATE_MF_DURATION   55
 
#define FORMAT   "%-15.15s %-40.40s %-13.13s %-13.13s %-13.13s %-13.13s\n"
 
#define STATE2STR_BUFSIZE   32
 

Enumerations

enum  {
  AST_CONNECTED_LINE_NUMBER , AST_CONNECTED_LINE_NAME , AST_CONNECTED_LINE_NUMBER_PLAN , AST_CONNECTED_LINE_ID_PRESENTATION ,
  AST_CONNECTED_LINE_SOURCE , AST_CONNECTED_LINE_SUBADDRESS , AST_CONNECTED_LINE_SUBADDRESS_TYPE , AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN ,
  AST_CONNECTED_LINE_SUBADDRESS_VALID , AST_CONNECTED_LINE_TAG , AST_CONNECTED_LINE_VERSION , AST_CONNECTED_LINE_NAME_VALID ,
  AST_CONNECTED_LINE_NAME_CHAR_SET , AST_CONNECTED_LINE_NAME_PRESENTATION , AST_CONNECTED_LINE_NUMBER_VALID , AST_CONNECTED_LINE_NUMBER_PRESENTATION ,
  AST_CONNECTED_LINE_PRIV_NUMBER , AST_CONNECTED_LINE_PRIV_NUMBER_PLAN , AST_CONNECTED_LINE_PRIV_NUMBER_VALID , AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION ,
  AST_CONNECTED_LINE_PRIV_NAME , AST_CONNECTED_LINE_PRIV_NAME_VALID , AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET , AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION ,
  AST_CONNECTED_LINE_PRIV_SUBADDRESS , AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE , AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN , AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID ,
  AST_CONNECTED_LINE_PRIV_TAG
}
 Element identifiers for connected line indication frame data. More...
 
enum  {
  AST_REDIRECTING_FROM_NUMBER , AST_REDIRECTING_FROM_NAME , AST_REDIRECTING_FROM_NUMBER_PLAN , AST_REDIRECTING_FROM_ID_PRESENTATION ,
  AST_REDIRECTING_TO_NUMBER , AST_REDIRECTING_TO_NAME , AST_REDIRECTING_TO_NUMBER_PLAN , AST_REDIRECTING_TO_ID_PRESENTATION ,
  AST_REDIRECTING_REASON_CODE , AST_REDIRECTING_COUNT , AST_REDIRECTING_FROM_SUBADDRESS , AST_REDIRECTING_FROM_SUBADDRESS_TYPE ,
  AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN , AST_REDIRECTING_FROM_SUBADDRESS_VALID , AST_REDIRECTING_TO_SUBADDRESS , AST_REDIRECTING_TO_SUBADDRESS_TYPE ,
  AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN , AST_REDIRECTING_TO_SUBADDRESS_VALID , AST_REDIRECTING_FROM_TAG , AST_REDIRECTING_TO_TAG ,
  AST_REDIRECTING_VERSION , AST_REDIRECTING_FROM_NAME_VALID , AST_REDIRECTING_FROM_NAME_CHAR_SET , AST_REDIRECTING_FROM_NAME_PRESENTATION ,
  AST_REDIRECTING_FROM_NUMBER_VALID , AST_REDIRECTING_FROM_NUMBER_PRESENTATION , AST_REDIRECTING_TO_NAME_VALID , AST_REDIRECTING_TO_NAME_CHAR_SET ,
  AST_REDIRECTING_TO_NAME_PRESENTATION , AST_REDIRECTING_TO_NUMBER_VALID , AST_REDIRECTING_TO_NUMBER_PRESENTATION , AST_REDIRECTING_ORIG_NUMBER ,
  AST_REDIRECTING_ORIG_NUMBER_VALID , AST_REDIRECTING_ORIG_NUMBER_PLAN , AST_REDIRECTING_ORIG_NUMBER_PRESENTATION , AST_REDIRECTING_ORIG_NAME ,
  AST_REDIRECTING_ORIG_NAME_VALID , AST_REDIRECTING_ORIG_NAME_CHAR_SET , AST_REDIRECTING_ORIG_NAME_PRESENTATION , AST_REDIRECTING_ORIG_SUBADDRESS ,
  AST_REDIRECTING_ORIG_SUBADDRESS_TYPE , AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN , AST_REDIRECTING_ORIG_SUBADDRESS_VALID , AST_REDIRECTING_ORIG_TAG ,
  AST_REDIRECTING_ORIG_REASON_CODE , AST_REDIRECTING_PRIV_TO_NUMBER , AST_REDIRECTING_PRIV_TO_NUMBER_PLAN , AST_REDIRECTING_PRIV_TO_NUMBER_VALID ,
  AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION , AST_REDIRECTING_PRIV_TO_NAME , AST_REDIRECTING_PRIV_TO_NAME_VALID , AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET ,
  AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION , AST_REDIRECTING_PRIV_TO_SUBADDRESS , AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE , AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN ,
  AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID , AST_REDIRECTING_PRIV_TO_TAG , AST_REDIRECTING_PRIV_FROM_NUMBER , AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN ,
  AST_REDIRECTING_PRIV_FROM_NUMBER_VALID , AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION , AST_REDIRECTING_PRIV_FROM_NAME , AST_REDIRECTING_PRIV_FROM_NAME_VALID ,
  AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET , AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION , AST_REDIRECTING_PRIV_FROM_SUBADDRESS , AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE ,
  AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN , AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID , AST_REDIRECTING_PRIV_FROM_TAG , AST_REDIRECTING_PRIV_ORIG_NUMBER ,
  AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID , AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN , AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION , AST_REDIRECTING_PRIV_ORIG_NAME ,
  AST_REDIRECTING_PRIV_ORIG_NAME_VALID , AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET , AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION , AST_REDIRECTING_PRIV_ORIG_SUBADDRESS ,
  AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE , AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN , AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID , AST_REDIRECTING_PRIV_ORIG_TAG ,
  AST_REDIRECTING_REASON_STR , AST_REDIRECTING_ORIG_REASON_STR
}
 Element identifiers for redirecting indication frame data. More...
 
enum  DtmfDirection { DTMF_RECEIVED , DTMF_SENT }
 

Functions

int __ast_answer (struct ast_channel *chan, unsigned int delay)
 Answer a channel, with a selectable delay before returning. More...
 
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 and linking the channel from the ao2_container. This should only be used when the channel has already been unlinked from the ao2_container. 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...
 
static struct ast_channel__ast_channel_alloc_ap (int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt, va_list ap)
 Create a new channel structure. More...
 
struct ast_channel__ast_channel_alloc_with_initializers (int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt,...)
 Create a channel structure. More...
 
struct ast_channel__ast_dummy_channel_alloc (const char *file, int line, const char *function)
 
static int __ast_queue_frame (struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
 
static struct ast_frame__ast_read (struct ast_channel *chan, int dropaudio, int dropnondefault)
 
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 attempt to place a call on it. More...
 
static void __init_state2str_threadbuf (void)
 
static void adjust_frame_for_plc (struct ast_channel *chan, struct ast_frame *frame, struct ast_datastore *datastore)
 
static void apply_plc (struct ast_channel *chan, struct ast_frame *frame)
 
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...
 
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...
 
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)
 Gives the string form of a given hangup cause. More...
 
void ast_change_name (struct ast_channel *chan, const char *newname)
 Change channel name. More...
 
const char * ast_channel_amaflags2string (enum ama_flags flag)
 Convert the enum representation of an AMA flag to a string representation. More...
 
struct ast_channelast_channel_bridge_peer (struct ast_channel *chan)
 Get the channel's bridge peer only if the bridge is two-party. More...
 
static int ast_channel_by_exten_cb (void *obj, void *arg, void *data, int flags)
 
static int ast_channel_by_name_cb (void *obj, void *arg, void *data, int flags)
 
static int ast_channel_by_uniqueid_cb (void *obj, void *arg, void *data, int flags)
 
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...
 
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...
 
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...
 
static int ast_channel_cmp_cb (void *obj, void *arg, int flags)
 
int ast_channel_cmpwhentohangup_tv (struct ast_channel *chan, struct timeval offset)
 Compare a offset with when to hangup channel. More...
 
int ast_channel_connected_line_sub (struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *connected_info, int is_frame)
 Run a connected line interception subroutine and update a channel's connected line information. More...
 
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...
 
int ast_channel_defer_dtmf (struct ast_channel *chan)
 Set defer DTMF flag on channel. More...
 
static void ast_channel_destructor (void *obj)
 Free a channel structure. More...
 
int ast_channel_early_bridge (struct ast_channel *c0, struct ast_channel *c1)
 Bridge two channels together (early) More...
 
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...
 
enum ast_channel_error ast_channel_errno (void)
 Get error code for latest channel operation. More...
 
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...
 
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...
 
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...
 
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...
 
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...
 
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...
 
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...
 
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...
 
static int ast_channel_hash_cb (const void *obj, const int flags)
 
void ast_channel_inherit_variables (const struct ast_channel *parent, struct ast_channel *child)
 Inherits channel variable from parent to child channel. 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...
 
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...
 
int ast_channel_make_compatible (struct ast_channel *chan, struct ast_channel *peer)
 Make the frame formats of two channels compatible. More...
 
static int ast_channel_make_compatible_helper (struct ast_channel *from, struct ast_channel *to)
 Set up translation from one channel to another. More...
 
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_name_to_dial_string (char *channel_name)
 Removes the trailing identifiers from a channel name string. More...
 
int ast_channel_queryoption (struct ast_channel *chan, 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...
 
const char * ast_channel_reason2str (int reason)
 return an english explanation of the code returned thru __ast_request_and_dial's 'outstate' argument More...
 
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 new telephony channel in Asterisk. 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_sendhtml (struct ast_channel *chan, int subclass, const char *data, int datalen)
 Sends HTML on given channel Send HTML or URL on link. More...
 
int ast_channel_sendurl (struct ast_channel *chan, 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_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_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...
 
int ast_channel_setoption (struct ast_channel *chan, 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 hangup channel. More...
 
static int ast_channel_softhangup_cb (void *obj, void *arg, int flags)
 
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...
 
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...
 
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...
 
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 *chan)
 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...
 
void ast_channel_undefer_dtmf (struct ast_channel *chan)
 Unset defer DTMF flag on channel. More...
 
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 channel driver. 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...
 
struct ast_channelast_channel_yank (struct ast_channel *yankee)
 Gain control of a channel in the system. More...
 
int ast_channels_init (void)
 
struct ast_variableast_channeltype_list (void)
 return an ast_variable list of channeltypes More...
 
int ast_check_hangup (struct ast_channel *chan)
 Checks 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 void ast_dummy_channel_destructor (void *obj)
 Free a dummy channel structure. More...
 
const struct ast_channel_techast_get_channel_tech (const char *name)
 Get handle to channel driver based on 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)
 Hangup 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...
 
void ast_install_music_functions (int(*start_ptr)(struct ast_channel *, const char *, const char *), void(*stop_ptr)(struct ast_channel *), void(*cleanup_ptr)(struct ast_channel *))
 
int ast_is_deferrable_frame (const struct ast_frame *frame)
 Should we keep this frame for later? More...
 
void ast_moh_cleanup (struct ast_channel *chan)
 
int ast_moh_start (struct ast_channel *chan, const char *mclass, const char *interpclass)
 Turn on music on hold on a given channel. More...
 
void ast_moh_stop (struct ast_channel *chan)
 Turn off music on hold on a given channel. 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 group and pickup group —. More...
 
char * ast_print_namedgroups (struct ast_str **buf, struct ast_namedgroups *group)
 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. 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 *fin)
 Queue one or more frames to a channel's frame queue. More...
 
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. More...
 
int ast_queue_hangup (struct ast_channel *chan)
 Queue a hangup frame for channel. More...
 
int ast_queue_hangup_with_cause (struct ast_channel *chan, int cause)
 Queue a hangup frame for channel. 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...
 
static void ast_read_generator_actions (struct ast_channel *chan, struct ast_frame *f)
 
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 ftimeout, char *enders)
 Reads multiple digits. More...
 
int ast_readstring_full (struct ast_channel *c, char *s, int len, int timeout, int ftimeout, 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 *outstate, const char *cidnum, const char *cidname)
 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, look for hangups. More...
 
int ast_safe_sleep_conditional (struct ast_channel *chan, int timeout_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_say_character_str (struct ast_channel *chan, const char *str, const char *ints, const char *lang, enum ast_say_case_sensitivity sensitivity)
 function to pronounce character and phonetic strings More...
 
int ast_say_digit_str (struct ast_channel *chan, const char *str, const char *ints, const char *lang)
 says digits of a string More...
 
int ast_say_digits (struct ast_channel *chan, int num, const char *ints, const char *lang)
 says digits More...
 
int ast_say_digits_full (struct ast_channel *chan, int num, const char *ints, const char *lang, int audiofd, int ctrlfd)
 Same as ast_say_digits() with audiofd for received audio and returns 1 on ctrlfd being readable. More...
 
int ast_say_enumeration (struct ast_channel *chan, int num, const char *ints, const char *language, const char *options)
 says an enumeration More...
 
int ast_say_money_str (struct ast_channel *chan, const char *str, const char *ints, const char *lang)
 function to pronounce monetary amounts More...
 
int ast_say_number (struct ast_channel *chan, int num, const char *ints, const char *language, const char *options)
 says a number More...
 
int ast_say_ordinal (struct ast_channel *chan, int num, const char *ints, const char *language, const char *options)
 says an ordinal number More...
 
int ast_say_phonetic_str (struct ast_channel *chan, const char *str, const char *ints, const char *lang)
 
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 *cap)
 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 *cap)
 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_setstate (struct ast_channel *chan, enum ast_channel_state state)
 Change the state of a 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 a channel, lock. More...
 
void ast_softhangup_all (void)
 Soft hangup all active channels. More...
 
int ast_softhangup_nolock (struct ast_channel *chan, int cause)
 Softly hangup a channel, don't 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)
 Convert a symbolic hangup cause to number. More...
 
 AST_THREADSTORAGE_RAW (in_intercept_routine)
 
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 call to dest, if the channel supports transfer. More...
 
int ast_transfer_protocol (struct ast_channel *chan, char *dest, int *protocol)
 Transfer a call to dest, if the channel supports transfer. More...
 
char * ast_transfercapability2str (int transfercapability)
 Gives the string form of a given transfer capability. More...
 
int ast_undestroyed_channels (void)
 
void ast_uninstall_music_functions (void)
 
struct ast_namedgroups * ast_unref_namedgroups (struct ast_namedgroups *groups)
 
int ast_waitfor (struct ast_channel *c, int ms)
 Wait for input on a channel. More...
 
struct ast_channelast_waitfor_n (struct ast_channel **c, 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)
 Wait for x amount of time on a file descriptor to have input.
More...
 
struct ast_channelast_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.
More...
 
int ast_waitfordigit (struct ast_channel *c, int ms)
 Waits for a digit. More...
 
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 monitor for reading. More...
 
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. More...
 
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. More...
 
int ast_write_video (struct ast_channel *chan, struct ast_frame *fr)
 Write video frame to a channel This function writes the given frame to the indicated channel. More...
 
static int calc_monitor_jump (int samples, int sample_rate, int seek_rate)
 calculates the number of samples to jump forward with in a monitor stream. More...
 
static void call_forward_inherit (struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
 
static void * channel_cc_params_copy (void *data)
 
static void channel_cc_params_destroy (void *data)
 
static void channel_do_masquerade (struct ast_channel *original, struct ast_channel *clonechan)
 Masquerade a channel. More...
 
static int channel_feature_hooks_set_full (struct ast_channel *chan, struct ast_bridge_features *features, int replace)
 
static struct varsheadchannel_get_external_vars (struct external_vars *channelvars, struct ast_channel *chan)
 
static int channel_has_external_vars (struct external_vars *channelvars)
 
static void channel_req_accountcodes (struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship, int precious)
 
static void channel_set_external_vars (struct external_vars *channelvars, size_t varc, char **vars)
 
static void channel_set_intercept_mode (int in_intercept_mode)
 
static void channels_shutdown (void)
 
static void clone_variables (struct ast_channel *original, struct ast_channel *clonechan)
 Clone channel variables from 'clone' channel into 'original' channel. More...
 
static char * complete_channeltypes (struct ast_cli_args *a)
 
static void deactivate_generator_nolock (struct ast_channel *chan)
 
static int deactivate_silence_generator (struct ast_channel *chan)
 
static void destroy_hooks (struct ast_channel *chan)
 
static int does_id_conflict (const char *uniqueid)
 
static const char * dtmf_direction_to_string (enum DtmfDirection direction)
 
static void features_destroy (void *obj)
 
static void free_external_channelvars (struct external_vars *channelvars)
 
static void free_translation (struct ast_channel *clonechan)
 
static int generator_force (const void *data)
 
static void generator_write_format_change (struct ast_channel *chan)
 
static void handle_cause (int cause, int *outstate)
 
static char * handle_cli_core_show_channeltype (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 Show details about a channel driver - CLI command. More...
 
static char * handle_cli_core_show_channeltypes (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 Show channel types - CLI command. More...
 
static int indicate_connected_line (struct ast_channel *chan, const void *data, size_t datalen)
 
static int indicate_data_internal (struct ast_channel *chan, int _condition, const void *data, size_t datalen)
 
static int indicate_redirecting (struct ast_channel *chan, const void *data, size_t datalen)
 
static int attribute_const is_visible_indication (enum ast_control_frame_type condition)
 
static struct ast_framekill_exception (struct ast_channel *chan)
 
static int kill_fixup (struct ast_channel *oldchan, struct ast_channel *newchan)
 
static int kill_hangup (struct ast_channel *chan)
 
static struct ast_framekill_read (struct ast_channel *chan)
 
static int kill_write (struct ast_channel *chan, struct ast_frame *frame)
 
static int namedgroup_cmp_cb (void *obj, void *arg, int flags)
 Comparison function used for named group container. More...
 
static int namedgroup_hash_cb (const void *obj, const int flags)
 Hashing function used for named group container. More...
 
static int namedgroup_match (void *obj, void *arg, int flags)
 
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)
 
static int party_name_build_data (unsigned char *data, size_t datalen, const struct ast_party_name *name, const char *label, const struct ast_party_name_ies *ies)
 
static int party_number_build_data (unsigned char *data, size_t datalen, const struct ast_party_number *number, const char *label, const struct ast_party_number_ies *ies)
 
static int party_subaddress_build_data (unsigned char *data, size_t datalen, const struct ast_party_subaddress *subaddress, const char *label, const struct ast_party_subaddress_ies *ies)
 
static void plc_ds_destroy (void *data)
 
static void prnt_channel_key (void *v_obj, void *where, ao2_prnt_fn *prnt)
 
static void queue_dtmf_readq (struct ast_channel *chan, struct ast_frame *f)
 
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)
 
static struct ast_channelrequest_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)
 
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. More...
 
static void send_dtmf_begin_event (struct ast_channel *chan, enum DtmfDirection direction, const char digit)
 
static void send_dtmf_end_event (struct ast_channel *chan, enum DtmfDirection direction, const char digit, long duration_ms)
 
static void send_flash_event (struct ast_channel *chan)
 
static void send_wink_event (struct ast_channel *chan)
 
static void set_channel_answer_time (struct ast_channel *chan)
 
static int set_format (struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
 
static int set_security_requirements (const struct ast_channel *requestor, struct ast_channel *out)
 
static int should_skip_dtmf (struct ast_channel *chan)
 Determine whether or not we should ignore DTMF in the readq. More...
 
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 no voice frames are received during dtmf processing (direct media or muted sender case using SIP INFO) More...
 
static void * silence_generator_alloc (struct ast_channel *chan, void *data)
 
static int silence_generator_generate (struct ast_channel *chan, void *data, int len, int samples)
 
static void silence_generator_release (struct ast_channel *chan, void *data)
 
static void suppress_datastore_destroy_cb (void *data)
 
static void suppress_framehook_destroy_cb (void *data)
 
static struct ast_framesuppress_framehook_event_cb (struct ast_channel *chan, struct ast_frame *frame, enum ast_framehook_event event, void *data)
 
static void suppress_framehook_fixup_cb (void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
 
static const struct ast_datastore_infosuppress_get_datastore_information (enum ast_frame_type frametype)
 
static int tech_write (struct ast_channel *chan, struct ast_stream *stream, struct ast_stream *default_stream, struct ast_frame *frame)
 
static void * tonepair_alloc (struct ast_channel *chan, void *params)
 
static int tonepair_generator (struct ast_channel *chan, void *data, int len, int samples)
 
static void tonepair_release (struct ast_channel *chan, void *params)
 
static void varshead_dtor (void *obj)
 Destructor for lists of variables. More...
 

Variables

static struct external_vars ami_vars
 
static struct external_vars ari_vars
 
const struct ast_channel_tech ast_kill_tech
 Kill the channel channel driver technology descriptor. More...
 
static void(* ast_moh_cleanup_ptr )(struct ast_channel *) = NULL
 
static int(* ast_moh_start_ptr )(struct ast_channel *, const char *, const char *) = NULL
 
static void(* ast_moh_stop_ptr )(struct ast_channel *) = NULL
 
static struct backends backends = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
 
static const struct ast_datastore_info bridge_features_info
 
static const struct causes_map causes []
 
static const struct ast_datastore_info cc_channel_datastore_info
 
static int chancount
 
static ast_mutex_t channel_move_lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} }
 
static struct ao2_containerchannels
 All active channels on the system. More...
 
static struct ast_cli_entry cli_channel []
 
unsigned long global_fin
 
unsigned long global_fout
 
static const struct ast_channel_tech null_tech
 
static const struct ast_datastore_info plc_ds_info
 
static const struct set_format_access set_format_access_read
 
static const struct set_format_access set_format_access_write
 
static struct ast_generator silence_generator
 
static struct ast_threadstorage state2str_threadbuf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_state2str_threadbuf , .custom_init = NULL , }
 
static const struct ast_datastore_info suppress_datastore_voice
 
static const struct ast_channel_tech surrogate_tech
 Channel technology used to extract a channel from a running application. The channel created with this technology will be immediately hung up - most external applications won't ever want to see this. More...
 
static struct ast_generator tonepair
 

Detailed Description

Channel Management.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file channel.c.

Macro Definition Documentation

◆ AST_DEFAULT_EMULATE_DTMF_DURATION

#define AST_DEFAULT_EMULATE_DTMF_DURATION   100

Default amount of time to use when emulating a DTMF digit as a begin and end 100ms

Definition at line 102 of file channel.c.

◆ AST_MIN_DTMF_GAP

#define AST_MIN_DTMF_GAP   45

Minimum amount of time between the end of the last digit and the beginning of a new one - 45ms

Definition at line 112 of file channel.c.

◆ DEFAULT_AMA_FLAGS

#define DEFAULT_AMA_FLAGS   AST_AMA_DOCUMENTATION

Definition at line 108 of file channel.c.

◆ DEFAULT_EMULATE_MF_DURATION

#define DEFAULT_EMULATE_MF_DURATION   55

Default amount of time to use when emulating an MF digit as a begin and end 55ms

Definition at line 106 of file channel.c.

◆ FORMAT

#define FORMAT   "%-15.15s %-40.40s %-13.13s %-13.13s %-13.13s %-13.13s\n"

◆ STATE2STR_BUFSIZE

#define STATE2STR_BUFSIZE   32

Definition at line 98 of file channel.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Element identifiers for connected line indication frame data.

Note
Only add to the end of this enum.
Enumerator
AST_CONNECTED_LINE_NUMBER 
AST_CONNECTED_LINE_NAME 
AST_CONNECTED_LINE_NUMBER_PLAN 
AST_CONNECTED_LINE_ID_PRESENTATION 
AST_CONNECTED_LINE_SOURCE 
AST_CONNECTED_LINE_SUBADDRESS 
AST_CONNECTED_LINE_SUBADDRESS_TYPE 
AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN 
AST_CONNECTED_LINE_SUBADDRESS_VALID 
AST_CONNECTED_LINE_TAG 
AST_CONNECTED_LINE_VERSION 
AST_CONNECTED_LINE_NAME_VALID 
AST_CONNECTED_LINE_NAME_CHAR_SET 
AST_CONNECTED_LINE_NAME_PRESENTATION 
AST_CONNECTED_LINE_NUMBER_VALID 
AST_CONNECTED_LINE_NUMBER_PRESENTATION 
AST_CONNECTED_LINE_PRIV_NUMBER 
AST_CONNECTED_LINE_PRIV_NUMBER_PLAN 
AST_CONNECTED_LINE_PRIV_NUMBER_VALID 
AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION 
AST_CONNECTED_LINE_PRIV_NAME 
AST_CONNECTED_LINE_PRIV_NAME_VALID 
AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET 
AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION 
AST_CONNECTED_LINE_PRIV_SUBADDRESS 
AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE 
AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN 
AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID 
AST_CONNECTED_LINE_PRIV_TAG 

Definition at line 8683 of file channel.c.

8683 {
8687 AST_CONNECTED_LINE_ID_PRESENTATION,/* Combined number and name presentation. */
8695 /*
8696 * No more party id combined number and name presentation values
8697 * need to be created.
8698 */
8717};
@ AST_CONNECTED_LINE_NUMBER_VALID
Definition: channel.c:8702
@ AST_CONNECTED_LINE_SOURCE
Definition: channel.c:8688
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID
Definition: channel.c:8715
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN
Definition: channel.c:8714
@ AST_CONNECTED_LINE_PRIV_NAME_VALID
Definition: channel.c:8709
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE
Definition: channel.c:8713
@ AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION
Definition: channel.c:8707
@ AST_CONNECTED_LINE_NAME_CHAR_SET
Definition: channel.c:8700
@ AST_CONNECTED_LINE_SUBADDRESS_VALID
Definition: channel.c:8692
@ AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN
Definition: channel.c:8691
@ AST_CONNECTED_LINE_SUBADDRESS
Definition: channel.c:8689
@ AST_CONNECTED_LINE_PRIV_NUMBER_PLAN
Definition: channel.c:8705
@ AST_CONNECTED_LINE_NUMBER
Definition: channel.c:8684
@ AST_CONNECTED_LINE_ID_PRESENTATION
Definition: channel.c:8687
@ AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION
Definition: channel.c:8711
@ AST_CONNECTED_LINE_PRIV_NAME
Definition: channel.c:8708
@ AST_CONNECTED_LINE_TAG
Definition: channel.c:8693
@ AST_CONNECTED_LINE_PRIV_NUMBER_VALID
Definition: channel.c:8706
@ AST_CONNECTED_LINE_NUMBER_PRESENTATION
Definition: channel.c:8703
@ AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET
Definition: channel.c:8710
@ AST_CONNECTED_LINE_NAME
Definition: channel.c:8685
@ AST_CONNECTED_LINE_NAME_PRESENTATION
Definition: channel.c:8701
@ AST_CONNECTED_LINE_SUBADDRESS_TYPE
Definition: channel.c:8690
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS
Definition: channel.c:8712
@ AST_CONNECTED_LINE_PRIV_TAG
Definition: channel.c:8716
@ AST_CONNECTED_LINE_NAME_VALID
Definition: channel.c:8699
@ AST_CONNECTED_LINE_PRIV_NUMBER
Definition: channel.c:8704
@ AST_CONNECTED_LINE_NUMBER_PLAN
Definition: channel.c:8686
@ AST_CONNECTED_LINE_VERSION
Definition: channel.c:8694

◆ anonymous enum

anonymous enum

Element identifiers for redirecting indication frame data.

Note
Only add to the end of this enum.
Enumerator
AST_REDIRECTING_FROM_NUMBER 
AST_REDIRECTING_FROM_NAME 
AST_REDIRECTING_FROM_NUMBER_PLAN 
AST_REDIRECTING_FROM_ID_PRESENTATION 
AST_REDIRECTING_TO_NUMBER 
AST_REDIRECTING_TO_NAME 
AST_REDIRECTING_TO_NUMBER_PLAN 
AST_REDIRECTING_TO_ID_PRESENTATION 
AST_REDIRECTING_REASON_CODE 
AST_REDIRECTING_COUNT 
AST_REDIRECTING_FROM_SUBADDRESS 
AST_REDIRECTING_FROM_SUBADDRESS_TYPE 
AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN 
AST_REDIRECTING_FROM_SUBADDRESS_VALID 
AST_REDIRECTING_TO_SUBADDRESS 
AST_REDIRECTING_TO_SUBADDRESS_TYPE 
AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN 
AST_REDIRECTING_TO_SUBADDRESS_VALID 
AST_REDIRECTING_FROM_TAG 
AST_REDIRECTING_TO_TAG 
AST_REDIRECTING_VERSION 
AST_REDIRECTING_FROM_NAME_VALID 
AST_REDIRECTING_FROM_NAME_CHAR_SET 
AST_REDIRECTING_FROM_NAME_PRESENTATION 
AST_REDIRECTING_FROM_NUMBER_VALID 
AST_REDIRECTING_FROM_NUMBER_PRESENTATION 
AST_REDIRECTING_TO_NAME_VALID 
AST_REDIRECTING_TO_NAME_CHAR_SET 
AST_REDIRECTING_TO_NAME_PRESENTATION 
AST_REDIRECTING_TO_NUMBER_VALID 
AST_REDIRECTING_TO_NUMBER_PRESENTATION 
AST_REDIRECTING_ORIG_NUMBER 
AST_REDIRECTING_ORIG_NUMBER_VALID 
AST_REDIRECTING_ORIG_NUMBER_PLAN 
AST_REDIRECTING_ORIG_NUMBER_PRESENTATION 
AST_REDIRECTING_ORIG_NAME 
AST_REDIRECTING_ORIG_NAME_VALID 
AST_REDIRECTING_ORIG_NAME_CHAR_SET 
AST_REDIRECTING_ORIG_NAME_PRESENTATION 
AST_REDIRECTING_ORIG_SUBADDRESS 
AST_REDIRECTING_ORIG_SUBADDRESS_TYPE 
AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN 
AST_REDIRECTING_ORIG_SUBADDRESS_VALID 
AST_REDIRECTING_ORIG_TAG 
AST_REDIRECTING_ORIG_REASON_CODE 
AST_REDIRECTING_PRIV_TO_NUMBER 
AST_REDIRECTING_PRIV_TO_NUMBER_PLAN 
AST_REDIRECTING_PRIV_TO_NUMBER_VALID 
AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION 
AST_REDIRECTING_PRIV_TO_NAME 
AST_REDIRECTING_PRIV_TO_NAME_VALID 
AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET 
AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION 
AST_REDIRECTING_PRIV_TO_SUBADDRESS 
AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE 
AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN 
AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID 
AST_REDIRECTING_PRIV_TO_TAG 
AST_REDIRECTING_PRIV_FROM_NUMBER 
AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN 
AST_REDIRECTING_PRIV_FROM_NUMBER_VALID 
AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION 
AST_REDIRECTING_PRIV_FROM_NAME 
AST_REDIRECTING_PRIV_FROM_NAME_VALID 
AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET 
AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION 
AST_REDIRECTING_PRIV_FROM_SUBADDRESS 
AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE 
AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN 
AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID 
AST_REDIRECTING_PRIV_FROM_TAG 
AST_REDIRECTING_PRIV_ORIG_NUMBER 
AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID 
AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN 
AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION 
AST_REDIRECTING_PRIV_ORIG_NAME 
AST_REDIRECTING_PRIV_ORIG_NAME_VALID 
AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET 
AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION 
AST_REDIRECTING_PRIV_ORIG_SUBADDRESS 
AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE 
AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN 
AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID 
AST_REDIRECTING_PRIV_ORIG_TAG 
AST_REDIRECTING_REASON_STR 
AST_REDIRECTING_ORIG_REASON_STR 

Definition at line 9159 of file channel.c.

9159 {
9163 AST_REDIRECTING_FROM_ID_PRESENTATION,/* Combined number and name presentation. */
9167 AST_REDIRECTING_TO_ID_PRESENTATION,/* Combined number and name presentation. */
9181 /*
9182 * No more party id combined number and name presentation values
9183 * need to be created.
9184 */
9250};
@ AST_REDIRECTING_FROM_NAME_PRESENTATION
Definition: channel.c:9187
@ AST_REDIRECTING_TO_NAME
Definition: channel.c:9165
@ AST_REDIRECTING_VERSION
Definition: channel.c:9180
@ AST_REDIRECTING_PRIV_FROM_NAME_VALID
Definition: channel.c:9227
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN
Definition: channel.c:9232
@ AST_REDIRECTING_TO_TAG
Definition: channel.c:9179
@ AST_REDIRECTING_FROM_NUMBER_PLAN
Definition: channel.c:9162
@ AST_REDIRECTING_PRIV_TO_NAME_VALID
Definition: channel.c:9214
@ AST_REDIRECTING_ORIG_TAG
Definition: channel.c:9207
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN
Definition: channel.c:9245
@ AST_REDIRECTING_REASON_CODE
Definition: channel.c:9168
@ AST_REDIRECTING_PRIV_TO_NUMBER_VALID
Definition: channel.c:9211
@ AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION
Definition: channel.c:9212
@ AST_REDIRECTING_ORIG_REASON_CODE
Definition: channel.c:9208
@ AST_REDIRECTING_TO_NAME_PRESENTATION
Definition: channel.c:9192
@ AST_REDIRECTING_PRIV_TO_NAME
Definition: channel.c:9213
@ AST_REDIRECTING_PRIV_ORIG_NAME_VALID
Definition: channel.c:9240
@ AST_REDIRECTING_ORIG_NUMBER_VALID
Definition: channel.c:9196
@ AST_REDIRECTING_FROM_NUMBER_PRESENTATION
Definition: channel.c:9189
@ AST_REDIRECTING_ORIG_SUBADDRESS_VALID
Definition: channel.c:9206
@ AST_REDIRECTING_FROM_NUMBER_VALID
Definition: channel.c:9188
@ AST_REDIRECTING_TO_NAME_VALID
Definition: channel.c:9190
@ AST_REDIRECTING_PRIV_FROM_NAME
Definition: channel.c:9226
@ AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN
Definition: channel.c:9176
@ AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN
Definition: channel.c:9205
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE
Definition: channel.c:9231
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID
Definition: channel.c:9220
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN
Definition: channel.c:9219
@ AST_REDIRECTING_ORIG_NAME_CHAR_SET
Definition: channel.c:9201
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS
Definition: channel.c:9230
@ AST_REDIRECTING_TO_NUMBER_PLAN
Definition: channel.c:9166
@ AST_REDIRECTING_PRIV_TO_NUMBER
Definition: channel.c:9209
@ AST_REDIRECTING_PRIV_FROM_NUMBER_VALID
Definition: channel.c:9224
@ AST_REDIRECTING_ORIG_NAME
Definition: channel.c:9199
@ AST_REDIRECTING_ORIG_SUBADDRESS
Definition: channel.c:9203
@ AST_REDIRECTING_FROM_TAG
Definition: channel.c:9178
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN
Definition: channel.c:9237
@ AST_REDIRECTING_TO_NUMBER
Definition: channel.c:9164
@ AST_REDIRECTING_ORIG_SUBADDRESS_TYPE
Definition: channel.c:9204
@ AST_REDIRECTING_FROM_NAME_CHAR_SET
Definition: channel.c:9186
@ AST_REDIRECTING_PRIV_FROM_TAG
Definition: channel.c:9234
@ AST_REDIRECTING_FROM_ID_PRESENTATION
Definition: channel.c:9163
@ AST_REDIRECTING_PRIV_FROM_NUMBER
Definition: channel.c:9222
@ AST_REDIRECTING_PRIV_TO_NUMBER_PLAN
Definition: channel.c:9210
@ AST_REDIRECTING_TO_NUMBER_VALID
Definition: channel.c:9193
@ AST_REDIRECTING_FROM_SUBADDRESS_VALID
Definition: channel.c:9173
@ AST_REDIRECTING_FROM_NAME_VALID
Definition: channel.c:9185
@ AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET
Definition: channel.c:9215
@ AST_REDIRECTING_PRIV_ORIG_TAG
Definition: channel.c:9247
@ AST_REDIRECTING_FROM_SUBADDRESS_TYPE
Definition: channel.c:9171
@ AST_REDIRECTING_PRIV_TO_TAG
Definition: channel.c:9221
@ AST_REDIRECTING_COUNT
Definition: channel.c:9169
@ AST_REDIRECTING_FROM_SUBADDRESS
Definition: channel.c:9170
@ AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET
Definition: channel.c:9241
@ AST_REDIRECTING_ORIG_NAME_VALID
Definition: channel.c:9200
@ AST_REDIRECTING_TO_ID_PRESENTATION
Definition: channel.c:9167
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN
Definition: channel.c:9223
@ AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION
Definition: channel.c:9216
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION
Definition: channel.c:9225
@ AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION
Definition: channel.c:9229
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE
Definition: channel.c:9244
@ AST_REDIRECTING_ORIG_REASON_STR
Definition: channel.c:9249
@ AST_REDIRECTING_ORIG_NAME_PRESENTATION
Definition: channel.c:9202
@ AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET
Definition: channel.c:9228
@ AST_REDIRECTING_ORIG_NUMBER
Definition: channel.c:9195
@ AST_REDIRECTING_PRIV_ORIG_NAME
Definition: channel.c:9239
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE
Definition: channel.c:9218
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID
Definition: channel.c:9236
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION
Definition: channel.c:9238
@ AST_REDIRECTING_TO_SUBADDRESS_VALID
Definition: channel.c:9177
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID
Definition: channel.c:9246
@ AST_REDIRECTING_TO_SUBADDRESS_TYPE
Definition: channel.c:9175
@ AST_REDIRECTING_REASON_STR
Definition: channel.c:9248
@ AST_REDIRECTING_FROM_NAME
Definition: channel.c:9161
@ AST_REDIRECTING_PRIV_ORIG_NUMBER
Definition: channel.c:9235
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID
Definition: channel.c:9233
@ AST_REDIRECTING_ORIG_NUMBER_PRESENTATION
Definition: channel.c:9198
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS
Definition: channel.c:9217
@ AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION
Definition: channel.c:9242
@ AST_REDIRECTING_TO_NUMBER_PRESENTATION
Definition: channel.c:9194
@ AST_REDIRECTING_FROM_NUMBER
Definition: channel.c:9160
@ AST_REDIRECTING_ORIG_NUMBER_PLAN
Definition: channel.c:9197
@ AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN
Definition: channel.c:9172
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS
Definition: channel.c:9243
@ AST_REDIRECTING_TO_SUBADDRESS
Definition: channel.c:9174
@ AST_REDIRECTING_TO_NAME_CHAR_SET
Definition: channel.c:9191

◆ DtmfDirection

Enumerator
DTMF_RECEIVED 
DTMF_SENT 

Definition at line 3372 of file channel.c.

3372 {
3374 DTMF_SENT
3375};
@ DTMF_SENT
Definition: channel.c:3374
@ DTMF_RECEIVED
Definition: channel.c:3373

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

2715{
2716 int res = 0;
2717 enum ast_channel_state old_state;
2718 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2719
2720 old_state = ast_channel_state(chan);
2721 if ((res = ast_raw_answer(chan))) {
2722 return res;
2723 }
2724
2725 switch (old_state) {
2726 case AST_STATE_RINGING:
2727 case AST_STATE_RING:
2728 /* wait for media to start flowing, but don't wait any longer
2729 * than 'delay' or 500 milliseconds, whichever is longer
2730 */
2731 do {
2733 struct ast_frame *cur;
2734 struct ast_frame *new_frame;
2735 int timeout_ms = MAX(delay, 500);
2736 unsigned int done = 0;
2737 struct timeval start;
2738
2740
2741 start = ast_tvnow();
2742 for (;;) {
2743 int ms = ast_remaining_ms(start, timeout_ms);
2744 ms = ast_waitfor(chan, ms);
2745 if (ms < 0) {
2746 ast_log(LOG_WARNING, "Error condition occurred when polling channel %s for a voice frame: %s\n", ast_channel_name(chan), strerror(errno));
2747 res = -1;
2748 break;
2749 }
2750 if (ms == 0) {
2751 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));
2752 break;
2753 }
2754 cur = ast_read(chan);
2755 if (!cur || ((cur->frametype == AST_FRAME_CONTROL) &&
2756 (cur->subclass.integer == AST_CONTROL_HANGUP))) {
2757 if (cur) {
2758 ast_frfree(cur);
2759 }
2760 res = -1;
2761 ast_debug(2, "Hangup of channel %s detected in answer routine\n", ast_channel_name(chan));
2762 break;
2763 }
2764
2765 if ((new_frame = ast_frisolate(cur)) != cur) {
2766 ast_frfree(cur);
2767 }
2768
2770
2771 /* if a specific delay period was requested, continue
2772 * until that delay has passed. don't stop just because
2773 * incoming media has arrived.
2774 */
2775 if (delay) {
2776 continue;
2777 }
2778
2779 switch (new_frame->frametype) {
2780 /* all of these frametypes qualify as 'media' */
2781 case AST_FRAME_VOICE:
2782 case AST_FRAME_VIDEO:
2783 case AST_FRAME_TEXT:
2786 case AST_FRAME_DTMF_END:
2787 case AST_FRAME_IMAGE:
2788 case AST_FRAME_HTML:
2789 case AST_FRAME_MODEM:
2790 case AST_FRAME_RTCP:
2791 done = 1;
2792 break;
2793 case AST_FRAME_CONTROL:
2794 case AST_FRAME_IAX:
2797 case AST_FRAME_NULL:
2798 case AST_FRAME_CNG:
2799 break;
2800 }
2801
2802 if (done) {
2803 break;
2804 }
2805 }
2806
2807 ast_channel_lock(chan);
2808 while ((cur = AST_LIST_REMOVE_HEAD(&frames, frame_list))) {
2809 if (res == 0) {
2810 ast_queue_frame_head(chan, cur);
2811 }
2812 ast_frfree(cur);
2813 }
2814 ast_channel_unlock(chan);
2815 } while (0);
2816 break;
2817 default:
2818 break;
2819 }
2820
2821 return res;
2822}
#define ast_log
Definition: astobj2.c:42
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4276
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:1163
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3181
int ast_raw_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2709
const char * ast_channel_name(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2968
#define ast_channel_unlock(chan)
Definition: channel.h:2969
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_change_name_nolink()

static void __ast_change_name_nolink ( struct ast_channel chan,
const char *  newname 
)
static

this function simply changes the name of the channel and issues a manager_event with out unlinking and linking the channel from the ao2_container. This should only be used when the channel has already been unlinked from the ao2_container.

Definition at line 6761 of file channel.c.

6762{
6763 /*** DOCUMENTATION
6764 <managerEvent language="en_US" name="Rename">
6765 <managerEventInstance class="EVENT_FLAG_CALL">
6766 <synopsis>Raised when the name of a channel is changed.</synopsis>
6767 </managerEventInstance>
6768 </managerEvent>
6769 ***/
6770 ast_manager_event(chan, EVENT_FLAG_CALL, "Rename",
6771 "Channel: %s\r\n"
6772 "Newname: %s\r\n"
6773 "Uniqueid: %s\r\n",
6774 ast_channel_name(chan), newname, ast_channel_uniqueid(chan));
6775 ast_channel_name_set(chan, newname);
6776}
const char * ast_channel_uniqueid(const struct ast_channel *chan)
#define EVENT_FLAG_CALL
Definition: manager.h:76
#define ast_manager_event(chan, category, event, contents,...)
Definition: manager.h:255

References ast_channel_name(), ast_channel_uniqueid(), ast_manager_event, and EVENT_FLAG_CALL.

Referenced by ast_change_name().

◆ __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, NULL, 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, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt, va_list ap)
Create a new channel structure.
Definition: channel.c:733
#define NULL
Definition: resample.c:96
Main Channel structure associated with a channel.
char exten[AST_MAX_EXTENSION]

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

◆ __ast_channel_alloc_ap()

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

Create a new channel structure.

Definition at line 733 of file channel.c.

738{
739 struct ast_channel *tmp;
740 struct varshead *headp;
741 char *tech = "", *tech2 = NULL;
742 struct ast_format_cap *nativeformats;
743 struct ast_sched_context *schedctx;
744 struct ast_timer *timer;
745 struct timeval now;
746 const struct ast_channel_tech *channel_tech;
747 struct ast_stream_topology *topology;
748
749 /* If shutting down, don't allocate any new channels */
750 if (ast_shutting_down()) {
751 ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
752 return NULL;
753 }
754
755 tmp = __ast_channel_internal_alloc_with_initializers(ast_channel_destructor, assignedids, requestor, initializers,
756 file, line, function);
757 if (!tmp) {
758 /* Channel structure allocation failure. */
759 return NULL;
760 }
761
763
764 /*
765 * Init file descriptors to unopened state so
766 * the destructor can know not to close them.
767 */
771
773 if (!nativeformats) {
774 /*
775 * Aborting the channel creation. We do not need to complete staging
776 * the channel snapshot because the channel has not been finalized or
777 * linked into the channels container yet. Nobody else knows about
778 * this channel nor will anybody ever know about it.
779 */
780 return ast_channel_unref(tmp);
781 }
782 ast_format_cap_append(nativeformats, ast_format_none, 0);
783 ast_channel_nativeformats_set(tmp, nativeformats);
784 ao2_ref(nativeformats, -1);
785
790
791 if (!(schedctx = ast_sched_context_create())) {
792 ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
793 /* See earlier channel creation abort comment above. */
794 return ast_channel_unref(tmp);
795 }
796 ast_channel_sched_set(tmp, schedctx);
797
803
804 if (cid_name) {
807 if (!ast_channel_caller(tmp)->id.name.str) {
808 /* See earlier channel creation abort comment above. */
809 return ast_channel_unref(tmp);
810 }
811 }
812 if (cid_num) {
815 if (!ast_channel_caller(tmp)->id.number.str) {
816 /* See earlier channel creation abort comment above. */
817 return ast_channel_unref(tmp);
818 }
819 }
820
821 if ((timer = ast_timer_open())) {
823 if (strcmp(ast_timer_get_name(ast_channel_timer(tmp)), "timerfd")) {
824 needqueue = 0;
825 }
827 }
828
829 if (needqueue && ast_channel_internal_alertpipe_init(tmp)) {
830 /* See earlier channel creation abort comment above. */
831 return ast_channel_unref(tmp);
832 }
833
834 if (!(topology = ast_stream_topology_alloc())) {
835 return ast_channel_unref(tmp);
836 }
838
839 /* Always watch the alertpipe */
841 /* And timing pipe */
843
844 /* Initial state */
847
850
853
854 now = ast_tvnow();
856
858
859 if (!ast_strlen_zero(name_fmt)) {
860 char *slash, *slash2;
861 /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
862 * And they all use slightly different formats for their name string.
863 * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
864 * This means, that the stringfields must have a routine that takes the va_lists directly, and
865 * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
866 * This new function was written so this can be accomplished.
867 */
868 ast_channel_name_build_va(tmp, name_fmt, ap);
870 if ((slash = strchr(tech, '/'))) {
871 if ((slash2 = strchr(slash + 1, '/'))) {
872 tech2 = slash + 1;
873 *slash2 = '\0';
874 }
875 *slash = '\0';
876 }
877 } else {
878 /*
879 * Start the string with '-' so it becomes an empty string
880 * in the destructor.
881 */
882 ast_channel_name_set(tmp, "-**Unknown**");
883 }
884
885 if (amaflag != AST_AMA_NONE) {
887 } else {
889 }
890
891 if (!ast_strlen_zero(acctcode)) {
892 ast_channel_accountcode_set(tmp, acctcode);
893 }
894 ast_channel_language_set(tmp, ast_defaultlanguage);
895
897 ast_channel_exten_set(tmp, S_OR(exten, "s"));
899
900 headp = ast_channel_varshead(tmp);
902
906
907 channel_tech = ast_get_channel_tech(tech);
908 if (!channel_tech && !ast_strlen_zero(tech2)) {
909 channel_tech = ast_get_channel_tech(tech2);
910 }
911 if (channel_tech) {
912 ast_channel_tech_set(tmp, channel_tech);
913 } else {
915 }
916
917 /* You might scream "locking inversion" at seeing this but it is actually perfectly fine.
918 * Since the channel was just created nothing can know about it yet or even acquire it.
919 */
921
923
924 if (assignedids && (does_id_conflict(assignedids->uniqueid) || does_id_conflict(assignedids->uniqueid2))) {
928 /* See earlier channel creation abort comment above. */
929 return ast_channel_unref(tmp);
930 }
931
932 /* Finalize and link into the channels container. */
936
938
939 if (endpoint) {
940 ast_endpoint_add_channel(endpoint, tmp);
941 }
942
943 /*
944 * And now, since the channel structure is built, and has its name, let
945 * the world know of its existance
946 */
948
949 ast_debug(1, "Channel %p '%s' allocated\n", tmp, ast_channel_name(tmp));
950
951 return tmp;
952}
int ast_shutting_down(void)
Definition: asterisk.c:1877
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ao2_link_flags(container, obj, flags)
Add an object to a container.
Definition: astobj2.h:1554
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
@ OBJ_NOLOCK
Assume that the ao2_container is already locked.
Definition: astobj2.h:1063
static int tmp()
Definition: bt_open.c:389
static struct ast_timer * timer
Definition: chan_iax2.c:364
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition: channel.c:2141
static int does_id_conflict(const char *uniqueid)
Definition: channel.c:711
static const struct ast_channel_tech null_tech
Definition: channel.c:702
static int chancount
Definition: channel.c:93
void ast_party_dialed_init(struct ast_party_dialed *init)
Initialize the given dialed structure.
Definition: channel.c:1947
unsigned long global_fin
Definition: channel.c:95
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2041
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
Definition: channel.c:2445
static void ast_channel_destructor(void *obj)
Free a channel structure.
Definition: channel.c:2211
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
unsigned long global_fout
Definition: channel.c:95
const struct ast_channel_tech * ast_get_channel_tech(const char *name)
Get handle to channel driver based on name.
Definition: channel.c:592
#define DEFAULT_AMA_FLAGS
Definition: channel.c:108
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition: channel.c:1997
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
struct varshead * ast_channel_varshead(struct ast_channel *chan)
int ast_channel_internal_alert_readfd(struct ast_channel *chan)
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
void ast_channel_internal_fd_clear_all(struct ast_channel *chan)
void ast_channel_hold_state_set(struct ast_channel *chan, int value)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_vstreamid_set(struct ast_channel *chan, int value)
@ AST_CHANNEL_ERROR_ID_EXISTS
Definition: channel.h:4845
void ast_channel_streamid_set(struct ast_channel *chan, int value)
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
void ast_channel_timingfd_set(struct ast_channel *chan, int value)
@ AST_AMA_NONE
Definition: channel.h:1198
#define AST_ALERT_FD
Definition: channel.h:202
void ast_channel_timer_set(struct ast_channel *chan, struct ast_timer *value)
void ast_channel_fin_set(struct ast_channel *chan, unsigned int value)
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
int ast_channel_timingfd(const struct ast_channel *chan)
#define AST_TIMING_FD
Definition: channel.h:203
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
void ast_channel_creationtime_set(struct ast_channel *chan, struct timeval *value)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:3004
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
struct ast_party_connected_line * ast_channel_connected_indicated(struct ast_channel *chan)
void ast_channel_context_set(struct ast_channel *chan, const char *value)
void ast_channel_state_set(struct ast_channel *chan, enum ast_channel_state)
void ast_channel_fout_set(struct ast_channel *chan, unsigned int value)
struct ast_autochan_list * ast_channel_autochans(struct ast_channel *chan)
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)
void ast_channel_internal_alertpipe_clear(struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)
int ast_channel_internal_alertpipe_init(struct ast_channel *chan)
void ast_channel_sched_set(struct ast_channel *chan, struct ast_sched_context *value)
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_internal_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
struct ast_channel * __ast_channel_internal_alloc_with_initializers(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const struct ast_channel_initializers *initializers, const char *file, int line, const char *function)
int ast_channel_internal_setup_topics(struct ast_channel *chan)
void ast_channel_internal_finalize(struct ast_channel *chan)
void ast_channel_internal_errno_set(enum ast_channel_error error)
int ast_endpoint_add_channel(struct ast_endpoint *endpoint, struct ast_channel *chan)
Adds a channel to the given endpoint.
struct ast_format * ast_format_none
Built-in "null" format.
Definition: format_cache.c:246
@ 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
static const char name[]
Definition: format_mp3.c:68
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_UNHOLD
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
char ast_defaultlanguage[]
Definition: options.c:98
void ast_pbx_hangup_handler_init(struct ast_channel *chan)
Init the hangup handler container on a channel.
struct ast_sched_context * ast_sched_context_create(void)
Create a scheduler context.
Definition: sched.c:238
struct ast_stream_topology * ast_stream_topology_alloc(void)
Create a stream topology.
Definition: stream.c:652
#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
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
const char * uniqueid2
Definition: channel.h:608
const char * uniqueid
Definition: channel.h:607
Structure to describe a channel "technology", ie a channel driver See for examples:
Definition: channel.h:648
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
struct ast_party_id id
Caller party ID.
Definition: channel.h:422
struct ast_party_name name
Subscriber name.
Definition: channel.h:342
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:344
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:281
char * str
Subscriber name (Malloced)
Definition: channel.h:266
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:299
char * str
Subscriber phone number (Malloced)
Definition: channel.h:293
Number structure.
Definition: app_followme.c:154
const char * ast_timer_get_name(const struct ast_timer *handle)
Get name of timer in use.
Definition: timing.c:196
struct ast_timer * ast_timer_open(void)
Open a timer.
Definition: timing.c:122
int ast_timer_fd(const struct ast_timer *handle)
Get a poll()-able file descriptor for a timer.
Definition: timing.c:161

References __ast_channel_internal_alloc_with_initializers(), ao2_link_flags, ao2_lock, ao2_ref, ao2_unlock, AST_ALERT_FD, AST_AMA_NONE, ast_atomic_fetchadd_int(), ast_channel_amaflags_set(), ast_channel_autochans(), ast_channel_caller(), ast_channel_connected(), ast_channel_connected_indicated(), ast_channel_context_set(), ast_channel_creationtime_set(), ast_channel_datastores(), ast_channel_destructor(), ast_channel_dialed(), AST_CHANNEL_ERROR_ID_EXISTS, ast_channel_exten_set(), ast_channel_fin_set(), ast_channel_fout_set(), ast_channel_hold_state_set(), ast_channel_internal_alert_readfd(), ast_channel_internal_alertpipe_clear(), ast_channel_internal_alertpipe_init(), ast_channel_internal_errno_set(), ast_channel_internal_fd_clear_all(), ast_channel_internal_finalize(), ast_channel_internal_set_stream_topology(), ast_channel_internal_setup_topics(), ast_channel_lock, ast_channel_name(), ast_channel_nativeformats_set(), ast_channel_priority_set(), ast_channel_redirecting(), ast_channel_sched_set(), ast_channel_set_fd(), ast_channel_set_rawreadformat(), ast_channel_set_rawwriteformat(), ast_channel_set_readformat(), ast_channel_set_writeformat(), ast_channel_stage_snapshot(), ast_channel_stage_snapshot_done(), ast_channel_state_set(), ast_channel_streamid_set(), ast_channel_tech_set(), ast_channel_timer(), ast_channel_timer_set(), ast_channel_timingfd(), ast_channel_timingfd_set(), ast_channel_unlock, ast_channel_unref, ast_channel_varshead(), ast_channel_vstreamid_set(), AST_CONTROL_UNHOLD, ast_debug, ast_defaultlanguage, ast_endpoint_add_channel(), ast_format_cap_alloc, ast_format_cap_append, AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_none, ast_get_channel_tech(), AST_LIST_HEAD_INIT_NOLOCK, ast_log, ast_party_caller_init(), ast_party_connected_line_init(), ast_party_dialed_init(), ast_party_redirecting_init(), ast_pbx_hangup_handler_init(), ast_sched_context_create(), ast_shutting_down(), ast_strdup, ast_strdupa, ast_stream_topology_alloc(), ast_strlen_zero(), ast_timer_fd(), ast_timer_get_name(), ast_timer_open(), AST_TIMING_FD, ast_tvnow(), chancount, channels, voicemailpwcheck::context, DEFAULT_AMA_FLAGS, does_id_conflict(), make_ari_stubs::file, global_fin, global_fout, ast_party_caller::id, LOG_WARNING, name, ast_party_id::name, NULL, null_tech, ast_party_id::number, OBJ_NOLOCK, S_OR, ast_party_name::str, ast_party_number::str, timer, tmp(), ast_party_name::valid, and ast_party_number::valid.

Referenced by __ast_channel_alloc(), and __ast_channel_alloc_with_initializers().

◆ __ast_channel_alloc_with_initializers()

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

Create a channel structure.

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

Definition at line 973 of file channel.c.

980{
981 va_list ap;
982 struct ast_channel *result;
983
984 va_start(ap, name_fmt);
985 result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
986 assignedids, requestor, amaflag, endpoint, initializers, file, line, function, name_fmt, ap);
987 va_end(ap);
988
989 return result;
990}

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

995{
996 struct ast_channel *tmp;
997 struct varshead *headp;
998
1000 file, line, function);
1001 if (!tmp) {
1002 /* Dummy channel structure allocation failure. */
1003 return NULL;
1004 }
1005
1008
1009 /*
1010 * Init file descriptors to unopened state just in case
1011 * autoservice is called on the channel or something tries to
1012 * read a frame from it.
1013 */
1017
1019
1021
1022 headp = ast_channel_varshead(tmp);
1024
1025 return tmp;
1026}
static void ast_dummy_channel_destructor(void *obj)
Free a dummy channel structure.
Definition: channel.c:2352
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)

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

static int __ast_queue_frame ( struct ast_channel chan,
struct ast_frame fin,
int  head,
struct ast_frame after 
)
static

Definition at line 1028 of file channel.c.

1029{
1030 struct ast_frame *f;
1031 struct ast_frame *cur;
1032 unsigned int new_frames = 0;
1033 unsigned int new_voice_frames = 0;
1034 unsigned int queued_frames = 0;
1035 unsigned int queued_voice_frames = 0;
1037
1038 ast_channel_lock(chan);
1039
1040 /*
1041 * Check the last frame on the queue if we are queuing the new
1042 * frames after it.
1043 */
1044 cur = AST_LIST_LAST(ast_channel_readq(chan));
1045 if (cur && cur->frametype == AST_FRAME_CONTROL && !head && (!after || after == cur)) {
1046 switch (cur->subclass.integer) {
1048 if (fin->frametype == AST_FRAME_CONTROL
1049 && fin->subclass.integer == AST_CONTROL_HANGUP) {
1050 /*
1051 * Destroy the end-of-Q marker frame so we can queue the hangup
1052 * frame in its place.
1053 */
1055 ast_frfree(cur);
1056
1057 /*
1058 * This has degenerated to a normal queue append anyway. Since
1059 * we just destroyed the last frame in the queue we must make
1060 * sure that "after" is NULL or bad things will happen.
1061 */
1062 after = NULL;
1063 break;
1064 }
1065 /* Fall through */
1066 case AST_CONTROL_HANGUP:
1067 /* Don't queue anything. */
1068 ast_channel_unlock(chan);
1069 return 0;
1070 default:
1071 break;
1072 }
1073 }
1074
1075 /* Build copies of all the new frames and count them */
1077 for (cur = fin; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
1078 if (!(f = ast_frdup(cur))) {
1079 if (AST_LIST_FIRST(&frames)) {
1081 }
1082 ast_channel_unlock(chan);
1083 return -1;
1084 }
1085
1087 new_frames++;
1088 if (f->frametype == AST_FRAME_VOICE) {
1089 new_voice_frames++;
1090 }
1091 }
1092
1093 /* Count how many frames exist on the queue */
1095 queued_frames++;
1096 if (cur->frametype == AST_FRAME_VOICE) {
1097 queued_voice_frames++;
1098 }
1099 }
1100
1101 if ((queued_frames + new_frames > 128 || queued_voice_frames + new_voice_frames > 96)) {
1102 int total_queued = queued_frames + new_frames;
1103 int total_voice = queued_voice_frames + new_voice_frames;
1104 int count = 0;
1105 ast_log(LOG_WARNING, "Exceptionally long %squeue length (%d voice / %d total) queuing to %s\n",
1106 queued_frames + new_frames > 128 ? "" : "voice ", total_voice, total_queued, ast_channel_name(chan));
1108 /* Save the most recent frame */
1109 if (!AST_LIST_NEXT(cur, frame_list)) {
1110 break;
1111 } else if (cur->frametype == AST_FRAME_VOICE || cur->frametype == AST_FRAME_VIDEO || cur->frametype == AST_FRAME_NULL) {
1112 if (++count > 64) {
1113 break;
1114 }
1116 ast_frfree(cur);
1117
1118 /* Read from the alert pipe for each flushed frame. */
1120 }
1121 }
1123 if (count) {
1124 ast_debug(4, "Discarded %d frame%s due to queue overload on %s\n", count, ESS(count), ast_channel_name(chan));
1125 }
1126 }
1127
1128 if (after) {
1130 } else {
1131 if (head) {
1134 }
1136 }
1137
1138 if (ast_channel_alert_writable(chan)) {
1139 /* Write to the alert pipe for each added frame */
1140 while (new_frames--) {
1141 if (ast_channel_alert_write(chan)) {
1142 ast_log(LOG_WARNING, "Unable to write to alert pipe on %s (qlen = %u): %s!\n",
1143 ast_channel_name(chan), queued_frames, strerror(errno));
1144 break;
1145 }
1146 }
1147 } else if (ast_channel_timingfd(chan) > -1) {
1150 pthread_kill(ast_channel_blocker(chan), SIGURG);
1151 }
1152
1153 ast_channel_unlock(chan);
1154
1155 return 0;
1156}
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
pthread_t ast_channel_blocker(const struct ast_channel *chan)
int ast_channel_alert_write(struct ast_channel *chan)
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
ast_alert_status_t ast_channel_internal_alert_read(struct ast_channel *chan)
@ AST_FLAG_BLOCKING
Definition: channel.h:1005
int ast_channel_alert_writable(struct ast_channel *chan)
#define ESS(x)
Definition: cli.h:59
#define ast_frdup(fr)
Copies a frame.
@ AST_CONTROL_END_OF_Q
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:429
#define AST_LIST_INSERT_LIST_AFTER(head, list, elm, field)
Inserts a whole list after a specific entry in a list.
Definition: linkedlists.h:812
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:491
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: linkedlists.h:856
#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
#define AST_LIST_APPEND_LIST(head, list, field)
Appends a whole list to the tail of a list.
Definition: linkedlists.h:783
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:421
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:439
int ast_timer_enable_continuous(const struct ast_timer *handle)
Enable continuous mode.
Definition: timing.c:176
#define ast_test_flag(p, flag)
Definition: utils.h:63

References ast_channel_alert_writable(), ast_channel_alert_write(), ast_channel_blocker(), ast_channel_flags(), ast_channel_internal_alert_read(), ast_channel_lock, ast_channel_name(), ast_channel_readq(), ast_channel_timer(), ast_channel_timingfd(), ast_channel_unlock, AST_CONTROL_END_OF_Q, AST_CONTROL_HANGUP, ast_debug, AST_FLAG_BLOCKING, AST_FRAME_CONTROL, AST_FRAME_NULL, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_frdup, ast_frfree, AST_LIST_APPEND_LIST, AST_LIST_FIRST, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_HEAD_NOLOCK, AST_LIST_INSERT_LIST_AFTER, AST_LIST_INSERT_TAIL, AST_LIST_LAST, AST_LIST_NEXT, AST_LIST_REMOVE, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_log, ast_test_flag, ast_timer_enable_continuous(), errno, ESS, frames, ast_frame::frametype, ast_frame_subclass::integer, LOG_WARNING, NULL, and ast_frame::subclass.

Referenced by __ast_read(), ast_queue_frame(), and ast_queue_frame_head().

◆ __ast_read()

static struct ast_frame * __ast_read ( struct ast_channel chan,
int  dropaudio,
int  dropnondefault 
)
static
Todo:
XXX It is possible to write a digit to the audiohook twice if the digit was originally read while the channel was in autoservice.

Definition at line 3544 of file channel.c.

3545{
3546 struct ast_frame *f = NULL; /* the return value */
3547 int prestate;
3548 int cause = 0;
3549 struct ast_stream *stream = NULL, *default_stream = NULL;
3550
3551 /* this function is very long so make sure there is only one return
3552 * point at the end (there are only two exceptions to this).
3553 */
3554 ast_channel_lock(chan);
3555
3556 /* Stop if we're a zombie or need a soft hangup */
3558 if (ast_channel_generator(chan))
3560
3561 /*
3562 * It is possible for chan->_softhangup to be set and there
3563 * still be control frames that need to be read. Instead of
3564 * just going to 'done' in the case of ast_check_hangup(), we
3565 * need to queue the end-of-Q frame so that it can mark the end
3566 * of the read queue. If there are frames to be read,
3567 * ast_queue_control() will be called repeatedly, but will only
3568 * queue the first end-of-Q frame.
3569 */
3572 } else {
3573 goto done;
3574 }
3575 } else {
3576#ifdef AST_DEVMODE
3577 /*
3578 * The ast_waitfor() code records which of the channel's file
3579 * descriptors reported that data is available. In theory,
3580 * ast_read() should only be called after ast_waitfor() reports
3581 * that a channel has data available for reading. However,
3582 * there still may be some edge cases throughout the code where
3583 * ast_read() is called improperly. This can potentially cause
3584 * problems, so if this is a developer build, make a lot of
3585 * noise if this happens so that it can be addressed.
3586 *
3587 * One of the potential problems is blocking on a dead channel.
3588 */
3589 if (ast_channel_fdno(chan) == -1) {
3591 "ast_read() on chan '%s' called with no recorded file descriptor.\n",
3592 ast_channel_name(chan));
3593 }
3594#endif
3595 }
3596
3597 prestate = ast_channel_state(chan);
3598
3599 if (ast_channel_timingfd(chan) > -1 && ast_channel_fdno(chan) == AST_TIMING_FD) {
3600 enum ast_timer_event res;
3601 int trigger_dtmf_emulating = should_trigger_dtmf_emulating(chan);
3602
3604
3606
3607 switch (res) {
3609 if (ast_timer_ack(ast_channel_timer(chan), 1) < 0) {
3610 ast_log(LOG_ERROR, "Failed to acknowledge timer in ast_read\n");
3611 goto done;
3612 }
3613
3614 if (ast_channel_timingfunc(chan)) {
3615 /* save a copy of func/data before unlocking the channel */
3617 void *data = ast_channel_timingdata(chan);
3618 int got_ref = 0;
3620 ao2_ref(data, 1);
3621 got_ref = 1;
3622 }
3623 ast_channel_fdno_set(chan, -1);
3624 ast_channel_unlock(chan);
3625 func(data);
3626 if (got_ref) {
3627 ao2_ref(data, -1);
3628 }
3629
3630 if (trigger_dtmf_emulating) {
3631 /*
3632 * Since we're breaking out of this switch block and not
3633 * returning, we need to re-lock the channel.
3634 */
3635 ast_channel_lock(chan);
3636 /* generate null frame to trigger dtmf emulating */
3637 f = &ast_null_frame;
3638 break;
3639 }
3640 } else if (trigger_dtmf_emulating) {
3641 /* generate null frame to trigger dtmf emulating */
3642 f = &ast_null_frame;
3643 break;
3644 } else {
3646 /* generate very last null frame to trigger dtmf emulating */
3647 f = &ast_null_frame;
3648 break;
3649 }
3650
3651 /* cannot 'goto done' because the channel is already unlocked */
3652 return &ast_null_frame;
3653
3655 if (AST_LIST_EMPTY(ast_channel_readq(chan)) ||
3658 }
3659 break;
3660 }
3661
3663 /* if the AST_GENERATOR_FD is set, call the generator with args
3664 * set to -1 so it can do whatever it needs to.
3665 */
3666 void *tmp = ast_channel_generatordata(chan);
3667 ast_channel_generatordata_set(chan, NULL); /* reset to let ast_write get through */
3668 ast_channel_generator(chan)->generate(chan, tmp, -1, -1);
3670 f = &ast_null_frame;
3671 ast_channel_fdno_set(chan, -1);
3672 goto done;
3675 }
3676
3677 /* Read and ignore anything on the alertpipe, but read only
3678 one sizeof(blah) per frame that we send from it */
3680 f = &ast_null_frame;
3681 goto done;
3682 }
3683
3684 /* Check for pending read queue */
3685 if (!AST_LIST_EMPTY(ast_channel_readq(chan))) {
3686 int skipped_dtmf_frame = 0;
3687 int skip_dtmf = should_skip_dtmf(chan);
3688
3690 /* We have to be picky about which frame we pull off of the readq because
3691 * there are cases where we want to leave DTMF frames on the queue until
3692 * some later time. */
3693
3694 if ( (f->frametype == AST_FRAME_DTMF_BEGIN || f->frametype == AST_FRAME_DTMF_END) && skip_dtmf) {
3695 skipped_dtmf_frame = 1;
3696 continue;
3697 }
3698
3700 break;
3701 }
3703
3704 if (!f) {
3705 /* There were no acceptable frames on the readq. */
3706 f = &ast_null_frame;
3707 if (!skipped_dtmf_frame) {
3708 /*
3709 * Do not trigger alert pipe if only buffered dtmf begin or end frames
3710 * are left in the readq.
3711 */
3713 } else {
3714 /*
3715 * Safely disable continous timer events if only buffered dtmf begin or end
3716 * frames are left in the readq.
3717 */
3719 }
3720 }
3721
3722 /* Interpret hangup and end-of-Q frames to return NULL */
3723 /* XXX why not the same for frames from the channel ? */
3724 if (f->frametype == AST_FRAME_CONTROL) {
3725 switch (f->subclass.integer) {
3726 case AST_CONTROL_HANGUP:
3728 cause = f->data.uint32;
3729 /* Fall through */
3731 ast_frfree(f);
3732 f = NULL;
3733 break;
3734 default:
3735 break;
3736 }
3737 } else if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO) {
3738 if (ast_channel_tech(chan) && ast_channel_tech(chan)->read_stream) {
3741 } else {
3742 /* Since this channel driver does not support multistream determine the default stream this frame
3743 * originated from and update the frame to include it.
3744 */
3745 stream = default_stream = ast_channel_get_default_stream(chan, ast_format_get_type(f->subclass.format));
3746 /* In order to allow media to be passed up the underlying media type has to have a format negotiated on
3747 * the channel itself. In cases where this hasn't happened the channel driver is incorrectly passing up
3748 * a frame for a format that has not been negotiated. If this occurs just drop the frame as we have no
3749 * stream that it came from.
3750 */
3751 if (!stream) {
3752 ast_frfree(f);
3753 f = &ast_null_frame;
3754 } else {
3756 }
3757 }
3758 }
3759 } else {
3761 if (ast_channel_tech(chan)->exception)
3762 f = ast_channel_tech(chan)->exception(chan);
3763 else {
3764 ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", ast_channel_name(chan));
3765 f = &ast_null_frame;
3766 }
3767 /* Clear the exception flag */
3769 } else if (ast_channel_tech(chan) && ast_channel_tech(chan)->read_stream) {
3770 f = ast_channel_tech(chan)->read_stream(chan);
3771
3772 /* This channel driver supports multistream so the stream_num on the frame is valid, the only
3773 * thing different is that we need to find the default stream so we know whether to invoke the
3774 * default stream logic or not (such as transcoding).
3775 */
3776 if (f && (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO)) {
3779 }
3780 } else if (ast_channel_tech(chan) && ast_channel_tech(chan)->read) {
3781 f = ast_channel_tech(chan)->read(chan);
3782
3783 /* Since this channel driver does not support multistream determine the default stream this frame
3784 * originated from and update the frame to include it.
3785 */
3786 if (f && (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO)) {
3787 stream = default_stream = ast_channel_get_default_stream(chan, ast_format_get_type(f->subclass.format));
3788 if (!stream) {
3789 ast_frfree(f);
3790 f = &ast_null_frame;
3791 } else {
3793 }
3794 }
3795 }
3796 else
3797 ast_log(LOG_WARNING, "No read routine on channel %s\n", ast_channel_name(chan));
3798 }
3799
3800 if (stream == default_stream) {
3801 /* Perform the framehook read event here. After the frame enters the framehook list
3802 * there is no telling what will happen, <insert mad scientist laugh here>!!! */
3804 }
3805
3806 /*
3807 * Reset the recorded file descriptor that triggered this read so that we can
3808 * easily detect when ast_read() is called without properly using ast_waitfor().
3809 */
3810 ast_channel_fdno_set(chan, -1);
3811
3812 if (f) {
3813 struct ast_frame *readq_tail = AST_LIST_LAST(ast_channel_readq(chan));
3814 struct ast_control_read_action_payload *read_action_payload;
3816 int hooked = 0;
3817
3818 /* if the channel driver returned more than one frame, stuff the excess
3819 into the readq for the next ast_read call
3820 */
3821 if (AST_LIST_NEXT(f, frame_list)) {
3825 }
3826
3827 if (dropnondefault && stream != default_stream) {
3828 /* If the frame originates from a non-default stream and the caller can not handle other streams
3829 * absorb the frame and replace it with a null one instead.
3830 */
3831 ast_frfree(f);
3832 f = &ast_null_frame;
3833 }
3834
3835 switch (f->frametype) {
3836 case AST_FRAME_CONTROL:
3838 if (prestate == AST_STATE_UP && ast_channel_is_bridged(chan)) {
3839 ast_debug(1, "Dropping duplicate answer!\n");
3840 ast_frfree(f);
3841 f = &ast_null_frame;
3842 } else {
3843 /*
3844 * Mark when outgoing channel answered so we can know how
3845 * long the channel has been up.
3846 */
3848
3850 }
3851 } else if (f->subclass.integer == AST_CONTROL_READ_ACTION) {
3852 read_action_payload = f->data.ptr;
3853 switch (read_action_payload->action) {
3857 if (ast_connected_line_parse_data(read_action_payload->payload,
3858 read_action_payload->payload_size, &connected)) {
3860 break;
3861 }
3862 ast_channel_unlock(chan);
3865 read_action_payload->payload,
3866 read_action_payload->payload_size);
3867 }
3869 ast_channel_lock(chan);
3870 break;
3872 ast_channel_unlock(chan);
3873 ast_sendtext(chan, (const char *)read_action_payload->payload);
3874 ast_channel_lock(chan);
3875 break;
3877 ast_channel_unlock(chan);
3878 ast_sendtext_data(chan, (struct ast_msg_data *)read_action_payload->payload);
3879 ast_channel_lock(chan);
3880 break;
3881 }
3882 ast_frfree(f);
3883 f = &ast_null_frame;
3884 } else if (f->subclass.integer == AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE && dropnondefault) {
3885 /* The caller of this function is incapable of handling streams so we don't accept the change request
3886 * and stick to the streams currently on the channel.
3887 */
3889 ast_frfree(f);
3890 f = &ast_null_frame;
3891 } else if (f->subclass.integer == AST_CONTROL_STREAM_TOPOLOGY_CHANGED && dropnondefault) {
3892 /* The caller of this function is incapable of handling streams so we absorb the notification that the
3893 * stream topology has changed.
3894 */
3895 ast_frfree(f);
3896 f = &ast_null_frame;
3897 } else if (f->subclass.integer == AST_CONTROL_FLASH) {
3898 send_flash_event(chan);
3899 } else if (f->subclass.integer == AST_CONTROL_WINK) {
3900 send_wink_event(chan);
3901 }
3902 break;
3903 case AST_FRAME_DTMF_END:
3905 ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass.integer, ast_channel_name(chan), f->len);
3906 /* Queue it up if DTMF is deferred, or if DTMF emulation is forced. */
3908 queue_dtmf_readq(chan, f);
3909 ast_frfree(f);
3910 f = &ast_null_frame;
3912 if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
3914 /* If it hasn't been long enough, defer this digit */
3915 queue_dtmf_readq(chan, f);
3916 ast_frfree(f);
3917 f = &ast_null_frame;
3918 } else {
3919 /* There was no begin, turn this into a begin and send the end later */
3920 struct timeval tv = ast_tvnow();
3924 ast_channel_dtmf_tv_set(chan, &tv);
3925 if (f->len) {
3926 if (f->len > option_dtmfminduration)
3928 else
3930 } else
3932 ast_log(LOG_DTMF, "DTMF begin emulation of '%c' with duration %u queued on %s\n", f->subclass.integer, ast_channel_emulate_dtmf_duration(chan), ast_channel_name(chan));
3933
3934 /*
3935 * Start generating 50 fps timer events (null frames) for dtmf emulating
3936 * independently from any existing incoming voice frames.
3937 * If channel generator is already activated in regular mode use these
3938 * timer events to generate null frames.
3939 */
3940 if (!ast_channel_generator(chan)) {
3942 }
3943 }
3944 if (ast_channel_audiohooks(chan)) {
3945 struct ast_frame *old_frame = f;
3946 /*!
3947 * \todo XXX It is possible to write a digit to the audiohook twice
3948 * if the digit was originally read while the channel was in autoservice. */
3950 if (old_frame != f)
3951 ast_frfree(old_frame);
3952 }
3953 } else {
3954 struct timeval now = ast_tvnow();
3956 ast_log(LOG_DTMF, "DTMF end accepted with begin '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3958 if (!f->len)
3959 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
3960
3961 /* detect tones that were received on
3962 * the wire with durations shorter than
3963 * option_dtmfminduration and set f->len
3964 * to the actual duration of the DTMF
3965 * frames on the wire. This will cause
3966 * dtmf emulation to be triggered later
3967 * on.
3968 */
3970 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
3971 ast_log(LOG_DTMF, "DTMF end '%c' detected to have actual duration %ld on the wire, emulation will be triggered on %s\n", f->subclass.integer, f->len, ast_channel_name(chan));
3972 }
3973 } else if (!f->len) {
3974 ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3976 }
3978 ast_log(LOG_DTMF, "DTMF end '%c' has duration %ld but want minimum %u, emulating on %s\n", f->subclass.integer, f->len, option_dtmfminduration, ast_channel_name(chan));
3982 ast_frfree(f);
3983 f = &ast_null_frame;
3984
3985 /* Start generating 50 fps timer events (null frames) for dtmf emulating
3986 * independently from any existing incoming voice frames.
3987 * If channel generator is already activated in regular mode use these
3988 * timer events to generate null frames.
3989 */
3990 if (!ast_channel_generator(chan)) {
3992 }
3993 } else {
3994 ast_log(LOG_DTMF, "DTMF end passthrough '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3995 if (f->len < option_dtmfminduration) {
3997 }
3998 ast_channel_dtmf_tv_set(chan, &now);
3999
4000 /* Start generating 50 fps timer events (null frames) for dtmf emulating
4001 * independently from any existing incoming voice frames.
4002 * If channel generator is already activated in regular mode use these
4003 * timer events to generate null frames.
4004 */
4005 if (!ast_channel_generator(chan)) {
4007 }
4008 }
4009 if (ast_channel_audiohooks(chan)) {
4010 struct ast_frame *old_frame = f;
4012 if (old_frame != f)
4013 ast_frfree(old_frame);
4014 }
4015 }
4016 break;
4019 ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass.integer, ast_channel_name(chan));
4021 (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
4023 ast_log(LOG_DTMF, "DTMF begin ignored '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
4024 ast_frfree(f);
4025 f = &ast_null_frame;
4026 } else {
4027 struct timeval now = ast_tvnow();
4029 ast_channel_dtmf_tv_set(chan, &now);
4030 ast_log(LOG_DTMF, "DTMF begin passthrough '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
4031 }
4032 break;
4033 case AST_FRAME_NULL:
4034 /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
4035 * is reached , because we want to make sure we pass at least one
4036 * voice frame through before starting the next digit, to ensure a gap
4037 * between DTMF digits. */
4039 struct timeval now = ast_tvnow();
4043 } else if (ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan)) >= ast_channel_emulate_dtmf_duration(chan)) {
4045 ast_frfree(f);
4046 f = ast_channel_dtmff(chan);
4049 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
4050 ast_channel_dtmf_tv_set(chan, &now);
4053 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, ast_channel_name(chan));
4054 if (ast_channel_audiohooks(chan)) {
4055 struct ast_frame *old_frame = f;
4057 if (old_frame != f) {
4058 ast_frfree(old_frame);
4059 }
4060 }
4061
4062 /* Start generating 50 fps timer events (null frames) for dtmf emulating
4063 * independently from any existing incoming voice frames.
4064 * If channel generator is already activated in regular mode use these
4065 * timer events to generate null frames.
4066 */
4067 if (!ast_channel_generator(chan)) {
4069 }
4070 }
4071 }
4072 break;
4073 case AST_FRAME_VOICE:
4074 /* If media was received from a non-default stream don't perform any actions, let it just go through */
4075 if (stream != default_stream) {
4076 break;
4077 }
4078
4079 /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
4080 * is reached , because we want to make sure we pass at least one
4081 * voice frame through before starting the next digit, to ensure a gap
4082 * between DTMF digits. */
4086 }
4087
4088 if (dropaudio || ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_DTMF)) {
4089 if (dropaudio)
4091 ast_frfree(f);
4092 f = &ast_null_frame;
4093 }
4094
4096 struct timeval now = ast_tvnow();
4099 ast_frfree(f);
4100 f = ast_channel_dtmff(chan);
4103 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
4104 ast_channel_dtmf_tv_set(chan, &now);
4105 if (ast_channel_audiohooks(chan)) {
4106 struct ast_frame *old_frame = f;
4108 if (old_frame != f)
4109 ast_frfree(old_frame);
4110 }
4111 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, ast_channel_name(chan));
4112 } else {
4113 /* Drop voice frames while we're still in the middle of the digit */
4114 ast_frfree(f);
4115 f = &ast_null_frame;
4116 }
4117 break;
4118 }
4119 if (f->frametype != AST_FRAME_VOICE) {
4120 break;
4121 }
4124 struct ast_format *core_format;
4125
4126 /*
4127 * Note: This frame may not be one of the current native
4128 * formats. We may have gotten it out of the read queue from
4129 * a previous multi-frame translation, from a framehook
4130 * injected frame, or the device we're talking to isn't
4131 * respecting negotiated formats. Regardless we will accept
4132 * all frames.
4133 *
4134 * Update the read translation path to handle the new format
4135 * that just came in. If the core wants slinear we need to
4136 * setup a new translation path because the core is usually
4137 * doing something with the audio itself and may not handle
4138 * any other format. e.g., Softmix bridge, holding bridge
4139 * announcer channel, recording, AMD... Otherwise, we'll
4140 * setup to pass the frame as is to the core. In this case
4141 * the core doesn't care. The channel is likely in
4142 * autoservice, safesleep, or the channel is in a bridge.
4143 * Let the bridge technology deal with format compatibility
4144 * between the channels in the bridge.
4145 *
4146 * Beware of the transcode_via_slin and genericplc options as
4147 * they force any transcoding to go through slin on a bridge.
4148 * Unfortunately transcode_via_slin is enabled by default and
4149 * genericplc is enabled in the codecs.conf.sample file.
4150 *
4151 * XXX Only updating translation to slinear frames has some
4152 * corner cases if slinear is one of the native formats and
4153 * there are different sample rates involved. We might wind
4154 * up with conflicting translation paths between channels
4155 * where the read translation path on this channel reduces
4156 * the sample rate followed by a write translation path on
4157 * the peer channel that increases the sample rate.
4158 */
4159 core_format = ast_channel_readformat(chan);
4160 if (!ast_format_cache_is_slinear(core_format)) {
4161 core_format = f->subclass.format;
4162 }
4163 if (ast_set_read_format_path(chan, f->subclass.format, core_format)) {
4164 /* Drop frame. We couldn't make it compatible with the core. */
4165 ast_frfree(f);
4166 f = &ast_null_frame;
4167 break;
4168 }
4169 }
4170 /*
4171 * Send frame to audiohooks if present, if frametype is linear, to preserve
4172 * functional compatibility with previous behavior. If not linear, hold off
4173 * until transcoding is done where we are more likely to have a linear frame
4174 */
4176 /* Place hooked after declaration */
4177 struct ast_frame *old_frame = f;
4178 hooked = 1;
4179
4181 if (old_frame != f) {
4182 ast_frfree(old_frame);
4183 }
4184 }
4185
4186 if (ast_channel_readtrans(chan)
4188 f = ast_translate(ast_channel_readtrans(chan), f, 1);
4189 if (!f) {
4190 f = &ast_null_frame;
4191 }
4192 }
4193
4194 /* Second chance at hooking a linear frame, also the last chance */
4195 if (ast_channel_audiohooks(chan) && !hooked) {
4196 struct ast_frame *old_frame = f;
4197
4199 if (old_frame != f) {
4200 ast_frfree(old_frame);
4201 }
4202 }
4203
4204 /*
4205 * It is possible for the translation process on the channel to have
4206 * produced multiple frames from the single input frame we passed it; if
4207 * this happens, queue the additional frames *before* the frames we may
4208 * have queued earlier. if the readq was empty, put them at the head of
4209 * the queue, and if it was not, put them just after the frame that was
4210 * at the end of the queue.
4211 */
4212 if (AST_LIST_NEXT(f, frame_list)) {
4213 struct ast_frame *cur, *multi_frame = AST_LIST_NEXT(f, frame_list);
4214
4215 /* Mark these frames as being re-queued */
4216 for (cur = multi_frame; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
4218 }
4219
4220 if (!readq_tail) {
4221 ast_queue_frame_head(chan, multi_frame);
4222 } else {
4223 __ast_queue_frame(chan, multi_frame, 0, readq_tail);
4224 }
4225 ast_frfree(multi_frame);
4227 }
4228
4229 /*
4230 * Run generator sitting on the line if timing device not available
4231 * and synchronous generation of outgoing frames is necessary
4232 */
4234 break;
4235 case AST_FRAME_RTCP:
4236 /* Incoming RTCP feedback needs to get to the translator for
4237 * outgoing media, which means we treat it as an ast_write */
4238 if (ast_channel_writetrans(chan)) {
4240 }
4241 break;
4242 default:
4243 /* Just pass it on! */
4244 break;
4245 }
4246 } else {
4247 /* Make sure we always return NULL in the future */
4250 }
4251 if (cause)
4252 ast_channel_hangupcause_set(chan, cause);
4253 if (ast_channel_generator(chan))
4255 /* We no longer End the CDR here */
4256 }
4257
4258 /* High bit prints debugging */
4259 if (ast_channel_fin(chan) & DEBUGCHAN_FLAG)
4260 ast_frame_dump(ast_channel_name(chan), f, "<<");
4262
4263done:
4266
4268 /* The list gets recreated if audiohooks are added again later */
4271 }
4272 ast_channel_unlock(chan);
4273 return f;
4274}
@ AST_ALERT_READ_FATAL
Definition: alertpipe.h:28
char digit
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:1107
@ AST_AUDIOHOOK_DIRECTION_READ
Definition: audiohook.h:49
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition: audiohook.c:1099
void ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list)
Detach audiohooks from list and destroy said list.
Definition: audiohook.c:593
static void send_dtmf_begin_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit)
Definition: channel.c:3389
int ast_set_read_format_path(struct ast_channel *chan, struct ast_format *raw_format, struct ast_format *core_format)
Set specific read path on channel.
Definition: channel.c:5507
#define AST_MIN_DTMF_GAP
Definition: channel.c:112
static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
Definition: channel.c:3432
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:1158
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition: channel.c:2091
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:4770
#define AST_DEFAULT_EMULATE_DTMF_DURATION
Definition: channel.c:102
static void queue_dtmf_readq(struct ast_channel *chan, struct ast_frame *f)
Definition: channel.c:3486
int ast_channel_stream_topology_changed(struct ast_channel *chan, struct ast_stream_topology *topology)
Provide notice to a channel that the stream topology has changed.
Definition: channel.c:11018
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:2050
int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
Queue a control frame.
Definition: channel.c:1250
static int should_skip_dtmf(struct ast_channel *chan)
Determine whether or not we should ignore DTMF in the readq.
Definition: channel.c:3504
int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
Change the state of a channel.
Definition: channel.c:7408
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2912
int ast_sendtext(struct ast_channel *chan, const char *text)
Sends text to a channel.
Definition: channel.c:4828
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:8807
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
int ast_channel_is_bridged(const struct ast_channel *chan)
Determine if a channel is in a bridge.
Definition: channel.c:10567
static void send_flash_event(struct ast_channel *chan)
Definition: channel.c:3422
static void send_dtmf_end_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit, long duration_ms)
Definition: channel.c:3405
int ast_channel_connected_line_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *connected_info, int is_frame)
Run a connected line interception subroutine and update a channel's connected line information.
Definition: channel.c:10360
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:4672
static void set_channel_answer_time(struct ast_channel *chan)
Definition: channel.c:2647
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:2874
static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
Definition: channel.c:1028
static void send_wink_event(struct ast_channel *chan)
Definition: channel.c:3427
int(* ast_timing_func_t)(const void *data)
Definition: channel.h:919
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
#define DEBUGCHAN_FLAG
Definition: channel.h:877
void * ast_channel_music_state(const struct ast_channel *chan)
unsigned int ast_channel_fin(const struct ast_channel *chan)
void * ast_channel_timingdata(const struct ast_channel *chan)
#define AST_GENERATOR_FD
Definition: channel.h:205
void ast_channel_dtmf_tv_set(struct ast_channel *chan, struct timeval *value)
int ast_channel_fdno(const struct ast_channel *chan)
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
char ast_channel_dtmf_digit_to_emulate(const struct ast_channel *chan)
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
void ast_channel_audiohooks_set(struct ast_channel *chan, struct ast_audiohook_list *value)
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
void * ast_channel_generatordata(const struct ast_channel *chan)
struct ast_stream_topology * ast_channel_get_stream_topology(const struct ast_channel *chan)
Retrieve the topology of streams on a channel.
void ast_channel_fdno_set(struct ast_channel *chan, int value)
ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan)
void ast_channel_dtmf_digit_to_emulate_set(struct ast_channel *chan, char value)
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
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.
@ AST_SOFTHANGUP_DEV
Definition: channel.h:1141
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
void ast_channel_emulate_dtmf_duration_set(struct ast_channel *chan, unsigned int value)
struct ast_frame * ast_channel_dtmff(struct ast_channel *chan)
unsigned int ast_channel_emulate_dtmf_duration(const struct ast_channel *chan)
@ AST_FLAG_ZOMBIE
Definition: channel.h:1007
@ AST_FLAG_END_DTMF_ONLY
Definition: channel.h:1027
@ AST_FLAG_EXCEPTION
Definition: channel.h:1009
@ AST_FLAG_EMULATE_DTMF
Definition: channel.h:1024
@ AST_FLAG_IN_DTMF
Definition: channel.h:1021
@ AST_FLAG_DEFER_DTMF
Definition: channel.h:1001
@ AST_FLAG_TIMINGDATA_IS_AO2_OBJ
Definition: channel.h:1074
#define AST_JITTERBUFFER_FD
Definition: channel.h:206
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
struct timeval * ast_channel_dtmf_tv(struct ast_channel *chan)
#define FRAMECOUNT_INC(x)
Definition: channel.h:880
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
int ast_channel_fd_isset(const struct ast_channel *chan, int which)
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
@ AST_STATE_UP
Definition: channelstate.h:42
char connected
Definition: eagi_proxy.c:82
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition: format.c:354
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
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
struct ast_frame * ast_framehook_list_read_event(struct ast_framehook_list *framehooks, struct ast_frame *frame)
This is used by the channel API push a frame read event to a channel's framehook list.
Definition: framehook.c:318
unsigned int option_dtmfminduration
Definition: options.c:83
@ AST_FRFLAG_REQUEUED
@ AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO
@ AST_FRAME_READ_ACTION_SEND_TEXT
@ AST_FRAME_READ_ACTION_SEND_TEXT_DATA
void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix)
Definition: main/frame.c:731
@ AST_CONTROL_WINK
@ AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE
@ AST_CONTROL_READ_ACTION
@ AST_CONTROL_ANSWER
@ AST_CONTROL_STREAM_TOPOLOGY_CHANGED
@ AST_CONTROL_CONNECTED_LINE
@ AST_CONTROL_FLASH
struct ast_frame ast_null_frame
Definition: main/frame.c:79
#define LOG_ERROR
#define LOG_DTMF
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:450
int ast_stream_get_position(const struct ast_stream *stream)
Get the position of the stream in the topology.
Definition: stream.c:500
struct ast_stream * ast_stream_topology_get_stream(const struct ast_stream_topology *topology, unsigned int position)
Get a specific stream from the topology.
Definition: stream.c:791
struct ast_frame *(*const read)(struct ast_channel *chan)
Read a frame (or chain of frames from the same stream), in standard format (see frame....
Definition: channel.h:754
struct ast_frame *(*const read_stream)(struct ast_channel *chan)
Read a frame (or chain of frames from the same stream), in standard format (see frame....
Definition: channel.h:767
struct ast_frame *(*const exception)(struct ast_channel *chan)
Handle an exception, reading a frame.
Definition: channel.h:785
enum ast_frame_read_action action
Definition of a media format.
Definition: format.c:43
struct ast_format * format
union ast_frame::@226 data
void(* digit)(struct ast_channel *chan, char digit)
Definition: channel.h:237
int(* generate)(struct ast_channel *chan, void *data, int len, int samples)
Definition: channel.h:235
Structure used to transport a message through the frame core.
Connected Line/Party information.
Definition: channel.h:458
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:117
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
int ast_timer_ack(const struct ast_timer *handle, unsigned int quantity)
Acknowledge a timer event.
Definition: timing.c:171
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
Definition: timing.c:166
enum ast_timer_event ast_timer_get_event(const struct ast_timer *handle)
Retrieve timing event.
Definition: timing.c:186
int ast_timer_disable_continuous(const struct ast_timer *handle)
Disable continuous mode.
Definition: timing.c:181
ast_timer_event
Definition: timing.h:57
@ AST_TIMING_EVENT_CONTINUOUS
Definition: timing.h:59
@ AST_TIMING_EVENT_EXPIRED
Definition: timing.h:58
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
#define ast_clear_flag(p, flag)
Definition: utils.h:77
#define ast_set_flag(p, flag)
Definition: utils.h:70

References __ast_queue_frame(), ast_control_read_action_payload::action, ao2_ref, AST_ALERT_READ_FATAL, ast_audiohook_detach_list(), AST_AUDIOHOOK_DIRECTION_READ, ast_audiohook_write_list(), ast_audiohook_write_list_empty(), ast_channel_alert_write(), ast_channel_audiohooks(), ast_channel_audiohooks_set(), ast_channel_connected(), ast_channel_connected_line_sub(), ast_channel_dtmf_digit_to_emulate(), ast_channel_dtmf_digit_to_emulate_set(), ast_channel_dtmf_tv(), ast_channel_dtmf_tv_set(), ast_channel_dtmff(), ast_channel_emulate_dtmf_duration(), ast_channel_emulate_dtmf_duration_set(), ast_channel_fd_isset(), ast_channel_fdno(), ast_channel_fdno_set(), ast_channel_fin(), ast_channel_fin_set(), ast_channel_flags(), ast_channel_framehooks(), ast_channel_generator(), ast_channel_generatordata(), ast_channel_generatordata_set(), ast_channel_get_default_stream(), ast_channel_get_stream_topology(), ast_channel_hangupcause_set(), ast_channel_internal_alert_read(), ast_channel_is_bridged(), ast_channel_lock, ast_channel_music_state(), ast_channel_name(), ast_channel_rawreadformat(), ast_channel_readformat(), ast_channel_readq(), ast_channel_readtrans(), ast_channel_softhangup_internal_flag(), ast_channel_softhangup_internal_flag_add(), ast_channel_stream_topology_changed(), ast_channel_tech(), ast_channel_timer(), ast_channel_timingdata(), ast_channel_timingfd(), ast_channel_timingfunc(), ast_channel_unlock, ast_channel_writetrans(), ast_check_hangup(), ast_clear_flag, ast_connected_line_parse_data(), AST_CONTROL_ANSWER, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_END_OF_Q, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_READ_ACTION, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, AST_CONTROL_WINK, ast_deactivate_generator(), ast_debug, AST_DEFAULT_EMULATE_DTMF_DURATION, AST_FLAG_DEFER_DTMF, AST_FLAG_EMULATE_DTMF, AST_FLAG_END_DTMF_ONLY, AST_FLAG_EXCEPTION, AST_FLAG_IN_DTMF, AST_FLAG_TIMINGDATA_IS_AO2_OBJ, AST_FLAG_ZOMBIE, ast_format_cache_is_slinear(), ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_format_get_type(), AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, ast_frame_dump(), AST_FRAME_NULL, AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO, AST_FRAME_READ_ACTION_SEND_TEXT, AST_FRAME_READ_ACTION_SEND_TEXT_DATA, AST_FRAME_RTCP, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_framehook_list_read_event(), AST_FRFLAG_REQUEUED, ast_frfree, AST_GENERATOR_FD, ast_indicate_data(), AST_JITTERBUFFER_FD, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_LAST, AST_LIST_NEXT, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_log, AST_MIN_DTMF_GAP, ast_null_frame, ast_party_connected_line_copy(), ast_party_connected_line_free(), ast_party_connected_line_init(), ast_queue_control(), ast_queue_frame(), ast_queue_frame_head(), ast_read_generator_actions(), ast_sendtext(), ast_sendtext_data(), ast_set_flag, ast_set_read_format_path(), ast_setstate(), AST_SOFTHANGUP_DEV, AST_STATE_UP, ast_stream_get_position(), ast_stream_topology_get_stream(), ast_test_flag, ast_timer_ack(), ast_timer_disable_continuous(), ast_timer_get_event(), ast_timer_set_rate(), AST_TIMING_EVENT_CONTINUOUS, AST_TIMING_EVENT_EXPIRED, AST_TIMING_FD, ast_translate(), ast_tvdiff_ms(), ast_tvnow(), ast_tvzero(), connected, ast_frame::data, DEBUGCHAN_FLAG, digit, ast_generator::digit, done, DTMF_RECEIVED, ast_channel_tech::exception, ast_frame_subclass::format, FRAMECOUNT_INC, ast_frame::frametype, ast_generator::generate, ast_frame_subclass::integer, ast_frame::len, LOG_DTMF, LOG_ERROR, LOG_WARNING, NULL, option_dtmfminduration, ast_control_read_action_payload::payload, ast_control_read_action_payload::payload_size, ast_frame::ptr, queue_dtmf_readq(), ast_channel_tech::read, ast_channel_tech::read_stream, send_dtmf_begin_event(), send_dtmf_end_event(), send_flash_event(), send_wink_event(), set_channel_answer_time(), should_skip_dtmf(), should_trigger_dtmf_emulating(), ast_frame::stream_num, ast_frame::subclass, tmp(), and ast_frame::uint32.

Referenced by ast_read(), ast_read_noaudio(), ast_read_stream(), and ast_read_stream_noaudio().

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

5996{
5997 int dummy_outstate;
5998 int cause = 0;
5999 struct ast_channel *chan;
6000 int res = 0;
6001 int last_subclass = 0;
6003
6004 if (outstate)
6005 *outstate = 0;
6006 else
6007 outstate = &dummy_outstate; /* make outstate always a valid pointer */
6008
6009 chan = ast_request(type, cap, assignedids, requestor, addr, &cause);
6010 if (!chan) {
6011 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, addr);
6012 handle_cause(cause, outstate);
6013 return NULL;
6014 }
6015
6016 if (oh) {
6017 if (oh->vars) {
6018 ast_channel_lock(chan);
6019 ast_set_variables(chan, oh->vars);
6020 ast_channel_unlock(chan);
6021 }
6022 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name)) {
6023 /*
6024 * Use the oh values instead of the function parameters for the
6025 * outgoing CallerID.
6026 */
6027 cid_num = oh->cid_num;
6028 cid_name = oh->cid_name;
6029 }
6030 if (oh->parent_channel) {
6031 /* Safely inherit variables and datastores from the parent channel. */
6037 ast_channel_unlock(chan);
6038 }
6039 if (!ast_strlen_zero(oh->account)) {
6040 ast_channel_lock(chan);
6042 ast_channel_accountcode_set(chan, oh->account);
6043 ast_channel_peeraccount_set(chan, oh->account);
6045 ast_channel_unlock(chan);
6046 }
6047 }
6048
6049 /*
6050 * It seems strange to set the CallerID on an outgoing call leg
6051 * to whom we are calling, but this function's callers are doing
6052 * various Originate methods. This call leg goes to the local
6053 * user. Once the local user answers, the dialplan needs to be
6054 * able to access the CallerID from the CALLERID function as if
6055 * the local user had placed this call.
6056 */
6057 ast_set_callerid(chan, cid_num, cid_name, cid_num);
6058
6059 ast_channel_lock(chan);
6061 ast_channel_unlock(chan);
6063 if (cid_num) {
6064 connected.id.number.valid = 1;
6065 connected.id.number.str = (char *) cid_num;
6067 }
6068 if (cid_name) {
6069 connected.id.name.valid = 1;
6070 connected.id.name.str = (char *) cid_name;
6072 }
6074 if (requestor) {
6075 ast_channel_lock_both(chan, (struct ast_channel *) requestor);
6077 ast_channel_unlock(chan);
6078 ast_channel_unlock((struct ast_channel *) requestor);
6079 }
6080
6081 if (ast_call(chan, addr, 0)) { /* ast_call failed... */
6082 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, addr);
6083 } else {
6084 struct timeval start = ast_tvnow();
6085 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
6086 while (timeout && ast_channel_state(chan) != AST_STATE_UP) {
6087 struct ast_frame *f;
6088 int ms = ast_remaining_ms(start, timeout);
6089
6090 res = ast_waitfor(chan, ms);
6091 if (res == 0) { /* timeout, treat it like ringing */
6092 *outstate = AST_CONTROL_RINGING;
6093 break;
6094 }
6095 if (res < 0) /* error or done */
6096 break;
6098 if (!(chan = ast_call_forward(NULL, chan, NULL, cap, oh, outstate))) {
6099 return NULL;
6100 }
6101 continue;
6102 }
6103
6104 f = ast_read(chan);
6105 if (!f) {
6106 *outstate = AST_CONTROL_HANGUP;
6107 res = 0;
6108 break;
6109 }
6110 if (f->frametype == AST_FRAME_CONTROL) {
6111 switch (f->subclass.integer) {
6112 case AST_CONTROL_RINGING: /* record but keep going */
6113 *outstate = f->subclass.integer;
6114 break;
6115
6116 case AST_CONTROL_BUSY:
6117 *outstate = f->subclass.integer;
6118 timeout = 0;
6119 break;
6120
6122 *outstate = AST_CONTROL_CONGESTION;
6123 timeout = 0;
6124 break;
6125
6127 *outstate = f->subclass.integer;
6128 timeout = 0;
6129 break;
6130
6131 case AST_CONTROL_ANSWER:
6132 *outstate = f->subclass.integer;
6133 timeout = 0; /* trick to force exit from the while() */
6134 break;
6135
6138 break;
6139
6141 if (oh && oh->connect_on_early_media) {
6142 *outstate = f->subclass.integer;
6143 timeout = 0; /* trick to force exit from the while() */
6144 break;
6145 }
6146 /* Fallthrough */
6147 /* Ignore these */
6149 case AST_CONTROL_HOLD:
6150 case AST_CONTROL_UNHOLD:
6156 case AST_CONTROL_CC:
6157 case -1: /* Ignore -- just stopping indications */
6158 break;
6159
6160 default:
6161 ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass.integer);
6162 }
6163 last_subclass = f->subclass.integer;
6164 }
6165 ast_frfree(f);
6166 }
6167 }
6168
6169 /* Final fixups */
6170 if (oh) {
6171 if (!ast_strlen_zero(oh->context))
6173 if (!ast_strlen_zero(oh->exten))
6174 ast_channel_exten_set(chan, oh->exten);
6175 if (oh->priority)
6177 }
6178 if (ast_channel_state(chan) == AST_STATE_UP)
6179 *outstate = AST_CONTROL_ANSWER;
6180
6181 if (res <= 0) {
6182 ast_channel_lock(chan);
6183 if (AST_CONTROL_RINGING == last_subclass) {
6185 }
6186 ast_channel_unlock(chan);
6187 ast_hangup(chan);
6188 chan = NULL;
6189 }
6190 return chan;
6191}
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition: callerid.h:437
#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:6480
static void handle_cause(int cause, int *outstate)
Definition: channel.c:5868
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:5917
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition: channel.c:2560
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:8330
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition: channel.c:8137
int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
Inherit datastores from a parent to a child.
Definition: channel.c:2387
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:6453
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:7356
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:6790
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:4365
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:2064
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:6373
@ AST_CHANNEL_REQUESTOR_BRIDGE_PEER
Definition: channel.h:1523
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2975
const char * ast_channel_call_forward(const struct ast_channel *chan)
@ AST_FLAG_ORIGINATED
Definition: channel.h:1059
@ 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_RINGING
@ AST_CONTROL_HOLD
@ 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
const char * cid_num
Definition: channel.h:1129
struct ast_variable * vars
Definition: channel.h:1132
int connect_on_early_media
Definition: channel.h:1128
const char * account
Definition: channel.h:1131
const char * cid_name
Definition: channel.h:1130
const char * exten
Definition: channel.h:1126
const char * context
Definition: channel.h:1125
struct ast_channel * parent_channel
Definition: channel.h:1133

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

◆ __init_state2str_threadbuf()

static void __init_state2str_threadbuf ( void  )
static

Definition at line 97 of file channel.c.

115{

◆ adjust_frame_for_plc()

static void adjust_frame_for_plc ( struct ast_channel chan,
struct ast_frame frame,
struct ast_datastore datastore 
)
static

Definition at line 5072 of file channel.c.

5073{
5074 int num_new_samples = frame->samples;
5075 struct plc_ds *plc = datastore->data;
5076
5077 /* As a general note, let me explain the somewhat odd calculations used when taking
5078 * the frame offset into account here. According to documentation in frame.h, the frame's
5079 * offset field indicates the number of bytes that the audio is offset. The plc->samples_buf
5080 * is not an array of bytes, but rather an array of 16-bit integers since it holds SLIN
5081 * samples. So I had two choices to make here with the offset.
5082 *
5083 * 1. Make the offset AST_FRIENDLY_OFFSET bytes. The main downside for this is that
5084 * I can't just add AST_FRIENDLY_OFFSET to the plc->samples_buf and have the pointer
5085 * arithmetic come out right. I would have to do some odd casting or division for this to
5086 * work as I wanted.
5087 * 2. Make the offset AST_FRIENDLY_OFFSET * 2 bytes. This allows the pointer arithmetic
5088 * to work out better with the plc->samples_buf. The downside here is that the buffer's
5089 * allocation contains an extra 64 bytes of unused space.
5090 *
5091 * I decided to go with option 2. This is why in the calloc statement and the statement that
5092 * sets the frame's offset, AST_FRIENDLY_OFFSET is multiplied by 2.
5093 */
5094
5095 /* If this audio frame has no samples to fill in, ignore it */
5096 if (!num_new_samples) {
5097 return;
5098 }
5099
5100 /* First, we need to be sure that our buffer is large enough to accomodate
5101 * the samples we need to fill in. This will likely only occur on the first
5102 * frame we write.
5103 */
5104 if (plc->num_samples < num_new_samples) {
5105 ast_free(plc->samples_buf);
5106 plc->samples_buf = ast_calloc(1, (num_new_samples * sizeof(*plc->samples_buf)) + (AST_FRIENDLY_OFFSET * 2));
5107 if (!plc->samples_buf) {
5108 ast_channel_datastore_remove(chan, datastore);
5109 ast_datastore_free(datastore);
5110 return;
5111 }
5112 plc->num_samples = num_new_samples;
5113 }
5114
5115 if (frame->datalen == 0) {
5117 frame->data.ptr = plc->samples_buf + AST_FRIENDLY_OFFSET;
5118 frame->datalen = num_new_samples * 2;
5119 frame->offset = AST_FRIENDLY_OFFSET * 2;
5120 } else {
5121 plc_rx(&plc->plc_state, frame->data.ptr, frame->samples);
5122 }
5123}
#define ast_free(a)
Definition: astmm.h:180
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition: channel.c:2413
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
int plc_fillin(plc_state_t *s, int16_t amp[], int len)
Fill-in a block of missing audio samples.
Definition: plc.c:175
int plc_rx(plc_state_t *s, int16_t amp[], int len)
Process a block of received audio samples.
Definition: plc.c:132
void * data
Definition: datastore.h:66
int16_t * samples_buf
Definition: channel.c:5052
size_t num_samples
Definition: channel.c:5056
plc_state_t plc_state
Definition: channel.c:5057

References ast_calloc, ast_channel_datastore_remove(), ast_datastore_free(), ast_free, AST_FRIENDLY_OFFSET, ast_datastore::data, ast_frame::data, ast_frame::datalen, plc_ds::num_samples, ast_frame::offset, plc_fillin(), plc_rx(), plc_ds::plc_state, ast_frame::ptr, ast_frame::samples, and plc_ds::samples_buf.

Referenced by apply_plc().

◆ apply_plc()

static void apply_plc ( struct ast_channel chan,
struct ast_frame frame 
)
static

Definition at line 5125 of file channel.c.

5126{
5127 struct ast_datastore *datastore;
5128 struct plc_ds *plc;
5129
5130 datastore = ast_channel_datastore_find(chan, &plc_ds_info, NULL);
5131 if (datastore) {
5132 plc = datastore->data;
5133 adjust_frame_for_plc(chan, frame, datastore);
5134 return;
5135 }
5136
5137 datastore = ast_datastore_alloc(&plc_ds_info, NULL);
5138 if (!datastore) {
5139 return;
5140 }
5141 plc = ast_calloc(1, sizeof(*plc));
5142 if (!plc) {
5143 ast_datastore_free(datastore);
5144 return;
5145 }
5146 datastore->data = plc;
5147 ast_channel_datastore_add(chan, datastore);
5148 adjust_frame_for_plc(chan, frame, datastore);
5149}
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2404
static const struct ast_datastore_info plc_ds_info
Definition: channel.c:5067
static void adjust_frame_for_plc(struct ast_channel *chan, struct ast_frame *frame, struct ast_datastore *datastore)
Definition: channel.c:5072
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:2418
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:85
Structure for a data store object.
Definition: datastore.h:64

References adjust_frame_for_plc(), ast_calloc, ast_channel_datastore_add(), ast_channel_datastore_find(), ast_datastore_alloc, ast_datastore_free(), ast_datastore::data, NULL, and plc_ds_info.

Referenced by ast_write_stream().

◆ ast_activate_generator()

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

Activate a given generator

Definition at line 2970 of file channel.c.

2971{
2972 int res = 0;
2973 void *generatordata = NULL;
2974
2975 ast_channel_lock(chan);
2976 if (ast_channel_generatordata(chan)) {
2977 struct ast_generator *generator_old = ast_channel_generator(chan);
2978
2979 if (generator_old && generator_old->release) {
2980 generator_old->release(chan, ast_channel_generatordata(chan));
2981 }
2982 }
2983 if (gen->alloc && !(generatordata = gen->alloc(chan, params))) {
2984 res = -1;
2985 }
2986 ast_channel_generatordata_set(chan, generatordata);
2987 if (!res) {
2988 ast_settimeout(chan, 50, generator_force, chan);
2990 }
2991 ast_channel_unlock(chan);
2992
2993 ast_prod(chan);
2994
2995 return res;
2996}
static struct ast_generator gen
int ast_prod(struct ast_channel *chan)
Send empty audio to prime a channel driver.
Definition: channel.c:5019
static int generator_force(const void *data)
Definition: channel.c:2935
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:3199
void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value)
void *(* alloc)(struct ast_channel *chan, void *params)
Definition: channel.h:228
void(* release)(struct ast_channel *chan, void *data)
Definition: channel.h:230

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

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

◆ ast_active_channels()

int ast_active_channels ( void  )

returns number of active/allocated channels

Returns
number of channels available for lookup

Definition at line 499 of file channel.c.

500{
502}
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.

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

2825{
2826 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2827 return __ast_answer(chan, 0);
2828}
int __ast_answer(struct ast_channel *chan, unsigned int delay)
Answer a channel, with a selectable delay before returning.
Definition: channel.c:2714

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

2831{
2832 if (ast_channel_state(chan) == AST_STATE_UP) {
2833 /* Already answered */
2834 return 0;
2835 }
2836 return ast_answer(chan);
2837}
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2824

References ast_answer(), and AST_STATE_UP.

Referenced by record_file(), and senddtmf_exec().

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

6481{
6482 /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
6483 If the remote end does not answer within the timeout, then do NOT hang up, but
6484 return anyway. */
6485 int res = -1;
6486 /* Stop if we're a zombie or need a soft hangup */
6487 ast_channel_lock(chan);
6489 if (ast_channel_tech(chan)->call)
6490 res = ast_channel_tech(chan)->call(chan, addr, timeout);
6492 }
6493 ast_channel_unlock(chan);
6494 return res;
6495}
static int call(void *data)
Definition: chan_pjsip.c:2394
@ AST_FLAG_OUTGOING
Definition: channel.h:1019
int(*const call)(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition: channel.h:721

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

5918{
5919 char tmpchan[256];
5920 char forwarder[AST_CHANNEL_NAME];
5921 struct ast_channel *new_chan = NULL;
5922 char *data, *type;
5923 int cause = 0;
5924 int res;
5925
5926 /* gather data and request the new forward channel */
5927 ast_copy_string(tmpchan, ast_channel_call_forward(orig), sizeof(tmpchan));
5928 ast_copy_string(forwarder, ast_channel_name(orig), sizeof(forwarder));
5929 if ((data = strchr(tmpchan, '/'))) {
5930 *data++ = '\0';
5931 type = tmpchan;
5932 } else {
5933 const char *forward_context;
5934 ast_channel_lock(orig);
5935 forward_context = pbx_builtin_getvar_helper(orig, "FORWARD_CONTEXT");
5936 snprintf(tmpchan, sizeof(tmpchan), "%s@%s", ast_channel_call_forward(orig), S_OR(forward_context, ast_channel_context(orig)));
5937 ast_channel_unlock(orig);
5938 data = tmpchan;
5939 type = "Local";
5940 }
5941 if (!(new_chan = ast_request(type, cap, NULL, orig, data, &cause))) {
5942 ast_log(LOG_NOTICE, "Unable to create channel for call forward to '%s/%s' (cause = %d)\n", type, data, cause);
5943 handle_cause(cause, outstate);
5944 ast_hangup(orig);
5945 return NULL;
5946 }
5947
5948 /* Copy/inherit important information into new channel */
5949 if (oh) {
5950 if (oh->vars) {
5951 ast_channel_lock(new_chan);
5952 ast_set_variables(new_chan, oh->vars);
5953 ast_channel_unlock(new_chan);
5954 }
5955 if (oh->parent_channel) {
5956 call_forward_inherit(new_chan, oh->parent_channel, orig);
5957 }
5958 if (!ast_strlen_zero(oh->account)) {
5959 ast_channel_lock(new_chan);
5961 ast_channel_accountcode_set(new_chan, oh->account);
5962 ast_channel_peeraccount_set(new_chan, oh->account);
5964 ast_channel_unlock(new_chan);
5965 }
5966 } else if (caller) { /* no outgoing helper so use caller if available */
5967 call_forward_inherit(new_chan, caller, orig);
5968 }
5969
5970 ast_channel_lock_both(orig, new_chan);
5972 pbx_builtin_setvar_helper(new_chan, "FORWARDERNAME", forwarder);
5976 ast_channel_unlock(new_chan);
5977 ast_channel_unlock(orig);
5978
5979 /* call new channel */
5980 res = ast_call(new_chan, data, 0);
5981 if (timeout) {
5982 *timeout = res;
5983 }
5984 if (res) {
5985 ast_log(LOG_NOTICE, "Unable to call forward to channel %s/%s\n", type, (char *)data);
5986 ast_hangup(orig);
5987 ast_hangup(new_chan);
5988 return NULL;
5989 }
5990 ast_hangup(orig);
5991
5992 return new_chan;
5993}
static void call_forward_inherit(struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
Definition: channel.c:5889
void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
Set a flag on a channel.
Definition: channel.c:11049
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:2154
@ AST_CHANNEL_REQUESTOR_REPLACEMENT
Definition: channel.h:1525
const char * ast_channel_context(const struct ast_channel *chan)
#define AST_CHANNEL_NAME
Definition: channel.h:173
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
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 hangup cause.

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

6779{
6780 /* We must re-link, as the hash value will change here. */
6782 ast_channel_lock(chan);
6783 ao2_unlink(channels, chan);
6784 __ast_change_name_nolink(chan, newname);
6785 ao2_link(channels, chan);
6786 ast_channel_unlock(chan);
6788}
#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
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:6761

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

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

4393{
4394 switch (flag) {
4395 case AST_AMA_OMIT:
4396 return "OMIT";
4397 case AST_AMA_BILLING:
4398 return "BILLING";
4400 return "DOCUMENTATION";
4401 default:
4402 return "Unknown";
4403 }
4404}
@ AST_AMA_DOCUMENTATION
Definition: channel.h:1201
@ AST_AMA_OMIT
Definition: channel.h:1199
@ AST_AMA_BILLING
Definition: channel.h:1200
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_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 10586 of file channel.c.

10587{
10588 struct ast_channel *peer;
10589 struct ast_bridge *bridge;
10590
10591 /* Get the bridge the channel is in. */
10592 ast_channel_lock(chan);
10593 bridge = ast_channel_get_bridge(chan);
10594 ast_channel_unlock(chan);
10595 if (!bridge) {
10596 return NULL;
10597 }
10598
10599 peer = ast_bridge_peer(bridge, chan);
10600 ao2_ref(bridge, -1);
10601 return peer;
10602}
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:10556
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_by_exten_cb()

static int ast_channel_by_exten_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

Definition at line 1325 of file channel.c.

1326{
1327 struct ast_channel *chan = obj;
1328 char *context = arg;
1329 char *exten = data;
1330 int ret = CMP_MATCH;
1331
1333 ast_log(LOG_ERROR, "BUG! Must have a context and extension to match!\n");
1334 return CMP_STOP;
1335 }
1336
1337 ast_channel_lock(chan);
1338 if (strcasecmp(ast_channel_context(chan), context)) {
1339 ret = 0; /* Context match failed, continue */
1340 } else if (strcasecmp(ast_channel_exten(chan), exten)) {
1341 ret = 0; /* Extension match failed, continue */
1342 }
1343 ast_channel_unlock(chan);
1344
1345 return ret;
1346}
@ CMP_MATCH
Definition: astobj2.h:1027
@ CMP_STOP
Definition: astobj2.h:1028
const char * ast_channel_exten(const struct ast_channel *chan)

References ast_channel_context(), ast_channel_exten(), ast_channel_lock, ast_channel_unlock, ast_log, ast_strlen_zero(), CMP_MATCH, CMP_STOP, voicemailpwcheck::context, ast_channel::data, ast_channel::exten, and LOG_ERROR.

Referenced by ast_channel_get_by_exten(), and ast_channel_iterator_by_exten_new().

◆ ast_channel_by_name_cb()

static int ast_channel_by_name_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

Definition at line 1303 of file channel.c.

1304{
1305 struct ast_channel *chan = obj;
1306 const char *name = arg;
1307 size_t name_len = *(size_t *) data;
1308 int ret = CMP_MATCH;
1309
1310 if (ast_strlen_zero(name)) {
1311 ast_log(LOG_ERROR, "BUG! Must supply a channel name or partial name to match!\n");
1312 return CMP_STOP;
1313 }
1314
1315 ast_channel_lock(chan);
1316 if ((!name_len && strcasecmp(ast_channel_name(chan), name))
1317 || (name_len && strncasecmp(ast_channel_name(chan), name, name_len))) {
1318 ret = 0; /* name match failed, keep looking */
1319 }
1320 ast_channel_unlock(chan);
1321
1322 return ret;
1323}

References ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_log, ast_strlen_zero(), CMP_MATCH, CMP_STOP, ast_channel::data, LOG_ERROR, and name.

Referenced by ast_channel_get_by_name_prefix(), and ast_channel_iterator_by_name_new().

◆ ast_channel_by_uniqueid_cb()

static int ast_channel_by_uniqueid_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

Definition at line 1348 of file channel.c.

1349{
1350 struct ast_channel *chan = obj;
1351 char *uniqueid = arg;
1352 size_t id_len = *(size_t *) data;
1353 int ret = CMP_MATCH;
1354
1356 ast_log(LOG_ERROR, "BUG! Must supply a uniqueid or partial uniqueid to match!\n");
1357 return CMP_STOP;
1358 }
1359
1360 ast_channel_lock(chan);
1361 if ((!id_len && strcasecmp(ast_channel_uniqueid(chan), uniqueid))
1362 || (id_len && strncasecmp(ast_channel_uniqueid(chan), uniqueid, id_len))) {
1363 ret = 0; /* uniqueid match failed, keep looking */
1364 }
1365 ast_channel_unlock(chan);
1366
1367 return ret;
1368}
struct ast_channel_id uniqueid

References ast_channel_lock, ast_channel_uniqueid(), ast_channel_unlock, ast_log, ast_strlen_zero(), CMP_MATCH, CMP_STOP, ast_channel::data, LOG_ERROR, and ast_channel::uniqueid.

Referenced by ast_channel_get_by_name_prefix(), and does_id_conflict().

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

1299{
1300 return ao2_callback_data(channels, ao2_flags, cb_fn, arg, data);
1301}
#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_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 10473 of file channel.c.

10475{
10476 struct ast_cc_config_params *cc_params;
10477 struct ast_datastore *cc_datastore;
10478
10479 if (!(cc_params = ast_cc_config_params_init())) {
10480 return -1;
10481 }
10482
10483 if (!(cc_datastore = ast_datastore_alloc(&cc_channel_datastore_info, NULL))) {
10485 return -1;
10486 }
10487
10488 if (base_params) {
10489 ast_cc_copy_config_params(cc_params, base_params);
10490 }
10491 cc_datastore->data = cc_params;
10492 ast_channel_datastore_add(chan, cc_datastore);
10493 return 0;
10494}
#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
static const struct ast_datastore_info cc_channel_datastore_info
Definition: channel.c:10467

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

11057{
11058 ast_channel_lock(chan);
11060 ast_channel_unlock(chan);
11061}

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

2452{
2453 ast_channel_lock(chan);
2454
2456
2458 struct ast_frame *fr;
2459
2460 /* If we have completely cleared the softhangup flag,
2461 * then we need to fully abort the hangup process. This requires
2462 * pulling the END_OF_Q frame out of the channel frame queue if it
2463 * still happens to be there. */
2464
2465 fr = AST_LIST_LAST(ast_channel_readq(chan));
2466 if (fr && fr->frametype == AST_FRAME_CONTROL &&
2469 ast_frfree(fr);
2470 }
2471 }
2472
2473 ast_channel_unlock(chan);
2474}
void ast_channel_softhangup_internal_flag_clear(struct ast_channel *chan, int value)

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

static int ast_channel_cmp_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1447 of file channel.c.

1448{
1449 ast_log(LOG_ERROR, "BUG! Should never be called!\n");
1450 return CMP_STOP;
1451}

References ast_log, CMP_STOP, and LOG_ERROR.

Referenced by ast_channels_init().

◆ ast_channel_cmpwhentohangup_tv()

int ast_channel_cmpwhentohangup_tv ( struct ast_channel chan,
struct timeval  offset 
)

Compare a offset with when to hangup channel.

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)
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition: extconf.c:2282

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

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

10361{
10362 const char *sub;
10363 const char *sub_args;
10364 int retval;
10365
10366 ast_channel_lock(sub_chan);
10367 sub = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB");
10368 sub = ast_strdupa(S_OR(sub, ""));
10369 sub_args = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB_ARGS");
10370 sub_args = ast_strdupa(S_OR(sub_args, ""));
10371
10372 if (ast_strlen_zero(sub)) {
10373 ast_channel_unlock(sub_chan);
10374 return -1;
10375 }
10376
10377 if (is_frame) {
10378 const struct ast_frame *frame = connected_info;
10379
10381 } else {
10382 const struct ast_party_connected_line *connected = connected_info;
10383
10385 }
10386 ast_channel_unlock(sub_chan);
10387
10389 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10391 if (!retval) {
10392 struct ast_party_connected_line saved_connected;
10393
10394 ast_party_connected_line_init(&saved_connected);
10395 ast_channel_lock(sub_chan);
10396 ast_party_connected_line_copy(&saved_connected, ast_channel_connected(sub_chan));
10397 ast_channel_unlock(sub_chan);
10398 ast_channel_update_connected_line(sub_chan, &saved_connected, NULL);
10399 ast_party_connected_line_free(&saved_connected);
10400 }
10401
10402 return retval;
10403}
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:9115
static void channel_set_intercept_mode(int in_intercept_mode)
Definition: channel.c:10344
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_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 2404 of file channel.c.

2405{
2406 int res = 0;
2407
2409
2410 return res;
2411}
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 2418 of file channel.c.

2419{
2420 struct ast_datastore *datastore = NULL;
2421
2422 if (info == NULL)
2423 return NULL;
2424
2426 if (datastore->info != info) {
2427 continue;
2428 }
2429
2430 if (uid == NULL) {
2431 /* matched by type only */
2432 break;
2433 }
2434
2435 if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
2436 /* Matched by type AND uid */
2437 break;
2438 }
2439 }
2440
2441 return datastore;
2442}
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 2387 of file channel.c.

2388{
2389 struct ast_datastore *datastore = NULL, *datastore2;
2390
2392 if (datastore->inheritance > 0) {
2393 datastore2 = ast_datastore_alloc(datastore->info, datastore->uid);
2394 if (datastore2) {
2395 datastore2->data = datastore->info->duplicate ? datastore->info->duplicate(datastore->data) : NULL;
2396 datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
2398 }
2399 }
2400 }
2401 return 0;
2402}
#define DATASTORE_INHERIT_FOREVER
Definition: channel.h:194
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_defer_dtmf()

int ast_channel_defer_dtmf ( struct ast_channel chan)

Set defer DTMF flag on channel.

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

Definition at line 1276 of file channel.c.

1277{
1278 int pre = 0;
1279
1280 if (chan) {
1281 ast_channel_lock(chan);
1284 ast_channel_unlock(chan);
1285 }
1286 return pre;
1287}

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

static void ast_channel_destructor ( void *  obj)
static

Free a channel structure.

Definition at line 2211 of file channel.c.

2212{
2213 struct ast_channel *chan = obj;
2214 struct ast_var_t *vardata;
2215 struct ast_frame *f;
2216 struct varshead *headp;
2217 struct ast_datastore *datastore;
2218 char device_name[AST_CHANNEL_NAME];
2219 ast_callid callid;
2220
2221 ast_debug(1, "Channel %p '%s' destroying\n", chan, ast_channel_name(chan));
2222
2223 /* If there is native format music-on-hold state, free it */
2224 if (ast_channel_music_state(chan)) {
2225 ast_moh_cleanup(chan);
2226 }
2227
2229
2230 /* Things that may possibly raise Stasis messages shouldn't occur after this point */
2232
2234 /* A channel snapshot should not be in the process of being staged now. */
2236
2237 ast_channel_lock(chan);
2239 ast_channel_unlock(chan);
2240 }
2241
2242 ast_channel_lock(chan);
2243
2244 /* Get rid of each of the data stores on the channel */
2245 while ((datastore = AST_LIST_REMOVE_HEAD(ast_channel_datastores(chan), entry)))
2246 /* Free the data store */
2247 ast_datastore_free(datastore);
2248
2249 /* While the channel is locked, take the reference to its callid while we tear down the call. */
2250 callid = ast_channel_callid(chan);
2252
2253 ast_channel_unlock(chan);
2254
2255 /* Lock and unlock the channel just to be sure nobody has it locked still
2256 due to a reference that was stored in a datastore. (i.e. app_chanspy) */
2257 ast_channel_lock(chan);
2258 ast_channel_unlock(chan);
2259
2260 if (ast_channel_tech_pvt(chan)) {
2261 ast_log_callid(LOG_WARNING, callid, "Channel '%s' may not have been hung up properly\n", ast_channel_name(chan));
2263 }
2264
2265 if (ast_channel_sched(chan)) {
2267 }
2268
2270 char *dashptr;
2271
2272 ast_copy_string(device_name, ast_channel_name(chan), sizeof(device_name));
2273 if ((dashptr = strrchr(device_name, '-'))) {
2274 *dashptr = '\0';
2275 }
2276 } else {
2277 device_name[0] = '\0';
2278 }
2279
2280 /* Free translators */
2281 if (ast_channel_readtrans(chan))
2283 if (ast_channel_writetrans(chan))
2285 if (ast_channel_pbx(chan))
2286 ast_log_callid(LOG_WARNING, callid, "PBX may not have been terminated properly on '%s'\n", ast_channel_name(chan));
2287
2288 /* Free formats */
2294
2300
2301 /* Close pipes if appropriate */
2303 if (ast_channel_timer(chan)) {
2306 }
2308 ast_frfree(f);
2309
2310 /* loop over the variables list, freeing all data and deleting list items */
2311 /* no need to lock the list, as the channel is already locked */
2312 headp = ast_channel_varshead(chan);
2313 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
2314 ast_var_delete(vardata);
2315
2317
2318 /* Destroy the jitterbuffer */
2319 ast_jb_destroy(chan);
2320
2321 if (ast_channel_cdr(chan)) {
2324 }
2325
2326 if (ast_channel_zone(chan)) {
2328 }
2329
2331
2332 if (device_name[0]) {
2333 /*
2334 * We have a device name to notify of a new state.
2335 *
2336 * Queue an unknown state, because, while we know that this particular
2337 * instance is dead, we don't know the state of all other possible
2338 * instances.
2339 */
2341 }
2342
2344
2347
2349}
void ast_jb_destroy(struct ast_channel *chan)
Destroys jitterbuffer on a channel.
Definition: abstract_jb.c:502
void ast_cdr_free(struct ast_cdr *cdr)
Free a CDR record.
Definition: cdr.c:3490
void ast_moh_cleanup(struct ast_channel *chan)
Definition: channel.c:7804
void ast_party_dialed_free(struct ast_party_dialed *doomed)
Destroy the dialed party contents.
Definition: channel.c:1990
void ast_party_caller_free(struct ast_party_caller *doomed)
Destroy the caller party contents.
Definition: channel.c:2034
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2198
void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void * ast_channel_tech_pvt(const struct ast_channel *chan)
void ast_channel_callid_cleanup(struct ast_channel *chan)
void ast_channel_set_oldwriteformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_internal_alertpipe_close(struct ast_channel *chan)
struct ast_cdr * ast_channel_cdr(const struct ast_channel *chan)
ast_callid ast_channel_callid(const struct ast_channel *chan)
struct ast_tone_zone * ast_channel_zone(const struct ast_channel *chan)
void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_channel_cdr_set(struct ast_channel *chan, struct ast_cdr *value)
struct ast_sched_context * ast_channel_sched(const struct ast_channel *chan)
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
Definition: channel.h:1049
@ AST_FLAG_SNAPSHOT_STAGE
Definition: channel.h:1070
@ AST_FLAG_DEAD
Definition: channel.h:1065
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
void ast_channel_zone_set(struct ast_channel *chan, struct ast_tone_zone *value)
int ast_channel_internal_is_finalized(struct ast_channel *chan)
void ast_channel_internal_cleanup(struct ast_channel *chan)
void ast_var_delete(struct ast_var_t *var)
Definition: extconf.c:2471
@ AST_DEVSTATE_CACHABLE
Definition: devicestate.h:70
@ AST_DEVSTATE_NOT_CACHABLE
Definition: devicestate.h:69
int ast_devstate_changed_literal(enum ast_device_state state, enum ast_devstate_cache cachable, const char *device)
Tells Asterisk the State for Device is changed.
Definition: devicestate.c:471
@ AST_DEVICE_UNKNOWN
Definition: devicestate.h:53
void ast_channel_publish_final_snapshot(struct ast_channel *chan)
Send the final channel snapshot for a channel, thus removing it from cache.
int ast_app_group_discard(struct ast_channel *chan)
Discard all group counting for a channel.
Definition: main/app.c:2319
unsigned int ast_callid
void ast_log_callid(int level, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
Used for sending a log message with a known call_id This is a modified logger function which is funct...
Definition: logger.c:2501
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
void ast_pbx_hangup_handler_destroy(struct ast_channel *chan)
Destroy the hangup handler container on a channel.
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
Definition: sched.c:271
void ast_timer_close(struct ast_timer *handle)
Close an opened timing handle.
Definition: timing.c:154
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition: translate.c:476
#define ast_assert(a)
Definition: utils.h:739

References ast_app_group_discard(), ast_assert, ast_atomic_fetchadd_int(), ast_cdr_free(), ast_channel_caller(), ast_channel_callid(), ast_channel_callid_cleanup(), ast_channel_cdr(), ast_channel_cdr_set(), ast_channel_connected(), ast_channel_connected_indicated(), ast_channel_datastores(), ast_channel_dialed(), ast_channel_flags(), ast_channel_internal_alertpipe_close(), ast_channel_internal_cleanup(), ast_channel_internal_is_finalized(), ast_channel_lock, ast_channel_music_state(), AST_CHANNEL_NAME, ast_channel_name(), ast_channel_named_callgroups_set(), ast_channel_named_pickupgroups_set(), ast_channel_nativeformats_set(), ast_channel_pbx(), ast_channel_publish_final_snapshot(), ast_channel_readq(), ast_channel_readtrans(), ast_channel_redirecting(), ast_channel_sched(), ast_channel_set_oldwriteformat(), ast_channel_set_rawreadformat(), ast_channel_set_rawwriteformat(), ast_channel_set_readformat(), ast_channel_set_writeformat(), ast_channel_tech_pvt(), ast_channel_timer(), ast_channel_timer_set(), ast_channel_unlock, ast_channel_varshead(), ast_channel_writetrans(), ast_channel_zone(), ast_channel_zone_set(), ast_copy_string(), ast_datastore_free(), ast_debug, AST_DEVICE_UNKNOWN, AST_DEVSTATE_CACHABLE, ast_devstate_changed_literal(), AST_DEVSTATE_NOT_CACHABLE, AST_FLAG_DEAD, AST_FLAG_DISABLE_DEVSTATE_CACHE, AST_FLAG_SNAPSHOT_STAGE, ast_free, ast_frfree, ast_jb_destroy(), AST_LIST_REMOVE_HEAD, ast_log_callid(), ast_moh_cleanup(), ast_party_caller_free(), ast_party_connected_line_free(), ast_party_dialed_free(), ast_party_redirecting_free(), ast_pbx_hangup_handler_destroy(), ast_sched_context_destroy(), ast_set_flag, ast_test_flag, ast_timer_close(), ast_tone_zone_unref(), ast_translator_free_path(), ast_var_delete(), chancount, LOG_WARNING, and NULL.

Referenced by __ast_channel_alloc_ap().

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

7435{
7436 /* Make sure we can early bridge, if not error out */
7437 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)))
7438 return -1;
7439
7440 return ast_channel_tech(c0)->early_bridge(c0, c1);
7441}
enum ast_bridge_result(*const early_bridge)(struct ast_channel *c0, struct ast_channel *c1)
Bridge two channels of the same type together (early)
Definition: channel.h:788

References ast_channel_tech(), and ast_channel_tech::early_bridge.

Referenced by dial_exec_full(), and wait_for_answer().

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

10892{
10893 int dead;
10894 long duration;
10895
10896 ast_channel_lock(chan);
10899 & ~AST_SOFTHANGUP_ASYNCGOTO);
10900 ast_channel_unlock(chan);
10901 if (dead) {
10902 /* Channel is a zombie or a real hangup. */
10903 return;
10904 }
10905
10906 duration = ast_tvdiff_ms(ast_tvnow(), start);
10907 if (duration < option_dtmfminduration) {
10908 duration = option_dtmfminduration;
10909 }
10910 ast_senddigit_end(chan, digit, duration);
10911 ast_log(LOG_DTMF, "DTMF end '%c' simulated on %s due to %s, duration %ld ms\n",
10912 digit, ast_channel_name(chan), why, duration);
10913}
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition: channel.c:4943

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

enum ast_channel_error ast_channel_errno ( void  )

Get error code for latest channel operation.

Definition at line 10983 of file channel.c.

10984{
10986}
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_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 10973 of file channel.c.

10974{
10975 return channel_feature_hooks_set_full(chan, features, 0);
10976}
static int channel_feature_hooks_set_full(struct ast_channel *chan, struct ast_bridge_features *features, int replace)
Definition: channel.c:10936

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

10926{
10927 struct ast_datastore *datastore;
10928
10930 if (!datastore) {
10931 return NULL;
10932 }
10933 return datastore->data;
10934}
static const struct ast_datastore_info bridge_features_info
Definition: channel.c:10920

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

10979{
10980 return channel_feature_hooks_set_full(chan, features, 1);
10981}

References channel_feature_hooks_set_full().

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

8011{
8012 return channel_get_external_vars(&ari_vars, chan);
8013}
static struct varshead * channel_get_external_vars(struct external_vars *channelvars, struct ast_channel *chan)
Definition: channel.c:7958
static struct external_vars ari_vars
Definition: channel.c:7854

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

10557{
10558 struct ast_bridge *bridge;
10559
10560 bridge = ast_channel_internal_bridge(chan);
10561 if (bridge) {
10562 ao2_ref(bridge, +1);
10563 }
10564 return bridge;
10565}
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 10604 of file channel.c.

10605{
10606 struct ast_bridge_channel *bridge_channel;
10607
10608 bridge_channel = ast_channel_internal_bridge_channel(chan);
10609 if (bridge_channel) {
10610 ao2_ref(bridge_channel, +1);
10611 }
10612 return bridge_channel;
10613}
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 1478 of file channel.c.

1479{
1480 char *l_exten = (char *) exten;
1481 char *l_context = (char *) context;
1482
1483 return ast_channel_callback(ast_channel_by_exten_cb, l_context, l_exten, 0);
1484}
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:1297
static int ast_channel_by_exten_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1325

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

1474{
1476}
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:1453

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

1454{
1455 struct ast_channel *chan;
1456 char *l_name = (char *) name;
1457
1458 if (ast_strlen_zero(l_name)) {
1459 /* We didn't have a name to search for so quit. */
1460 return NULL;
1461 }
1462
1463 chan = ast_channel_callback(ast_channel_by_name_cb, l_name, &name_len,
1464 (name_len == 0) /* optimize if it is a complete name match */ ? OBJ_KEY : 0);
1465 if (chan) {
1466 return chan;
1467 }
1468
1469 /* Now try a search for uniqueid. */
1470 return ast_channel_callback(ast_channel_by_uniqueid_cb, l_name, &name_len, 0);
1471}
#define OBJ_KEY
Definition: astobj2.h:1151
static int ast_channel_by_uniqueid_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1348
static int ast_channel_by_name_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1303

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

10536{
10537 int len = size;
10538 char *slash;
10539
10541 return 0;
10542 }
10543
10545 if ((slash = strchr(agent_type, '/'))) {
10546 *slash = '\0';
10547 }
10548 return 0;
10549}
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:7464
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 10496 of file channel.c.

10497{
10498 struct ast_datastore *cc_datastore;
10499
10500 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10501 /* If we can't find the datastore, it almost definitely means that the channel type being
10502 * used has not had its driver modified to parse CC config parameters. The best action
10503 * to take here is to create the parameters on the spot with the defaults set.
10504 */
10505 if (ast_channel_cc_params_init(chan, NULL)) {
10506 return NULL;
10507 }
10508 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10509 /* Should be impossible */
10510 return NULL;
10511 }
10512 }
10513
10514 ast_assert(cc_datastore->data != NULL);
10515 return cc_datastore->data;
10516}
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:10473

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

10519{
10520 int len = name_buffer_length;
10521 char *dash;
10522 if (!ast_channel_queryoption(chan, AST_OPTION_DEVICE_NAME, device_name, &len, 0)) {
10523 return 0;
10524 }
10525
10526 /* Dang. Do it the old-fashioned way */
10527 ast_copy_string(device_name, ast_channel_name(chan), name_buffer_length);
10528 if ((dash = strrchr(device_name, '-'))) {
10529 *dash = '\0';
10530 }
10531
10532 return 0;
10533}
#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 2849 of file channel.c.

2850{
2851 return (ast_channel_get_duration_ms(chan) / 1000);
2852}
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:2839

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

2840{
2841 ast_assert(NULL != chan);
2842
2844 return 0;
2845 }
2847}
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 10355 of file channel.c.

10356{
10357 return ast_threadstorage_get_ptr(&in_intercept_routine) ? 1 : 0;
10358}
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 8005 of file channel.c.

8006{
8007 return channel_get_external_vars(&ami_vars, chan);
8008}
static struct external_vars ami_vars
Definition: channel.c:7853

References ami_vars, and channel_get_external_vars().

Referenced by append_channel_vars(), and ast_channel_snapshot_create().

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

2865{
2866 return (ast_channel_get_up_time_ms(chan) / 1000);
2867}
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:2854

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

2855{
2856 ast_assert(NULL != chan);
2857
2859 return 0;
2860 }
2862}
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 7933 of file channel.c.

7934{
7935 RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
7936 struct ast_var_t *cv;
7937
7938 ret = ao2_alloc(sizeof(*ret), varshead_dtor);
7939
7940 if (!ret) {
7941 return NULL;
7942 }
7943
7946
7947 if (!var) {
7948 return NULL;
7949 }
7950
7952 }
7953
7954 ao2_ref(ret, +1);
7955 return ret;
7956}
#define var
Definition: ast_expr2f.c:605
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
static void varshead_dtor(void *obj)
Destructor for lists of variables.
Definition: channel.c:7923
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_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 4365 of file channel.c.

4366{
4367 char causevar[256];
4368
4369 if (ast_channel_dialed_causes_add(chan, cause_code, datalen)) {
4370 ast_log(LOG_WARNING, "Unable to store hangup cause for %s on %s\n", cause_code->chan_name, ast_channel_name(chan));
4371 }
4372
4373 if (cause_code->emulate_sip_cause) {
4374 snprintf(causevar, sizeof(causevar), "HASH(SIP_CAUSE,%s)", cause_code->chan_name);
4375 ast_func_write(chan, causevar, cause_code->code);
4376 }
4377}
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
char chan_name[AST_CHANNEL_NAME]

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

7883{
7885}
static int channel_has_external_vars(struct external_vars *channelvars)
Definition: channel.c:7866

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

2538{
2541}
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 2543 of file channel.c.

2544{
2547}
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 7877 of file channel.c.

7878{
7880}

References ami_vars, and channel_has_external_vars().

Referenced by ast_channel_publish_varset().

◆ ast_channel_hash_cb()

static int ast_channel_hash_cb ( const void *  obj,
const int  flags 
)
static

Definition at line 7810 of file channel.c.

7811{
7812 const char *name = (flags & OBJ_KEY) ? obj : ast_channel_name((struct ast_channel *) obj);
7813
7814 /* If the name isn't set, return 0 so that the ao2_find() search will
7815 * start in the first bucket. */
7816 if (ast_strlen_zero(name)) {
7817 return 0;
7818 }
7819
7820 return ast_str_case_hash(name);
7821}
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
Definition: strings.h:1303

References ast_channel_name(), ast_str_case_hash(), ast_strlen_zero(), ast_channel::flags, name, and OBJ_KEY.

Referenced by ast_channels_init().

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

6791{
6792 struct ast_var_t *current;
6793 struct ast_var_t *newvar;
6794 const char *varname;
6795 int vartype;
6796
6798 varname = ast_var_full_name(current);
6799 if (!varname) {
6800 continue;
6801 }
6802
6803 vartype = 0;
6804 if (varname[0] == '_') {
6805 vartype = 1;
6806 if (varname[1] == '_') {
6807 vartype = 2;
6808 }
6809 }
6810
6811 switch (vartype) {
6812 case 1:
6813 newvar = ast_var_assign(&varname[1], ast_var_value(current));
6814 break;
6815 case 2:
6816 newvar = ast_var_assign(varname, ast_var_value(current));
6817 break;
6818 default:
6819 continue;
6820 }
6821 if (newvar) {
6822 ast_debug(1, "Inheriting variable %s from %s to %s.\n",
6823 ast_var_full_name(newvar), ast_channel_name(parent),
6824 ast_channel_name(child));
6827 ast_var_value(newvar));
6828 }
6829 }
6830}
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_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 10567 of file channel.c.

10568{
10569 return ast_channel_internal_bridge(chan) != NULL;
10570}

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

10573{
10574 int hangup_flags = ast_channel_softhangup_internal_flag(chan);
10575 int hangup_test = hangup_flags & AST_SOFTHANGUP_ASYNCGOTO;
10576 int unbridge = ast_channel_unbridged(chan);
10577
10578 /* This function should only return true if either the unbridged flag or
10579 * the ASYNCGOTO soft hangup flag is set and when no other soft hangup
10580 * flags are set. Any other soft hangup flags being set should make it
10581 * return false.
10582 */
10583 return ((hangup_test || unbridge) && (hangup_test == hangup_flags));
10584}
@ AST_SOFTHANGUP_ASYNCGOTO
Definition: channel.h:1146
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_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 1427 of file channel.c.

1428{
1429 struct ast_channel_iterator *i;
1430
1431 if (!(i = ast_calloc(1, sizeof(*i)))) {
1432 return NULL;
1433 }
1434
1437
1438 return i;
1439}
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:1372
struct ao2_iterator * active_iterator
Definition: channel.c:1376

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

1388{
1389 struct ast_channel_iterator *i;
1390 char *l_exten = (char *) exten;
1391 char *l_context = (char *) context;
1392
1393 if (!(i = ast_calloc(1, sizeof(*i)))) {
1394 return NULL;
1395 }
1396
1398 l_context, l_exten, OBJ_MULTIPLE);
1399 if (!i->active_iterator) {
1400 ast_free(i);
1401 return NULL;
1402 }
1403
1404 return i;
1405}
@ OBJ_MULTIPLE
Definition: astobj2.h:1049

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

1408{
1409 struct ast_channel_iterator *i;
1410 char *l_name = (char *) name;
1411
1412 if (!(i = ast_calloc(1, sizeof(*i)))) {
1413 return NULL;
1414 }
1415
1417 l_name, &name_len,
1418 OBJ_MULTIPLE | (name_len == 0 /* match the whole word, so optimize */ ? OBJ_KEY : 0));
1419 if (!i->active_iterator) {
1420 ast_free(i);
1421 return NULL;
1422 }
1423
1424 return i;
1425}

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

1380{
1382 ast_free(i);
1383
1384 return NULL;
1385}
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 1441 of file channel.c.

1442{
1444}
#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_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 6739 of file channel.c.

6740{
6741 /*
6742 * Set up translation from the peer to the chan first in case we
6743 * need to hear any in-band tones and the other direction fails.
6744 */
6745 if (ast_channel_make_compatible_helper(peer, chan)) {
6746 return -1;
6747 }
6748
6749 /* Set up translation from the chan to the peer */
6750 if (ast_channel_make_compatible_helper(chan, peer)) {
6751 return -1;
6752 }
6753
6754 return 0;
6755}
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:6660

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

static int ast_channel_make_compatible_helper ( struct ast_channel from,
struct ast_channel to 
)
static

Set up translation from one channel to another.

Definition at line 6660 of file channel.c.

6661{
6662 struct ast_format_cap *src_cap;
6663 struct ast_format_cap *dst_cap;
6664 RAII_VAR(struct ast_format *, best_src_fmt, NULL, ao2_cleanup);
6665 RAII_VAR(struct ast_format *, best_dst_fmt, NULL, ao2_cleanup);
6666 int no_path;
6667
6668 /*
6669 * We cannot short circuit this code because it is possible to ask
6670 * to make compatible two channels that are "compatible" because
6671 * they already have translation paths setup but together make for
6672 * a sub-optimal path. e.g., The From channel has g722 -> ulaw
6673 * and the To channel has ulaw -> g722. They are "compatible" but
6674 * together the translations are unnecessary and the audio loses
6675 * fidelity in the process.
6676 */
6677
6678 ast_channel_lock_both(from, to);
6679
6680 src_cap = ast_channel_nativeformats(from); /* shallow copy, do not destroy */
6681 dst_cap = ast_channel_nativeformats(to); /* shallow copy, do not destroy */
6682
6683 /* If there's no audio in this call, don't bother with trying to find a translation path */
6687 ast_channel_unlock(from);
6688 return 0;
6689 }
6690
6691 no_path = ast_translator_best_choice(dst_cap, src_cap, &best_dst_fmt, &best_src_fmt);
6692
6694 ast_channel_unlock(from);
6695
6696 if (no_path) {
6697 ast_log(LOG_WARNING, "No path to translate from %s to %s\n",
6699 return -1;
6700 }
6701
6702 /* if the best path is not 'pass through', then
6703 * transcoding is needed; if desired, force transcode path
6704 * to use SLINEAR between channels, but only if there is
6705 * no direct conversion available. If generic PLC is
6706 * desired, then transcoding via SLINEAR is a requirement
6707 * even if the formats are the same.
6708 */
6710 || (ast_format_cmp(best_dst_fmt, best_src_fmt) == AST_FORMAT_CMP_NOT_EQUAL
6712
6713 int use_slin = (ast_format_cache_is_slinear(best_src_fmt)
6714 || ast_format_cache_is_slinear(best_dst_fmt))
6716
6717 if (use_slin || ast_translate_path_steps(best_dst_fmt, best_src_fmt) != 1) {
6718 int best_sample_rate = (ast_format_get_sample_rate(best_src_fmt) > ast_format_get_sample_rate(best_dst_fmt)) ?
6719 ast_format_get_sample_rate(best_src_fmt) : ast_format_get_sample_rate(best_dst_fmt);
6720
6721 /* pick the best signed linear format based upon what preserves the sample rate the best. */
6722 ao2_replace(best_src_fmt, ast_format_cache_get_slin_by_rate(best_sample_rate));
6723 }
6724 }
6725
6726 if (ast_set_read_format(from, best_src_fmt)) {
6727 ast_log(LOG_WARNING, "Unable to set read format on channel %s to %s\n",
6728 ast_channel_name(from), ast_format_get_name(best_src_fmt));
6729 return -1;
6730 }
6731 if (ast_set_write_format(to, best_src_fmt)) {
6732 ast_log(LOG_WARNING, "Unable to set write format on channel %s to %s\n",
6733 ast_channel_name(to), ast_format_get_name(best_src_fmt));
6734 return -1;
6735 }
6736 return 0;
6737}
#define ao2_replace(dst, src)
Replace one object reference with another cleaning up the original.
Definition: astobj2.h:501
int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
Sets read format on channel chan.
Definition: channel.c:5781
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5822
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
@ AST_MEDIA_TYPE_AUDIO
Definition: codec.h:32
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
@ AST_FORMAT_CMP_NOT_EQUAL
Definition: format.h:38
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
struct ast_format * ast_format_cache_get_slin_by_rate(unsigned int rate)
Retrieve the best signed linear format given a sample rate.
Definition: format_cache.c:512
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
#define ast_opt_transcode_via_slin
Definition: options.h:118
#define ast_opt_generic_plc_on_equal_codecs
Definition: options.h:136
#define ast_opt_generic_plc
Definition: options.h:134
int ast_translator_best_choice(struct ast_format_cap *dst_cap, struct ast_format_cap *src_cap, struct ast_format **dst_fmt_out, struct ast_format **src_fmt_out)
Chooses the best translation path.
Definition: translate.c:1402
unsigned int ast_translate_path_steps(struct ast_format *dest, struct ast_format *src)
Returns the number of steps required to convert from 'src' to 'dest'.
Definition: translate.c:1536

References ao2_cleanup, ao2_replace, ast_channel_lock_both, ast_channel_name(), ast_channel_nativeformats(), ast_channel_unlock, ast_format_cache_get_slin_by_rate(), ast_format_cache_is_slinear(), ast_format_cap_has_type(), ast_format_cmp(), AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_name(), ast_format_get_sample_rate(), ast_log, AST_MEDIA_TYPE_AUDIO, ast_opt_generic_plc, ast_opt_generic_plc_on_equal_codecs, ast_opt_transcode_via_slin, ast_set_read_format(), ast_set_write_format(), ast_translate_path_steps(), ast_translator_best_choice(), LOG_WARNING, NULL, and RAII_VAR.

Referenced by ast_channel_make_compatible().

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

10689{
10690 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
10692
10693 if (dest == source) {
10694 ast_log(LOG_WARNING, "Can't move channel '%s' into itself!\n",
10695 ast_channel_name(dest));
10696 return -1;
10697 }
10698
10699 ast_channel_lock_both(dest, source);
10700
10703 /* Zombies! Run! */
10705 "Can't move channel. One or both is dead (%s <-- %s)\n",
10706 ast_channel_name(dest), ast_channel_name(source));
10707 ast_channel_unlock(source);
10708 ast_channel_unlock(dest);
10709 return -1;
10710 }
10711
10712 ast_channel_masq_set(dest, source);
10713 ast_channel_masqr_set(source, dest);
10714
10715 blob = ast_json_pack("{s: s}",
10716 "newchanneluniqueid", ast_channel_uniqueid(dest));
10718
10719 ast_channel_unlock(dest);
10720 ast_channel_unlock(source);
10721
10722 channel_do_masquerade(dest, source);
10723 return 0;
10724}
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:6876
static ast_mutex_t channel_move_lock
Definition: channel.c:10686
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_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 6858 of file channel.c.

6859{
6860 char *dash;
6861
6862 /* Truncate after the dash */
6863 dash = strrchr(channel_name, '-');
6864 if (dash) {
6865 *dash = '\0';
6866 }
6867}

Referenced by parked_user_set_parker_dial_string(), and setup_park_common_datastore().

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

7465{
7466 int res;
7467
7468 ast_channel_lock(chan);
7469 if (!ast_channel_tech(chan)->queryoption) {
7470 errno = ENOSYS;
7471 ast_channel_unlock(chan);
7472 return -1;
7473 }
7474
7475 if (block)
7476 ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7477
7478 res = ast_channel_tech(chan)->queryoption(chan, option, data, datalen);
7479 ast_channel_unlock(chan);
7480
7481 return res;
7482}
int(*const queryoption)(struct ast_channel *chan, int option, void *data, int *datalen)
Query a given option. Called with chan locked.
Definition: channel.h:800

References ast_channel_lock, ast_channel_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 9128 of file channel.c.

9129{
9130 unsigned char data[1024]; /* This should be large enough */
9131 size_t datalen;
9132
9133 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9134 if (datalen == (size_t) -1) {
9135 return;
9136 }
9137
9139}
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:1257
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:8719
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 10319 of file channel.c.

10320{
10321 unsigned char data[1024]; /* This should be large enough */
10322 size_t datalen;
10323
10324 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10325 if (datalen == (size_t) -1) {
10326 return;
10327 }
10328
10329 ast_queue_control_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10330}
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:9290

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

Referenced by set_redirecting().

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

5846{
5847 switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
5848 {
5849 case 0:
5850 return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
5851 case AST_CONTROL_HANGUP:
5852 return "Hangup";
5853 case AST_CONTROL_RING:
5854 return "Local Ring";
5856 return "Remote end Ringing";
5857 case AST_CONTROL_ANSWER:
5858 return "Remote end has Answered";
5859 case AST_CONTROL_BUSY:
5860 return "Remote end is Busy";
5862 return "Congestion (circuits busy)";
5863 default:
5864 return "Unknown Reason!!";
5865 }
5866}
@ 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_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 10405 of file channel.c.

10406{
10407 const char *sub;
10408 const char *sub_args;
10409 int retval;
10410
10411 ast_channel_lock(sub_chan);
10412 sub = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB");
10413 sub = ast_strdupa(S_OR(sub, ""));
10414 sub_args = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB_ARGS");
10415 sub_args = ast_strdupa(S_OR(sub_args, ""));
10416
10417 if (ast_strlen_zero(sub)) {
10418 ast_channel_unlock(sub_chan);
10419 return -1;
10420 }
10421
10422 if (is_frame) {
10423 const struct ast_frame *frame = redirecting_info;
10424
10426 } else {
10427 const struct ast_party_redirecting *redirecting = redirecting_info;
10428
10430 }
10431 ast_channel_unlock(sub_chan);
10432
10434 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10436 if (!retval) {
10437 struct ast_party_redirecting saved_redirecting;
10438
10439 ast_party_redirecting_init(&saved_redirecting);
10440 ast_channel_lock(sub_chan);
10441 ast_party_redirecting_copy(&saved_redirecting, ast_channel_redirecting(sub_chan));
10442 ast_channel_unlock(sub_chan);
10443 ast_channel_update_redirecting(sub_chan, &saved_redirecting, NULL);
10444 ast_party_redirecting_free(&saved_redirecting);
10445 }
10446
10447 return retval;
10448}
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:10306
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:9501
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition: channel.h:524

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 new telephony channel in Asterisk.

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:649
const char *const description
Definition: channel.h:650
const struct ast_channel_tech * tech
the list of registered channel types
Definition: channel.c:121
List of channel drivers.
Definition: app_dial.c:797
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 1603 of file channel.c.

1604{
1605 /* Safe, even if already unlinked. */
1606 ao2_unlink(channels, chan);
1607 return ast_channel_unref(chan);
1608}

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

6454{
6455 channel_req_accountcodes(chan, requestor, relationship, 0);
6456}
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:6395

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

6459{
6460 channel_req_accountcodes(chan, requestor, relationship, 1);
6461}

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

10990{
10991 int res;
10992
10993 ast_assert(chan != NULL);
10994 ast_assert(topology != NULL);
10995
10996 ast_channel_lock(chan);
10998 ast_channel_unlock(chan);
10999 return -1;
11000 }
11001
11003 ast_debug(2, "%s: Topologies already match. Current: %s Requested: %s\n",
11004 ast_channel_name(chan),
11006 ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
11007 ast_channel_unlock(chan);
11008 return 0;
11009 }
11010
11012
11013 res = ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, topology, sizeof(topology));
11014 ast_channel_unlock(chan);
11015 return res;
11016}
static int indicate(void *data)
Definition: chan_pjsip.c:1338
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)
const char * ast_stream_topology_to_str(const struct ast_stream_topology *topology, struct ast_str **buf)
Get a string representing the topology for debugging/display purposes.
Definition: stream.c:939
int ast_stream_topology_equal(const struct ast_stream_topology *left, const struct ast_stream_topology *right)
Compare two stream topologies to see if they are equal.
Definition: stream.c:699
#define ast_str_tmp(init_len, __expr)
Provides a temporary ast_str and returns a copy of its buffer.
Definition: strings.h:1189
int(*const indicate)(struct ast_channel *c, int condition, const void *data, size_t datalen)
Indicate a particular condition (e.g. AST_CONTROL_BUSY or AST_CONTROL_RINGING or AST_CONTROL_CONGESTI...
Definition: channel.h:791

References ast_assert, ast_channel_get_stream_topology(), ast_channel_internal_set_stream_topology_change_source(), ast_channel_is_multistream(), ast_channel_lock, ast_channel_name(), ast_channel_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_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 6647 of file channel.c.

6648{
6649 if (ast_channel_tech(chan)->send_html)
6650 return ast_channel_tech(chan)->send_html(chan, subclass, data, datalen);
6651 return -1;
6652}
int(*const send_html)(struct ast_channel *chan, int subclass, const char *data, int len)
Send HTML data.
Definition: channel.h:782

References ast_channel_tech(), and ast_channel_tech::send_html.

Referenced by ast_channel_sendurl(), and wait_for_answer().

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

6655{
6656 return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
6657}
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:6647
#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 7914 of file channel.c.

7915{
7916 channel_set_external_vars(&ari_vars, varc, vars);
7917}
static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
Definition: channel.c:7887

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

7382{
7383 if (ast_channel_caller(chan) == caller) {
7384 /* Don't set to self */
7385 return;
7386 }
7387
7388 ast_channel_lock(chan);
7391 ast_channel_unlock(chan);
7392}
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:2026
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_CALLER

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

7395{
7396 if (ast_channel_caller(chan) == caller) {
7397 /* Don't set to self */
7398 return;
7399 }
7400
7401 ast_channel_lock(chan);
7405 ast_channel_unlock(chan);
7406}
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.

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

8331{
8332 if (ast_channel_connected(chan) == connected) {
8333 /* Don't set to self */
8334 return;
8335 }
8336
8337 ast_channel_lock(chan);
8341 ast_channel_unlock(chan);
8342}
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:2073
@ AST_CHANNEL_SNAPSHOT_INVALIDATE_CONNECTED

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

11050{
11051 ast_channel_lock(chan);
11053 ast_channel_unlock(chan);
11054}

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

7910{
7911 channel_set_external_vars(&ami_vars, varc, vars);
7912}

References ami_vars, and channel_set_external_vars().

Referenced by load_channelvars().

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

9142{
9143 if (ast_channel_redirecting(chan) == redirecting) {
9144 /* Don't set to self */
9145 return;
9146 }
9147
9148 ast_channel_lock(chan);
9152 ast_channel_unlock(chan);
9153}
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:2185

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

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

References ast_channel_lock, ast_channel_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 hangup channel.

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}
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_softhangup_cb()

static int ast_channel_softhangup_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 484 of file channel.c.

485{
486 struct ast_channel *chan = obj;
487
489
490 return 0;
491}
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup a channel, lock.
Definition: channel.c:2490
@ AST_SOFTHANGUP_SHUTDOWN
Definition: channel.h:1151

References ast_softhangup(), and AST_SOFTHANGUP_SHUTDOWN.

Referenced by ast_softhangup_all().

◆ 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:2477
int ast_channel_hangupcause(const struct ast_channel *chan)
@ AST_SOFTHANGUP_EXPLICIT
Definition: channel.h:1168

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

8187{
8189
8190 if (!(state = ast_calloc(1, sizeof(*state)))) {
8191 return NULL;
8192 }
8193
8194 state->old_write_format = ao2_bump(ast_channel_writeformat(chan));
8195
8196 if (ast_set_write_format(chan, ast_format_slin) < 0) {
8197 ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
8198 ast_free(state);
8199 return NULL;
8200 }
8201
8203
8204 ast_debug(1, "Started silence generator on '%s'\n", ast_channel_name(chan));
8205
8206 return state;
8207}
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
enum cc_state state
Definition: ccss.c:393
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition: channel.c:2970
static struct ast_generator silence_generator
Definition: channel.c:8176
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_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 8232 of file channel.c.

8233{
8234 if (!state) {
8235 return;
8236 }
8237
8238 if (deactivate_silence_generator(chan)) {
8239 ast_debug(1, "Stopped silence generator on '%s'\n", ast_channel_name(chan));
8240 if (ast_set_write_format(chan, state->old_write_format) < 0) {
8241 ast_log(LOG_ERROR, "Could not return write format to its original state\n");
8242 }
8243 }
8244 ao2_cleanup(state->old_write_format);
8245 ast_free(state);
8246}
static int deactivate_silence_generator(struct ast_channel *chan)
Definition: channel.c:8209

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

11019{
11020 ast_assert(chan != NULL);
11021 ast_assert(topology != NULL);
11022
11024 return -1;
11025 }
11026
11027 return ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, topology, sizeof(topology));
11028}

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

11031{
11032 int res;
11033 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_STREAM_TOPOLOGY_CHANGED };
11034
11035 ast_assert(chan != NULL);
11036
11037 if (!ast_channel_is_multistream(chan)) {
11038 return -1;
11039 }
11040
11041 ast_channel_lock(chan);
11043 res = ast_queue_frame(chan, &f);
11044 ast_channel_unlock(chan);
11045
11046 return res;
11047}
static const char ast_stream_topology_changed_external[]
Set as the change source reason when a channel stream topology has been changed externally as a resul...
Definition: channel.h:223

References ast_assert, ast_channel_internal_set_stream_topology_change_source(), ast_channel_is_multistream(), ast_channel_lock, ast_channel_unlock, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, AST_FRAME_CONTROL, ast_queue_frame(), ast_stream_topology_changed_external, and NULL.

Referenced by handle_negotiated_sdp(), and unreal_colp_stream_topology_request_change().

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

4380{
4381 if (!strcasecmp(flag, "default"))
4382 return DEFAULT_AMA_FLAGS;
4383 if (!strcasecmp(flag, "omit"))
4384 return AST_AMA_OMIT;
4385 if (!strcasecmp(flag, "billing"))
4386 return AST_AMA_BILLING;
4387 if (!strcasecmp(flag, "documentation"))
4388 return AST_AMA_DOCUMENTATION;
4389 return AST_AMA_NONE;
4390}

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

6643{
6644 return (ast_channel_tech(chan)->send_html) ? 1 : 0;
6645}

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

10800{
10801 struct suppress_data *suppress;
10802 const struct ast_datastore_info *datastore_info = NULL;
10803 struct ast_datastore *datastore = NULL;
10804 struct ast_framehook_interface interface = {
10806 .event_cb = suppress_framehook_event_cb,
10807 .destroy_cb = suppress_framehook_destroy_cb,
10808 .chan_fixup_cb = suppress_framehook_fixup_cb,
10809 };
10810 int framehook_id;
10811
10812 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10813 ast_log(LOG_WARNING, "Attempted to suppress an unsupported frame type (%u).\n", frametype);
10814 return -1;
10815 }
10816
10817 if ((datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10818 suppress = datastore->data;
10819 suppress->direction |= direction;
10820 return 0;
10821 }
10822
10823 if (!(suppress = ao2_alloc(sizeof(*suppress), NULL))) {
10824 ast_log(LOG_WARNING, "Failed to allocate data while attempting to suppress a stream.\n");
10825 return -1;
10826 }
10827
10828 suppress->frametype = frametype;
10829 suppress->direction |= direction;
10830
10831 interface.data = suppress;
10832
10833 framehook_id = ast_framehook_attach(chan, &interface);
10834 if (framehook_id < 0) {
10835 /* Hook attach failed. Get rid of the evidence. */
10836 ast_log(LOG_WARNING, "Failed to attach framehook while attempting to suppress a stream.\n");
10837 ao2_ref(suppress, -1);
10838 return -1;
10839 }
10840
10841 /* One ref for the framehook */
10842 ao2_ref(suppress, +1);
10843
10844 suppress->framehook_id = framehook_id;
10845
10846 if (!(datastore = ast_datastore_alloc(datastore_info, NULL))) {
10847 ast_log(LOG_WARNING, "Failed to allocate datastore while attempting to suppress a stream.\n");
10848 ast_framehook_detach(chan, framehook_id);
10849 ao2_ref(suppress, -1);
10850 return -1;
10851 }
10852
10853 /* the ref provided by the allocation is taken by the datastore */
10854 datastore->data = suppress;
10855
10856 ast_channel_datastore_add(chan, datastore);
10857
10858 return 0;
10859}
static void suppress_framehook_fixup_cb(void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
Definition: channel.c:10747
static const struct ast_datastore_info * suppress_get_datastore_information(enum ast_frame_type frametype)
Definition: channel.c:10789
static void suppress_framehook_destroy_cb(void *data)
Definition: channel.c:10736
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:10754
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:10744
enum ast_frame_type frametype
Definition: channel.c:10742
unsigned int direction
Definition: channel.c:10743

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

1291{
1292 if (chan) {
1294 }
1295}
void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag)
Clear a flag on a channel.
Definition: channel.c:11056

References ast_channel_clear_flag(), and AST_FLAG_DEFER_DTMF.

Referenced by __adsi_transmit_messages().

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

10552{
10553 ao2_unlink(channels, chan);
10554}

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 channel driver.

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

10862{
10863 const struct ast_datastore_info *datastore_info = NULL;
10864 struct ast_datastore *datastore = NULL;
10865 struct suppress_data *suppress;
10866
10867 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10868 ast_log(LOG_WARNING, "Attempted to unsuppress an unsupported frame type (%u).\n", frametype);
10869 return -1;
10870 }
10871
10872 if (!(datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10873 /* Nothing to do! */
10874 return 0;
10875 }
10876
10877 suppress = datastore->data;
10878
10879 suppress->direction &= ~(direction);
10880
10881 if (suppress->direction == 0) {
10882 /* Nothing left to suppress. Bye! */
10883 ast_framehook_detach(chan, suppress->framehook_id);
10884 ast_channel_datastore_remove(chan, datastore);
10885 ast_datastore_free(datastore);
10886 }
10887
10888 return 0;
10889}

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

9116{
9117 unsigned char data[1024]; /* This should be large enough */
9118 size_t datalen;
9119
9120 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9121 if (datalen == (size_t) -1) {
9122 return;
9123 }
9124
9125 ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
9126}

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

10307{
10308 unsigned char data[1024]; /* This should be large enough */
10309 size_t datalen;
10310
10311 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10312 if (datalen == (size_t) -1) {
10313 return;
10314 }
10315
10316 ast_indicate_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10317}

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

10616{
10617 struct ast_channel *yanked_chan;
10618 struct {
10619 char *accountcode;
10620 char *exten;
10621 char *context;
10622 char *name;
10623 int amaflags;
10624 int priority;
10625 struct ast_format *readformat;
10626 struct ast_format *writeformat;
10627 } my_vars = { 0, };
10628
10629 ast_channel_lock(yankee);
10630 my_vars.accountcode = ast_strdupa(ast_channel_accountcode(yankee));
10631 my_vars.exten = ast_strdupa(ast_channel_exten(yankee));
10632 my_vars.context = ast_strdupa(ast_channel_context(yankee));
10633 my_vars.name = ast_strdupa(ast_channel_name(yankee));
10634 my_vars.amaflags = ast_channel_amaflags(yankee);
10635 my_vars.priority = ast_channel_priority(yankee);
10636 /* The priority as returned by ast_channel_yank is where the channel
10637 * should go if the dialplan is executed on it. If the channel is
10638 * already executing dialplan then the priority currently set is
10639 * where it is currently. We increment it so it becomes where it should
10640 * execute.
10641 */
10643 my_vars.priority++;
10644 }
10645 my_vars.writeformat = ao2_bump(ast_channel_writeformat(yankee));
10646 my_vars.readformat = ao2_bump(ast_channel_readformat(yankee));
10647 ast_channel_unlock(yankee);
10648
10649 /* Do not hold any channel locks while calling channel_alloc() since the function
10650 * locks the channel container when linking the new channel in. */
10651 if (!(yanked_chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, my_vars.accountcode,
10652 my_vars.exten, my_vars.context, NULL, yankee, my_vars.amaflags,
10653 "Surrogate/%s", my_vars.name))) {
10654 ao2_cleanup(my_vars.writeformat);
10655 ao2_cleanup(my_vars.readformat);
10656 return NULL;
10657 }
10658
10659 /* Make formats okay */
10660 ast_channel_set_readformat(yanked_chan, my_vars.readformat);
10661 ast_channel_set_writeformat(yanked_chan, my_vars.writeformat);
10662 ao2_cleanup(my_vars.readformat);
10663 ao2_cleanup(my_vars.writeformat);
10664 ast_channel_priority_set(yanked_chan, my_vars.priority);
10665
10666 ast_channel_unlock(yanked_chan);
10667
10668 if (ast_channel_move(yanked_chan, yankee)) {
10669 ast_hangup(yanked_chan);
10670 return NULL;
10671 }
10672
10673 return yanked_chan;
10674}
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:10688
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
Definition: channel.h:1299
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)
@ AST_FLAG_IN_AUTOLOOP
Definition: channel.h:1017
@ AST_STATE_DOWN
Definition: channelstate.h:36
const ast_string_field accountcode
struct ast_format * writeformat
char context[AST_MAX_CONTEXT]
const ast_string_field name
struct ast_format * readformat

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

int ast_channels_init ( void  )

Provided by channel.c

Definition at line 8029 of file channel.c.

8030{
8033 if (!channels) {
8034 return -1;
8035 }
8037
8039
8041
8043
8045
8048
8049 return 0;
8050}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
int ao2_container_register(const char *name, struct ao2_container *self, ao2_prnt_obj_fn *prnt_obj)
Register a container for CLI stats and integrity check.
#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 void channels_shutdown(void)
Definition: channel.c:8015
static int ast_channel_hash_cb(const void *obj, const int flags)
Definition: channel.c:7810
static void prnt_channel_key(void *v_obj, void *where, ao2_prnt_fn *prnt)
Definition: channel.c:7832
int ast_channel_register(const struct ast_channel_tech *tech)
Register a new telephony channel in Asterisk.
Definition: channel.c:539
static const struct ast_channel_tech surrogate_tech
Channel technology used to extract a channel from a running application. The channel created with thi...
Definition: channel.c:696
static struct ast_cli_entry cli_channel[]
Definition: channel.c:390
static int ast_channel_cmp_cb(void *obj, void *arg, int flags)
Definition: channel.c:1447
#define AST_NUM_CHANNEL_BUCKETS
Definition: channel.h:157
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
#define AST_RWLIST_HEAD_INIT(head)
Initializes an rwlist head structure.
Definition: linkedlists.h:639
int ast_stasis_channels_init(void)
Initialize the stasis channel topic and message types.

References ami_vars, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ao2_container_register(), ari_vars, ARRAY_LEN, ast_channel_cmp_cb(), ast_channel_hash_cb(), ast_channel_register(), ast_cli_register_multiple, AST_NUM_CHANNEL_BUCKETS, ast_register_cleanup(), AST_RWLIST_HEAD_INIT, ast_stasis_channels_init(), channels, channels_shutdown(), cli_channel, NULL, prnt_channel_key(), and surrogate_tech.

Referenced by asterisk_daemon().

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

Checks to see if a channel is needing hang up.

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}
@ AST_SOFTHANGUP_TIMEOUT
Definition: channel.h:1158
#define ast_test_suite_event_notify(s, f,...)
Definition: test.h:189

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

8720{
8721 int32_t value;
8722 size_t pos = 0;
8723 int res;
8724
8725 static const struct ast_party_id_ies ies = {
8727 .name.char_set = AST_CONNECTED_LINE_NAME_CHAR_SET,
8728 .name.presentation = AST_CONNECTED_LINE_NAME_PRESENTATION,
8729 .name.valid = AST_CONNECTED_LINE_NAME_VALID,
8730
8731 .number.str = AST_CONNECTED_LINE_NUMBER,
8732 .number.plan = AST_CONNECTED_LINE_NUMBER_PLAN,
8733 .number.presentation = AST_CONNECTED_LINE_NUMBER_PRESENTATION,
8734 .number.valid = AST_CONNECTED_LINE_NUMBER_VALID,
8735
8736 .subaddress.str = AST_CONNECTED_LINE_SUBADDRESS,
8737 .subaddress.type = AST_CONNECTED_LINE_SUBADDRESS_TYPE,
8738 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN,
8739 .subaddress.valid = AST_CONNECTED_LINE_SUBADDRESS_VALID,
8740
8742 .combined_presentation = AST_CONNECTED_LINE_ID_PRESENTATION,
8743 };
8744
8745 static const struct ast_party_id_ies priv_ies = {
8748 .name.presentation = AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION,
8750
8751 .number.str = AST_CONNECTED_LINE_PRIV_NUMBER,
8753 .number.presentation = AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION,
8755
8756 .subaddress.str = AST_CONNECTED_LINE_PRIV_SUBADDRESS,
8757 .subaddress.type = AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE,
8758 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN,
8759 .subaddress.valid = AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID,
8760
8762 .combined_presentation = 0,/* Not sent. */
8763 };
8764
8765 /*
8766 * The size of integer values must be fixed in case the frame is
8767 * shipped to another machine.
8768 */
8769
8770 /* Connected line frame version */
8771 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8772 ast_log(LOG_WARNING, "No space left for connected line frame version\n");
8773 return -1;
8774 }
8775 data[pos++] = AST_CONNECTED_LINE_VERSION;
8776 data[pos++] = 1;
8777 data[pos++] = 2;/* Version 1 did not have a version ie */
8778
8779 res = party_id_build_data(data + pos, datalen - pos, &connected->id,
8780 "connected line", &ies, update ? &update->id : NULL);
8781 if (res < 0) {
8782 return -1;
8783 }
8784 pos += res;
8785
8786 res = party_id_build_data(data + pos, datalen - pos, &connected->priv,
8787 "connected line priv", &priv_ies, update ? &update->priv : NULL);
8788 if (res < 0) {
8789 return -1;
8790 }
8791 pos += res;
8792
8793 /* Connected line source */
8794 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
8795 ast_log(LOG_WARNING, "No space left for connected line source\n");
8796 return -1;
8797 }
8798 data[pos++] = AST_CONNECTED_LINE_SOURCE;
8799 data[pos++] = sizeof(value);
8800 value = htonl(connected->source);
8801 memcpy(data + pos, &value, sizeof(value));
8802 pos += sizeof(value);
8803
8804 return pos;
8805}
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:8599
int int32_t
Definition: db.h:60
struct ast_party_name_ies name
Subscriber name ies.
Definition: channel.c:8570
int str
Subscriber name ie.
Definition: channel.c:8347
int value
Definition: syslog.c:37

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

8316{
8317 ast_party_id_copy(&dest->id, &src->id);
8318 ast_party_id_copy(&dest->ani, &src->ani);
8319 dest->ani2 = src->ani2;
8320}
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:1784
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:435
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:429
struct ast_party_id id
Connected party ID.
Definition: channel.h:460
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:477
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:467

References ast_party_caller::ani, ast_party_connected_line::ani, ast_party_caller::ani2, ast_party_connected_line::ani2, ast_party_id_copy(), ast_party_caller::id, and ast_party_connected_line::id.

Referenced by after_bridge_move_channel(), agent_request_exec(), app_exec(), ast_ari_channels_dial(), ast_do_pickup(), ast_unreal_call_setup(), begin_dial_prerun(), bridge_reconfigured_connected_line_update(), copy_caller_data(), dial_exec_full(), do_forward(), findmeexec(), park_local_transfer(), ring_entry(), update_connected_line_from_peer(), 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 8322 of file channel.c.

8323{
8324 ast_party_id_copy(&dest->id, &src->id);
8325 ast_party_id_copy(&dest->ani, &src->ani);
8326
8327 dest->ani2 = src->ani2;
8328}

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

8808{
8809 size_t pos;
8810 unsigned char ie_len;
8811 unsigned char ie_id;
8812 int32_t value;
8813 int frame_version = 1;
8814 int combined_presentation = 0;
8815 int got_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
8816
8817 for (pos = 0; pos < datalen; pos += ie_len) {
8818 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
8819 ast_log(LOG_WARNING, "Invalid connected line update\n");
8820 return -1;
8821 }
8822 ie_id = data[pos++];
8823 ie_len = data[pos++];
8824 if (datalen < pos + ie_len) {
8825 ast_log(LOG_WARNING, "Invalid connected line update\n");
8826 return -1;
8827 }
8828
8829 switch (ie_id) {
8830/* Connected line party frame version */
8832 if (ie_len != 1) {
8833 ast_log(LOG_WARNING, "Invalid connected line frame version (%u)\n",
8834 (unsigned) ie_len);
8835 break;
8836 }
8837 frame_version = data[pos];
8838 break;
8839/* Connected line party id name */
8841 ast_free(connected->id.name.str);
8842 connected->id.name.str = ast_malloc(ie_len + 1);
8843 if (connected->id.name.str) {
8844 memcpy(connected->id.name.str, data + pos, ie_len);
8845 connected->id.name.str[ie_len] = 0;
8846 }
8847 break;
8849 if (ie_len != 1) {
8850 ast_log(LOG_WARNING, "Invalid connected line name char set (%u)\n",
8851 (unsigned) ie_len);
8852 break;
8853 }
8854 connected->id.name.char_set = data[pos];
8855 break;
8857 if (ie_len != 1) {
8858 ast_log(LOG_WARNING, "Invalid connected line name presentation (%u)\n",
8859 (unsigned) ie_len);
8860 break;
8861 }
8862 connected->id.name.presentation = data[pos];
8863 break;
8865 if (ie_len != 1) {
8866 ast_log(LOG_WARNING, "Invalid connected line name valid (%u)\n",
8867 (unsigned) ie_len);
8868 break;
8869 }
8870 connected->id.name.valid = data[pos];
8871 break;
8872/* Connected line party id number */
8874 ast_free(connected->id.number.str);
8875 connected->id.number.str = ast_malloc(ie_len + 1);
8876 if (connected->id.number.str) {
8877 memcpy(connected->id.number.str, data + pos, ie_len);
8878 connected->id.number.str[ie_len] = 0;
8879 }
8880 break;
8882 if (ie_len != 1) {
8883 ast_log(LOG_WARNING, "Invalid connected line numbering plan (%u)\n",
8884 (unsigned) ie_len);
8885 break;
8886 }
8887 connected->id.number.plan = data[pos];
8888 break;
8890 if (ie_len != 1) {
8891 ast_log(LOG_WARNING, "Invalid connected line number presentation (%u)\n",
8892 (unsigned) ie_len);
8893 break;
8894 }
8895 connected->id.number.presentation = data[pos];
8896 break;
8898 if (ie_len != 1) {
8899 ast_log(LOG_WARNING, "Invalid connected line number valid (%u)\n",
8900 (unsigned) ie_len);
8901 break;
8902 }
8903 connected->id.number.valid = data[pos];
8904 break;
8905/* Connected line party id subaddress */
8907 ast_free(connected->id.subaddress.str);
8908 connected->id.subaddress.str = ast_malloc(ie_len + 1);
8909 if (connected->id.subaddress.str) {
8910 memcpy(connected->id.subaddress.str, data + pos, ie_len);
8911 connected->id.subaddress.str[ie_len] = 0;
8912 }
8913 break;
8915 if (ie_len != 1) {
8916 ast_log(LOG_WARNING, "Invalid connected line type of subaddress (%u)\n",
8917 (unsigned) ie_len);
8918 break;
8919 }
8920 connected->id.subaddress.type = data[pos];
8921 break;
8923 if (ie_len != 1) {
8925 "Invalid connected line subaddress odd-even indicator (%u)\n",
8926 (unsigned) ie_len);
8927 break;
8928 }
8929 connected->id.subaddress.odd_even_indicator = data[pos];
8930 break;
8932 if (ie_len != 1) {
8933 ast_log(LOG_WARNING, "Invalid connected line subaddress valid (%u)\n",
8934 (unsigned) ie_len);
8935 break;
8936 }
8937 connected->id.subaddress.valid = data[pos];
8938 break;
8939/* Connected line party tag */
8941 ast_free(connected->id.tag);
8942 connected->id.tag = ast_malloc(ie_len + 1);
8943 if (connected->id.tag) {
8944 memcpy(connected->id.tag, data + pos, ie_len);
8945 connected->id.tag[ie_len] = 0;
8946 }
8947 break;
8948/* Connected line party id combined presentation */
8950 if (ie_len != 1) {
8951 ast_log(LOG_WARNING, "Invalid connected line combined presentation (%u)\n",
8952 (unsigned) ie_len);
8953 break;
8954 }
8955 combined_presentation = data[pos];
8956 got_combined_presentation = 1;
8957 break;
8958/* Private connected line party id name */
8960 ast_free(connected->priv.name.str);
8961 connected->priv.name.str = ast_malloc(ie_len + 1);
8962 if (connected->priv.name.str) {
8963 memcpy(connected->priv.name.str, data + pos, ie_len);
8964 connected->priv.name.str[ie_len] = 0;
8965 }
8966 break;
8968 if (ie_len != 1) {
8969 ast_log(LOG_WARNING, "Invalid connected line private name char set (%u)\n",
8970 (unsigned) ie_len);
8971 break;
8972 }
8973 connected->priv.name.char_set = data[pos];
8974 break;
8976 if (ie_len != 1) {
8977 ast_log(LOG_WARNING, "Invalid connected line private name presentation (%u)\n",
8978 (unsigned) ie_len);
8979 break;
8980 }
8981 connected->priv.name.presentation = data[pos];
8982 break;
8984 if (ie_len != 1) {
8985 ast_log(LOG_WARNING, "Invalid connected line private name valid (%u)\n",
8986 (unsigned) ie_len);
8987 break;
8988 }
8989 connected->priv.name.valid = data[pos];
8990 break;
8991/* Private connected line party id number */
8993 ast_free(connected->priv.number.str);
8994 connected->priv.number.str = ast_malloc(ie_len + 1);
8995 if (connected->priv.number.str) {
8996 memcpy(connected->priv.number.str, data + pos, ie_len);
8997 connected->priv.number.str[ie_len] = 0;
8998 }
8999 break;
9001 if (ie_len != 1) {
9002 ast_log(LOG_WARNING, "Invalid connected line private numbering plan (%u)\n",
9003 (unsigned) ie_len);
9004 break;
9005 }
9006 connected->priv.number.plan = data[pos];
9007 break;
9009 if (ie_len != 1) {
9010 ast_log(LOG_WARNING, "Invalid connected line private number presentation (%u)\n",
9011 (unsigned) ie_len);
9012 break;
9013 }
9014 connected->priv.number.presentation = data[pos];
9015 break;
9017 if (ie_len != 1) {
9018 ast_log(LOG_WARNING, "Invalid connected line private number valid (%u)\n",
9019 (unsigned) ie_len);
9020 break;
9021 }
9022 connected->priv.number.valid = data[pos];
9023 break;
9024/* Private connected line party id subaddress */
9026 ast_free(connected->priv.subaddress.str);
9027 connected->priv.subaddress.str = ast_malloc(ie_len + 1);
9028 if (connected->priv.subaddress.str) {
9029 memcpy(connected->priv.subaddress.str, data + pos, ie_len);
9030 connected->priv.subaddress.str[ie_len] = 0;
9031 }
9032 break;
9034 if (ie_len != 1) {
9035 ast_log(LOG_WARNING, "Invalid connected line private type of subaddress (%u)\n",
9036 (unsigned) ie_len);
9037 break;
9038 }
9039 connected->priv.subaddress.type = data[pos];
9040 break;
9042 if (ie_len != 1) {
9044 "Invalid connected line private subaddress odd-even indicator (%u)\n",
9045 (unsigned) ie_len);
9046 break;
9047 }
9048 connected->priv.subaddress.odd_even_indicator = data[pos];
9049 break;
9051 if (ie_len != 1) {
9052 ast_log(LOG_WARNING, "Invalid connected line private subaddress valid (%u)\n",
9053 (unsigned) ie_len);
9054 break;
9055 }
9056 connected->priv.subaddress.valid = data[pos];
9057 break;
9058/* Private connected line party tag */
9060 ast_free(connected->priv.tag);
9061 connected->priv.tag = ast_malloc(ie_len + 1);
9062 if (connected->priv.tag) {
9063 memcpy(connected->priv.tag, data + pos, ie_len);
9064 connected->priv.tag[ie_len] = 0;
9065 }
9066 break;
9067/* Connected line party source */
9069 if (ie_len != sizeof(value)) {
9070 ast_log(LOG_WARNING, "Invalid connected line source (%u)\n",
9071 (unsigned) ie_len);
9072 break;
9073 }
9074 memcpy(&value, data + pos, sizeof(value));
9075 connected->source = ntohl(value);
9076 break;
9077/* Connected line party unknown element */
9078 default:
9079 ast_debug(1, "Unknown connected line element: %u (%u)\n",
9080 (unsigned) ie_id, (unsigned) ie_len);
9081 break;
9082 }
9083 }
9084
9085 switch (frame_version) {
9086 case 1:
9087 /*
9088 * The other end is an earlier version that we need to adjust
9089 * for compatibility.
9090 */
9091 connected->id.name.valid = 1;
9092 connected->id.name.char_set = AST_PARTY_CHAR_SET_ISO8859_1;
9093 connected->id.number.valid = 1;
9094 if (got_combined_presentation) {
9095 connected->id.name.presentation = combined_presentation;
9096 connected->id.number.presentation = combined_presentation;
9097 }
9098 break;
9099 case 2:
9100 /* The other end is at the same level as we are. */
9101 break;
9102 default:
9103 /*
9104 * The other end is newer than we are.
9105 * We need to assume that they are compatible with us.
9106 */
9107 ast_debug(1, "Connected line frame has newer version: %u\n",
9108 (unsigned) frame_version);
9109 break;
9110 }
9111
9112 return 0;
9113}
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
@ AST_PARTY_CHAR_SET_ISO8859_1
Definition: channel.h:246

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

2913{
2914 ast_channel_lock(chan);
2917 /* if in the middle of dtmf emulation keep 50 tick per sec timer on rolling */
2919 }
2920 ast_channel_unlock(chan);
2921}
static void deactivate_generator_nolock(struct ast_channel *chan)
Definition: channel.c:2896

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

static void ast_dummy_channel_destructor ( void *  obj)
static

Free a dummy channel structure.

Definition at line 2352 of file channel.c.

2353{
2354 struct ast_channel *chan = obj;
2355 struct ast_datastore *datastore;
2356 struct ast_var_t *vardata;
2357 struct varshead *headp;
2358
2360
2361 /* Get rid of each of the data stores on the channel */
2362 while ((datastore = AST_LIST_REMOVE_HEAD(ast_channel_datastores(chan), entry))) {
2363 /* Free the data store */
2364 ast_datastore_free(datastore);
2365 }
2366
2372
2373 /* loop over the variables list, freeing all data and deleting list items */
2374 /* no need to lock the list, as the channel is already locked */
2375 headp = ast_channel_varshead(chan);
2376 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
2377 ast_var_delete(vardata);
2378
2379 if (ast_channel_cdr(chan)) {
2382 }
2383
2385}

References ast_cdr_free(), ast_channel_caller(), ast_channel_cdr(), ast_channel_cdr_set(), ast_channel_connected(), ast_channel_connected_indicated(), ast_channel_datastores(), ast_channel_dialed(), ast_channel_internal_cleanup(), ast_channel_redirecting(), ast_channel_varshead(), ast_datastore_free(), AST_LIST_REMOVE_HEAD, ast_party_caller_free(), ast_party_connected_line_free(), ast_party_dialed_free(), ast_party_redirecting_free(), ast_pbx_hangup_handler_destroy(), ast_var_delete(), and NULL.

Referenced by __ast_dummy_channel_alloc().

◆ ast_get_channel_tech()

const struct ast_channel_tech * ast_get_channel_tech ( const char *  name)

Get handle to channel driver based on name.

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}

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

7641{
7642 char *piece;
7643 char *c;
7644 int start=0, finish=0, x;
7645 ast_group_t group = 0;
7646
7647 if (ast_strlen_zero(s))
7648 return 0;
7649
7650 c = ast_strdupa(s);
7651
7652 while ((piece = strsep(&c, ","))) {
7653 if (sscanf(piece, "%30d-%30d", &start, &finish) == 2) {
7654 /* Range */
7655 } else if (sscanf(piece, "%30d", &start)) {
7656 /* Just one */
7657 finish = start;
7658 } else {
7659 ast_log(LOG_ERROR, "Syntax error parsing group configuration '%s' at '%s'. Ignoring.\n", s, piece);
7660 continue;
7661 }
7662 for (x = start; x <= finish; x++) {
7663 if ((x > 63) || (x < 0)) {
7664 ast_log(LOG_WARNING, "Ignoring invalid group %d (maximum group is 63)\n", x);
7665 } else
7666 group |= ((ast_group_t) 1 << x);
7667 }
7668 }
7669 return group;
7670}
unsigned long long ast_group_t
Definition: channel.h:215
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 7697 of file channel.c.

7698{
7699 struct ao2_container *namedgroups;
7700 char *piece;
7701 char *c;
7702
7703 if (!s) {
7704 return NULL;
7705 }
7706
7707 /*! \brief Remove leading and trailing whitespace */
7709 if (ast_strlen_zero(c)) {
7710 return NULL;
7711 }
7712
7715 if (!namedgroups) {
7716 return NULL;
7717 }
7718
7719 while ((piece = strsep(&c, ","))) {
7720 struct namedgroup_member *member;
7721 size_t len;
7722
7723 /* remove leading/trailing whitespace */
7724 piece = ast_strip(piece);
7725
7726 len = strlen(piece);
7727 if (!len) {
7728 continue;
7729 }
7730
7732 if (!member) {
7733 ao2_ref(namedgroups, -1);
7734 return NULL;
7735 }
7736 strcpy(member->name, piece);/* Safe */
7737 member->hash = ast_str_hash(member->name);
7738
7739 /* every group name may exist only once, delete duplicates */
7740 ao2_find(namedgroups, member, OBJ_POINTER | OBJ_UNLINK | OBJ_NODATA);
7741 ao2_link(namedgroups, member);
7742 ao2_ref(member, -1);
7743 }
7744
7745 if (!ao2_container_count(namedgroups)) {
7746 /* There were no group names specified. */
7747 ao2_ref(namedgroups, -1);
7748 namedgroups = NULL;
7749 }
7750
7751 return (struct ast_namedgroups *) namedgroups;
7752}
#define OBJ_POINTER
Definition: astobj2.h:1150
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:404
@ OBJ_NODATA
Definition: astobj2.h:1044
@ OBJ_UNLINK
Definition: astobj2.h:1039
static int namedgroup_cmp_cb(void *obj, void *arg, int flags)
Comparison function used for named group container.
Definition: channel.c:7681
static int namedgroup_hash_cb(const void *obj, const int flags)
Hashing function used for named group container.
Definition: channel.c:7690
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:7673

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)

Hangup a channel.

Hang up a channel.

Definition at line 2560 of file channel.c.

2561{
2562 /* Be NULL safe for RAII_VAR() usage. */
2563 if (!chan) {
2564 return;
2565 }
2566
2567 ast_debug(1, "Channel %p '%s' hanging up. Refs: %d\n", chan, ast_channel_name(chan),
2568 ao2_ref(chan, 0));
2569
2571
2572 ast_channel_lock(chan);
2573
2574 while (ast_channel_masq(chan) || ast_channel_masqr(chan)) {
2576 }
2577
2578 /* Mark as a zombie so a masquerade cannot be setup on this channel. */
2580
2581 ast_channel_unlock(chan);
2582
2583 /*
2584 * XXX if running the hangup handlers here causes problems
2585 * because the handlers take too long to execute, we could move
2586 * the meat of this function into another thread. A thread
2587 * where channels go to die.
2588 *
2589 * If this is done, ast_autoservice_chan_hangup_peer() will no
2590 * longer be needed.
2591 */
2593 ao2_unlink(channels, chan);
2594 ast_channel_lock(chan);
2595
2596 destroy_hooks(chan);
2597
2598 free_translation(chan);
2599 /* Close audio stream */
2600 if (ast_channel_stream(chan)) {
2603 }
2604 /* Close video stream */
2605 if (ast_channel_vstream(chan)) {
2608 }
2609 if (ast_channel_sched(chan)) {
2612 }
2613
2614 if (ast_channel_generatordata(chan)) { /* Clear any tone stuff remaining */
2615 if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
2617 }
2618 }
2621
2623 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",
2625 ast_channel_blockproc(chan));
2626 ast_assert(0);
2627 }
2628
2629 if (ast_channel_tech(chan)->hangup) {
2630 ast_channel_tech(chan)->hangup(chan);
2631 }
2632
2633 ast_channel_unlock(chan);
2634
2635 ast_cc_offer(chan);
2636
2637 ast_channel_unref(chan);
2638}
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:2519
static void destroy_hooks(struct ast_channel *chan)
Definition: channel.c:2549
static void free_translation(struct ast_channel *clonechan)
Definition: channel.c:2506
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_filestream * ast_channel_stream(const struct ast_channel *chan)
struct ast_channel * ast_channel_masqr(const struct ast_channel *chan)
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.
int(*const hangup)(struct ast_channel *chan)
Hangup (and possibly destroy) the channel.
Definition: channel.h:724
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 4296 of file channel.c.

4297{
4298 return ast_indicate_data(chan, condition, NULL, 0);
4299}

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

4673{
4674 int res;
4675 /* this frame is used by framehooks. if it is set, we must free it at the end of this function */
4676 struct ast_frame *awesome_frame = NULL;
4677
4678 ast_channel_lock(chan);
4679
4680 /* Don't bother if the channel is about to go away, anyway. */
4683 && _condition != AST_CONTROL_MASQUERADE_NOTIFY) {
4684 res = -1;
4685 goto indicate_cleanup;
4686 }
4687
4689 /* Do framehooks now, do it, go, go now */
4690 struct ast_frame frame = {
4692 .subclass.integer = _condition,
4693 .data.ptr = (void *) data, /* this cast from const is only okay because we do the ast_frdup below */
4694 .datalen = datalen
4695 };
4696
4697 /* we have now committed to freeing this frame */
4698 awesome_frame = ast_frdup(&frame);
4699
4700 /* who knows what we will get back! the anticipation is killing me. */
4702 awesome_frame);
4703 if (!awesome_frame
4704 || awesome_frame->frametype != AST_FRAME_CONTROL) {
4705 res = 0;
4706 goto indicate_cleanup;
4707 }
4708
4709 _condition = awesome_frame->subclass.integer;
4710 data = awesome_frame->data.ptr;
4711 datalen = awesome_frame->datalen;
4712 }
4713
4714 res = indicate_data_internal(chan, _condition, data, datalen);
4715
4716indicate_cleanup:
4717 ast_channel_unlock(chan);
4718 if (awesome_frame) {
4719 ast_frfree(awesome_frame);
4720 }
4721
4722 return res;
4723}
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:10572
static int indicate_data_internal(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Definition: channel.c:4489
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
@ 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_install_music_functions()

void ast_install_music_functions ( int(*)(struct ast_channel *, const char *, const char *)  start_ptr,
void(*)(struct ast_channel *)  stop_ptr,
void(*)(struct ast_channel *)  cleanup_ptr 
)

Definition at line 7772 of file channel.c.

7775{
7776 ast_moh_start_ptr = start_ptr;
7777 ast_moh_stop_ptr = stop_ptr;
7778 ast_moh_cleanup_ptr = cleanup_ptr;
7779}
static void(* ast_moh_cleanup_ptr)(struct ast_channel *)
Definition: channel.c:7770
static void(* ast_moh_stop_ptr)(struct ast_channel *)
Definition: channel.c:7769
static int(* ast_moh_start_ptr)(struct ast_channel *, const char *, const char *)
Definition: channel.c:7768

References ast_moh_cleanup_ptr, ast_moh_start_ptr, and ast_moh_stop_ptr.

Referenced by load_module(), and reload().

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

1487{
1488 /* Do not add a default entry in this switch statement. Each new
1489 * frame type should be addressed directly as to whether it should
1490 * be queued up or not.
1491 */
1492 switch (frame->frametype) {
1495 case AST_FRAME_CONTROL:
1496 case AST_FRAME_TEXT:
1498 case AST_FRAME_IMAGE:
1499 case AST_FRAME_HTML:
1500 return 1;
1501
1502 case AST_FRAME_DTMF_END:
1504 case AST_FRAME_VOICE:
1505 case AST_FRAME_VIDEO:
1506 case AST_FRAME_NULL:
1507 case AST_FRAME_IAX:
1508 case AST_FRAME_CNG:
1509 case AST_FRAME_MODEM:
1510 case AST_FRAME_RTCP:
1511 return 0;
1512 }
1513 return 0;
1514}

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

void ast_moh_cleanup ( struct ast_channel chan)

Definition at line 7804 of file channel.c.

7805{
7807 ast_moh_cleanup_ptr(chan);
7808}

References ast_moh_cleanup_ptr.

Referenced by ast_channel_destructor().

◆ ast_moh_start()

int ast_moh_start ( struct ast_channel chan,
const char *  mclass,
const char *  interpclass 
)

Turn on music on hold on a given channel.

Parameters
chanThe channel structure that will get music on hold
mclassThe class to use if the musicclass is not currently set on the channel structure. NULL and the empty string are equivalent.
interpclassThe class to use if the musicclass is not currently set on the channel structure or in the mclass argument. NULL and the empty string are equivalent.
Return values
Zeroon success
non-zeroon failure

Definition at line 7788 of file channel.c.

7789{
7791 return ast_moh_start_ptr(chan, mclass, interpclass);
7792
7793 ast_verb(3, "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : (interpclass ? interpclass : "default"));
7794
7795 return -1;
7796}

References ast_moh_start_ptr, and ast_verb.

Referenced by app_control_moh_start(), app_exec(), ast_ari_bridges_start_moh(), ast_bridge_channel_playfile(), ast_unreal_indicate(), chan_pjsip_indicate(), channel_do_masquerade(), conf_moh_start(), conf_moh_unsuspend(), conf_start_moh(), console_indicate(), dahdi_indicate(), dial_exec_full(), handle_setmusic(), iax2_indicate(), jingle_indicate(), limits_interval_playback(), moh_handle_digit(), monitor_dial(), ooh323_indicate(), participant_entertainment_start(), play_moh_exec(), queue_exec(), retrydial_exec(), rna(), say_periodic_announcement(), say_position(), start_moh_exec(), and unistim_indicate().

◆ ast_moh_stop()

void ast_moh_stop ( struct ast_channel chan)

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

8113{
8114 void *match;
8115 struct ao2_container *group_a = (struct ao2_container *) a;
8116 struct ao2_container *group_b = (struct ao2_container *) b;
8117
8118 if (!a || !b) {
8119 return 0;
8120 }
8121
8122 /*
8123 * Do groups a and b intersect? Since a and b are hash tables,
8124 * the average time complexity is:
8125 * O(a.count <= b.count ? a.count : b.count)
8126 */
8127 if (ao2_container_count(group_b) < ao2_container_count(group_a)) {
8128 /* Traverse over the smaller group. */
8129 SWAP(group_a, group_b);
8130 }
8131 match = ao2_callback(group_a, 0, namedgroup_match, group_b);
8133
8134 return match != NULL;
8135}
#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 match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
Definition: chan_iax2.c:2362
static int namedgroup_match(void *obj, void *arg, int flags)
Definition: channel.c:8102
static struct test_val b
static struct test_val a
#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 2005 of file channel.c.

2006{
2007 if (dest == src) {
2008 /* Don't copy to self */
2009 return;
2010 }
2011
2012 ast_party_id_copy(&dest->id, &src->id);
2013 ast_party_id_copy(&dest->ani, &src->ani);
2014 ast_party_id_copy(&dest->priv, &src->priv);
2015 dest->ani2 = src->ani2;
2016}
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:432

References ast_party_caller::ani, ast_party_caller::ani2, ast_party_id_copy(), ast_party_caller::id, and ast_party_caller::priv.

Referenced by recalling_enter().

◆ ast_party_caller_free()

void ast_party_caller_free ( struct ast_party_caller doomed)

Destroy the caller party contents.

Since
1.8
Parameters
doomedThe caller party to destroy.

Definition at line 2034 of file channel.c.

2035{
2036 ast_party_id_free(&doomed->id);
2037 ast_party_id_free(&doomed->ani);
2038 ast_party_id_free(&doomed->priv);
2039}
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1830

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

1998{
1999 ast_party_id_init(&init->id);
2000 ast_party_id_init(&init->ani);
2001 ast_party_id_init(&init->priv);
2002 init->ani2 = 0;
2003}
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1776

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

2027{
2028 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2029 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2030 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2031 dest->ani2 = src->ani2;
2032}
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:1807

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

2019{
2020 ast_party_id_set_init(&init->id, &guide->id);
2021 ast_party_id_set_init(&init->ani, &guide->ani);
2022 ast_party_id_set_init(&init->priv, &guide->priv);
2023 init->ani2 = guide->ani2;
2024}
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:1799

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

2083{
2084 connected->id = caller->id;
2085 connected->ani = caller->ani;
2086 connected->priv = caller->priv;
2087 connected->ani2 = caller->ani2;
2089}
@ AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN
Definition: callerid.h:552

References ast_party_caller::ani, ast_party_caller::ani2, AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN, connected, ast_party_caller::id, and ast_party_caller::priv.

◆ ast_party_connected_line_copy()

void ast_party_connected_line_copy ( struct ast_party_connected_line dest,
const struct ast_party_connected_line src 
)

Copy the source connected line information to the destination connected line.

Since
1.8
Parameters
destDestination connected line
srcSource connected line

Definition at line 2050 of file channel.c.

2051{
2052 if (dest == src) {
2053 /* Don't copy to self */
2054 return;
2055 }
2056
2057 ast_party_id_copy(&dest->id, &src->id);
2058 ast_party_id_copy(&dest->ani, &src->ani);
2059 ast_party_id_copy(&dest->priv, &src->priv);
2060 dest->ani2 = src->ani2;
2061 dest->source = src->source;
2062}
int source
Information about the source of an update.
Definition: channel.h:484
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:470

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

2074{
2075 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2076 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2077 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2078 dest->ani2 = src->ani2;
2079 dest->source = src->source;
2080}

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

2065{
2066 ast_party_id_set_init(&init->id, &guide->id);
2067 ast_party_id_set_init(&init->ani, &guide->ani);
2068 ast_party_id_set_init(&init->priv, &guide->priv);
2069 init->ani2 = guide->ani2;
2070 init->source = guide->source;
2071}

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

1956{
1957 if (dest == src) {
1958 /* Don't copy to self */
1959 return;
1960 }
1961
1962 ast_free(dest->number.str);
1963 dest->number.str = ast_strdup(src->number.str);
1964 dest->number.plan = src->number.plan;
1967}
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:1724
struct ast_party_dialed::@208 number
Dialed/Called number.
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition: channel.h:393
char * str
Subscriber phone number (Malloced)
Definition: channel.h:388
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:390
int transit_network_select
Transit Network Select.
Definition: channel.h:399

References ast_free, ast_party_subaddress_copy(), ast_strdup, ast_party_dialed::number, ast_party_dialed::plan, ast_party_dialed::str, ast_party_dialed::subaddress, and ast_party_dialed::transit_network_select.

Referenced by ast_unreal_call_setup().

◆ ast_party_dialed_free()

void ast_party_dialed_free ( struct ast_party_dialed doomed)

Destroy the dialed party contents.

Since
1.8
Parameters
doomedThe dialed party to destroy.

Definition at line 1990 of file channel.c.

1991{
1992 ast_free(doomed->number.str);
1993 doomed->number.str = NULL;
1995}
void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
Destroy the party subaddress contents.
Definition: channel.c:1763

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

1948{
1949 init->number.str = NULL;
1950 init->number.plan = 0;/* Unknown */
1952 init->transit_network_select = 0;
1953}
void ast_party_subaddress_init(struct ast_party_subaddress *init)
Initialize the given subaddress structure.
Definition: channel.c:1716

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

1978{
1979 if (src->number.str && src->number.str != dest->number.str) {
1980 ast_free(dest->number.str);
1981 dest->number.str = ast_strdup(src->number.str);
1982 }
1983 dest->number.plan = src->number.plan;
1984
1986
1988}
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:1746

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

1970{
1971 init->number.str = NULL;
1972 init->number.plan = guide->number.plan;
1975}
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:1738

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

1785{
1786 if (dest == src) {
1787 /* Don't copy to self */
1788 return;
1789 }
1790
1791 ast_party_name_copy(&dest->name, &src->name);
1792 ast_party_number_copy(&dest->number, &src->number);
1794
1795 ast_free(dest->tag);
1796 dest->tag = ast_strdup(src->tag);
1797}
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:1671
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:1618
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:346
char * tag
User-set "tag".
Definition: channel.h:356

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

1831{
1832 ast_party_name_free(&doomed->name);
1833 ast_party_number_free(&doomed->number);
1835
1836 ast_free(doomed->tag);
1837 doomed->tag = NULL;
1838}
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
Definition: channel.c:1657
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
Definition: channel.c:1710

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

1777{
1778 ast_party_name_init(&init->name);
1781 init->tag = NULL;
1782}
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
Definition: channel.c:1610
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
Definition: channel.c:1663

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

1909{
1910 id->name.valid = 0;
1911 id->number.valid = 0;
1912 id->subaddress.valid = 0;
1913}

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

1922{
1923 struct ast_party_id merged;
1924
1925 merged = *base;
1926 if (overlay->name.valid) {
1927 merged.name = overlay->name;
1928 }
1929 if (overlay->number.valid) {
1930 merged.number = overlay->number;
1931 }
1932 if (overlay->subaddress.valid) {
1933 merged.subaddress = overlay->subaddress;
1934 }
1935 /* Note the actual structure is returned and not a pointer to it! */
1936 return merged;
1937}
Information needed to identify an endpoint in a call.
Definition: channel.h:340
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:330

References ast_party_id::name, ast_party_id::number, and ast_party_id::subaddress.

Referenced by ast_channel_connected_effective_id(), ast_channel_redirecting_effective_from(), ast_channel_redirecting_effective_orig(), ast_channel_redirecting_effective_to(), and ast_party_id_merge_copy().

◆ ast_party_id_merge_copy()

void ast_party_id_merge_copy ( struct ast_party_id dest,
struct ast_party_id base,
struct ast_party_id overlay 
)

Copy a merge of a given party id into another given party id to a given destination party id.

Since
11.0

Each party id component of the party id 'base' is overwritten by components of the party id 'overlay' if the 'overlay' component is marked as valid. However the component 'tag' of the 'base' party id remains untouched. The result is copied into the given party id 'dest'.

Note
The resulting merged party id is a real copy and has to be freed.
Parameters
destThe resulting merged party id.
baseThe party id which is merged.
overlayThe party id which is used to merge into.

Definition at line 1939 of file channel.c.

1940{
1941 struct ast_party_id merged;
1942
1943 merged = ast_party_id_merge(base, overlay);
1944 ast_party_id_copy(dest, &merged);
1945}
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:1921

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

1841{
1842 int number_priority;
1843 int number_value;
1844 int number_screening;
1845 int name_priority;
1846 int name_value;
1847
1848 /* Determine name presentation priority. */
1849 if (!id->name.valid) {
1850 name_value = AST_PRES_UNAVAILABLE;
1851 name_priority = 3;
1852 } else {
1853 name_value = id->name.presentation & AST_PRES_RESTRICTION;
1854 switch (name_value) {
1856 name_priority = 0;
1857 break;
1858 case AST_PRES_ALLOWED:
1859 name_priority = 1;
1860 break;
1862 name_priority = 2;
1863 break;
1864 default:
1865 name_value = AST_PRES_UNAVAILABLE;
1866 name_priority = 3;
1867 break;
1868 }
1869 }
1870
1871 /* Determine number presentation priority. */
1872 if (!id->number.valid) {
1873 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1874 number_value = AST_PRES_UNAVAILABLE;
1875 number_priority = 3;
1876 } else {
1877 number_screening = id->number.presentation & AST_PRES_NUMBER_TYPE;
1878 number_value = id->number.presentation & AST_PRES_RESTRICTION;
1879 switch (number_value) {
1881 number_priority = 0;
1882 break;
1883 case AST_PRES_ALLOWED:
1884 number_priority = 1;
1885 break;
1887 number_priority = 2;
1888 break;
1889 default:
1890 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1891 number_value = AST_PRES_UNAVAILABLE;
1892 number_priority = 3;
1893 break;
1894 }
1895 }
1896
1897 /* Select the wining presentation value. */
1898 if (name_priority < number_priority) {
1899 number_value = name_value;
1900 }
1901 if (number_value == AST_PRES_UNAVAILABLE) {
1903 }
1904
1905 return number_value | number_screening;
1906}
enum queue_result id
Definition: app_queue.c:1667
#define AST_PRES_USER_NUMBER_UNSCREENED
Definition: callerid.h:426
#define AST_PRES_UNAVAILABLE
Definition: callerid.h:434
#define AST_PRES_RESTRICTED
Definition: callerid.h:433
#define AST_PRES_ALLOWED
Definition: callerid.h:432
#define AST_PRES_NUMBER_NOT_AVAILABLE
Definition: callerid.h:461
#define AST_PRES_NUMBER_TYPE
Definition: callerid.h:425
#define AST_PRES_RESTRICTION
Definition: callerid.h:431

References AST_PRES_ALLOWED, AST_PRES_NUMBER_NOT_AVAILABLE, AST_PRES_NUMBER_TYPE, AST_PRES_RESTRICTED, AST_PRES_RESTRICTION, AST_PRES_UNAVAILABLE, AST_PRES_USER_NUMBER_UNSCREENED, and id.

Referenced by add_privacy_header(), add_privacy_params(), ast_json_party_id(), ast_sip_can_present_connected_id(), ast_str_retrieve_variable(), ast_var_channels_table(), channel_snapshot_caller_create(), iax2_call(), is_colp_update_allowed(), my_send_callerid(), party_id_build_data(), party_id_read(), queue_exec(), redirecting_read(), set_from_header(), setup_env(), and socket_process_helper().

◆ ast_party_id_reset()

void ast_party_id_reset ( struct ast_party_id id)

Destroy and initialize the given party id structure.

Since
11.0
Parameters
idThe party id to reset.

Definition at line 1915 of file channel.c.

1916{
1919}

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

1808{
1809 if (dest == src) {
1810 /* Don't set to self */
1811 return;
1812 }
1813
1814 if (!update || update->name) {
1815 ast_party_name_set(&dest->name, &src->name);
1816 }
1817 if (!update || update->number) {
1818 ast_party_number_set(&dest->number, &src->number);
1819 }
1820 if (!update || update->subaddress) {
1822 }
1823
1824 if (src->tag && src->tag != dest->tag) {
1825 ast_free(dest->tag);
1826 dest->tag = ast_strdup(src->tag);
1827 }
1828}
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:1693
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:1640

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

1800{
1801 ast_party_name_set_init(&init->name, &guide->name);
1802 ast_party_number_set_init(&init->number, &guide->number);
1804 init->tag = NULL;
1805}
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:1632
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:1685

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

1619{
1620 if (dest == src) {
1621 /* Don't copy to self */
1622 return;
1623 }
1624
1625 ast_free(dest->str);
1626 dest->str = ast_strdup(src->str);
1627 dest->char_set = src->char_set;
1628 dest->presentation = src->presentation;
1629 dest->valid = src->valid;
1630}
int char_set
Character set the name is using.
Definition: channel.h:274
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:279

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

1658{
1659 ast_free(doomed->str);
1660 doomed->str = NULL;
1661}

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

1611{
1612 init->str = NULL;
1615 init->valid = 0;
1616}

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

1641{
1642 if (dest == src) {
1643 /* Don't set to self */
1644 return;
1645 }
1646
1647 if (src->str && src->str != dest->str) {
1648 ast_free(dest->str);
1649 dest->str = ast_strdup(src->str);
1650 }
1651
1652 dest->char_set = src->char_set;
1653 dest->presentation = src->presentation;
1654 dest->valid = src->valid;
1655}

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

1633{
1634 init->str = NULL;
1635 init->char_set = guide->char_set;
1636 init->presentation = guide->presentation;
1637 init->valid = guide->valid;
1638}

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

1672{
1673 if (dest == src) {
1674 /* Don't copy to self */
1675 return;
1676 }
1677
1678 ast_free(dest->str);
1679 dest->str = ast_strdup(src->str);
1680 dest->plan = src->plan;
1681 dest->presentation = src->presentation;
1682 dest->valid = src->valid;
1683}
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:297
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:295

References ast_free, ast_strdup, ast_party_number::plan, ast_party_number::presentation, ast_party_number::str, and ast_party_number::valid.

Referenced by ast_party_id_copy().

◆ ast_party_number_free()

void ast_party_number_free ( struct ast_party_number doomed)

Destroy the party number contents.

Since
1.8
Parameters
doomedThe party number to destroy.

Definition at line 1710 of file channel.c.

1711{
1712 ast_free(doomed->str);
1713 doomed->str = NULL;
1714}

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

1664{
1665 init->str = NULL;
1666 init->plan = 0;/* Unknown */
1668 init->valid = 0;
1669}

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

1694{
1695 if (dest == src) {
1696 /* Don't set to self */
1697 return;
1698 }
1699
1700 if (src->str && src->str != dest->str) {
1701 ast_free(dest->str);
1702 dest->str = ast_strdup(src->str);
1703 }
1704
1705 dest->plan = src->plan;
1706 dest->presentation = src->presentation;
1707 dest->valid = src->valid;
1708}

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

1686{
1687 init->str = NULL;
1688 init->plan = guide->plan;
1689 init->presentation = guide->presentation;
1690 init->valid = guide->valid;
1691}

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

2155{
2156 if (dest == src) {
2157 /* Don't copy to self */
2158 return;
2159 }
2160
2161 ast_party_id_copy(&dest->orig, &src->orig);
2162 ast_party_id_copy(&dest->from, &src->from);
2163 ast_party_id_copy(&dest->to, &src->to);
2164 ast_party_id_copy(&dest->priv_orig, &src->priv_orig);
2165 ast_party_id_copy(&dest->priv_from, &src->priv_from);
2166 ast_party_id_copy(&dest->priv_to, &src->priv_to);
2169 dest->count = src->count;
2170}
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:2104
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation.
Definition: channel.h:541
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:547
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:544
struct ast_party_id priv_from
Who is redirecting the call (Sent to the party the call is redirected toward) - private representatio...
Definition: channel.h:538
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:529
int count
Number of times the call was redirected.
Definition: channel.h:550
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:532
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward)
Definition: channel.h:526
struct ast_party_id priv_orig
Who originally redirected the call (Sent to the party the call is redirected toward) - private repres...
Definition: channel.h:535

References ast_party_id_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 2141 of file channel.c.

2142{
2143 ast_party_id_init(&init->orig);
2144 ast_party_id_init(&init->from);
2145 ast_party_id_init(&init->to);
2148 ast_party_id_init(&init->priv_to);
2151 init->count = 0;
2152}
void ast_party_redirecting_reason_init(struct ast_party_redirecting_reason *init)
Initialize the given redirecting reason structure.
Definition: channel.c:2098

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

2105{
2106 if (dest == src) {
2107 return;
2108 }
2109
2110 ast_free(dest->str);
2111 dest->str = ast_strdup(src->str);
2112 dest->code = src->code;
2113}
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:512
char * str
a string value for the redirecting reason
Definition: channel.h:509

References ast_free, ast_strdup, ast_party_redirecting_reason::code, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_copy().

◆ ast_party_redirecting_reason_free()

void ast_party_redirecting_reason_free ( struct ast_party_redirecting_reason doomed)

Destroy the redirecting reason contents.

Parameters
doomedThe redirecting reason to destroy.

Definition at line 2135 of file channel.c.

2136{
2137 ast_free(doomed->str);
2138}

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

2099{
2100 init->str = NULL;
2102}
@ AST_REDIRECTING_REASON_UNKNOWN
Definition: callerid.h:499

References AST_REDIRECTING_REASON_UNKNOWN, ast_party_redirecting_reason::code, NULL, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_init().

◆ ast_party_redirecting_reason_set()

void ast_party_redirecting_reason_set ( struct ast_party_redirecting_reason dest,
const struct ast_party_redirecting_reason src 
)

Set the redirecting reason information based on another redirecting reason source.

This is similar to ast_party_redirecting_reason_copy, except that NULL values for strings in the src parameter indicate not to update the corresponding dest values.

Parameters
destThe redirecting reason one wishes to update
srcThe new redirecting reason values to update the dest

Definition at line 2121 of file channel.c.

2122{
2123 if (dest == src) {
2124 return;
2125 }
2126
2127 if (src->str && src->str != dest->str) {
2128 ast_free(dest->str);
2129 dest->str = ast_strdup(src->str);
2130 }
2131
2132 dest->code = src->code;
2133}

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

2116{
2117 init->str = NULL;
2118 init->code = guide->code;
2119}

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

2186{
2187 ast_party_id_set(&dest->orig, &src->orig, update ? &update->orig : NULL);
2188 ast_party_id_set(&dest->from, &src->from, update ? &update->from : NULL);
2189 ast_party_id_set(&dest->to, &src->to, update ? &update->to : NULL);
2190 ast_party_id_set(&dest->priv_orig, &src->priv_orig, update ? &update->priv_orig : NULL);
2191 ast_party_id_set(&dest->priv_from, &src->priv_from, update ? &update->priv_from : NULL);
2192 ast_party_id_set(&dest->priv_to, &src->priv_to, update ? &update->priv_to : NULL);
2195 dest->count = src->count;
2196}
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:2121

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

2173{
2174 ast_party_id_set_init(&init->orig, &guide->orig);
2175 ast_party_id_set_init(&init->from, &guide->from);
2176 ast_party_id_set_init(&init->to, &guide->to);
2177 ast_party_id_set_init(&init->priv_orig, &guide->priv_orig);
2178 ast_party_id_set_init(&init->priv_from, &guide->priv_from);
2179 ast_party_id_set_init(&init->priv_to, &guide->priv_to);
2182 init->count = guide->count;
2183}
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:2115

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

1725{
1726 if (dest == src) {
1727 /* Don't copy to self */
1728 return;
1729 }
1730
1731 ast_free(dest->str);
1732 dest->str = ast_strdup(src->str);
1733 dest->type = src->type;
1735 dest->valid = src->valid;
1736}
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:328
char * str
Malloced subaddress string.
Definition: channel.h:315
int type
Q.931 subaddress type.
Definition: channel.h:322

References ast_free, ast_strdup, ast_party_subaddress::odd_even_indicator, ast_party_subaddress::str, ast_party_subaddress::type, and ast_party_subaddress::valid.

Referenced by ast_party_dialed_copy(), and ast_party_id_copy().

◆ ast_party_subaddress_free()

void ast_party_subaddress_free ( struct ast_party_subaddress doomed)

Destroy the party subaddress contents.

Since
1.8
Parameters
doomedThe party subaddress to destroy.

Definition at line 1763 of file channel.c.

1764{
1765 ast_free(doomed->str);
1766 doomed->str = NULL;
1767}

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

1717{
1718 init->str = NULL;
1719 init->type = 0;
1720 init->odd_even_indicator = 0;
1721 init->valid = 0;
1722}

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

1747{
1748 if (dest == src) {
1749 /* Don't set to self */
1750 return;
1751 }
1752
1753 if (src->str && src->str != dest->str) {
1754 ast_free(dest->str);
1755 dest->str = ast_strdup(src->str);
1756 }
1757
1758 dest->type = src->type;
1760 dest->valid = src->valid;
1761}

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

1739{
1740 init->str = NULL;
1741 init->type = guide->type;
1743 init->valid = guide->valid;
1744}

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

6464{
6465 int (*pre_call)(struct ast_channel *chan, const char *sub_args);
6466
6467 ast_channel_lock(chan);
6468 pre_call = ast_channel_tech(chan)->pre_call;
6469 if (pre_call) {
6470 int res;
6471
6472 res = pre_call(chan, sub_args);
6473 ast_channel_unlock(chan);
6474 return res;
6475 }
6476 ast_channel_unlock(chan);
6477 return ast_app_exec_sub(NULL, chan, sub_args, 0);
6478}
int ast_app_exec_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_args, int ignore_hangup)
Run a subroutine on a channel, placing an optional second channel into autoservice.
Definition: main/app.c:297
int(* pre_call)(struct ast_channel *chan, const char *sub_args)
Execute a Gosub call on the channel in a technology specific way before a call is placed.
Definition: channel.h:861

References ast_app_exec_sub(), ast_channel_lock, ast_channel_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 group and pickup group —.

Print call and pickup groups into buffer.

Definition at line 8053 of file channel.c.

8054{
8055 unsigned int i;
8056 int first = 1;
8057 char num[3];
8058
8059 buf[0] = '\0';
8060
8061 if (!group) /* Return empty string if no group */
8062 return buf;
8063
8064 for (i = 0; i <= 63; i++) { /* Max group is 63 */
8065 if (group & ((ast_group_t) 1 << i)) {
8066 if (!first) {
8067 strncat(buf, ", ", buflen - strlen(buf) - 1);
8068 } else {
8069 first = 0;
8070 }
8071 snprintf(num, sizeof(num), "%u", i);
8072 strncat(buf, num, buflen - strlen(buf) - 1);
8073 }
8074 }
8075 return buf;
8076}
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 *  group 
)

Print named call groups and named pickup groups.

Definition at line 8078 of file channel.c.

8079{
8080 struct ao2_container *grp = (struct ao2_container *) group;
8081 struct namedgroup_member *ng;
8082 int first = 1;
8083 struct ao2_iterator it;
8084
8085 if (!grp) {
8086 return ast_str_buffer(*buf);
8087 }
8088
8089 for (it = ao2_iterator_init(grp, 0); (ng = ao2_iterator_next(&it)); ao2_ref(ng, -1)) {
8090 if (!first) {
8091 ast_str_append(buf, 0, ", ");
8092 } else {
8093 first = 0;
8094 }
8095 ast_str_append(buf, 0, "%s", ng->name);
8096 }
8098
8099 return ast_str_buffer(*buf);
8100}
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 5019 of file channel.c.

5020{
5021 struct ast_frame a = { AST_FRAME_VOICE };
5022 char nothing[128];
5023
5024 /* Send an empty audio frame to get things moving */
5025 if (ast_channel_state(chan) != AST_STATE_UP) {
5026 ast_debug(3, "Prodding channel '%s'\n", ast_channel_name(chan));
5027 a.subclass.format = ast_channel_rawwriteformat(chan);
5028 a.data.ptr = nothing + AST_FRIENDLY_OFFSET;
5029 a.src = "ast_prod"; /* this better match check in ast_write */
5030 if (ast_write(chan, &a))
5031 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", ast_channel_name(chan));
5032 }
5033 return 0;
5034}
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:5163
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)

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

1266{
1267 struct ast_frame f = {
1269 .subclass.integer = AST_CONTROL_ANSWER,
1270 .subclass.topology = (struct ast_stream_topology *)topology,
1271 };
1272 return ast_queue_frame(chan, &f);
1273}

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 
)

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

1259{
1260 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control, .data.ptr = (void *) data, .datalen = datalen };
1261 return ast_queue_frame(chan, &f);
1262}

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

1159{
1160 return __ast_queue_frame(chan, fin, 0, NULL);
1161}

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

1164{
1165 return __ast_queue_frame(chan, fin, 1, NULL);
1166}

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 for channel.

Queue a hangup frame.

Definition at line 1169 of file channel.c.

1170{
1171 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
1172 int res;
1173
1174 /* Yeah, let's not change a lock-critical value without locking */
1175 ast_channel_lock(chan);
1178
1179 res = ast_queue_frame(chan, &f);
1180 ast_channel_unlock(chan);
1181 return res;
1182}
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 for channel.

Queue a hangup frame with hangupcause set.

Definition at line 1185 of file channel.c.

1186{
1187 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
1188 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
1189 int res;
1190
1191 if (cause >= 0) {
1192 f.data.uint32 = cause;
1193 }
1194
1195 /* Yeah, let's not change a lock-critical value without locking */
1196 ast_channel_lock(chan);
1198 if (cause < 0) {
1200 }
1201 blob = ast_json_pack("{s: i}",
1202 "cause", cause);
1204
1205 res = ast_queue_frame(chan, &f);
1206 ast_channel_unlock(chan);
1207 return res;
1208}

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

1211{
1212 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HOLD };
1213 struct ast_json *blob = NULL;
1214 int res;
1215
1216 if (!ast_strlen_zero(musicclass)) {
1217 f.data.ptr = (void *) musicclass;
1218 f.datalen = strlen(musicclass) + 1;
1219
1220 blob = ast_json_pack("{s: s}",
1221 "musicclass", musicclass);
1222 }
1223
1224 ast_channel_lock(chan);
1226 ast_channel_unlock(chan);
1227
1228 res = ast_queue_frame(chan, &f);
1229
1230 ast_json_unref(blob);
1231
1232 return res;
1233}
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 1235 of file channel.c.

1236{
1237 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_UNHOLD };
1238 int res;
1239
1240 ast_channel_lock(chan);
1242 ast_channel_unlock(chan);
1243
1244 res = ast_queue_frame(chan, &f);
1245
1246 return res;
1247}
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 2709 of file channel.c.

2710{
2712}
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:2658

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

2659{
2660 int res = 0;
2661 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2662
2663 ast_channel_lock(chan);
2664
2665 /* You can't answer an outbound call */
2667 ast_channel_unlock(chan);
2668 return 0;
2669 }
2670
2671 /* Stop if we're a zombie or need a soft hangup */
2673 ast_channel_unlock(chan);
2674 return -1;
2675 }
2676
2677 /*
2678 * Mark when incoming channel answered so we can know how
2679 * long the channel has been up.
2680 */
2682
2683 ast_channel_unlock(chan);
2684
2685 switch (ast_channel_state(chan)) {
2686 case AST_STATE_RINGING:
2687 case AST_STATE_RING:
2688 ast_channel_lock(chan);
2689 if (ast_channel_tech(chan)->answer_with_stream_topology) {
2690 res = ast_channel_tech(chan)->answer_with_stream_topology(chan, topology);
2691
2692 } else if (ast_channel_tech(chan)->answer) {
2693 res = ast_channel_tech(chan)->answer(chan);
2694 }
2696 ast_channel_unlock(chan);
2697 break;
2698 case AST_STATE_UP:
2699 break;
2700 default:
2701 break;
2702 }
2703
2704 ast_indicate(chan, -1);
2705
2706 return res;
2707}
static int answer(void *data)
Definition: chan_pjsip.c:687
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition: channel.c:4296
int(*const answer)(struct ast_channel *chan)
Answer the channel.
Definition: channel.h:727
int(*const answer_with_stream_topology)(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer the channel with topology.
Definition: channel.h:740

References answer(), ast_channel_tech::answer, ast_channel_tech::answer_with_stream_topology, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_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 4276 of file channel.c.

4277{
4278 return __ast_read(chan, 0, 1);
4279}
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition: channel.c:3544

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

static void ast_read_generator_actions ( struct ast_channel chan,
struct ast_frame f 
)
static

Definition at line 3432 of file channel.c.

3433{
3434 struct ast_generator *generator;
3435 void *gendata;
3436 int res;
3437 int samples;
3438
3439 generator = ast_channel_generator(chan);
3440 if (!generator
3441 || !generator->generate
3442 || f->frametype != AST_FRAME_VOICE
3444 || ast_channel_timingfunc(chan)) {
3445 return;
3446 }
3447
3448 /*
3449 * We must generate frames in phase locked mode since
3450 * we have no internal timer available.
3451 */
3453 float factor;
3455 samples = (int) (((float) f->samples) * factor);
3456 } else {
3457 samples = f->samples;
3458 }
3459
3460 gendata = ast_channel_generatordata(chan);
3461 ast_channel_generatordata_set(chan, NULL); /* reset, to let writes go through */
3462
3463 /*
3464 * This unlock is here based on two assumptions that hold true at
3465 * this point in the code. 1) this function is only called from
3466 * within __ast_read() and 2) all generators call ast_write() in
3467 * their generate callback.
3468 *
3469 * The reason this is added is so that when ast_write is called,
3470 * the lock that occurs there will not recursively lock the
3471 * channel. Doing this will allow deadlock avoidance to work in
3472 * deeper functions.
3473 */
3474 ast_channel_unlock(chan);
3475 res = generator->generate(chan, gendata, f->datalen, samples);
3476 ast_channel_lock(chan);
3477 if (generator == ast_channel_generator(chan)) {
3478 ast_channel_generatordata_set(chan, gendata);
3479 if (res) {
3480 ast_debug(1, "Auto-deactivating generator\n");
3482 }
3483 }
3484}

References ast_channel_generator(), ast_channel_generatordata(), ast_channel_generatordata_set(), ast_channel_lock, ast_channel_timingfunc(), ast_channel_unlock, ast_channel_writeformat(), ast_deactivate_generator(), ast_debug, ast_format_cmp(), AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_sample_rate(), AST_FRAME_VOICE, ast_frame::datalen, ast_frame_subclass::format, ast_frame::frametype, ast_generator::generate, NULL, ast_frame::samples, and ast_frame::subclass.

Referenced by __ast_read().

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

4287{
4288 return __ast_read(chan, 1, 1);
4289}

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

4282{
4283 return __ast_read(chan, 0, 0);
4284}

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

4292{
4293 return __ast_read(chan, 1, 0);
4294}

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

Definition at line 6577 of file channel.c.

6578{
6579 return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
6580}
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:6582

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  ftimeout,
char *  enders,
int  audiofd,
int  ctrlfd 
)

Definition at line 6582 of file channel.c.

6583{
6584 int pos = 0; /* index in the buffer where we accumulate digits */
6585 int to = ftimeout;
6586
6587 struct ast_silence_generator *silgen = NULL;
6588
6589 /* Stop if we're a zombie or need a soft hangup */
6591 return -1;
6592 if (!len)
6593 return -1;
6594 for (;;) {
6595 int d;
6596 if (ast_channel_stream(c)) {
6597 d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
6599 if (!silgen && ast_opt_transmit_silence)
6601 usleep(1000);
6602 if (!d)
6603 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6604 } else {
6605 if (!silgen && ast_opt_transmit_silence)
6607 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6608 }
6609 if (d < 0) {
6611 return AST_GETDATA_FAILED;
6612 }
6613 if (d == 0) {
6614 s[pos] = '\0';
6616 return AST_GETDATA_TIMEOUT;
6617 }
6618 if (d == 1) {
6619 s[pos] = '\0';
6622 }
6623 if (strchr(enders, d) && (pos == 0)) {
6624 s[pos] = '\0';
6627 }
6628 if (!strchr(enders, d)) {
6629 s[pos++] = d;
6630 }
6631 if (strchr(enders, d) || (pos >= len)) {
6632 s[pos] = '\0';
6634 return AST_GETDATA_COMPLETE;
6635 }
6636 to = timeout;
6637 }
6638 /* Never reached */
6639 return 0;
6640}
struct ast_silence_generator * ast_channel_start_silence_generator(struct ast_channel *chan)
Starts a silence generator on the given channel.
Definition: channel.c:8186
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:8232
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:3258
int ast_waitstream_full(struct ast_channel *c, const char *breakon, int audiofd, int monfd)
Definition: file.c:1849
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 4725 of file channel.c.

4726{
4727 int c;
4728 char *buf = ast_recvtext(chan, timeout);
4729 if (buf == NULL)
4730 return -1; /* error or timeout */
4731 c = *(unsigned char *)buf;
4732 ast_free(buf);
4733 return c;
4734}
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:4736

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

4737{
4738 int res;
4739 char *buf = NULL;
4740 struct timeval start = ast_tvnow();
4741 int ms;
4742
4743 while ((ms = ast_remaining_ms(start, timeout))) {
4744 struct ast_frame *f;
4745
4746 if (ast_check_hangup(chan)) {
4747 break;
4748 }
4749 res = ast_waitfor(chan, ms);
4750 if (res <= 0) {/* timeout or error */
4751 break;
4752 }
4753 f = ast_read(chan);
4754 if (f == NULL) {
4755 break; /* no frame */
4756 }
4758 ast_frfree(f);
4759 break;
4760 } else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
4761 buf = ast_strndup((char *) f->data.ptr, f->datalen); /* dup and break */
4762 ast_frfree(f);
4763 break;
4764 }
4765 ast_frfree(f);
4766 }
4767 return buf;
4768}
#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 9290 of file channel.c.

9291{
9292 int32_t value;
9293 size_t pos = 0;
9294 int res;
9295
9296 static const struct ast_party_id_ies orig_ies = {
9298 .name.char_set = AST_REDIRECTING_ORIG_NAME_CHAR_SET,
9299 .name.presentation = AST_REDIRECTING_ORIG_NAME_PRESENTATION,
9300 .name.valid = AST_REDIRECTING_ORIG_NAME_VALID,
9301
9302 .number.str = AST_REDIRECTING_ORIG_NUMBER,
9303 .number.plan = AST_REDIRECTING_ORIG_NUMBER_PLAN,
9304 .number.presentation = AST_REDIRECTING_ORIG_NUMBER_PRESENTATION,
9305 .number.valid = AST_REDIRECTING_ORIG_NUMBER_VALID,
9306
9307 .subaddress.str = AST_REDIRECTING_ORIG_SUBADDRESS,
9308 .subaddress.type = AST_REDIRECTING_ORIG_SUBADDRESS_TYPE,
9309 .subaddress.odd_even_indicator = AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN,
9310 .subaddress.valid = AST_REDIRECTING_ORIG_SUBADDRESS_VALID,
9311
9313 .combined_presentation = 0,/* Not sent. */
9314 };
9315 static const struct ast_party_id_ies from_ies = {
9317 .name.char_set = AST_REDIRECTING_FROM_NAME_CHAR_SET,
9318 .name.presentation = AST_REDIRECTING_FROM_NAME_PRESENTATION,
9319 .name.valid = AST_REDIRECTING_FROM_NAME_VALID,
9320
9321 .number.str = AST_REDIRECTING_FROM_NUMBER,
9322 .number.plan = AST_REDIRECTING_FROM_NUMBER_PLAN,
9323 .number.presentation = AST_REDIRECTING_FROM_NUMBER_PRESENTATION,
9324 .number.valid = AST_REDIRECTING_FROM_NUMBER_VALID,
9325
9326 .subaddress.str = AST_REDIRECTING_FROM_SUBADDRESS,
9327 .subaddress.type = AST_REDIRECTING_FROM_SUBADDRESS_TYPE,
9328 .subaddress.odd_even_indicator = AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN,
9329 .subaddress.valid = AST_REDIRECTING_FROM_SUBADDRESS_VALID,
9330
9332 .combined_presentation = AST_REDIRECTING_FROM_ID_PRESENTATION,
9333 };
9334 static const struct ast_party_id_ies to_ies = {
9336 .name.char_set = AST_REDIRECTING_TO_NAME_CHAR_SET,
9337 .name.presentation = AST_REDIRECTING_TO_NAME_PRESENTATION,
9338 .name.valid = AST_REDIRECTING_TO_NAME_VALID,
9339
9340 .number.str = AST_REDIRECTING_TO_NUMBER,
9341 .number.plan = AST_REDIRECTING_TO_NUMBER_PLAN,
9342 .number.presentation = AST_REDIRECTING_TO_NUMBER_PRESENTATION,
9343 .number.valid = AST_REDIRECTING_TO_NUMBER_VALID,
9344
9345 .subaddress.str = AST_REDIRECTING_TO_SUBADDRESS,
9346 .subaddress.type = AST_REDIRECTING_TO_SUBADDRESS_TYPE,
9347 .subaddress.odd_even_indicator = AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN,
9348 .subaddress.valid = AST_REDIRECTING_TO_SUBADDRESS_VALID,
9349
9351 .combined_presentation = AST_REDIRECTING_TO_ID_PRESENTATION,
9352 };
9353 static const struct ast_party_id_ies priv_orig_ies = {
9358
9361 .number.presentation = AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION,
9363
9364 .subaddress.str = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS,
9366 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN,
9368
9370 .combined_presentation = 0,/* Not sent. */
9371 };
9372 static const struct ast_party_id_ies priv_from_ies = {
9377
9380 .number.presentation = AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION,
9382
9383 .subaddress.str = AST_REDIRECTING_PRIV_FROM_SUBADDRESS,
9385 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN,
9387
9389 .combined_presentation = 0,/* Not sent. */
9390 };
9391 static const struct ast_party_id_ies priv_to_ies = {
9394 .name.presentation = AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION,
9396
9397 .number.str = AST_REDIRECTING_PRIV_TO_NUMBER,
9399 .number.presentation = AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION,
9401
9402 .subaddress.str = AST_REDIRECTING_PRIV_TO_SUBADDRESS,
9403 .subaddress.type = AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE,
9404 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN,
9405 .subaddress.valid = AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID,
9406
9408 .combined_presentation = 0,/* Not sent. */
9409 };
9410 static const struct ast_party_redirecting_reason_ies reason_ies = {
9413 };
9414
9415 static const struct ast_party_redirecting_reason_ies orig_reason_ies = {
9418 };
9419
9420 /* Redirecting frame version */
9421 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
9422 ast_log(LOG_WARNING, "No space left for redirecting frame version\n");
9423 return -1;
9424 }
9425 data[pos++] = AST_REDIRECTING_VERSION;
9426 data[pos++] = 1;
9427 data[pos++] = 2;/* Version 1 did not have a version ie */
9428
9429 res = party_id_build_data(data + pos, datalen - pos, &redirecting->orig,
9430 "redirecting-orig", &orig_ies, update ? &update->orig : NULL);
9431 if (res < 0) {
9432 return -1;
9433 }
9434 pos += res;
9435
9436 res = party_id_build_data(data + pos, datalen - pos, &redirecting->from,
9437 "redirecting-from", &from_ies, update ? &update->from : NULL);
9438 if (res < 0) {
9439 return -1;
9440 }
9441 pos += res;
9442
9443 res = party_id_build_data(data + pos, datalen - pos, &redirecting->to,
9444 "redirecting-to", &to_ies, update ? &update->to : NULL);
9445 if (res < 0) {
9446 return -1;
9447 }
9448 pos += res;
9449
9450 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_orig,
9451 "redirecting-priv-orig", &priv_orig_ies, update ? &update->priv_orig : NULL);
9452 if (res < 0) {
9453 return -1;
9454 }
9455 pos += res;
9456
9457 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_from,
9458 "redirecting-priv-from", &priv_from_ies, update ? &update->priv_from : NULL);
9459 if (res < 0) {
9460 return -1;
9461 }
9462 pos += res;
9463
9464 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_to,
9465 "redirecting-priv-to", &priv_to_ies, update ? &update->priv_to : NULL);
9466 if (res < 0) {
9467 return -1;
9468 }
9469 pos += res;
9470
9471 /* Redirecting reason */
9472 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->reason,
9473 "redirecting-reason", &reason_ies);
9474 if (res < 0) {
9475 return -1;
9476 }
9477 pos += res;
9478
9479 /* Redirecting original reason */
9480 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->orig_reason,
9481 "redirecting-orig-reason", &orig_reason_ies);
9482 if (res < 0) {
9483 return -1;
9484 }
9485 pos += res;
9486
9487 /* Redirecting count */
9488 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9489 ast_log(LOG_WARNING, "No space left for redirecting count\n");
9490 return -1;
9491 }
9492 data[pos++] = AST_REDIRECTING_COUNT;
9493 data[pos++] = sizeof(value);
9494 value = htonl(redirecting->count);
9495 memcpy(data + pos, &value, sizeof(value));
9496 pos += sizeof(value);
9497
9498 return pos;
9499}
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:9257

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

9502{
9503 size_t pos;
9504 unsigned char ie_len;
9505 unsigned char ie_id;
9506 int32_t value;
9507 int frame_version = 1;
9508 int from_combined_presentation = 0;
9509 int got_from_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9510 int to_combined_presentation = 0;
9511 int got_to_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9512
9513 for (pos = 0; pos < datalen; pos += ie_len) {
9514 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
9515 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9516 return -1;
9517 }
9518 ie_id = data[pos++];
9519 ie_len = data[pos++];
9520 if (datalen < pos + ie_len) {
9521 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9522 return -1;
9523 }
9524
9525 switch (ie_id) {
9526/* Redirecting frame version */
9528 if (ie_len != 1) {
9529 ast_log(LOG_WARNING, "Invalid redirecting frame version (%u)\n",
9530 (unsigned) ie_len);
9531 break;
9532 }
9533 frame_version = data[pos];
9534 break;
9535/* Redirecting-orig party id name */
9537 ast_free(redirecting->orig.name.str);
9538 redirecting->orig.name.str = ast_malloc(ie_len + 1);
9539 if (redirecting->orig.name.str) {
9540 memcpy(redirecting->orig.name.str, data + pos, ie_len);
9541 redirecting->orig.name.str[ie_len] = 0;
9542 }
9543 break;
9545 if (ie_len != 1) {
9546 ast_log(LOG_WARNING, "Invalid redirecting-orig name char set (%u)\n",
9547 (unsigned) ie_len);
9548 break;
9549 }
9550 redirecting->orig.name.char_set = data[pos];
9551 break;
9553 if (ie_len != 1) {
9554 ast_log(LOG_WARNING, "Invalid redirecting-orig name presentation (%u)\n",
9555 (unsigned) ie_len);
9556 break;
9557 }
9558 redirecting->orig.name.presentation = data[pos];
9559 break;
9561 if (ie_len != 1) {
9562 ast_log(LOG_WARNING, "Invalid redirecting-orig name valid (%u)\n",
9563 (unsigned) ie_len);
9564 break;
9565 }
9566 redirecting->orig.name.valid = data[pos];
9567 break;
9568/* Redirecting-orig party id number */
9570 ast_free(redirecting->orig.number.str);
9571 redirecting->orig.number.str = ast_malloc(ie_len + 1);
9572 if (redirecting->orig.number.str) {
9573 memcpy(redirecting->orig.number.str, data + pos, ie_len);
9574 redirecting->orig.number.str[ie_len] = 0;
9575 }
9576 break;
9578 if (ie_len != 1) {
9579 ast_log(LOG_WARNING, "Invalid redirecting-orig numbering plan (%u)\n",
9580 (unsigned) ie_len);
9581 break;
9582 }
9583 redirecting->orig.number.plan = data[pos];
9584 break;
9586 if (ie_len != 1) {
9587 ast_log(LOG_WARNING, "Invalid redirecting-orig number presentation (%u)\n",
9588 (unsigned) ie_len);
9589 break;
9590 }
9591 redirecting->orig.number.presentation = data[pos];
9592 break;
9594 if (ie_len != 1) {
9595 ast_log(LOG_WARNING, "Invalid redirecting-orig number valid (%u)\n",
9596 (unsigned) ie_len);
9597 break;
9598 }
9599 redirecting->orig.number.valid = data[pos];
9600 break;
9601/* Redirecting-orig party id subaddress */
9603 ast_free(redirecting->orig.subaddress.str);
9604 redirecting->orig.subaddress.str = ast_malloc(ie_len + 1);
9605 if (redirecting->orig.subaddress.str) {
9606 memcpy(redirecting->orig.subaddress.str, data + pos, ie_len);
9607 redirecting->orig.subaddress.str[ie_len] = 0;
9608 }
9609 break;
9611 if (ie_len != 1) {
9612 ast_log(LOG_WARNING, "Invalid redirecting-orig type of subaddress (%u)\n",
9613 (unsigned) ie_len);
9614 break;
9615 }
9616 redirecting->orig.subaddress.type = data[pos];
9617 break;
9619 if (ie_len != 1) {
9621 "Invalid redirecting-orig subaddress odd-even indicator (%u)\n",
9622 (unsigned) ie_len);
9623 break;
9624 }
9625 redirecting->orig.subaddress.odd_even_indicator = data[pos];
9626 break;
9628 if (ie_len != 1) {
9629 ast_log(LOG_WARNING, "Invalid redirecting-orig subaddress valid (%u)\n",
9630 (unsigned) ie_len);
9631 break;
9632 }
9633 redirecting->orig.subaddress.valid = data[pos];
9634 break;
9635/* Redirecting-orig party id tag */
9637 ast_free(redirecting->orig.tag);
9638 redirecting->orig.tag = ast_malloc(ie_len + 1);
9639 if (redirecting->orig.tag) {
9640 memcpy(redirecting->orig.tag, data + pos, ie_len);
9641 redirecting->orig.tag[ie_len] = 0;
9642 }
9643 break;
9644/* Redirecting-from party id name */
9646 ast_free(redirecting->from.name.str);
9647 redirecting->from.name.str = ast_malloc(ie_len + 1);
9648 if (redirecting->from.name.str) {
9649 memcpy(redirecting->from.name.str, data + pos, ie_len);
9650 redirecting->from.name.str[ie_len] = 0;
9651 }
9652 break;
9654 if (ie_len != 1) {
9655 ast_log(LOG_WARNING, "Invalid redirecting-from name char set (%u)\n",
9656 (unsigned) ie_len);
9657 break;
9658 }
9659 redirecting->from.name.char_set = data[pos];
9660 break;
9662 if (ie_len != 1) {
9663 ast_log(LOG_WARNING, "Invalid redirecting-from name presentation (%u)\n",
9664 (unsigned) ie_len);
9665 break;
9666 }
9667 redirecting->from.name.presentation = data[pos];
9668 break;
9670 if (ie_len != 1) {
9671 ast_log(LOG_WARNING, "Invalid redirecting-from name valid (%u)\n",
9672 (unsigned) ie_len);
9673 break;
9674 }
9675 redirecting->from.name.valid = data[pos];
9676 break;
9677/* Redirecting-from party id number */
9679 ast_free(redirecting->from.number.str);
9680 redirecting->from.number.str = ast_malloc(ie_len + 1);
9681 if (redirecting->from.number.str) {
9682 memcpy(redirecting->from.number.str, data + pos, ie_len);
9683 redirecting->from.number.str[ie_len] = 0;
9684 }
9685 break;
9687 if (ie_len != 1) {
9688 ast_log(LOG_WARNING, "Invalid redirecting-from numbering plan (%u)\n",
9689 (unsigned) ie_len);
9690 break;
9691 }
9692 redirecting->from.number.plan = data[pos];
9693 break;
9695 if (ie_len != 1) {
9696 ast_log(LOG_WARNING, "Invalid redirecting-from number presentation (%u)\n",
9697 (unsigned) ie_len);
9698 break;
9699 }
9700 redirecting->from.number.presentation = data[pos];
9701 break;
9703 if (ie_len != 1) {
9704 ast_log(LOG_WARNING, "Invalid redirecting-from number valid (%u)\n",
9705 (unsigned) ie_len);
9706 break;
9707 }
9708 redirecting->from.number.valid = data[pos];
9709 break;
9710/* Redirecting-from party id combined presentation */
9712 if (ie_len != 1) {
9713 ast_log(LOG_WARNING, "Invalid redirecting-from combined presentation (%u)\n",
9714 (unsigned) ie_len);
9715 break;
9716 }
9717 from_combined_presentation = data[pos];
9718 got_from_combined_presentation = 1;
9719 break;
9720/* Redirecting-from party id subaddress */
9722 ast_free(redirecting->from.subaddress.str);
9723 redirecting->from.subaddress.str = ast_malloc(ie_len + 1);
9724 if (redirecting->from.subaddress.str) {
9725 memcpy(redirecting->from.subaddress.str, data + pos, ie_len);
9726 redirecting->from.subaddress.str[ie_len] = 0;
9727 }
9728 break;
9730 if (ie_len != 1) {
9731 ast_log(LOG_WARNING, "Invalid redirecting-from type of subaddress (%u)\n",
9732 (unsigned) ie_len);
9733 break;
9734 }
9735 redirecting->from.subaddress.type = data[pos];
9736 break;
9738 if (ie_len != 1) {
9740 "Invalid redirecting-from subaddress odd-even indicator (%u)\n",
9741 (unsigned) ie_len);
9742 break;
9743 }
9744 redirecting->from.subaddress.odd_even_indicator = data[pos];
9745 break;
9747 if (ie_len != 1) {
9748 ast_log(LOG_WARNING, "Invalid redirecting-from subaddress valid (%u)\n",
9749 (unsigned) ie_len);
9750 break;
9751 }
9752 redirecting->from.subaddress.valid = data[pos];
9753 break;
9754/* Redirecting-from party id tag */
9756 ast_free(redirecting->from.tag);
9757 redirecting->from.tag = ast_malloc(ie_len + 1);
9758 if (redirecting->from.tag) {
9759 memcpy(redirecting->from.tag, data + pos, ie_len);
9760 redirecting->from.tag[ie_len] = 0;
9761 }
9762 break;
9763/* Redirecting-to party id name */
9765 ast_free(redirecting->to.name.str);
9766 redirecting->to.name.str = ast_malloc(ie_len + 1);
9767 if (redirecting->to.name.str) {
9768 memcpy(redirecting->to.name.str, data + pos, ie_len);
9769 redirecting->to.name.str[ie_len] = 0;
9770 }
9771 break;
9773 if (ie_len != 1) {
9774 ast_log(LOG_WARNING, "Invalid redirecting-to name char set (%u)\n",
9775 (unsigned) ie_len);
9776 break;
9777 }
9778 redirecting->to.name.char_set = data[pos];
9779 break;
9781 if (ie_len != 1) {
9782 ast_log(LOG_WARNING, "Invalid redirecting-to name presentation (%u)\n",
9783 (unsigned) ie_len);
9784 break;
9785 }
9786 redirecting->to.name.presentation = data[pos];
9787 break;
9789 if (ie_len != 1) {
9790 ast_log(LOG_WARNING, "Invalid redirecting-to name valid (%u)\n",
9791 (unsigned) ie_len);
9792 break;
9793 }
9794 redirecting->to.name.valid = data[pos];
9795 break;
9796/* Redirecting-to party id number */
9798 ast_free(redirecting->to.number.str);
9799 redirecting->to.number.str = ast_malloc(ie_len + 1);
9800 if (redirecting->to.number.str) {
9801 memcpy(redirecting->to.number.str, data + pos, ie_len);
9802 redirecting->to.number.str[ie_len] = 0;
9803 }
9804 break;
9806 if (ie_len != 1) {
9807 ast_log(LOG_WARNING, "Invalid redirecting-to numbering plan (%u)\n",
9808 (unsigned) ie_len);
9809 break;
9810 }
9811 redirecting->to.number.plan = data[pos];
9812 break;
9814 if (ie_len != 1) {
9815 ast_log(LOG_WARNING, "Invalid redirecting-to number presentation (%u)\n",
9816 (unsigned) ie_len);
9817 break;
9818 }
9819 redirecting->to.number.presentation = data[pos];
9820 break;
9822 if (ie_len != 1) {
9823 ast_log(LOG_WARNING, "Invalid redirecting-to number valid (%u)\n",
9824 (unsigned) ie_len);
9825 break;
9826 }
9827 redirecting->to.number.valid = data[pos];
9828 break;
9829/* Redirecting-to party id combined presentation */
9831 if (ie_len != 1) {
9832 ast_log(LOG_WARNING, "Invalid redirecting-to combined presentation (%u)\n",
9833 (unsigned) ie_len);
9834 break;
9835 }
9836 to_combined_presentation = data[pos];
9837 got_to_combined_presentation = 1;
9838 break;
9839/* Redirecting-to party id subaddress */
9841 ast_free(redirecting->to.subaddress.str);
9842 redirecting->to.subaddress.str = ast_malloc(ie_len + 1);
9843 if (redirecting->to.subaddress.str) {
9844 memcpy(redirecting->to.subaddress.str, data + pos, ie_len);
9845 redirecting->to.subaddress.str[ie_len] = 0;
9846 }
9847 break;
9849 if (ie_len != 1) {
9850 ast_log(LOG_WARNING, "Invalid redirecting-to type of subaddress (%u)\n",
9851 (unsigned) ie_len);
9852 break;
9853 }
9854 redirecting->to.subaddress.type = data[pos];
9855 break;
9857 if (ie_len != 1) {
9859 "Invalid redirecting-to subaddress odd-even indicator (%u)\n",
9860 (unsigned) ie_len);
9861 break;
9862 }
9863 redirecting->to.subaddress.odd_even_indicator = data[pos];
9864 break;
9866 if (ie_len != 1) {
9867 ast_log(LOG_WARNING, "Invalid redirecting-to subaddress valid (%u)\n",
9868 (unsigned) ie_len);
9869 break;
9870 }
9871 redirecting->to.subaddress.valid = data[pos];
9872 break;
9873/* Redirecting-to party id tag */
9875 ast_free(redirecting->to.tag);
9876 redirecting->to.tag = ast_malloc(ie_len + 1);
9877 if (redirecting->to.tag) {
9878 memcpy(redirecting->to.tag, data + pos, ie_len);
9879 redirecting->to.tag[ie_len] = 0;
9880 }
9881 break;
9882/* Private redirecting-orig party id name */
9884 ast_free(redirecting->priv_orig.name.str);
9885 redirecting->priv_orig.name.str = ast_malloc(ie_len + 1);
9886 if (redirecting->priv_orig.name.str) {
9887 memcpy(redirecting->priv_orig.name.str, data + pos, ie_len);
9888 redirecting->priv_orig.name.str[ie_len] = 0;
9889 }
9890 break;
9892 if (ie_len != 1) {
9893 ast_log(LOG_WARNING, "Invalid private redirecting-orig name char set (%u)\n",
9894 (unsigned) ie_len);
9895 break;
9896 }
9897 redirecting->priv_orig.name.char_set = data[pos];
9898 break;
9900 if (ie_len != 1) {
9901 ast_log(LOG_WARNING, "Invalid private redirecting-orig name presentation (%u)\n",
9902 (unsigned) ie_len);
9903 break;
9904 }
9905 redirecting->priv_orig.name.presentation = data[pos];
9906 break;
9908 if (ie_len != 1) {
9909 ast_log(LOG_WARNING, "Invalid private redirecting-orig name valid (%u)\n",
9910 (unsigned) ie_len);
9911 break;
9912 }
9913 redirecting->priv_orig.name.valid = data[pos];
9914 break;
9915/* Private redirecting-orig party id number */
9917 ast_free(redirecting->priv_orig.number.str);
9918 redirecting->priv_orig.number.str = ast_malloc(ie_len + 1);
9919 if (redirecting->priv_orig.number.str) {
9920 memcpy(redirecting->priv_orig.number.str, data + pos, ie_len);
9921 redirecting->priv_orig.number.str[ie_len] = 0;
9922 }
9923 break;
9925 if (ie_len != 1) {
9926 ast_log(LOG_WARNING, "Invalid private redirecting-orig numbering plan (%u)\n",
9927 (unsigned) ie_len);
9928 break;
9929 }
9930 redirecting->priv_orig.number.plan = data[pos];
9931 break;
9933 if (ie_len != 1) {
9934 ast_log(LOG_WARNING, "Invalid private redirecting-orig number presentation (%u)\n",
9935 (unsigned) ie_len);
9936 break;
9937 }
9938 redirecting->priv_orig.number.presentation = data[pos];
9939 break;
9941 if (ie_len != 1) {
9942 ast_log(LOG_WARNING, "Invalid private redirecting-orig number valid (%u)\n",
9943 (unsigned) ie_len);
9944 break;
9945 }
9946 redirecting->priv_orig.number.valid = data[pos];
9947 break;
9948/* Private redirecting-orig party id subaddress */
9950 ast_free(redirecting->priv_orig.subaddress.str);
9951 redirecting->priv_orig.subaddress.str = ast_malloc(ie_len + 1);
9952 if (redirecting->priv_orig.subaddress.str) {
9953 memcpy(redirecting->priv_orig.subaddress.str, data + pos, ie_len);
9954 redirecting->priv_orig.subaddress.str[ie_len] = 0;
9955 }
9956 break;
9958 if (ie_len != 1) {
9959 ast_log(LOG_WARNING, "Invalid private redirecting-orig type of subaddress (%u)\n",
9960 (unsigned) ie_len);
9961 break;
9962 }
9963 redirecting->priv_orig.subaddress.type = data[pos];
9964 break;
9966 if (ie_len != 1) {
9968 "Invalid private redirecting-orig subaddress odd-even indicator (%u)\n",
9969 (unsigned) ie_len);
9970 break;
9971 }
9972 redirecting->priv_orig.subaddress.odd_even_indicator = data[pos];
9973 break;
9975 if (ie_len != 1) {
9976 ast_log(LOG_WARNING, "Invalid private redirecting-orig subaddress valid (%u)\n",
9977 (unsigned) ie_len);
9978 break;
9979 }
9980 redirecting->priv_orig.subaddress.valid = data[pos];
9981 break;
9982/* Private redirecting-orig party id tag */
9984 ast_free(redirecting->priv_orig.tag);
9985 redirecting->priv_orig.tag = ast_malloc(ie_len + 1);
9986 if (redirecting->priv_orig.tag) {
9987 memcpy(redirecting->priv_orig.tag, data + pos, ie_len);
9988 redirecting->priv_orig.tag[ie_len] = 0;
9989 }
9990 break;
9991/* Private redirecting-from party id name */
9993 ast_free(redirecting->priv_from.name.str);
9994 redirecting->priv_from.name.str = ast_malloc(ie_len + 1);
9995 if (redirecting->priv_from.name.str) {
9996 memcpy(redirecting->priv_from.name.str, data + pos, ie_len);
9997 redirecting->priv_from.name.str[ie_len] = 0;
9998 }
9999 break;
10001 if (ie_len != 1) {
10002 ast_log(LOG_WARNING, "Invalid private redirecting-from name char set (%u)\n",
10003 (unsigned) ie_len);
10004 break;
10005 }
10006 redirecting->priv_from.name.char_set = data[pos];
10007 break;
10009 if (ie_len != 1) {
10010 ast_log(LOG_WARNING, "Invalid private redirecting-from name presentation (%u)\n",
10011 (unsigned) ie_len);
10012 break;
10013 }
10014 redirecting->priv_from.name.presentation = data[pos];
10015 break;
10017 if (ie_len != 1) {
10018 ast_log(LOG_WARNING, "Invalid private redirecting-from name valid (%u)\n",
10019 (unsigned) ie_len);
10020 break;
10021 }
10022 redirecting->priv_from.name.valid = data[pos];
10023 break;
10024/* Private redirecting-from party id number */
10026 ast_free(redirecting->priv_from.number.str);
10027 redirecting->priv_from.number.str = ast_malloc(ie_len + 1);
10028 if (redirecting->priv_from.number.str) {
10029 memcpy(redirecting->priv_from.number.str, data + pos, ie_len);
10030 redirecting->priv_from.number.str[ie_len] = 0;
10031 }
10032 break;
10034 if (ie_len != 1) {
10035 ast_log(LOG_WARNING, "Invalid private redirecting-from numbering plan (%u)\n",
10036 (unsigned) ie_len);
10037 break;
10038 }
10039 redirecting->priv_from.number.plan = data[pos];
10040 break;
10042 if (ie_len != 1) {
10043 ast_log(LOG_WARNING, "Invalid private redirecting-from number presentation (%u)\n",
10044 (unsigned) ie_len);
10045 break;
10046 }
10047 redirecting->priv_from.number.presentation = data[pos];
10048 break;
10050 if (ie_len != 1) {
10051 ast_log(LOG_WARNING, "Invalid private redirecting-from number valid (%u)\n",
10052 (unsigned) ie_len);
10053 break;
10054 }
10055 redirecting->priv_from.number.valid = data[pos];
10056 break;
10057/* Private redirecting-from party id subaddress */
10059 ast_free(redirecting->priv_from.subaddress.str);
10060 redirecting->priv_from.subaddress.str = ast_malloc(ie_len + 1);
10061 if (redirecting->priv_from.subaddress.str) {
10062 memcpy(redirecting->priv_from.subaddress.str, data + pos, ie_len);
10063 redirecting->priv_from.subaddress.str[ie_len] = 0;
10064 }
10065 break;
10067 if (ie_len != 1) {
10068 ast_log(LOG_WARNING, "Invalid private redirecting-from type of subaddress (%u)\n",
10069 (unsigned) ie_len);
10070 break;
10071 }
10072 redirecting->priv_from.subaddress.type = data[pos];
10073 break;
10075 if (ie_len != 1) {
10077 "Invalid private redirecting-from subaddress odd-even indicator (%u)\n",
10078 (unsigned) ie_len);
10079 break;
10080 }
10081 redirecting->priv_from.subaddress.odd_even_indicator = data[pos];
10082 break;
10084 if (ie_len != 1) {
10085 ast_log(LOG_WARNING, "Invalid private redirecting-from subaddress valid (%u)\n",
10086 (unsigned) ie_len);
10087 break;
10088 }
10089 redirecting->priv_from.subaddress.valid = data[pos];
10090 break;
10091/* Private redirecting-from party id tag */
10093 ast_free(redirecting->priv_from.tag);
10094 redirecting->priv_from.tag = ast_malloc(ie_len + 1);
10095 if (redirecting->priv_from.tag) {
10096 memcpy(redirecting->priv_from.tag, data + pos, ie_len);
10097 redirecting->priv_from.tag[ie_len] = 0;
10098 }
10099 break;
10100/* Private redirecting-to party id name */
10102 ast_free(redirecting->priv_to.name.str);
10103 redirecting->priv_to.name.str = ast_malloc(ie_len + 1);
10104 if (redirecting->priv_to.name.str) {
10105 memcpy(redirecting->priv_to.name.str, data + pos, ie_len);
10106 redirecting->priv_to.name.str[ie_len] = 0;
10107 }
10108 break;
10110 if (ie_len != 1) {
10111 ast_log(LOG_WARNING, "Invalid private redirecting-to name char set (%u)\n",
10112 (unsigned) ie_len);
10113 break;
10114 }
10115 redirecting->priv_to.name.char_set = data[pos];
10116 break;
10118 if (ie_len != 1) {
10119 ast_log(LOG_WARNING, "Invalid private redirecting-to name presentation (%u)\n",
10120 (unsigned) ie_len);
10121 break;
10122 }
10123 redirecting->priv_to.name.presentation = data[pos];
10124 break;
10126 if (ie_len != 1) {
10127 ast_log(LOG_WARNING, "Invalid private redirecting-to name valid (%u)\n",
10128 (unsigned) ie_len);
10129 break;
10130 }
10131 redirecting->priv_to.name.valid = data[pos];
10132 break;
10133/* Private redirecting-to party id number */
10135 ast_free(redirecting->priv_to.number.str);
10136 redirecting->priv_to.number.str = ast_malloc(ie_len + 1);
10137 if (redirecting->priv_to.number.str) {
10138 memcpy(redirecting->priv_to.number.str, data + pos, ie_len);
10139 redirecting->priv_to.number.str[ie_len] = 0;
10140 }
10141 break;
10143 if (ie_len != 1) {
10144 ast_log(LOG_WARNING, "Invalid private redirecting-to numbering plan (%u)\n",
10145 (unsigned) ie_len);
10146 break;
10147 }
10148 redirecting->priv_to.number.plan = data[pos];
10149 break;
10151 if (ie_len != 1) {
10152 ast_log(LOG_WARNING, "Invalid private redirecting-to number presentation (%u)\n",
10153 (unsigned) ie_len);
10154 break;
10155 }
10156 redirecting->priv_to.number.presentation = data[pos];
10157 break;
10159 if (ie_len != 1) {
10160 ast_log(LOG_WARNING, "Invalid private redirecting-to number valid (%u)\n",
10161 (unsigned) ie_len);
10162 break;
10163 }
10164 redirecting->priv_to.number.valid = data[pos];
10165 break;
10166/* Private redirecting-to party id subaddress */
10168 ast_free(redirecting->priv_to.subaddress.str);
10169 redirecting->priv_to.subaddress.str = ast_malloc(ie_len + 1);
10170 if (redirecting->priv_to.subaddress.str) {
10171 memcpy(redirecting->priv_to.subaddress.str, data + pos, ie_len);
10172 redirecting->priv_to.subaddress.str[ie_len] = 0;
10173 }
10174 break;
10176 if (ie_len != 1) {
10177 ast_log(LOG_WARNING, "Invalid private redirecting-to type of subaddress (%u)\n",
10178 (unsigned) ie_len);
10179 break;
10180 }
10181 redirecting->priv_to.subaddress.type = data[pos];
10182 break;
10184 if (ie_len != 1) {
10186 "Invalid private redirecting-to subaddress odd-even indicator (%u)\n",
10187 (unsigned) ie_len);
10188 break;
10189 }
10190 redirecting->priv_to.subaddress.odd_even_indicator = data[pos];
10191 break;
10193 if (ie_len != 1) {
10194 ast_log(LOG_WARNING, "Invalid private redirecting-to subaddress valid (%u)\n",
10195 (unsigned) ie_len);
10196 break;
10197 }
10198 redirecting->priv_to.subaddress.valid = data[pos];
10199 break;
10200/* Private redirecting-to party id tag */
10202 ast_free(redirecting->priv_to.tag);
10203 redirecting->priv_to.tag = ast_malloc(ie_len + 1);
10204 if (redirecting->priv_to.tag) {
10205 memcpy(redirecting->priv_to.tag, data + pos, ie_len);
10206 redirecting->priv_to.tag[ie_len] = 0;
10207 }
10208 break;
10209/* Redirecting reason code */
10211 if (ie_len != sizeof(value)) {
10212 ast_log(LOG_WARNING, "Invalid redirecting reason (%u)\n",
10213 (unsigned) ie_len);
10214 break;
10215 }
10216 memcpy(&value, data + pos, sizeof(value));
10217 redirecting->reason.code = ntohl(value);
10218 break;
10219/* Redirecting reason string */
10221 ast_free(redirecting->reason.str);
10222 redirecting->reason.str = ast_malloc(ie_len + 1);
10223 if (redirecting->reason.str) {
10224 memcpy(redirecting->reason.str, data + pos, ie_len);
10225 redirecting->reason.str[ie_len] = 0;
10226 }
10227 break;
10228/* Redirecting orig-reason code */
10230 if (ie_len != sizeof(value)) {
10231 ast_log(LOG_WARNING, "Invalid redirecting original reason (%u)\n",
10232 (unsigned) ie_len);
10233 break;
10234 }
10235 memcpy(&value, data + pos, sizeof(value));
10236 redirecting->orig_reason.code = ntohl(value);
10237 break;
10238/* Redirecting orig-reason string */
10240 ast_free(redirecting->orig_reason.str);
10241 redirecting->orig_reason.str = ast_malloc(ie_len + 1);
10242 if (redirecting->orig_reason.str) {
10243 memcpy(redirecting->orig_reason.str, data + pos, ie_len);
10244 redirecting->orig_reason.str[ie_len] = 0;
10245 }
10246 break;
10247/* Redirecting count */
10249 if (ie_len != sizeof(value)) {
10250 ast_log(LOG_WARNING, "Invalid redirecting count (%u)\n",
10251 (unsigned) ie_len);
10252 break;
10253 }
10254 memcpy(&value, data + pos, sizeof(value));
10255 redirecting->count = ntohl(value);
10256 break;
10257/* Redirecting unknown element */
10258 default:
10259 ast_debug(1, "Unknown redirecting element: %u (%u)\n",
10260 (unsigned) ie_id, (unsigned) ie_len);
10261 break;
10262 }
10263 }
10264
10265 switch (frame_version) {
10266 case 1:
10267 /*
10268 * The other end is an earlier version that we need to adjust
10269 * for compatibility.
10270 *
10271 * The earlier version did not have the orig party id or
10272 * orig_reason value.
10273 */
10274 redirecting->from.name.valid = 1;
10276 redirecting->from.number.valid = 1;
10277 if (got_from_combined_presentation) {
10278 redirecting->from.name.presentation = from_combined_presentation;
10279 redirecting->from.number.presentation = from_combined_presentation;
10280 }
10281
10282 redirecting->to.name.valid = 1;
10284 redirecting->to.number.valid = 1;
10285 if (got_to_combined_presentation) {
10286 redirecting->to.name.presentation = to_combined_presentation;
10287 redirecting->to.number.presentation = to_combined_presentation;
10288 }
10289 break;
10290 case 2:
10291 /* The other end is at the same level as we are. */
10292 break;
10293 default:
10294 /*
10295 * The other end is newer than we are.
10296 * We need to assume that they are compatible with us.
10297 */
10298 ast_debug(1, "Redirecting frame has newer version: %u\n",
10299 (unsigned) frame_version);
10300 break;
10301 }
10302
10303 return 0;
10304}

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

7761{
7762 if (groups) {
7763 ao2_ref(groups, 1);
7764 }
7765 return groups;
7766}
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 6373 of file channel.c.

6374{
6375 return request_channel(type, request_cap, NULL, assignedids, requestor, addr, cause);
6376}
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:6238

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

6194{
6195 return __ast_request_and_dial(type, cap, assignedids, requestor, addr, timeout, outstate, cidnum, cidname, NULL);
6196}
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:5995

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

6379{
6380 return request_channel(type, NULL, topology, assignedids, requestor, addr, cause);
6381}

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, look for hangups.

Wait for a specified amount of time, looking for hangups.

Definition at line 1593 of file channel.c.

1594{
1595 return safe_sleep_conditional(chan, ms, NULL, NULL, 1);
1596}
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:1517

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

1588{
1589 return safe_sleep_conditional(chan, timeout_ms, cond, data, 1);
1590}
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 1598 of file channel.c.

1599{
1600 return safe_sleep_conditional(chan, ms, NULL, NULL, 0);
1601}

References NULL, and safe_sleep_conditional().

Referenced by wait_for_hangup().

◆ ast_say_character_str()

int ast_say_character_str ( struct ast_channel chan,
const char *  str,
const char *  ints,
const char *  lang,
enum ast_say_case_sensitivity  sensitivity 
)

function to pronounce character and phonetic strings

Definition at line 8293 of file channel.c.

8295{
8296 return ast_say_character_str_full(chan, str, ints, lang, sensitivity, -1, -1);
8297}
const char * str
Definition: app_jack.c:147
SAY_EXTERN int(* ast_say_character_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, enum ast_say_case_sensitivity sensitivity, int audiofd, int ctrlfd) SAY_INIT(ast_say_character_str_full)
Definition: say.h:194

References ast_say_character_str_full, and str.

Referenced by common_exec(), pbx_builtin_saycharacters(), pbx_builtin_saycharacters_case(), play_mailbox_owner(), play_on_channel(), and vmsayname_exec().

◆ ast_say_digit_str()

int ast_say_digit_str ( struct ast_channel chan,
const char *  num,
const char *  ints,
const char *  lang 
)

says digits of a string

Parameters
chanchannel to act upon
numstring to speak
intswhich dtmf to interrupt on
langlanguage to speak in

Vocally says the digits of a given string

Return values
0on succes
DTMFif interrupted
-1on failure

Definition at line 8281 of file channel.c.

8283{
8284 return ast_say_digit_str_full(chan, str, ints, lang, -1, -1);
8285}
SAY_EXTERN int(* ast_say_digit_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_digit_str_full)
Same as ast_say_digit_str() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition: say.h:162

References ast_say_digit_str_full, and str.

Referenced by __analog_ss_thread(), forward_message(), invent_message(), pbx_builtin_saydigits(), play_message_callerid(), and play_on_channel().

◆ ast_say_digits()

int ast_say_digits ( struct ast_channel chan,
int  num,
const char *  ints,
const char *  lang 
)

says digits

Parameters
chanchannel to act upon
numnumber to speak
intswhich dtmf to interrupt on
langlanguage to speak

Vocally says digits of a given number

Return values
0on success
DTMFif interrupted
-1on failure

Definition at line 8275 of file channel.c.

8277{
8278 return ast_say_digits_full(chan, num, ints, lang, -1, -1);
8279}
int ast_say_digits_full(struct ast_channel *chan, int num, const char *ints, const char *lang, int audiofd, int ctrlfd)
Same as ast_say_digits() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition: channel.c:8305

References ast_say_digits_full().

Referenced by announce_to_dial(), common_exec(), conf_exec(), conf_run(), and say_parking_space().

◆ ast_say_digits_full()

int ast_say_digits_full ( struct ast_channel chan,
int  num,
const char *  ints,
const char *  lang,
int  audiofd,
int  ctrlfd 
)

◆ ast_say_enumeration()

int ast_say_enumeration ( struct ast_channel chan,
int  num,
const char *  ints,
const char *  lang,
const char *  options 
)

says an enumeration

Parameters
chanchannel to say them enumeration on
numnumber to say on the channel
intswhich dtmf to interrupt on
langlanguage to speak the enumeration
optionsset to 'f' for female, 'm' for male, 'c' for commune, 'n' for neuter

Vocally says an enumeration on a given channel (first, second, third, forth, thirtyfirst, hundredth, ....) Especially useful for dates and messages. Says 'last' if num equals to INT_MAX

Return values
0on success
DTMFdigit on interrupt
-1on failure

Definition at line 8269 of file channel.c.

8271{
8272 return ast_say_enumeration_full(chan, num, ints, language, options, -1, -1);
8273}
static char language[MAX_LANGUAGE]
Definition: chan_iax2.c:324
SAY_EXTERN int(* ast_say_enumeration_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_enumeration_full)
Same as ast_say_enumeration() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition: say.h:125
static struct test_options options

References ast_say_enumeration_full, language, and options.

Referenced by ast_say_date_da(), ast_say_date_de(), ast_say_date_is(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_is(), ast_say_date_with_format_pl(), and ast_say_date_with_format_vi().

◆ ast_say_money_str()

int ast_say_money_str ( struct ast_channel chan,
const char *  str,
const char *  ints,
const char *  lang 
)

function to pronounce monetary amounts

Definition at line 8287 of file channel.c.

8289{
8290 return ast_say_money_str_full(chan, str, ints, lang, -1, -1);
8291}
SAY_EXTERN int(* ast_say_money_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_money_str_full)
Definition: say.h:170

References ast_say_money_str_full, and str.

Referenced by pbx_builtin_saymoney().

◆ ast_say_number()

int ast_say_number ( struct ast_channel chan,
int  num,
const char *  ints,
const char *  lang,
const char *  options 
)

says a number

Parameters
chanchannel to say them number on
numnumber to say on the channel
intswhich dtmf to interrupt on
langlanguage to speak the number
optionsset to 'f' for female, 'm' for male, 'c' for commune, 'n' for neuter

Vocally says a number on a given channel

Return values
0on success
DTMFdigit on interrupt
-1on failure

Definition at line 8257 of file channel.c.

8259{
8260 return ast_say_number_full(chan, num, ints, language, options, -1, -1);
8261}
SAY_EXTERN int(* ast_say_number_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_number_full)
Same as ast_say_number() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition: say.h:86

References ast_say_number_full, language, and options.

Referenced by announce_user_count(), app_exec(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_fr(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_hu(), ast_say_date_is(), ast_say_date_ja(), ast_say_date_ka(), ast_say_date_nl(), ast_say_date_pt(), ast_say_date_th(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_is(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_vi(), ast_say_datetime_en(), ast_say_datetime_fr(), ast_say_datetime_from_now_en(), ast_say_datetime_from_now_fr(), ast_say_datetime_from_now_he(), ast_say_datetime_from_now_ka(), ast_say_datetime_from_now_pt(), ast_say_datetime_he(), ast_say_datetime_ja(), ast_say_datetime_pt(), ast_say_datetime_th(), ast_say_datetime_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_fr(), ast_say_time_gr(), ast_say_time_hu(), ast_say_time_ja(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_pt(), ast_say_time_pt_BR(), ast_say_time_th(), ast_say_time_zh(), conf_run(), count_exec(), dictate_exec(), get_folder(), get_folder_ja(), gr_say_number_female(), limits_interval_playback(), meetme_menu_admin_extended(), pbx_builtin_saynumber(), play_message(), play_message_duration(), play_on_channel(), playback_common(), say_and_wait(), say_position(), try_calling(), vm_intro_gr(), vm_intro_he(), vm_intro_multilang(), vm_intro_pt(), and vm_intro_pt_BR().

◆ ast_say_ordinal()

int ast_say_ordinal ( struct ast_channel chan,
int  num,
const char *  ints,
const char *  lang,
const char *  options 
)

says an ordinal number

Parameters
chanchannel to say them number on
numordinal number to say on the channel
intswhich dtmf to interrupt on
langlanguage to speak the number
optionsset to 'f' for female, 'm' for male, 'c' for commune, 'n' for neuter

Vocally says an ordinal number on a given channel

Return values
0on success
DTMFdigit on interrupt
-1on failure

Definition at line 8263 of file channel.c.

8265{
8266 return ast_say_ordinal_full(chan, num, ints, language, options, -1, -1);
8267}
SAY_EXTERN int(* ast_say_ordinal_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_ordinal_full)
Same as ast_say_number() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition: say.h:105

References ast_say_ordinal_full, language, and options.

Referenced by pbx_builtin_sayordinal().

◆ ast_say_phonetic_str()

int ast_say_phonetic_str ( struct ast_channel chan,
const char *  str,
const char *  ints,
const char *  lang 
)

Definition at line 8299 of file channel.c.

8301{
8302 return ast_say_phonetic_str_full(chan, str, ints, lang, -1, -1);
8303}
SAY_EXTERN int(* ast_say_phonetic_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_phonetic_str_full)
Definition: say.h:199

References ast_say_phonetic_str_full, and str.

Referenced by pbx_builtin_sayphonetic().

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

4994{
4995 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
4997 }
4998 if (ast_channel_tech(chan)->send_digit_begin) {
5000 ast_safe_sleep(chan, duration);
5001 }
5002
5003 return ast_senddigit_end(chan, digit, duration);
5004}
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition: channel.c:4893
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait, look for hangups.
Definition: channel.c:1593

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

4894{
4895 /* Device does not support DTMF tones, lets fake
4896 * it by doing our own generation. */
4897 static const char * const dtmf_tones[] = {
4898 "941+1336", /* 0 */
4899 "697+1209", /* 1 */
4900 "697+1336", /* 2 */
4901 "697+1477", /* 3 */
4902 "770+1209", /* 4 */
4903 "770+1336", /* 5 */
4904 "770+1477", /* 6 */
4905 "852+1209", /* 7 */
4906 "852+1336", /* 8 */
4907 "852+1477", /* 9 */
4908 "697+1633", /* A */
4909 "770+1633", /* B */
4910 "852+1633", /* C */
4911 "941+1633", /* D */
4912 "941+1209", /* * */
4913 "941+1477" /* # */
4914 };
4915
4916 if (!ast_channel_tech(chan)->send_digit_begin)
4917 return 0;
4918
4919 ast_channel_lock(chan);
4922 ast_channel_unlock(chan);
4923
4924 if (!ast_channel_tech(chan)->send_digit_begin(chan, digit))
4925 return 0;
4926
4927 if (digit >= '0' && digit <='9')
4928 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
4929 else if (digit >= 'A' && digit <= 'D')
4930 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
4931 else if (digit == '*')
4932 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
4933 else if (digit == '#')
4934 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
4935 else {
4936 /* not handled */
4937 ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4938 }
4939
4940 return 0;
4941}
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 4943 of file channel.c.

4944{
4945 int res = -1;
4946
4947 if (ast_channel_tech(chan)->send_digit_end)
4948 res = ast_channel_tech(chan)->send_digit_end(chan, digit, duration);
4949
4950 ast_channel_lock(chan);
4953 }
4954 ast_channel_unlock(chan);
4955
4956 if (res && ast_channel_generator(chan))
4957 ast_playtones_stop(chan);
4958
4959 return 0;
4960}
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:710

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

5007{
5008 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
5010 }
5011 if (ast_channel_tech(chan)->send_digit_begin) {
5013 usleep(duration * 1000);
5014 }
5015
5016 return ast_senddigit_end(chan, digit, duration);
5017}

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

4973{
4974 if (duration < DEFAULT_EMULATE_MF_DURATION) {
4975 duration = DEFAULT_EMULATE_MF_DURATION;
4976 }
4977 if (ast_channel_tech(chan)->send_digit_begin) {
4978 if (digit == '*') {
4979 duration = durationkp;
4980 } else if (digit == '#' || digit == 'A' || digit == 'B' || digit == 'C') {
4981 duration = durationst;
4982 }
4984 if (is_external) {
4985 usleep(duration * 1000);
4986 } else {
4987 ast_safe_sleep(chan, duration);
4988 }
4989 }
4990 return ast_senddigit_mf_end(chan);
4991}
int ast_senddigit_mf_begin(struct ast_channel *chan, char digit)
Send an MF digit to a channel.
Definition: channel.c:4854
int ast_senddigit_mf_end(struct ast_channel *chan)
End sending an MF digit to a channel.
Definition: channel.c:4962
#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 4854 of file channel.c.

4855{
4856 static const char * const mf_tones[] = {
4857 "1300+1500", /* 0 */
4858 "700+900", /* 1 */
4859 "700+1100", /* 2 */
4860 "900+1100", /* 3 */
4861 "700+1300", /* 4 */
4862 "900+1300", /* 5 */
4863 "1100+1300", /* 6 */
4864 "700+1500", /* 7 */
4865 "900+1500", /* 8 */
4866 "1100+1500", /* 9 */
4867 "1100+1700", /* * (KP) */
4868 "1500+1700", /* # (ST) */
4869 "900+1700", /* A (STP) */
4870 "1300+1700", /* B (ST2P) */
4871 "700+1700" /* C (ST3P) */
4872 };
4873
4874 if (digit >= '0' && digit <='9') {
4875 ast_playtones_start(chan, 0, mf_tones[digit-'0'], 0);
4876 } else if (digit == '*') {
4877 ast_playtones_start(chan, 0, mf_tones[10], 0);
4878 } else if (digit == '#') {
4879 ast_playtones_start(chan, 0, mf_tones[11], 0);
4880 } else if (digit == 'A') {
4881 ast_playtones_start(chan, 0, mf_tones[12], 0);
4882 } else if (digit == 'B') {
4883 ast_playtones_start(chan, 0, mf_tones[13], 0);
4884 } else if (digit == 'C') {
4885 ast_playtones_start(chan, 0, mf_tones[14], 0);
4886 } else {
4887 /* not handled */
4888 ast_log(LOG_WARNING, "Unable to generate MF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4889 }
4890 return 0;
4891}
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 4962 of file channel.c.

4963{
4964 if (ast_channel_generator(chan)) {
4965 ast_playtones_stop(chan);
4966 return 0;
4967 }
4968 return -1;
4969}

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

4829{
4830 struct ast_msg_data *msg;
4831 int rc;
4832 struct ast_msg_data_attribute attrs[] =
4833 {
4834 {
4836 .value = (char *)text,
4837 }
4838 };
4839
4840 if (ast_strlen_zero(text)) {
4841 return 0;
4842 }
4843
4845 if (!msg) {
4846 return -1;
4847 }
4848 rc = ast_sendtext_data(chan, msg);
4849 ast_free(msg);
4850
4851 return rc;
4852}
char * text
Definition: app_queue.c:1668
struct ast_msg_data * ast_msg_data_alloc(enum ast_msg_data_source_type source, struct ast_msg_data_attribute attributes[], size_t count)
Allocates an ast_msg_data structure.
@ AST_MSG_DATA_ATTR_BODY
Definition: message.h:458
@ AST_MSG_DATA_SOURCE_TYPE_UNKNOWN
Definition: message.h:447
enum ast_msg_data_attribute_type type
Definition: message.h:463

References ARRAY_LEN, ast_free, ast_msg_data_alloc(), AST_MSG_DATA_ATTR_BODY, AST_MSG_DATA_SOURCE_TYPE_UNKNOWN, ast_sendtext_data(), ast_strlen_zero(), text, and ast_msg_data_attribute::type.

Referenced by __ast_read(), handle_sendtext(), sendtext_exec(), and sendtext_safe().

◆ ast_sendtext_data()

int ast_sendtext_data ( struct ast_channel chan,
struct ast_msg_data msg 
)

Sends text to a channel in an ast_msg_data structure wrapper with ast_sendtext as fallback.

Since
13.22.0
15.5.0
Parameters
chanchannel to act upon
msgast_msg_data structure

Write text to a display on a channel. If the channel driver doesn't support the send_text_data callback. then the original send_text callback will be used if available.

Note
The channel does not need to be locked before calling this function.
Return values
0on success
-1on failure

Definition at line 4770 of file channel.c.

4771{
4772 int res = 0;
4773 const char *body = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_BODY);
4774 const char *content_type = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_CONTENT_TYPE);
4775
4776 ast_channel_lock(chan);
4777 /* Stop if we're a zombie or need a soft hangup */
4779 ast_channel_unlock(chan);
4780 return -1;
4781 }
4782
4783 CHECK_BLOCKING(chan);
4784 if (ast_channel_tech(chan)->write_text
4785 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))
4787 struct ast_frame f;
4788 /* T.140 payload does not include the null byte terminator */
4789 size_t body_len = strlen(body);
4790
4791 /* Process as T.140 text (moved here from ast_sendtext() */
4792 memset(&f, 0, sizeof(f));
4793 f.src = "DIALPLAN";
4794 f.subclass.format = ast_format_t140;
4795 f.frametype = AST_FRAME_TEXT;
4796 f.datalen = body_len;
4797 f.mallocd = AST_MALLOCD_DATA;
4798 f.data.ptr = ast_strdup(body);
4799 if (f.data.ptr) {
4800 res = ast_channel_tech(chan)->write_text(chan, &f);
4801 } else {
4802 res = -1;
4803 }
4804 ast_frfree(&f);
4805 } else if ((ast_channel_tech(chan)->properties & AST_CHAN_TP_SEND_TEXT_DATA)
4806 && ast_channel_tech(chan)->send_text_data) {
4807 /* Send enhanced message to a channel driver that supports it */
4808 ast_debug(1, "Sending TEXT_DATA from '%s' to %s:%s %s\n",
4811 ast_channel_name(chan), body);
4812 res = ast_channel_tech(chan)->send_text_data(chan, msg);
4813 } else if (ast_channel_tech(chan)->send_text
4814 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))) {
4815 /* Send the body of an enhanced message to a channel driver that supports only a char str */
4816 ast_debug(1, "Sending TEXT to %s: %s\n", ast_channel_name(chan), body);
4817 res = ast_channel_tech(chan)->send_text(chan, body);
4818 } else {
4819 ast_debug(1, "Channel technology does not support sending content type '%s' on channel '%s'\n",
4820 S_OR(content_type, "text/plain"), ast_channel_name(chan));
4821 res = -1;
4822 }
4824 ast_channel_unlock(chan);
4825 return res;
4826}
static void send_text(unsigned char pos, unsigned char inverse, struct unistimsession *pte, const char *text)
@ AST_CHAN_TP_SEND_TEXT_DATA
Channels have this property if they implement send_text_data.
Definition: channel.h:995
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
Definition: channel.h:2917
@ AST_MEDIA_TYPE_TEXT
Definition: codec.h:35
struct ast_format * ast_format_t140
Built-in cached t140 format.
Definition: format_cache.c:231
const char * ast_msg_data_get_attribute(struct ast_msg_data *msg, enum ast_msg_data_attribute_type attribute_type)
Get attribute from ast_msg_data.
@ AST_MSG_DATA_ATTR_TO
Definition: message.h:455
@ AST_MSG_DATA_ATTR_FROM
Definition: message.h:456
@ AST_MSG_DATA_ATTR_CONTENT_TYPE
Definition: message.h:457
#define AST_MALLOCD_DATA
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
Definition: strings.h:97
int(*const send_text)(struct ast_channel *chan, const char *text)
Display or transmit text.
Definition: channel.h:776
int(*const write_text)(struct ast_channel *chan, struct ast_frame *frame)
Write a text frame, in standard format.
Definition: channel.h:809
int(*const send_text_data)(struct ast_channel *chan, struct ast_msg_data *data)
Display or transmit text with data.
Definition: channel.h:864

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

7357{
7358 ast_channel_lock(chan);
7359
7360 if (cid_num) {
7361 ast_channel_caller(chan)->id.number.valid = 1;
7362 ast_free(ast_channel_caller(chan)->id.number.str);
7363 ast_channel_caller(chan)->id.number.str = ast_strdup(cid_num);
7364 }
7365 if (cid_name) {
7366 ast_channel_caller(chan)->id.name.valid = 1;
7367 ast_free(ast_channel_caller(chan)->id.name.str);
7368 ast_channel_caller(chan)->id.name.str = ast_strdup(cid_name);
7369 }
7370 if (cid_ani) {
7372 ast_free(ast_channel_caller(chan)->ani.number.str);
7373 ast_channel_caller(chan)->ani.number.str = ast_strdup(cid_ani);
7374 }
7375
7377
7378 ast_channel_unlock(chan);
7379}

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

2519{
2521
2522 ast_channel_lock(chan);
2523 if (force || ast_strlen_zero(ast_channel_hangupsource(chan))) {
2524 ast_channel_hangupsource_set(chan, source);
2525 }
2526 ast_channel_unlock(chan);
2527
2528 if (bridge) {
2529 ast_channel_lock(bridge);
2530 if (force || ast_strlen_zero(ast_channel_hangupsource(bridge))) {
2531 ast_channel_hangupsource_set(bridge, source);
2532 }
2533 ast_channel_unlock(bridge);
2534 }
2535}
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:10586
const char * ast_channel_hangupsource(const struct ast_channel *chan)
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:3015

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

1770{
1771 update_id->name = 1;
1772 update_id->number = 1;
1773 update_id->subaddress = 1;
1774}
unsigned char subaddress
Definition: channel.h:369
unsigned char number
Definition: channel.h:367
unsigned char name
Definition: channel.h:365

References ast_set_party_id::name, ast_set_party_id::number, and ast_set_party_id::subaddress.

Referenced by set_redirecting().

◆ ast_set_read_format()

int ast_set_read_format ( struct ast_channel chan,
struct ast_format format 
)

Sets read format on channel chan.

Parameters
chanchannel to change
formatformat to set for reading
Returns
Returns 0 on success, -1 on failure

Definition at line 5781 of file channel.c.

5782{
5784 int res;
5785
5786 ast_assert(format != NULL);
5787
5788 if (!cap) {
5789 return -1;
5790 }
5791 ast_format_cap_append(cap, format, 0);
5792
5793 res = set_format(chan, cap, 0, 0);
5794
5795 ao2_cleanup(cap);
5796 return res;
5797}
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition: channel.c:5612

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

5800{
5801 return set_format(chan, cap, 0, 0);
5802}

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

5508{
5509 struct ast_trans_pvt *trans_old;
5510 struct ast_trans_pvt *trans_new;
5511
5514 /* Nothing to setup */
5515 return 0;
5516 }
5517
5518 ast_debug(1, "Channel %s setting read format path: %s -> %s\n",
5519 ast_channel_name(chan),
5520 ast_format_get_name(raw_format),
5521 ast_format_get_name(core_format));
5522
5523 /* Setup new translation path. */
5524 if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5525 trans_new = ast_translator_build_path(core_format, raw_format);
5526 if (!trans_new) {
5527 return -1;
5528 }
5529 } else {
5530 /* No translation needed. */
5531 trans_new = NULL;
5532 }
5533 trans_old = ast_channel_readtrans(chan);
5534 if (trans_old) {
5535 ast_translator_free_path(trans_old);
5536 }
5537 ast_channel_readtrans_set(chan, trans_new);
5538 ast_channel_set_rawreadformat(chan, raw_format);
5539 ast_channel_set_readformat(chan, core_format);
5540 return 0;
5541}
void ast_channel_readtrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
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 8137 of file channel.c.

8138{
8139 struct ast_variable *cur;
8140
8141 for (cur = vars; cur; cur = cur->next) {
8142 pbx_builtin_setvar_helper(chan, cur->name, cur->value);
8143 }
8144}
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 5822 of file channel.c.

5823{
5825 int res;
5826
5827 ast_assert(format != NULL);
5828
5829 if (!cap) {
5830 return -1;
5831 }
5832 ast_format_cap_append(cap, format, 0);
5833
5834 res = set_format(chan, cap, 1, 0);
5835
5836 ao2_cleanup(cap);
5837 return res;
5838}

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

5841{
5842 return set_format(chan, cap, 1, 0);
5843}

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

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

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

5544{
5545 struct ast_trans_pvt *trans_old;
5546 struct ast_trans_pvt *trans_new;
5547
5550 /* Nothing to setup */
5551 return 0;
5552 }
5553
5554 ast_debug(1, "Channel %s setting write format path: %s -> %s\n",
5555 ast_channel_name(chan),
5556 ast_format_get_name(core_format),
5557 ast_format_get_name(raw_format));
5558
5559 /* Setup new translation path. */
5560 if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5561 trans_new = ast_translator_build_path(raw_format, core_format);
5562 if (!trans_new) {
5563 return -1;
5564 }
5565 } else {
5566 /* No translation needed. */
5567 trans_new = NULL;
5568 }
5569 trans_old = ast_channel_writetrans(chan);
5570 if (trans_old) {
5571 ast_translator_free_path(trans_old);
5572 }
5573 ast_channel_writetrans_set(chan, trans_new);
5574 ast_channel_set_rawwriteformat(chan, raw_format);
5575 ast_channel_set_writeformat(chan, core_format);
5576 return 0;
5577}
void ast_channel_writetrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)

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

int ast_setstate ( struct ast_channel chan,
enum  ast_channel_state 
)

Change the state of a channel.

Precondition
chan is locked

Definition at line 7408 of file channel.c.

7409{
7410 int oldstate = ast_channel_state(chan);
7411 char name[AST_CHANNEL_NAME], *dashptr;
7412
7413 if (oldstate == state)
7414 return 0;
7415
7416 ast_copy_string(name, ast_channel_name(chan), sizeof(name));
7417 if ((dashptr = strrchr(name, '-'))) {
7418 *dashptr = '\0';
7419 }
7420
7422
7424
7425 /* We have to pass AST_DEVICE_UNKNOWN here because it is entirely possible that the channel driver
7426 * for this channel is using the callback method for device state. If we pass in an actual state here
7427 * we override what they are saying the state is and things go amuck. */
7429
7430 return 0;
7431}

References ast_channel_flags(), AST_CHANNEL_NAME, ast_channel_name(), ast_channel_publish_snapshot(), ast_channel_state_set(), ast_copy_string(), AST_DEVICE_UNKNOWN, AST_DEVSTATE_CACHABLE, ast_devstate_changed_literal(), AST_DEVSTATE_NOT_CACHABLE, AST_FLAG_DISABLE_DEVSTATE_CACHE, ast_test_flag, and name.

Referenced by __analog_handle_event(), __analog_ss_thread(), __ast_read(), __dahdi_exception(), analog_answer(), analog_call(), analog_exception(), analog_ss_thread(), ast_raw_answer_with_stream_topology(), AST_TEST_DEFINE(), chan_pjsip_answer(), chan_pjsip_incoming_response(), console_answer(), dahdi_answer(), dahdi_call(), dahdi_handle_event(), dahdi_indicate(), dahdi_read(), handle_response_ciev(), iax2_call(), indicate_busy(), indicate_congestion(), jingle_action_session_info(), jingle_action_session_initiate(), jingle_call(), mbl_hangup(), my_set_waitingfordt(), onAlerting(), onProgress(), ooh323_answer(), ooh323_new(), refer_incoming_invite_request(), unistim_answer(), unistim_call(), unistim_new(), unistim_ss(), and unreal_queue_frame().

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

3200{
3201 return ast_settimeout_full(c, rate, func, data, 0);
3202}
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:3204

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

3205{
3206 int res;
3207 unsigned int real_rate = rate, max_rate;
3208
3210
3211 if (ast_channel_timingfd(c) == -1) {
3213 return -1;
3214 }
3215
3216 if (!func) {
3217 rate = 0;
3218 data = NULL;
3219 }
3220
3221 if (rate && rate > (max_rate = ast_timer_get_max_rate(ast_channel_timer(c)))) {
3222 real_rate = max_rate;
3223 }
3224
3225 ast_debug(3, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
3226
3227 res = ast_timer_set_rate(ast_channel_timer(c), real_rate);
3228
3231 }
3232
3235
3236 if (data && is_ao2_obj) {
3237 ao2_ref(data, 1);
3239 } else {
3241 }
3242
3243 if (func == NULL && rate == 0 && ast_channel_fdno(c) == AST_TIMING_FD) {
3244 /* Clearing the timing func and setting the rate to 0
3245 * means that we don't want to be reading from the timingfd
3246 * any more. Setting c->fdno to -1 means we won't have any
3247 * errant reads from the timingfd, meaning we won't potentially
3248 * miss any important frames.
3249 */
3251 }
3252
3254
3255 return res;
3256}
void ast_channel_timingdata_set(struct ast_channel *chan, void *value)
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 
)

◆ 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 a channel, don't lock.

Softly hangup up a channel (no channel lock)

Definition at line 2477 of file channel.c.

2478{
2479 ast_debug(1, "Soft-Hanging (%#04x) up channel '%s'\n", (unsigned)cause, ast_channel_name(chan));
2480 /* Inform channel driver that we need to be hung up, if it cares */
2483 /* Interrupt any poll call or such */
2485 pthread_kill(ast_channel_blocker(chan), SIGURG);
2486 return 0;
2487}

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 a symbolic hangup cause to number.

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

AST_THREADSTORAGE_RAW ( in_intercept_routine  )

Storage to determine if the current thread is running an intercept dialplan routine.

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

7623{
7624 int res;
7625
7626 if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
7627 return res;
7628
7629 /* Give us some wiggle room */
7630 while (ast_channel_generatordata(chan) && ast_waitfor(chan, 100) >= 0) {
7631 struct ast_frame *f = ast_read(chan);
7632 if (f)
7633 ast_frfree(f);
7634 else
7635 return -1;
7636 }
7637 return 0;
7638}
int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition: channel.c:7604

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

7605{
7606 struct tonepair_def d = { 0, };
7607
7608 d.freq1 = freq1;
7609 d.freq2 = freq2;
7610 d.duration = duration;
7611 d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
7612 if (ast_activate_generator(chan, &tonepair, &d))
7613 return -1;
7614 return 0;
7615}
static struct ast_generator tonepair
Definition: channel.c:7598
int duration
Definition: channel.c:7487

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

7618{
7620}

References ast_deactivate_generator().

Referenced by sendnoise().

◆ ast_transfer()

int ast_transfer ( struct ast_channel chan,
char *  dest 
)

Transfer a call to dest, if the channel supports transfer.

Transfer a channel (if supported).

Called by:

  • app_transfer
  • the manager interface

Definition at line 6504 of file channel.c.

6505{
6506 int protocol;
6507 return ast_transfer_protocol(chan, dest, &protocol);
6508}
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:6517

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 call to dest, if the channel supports transfer.

Transfer a channel (if supported) receieve protocol result.

Called by:

  • app_transfer
  • the manager interface

Definition at line 6517 of file channel.c.

6518{
6519 int res = -1;
6520
6521 if (protocol) {
6522 *protocol = 0;
6523 }
6524
6525 /* Stop if we're a zombie or need a soft hangup */
6526 ast_channel_lock(chan);
6528 if (ast_channel_tech(chan)->transfer) {
6529 res = ast_channel_tech(chan)->transfer(chan, dest);
6530 if (!res)
6531 res = 1;
6532 } else
6533 res = 0;
6534 }
6535 ast_channel_unlock(chan);
6536
6537 if (res <= 0) {
6538 return res;
6539 }
6540
6541 for (;;) {
6542 struct ast_frame *fr;
6543
6544 res = ast_waitfor(chan, -1);
6545
6546 if (res < 0 || !(fr = ast_read(chan))) {
6547 res = -1;
6548 break;
6549 }
6550
6553
6554 if (*message == AST_TRANSFER_SUCCESS) {
6555 res = 1;
6556 } else {
6557 res = -1;
6558 /* Message can contain a protocol specific code
6559 AST_TRANSFER_SUCCESS indicates success
6560 Else, failure. Protocol will be set to the failure reason.
6561 SIP example, 0 is success, else error code 3xx-6xx */
6562 if (protocol) {
6563 *protocol = *message;
6564 }
6565 }
6566
6567 ast_frfree(fr);
6568 break;
6569 }
6570
6571 ast_frfree(fr);
6572 }
6573
6574 return res;
6575}
static int transfer(void *data)
Definition: chan_pjsip.c:2132
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:803

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}

References ast_atomic_fetchadd_int(), and chancount.

Referenced by wait_for_channels_to_die().

◆ ast_uninstall_music_functions()

void ast_uninstall_music_functions ( void  )

Definition at line 7781 of file channel.c.

7782{
7786}

References ast_moh_cleanup_ptr, ast_moh_start_ptr, ast_moh_stop_ptr, and NULL.

Referenced by unload_module().

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

3182{
3183 if (ms < 0) {
3184 do {
3185 ms = 100000;
3186 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3187 } while (!ms);
3188 } else {
3189 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3190 }
3191 return ms;
3192}
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:3007

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

3177{
3178 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
3179}

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 
)

Wait for x amount of time on a file descriptor to have input.

Waits for input on an fd.

Definition at line 2999 of file channel.c.

3000{
3001 int winner = -1;
3002 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
3003 return winner;
3004}

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 
)

Wait for x amount of time on a file descriptor to have input.

Waits for activity on a group of channels.

Definition at line 3007 of file channel.c.

3009{
3010 struct timeval start = { 0 , 0 };
3011 struct pollfd *pfds = NULL;
3012 int res;
3013 long rms;
3014 int x, y, max;
3015 int sz = nfds;
3016 struct timeval now = { 0, 0 };
3017 struct timeval whentohangup = { 0, 0 }, diff;
3018 struct ast_channel *winner = NULL;
3019 struct fdmap {
3020 int chan;
3021 int fdno;
3022 } *fdmap = NULL;
3023
3024 if (outfd) {
3025 *outfd = -99999;
3026 }
3027 if (exception) {
3028 *exception = 0;
3029 }
3030
3031 for (x = 0; x < n; x++) {
3032 ast_channel_lock(c[x]);
3034 if (ast_tvzero(whentohangup))
3035 now = ast_tvnow();
3036 diff = ast_tvsub(*ast_channel_whentohangup(c[x]), now);
3037 if (diff.tv_sec < 0 || ast_tvzero(diff)) {
3038 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3039 /* Should already be hungup */
3042 return c[x];
3043 }
3044 if (ast_tvzero(whentohangup) || ast_tvcmp(diff, whentohangup) < 0)
3045 whentohangup = diff;
3046 }
3047 sz += ast_channel_fd_count(c[x]);
3049 }
3050
3051 if (!sz) {
3052 return NULL;
3053 }
3054
3055 pfds = ast_alloca(sizeof(*pfds) * sz);
3056 fdmap = ast_alloca(sizeof(*fdmap) * sz);
3057
3058 /* Wait full interval */
3059 rms = *ms;
3060 /* INT_MAX, not LONG_MAX, because it matters on 64-bit */
3061 if (!ast_tvzero(whentohangup) && whentohangup.tv_sec < INT_MAX / 1000) {
3062 rms = whentohangup.tv_sec * 1000 + whentohangup.tv_usec / 1000; /* timeout in milliseconds */
3063 if (*ms >= 0 && *ms < rms) { /* original *ms still smaller */
3064 rms = *ms;
3065 }
3066 } else if (!ast_tvzero(whentohangup) && rms < 0) {
3067 /* Tiny corner case... call would need to last >24 days */
3068 rms = INT_MAX;
3069 }
3070 /*
3071 * Build the pollfd array, putting the channels' fds first,
3072 * followed by individual fds. Order is important because
3073 * individual fd's must have priority over channel fds.
3074 */
3075 max = 0;
3076 for (x = 0; x < n; x++) {
3077 ast_channel_lock(c[x]);
3078 for (y = 0; y < ast_channel_fd_count(c[x]); y++) {
3079 fdmap[max].fdno = y; /* fd y is linked to this pfds */
3080 fdmap[max].chan = x; /* channel x is linked to this pfds */
3081 max += ast_add_fd(&pfds[max], ast_channel_fd(c[x], y));
3082 }
3083 CHECK_BLOCKING(c[x]);
3085 }
3086 /* Add the individual fds */
3087 for (x = 0; x < nfds; x++) {
3088 fdmap[max].chan = -1;
3089 max += ast_add_fd(&pfds[max], fds[x]);
3090 }
3091
3092 if (*ms > 0) {
3093 start = ast_tvnow();
3094 }
3095
3096 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
3097 do {
3098 int kbrms = rms;
3099 if (kbrms > 600000) {
3100 kbrms = 600000;
3101 }
3102 res = ast_poll(pfds, max, kbrms);
3103 if (!res) {
3104 rms -= kbrms;
3105 }
3106 } while (!res && (rms > 0));
3107 } else {
3108 res = ast_poll(pfds, max, rms);
3109 }
3110 for (x = 0; x < n; x++) {
3111 ast_channel_lock(c[x]);
3114 }
3115 if (res < 0) { /* Simulate a timeout if we were interrupted */
3116 if (errno != EINTR) {
3117 *ms = -1;
3118 }
3119 return NULL;
3120 }
3121 if (!ast_tvzero(whentohangup)) { /* if we have a timeout, check who expired */
3122 now = ast_tvnow();
3123 for (x = 0; x < n; x++) {
3125 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3127 if (winner == NULL) {
3128 winner = c[x];
3129 }
3130 }
3131 }
3132 }
3133 if (res == 0) { /* no fd ready, reset timeout and done */
3134 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
3135 return winner;
3136 }
3137 /*
3138 * Then check if any channel or fd has a pending event.
3139 * Remember to check channels first and fds last, as they
3140 * must have priority on setting 'winner'
3141 */
3142 for (x = 0; x < max; x++) {
3143 res = pfds[x].revents;
3144 if (res == 0) {
3145 continue;
3146 }
3147 if (fdmap[x].chan >= 0) { /* this is a channel */
3148 winner = c[fdmap[x].chan]; /* override previous winners */
3149 ast_channel_lock(winner);
3150 if (res & POLLPRI) {
3152 } else {
3154 }
3155 ast_channel_fdno_set(winner, fdmap[x].fdno);
3156 ast_channel_unlock(winner);
3157 } else { /* this is an fd */
3158 if (outfd) {
3159 *outfd = pfds[x].fd;
3160 }
3161 if (exception) {
3162 *exception = (res & POLLPRI) ? -1 : 0;
3163 }
3164 winner = NULL;
3165 }
3166 }
3167 if (*ms > 0) {
3168 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
3169 if (*ms < 0) {
3170 *ms = 0;
3171 }
3172 }
3173 return winner;
3174}
#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:2865
#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 3258 of file channel.c.

3259{
3260 struct timeval start = ast_tvnow();
3261 int ms;
3262
3263 /* Stop if we're a zombie or need a soft hangup */
3265 return -1;
3266
3267 /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
3269
3270 /* Wait for a digit, no more than timeout_ms milliseconds total.
3271 * Or, wait indefinitely if timeout_ms is <0.
3272 */
3273 while ((ms = ast_remaining_ms(start, timeout_ms))) {
3274 struct ast_channel *rchan;
3275 int outfd = -1;
3276
3277 errno = 0;
3278 /* While ast_waitfor_nandfds tries to help by reducing the timeout by how much was waited,
3279 * it is unhelpful if it waited less than a millisecond.
3280 */
3281 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
3282
3283 if (!rchan && outfd < 0 && ms) {
3284 if (errno == 0 || errno == EINTR)
3285 continue;
3286 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
3288 return -1;
3289 } else if (outfd > -1) {
3290 /* The FD we were watching has something waiting */
3291 ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
3293 return 1;
3294 } else if (rchan) {
3295 int res;
3296 struct ast_frame *f = ast_read(c);
3297
3298 if (!f) {
3300
3301 return -1;
3302 }
3303
3304 switch (f->frametype) {
3306 break;
3307 case AST_FRAME_DTMF_END:
3308 res = f->subclass.integer;
3309 if (!breakon || strchr(breakon, res)) {
3310 ast_frfree(f);
3312 return res;
3313 }
3314 break;
3315 case AST_FRAME_CONTROL:
3316 switch (f->subclass.integer) {
3317 case AST_CONTROL_HANGUP:
3318 ast_frfree(f);
3320 return -1;
3326 /* Fall-through and treat as if it were a DTMF signal. Items
3327 * that perform stream control will handle this. */
3328 res = f->subclass.integer;
3329 ast_frfree(f);
3331 return res;
3335 case AST_CONTROL_ANSWER:
3341 case AST_CONTROL_HOLD:
3342 case AST_CONTROL_UNHOLD:
3343 case AST_CONTROL_FLASH:
3344 case -1:
3345 /* Unimportant */
3346 break;
3347 default:
3348 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass.integer);
3349 break;
3350 }
3351 break;
3352 case AST_FRAME_VOICE:
3353 /* Write audio if appropriate */
3354 if (audiofd > -1) {
3355 if (write(audiofd, f->data.ptr, f->datalen) < 0) {
3356 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
3357 }
3358 }
3359 default:
3360 /* Ignore */
3361 break;
3362 }
3363 ast_frfree(f);
3364 }
3365 }
3366
3368
3369 return 0; /* Time is up */
3370}
@ AST_CONTROL_STREAM_RESTART
@ AST_CONTROL_STREAM_SUSPEND
@ AST_CONTROL_STREAM_REVERSE
@ AST_CONTROL_STREAM_STOP
@ AST_CONTROL_STREAM_FORWARD
@ AST_CONTROL_UPDATE_RTP_PEER

References ast_channel_clear_flag(), ast_channel_flags(), ast_channel_set_flag(), ast_check_hangup(), AST_CONTROL_ANSWER, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_PROGRESS, AST_CONTROL_PVT_CAUSE_CODE, AST_CONTROL_REDIRECTING, AST_CONTROL_RINGING, AST_CONTROL_SRCCHANGE, AST_CONTROL_SRCUPDATE, AST_CONTROL_STREAM_FORWARD, AST_CONTROL_STREAM_RESTART, AST_CONTROL_STREAM_REVERSE, AST_CONTROL_STREAM_STOP, AST_CONTROL_STREAM_SUSPEND, AST_CONTROL_UNHOLD, AST_CONTROL_UPDATE_RTP_PEER, AST_FLAG_END_DTMF_ONLY, AST_FLAG_ZOMBIE, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_VOICE, ast_frfree, ast_log, ast_read(), ast_remaining_ms(), ast_test_flag, ast_tvnow(), ast_waitfor_nandfds(), c, ast_frame::data, ast_frame::datalen, errno, ast_frame::frametype, ast_frame_subclass::integer, LOG_WARNING, NULL, ast_frame::ptr, and ast_frame::subclass.

Referenced by ast_readstring_full(), ast_waitfordigit(), handle_getoption(), handle_waitfordigit(), and pbx_builtin_waitdigit().

◆ ast_write()

int ast_write ( struct ast_channel chan,
struct ast_frame frame 
)

Write a frame to a channel This function writes the given frame to the indicated channel.

Parameters
chandestination channel of the frame
frameframe that will be written
Returns
It returns 0 on success, -1 on failure.

Definition at line 5163 of file channel.c.

5164{
5165 return ast_write_stream(chan, -1, fr);
5166}
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:5168

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

5169{
5170 struct ast_stream *stream = NULL, *default_stream = NULL;
5171 int res = -1;
5172 struct ast_frame *f = NULL;
5173 int count = 0;
5174 int hooked = 0;
5175
5176 /*Deadlock avoidance*/
5177 while(ast_channel_trylock(chan)) {
5178 /*cannot goto done since the channel is not locked*/
5179 if(count++ > 10) {
5180 ast_debug(1, "Deadlock avoided for write to channel '%s'\n", ast_channel_name(chan));
5181 return 0;
5182 }
5183 usleep(1);
5184 }
5185
5186 /* Stop if we're a zombie or need a soft hangup */
5188 goto done;
5189 }
5190
5191 if (stream_num >= 0) {
5192 /* If we were told to write to an explicit stream then allow this frame through, no matter
5193 * if the type is expected or not (a framehook could change)
5194 */
5196 goto done;
5197 }
5199 default_stream = ast_channel_get_default_stream(chan, ast_stream_get_type(stream));
5200 } else if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO || fr->frametype == AST_FRAME_MODEM) {
5201 /* If we haven't been told of a stream then we need to figure out which once we need */
5203
5204 /* Some frame types have a fixed media type */
5205 if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO) {
5207 } else if (fr->frametype == AST_FRAME_MODEM) {
5209 }
5210
5211 /* No stream was specified, so use the default one */
5212 stream = default_stream = ast_channel_get_default_stream(chan, type);
5213 }
5214
5215 /* Perform the framehook write event here. After the frame enters the framehook list
5216 * there is no telling what will happen, how awesome is that!!! */
5217 if ((stream == default_stream) && !(fr = ast_framehook_list_write_event(ast_channel_framehooks(chan), fr))) {
5218 res = 0;
5219 goto done;
5220 }
5221
5222 if (ast_channel_generatordata(chan) && (fr->frametype != AST_FRAME_RTCP) && (!fr->src || strcasecmp(fr->src, "ast_prod"))) {
5225 } else {
5226 if (fr->frametype == AST_FRAME_DTMF_END) {
5227 /* There is a generator running while we're in the middle of a digit.
5228 * It's probably inband DTMF, so go ahead and pass it so it can
5229 * stop the generator */
5230 ast_channel_unlock(chan);
5231 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5232 ast_channel_lock(chan);
5233 } else if (fr->frametype == AST_FRAME_CONTROL
5235 /*
5236 * This is a side case where Echo is basically being called
5237 * and the person put themselves on hold and took themselves
5238 * off hold.
5239 */
5241 fr->datalen);
5242 }
5243 res = 0; /* XXX explain, why 0 ? */
5244 goto done;
5245 }
5246 }
5247 /* High bit prints debugging */
5248 if (ast_channel_fout(chan) & DEBUGCHAN_FLAG)
5249 ast_frame_dump(ast_channel_name(chan), fr, ">>");
5250 switch (fr->frametype) {
5251 case AST_FRAME_CONTROL:
5253 res = 0;
5254 break;
5256 if (ast_channel_audiohooks(chan)) {
5257 struct ast_frame *old_frame = fr;
5259 if (old_frame != fr)
5260 f = fr;
5261 }
5263 ast_channel_unlock(chan);
5264 res = ast_senddigit_begin(chan, fr->subclass.integer);
5265 ast_channel_lock(chan);
5266 break;
5267 case AST_FRAME_DTMF_END:
5268 if (ast_channel_audiohooks(chan)) {
5269 struct ast_frame *new_frame = fr;
5270
5272 if (new_frame != fr) {
5273 ast_frfree(new_frame);
5274 }
5275 }
5277 ast_channel_unlock(chan);
5278 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5279 ast_channel_lock(chan);
5280 break;
5281 case AST_FRAME_TEXT:
5282 CHECK_BLOCKING(chan);
5284 res = (ast_channel_tech(chan)->write_text == NULL) ? 0 :
5285 ast_channel_tech(chan)->write_text(chan, fr);
5286 } else {
5287 res = (ast_channel_tech(chan)->send_text == NULL) ? 0 :
5288 ast_channel_tech(chan)->send_text(chan, (char *) fr->data.ptr);
5289 }
5291 break;
5292 case AST_FRAME_HTML:
5293 CHECK_BLOCKING(chan);
5294 res = (ast_channel_tech(chan)->send_html == NULL) ? 0 :
5295 ast_channel_tech(chan)->send_html(chan, fr->subclass.integer, (char *) fr->data.ptr, fr->datalen);
5297 break;
5298 case AST_FRAME_VIDEO:
5299 /* XXX Handle translation of video codecs one day XXX */
5300 CHECK_BLOCKING(chan);
5301 if (ast_channel_tech(chan)->write_stream) {
5302 if (stream) {
5303 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5304 } else {
5305 res = 0;
5306 }
5307 } else if ((stream == default_stream) && ast_channel_tech(chan)->write_video) {
5308 res = ast_channel_tech(chan)->write_video(chan, fr);
5309 } else {
5310 res = 0;
5311 }
5313 break;
5314 case AST_FRAME_MODEM:
5315 CHECK_BLOCKING(chan);
5316 res = tech_write(chan, stream, default_stream, fr);
5318 break;
5319 case AST_FRAME_VOICE:
5321 apply_plc(chan, fr);
5322 }
5323
5324 f = fr;
5325
5326 /*
5327 * Send frame to audiohooks if present, if frametype is linear (else, later as per
5328 * previous behavior)
5329 */
5330 if ((stream == default_stream) && ast_channel_audiohooks(chan)) {
5332 hooked = 1;
5334 }
5335 }
5336
5337 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
5338 if ((stream == default_stream) && ast_format_cmp(fr->subclass.format, ast_channel_rawwriteformat(chan)) != AST_FORMAT_CMP_EQUAL) {
5340 struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5341
5342 /*
5343 * We are not setup to write this frame. Things may have changed
5344 * on the peer side of the world and we try to adjust the format to
5345 * make it compatible again. However, bad things can happen if we
5346 * cannot setup a new translation path. Problems range from no
5347 * audio, one-way audio, to garbled audio. The best we can do is
5348 * request the call to hangup since we could not make it compatible.
5349 *
5350 * Being continuously spammed by this message likely indicates a
5351 * problem with the peer because it cannot make up its mind about
5352 * which format to use.
5353 */
5354 ast_debug(1, "Channel %s changing write format from %s to %s, native formats %s\n",
5355 ast_channel_name(chan),
5359 if (ast_set_write_format(chan, fr->subclass.format)) {
5360 /* Could not handle the new write format. Induce a hangup. */
5361 break;
5362 }
5363 }
5364
5365 if (ast_channel_writetrans(chan)) {
5366 struct ast_frame *trans_frame = ast_translate(ast_channel_writetrans(chan), f, 0);
5367 if (trans_frame != f && f != fr) {
5368 /*
5369 * If translate gives us a new frame and so did the audio
5370 * hook then we need to free the one from the audio hook.
5371 */
5372 ast_frfree(f);
5373 }
5374 f = trans_frame;
5375 }
5376 }
5377
5378 if (!f) {
5379 res = 0;
5380 break;
5381 }
5382
5383 if ((stream == default_stream) && ast_channel_audiohooks(chan) && !hooked) {
5384 struct ast_frame *prev = NULL, *new_frame, *cur, *dup;
5385 int freeoldlist = 0;
5386
5387 if (f != fr) {
5388 freeoldlist = 1;
5389 }
5390
5391 /* Since ast_audiohook_write may return a new frame, and the cur frame is
5392 * an item in a list of frames, create a new list adding each cur frame back to it
5393 * regardless if the cur frame changes or not. */
5394 for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
5396
5397 /* if this frame is different than cur, preserve the end of the list,
5398 * free the old frames, and set cur to be the new frame */
5399 if (new_frame != cur) {
5400
5401 /* doing an ast_frisolate here seems silly, but we are not guaranteed the new_frame
5402 * isn't part of local storage, meaning if ast_audiohook_write is called multiple
5403 * times it may override the previous frame we got from it unless we dup it */
5404 if ((dup = ast_frisolate(new_frame))) {
5406 if (freeoldlist) {
5408 ast_frfree(cur);
5409 }
5410 if (new_frame != dup) {
5411 ast_frfree(new_frame);
5412 }
5413 cur = dup;
5414 }
5415 }
5416
5417 /* now, regardless if cur is new or not, add it to the new list,
5418 * if the new list has not started, cur will become the first item. */
5419 if (prev) {
5420 AST_LIST_NEXT(prev, frame_list) = cur;
5421 } else {
5422 f = cur; /* set f to be the beginning of our new list */
5423 }
5424 prev = cur;
5425 }
5426 }
5427
5428 /* the translator on chan->writetrans may have returned multiple frames
5429 from the single frame we passed in; if so, feed each one of them to the
5430 channel, freeing each one after it has been written */
5431 CHECK_BLOCKING(chan);
5432 if ((f != fr) && AST_LIST_NEXT(f, frame_list)) {
5433 struct ast_frame *cur, *next = NULL;
5434 unsigned int skip = 0;
5435
5436 cur = f;
5437 while (cur) {
5440 if (!skip) {
5441 res = tech_write(chan, stream, default_stream, cur);
5442 if (res < 0) {
5444 skip = 1;
5445 } else if (next) {
5446 /* don't do this for the last frame in the list,
5447 as the code outside the loop will do it once
5448 */
5450 }
5451 }
5452 ast_frfree(cur);
5453 cur = next;
5454 }
5455
5456 /* reset f so the code below doesn't attempt to free it */
5457 f = NULL;
5458 } else {
5459 res = tech_write(chan, stream, default_stream, f);
5460 }
5462 break;
5463 case AST_FRAME_NULL:
5464 case AST_FRAME_IAX:
5465 /* Ignore these */
5466 res = 0;
5467 break;
5468 case AST_FRAME_RTCP:
5469 /* RTCP information is on a per-stream basis and only available on multistream capable channels */
5470 CHECK_BLOCKING(chan);
5471 if (ast_channel_tech(chan)->write_stream && stream) {
5472 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5473 } else {
5474 res = 0;
5475 }
5477 break;
5478 default:
5479 /* At this point, fr is the incoming frame and f is NULL. Channels do
5480 * not expect to get NULL as a frame pointer and will segfault. Hence,
5481 * we output the original frame passed in. */
5482 CHECK_BLOCKING(chan);
5483 res = ast_channel_tech(chan)->write(chan, fr);
5485 break;
5486 }
5487
5488 if (f && f != fr)
5489 ast_frfree(f);
5490
5491 /* Consider a write failure to force a soft hangup */
5492 if (res < 0) {
5494 } else {
5496 }
5497done:
5499 /* The list gets recreated if audiohooks are added again later */
5502 }
5503 ast_channel_unlock(chan);
5504 return res;
5505}
@ AST_AUDIOHOOK_DIRECTION_WRITE
Definition: audiohook.h:50
static int tech_write(struct ast_channel *chan, struct ast_stream *stream, struct ast_stream *default_stream, struct ast_frame *frame)
Definition: channel.c:5151
static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
Definition: channel.c:5125
#define ast_channel_trylock(chan)
Definition: channel.h:2970
unsigned int ast_channel_fout(const struct ast_channel *chan)
@ AST_FLAG_WRITE_INT
Definition: channel.h:1003
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
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:324
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
static void write_stream(struct ogg_vorbis_desc *s, FILE *f)
Write out any pending encoded data.
int ast_stream_topology_get_count(const struct ast_stream_topology *topology)
Get the number of streams in a topology.
Definition: stream.c:768
enum ast_media_type ast_stream_get_type(const struct ast_stream *stream)
Get the media type of a stream.
Definition: stream.c:316
#define ast_str_alloca(init_len)
Definition: strings.h:848
int(*const write)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format (see frame.h)
Definition: channel.h:770
int(*const write_stream)(struct ast_channel *chan, int stream_num, struct ast_frame *frame)
Write a frame on a specific stream, in standard format (see frame.h)
Definition: channel.h:773
int(*const write_video)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format.
Definition: channel.h:806
struct ast_frame * next
const char * src
Support for dynamic strings.
Definition: strings.h:623

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

5037{
5038 int res;
5039 if (!ast_channel_tech(chan)->write_video)
5040 return 0;
5041 res = ast_write(chan, fr);
5042 if (!res)
5043 res = 1;
5044 return res;
5045}

References ast_channel_tech(), and ast_write().

◆ calc_monitor_jump()

static int calc_monitor_jump ( int  samples,
int  sample_rate,
int  seek_rate 
)
inlinestatic

calculates the number of samples to jump forward with in a monitor stream.

Note
When using ast_seekstream() with the read and write streams of a monitor, the number of samples to seek forward must be of the same sample rate as the stream or else the jump will not be calculated correctly.
Return values
numberof samples to seek forward after rate conversion.

Definition at line 3531 of file channel.c.

3532{
3533 int diff = sample_rate - seek_rate;
3534
3535 if (diff > 0) {
3536 samples = samples / (float) (sample_rate / seek_rate);
3537 } else if (diff < 0) {
3538 samples = samples * (float) (seek_rate / sample_rate);
3539 }
3540
3541 return samples;
3542}

References ast_frame::samples.

◆ call_forward_inherit()

static void call_forward_inherit ( struct ast_channel new_chan,
struct ast_channel parent,
struct ast_channel orig 
)
static

Definition at line 5889 of file channel.c.

5890{
5892 struct ast_party_redirecting redirecting;
5893
5894 /*
5895 * The parent is not a ZOMBIE or hungup so update it with the
5896 * original channel's redirecting information.
5897 */
5898 ast_party_redirecting_init(&redirecting);
5902 if (ast_channel_redirecting_sub(orig, parent, &redirecting, 0)) {
5903 ast_channel_update_redirecting(parent, &redirecting, NULL);
5904 }
5905 ast_party_redirecting_free(&redirecting);
5906 }
5907
5908 /* Safely inherit variables and datastores from the parent channel. */
5909 ast_channel_lock_both(parent, new_chan);
5910 ast_channel_inherit_variables(parent, new_chan);
5911 ast_channel_datastore_inherit(parent, new_chan);
5913 ast_channel_unlock(new_chan);
5914 ast_channel_unlock(parent);
5915}
int ast_channel_redirecting_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *redirecting_info, int is_frame)
Run a redirecting interception subroutine and update a channel's redirecting information.
Definition: channel.c:10405

References ast_channel_datastore_inherit(), ast_channel_flags(), ast_channel_inherit_variables(), ast_channel_lock, ast_channel_lock_both, ast_channel_redirecting(), ast_channel_redirecting_sub(), ast_channel_unlock, ast_channel_update_redirecting(), ast_check_hangup(), AST_FLAG_ZOMBIE, ast_max_forwards_decrement(), ast_party_redirecting_copy(), ast_party_redirecting_free(), ast_party_redirecting_init(), ast_test_flag, NULL, and ast_party_redirecting::orig.

Referenced by ast_call_forward().

◆ channel_cc_params_copy()

static void * channel_cc_params_copy ( void *  data)
static

Definition at line 10450 of file channel.c.

10451{
10452 const struct ast_cc_config_params *src = data;
10454 if (!dest) {
10455 return NULL;
10456 }
10457 ast_cc_copy_config_params(dest, src);
10458 return dest;
10459}

References ast_cc_config_params_init, ast_cc_copy_config_params(), and NULL.

◆ channel_cc_params_destroy()

static void channel_cc_params_destroy ( void *  data)
static

Definition at line 10461 of file channel.c.

10462{
10463 struct ast_cc_config_params *cc_params = data;
10465}

References ast_cc_config_params_destroy().

◆ channel_do_masquerade()

static void channel_do_masquerade ( struct ast_channel original,
struct ast_channel clonechan 
)
static

Masquerade a channel.

Note
Assumes NO channels and NO channel pvt's are locked. If a channel is locked while calling this function, it invalidates our channel container locking order. All channels must be unlocked before it is permissible to lock the channels' ao2 container.

Definition at line 6876 of file channel.c.

6877{
6878 int x;
6879 int origstate;
6880 unsigned int orig_disablestatecache;
6881 unsigned int clone_disablestatecache;
6882 int generator_fd;
6883 int visible_indication;
6884 int clone_hold_state;
6885 int moh_is_playing;
6886 struct ast_frame *current;
6887 const struct ast_channel_tech *t;
6888 void *t_pvt;
6889 union {
6891 struct ast_party_dialed dialed;
6892 struct ast_party_caller caller;
6894 struct ast_party_redirecting redirecting;
6895 } exchange;
6896 struct ast_channel *bridged;
6897 struct ast_format *rformat;
6898 struct ast_format *wformat;
6899 struct ast_format *tmp_format;
6900 struct ast_format_cap *tmp_cap;
6901 char tmp_name[AST_CHANNEL_NAME];
6902 char clone_sending_dtmf_digit;
6903 struct timeval clone_sending_dtmf_tv;
6904
6905 /* XXX This operation is a bit odd. We're essentially putting the guts of
6906 * the clone channel into the original channel. Start by killing off the
6907 * original channel's backend. While the features are nice, which is the
6908 * reason we're keeping it, it's still awesomely weird. XXX */
6909
6910 /* Indicate to each channel that a masquerade is about to begin. */
6911 x = 1;
6912 ast_indicate_data(original, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
6913 ast_indicate_data(clonechan, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
6914
6915 /*
6916 * The container lock is necessary for proper locking order
6917 * because the channels must be unlinked to change their
6918 * names.
6919 *
6920 * The original and clonechan locks must be held while the
6921 * channel contents are shuffled around for the masquerade.
6922 *
6923 * The masq and masqr pointers need to be left alone until the masquerade
6924 * has restabilized the channels to hold off ast_hangup() and until
6925 * AST_FLAG_ZOMBIE can be set on the clonechan.
6926 */
6928
6929 /* Bump the refs to ensure that they won't dissapear on us. */
6930 ast_channel_ref(original);
6931 ast_channel_ref(clonechan);
6932
6933 /* unlink from channels container as name (which is the hash value) will change */
6934 ao2_unlink(channels, original);
6935 ao2_unlink(channels, clonechan);
6936
6937 moh_is_playing = ast_test_flag(ast_channel_flags(original), AST_FLAG_MOH);
6938 if (moh_is_playing) {
6939 /* Stop MOH on the old original channel. */
6940 ast_moh_stop(original);
6941 }
6942
6943 /*
6944 * Stop any visible indication on the original channel so we can
6945 * transfer it to the clonechan taking the original's place.
6946 */
6947 ast_channel_lock(original);
6948 visible_indication = ast_channel_visible_indication(original);
6949 ast_channel_unlock(original);
6950 ast_indicate(original, -1);
6951
6952 /* Start the masquerade channel contents rearrangement. */
6953 ast_channel_lock_both(original, clonechan);
6954
6955 ast_debug(1, "Actually Masquerading %s(%u) into the structure of %s(%u)\n",
6956 ast_channel_name(clonechan), ast_channel_state(clonechan),
6957 ast_channel_name(original), ast_channel_state(original));
6958
6959 /* When all is said and done force new snapshot segments so they are
6960 * up to date.
6961 */
6964
6965 /*
6966 * Remember the original read/write formats. We turn off any
6967 * translation on either one
6968 */
6969 rformat = ao2_bump(ast_channel_readformat(original));
6970 wformat = ao2_bump(ast_channel_writeformat(original));
6971 free_translation(clonechan);
6972 free_translation(original);
6973
6974 clone_hold_state = ast_channel_hold_state(clonechan);
6975
6976 /* Save the current DTMF digit being sent if any. */
6977 clone_sending_dtmf_digit = ast_channel_sending_dtmf_digit(clonechan);
6978 clone_sending_dtmf_tv = ast_channel_sending_dtmf_tv(clonechan);
6979
6980 /* Swap uniqueid's of the channels. This needs to happen before channel renames,
6981 * so rename events get the proper id's.
6982 */
6984
6985 /* Make sure the Stasis topic on the channel is updated appropriately */
6986 ast_channel_internal_swap_topics(clonechan, original);
6987
6988 /* Swap endpoint forward so channel created with endpoint exchanges its state
6989 * with other channel for proper endpoint cleanup.
6990 */
6991 ast_channel_internal_swap_endpoint_forward(clonechan, original);
6992
6993 /* The old snapshots need to follow the channels so the snapshot update is correct */
6994 ast_channel_internal_swap_snapshots(clonechan, original);
6995
6996 /* Swap channel names. This uses ast_channel_name_set directly, so we
6997 * don't get any spurious rename events.
6998 */
6999 ast_copy_string(tmp_name, ast_channel_name(clonechan), sizeof(tmp_name));
7000 ast_channel_name_set(clonechan, ast_channel_name(original));
7001 ast_channel_name_set(original, tmp_name);
7002
7003 /* Swap the technologies */
7004 t = ast_channel_tech(original);
7005 ast_channel_tech_set(original, ast_channel_tech(clonechan));
7006 ast_channel_tech_set(clonechan, t);
7007
7008 t_pvt = ast_channel_tech_pvt(original);
7009 ast_channel_tech_pvt_set(original, ast_channel_tech_pvt(clonechan));
7010 ast_channel_tech_pvt_set(clonechan, t_pvt);
7011
7012 /* Swap the alertpipes */
7013 ast_channel_internal_alertpipe_swap(original, clonechan);
7014
7015 /*
7016 * Swap the readq's. The end result should be this:
7017 *
7018 * 1) All frames should be on the new (original) channel.
7019 * 2) Any frames that were already on the new channel before this
7020 * masquerade need to be at the end of the readq, after all of the
7021 * frames on the old (clone) channel.
7022 * 3) The alertpipe needs to get poked for every frame that was already
7023 * on the new channel, since we are now using the alert pipe from the
7024 * old (clone) channel.
7025 */
7026 {
7027 AST_LIST_HEAD_NOLOCK(, ast_frame) tmp_readq;
7028
7029 AST_LIST_HEAD_INIT_NOLOCK(&tmp_readq);
7030 AST_LIST_APPEND_LIST(&tmp_readq, ast_channel_readq(original), frame_list);
7032
7033 while ((current = AST_LIST_REMOVE_HEAD(&tmp_readq, frame_list))) {
7035 if (ast_channel_alert_write(original)) {
7036 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
7037 }
7038 }
7039 }
7040
7041 /* Swap the raw formats */
7042 tmp_format = ao2_bump(ast_channel_rawreadformat(original));
7044 ast_channel_set_rawreadformat(clonechan, tmp_format);
7045 ao2_cleanup(tmp_format);
7046
7047 tmp_format = ao2_bump(ast_channel_rawwriteformat(original));
7049 ast_channel_set_rawwriteformat(clonechan, tmp_format);
7050 ao2_cleanup(tmp_format);
7051
7053
7054 /* And of course, so does our current state. Note we need not
7055 call ast_setstate since the event manager doesn't really consider
7056 these separate. We do this early so that the clone has the proper
7057 state of the original channel. */
7058 origstate = ast_channel_state(original);
7059 ast_channel_state_set(original, ast_channel_state(clonechan));
7060 ast_channel_state_set(clonechan, origstate);
7061
7062 /* And the swap the cachable state too. Otherwise we'd start caching
7063 * Local channels and ignoring real ones. */
7064 orig_disablestatecache = ast_test_flag(ast_channel_flags(original), AST_FLAG_DISABLE_DEVSTATE_CACHE);
7065 clone_disablestatecache = ast_test_flag(ast_channel_flags(clonechan), AST_FLAG_DISABLE_DEVSTATE_CACHE);
7066 if (orig_disablestatecache != clone_disablestatecache) {
7067 if (orig_disablestatecache) {
7070 } else {
7073 }
7074 }
7075
7076 /* Keep the same language. */
7077 ast_channel_language_set(original, ast_channel_language(clonechan));
7078
7079 /* Keep the same parkinglot. */
7080 ast_channel_parkinglot_set(original, ast_channel_parkinglot(clonechan));
7081
7082 /* Clear all existing file descriptors but retain the generator */
7083 generator_fd = ast_channel_fd(original, AST_GENERATOR_FD);
7085 ast_channel_set_fd(original, AST_GENERATOR_FD, generator_fd);
7086
7087 /* Copy all file descriptors present on clonechan to original, skipping generator */
7088 for (x = 0; x < ast_channel_fd_count(clonechan); x++) {
7089 if (x != AST_GENERATOR_FD)
7090 ast_channel_set_fd(original, x, ast_channel_fd(clonechan, x));
7091 }
7092
7093 ast_app_group_update(clonechan, original);
7094
7095 /* Swap hangup handlers. */
7096 exchange.handlers = *ast_channel_hangup_handlers(original);
7098 *ast_channel_hangup_handlers(clonechan) = exchange.handlers;
7099
7100 /* Call fixup handlers for the clone chan */
7101 if (AST_LIST_FIRST(ast_channel_datastores(clonechan))) {
7102 struct ast_datastore *ds;
7103 /* We use a safe traversal here because some fixup routines actually
7104 * remove the datastore from the list and free them.
7105 */
7107 if (ds->info->chan_fixup) {
7108 ds->info->chan_fixup(ds->data, clonechan, original);
7109 }
7110 }
7112 }
7113
7114 /* Call breakdown handlers for the original chan */
7115 if (AST_LIST_FIRST(ast_channel_datastores(original))) {
7116 struct ast_datastore *ds;
7117 /* We use a safe traversal here because some breakdown routines may
7118 * remove the datastore from the list and free them.
7119 */
7121 if (ds->info->chan_breakdown) {
7122 ds->info->chan_breakdown(ds->data, clonechan, original);
7123 }
7124 }
7126 }
7127
7128 /* Move data stores over */
7129 if (AST_LIST_FIRST(ast_channel_datastores(clonechan))) {
7131 }
7132
7133 /* Move framehooks over */
7134 ast_framehook_list_fixup(clonechan, original);
7135
7136 /* Move audiohooks over */
7137 ast_audiohook_move_all(clonechan, original);
7138
7139 ast_autochan_new_channel(clonechan, original);
7140
7141 clone_variables(original, clonechan);
7142 /* Presense of ADSI capable CPE follows clone */
7143 ast_channel_adsicpe_set(original, ast_channel_adsicpe(clonechan));
7144 /* Bridge remains the same */
7145 /* CDR fields remain the same */
7146 /* XXX What about blocking, softhangup, blocker, and lock and blockproc? XXX */
7147 /* Application and data remain the same */
7148 /* Clone exception becomes real one, as with fdno */
7150 ast_channel_fdno_set(original, ast_channel_fdno(clonechan));
7151 /* Schedule context remains the same */
7152 /* Stream stuff stays the same */
7153 /* Keep the original state. The fixup code will need to work with it most likely */
7154
7155 /*
7156 * Just swap the whole structures, nevermind the allocations,
7157 * they'll work themselves out.
7158 */
7159 exchange.dialed = *ast_channel_dialed(original);
7160 ast_channel_dialed_set(original, ast_channel_dialed(clonechan));
7161 ast_channel_dialed_set(clonechan, &exchange.dialed);
7162
7163 /* Reset any earlier private caller id representations */
7164 ast_party_id_reset(&ast_channel_caller(original)->priv);
7165 ast_party_id_reset(&ast_channel_caller(clonechan)->priv);
7166
7167 exchange.caller = *ast_channel_caller(original);
7168 ast_channel_caller_set(original, ast_channel_caller(clonechan));
7169 ast_channel_caller_set(clonechan, &exchange.caller);
7170
7171 /* Reset any earlier private connected id representations */
7172 ast_party_id_reset(&ast_channel_connected(original)->priv);
7173 ast_party_id_reset(&ast_channel_connected(clonechan)->priv);
7174
7175 exchange.connected = *ast_channel_connected(original);
7177 ast_channel_connected_set(clonechan, &exchange.connected);
7178
7179 /* Reset any earlier private redirecting orig, from or to representations */
7180 ast_party_id_reset(&ast_channel_redirecting(original)->priv_orig);
7181 ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_orig);
7182 ast_party_id_reset(&ast_channel_redirecting(original)->priv_from);
7183 ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_from);
7184 ast_party_id_reset(&ast_channel_redirecting(original)->priv_to);
7185 ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_to);
7186
7187 exchange.redirecting = *ast_channel_redirecting(original);
7189 ast_channel_redirecting_set(clonechan, &exchange.redirecting);
7190
7192
7193 /* Restore original timing file descriptor */
7195
7196 /* Our native formats are different now */
7198 if (tmp_cap) {
7200 ast_channel_nativeformats_set(original, tmp_cap);
7201 ao2_ref(tmp_cap, -1);
7202 }
7203
7204 /* Context, extension, priority, app data, jump table, remain the same */
7205 /* pvt switches. pbx stays the same, as does next */
7206
7207 /* Set the write format */
7208 ast_set_write_format(original, wformat);
7209
7210 /* Set the read format */
7211 ast_set_read_format(original, rformat);
7212
7213 /* Copy the music class */
7214 ast_channel_musicclass_set(original, ast_channel_musicclass(clonechan));
7215
7216 /* copy over accuntcode and set peeraccount across the bridge */
7217 ast_channel_accountcode_set(original, S_OR(ast_channel_accountcode(clonechan), ""));
7218
7219 /* copy over userfield */
7220 ast_channel_userfield_set(original, ast_channel_userfield(clonechan));
7221
7222 ast_debug(1, "Putting channel %s in %s/%s formats\n", ast_channel_name(original),
7223 ast_format_get_name(wformat), ast_format_get_name(rformat));
7224
7225 /* Fixup the original clonechan's physical side */
7226 if (ast_channel_tech(original)->fixup && ast_channel_tech(original)->fixup(clonechan, original)) {
7227 ast_log(LOG_WARNING, "Channel type '%s' could not fixup channel %s, strange things may happen. (clonechan)\n",
7228 ast_channel_tech(original)->type, ast_channel_name(original));
7229 }
7230
7231 /* Fixup the original original's physical side */
7232 if (ast_channel_tech(clonechan)->fixup && ast_channel_tech(clonechan)->fixup(original, clonechan)) {
7233 ast_log(LOG_WARNING, "Channel type '%s' could not fixup channel %s, strange things may happen. (original)\n",
7234 ast_channel_tech(clonechan)->type, ast_channel_name(clonechan));
7235 }
7236
7237 ast_channel_internal_swap_stream_topology(original, clonechan);
7238
7239 /*
7240 * Now, at this point, the "clone" channel is totally F'd up.
7241 * We mark it as a zombie so nothing tries to touch it.
7242 *
7243 * This must be done before we unlock clonechan to prevent
7244 * setting up another masquerade on the clonechan.
7245 */
7247 ast_queue_frame(clonechan, &ast_null_frame);
7248
7249 ast_channel_unlock(original);
7250 ast_channel_unlock(clonechan);
7251
7252 /*
7253 * Indicate to each channel that a masquerade is complete.
7254 *
7255 * We can still do this to clonechan even though it is a
7256 * zombie because ast_indicate_data() will explicitly pass
7257 * this control and ast_hangup() is held off until the
7258 * ast_channel_masq() and ast_channel_masqr() pointers are
7259 * cleared.
7260 */
7261 x = 0;
7262 ast_indicate_data(original, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
7263 ast_indicate_data(clonechan, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
7264
7266
7267 if (clone_hold_state == AST_CONTROL_HOLD) {
7268 ast_debug(1, "Channel %s simulating UNHOLD for masquerade.\n",
7269 ast_channel_name(original));
7271 }
7272 if (clone_sending_dtmf_digit) {
7273 /*
7274 * The clonechan was sending a DTMF digit that was not completed
7275 * before the masquerade.
7276 */
7277 ast_channel_end_dtmf(original, clone_sending_dtmf_digit, clone_sending_dtmf_tv,
7278 "masquerade");
7279 }
7280
7281 /*
7282 * If an indication is currently playing, maintain it on the
7283 * channel that is taking the place of original.
7284 *
7285 * This is needed because the masquerade is swapping out the
7286 * internals of the channel, and the new channel private data
7287 * needs to be made aware of the current visible indication
7288 * (RINGING, CONGESTION, etc.)
7289 */
7290 if (visible_indication) {
7291 if (visible_indication == AST_CONTROL_HOLD) {
7292 const char *latest_musicclass;
7293 int len;
7294
7295 ast_channel_lock(original);
7296 latest_musicclass = ast_strdupa(ast_channel_latest_musicclass(original));
7297 ast_channel_unlock(original);
7298 if (ast_strlen_zero(latest_musicclass)) {
7299 latest_musicclass = NULL;
7300 len = 0;
7301 } else {
7302 len = strlen(latest_musicclass) + 1;
7303 }
7304 ast_indicate_data(original, visible_indication, latest_musicclass, len);
7305 } else {
7306 ast_indicate(original, visible_indication);
7307 }
7308 }
7309
7310 /*
7311 * If MOH was playing on the original channel then it needs to be
7312 * maintained on the channel that is replacing it.
7313 */
7314 if (moh_is_playing) {
7315 /* Start MOH on the new original channel. */
7316 ast_moh_start(original, NULL, NULL);
7317 }
7318
7319 ast_channel_lock(original);
7320
7321 /* Signal any blocker */
7323 pthread_kill(ast_channel_blocker(original), SIGURG);
7324 }
7325
7326 ast_debug(1, "Done Masquerading %s (%u)\n", ast_channel_name(original), ast_channel_state(original));
7327 ast_channel_unlock(original);
7328
7329 if ((bridged = ast_channel_bridge_peer(original))) {
7331 ast_channel_unref(bridged);
7332 }
7334
7335 /* Now that the operation is complete, we can clear the masq
7336 * and masqr fields of both channels.
7337 */
7338 ast_channel_lock_both(original, clonechan);
7339 ast_channel_masq_set(original, NULL);
7340 ast_channel_masqr_set(clonechan, NULL);
7341 ast_channel_unlock(original);
7342 ast_channel_unlock(clonechan);
7343
7344 ao2_link(channels, clonechan);
7345 ao2_link(channels, original);
7347
7348 /* Release our held safety references. */
7349 ast_channel_unref(original);
7350 ast_channel_unref(clonechan);
7351
7352 ao2_cleanup(rformat);
7353 ao2_cleanup(wformat);
7354}
void ast_audiohook_move_all(struct ast_channel *old_chan, struct ast_channel *new_chan)
Move all audiohooks from one channel to another.
Definition: audiohook.c:700
void ast_autochan_new_channel(struct ast_channel *old_chan, struct ast_channel *new_chan)
Switch what channel autochans point to.
Definition: autochan.c:86
void ast_bridge_notify_masquerade(struct ast_channel *chan)
Notify bridging that this channel was just masqueraded.
Definition: bridge.c:1442
void ast_channel_end_dtmf(struct ast_channel *chan, char digit, struct timeval start, const char *why)
Simulate a DTMF end on a broken bridge channel.
Definition: channel.c:10891
static void clone_variables(struct ast_channel *original, struct ast_channel *clonechan)
Clone channel variables from 'clone' channel into 'original' channel.
Definition: channel.c:6841
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
Definition: channel.c:7788
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
Definition: channel.c:7798
void ast_party_id_reset(struct ast_party_id *id)
Destroy and initialize the given party id structure.
Definition: channel.c:1915
void ast_channel_internal_alertpipe_swap(struct ast_channel *chan1, struct ast_channel *chan2)
Swap the interal alertpipe between two channels.
void ast_channel_caller_set(struct ast_channel *chan, struct ast_party_caller *value)
void ast_channel_dialed_set(struct ast_channel *chan, struct ast_party_dialed *value)
const char * ast_channel_latest_musicclass(const struct ast_channel *chan)
struct ast_flags * ast_channel_snapshot_segment_flags(struct ast_channel *chan)
void ast_channel_internal_swap_endpoint_forward(struct ast_channel *a, struct ast_channel *b)
Swap endpoint_forward between two channels.
const char * ast_channel_musicclass(const struct ast_channel *chan)
struct timeval ast_channel_sending_dtmf_tv(const struct ast_channel *chan)
void ast_channel_redirecting_set(struct ast_channel *chan, struct ast_party_redirecting *value)
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2993
void ast_channel_softhangup_internal_flag_set(struct ast_channel *chan, int value)
const char * ast_channel_userfield(const struct ast_channel *chan)
const char * ast_channel_parkinglot(const struct ast_channel *chan)
ast_channel_adsicpe
Definition: channel.h:888
void ast_channel_internal_swap_topics(struct ast_channel *a, struct ast_channel *b)
Swap topics beteween two channels.
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
void ast_channel_internal_swap_uniqueid_and_linkedid(struct ast_channel *a, struct ast_channel *b)
Swap uniqueid and linkedid beteween two channels.
int ast_channel_hold_state(const struct ast_channel *chan)
const char * ast_channel_language(const struct ast_channel *chan)
void ast_channel_connected_set(struct ast_channel *chan, struct ast_party_connected_line *value)
void ast_channel_internal_swap_snapshots(struct ast_channel *a, struct ast_channel *b)
Swap snapshots beteween two channels.
@ AST_FLAG_MOH
Definition: channel.h:1011
int ast_channel_visible_indication(const struct ast_channel *chan)
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
void ast_channel_adsicpe_set(struct ast_channel *chan, enum ast_channel_adsicpe value)
void ast_channel_internal_swap_stream_topology(struct ast_channel *chan1, struct ast_channel *chan2)
int ast_format_cap_append_from_cap(struct ast_format_cap *dst, const struct ast_format_cap *src, enum ast_media_type type)
Append the formats of provided type in src to dst.
Definition: format_cap.c:269
void ast_framehook_list_fixup(struct ast_channel *old_chan, struct ast_channel *new_chan)
This is used by the channel API during a masquerade operation to move all mobile framehooks from the ...
Definition: framehook.c:223
int ast_app_group_update(struct ast_channel *oldchan, struct ast_channel *newchan)
Update all group counting for a channel to a new one.
Definition: main/app.c:2300
void(* chan_fixup)(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
Fix up channel references on the masquerading channel.
Definition: datastore.h:48
void(* chan_breakdown)(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
Fix up channel references on the channel being masqueraded into.
Definition: datastore.h:60
Caller Party information.
Definition: channel.h:420
Dialed/Called Party information.
Definition: channel.h:380
static const struct ast_aeap_message_handler handlers[]
Definition: test_aeap.c:135
#define AST_FLAGS_ALL
Definition: utils.h:196

References ao2_bump, ao2_cleanup, ao2_link, ao2_lock, ao2_ref, ao2_unlink, ao2_unlock, ast_app_group_update(), ast_audiohook_move_all(), ast_autochan_new_channel(), ast_bridge_notify_masquerade(), ast_channel_accountcode(), ast_channel_adsicpe_set(), ast_channel_alert_write(), ast_channel_blocker(), ast_channel_bridge_peer(), ast_channel_caller(), ast_channel_caller_set(), ast_channel_connected(), ast_channel_connected_set(), ast_channel_datastores(), ast_channel_dialed(), ast_channel_dialed_set(), ast_channel_end_dtmf(), ast_channel_fd(), ast_channel_fd_count(), ast_channel_fdno(), ast_channel_fdno_set(), ast_channel_flags(), ast_channel_hangup_handlers(), ast_channel_hold_state(), ast_channel_internal_alertpipe_swap(), ast_channel_internal_fd_clear_all(), ast_channel_internal_swap_endpoint_forward(), ast_channel_internal_swap_snapshots(), ast_channel_internal_swap_stream_topology(), ast_channel_internal_swap_topics(), ast_channel_internal_swap_uniqueid_and_linkedid(), ast_channel_language(), ast_channel_latest_musicclass(), ast_channel_lock, ast_channel_lock_both, ast_channel_masq_set(), ast_channel_masqr_set(), ast_channel_musicclass(), AST_CHANNEL_NAME, ast_channel_name(), ast_channel_nativeformats(), ast_channel_nativeformats_set(), ast_channel_parkinglot(), ast_channel_publish_snapshot(), ast_channel_rawreadformat(), ast_channel_rawwriteformat(), ast_channel_readformat(), ast_channel_readq(), ast_channel_redirecting(), ast_channel_redirecting_set(), ast_channel_ref, ast_channel_sending_dtmf_digit(), ast_channel_sending_dtmf_tv(), ast_channel_set_fd(), ast_channel_set_rawreadformat(), ast_channel_set_rawwriteformat(), ast_channel_snapshot_segment_flags(), ast_channel_softhangup_internal_flag_set(), ast_channel_state_set(), ast_channel_tech(), ast_channel_tech_pvt(), ast_channel_tech_pvt_set(), ast_channel_tech_set(), ast_channel_timingfd(), ast_channel_unlock, ast_channel_unref, ast_channel_userfield(), ast_channel_visible_indication(), ast_channel_writeformat(), ast_clear_flag, AST_CONTROL_HOLD, AST_CONTROL_MASQUERADE_NOTIFY, AST_CONTROL_SRCCHANGE, AST_CONTROL_UNHOLD, ast_copy_string(), ast_debug, AST_FLAG_BLOCKING, AST_FLAG_DISABLE_DEVSTATE_CACHE, AST_FLAG_EXCEPTION, AST_FLAG_MOH, AST_FLAG_OUTGOING, AST_FLAG_ZOMBIE, AST_FLAGS_ALL, ast_format_cap_alloc, ast_format_cap_append_from_cap(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_get_name(), ast_framehook_list_fixup(), AST_GENERATOR_FD, ast_indicate(), ast_indicate_data(), AST_LIST_APPEND_LIST, AST_LIST_FIRST, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_HEAD_NOLOCK, AST_LIST_INSERT_TAIL, AST_LIST_REMOVE_HEAD, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_log, AST_MEDIA_TYPE_UNKNOWN, ast_moh_start(), ast_moh_stop(), ast_null_frame, ast_party_id_reset(), ast_queue_frame(), ast_set_flag, ast_set_read_format(), ast_set_write_format(), AST_SOFTHANGUP_DEV, ast_strdupa, ast_strlen_zero(), ast_test_flag, AST_TIMING_FD, ast_channel::caller, ast_datastore_info::chan_breakdown, ast_datastore_info::chan_fixup, channels, clone_variables(), connected, ast_channel::connected, current, ast_datastore::data, ast_channel::dialed, errno, free_translation(), handlers, ast_datastore::info, len(), LOG_WARNING, NULL, ast_channel::redirecting, S_OR, and type.

Referenced by ast_channel_move().

◆ channel_feature_hooks_set_full()

static int channel_feature_hooks_set_full ( struct ast_channel chan,
struct ast_bridge_features features,
int  replace 
)
static

Definition at line 10936 of file channel.c.

10937{
10938 struct ast_datastore *datastore;
10939 struct ast_bridge_features *ds_features;
10940
10942 if (datastore) {
10943 ds_features = datastore->data;
10944 if (replace) {
10945 ast_bridge_features_cleanup(ds_features);
10946 ast_bridge_features_init(ds_features);
10947 }
10948 if (features) {
10949 ast_bridge_features_merge(ds_features, features);
10950 }
10951 return 0;
10952 }
10953
10955 if (!datastore) {
10956 return -1;
10957 }
10958
10959 ds_features = ast_bridge_features_new();
10960 if (!ds_features) {
10961 ast_datastore_free(datastore);
10962 return -1;
10963 }
10964
10965 if (features) {
10966 ast_bridge_features_merge(ds_features, features);
10967 }
10968 datastore->data = ds_features;
10969 ast_channel_datastore_add(chan, datastore);
10970 return 0;
10971}
int ast_bridge_features_init(struct ast_bridge_features *features)
Initialize bridge features structure.
Definition: bridge.c:3620
struct ast_bridge_features * ast_bridge_features_new(void)
Allocate a new bridge features struct.
Definition: bridge.c:3683
void ast_bridge_features_merge(struct ast_bridge_features *into, const struct ast_bridge_features *from)
Merge one ast_bridge_features into another.
Definition: bridge.c:3595
void ast_bridge_features_cleanup(struct ast_bridge_features *features)
Clean up the contents of a bridge features structure.
Definition: bridge.c:3653
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:888
Structure that contains features information.

References ast_bridge_features_cleanup(), ast_bridge_features_init(), ast_bridge_features_merge(), ast_bridge_features_new(), ast_channel_datastore_add(), ast_channel_datastore_find(), ast_datastore_alloc, ast_datastore_free(), bridge_features_info, ast_datastore::data, NULL, and replace().

Referenced by ast_channel_feature_hooks_append(), and ast_channel_feature_hooks_replace().

◆ channel_get_external_vars()

static struct varshead * channel_get_external_vars ( struct external_vars channelvars,
struct ast_channel chan 
)
static

Definition at line 7958 of file channel.c.

7960{
7961 RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
7962 RAII_VAR(struct ast_str *, tmp, NULL, ast_free);
7963 struct manager_channel_variable *mcv;
7965
7966 if (AST_LIST_EMPTY(channelvars)) {
7967 return NULL;
7968 }
7969
7970 ret = ao2_alloc(sizeof(*ret), varshead_dtor);
7971 tmp = ast_str_create(16);
7972
7973 if (!ret || !tmp) {
7974 return NULL;
7975 }
7976
7977 AST_LIST_TRAVERSE(channelvars, mcv, entry) {
7978 const char *val = NULL;
7979 struct ast_var_t *var;
7980
7981 if (mcv->isfunc) {
7982 if (ast_func_read2(chan, mcv->name, &tmp, 0) == 0) {
7984 } else {
7986 "Error invoking function %s\n", mcv->name);
7987 }
7988 } else {
7989 val = pbx_builtin_getvar_helper(chan, mcv->name);
7990 }
7991
7992 var = ast_var_assign(mcv->name, val ? val : "");
7993 if (!var) {
7994 return NULL;
7995 }
7996
7998 }
7999
8000 ao2_ref(ret, +1);
8001 return ret;
8002
8003}
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:741
#define SCOPED_LOCK(varname, lock, lockfunc, unlockfunc)
Scoped Locks.
Definition: lock.h:583
int ast_func_read2(struct ast_channel *chan, const char *function, struct ast_str **str, ssize_t maxlen)
executes a read operation on a function
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
List of channel variables to append to all channel-related events.
Definition: channel.c:7845
unsigned int isfunc
Definition: channel.c:7847
Definition: ast_expr2.c:325

References ao2_alloc, ao2_cleanup, ao2_ref, ast_free, ast_func_read2(), AST_LIST_EMPTY, AST_LIST_TRAVERSE, ast_log, AST_RWLIST_INSERT_TAIL, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_str_buffer(), ast_str_create, ast_var_assign, ast_var_t::entries, manager_channel_variable::isfunc, lock, LOG_ERROR, manager_channel_variable::name, NULL, pbx_builtin_getvar_helper(), RAII_VAR, SCOPED_LOCK, tmp(), var, and varshead_dtor().

Referenced by ast_channel_get_ari_vars(), and ast_channel_get_manager_vars().

◆ channel_has_external_vars()

static int channel_has_external_vars ( struct external_vars channelvars)
static

Definition at line 7866 of file channel.c.

7867{
7868 int vars_present;
7869
7870 AST_RWLIST_RDLOCK(channelvars);
7871 vars_present = !AST_LIST_EMPTY(channelvars);
7872 AST_RWLIST_UNLOCK(channelvars);
7873
7874 return vars_present;
7875}

References AST_LIST_EMPTY, AST_RWLIST_RDLOCK, and AST_RWLIST_UNLOCK.

Referenced by ast_channel_has_ari_vars(), and ast_channel_has_manager_vars().

◆ channel_req_accountcodes()

static void channel_req_accountcodes ( struct ast_channel chan,
const struct ast_channel requestor,
enum ast_channel_requestor_relationship  relationship,
int  precious 
)
static

Definition at line 6395 of file channel.c.

6396{
6397 /*
6398 * The primary reason for the existence of this function is
6399 * so local channels can propagate accountcodes to the ;2
6400 * channel before ast_call().
6401 *
6402 * The secondary reason is to propagate the CHANNEL(peeraccount)
6403 * value set before Dial, FollowMe, and Queue while maintaining
6404 * the historic straight across accountcode propagation as a
6405 * fallback.
6406 */
6407 switch (relationship) {
6409 /* Crossover the requestor's accountcode and peeraccount */
6410 if (!precious || ast_strlen_zero(ast_channel_accountcode(chan))) {
6411 /*
6412 * The newly created channel does not have an accountcode
6413 * or we don't care.
6414 */
6415 if (!ast_strlen_zero(ast_channel_peeraccount(requestor))) {
6416 /*
6417 * Set it to the requestor's peeraccount. This allows the
6418 * dialplan to indicate the accountcode to use when dialing
6419 * by setting CHANNEL(peeraccount).
6420 */
6421 ast_channel_accountcode_set(chan, ast_channel_peeraccount(requestor));
6422 } else if (!precious
6423 && !ast_strlen_zero(ast_channel_accountcode(requestor))) {
6424 /*
6425 * Fallback to the historic propagation and set it to the
6426 * requestor's accountcode.
6427 */
6428 ast_channel_accountcode_set(chan, ast_channel_accountcode(requestor));
6429 }
6430 }
6431 if (!ast_strlen_zero(ast_channel_accountcode(requestor))) {
6432 ast_channel_peeraccount_set(chan, ast_channel_accountcode(requestor));
6433 }
6434 break;
6436 /* Pass the requestor's accountcode and peeraccount straight. */
6437 if (!precious || ast_strlen_zero(ast_channel_accountcode(chan))) {
6438 /*
6439 * The newly created channel does not have an accountcode
6440 * or we don't care.
6441 */
6442 if (!ast_strlen_zero(ast_channel_accountcode(requestor))) {
6443 ast_channel_accountcode_set(chan, ast_channel_accountcode(requestor));
6444 }
6445 }
6446 if (!ast_strlen_zero(ast_channel_peeraccount(requestor))) {
6447 ast_channel_peeraccount_set(chan, ast_channel_peeraccount(requestor));
6448 }
6449 break;
6450 }
6451}
const char * ast_channel_peeraccount(const struct ast_channel *chan)

References ast_channel_accountcode(), ast_channel_peeraccount(), AST_CHANNEL_REQUESTOR_BRIDGE_PEER, AST_CHANNEL_REQUESTOR_REPLACEMENT, and ast_strlen_zero().

Referenced by ast_channel_req_accountcodes(), and ast_channel_req_accountcodes_precious().

◆ channel_set_external_vars()

static void channel_set_external_vars ( struct external_vars channelvars,
size_t  varc,
char **  vars 
)
static

Definition at line 7887 of file channel.c.

7888{
7889 size_t i;
7890
7891 free_external_channelvars(channelvars);
7892 AST_RWLIST_WRLOCK(channelvars);
7893 for (i = 0; i < varc; ++i) {
7894 const char *var = vars[i];
7895 struct manager_channel_variable *mcv;
7896 if (!(mcv = ast_calloc(1, sizeof(*mcv) + strlen(var) + 1))) {
7897 break;
7898 }
7899 strcpy(mcv->name, var); /* SAFE */
7900 if (strchr(var, '(')) {
7901 mcv->isfunc = 1;
7902 }
7903 AST_RWLIST_INSERT_TAIL(channelvars, mcv, entry);
7904 }
7905 AST_RWLIST_UNLOCK(channelvars);
7906
7907}
static void free_external_channelvars(struct external_vars *channelvars)
Definition: channel.c:7856

References ast_calloc, AST_RWLIST_INSERT_TAIL, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, free_external_channelvars(), manager_channel_variable::isfunc, manager_channel_variable::name, and var.

Referenced by ast_channel_set_ari_vars(), and ast_channel_set_manager_vars().

◆ channel_set_intercept_mode()

static void channel_set_intercept_mode ( int  in_intercept_mode)
static

Definition at line 10344 of file channel.c.

10345{
10346 int status;
10347
10348 status = ast_threadstorage_set_ptr(&in_intercept_routine,
10349 in_intercept_mode ? &(int) { 1 } : NULL);
10350 if (status) {
10351 ast_log(LOG_ERROR, "Failed to set dialplan intercept mode\n");
10352 }
10353}
jack_status_t status
Definition: app_jack.c:146
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.

References ast_log, ast_threadstorage_set_ptr(), LOG_ERROR, NULL, and status.

Referenced by ast_channel_connected_line_sub(), and ast_channel_redirecting_sub().

◆ channels_shutdown()

static void channels_shutdown ( void  )
static

Definition at line 8015 of file channel.c.

8016{
8019
8021 if (channels) {
8022 ao2_container_unregister("channels");
8023 ao2_ref(channels, -1);
8024 channels = NULL;
8025 }
8027}
void ao2_container_unregister(const char *name)
Unregister a container for CLI stats and integrity check.
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister channel driver.
Definition: channel.c:570
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30

References ami_vars, ao2_container_unregister(), ao2_ref, ari_vars, ARRAY_LEN, ast_channel_unregister(), ast_cli_unregister_multiple(), channels, cli_channel, free_external_channelvars(), NULL, and surrogate_tech.

Referenced by ast_channels_init().

◆ clone_variables()

static void clone_variables ( struct ast_channel original,
struct ast_channel clonechan 
)
static

Clone channel variables from 'clone' channel into 'original' channel.

All variables except those related to app_groupcount are cloned. Variables are actually removed from 'clone' channel, presumably because it will subsequently be destroyed.

Note
Assumes locks will be in place on both channels when called.

Definition at line 6841 of file channel.c.

6842{
6843 struct ast_var_t *current, *newvar;
6844 /* Append variables from clone channel into original channel */
6845 /* XXX Is this always correct? We have to in order to keep MACROS working XXX */
6847
6848 /* then, dup the varshead list into the clone */
6849
6851 newvar = ast_var_assign(current->name, current->value);
6852 if (newvar)
6854 }
6855}

References ast_channel_varshead(), AST_LIST_APPEND_LIST, AST_LIST_INSERT_TAIL, AST_LIST_TRAVERSE, ast_var_assign, current, and ast_var_t::entries.

Referenced by channel_do_masquerade().

◆ complete_channeltypes()

static char * complete_channeltypes ( struct ast_cli_args a)
static

Definition at line 303 of file channel.c.

304{
305 struct chanlist *cl;
306 int wordlen;
307
308 if (a->pos != 3) {
309 return NULL;
310 }
311
312 wordlen = strlen(a->word);
313
316 if (!strncasecmp(a->word, cl->tech->type, wordlen)) {
318 }
319 }
321
322 return NULL;
323}
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition: main/cli.c:2768

References a, ast_cli_completion_add(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, chanlist::list, NULL, and chanlist::tech.

Referenced by handle_cli_core_show_channeltype().

◆ deactivate_generator_nolock()

static void deactivate_generator_nolock ( struct ast_channel chan)
static

◆ deactivate_silence_generator()

static int deactivate_silence_generator ( struct ast_channel chan)
static

Definition at line 8209 of file channel.c.

8210{
8211 ast_channel_lock(chan);
8212
8213 if (!ast_channel_generatordata(chan)) {
8214 ast_debug(1, "Trying to stop silence generator when there is no generator on '%s'\n",
8215 ast_channel_name(chan));
8216 ast_channel_unlock(chan);
8217 return 0;
8218 }
8220 ast_debug(1, "Trying to stop silence generator when it is not the current generator on '%s'\n",
8221 ast_channel_name(chan));
8222 ast_channel_unlock(chan);
8223 return 0;
8224 }
8226
8227 ast_channel_unlock(chan);
8228
8229 return 1;
8230}

References ast_channel_generator(), ast_channel_generatordata(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_debug, deactivate_generator_nolock(), and silence_generator.

Referenced by ast_channel_stop_silence_generator().

◆ destroy_hooks()

static void destroy_hooks ( struct ast_channel chan)
static

Definition at line 2549 of file channel.c.

2550{
2551 if (ast_channel_audiohooks(chan)) {
2554 }
2555
2557}
int ast_framehook_list_destroy(struct ast_channel *chan)
This is used by the channel API to detach and destroy all framehooks on a channel during channel dest...
Definition: framehook.c:206

References ast_audiohook_detach_list(), ast_channel_audiohooks(), ast_channel_audiohooks_set(), ast_framehook_list_destroy(), and NULL.

Referenced by ast_hangup().

◆ does_id_conflict()

static int does_id_conflict ( const char *  uniqueid)
static

Definition at line 711 of file channel.c.

712{
713 struct ast_channel *conflict;
714 size_t length = 0;
715
717 return 0;
718 }
719
721 if (conflict) {
722 ast_log(LOG_ERROR, "Channel Unique ID '%s' already in use by channel %s(%p)\n",
723 uniqueid, ast_channel_name(conflict), conflict);
724 ast_channel_unref(conflict);
725 return 1;
726 }
727
728 return 0;
729}

References ast_channel_by_uniqueid_cb(), ast_channel_callback(), ast_channel_name(), ast_channel_unref, ast_log, ast_strlen_zero(), LOG_ERROR, OBJ_NOLOCK, and ast_channel::uniqueid.

Referenced by __ast_channel_alloc_ap().

◆ dtmf_direction_to_string()

static const char * dtmf_direction_to_string ( enum DtmfDirection  direction)
static

Definition at line 3377 of file channel.c.

3378{
3379 switch (direction) {
3380 case DTMF_RECEIVED:
3381 return "Received";
3382 case DTMF_SENT:
3383 return "Sent";
3384 }
3385
3386 return "?";
3387}

References DTMF_RECEIVED, and DTMF_SENT.

Referenced by send_dtmf_begin_event(), and send_dtmf_end_event().

◆ features_destroy()

static void features_destroy ( void *  obj)
static

Definition at line 10915 of file channel.c.

10916{
10918}
void ast_bridge_features_destroy(struct ast_bridge_features *features)
Destroy an allocated bridge features struct.
Definition: bridge.c:3674

References ast_bridge_features_destroy().

◆ free_external_channelvars()

static void free_external_channelvars ( struct external_vars channelvars)
static

Definition at line 7856 of file channel.c.

7857{
7859 AST_RWLIST_WRLOCK(channelvars);
7860 while ((var = AST_RWLIST_REMOVE_HEAD(channelvars, entry))) {
7861 ast_free(var);
7862 }
7863 AST_RWLIST_UNLOCK(channelvars);
7864}
#define AST_RWLIST_REMOVE_HEAD
Definition: linkedlists.h:844

References ast_free, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and var.

Referenced by channel_set_external_vars(), and channels_shutdown().

◆ free_translation()

static void free_translation ( struct ast_channel clonechan)
static

◆ generator_force()

static int generator_force ( const void *  data)
static

Definition at line 2935 of file channel.c.

2936{
2937 /* Called if generator doesn't have data */
2938 void *tmp;
2939 int res;
2940 int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = NULL;
2941 struct ast_channel *chan = (struct ast_channel *)data;
2942
2943 ast_channel_lock(chan);
2946 if (ast_channel_generator(chan))
2947 generate = ast_channel_generator(chan)->generate;
2948 ast_channel_unlock(chan);
2949
2950 if (!tmp || !generate) {
2951 return 0;
2952 }
2953
2954 res = generate(chan, tmp, 0, ast_format_get_sample_rate(ast_channel_writeformat(chan)) / 50);
2955
2956 ast_channel_lock(chan);
2957 if (ast_channel_generator(chan) && generate == ast_channel_generator(chan)->generate) {
2959 }
2960 ast_channel_unlock(chan);
2961
2962 if (res) {
2963 ast_debug(1, "Auto-deactivating generator\n");
2965 }
2966
2967 return 0;
2968}

References ast_channel_generator(), ast_channel_generatordata(), ast_channel_generatordata_set(), ast_channel_lock, ast_channel_unlock, ast_channel_writeformat(), ast_deactivate_generator(), ast_debug, ast_format_get_sample_rate(), ast_channel::data, ast_generator::generate, NULL, and tmp().

Referenced by ast_activate_generator().

◆ generator_write_format_change()

static void generator_write_format_change ( struct ast_channel chan)
static

Definition at line 2923 of file channel.c.

2924{
2925 struct ast_generator *generator;
2926
2927 ast_channel_lock(chan);
2928 generator = ast_channel_generator(chan);
2929 if (generator && generator->write_format_change) {
2930 generator->write_format_change(chan, ast_channel_generatordata(chan));
2931 }
2932 ast_channel_unlock(chan);
2933}
void(* write_format_change)(struct ast_channel *chan, void *data)
Definition: channel.h:240

References ast_channel_generator(), ast_channel_generatordata(), ast_channel_lock, ast_channel_unlock, and ast_generator::write_format_change.

Referenced by set_format().

◆ handle_cause()

static void handle_cause ( int  cause,
int *  outstate 
)
static

Definition at line 5868 of file channel.c.

5869{
5870 if (outstate) {
5871 /* compute error and return */
5872 if (cause == AST_CAUSE_BUSY)
5873 *outstate = AST_CONTROL_BUSY;
5874 else if (cause == AST_CAUSE_CONGESTION)
5875 *outstate = AST_CONTROL_CONGESTION;
5876 else
5877 *outstate = 0;
5878 }
5879}
#define AST_CAUSE_CONGESTION
Definition: causes.h:153
#define AST_CAUSE_BUSY
Definition: causes.h:149

References AST_CAUSE_BUSY, AST_CAUSE_CONGESTION, AST_CONTROL_BUSY, and AST_CONTROL_CONGESTION.

Referenced by __ast_request_and_dial(), and ast_call_forward().

◆ handle_cli_core_show_channeltype()

static char * handle_cli_core_show_channeltype ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Show details about a channel driver - CLI command.

Definition at line 326 of file channel.c.

327{
328 struct chanlist *cl = NULL;
330
331 switch (cmd) {
332 case CLI_INIT:
333 e->command = "core show channeltype";
334 e->usage =
335 "Usage: core show channeltype <name>\n"
336 " Show details about the specified channel type, <name>.\n";
337 return NULL;
338 case CLI_GENERATE:
339 return complete_channeltypes(a);
340 }
341
342 if (a->argc != 4)
343 return CLI_SHOWUSAGE;
344
346
347 AST_RWLIST_TRAVERSE(&backends, cl, list) {
348 if (!strncasecmp(cl->tech->type, a->argv[3], strlen(cl->tech->type)))
349 break;
350 }
351
352
353 if (!cl) {
354 ast_cli(a->fd, "\n%s is not a registered channel driver.\n", a->argv[3]);
356 return CLI_FAILURE;
357 }
358
359 ast_cli(a->fd,
360 "-- Info about channel driver: %s --\n"
361 " Device State: %s\n"
362 "Presence State: %s\n"
363 " Indication: %s\n"
364 " Transfer : %s\n"
365 " Capabilities: %s\n"
366 " Digit Begin: %s\n"
367 " Digit End: %s\n"
368 " Send HTML : %s\n"
369 " Image Support: %s\n"
370 " Text Support: %s\n",
371 cl->tech->type,
372 (cl->tech->devicestate) ? "yes" : "no",
373 (cl->tech->presencestate) ? "yes" : "no",
374 (cl->tech->indicate) ? "yes" : "no",
375 (cl->tech->transfer) ? "yes" : "no",
376 ast_format_cap_get_names(cl->tech->capabilities, &codec_buf),
377 (cl->tech->send_digit_begin) ? "yes" : "no",
378 (cl->tech->send_digit_end) ? "yes" : "no",
379 (cl->tech->send_html) ? "yes" : "no",
380 (cl->tech->send_image) ? "yes" : "no",
381 (cl->tech->send_text) ? "yes" : "no"
382
383 );
384
386
387 return CLI_SUCCESS;
388}
static char * complete_channeltypes(struct ast_cli_args *a)
Definition: channel.c:303
#define CLI_SHOWUSAGE
Definition: cli.h:45
#define CLI_SUCCESS
Definition: cli.h:44
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
@ CLI_INIT
Definition: cli.h:152
@ CLI_GENERATE
Definition: cli.h:153
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177

References a, ast_cli(), ast_format_cap_get_names(), AST_FORMAT_CAP_NAMES_LEN, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_str_alloca, CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, complete_channeltypes(), NULL, chanlist::tech, and ast_cli_entry::usage.

◆ handle_cli_core_show_channeltypes()

static char * handle_cli_core_show_channeltypes ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Show channel types - CLI command.

Definition at line 261 of file channel.c.

262{
263#define FORMAT "%-15.15s %-40.40s %-13.13s %-13.13s %-13.13s %-13.13s\n"
264 struct chanlist *cl;
265 int count_chan = 0;
266
267 switch (cmd) {
268 case CLI_INIT:
269 e->command = "core show channeltypes";
270 e->usage =
271 "Usage: core show channeltypes\n"
272 " Lists available channel types registered in your\n"
273 " Asterisk server.\n";
274 return NULL;
275 case CLI_GENERATE:
276 return NULL;
277 }
278
279 if (a->argc != 3)
280 return CLI_SHOWUSAGE;
281
282 ast_cli(a->fd, FORMAT, "Type", "Description", "Devicestate", "Presencestate", "Indications", "Transfer");
283 ast_cli(a->fd, FORMAT, "-------------", "-------------", "-------------", "-------------", "-------------", "-------------");
284
287 ast_cli(a->fd, FORMAT, cl->tech->type, cl->tech->description,
288 (cl->tech->devicestate) ? "yes" : "no",
289 (cl->tech->presencestate) ? "yes" : "no",
290 (cl->tech->indicate) ? "yes" : "no",
291 (cl->tech->transfer) ? "yes" : "no");
292 count_chan++;
293 }
295
296 ast_cli(a->fd, "----------\n%d channel drivers registered.\n", count_chan);
297
298 return CLI_SUCCESS;
299
300#undef FORMAT
301}
#define FORMAT

References a, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, FORMAT, chanlist::list, NULL, chanlist::tech, and ast_cli_entry::usage.

◆ indicate_connected_line()

static int indicate_connected_line ( struct ast_channel chan,
const void *  data,
size_t  datalen 
)
static

Definition at line 4420 of file channel.c.

4421{
4422 struct ast_party_connected_line *chan_connected = ast_channel_connected(chan);
4423 struct ast_party_connected_line *chan_indicated = ast_channel_connected_indicated(chan);
4425 unsigned char current[1024];
4426 unsigned char proposed[1024];
4427 int current_size;
4428 int proposed_size;
4429 int res;
4430
4432 res = ast_connected_line_parse_data(data, datalen, &connected);
4433 if (!res) {
4435 }
4437 if (res) {
4438 return -1;
4439 }
4440
4441 current_size = ast_connected_line_build_data(current, sizeof(current),
4442 chan_indicated, NULL);
4443 proposed_size = ast_connected_line_build_data(proposed, sizeof(proposed),
4444 chan_connected, NULL);
4445 if (current_size == -1 || proposed_size == -1) {
4446 return -1;
4447 }
4448
4449 if (current_size == proposed_size && !memcmp(current, proposed, current_size)) {
4450 ast_debug(1, "%s: Dropping redundant connected line update \"%s\" <%s>.\n",
4451 ast_channel_name(chan),
4452 S_COR(chan_connected->id.name.valid, chan_connected->id.name.str, ""),
4453 S_COR(chan_connected->id.number.valid, chan_connected->id.number.str, ""));
4454 return -1;
4455 }
4456
4457 ast_party_connected_line_copy(chan_indicated, chan_connected);
4458 return 0;
4459}
#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

References ast_channel_connected(), ast_channel_connected_indicated(), ast_channel_name(), ast_channel_set_connected_line(), ast_connected_line_build_data(), ast_connected_line_parse_data(), ast_debug, ast_party_connected_line_copy(), ast_party_connected_line_free(), ast_party_connected_line_set_init(), connected, current, ast_party_connected_line::id, ast_party_id::name, NULL, ast_party_id::number, S_COR, ast_party_name::str, ast_party_number::str, ast_party_name::valid, and ast_party_number::valid.

Referenced by indicate_data_internal().

◆ indicate_data_internal()

static int indicate_data_internal ( struct ast_channel chan,
int  _condition,
const void *  data,
size_t  datalen 
)
static
Note
If we compare the enumeration type, which does not have any negative constants, the compiler may optimize this code away. Therefore, we must perform an integer comparison here.

Definition at line 4489 of file channel.c.

4490{
4491 /* By using an enum, we'll get compiler warnings for values not handled
4492 * in switch statements. */
4493 enum ast_control_frame_type condition = _condition;
4494 struct ast_tone_zone_sound *ts = NULL;
4495 const struct ast_control_t38_parameters *t38_parameters;
4496 int res;
4497
4498 switch (condition) {
4500 if (indicate_connected_line(chan, data, datalen)) {
4501 res = 0;
4502 return res;
4503 }
4504 break;
4506 if (indicate_redirecting(chan, data, datalen)) {
4507 res = 0;
4508 return res;
4509 }
4510 break;
4511 case AST_CONTROL_HOLD:
4512 case AST_CONTROL_UNHOLD:
4513 ast_channel_hold_state_set(chan, _condition);
4514 break;
4516 t38_parameters = data;
4517 switch (t38_parameters->request_response) {
4519 case AST_T38_NEGOTIATED:
4521 break;
4523 case AST_T38_TERMINATED:
4524 case AST_T38_REFUSED:
4526 break;
4527 default:
4528 break;
4529 }
4530 break;
4531 default:
4532 break;
4533 }
4534
4535 if (is_visible_indication(condition)) {
4536 /* A new visible indication is requested. */
4537 ast_channel_visible_indication_set(chan, _condition);
4538 } else if (condition == AST_CONTROL_UNHOLD || _condition < 0) {
4539 /* Visible indication is cleared/stopped. */
4541 }
4542
4543 if (ast_channel_tech(chan)->indicate) {
4544 /* See if the channel driver can handle this condition. */
4545 res = ast_channel_tech(chan)->indicate(chan, _condition, data, datalen);
4546 } else {
4547 res = -1;
4548 }
4549
4550 if (!res) {
4551 /* The channel driver successfully handled this indication */
4552 res = 0;
4553 return res;
4554 }
4555
4556 /* The channel driver does not support this indication, let's fake
4557 * it by doing our own tone generation if applicable. */
4558
4559 /*!\note If we compare the enumeration type, which does not have any
4560 * negative constants, the compiler may optimize this code away.
4561 * Therefore, we must perform an integer comparison here. */
4562 if (_condition < 0) {
4563 /* Stop any tones that are playing */
4564 ast_playtones_stop(chan);
4565 res = 0;
4566 return res;
4567 }
4568
4569 /* Handle conditions that we have tones for. */
4570 switch (condition) {
4572 /* deprecated T.38 control frame */
4573 res = -1;
4574 return res;
4576 /* there is no way to provide 'default' behavior for these
4577 * control frames, so we need to return failure, but there
4578 * is also no value in the log message below being emitted
4579 * since failure to handle these frames is not an 'error'
4580 * so just return right now. in addition, we want to return
4581 * whatever value the channel driver returned, in case it
4582 * has some meaning.*/
4583 return res;
4585 ts = ast_get_indication_tone(ast_channel_zone(chan), "ring");
4586 /* It is common practice for channel drivers to return -1 if trying
4587 * to indicate ringing on a channel which is up. The idea is to let the
4588 * core generate the ringing inband. However, we don't want the
4589 * warning message about not being able to handle the specific indication
4590 * to print nor do we want ast_indicate_data to return an "error" for this
4591 * condition
4592 */
4593 if (ast_channel_state(chan) == AST_STATE_UP) {
4594 res = 0;
4595 }
4596 break;
4597 case AST_CONTROL_BUSY:
4598 ts = ast_get_indication_tone(ast_channel_zone(chan), "busy");
4599 break;
4602 ts = ast_get_indication_tone(ast_channel_zone(chan), "congestion");
4603 break;
4605 ast_channel_hangupcause_hash_set(chan, data, datalen);
4606 res = 0;
4607 break;
4615 case AST_CONTROL_OPTION:
4616 case AST_CONTROL_WINK:
4617 case AST_CONTROL_FLASH:
4620 case AST_CONTROL_ANSWER:
4621 case AST_CONTROL_HANGUP:
4622 case AST_CONTROL_RING:
4623 case AST_CONTROL_HOLD:
4624 case AST_CONTROL_UNHOLD:
4628 case AST_CONTROL_CC:
4630 case AST_CONTROL_AOC:
4632 case AST_CONTROL_MCID:
4647 /* Nothing left to do for these. */
4648 res = 0;
4649 break;
4650 }
4651
4652 if (ts) {
4653 /* We have a tone to play, yay. */
4654 ast_debug(1, "Driver for channel '%s' does not support indication %u, emulating it\n", ast_channel_name(chan), condition);
4655 res = ast_playtones_start(chan, 0, ts->data, 1);
4656 if (!res) {
4657 ast_test_suite_event_notify("RINGING_INBAND",
4658 "Channel: %s\r\n",
4659 ast_channel_name(chan));
4660 }
4662 }
4663
4664 if (res) {
4665 /* not handled */
4666 ast_log(LOG_WARNING, "Unable to handle indication %u for '%s'\n", condition, ast_channel_name(chan));
4667 }
4668
4669 return res;
4670}
static int indicate_connected_line(struct ast_channel *chan, const void *data, size_t datalen)
Definition: channel.c:4420
static int indicate_redirecting(struct ast_channel *chan, const void *data, size_t datalen)
Definition: channel.c:4475
static int attribute_const is_visible_indication(enum ast_control_frame_type condition)
Definition: channel.c:4301
void ast_channel_visible_indication_set(struct ast_channel *chan, int value)
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.
@ AST_T38_TERMINATED
@ AST_T38_REFUSED
@ AST_T38_REQUEST_TERMINATE
@ AST_T38_NEGOTIATED
@ AST_T38_REQUEST_NEGOTIATE
ast_control_frame_type
Internal control frame subtype field values.
@ AST_CONTROL_RECORD_CANCEL
@ AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED
@ AST_CONTROL_OFFHOOK
@ AST_CONTROL_RADIO_UNKEY
@ AST_CONTROL_TAKEOFFHOOK
@ AST_CONTROL_MCID
@ AST_CONTROL_T38_PARAMETERS
@ AST_CONTROL_RECORD_STOP
@ AST_CONTROL_RECORD_MUTE
@ AST_CONTROL_RADIO_KEY
@ AST_CONTROL_OPTION
@ AST_CONTROL_RECORD_SUSPEND
@ AST_CONTROL_AOC
@ _XXX_AST_CONTROL_T38
static struct ast_tone_zone_sound * ast_tone_zone_sound_unref(struct ast_tone_zone_sound *ts)
Release a reference to an ast_tone_zone_sound.
Definition: indications.h:227
struct ast_tone_zone_sound * ast_get_indication_tone(const struct ast_tone_zone *zone, const char *indication)
Locate a tone zone sound.
Definition: indications.c:461
enum ast_control_t38 request_response
Description of a tone.
Definition: indications.h:35
const char * data
Description of a tone.
Definition: indications.h:52

References _XXX_AST_CONTROL_T38, ast_channel_hangupcause_hash_set(), ast_channel_hold_state_set(), ast_channel_name(), ast_channel_set_is_t38_active_nolock(), ast_channel_tech(), ast_channel_visible_indication_set(), ast_channel_zone(), AST_CONTROL_ANSWER, AST_CONTROL_AOC, AST_CONTROL_BUSY, AST_CONTROL_CC, AST_CONTROL_CONGESTION, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_END_OF_Q, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_INCOMPLETE, AST_CONTROL_MASQUERADE_NOTIFY, AST_CONTROL_MCID, AST_CONTROL_OFFHOOK, AST_CONTROL_OPTION, AST_CONTROL_PROCEEDING, AST_CONTROL_PROGRESS, AST_CONTROL_PVT_CAUSE_CODE, AST_CONTROL_RADIO_KEY, AST_CONTROL_RADIO_UNKEY, AST_CONTROL_READ_ACTION, AST_CONTROL_RECORD_CANCEL, AST_CONTROL_RECORD_MUTE, AST_CONTROL_RECORD_STOP, AST_CONTROL_RECORD_SUSPEND, AST_CONTROL_REDIRECTING, AST_CONTROL_RING, 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_STREAM_TOPOLOGY_CHANGED, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED, AST_CONTROL_T38_PARAMETERS, AST_CONTROL_TAKEOFFHOOK, AST_CONTROL_TRANSFER, AST_CONTROL_UNHOLD, AST_CONTROL_UPDATE_RTP_PEER, AST_CONTROL_VIDUPDATE, AST_CONTROL_WINK, ast_debug, ast_get_indication_tone(), ast_log, ast_playtones_start(), ast_playtones_stop(), AST_STATE_UP, AST_T38_NEGOTIATED, AST_T38_REFUSED, AST_T38_REQUEST_NEGOTIATE, AST_T38_REQUEST_TERMINATE, AST_T38_TERMINATED, ast_test_suite_event_notify, ast_tone_zone_sound_unref(), ast_tone_zone_sound::data, indicate(), ast_channel_tech::indicate, indicate_connected_line(), indicate_redirecting(), is_visible_indication(), LOG_WARNING, NULL, and ast_control_t38_parameters::request_response.

Referenced by ast_indicate_data(), and ast_write_stream().

◆ indicate_redirecting()

static int indicate_redirecting ( struct ast_channel chan,
const void *  data,
size_t  datalen 
)
static

Definition at line 4475 of file channel.c.

4476{
4477 struct ast_party_redirecting redirecting;
4478 int res;
4479
4481 res = ast_redirecting_parse_data(data, datalen, &redirecting);
4482 if (!res) {
4483 ast_channel_set_redirecting(chan, &redirecting, NULL);
4484 }
4485 ast_party_redirecting_free(&redirecting);
4486 return res ? -1 : 0;
4487}
void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Set the redirecting id information in the Asterisk channel.
Definition: channel.c:9141
void ast_party_redirecting_set_init(struct ast_party_redirecting *init, const struct ast_party_redirecting *guide)
Initialize the given redirecting id structure using the given guide for a set update operation.
Definition: channel.c:2172

References ast_channel_redirecting(), ast_channel_set_redirecting(), ast_party_redirecting_free(), ast_party_redirecting_set_init(), ast_redirecting_parse_data(), and NULL.

Referenced by indicate_data_internal().

◆ is_visible_indication()

static int attribute_const is_visible_indication ( enum ast_control_frame_type  condition)
static

Definition at line 4301 of file channel.c.

4302{
4303 /* Don't include a default case here so that we get compiler warnings
4304 * when a new type is added. */
4305
4306 switch (condition) {
4314 case AST_CONTROL_OPTION:
4315 case AST_CONTROL_WINK:
4316 case AST_CONTROL_FLASH:
4319 case AST_CONTROL_ANSWER:
4320 case AST_CONTROL_HANGUP:
4326 case AST_CONTROL_CC:
4328 case AST_CONTROL_AOC:
4330 case AST_CONTROL_MCID:
4346 break;
4347
4350 case AST_CONTROL_BUSY:
4352 case AST_CONTROL_RING:
4353 case AST_CONTROL_HOLD:
4354 /* You can hear these */
4355 return 1;
4356
4357 case AST_CONTROL_UNHOLD:
4358 /* This is a special case. You stop hearing this. */
4359 break;
4360 }
4361
4362 return 0;
4363}

References _XXX_AST_CONTROL_T38, AST_CONTROL_ANSWER, AST_CONTROL_AOC, AST_CONTROL_BUSY, AST_CONTROL_CC, AST_CONTROL_CONGESTION, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_END_OF_Q, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_INCOMPLETE, AST_CONTROL_MASQUERADE_NOTIFY, AST_CONTROL_MCID, AST_CONTROL_OFFHOOK, AST_CONTROL_OPTION, AST_CONTROL_PROCEEDING, AST_CONTROL_PROGRESS, AST_CONTROL_PVT_CAUSE_CODE, AST_CONTROL_RADIO_KEY, AST_CONTROL_RADIO_UNKEY, AST_CONTROL_READ_ACTION, AST_CONTROL_RECORD_CANCEL, AST_CONTROL_RECORD_MUTE, AST_CONTROL_RECORD_STOP, AST_CONTROL_RECORD_SUSPEND, AST_CONTROL_REDIRECTING, AST_CONTROL_RING, 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_STREAM_TOPOLOGY_CHANGED, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED, AST_CONTROL_T38_PARAMETERS, AST_CONTROL_TAKEOFFHOOK, AST_CONTROL_TRANSFER, AST_CONTROL_UNHOLD, AST_CONTROL_UPDATE_RTP_PEER, AST_CONTROL_VIDUPDATE, and AST_CONTROL_WINK.

Referenced by indicate_data_internal().

◆ kill_exception()

static struct ast_frame * kill_exception ( struct ast_channel chan)
static

Definition at line 401 of file channel.c.

402{
403 /* Hangup channel. */
404 return NULL;
405}

References NULL.

◆ kill_fixup()

static int kill_fixup ( struct ast_channel oldchan,
struct ast_channel newchan 
)
static

Definition at line 413 of file channel.c.

414{
415 /* No problem fixing up the channel. */
416 return 0;
417}

◆ kill_hangup()

static int kill_hangup ( struct ast_channel chan)
static

Definition at line 419 of file channel.c.

420{
422 return 0;
423}

References ast_channel_tech_pvt_set(), and NULL.

◆ kill_read()

static struct ast_frame * kill_read ( struct ast_channel chan)
static

Definition at line 395 of file channel.c.

396{
397 /* Hangup channel. */
398 return NULL;
399}

References NULL.

◆ kill_write()

static int kill_write ( struct ast_channel chan,
struct ast_frame frame 
)
static

Definition at line 407 of file channel.c.

408{
409 /* Hangup channel. */
410 return -1;
411}

◆ namedgroup_cmp_cb()

static int namedgroup_cmp_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Comparison function used for named group container.

Definition at line 7681 of file channel.c.

7682{
7683 const struct namedgroup_member *an = obj;
7684 const struct namedgroup_member *bn = arg;
7685
7686 return strcmp(an->name, bn->name) ? 0 : CMP_MATCH | CMP_STOP;
7687}

References CMP_MATCH, CMP_STOP, and namedgroup_member::name.

Referenced by ast_get_namedgroups().

◆ namedgroup_hash_cb()

static int namedgroup_hash_cb ( const void *  obj,
const int  flags 
)
static

Hashing function used for named group container.

Definition at line 7690 of file channel.c.

7691{
7692 const struct namedgroup_member *member = obj;
7693
7694 return member->hash;
7695}

Referenced by ast_get_namedgroups().

◆ namedgroup_match()

static int namedgroup_match ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 8102 of file channel.c.

8103{
8104 void *match;
8105
8106 match = ao2_find(arg, obj, OBJ_POINTER);
8108
8109 return match ? CMP_MATCH | CMP_STOP : 0;
8110}

References ao2_cleanup, ao2_find, CMP_MATCH, CMP_STOP, match(), and OBJ_POINTER.

Referenced by ast_namedgroups_intersect().

◆ party_id_build_data()

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

Definition at line 8599 of file channel.c.

8602{
8603 size_t length;
8604 size_t pos = 0;
8605 int res;
8606
8607 /*
8608 * The size of integer values must be fixed in case the frame is
8609 * shipped to another machine.
8610 */
8611
8612 if (!update || update->name) {
8613 res = party_name_build_data(data + pos, datalen - pos, &id->name, label,
8614 &ies->name);
8615 if (res < 0) {
8616 return -1;
8617 }
8618 pos += res;
8619 }
8620
8621 if (!update || update->number) {
8622 res = party_number_build_data(data + pos, datalen - pos, &id->number, label,
8623 &ies->number);
8624 if (res < 0) {
8625 return -1;
8626 }
8627 pos += res;
8628 }
8629
8630 if (!update || update->subaddress) {
8631 res = party_subaddress_build_data(data + pos, datalen - pos, &id->subaddress,
8632 label, &ies->subaddress);
8633 if (res < 0) {
8634 return -1;
8635 }
8636 pos += res;
8637 }
8638
8639 /* *************** Party id user tag **************************** */
8640 if (id->tag) {
8641 length = strlen(id->tag);
8642 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8643 ast_log(LOG_WARNING, "No space left for %s tag\n", label);
8644 return -1;
8645 }
8646 data[pos++] = ies->tag;
8647 data[pos++] = length;
8648 memcpy(data + pos, id->tag, length);
8649 pos += length;
8650 }
8651
8652 /* *************** Party id combined presentation *************** */
8653 if (ies->combined_presentation && (!update || update->number)) {
8654 int presentation;
8655
8656 if (!update || update->name) {
8657 presentation = ast_party_id_presentation(id);
8658 } else {
8659 /*
8660 * We must compromise because not all the information is available
8661 * to determine a combined presentation value.
8662 * We will only send the number presentation instead.
8663 */
8664 presentation = id->number.presentation;
8665 }
8666
8667 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8668 ast_log(LOG_WARNING, "No space left for %s combined presentation\n", label);
8669 return -1;
8670 }
8671 data[pos++] = ies->combined_presentation;
8672 data[pos++] = 1;
8673 data[pos++] = presentation;
8674 }
8675
8676 return pos;
8677}
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
Definition: channel.c:1840
static int party_subaddress_build_data(unsigned char *data, size_t datalen, const struct ast_party_subaddress *subaddress, const char *label, const struct ast_party_subaddress_ies *ies)
Definition: channel.c:8518
static int party_name_build_data(unsigned char *data, size_t datalen, const struct ast_party_name *name, const char *label, const struct ast_party_name_ies *ies)
Definition: channel.c:8370
static int party_number_build_data(unsigned char *data, size_t datalen, const struct ast_party_number *number, const char *label, const struct ast_party_number_ies *ies)
Definition: channel.c:8444
struct ast_party_subaddress_ies subaddress
Subscriber subaddress ies.
Definition: channel.c:8574
int combined_presentation
Combined name and number presentation ie.
Definition: channel.c:8581
struct ast_party_number_ies number
Subscriber phone number ies.
Definition: channel.c:8572
int tag
User party id tag ie.
Definition: channel.c:8576

References ast_log, ast_party_id_presentation(), ast_party_id_ies::combined_presentation, id, LOG_WARNING, ast_party_id_ies::name, ast_party_id_ies::number, party_name_build_data(), party_number_build_data(), party_subaddress_build_data(), ast_party_id_ies::subaddress, ast_party_id_ies::tag, and update().

Referenced by ast_connected_line_build_data(), and ast_redirecting_build_data().

◆ party_name_build_data()

static int party_name_build_data ( unsigned char *  data,
size_t  datalen,
const struct ast_party_name name,
const char *  label,
const struct ast_party_name_ies ies 
)
static

Definition at line 8370 of file channel.c.

8371{
8372 size_t length;
8373 size_t pos = 0;
8374
8375 /*
8376 * The size of integer values must be fixed in case the frame is
8377 * shipped to another machine.
8378 */
8379 if (name->str) {
8380 length = strlen(name->str);
8381 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8382 ast_log(LOG_WARNING, "No space left for %s name\n", label);
8383 return -1;
8384 }
8385 data[pos++] = ies->str;
8386 data[pos++] = length;
8387 memcpy(data + pos, name->str, length);
8388 pos += length;
8389 }
8390
8391 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8392 ast_log(LOG_WARNING, "No space left for %s name char set\n", label);
8393 return -1;
8394 }
8395 data[pos++] = ies->char_set;
8396 data[pos++] = 1;
8397 data[pos++] = name->char_set;
8398
8399 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8400 ast_log(LOG_WARNING, "No space left for %s name presentation\n", label);
8401 return -1;
8402 }
8403 data[pos++] = ies->presentation;
8404 data[pos++] = 1;
8405 data[pos++] = name->presentation;
8406
8407 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8408 ast_log(LOG_WARNING, "No space left for %s name valid\n", label);
8409 return -1;
8410 }
8411 data[pos++] = ies->valid;
8412 data[pos++] = 1;
8413 data[pos++] = name->valid;
8414
8415 return pos;
8416}
int char_set
Character set ie.
Definition: channel.c:8349
int presentation
presentation-indicator ie
Definition: channel.c:8351
int valid
valid/present ie
Definition: channel.c:8353

References ast_log, ast_party_name_ies::char_set, LOG_WARNING, name, ast_party_name_ies::presentation, ast_party_name_ies::str, and ast_party_name_ies::valid.

Referenced by party_id_build_data().

◆ party_number_build_data()

static int party_number_build_data ( unsigned char *  data,
size_t  datalen,
const struct ast_party_number number,
const char *  label,
const struct ast_party_number_ies ies 
)
static

Definition at line 8444 of file channel.c.

8445{
8446 size_t length;
8447 size_t pos = 0;
8448
8449 /*
8450 * The size of integer values must be fixed in case the frame is
8451 * shipped to another machine.
8452 */
8453 if (number->str) {
8454 length = strlen(number->str);
8455 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8456 ast_log(LOG_WARNING, "No space left for %s number\n", label);
8457 return -1;
8458 }
8459 data[pos++] = ies->str;
8460 data[pos++] = length;
8461 memcpy(data + pos, number->str, length);
8462 pos += length;
8463 }
8464
8465 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8466 ast_log(LOG_WARNING, "No space left for %s numbering plan\n", label);
8467 return -1;
8468 }
8469 data[pos++] = ies->plan;
8470 data[pos++] = 1;
8471 data[pos++] = number->plan;
8472
8473 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8474 ast_log(LOG_WARNING, "No space left for %s number presentation\n", label);
8475 return -1;
8476 }
8477 data[pos++] = ies->presentation;
8478 data[pos++] = 1;
8479 data[pos++] = number->presentation;
8480
8481 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8482 ast_log(LOG_WARNING, "No space left for %s number valid\n", label);
8483 return -1;
8484 }
8485 data[pos++] = ies->valid;
8486 data[pos++] = 1;
8487 data[pos++] = number->valid;
8488
8489 return pos;
8490}
int presentation
presentation-indicator ie
Definition: channel.c:8425
int str
Subscriber phone number ie.
Definition: channel.c:8421
int valid
valid/present ie
Definition: channel.c:8427
int plan
Type-Of-Number and Numbering-Plan ie.
Definition: channel.c:8423

References ast_log, LOG_WARNING, ast_party_number_ies::plan, ast_party_number_ies::presentation, ast_party_number_ies::str, and ast_party_number_ies::valid.

Referenced by party_id_build_data().

◆ party_subaddress_build_data()

static int party_subaddress_build_data ( unsigned char *  data,
size_t  datalen,
const struct ast_party_subaddress subaddress,
const char *  label,
const struct ast_party_subaddress_ies ies 
)
static

Definition at line 8518 of file channel.c.

8519{
8520 size_t length;
8521 size_t pos = 0;
8522
8523 /*
8524 * The size of integer values must be fixed in case the frame is
8525 * shipped to another machine.
8526 */
8527 if (subaddress->str) {
8528 length = strlen(subaddress->str);
8529 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8530 ast_log(LOG_WARNING, "No space left for %s subaddress\n", label);
8531 return -1;
8532 }
8533 data[pos++] = ies->str;
8534 data[pos++] = length;
8535 memcpy(data + pos, subaddress->str, length);
8536 pos += length;
8537 }
8538
8539 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8540 ast_log(LOG_WARNING, "No space left for %s type of subaddress\n", label);
8541 return -1;
8542 }
8543 data[pos++] = ies->type;
8544 data[pos++] = 1;
8545 data[pos++] = subaddress->type;
8546
8547 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8549 "No space left for %s subaddress odd-even indicator\n", label);
8550 return -1;
8551 }
8552 data[pos++] = ies->odd_even_indicator;
8553 data[pos++] = 1;
8554 data[pos++] = subaddress->odd_even_indicator;
8555
8556 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8557 ast_log(LOG_WARNING, "No space left for %s subaddress valid\n", label);
8558 return -1;
8559 }
8560 data[pos++] = ies->valid;
8561 data[pos++] = 1;
8562 data[pos++] = subaddress->valid;
8563
8564 return pos;
8565}
int str
subaddress ie.
Definition: channel.c:8495
int odd_even_indicator
odd/even indicator ie
Definition: channel.c:8499
int valid
valid/present ie
Definition: channel.c:8501
int type
subaddress type ie
Definition: channel.c:8497

References ast_log, LOG_WARNING, ast_party_subaddress::odd_even_indicator, ast_party_subaddress_ies::odd_even_indicator, ast_party_subaddress::str, ast_party_subaddress_ies::str, ast_party_subaddress::type, ast_party_subaddress_ies::type, ast_party_subaddress::valid, and ast_party_subaddress_ies::valid.

Referenced by party_id_build_data().

◆ plc_ds_destroy()

static void plc_ds_destroy ( void *  data)
static

Definition at line 5060 of file channel.c.

5061{
5062 struct plc_ds *plc = data;
5063 ast_free(plc->samples_buf);
5064 ast_free(plc);
5065}

References ast_free, and plc_ds::samples_buf.

◆ prnt_channel_key()

static void prnt_channel_key ( void *  v_obj,
void *  where,
ao2_prnt_fn prnt 
)
static

Definition at line 7832 of file channel.c.

7833{
7834 struct ast_channel *chan = v_obj;
7835
7836 if (!chan) {
7837 return;
7838 }
7839 prnt(where, "%s", ast_channel_name(chan));
7840}

References ast_channel_name().

Referenced by ast_channels_init().

◆ queue_dtmf_readq()

static void queue_dtmf_readq ( struct ast_channel chan,
struct ast_frame f 
)
inlinestatic

Definition at line 3486 of file channel.c.

3487{
3488 struct ast_frame *fr = ast_channel_dtmff(chan);
3489
3492 fr->len = f->len;
3493
3494 /* The only time this function will be called is for a frame that just came
3495 * out of the channel driver. So, we want to stick it on the tail of the
3496 * readq. */
3497
3498 ast_queue_frame(chan, fr);
3499}

References ast_channel_dtmff(), AST_FRAME_DTMF_END, ast_queue_frame(), ast_frame::frametype, ast_frame_subclass::integer, ast_frame::len, and ast_frame::subclass.

Referenced by __ast_read().

◆ redirecting_reason_build_data()

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

Definition at line 9257 of file channel.c.

9260{
9261 size_t length;
9262 size_t pos = 0;
9263 int32_t value;
9264
9265 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9266 ast_log(LOG_WARNING, "No space left for %s code\n", label);
9267 return -1;
9268 }
9269 data[pos++] = ies->code;
9270 data[pos++] = sizeof(value);
9271 value = htonl(reason->code);
9272 memcpy(data + pos, &value, sizeof(value));
9273 pos += sizeof(value);
9274
9275 if (reason->str) {
9276 length = strlen(reason->str);
9277 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
9278 ast_log(LOG_WARNING, "No space left for %s string\n", label);
9279 return -1;
9280 }
9281 data[pos++] = ies->str;
9282 data[pos++] = length;
9283 memcpy(data + pos, reason->str, length);
9284 pos += length;
9285 }
9286
9287 return pos;
9288}

References ast_log, ast_party_redirecting_reason::code, ast_party_redirecting_reason_ies::code, LOG_WARNING, ast_party_redirecting_reason::str, ast_party_redirecting_reason_ies::str, and value.

Referenced by ast_redirecting_build_data().

◆ request_channel()

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

Definition at line 6238 of file channel.c.

6240{
6241 struct chanlist *chan;
6242 struct ast_channel *c = NULL;
6243 int res;
6244 int foo;
6245
6246 if (!cause)
6247 cause = &foo;
6248 *cause = AST_CAUSE_NOTDEFINED;
6249
6251 ast_log(LOG_WARNING, "Unable to lock technology backend list\n");
6252 return NULL;
6253 }
6254
6255 AST_RWLIST_TRAVERSE(&backends, chan, list) {
6256 if (strcasecmp(type, chan->tech->type)) {
6257 continue;
6258 }
6259
6260 break;
6261 }
6262
6264
6265 if (!chan) {
6266 ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
6267 *cause = AST_CAUSE_NOSUCHDRIVER;
6268 return NULL;
6269 }
6270
6271 /* Allow either format capabilities or stream topology to be provided and adapt */
6272 if (chan->tech->requester_with_stream_topology) {
6273 struct ast_stream_topology *tmp_converted_topology = NULL;
6274
6275 if (!topology && request_cap) {
6276 /* Turn the requested capabilities into a stream topology */
6277 topology = tmp_converted_topology = ast_stream_topology_create_from_format_cap(request_cap);
6278 }
6279
6280 c = chan->tech->requester_with_stream_topology(type, topology, assignedids, requestor, addr, cause);
6281
6282 ast_stream_topology_free(tmp_converted_topology);
6283 } else if (chan->tech->requester) {
6284 struct ast_format_cap *tmp_converted_cap = NULL;
6285 struct ast_format_cap *tmp_cap;
6286 RAII_VAR(struct ast_format *, tmp_fmt, NULL, ao2_cleanup);
6287 RAII_VAR(struct ast_format *, best_audio_fmt, NULL, ao2_cleanup);
6288 struct ast_format_cap *joint_cap;
6289
6290 if (!request_cap && topology) {
6291 /* Turn the request stream topology into capabilities */
6292 request_cap = tmp_converted_cap = ast_stream_topology_get_formats(topology);
6293 }
6294
6295 /* find the best audio format to use */
6297 if (!tmp_cap) {
6299 return NULL;
6300 }
6301
6303 if (!ast_format_cap_empty(tmp_cap)) {
6304 /* We have audio - is it possible to connect the various calls to each other?
6305 (Avoid this check for calls without audio, like text+video calls)
6306 */
6307 res = ast_translator_best_choice(tmp_cap, chan->tech->capabilities, &tmp_fmt, &best_audio_fmt);
6308 ao2_ref(tmp_cap, -1);
6309 if (res < 0) {
6310 struct ast_str *tech_codecs = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
6311 struct ast_str *request_codecs = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
6312
6313 ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %s) to %s\n", type,
6314 ast_format_cap_get_names(chan->tech->capabilities, &tech_codecs),
6315 ast_format_cap_get_names(request_cap, &request_codecs));
6317 ao2_cleanup(tmp_converted_cap);
6318 return NULL;
6319 }
6320 }
6321
6322 /* XXX Only the audio format calculated as being the best for translation
6323 * purposes is used for the request. This is because we don't have the ability
6324 * to signal to the initiator which one of their codecs that was offered is
6325 * the one that was selected, particularly in a chain of Local channels.
6326 */
6328 if (!joint_cap) {
6329 ao2_cleanup(tmp_converted_cap);
6330 return NULL;
6331 }
6334 if (best_audio_fmt) { /* text+video call? then, this is NULL */
6335 ast_format_cap_append(joint_cap, best_audio_fmt, 0);
6336 }
6337 ao2_cleanup(tmp_converted_cap);
6338
6339 c = chan->tech->requester(type, joint_cap, assignedids, requestor, addr, cause);
6340 ao2_ref(joint_cap, -1);
6341 }
6342
6343 if (!c) {
6344 return NULL;
6345 }
6346
6347 if (requestor) {
6348 ast_callid callid;
6349
6350 ast_channel_lock_both(c, (struct ast_channel *) requestor);
6351
6352 /* Set the newly created channel's callid to the same as the requestor. */
6353 callid = ast_channel_callid(requestor);
6354 if (callid) {
6355 ast_channel_callid_set(c, callid);
6356 }
6357
6359 ast_channel_unlock((struct ast_channel *) requestor);
6360 }
6361
6362 if (set_security_requirements(requestor, c)) {
6363 ast_log(LOG_WARNING, "Setting security requirements failed\n");
6364 ast_hangup(c);
6366 return NULL;
6367 }
6368
6369 /* no need to generate a Newchannel event here; it is done in the channel_alloc call */
6370 return c;
6371}
#define AST_CAUSE_BEARERCAPABILITY_NOTAVAIL
Definition: causes.h:130
#define AST_CAUSE_NOTDEFINED
Definition: causes.h:155
#define AST_CAUSE_NOSUCHDRIVER
Definition: causes.h:156
static int set_security_requirements(const struct ast_channel *requestor, struct ast_channel *out)
Definition: channel.c:6198
void ast_channel_callid_set(struct ast_channel *chan, ast_callid value)
int ast_format_cap_empty(const struct ast_format_cap *cap)
Determine if a format cap has no formats in it.
Definition: format_cap.c:744
void ast_format_cap_remove_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Remove all formats matching a specific format type.
Definition: format_cap.c:523
void ast_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition: stream.c:746
struct ast_stream_topology * ast_stream_topology_create_from_format_cap(struct ast_format_cap *cap)
A helper function that, given a format capabilities structure, creates a topology and separates the m...
Definition: stream.c:851
struct ast_format_cap * ast_stream_topology_get_formats(struct ast_stream_topology *topology)
Create a format capabilities structure representing the topology.
Definition: stream.c:933

References ao2_cleanup, ao2_ref, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, AST_CAUSE_NOSUCHDRIVER, AST_CAUSE_NOTDEFINED, ast_channel_callid(), ast_channel_callid_set(), ast_channel_lock_both, ast_channel_unlock, ast_format_cap_alloc, ast_format_cap_append, ast_format_cap_append_from_cap(), ast_format_cap_empty(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_names(), AST_FORMAT_CAP_NAMES_LEN, ast_format_cap_remove_by_type(), ast_hangup(), ast_log, AST_MEDIA_TYPE_AUDIO, AST_MEDIA_TYPE_UNKNOWN, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_str_alloca, ast_stream_topology_create_from_format_cap(), ast_stream_topology_free(), ast_stream_topology_get_formats(), ast_translator_best_choice(), c, chanlist::chan, LOG_WARNING, NULL, RAII_VAR, set_security_requirements(), chanlist::tech, and type.

Referenced by ast_request(), and ast_request_with_stream_topology().

◆ safe_sleep_conditional()

static int safe_sleep_conditional ( struct ast_channel chan,
int  timeout_ms,
int(*)(void *)  cond,
void *  data,
unsigned int  generate_silence 
)
static

Wait, look for hangups and condition arg.

Definition at line 1517 of file channel.c.

1518{
1519 struct ast_frame *f;
1520 struct ast_silence_generator *silgen = NULL;
1521 int res = 0;
1522 struct timeval start;
1523 int ms;
1524 AST_LIST_HEAD_NOLOCK(, ast_frame) deferred_frames;
1525
1526 AST_LIST_HEAD_INIT_NOLOCK(&deferred_frames);
1527
1528 /* If no other generator is present, start silencegen while waiting */
1529 if (generate_silence && ast_opt_transmit_silence && !ast_channel_generatordata(chan)) {
1531 }
1532
1533 start = ast_tvnow();
1534 while ((ms = ast_remaining_ms(start, timeout_ms))) {
1535 struct ast_frame *dup_f = NULL;
1536
1537 if (cond && ((*cond)(data) == 0)) {
1538 break;
1539 }
1540 ms = ast_waitfor(chan, ms);
1541 if (ms < 0) {
1542 res = -1;
1543 break;
1544 }
1545 if (ms > 0) {
1546 f = ast_read(chan);
1547 if (!f) {
1548 res = -1;
1549 break;
1550 }
1551
1552 if (!ast_is_deferrable_frame(f)) {
1553 ast_frfree(f);
1554 continue;
1555 }
1556
1557 if ((dup_f = ast_frisolate(f))) {
1558 if (dup_f != f) {
1559 ast_frfree(f);
1560 }
1561 AST_LIST_INSERT_HEAD(&deferred_frames, dup_f, frame_list);
1562 }
1563 }
1564 }
1565
1566 /* stop silgen if present */
1567 if (silgen) {
1569 }
1570
1571 /* We need to free all the deferred frames, but we only need to
1572 * queue the deferred frames if there was no error and no
1573 * hangup was received
1574 */
1575 ast_channel_lock(chan);
1576 while ((f = AST_LIST_REMOVE_HEAD(&deferred_frames, frame_list))) {
1577 if (!res) {
1578 ast_queue_frame_head(chan, f);
1579 }
1580 ast_frfree(f);
1581 }
1582 ast_channel_unlock(chan);
1583
1584 return res;
1585}
int ast_is_deferrable_frame(const struct ast_frame *frame)
Should we keep this frame for later?
Definition: channel.c:1486

References ast_channel_generatordata(), ast_channel_lock, ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_channel_unlock, ast_frfree, ast_frisolate, ast_is_deferrable_frame(), AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_HEAD_NOLOCK, AST_LIST_INSERT_HEAD, AST_LIST_REMOVE_HEAD, ast_opt_transmit_silence, ast_queue_frame_head(), ast_read(), ast_remaining_ms(), ast_tvnow(), ast_waitfor(), cond, ast_frame::data, and NULL.

Referenced by ast_safe_sleep(), ast_safe_sleep_conditional(), and ast_safe_sleep_without_silence().

◆ send_dtmf_begin_event()

static void send_dtmf_begin_event ( struct ast_channel chan,
enum DtmfDirection  direction,
const char  digit 
)
static

Definition at line 3389 of file channel.c.

3391{
3392 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
3393 char digit_str[] = { digit, '\0' };
3394
3395 blob = ast_json_pack("{ s: s, s: s }",
3396 "digit", digit_str,
3397 "direction", dtmf_direction_to_string(direction));
3398 if (!blob) {
3399 return;
3400 }
3401
3403}
static const char * dtmf_direction_to_string(enum DtmfDirection direction)
Definition: channel.c:3377
struct stasis_message_type * ast_channel_dtmf_begin_type(void)
Message type for when DTMF begins on a channel.

References ast_channel_dtmf_begin_type(), ast_channel_publish_blob(), ast_json_pack(), ast_json_unref(), digit, dtmf_direction_to_string(), NULL, and RAII_VAR.

Referenced by __ast_read(), and ast_write_stream().

◆ send_dtmf_end_event()

static void send_dtmf_end_event ( struct ast_channel chan,
enum DtmfDirection  direction,
const char  digit,
long  duration_ms 
)
static

Definition at line 3405 of file channel.c.

3407{
3408 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
3409 char digit_str[] = { digit, '\0' };
3410
3411 blob = ast_json_pack("{ s: s, s: s, s: I }",
3412 "digit", digit_str,
3413 "direction", dtmf_direction_to_string(direction),
3414 "duration_ms", (ast_json_int_t)duration_ms);
3415 if (!blob) {
3416 return;
3417 }
3418
3420}
struct stasis_message_type * ast_channel_dtmf_end_type(void)
Message type for when DTMF ends on a channel.
AST_JSON_INT_T ast_json_int_t
Primarily used to cast when packing to an "I" type.
Definition: json.h:87

References ast_channel_dtmf_end_type(), ast_channel_publish_blob(), ast_json_pack(), ast_json_unref(), digit, dtmf_direction_to_string(), NULL, and RAII_VAR.

Referenced by __ast_read(), and ast_write_stream().

◆ send_flash_event()

static void send_flash_event ( struct ast_channel chan)
static

Definition at line 3422 of file channel.c.

3423{
3425}
struct stasis_message_type * ast_channel_flash_type(void)
Message type for when a hook flash occurs on a channel.

References ast_channel_flash_type(), ast_channel_publish_blob(), and NULL.

Referenced by __ast_read().

◆ send_wink_event()

static void send_wink_event ( struct ast_channel chan)
static

Definition at line 3427 of file channel.c.

3428{
3430}
struct stasis_message_type * ast_channel_wink_type(void)
Message type for when a wink occurs on a channel.

References ast_channel_publish_blob(), ast_channel_wink_type(), and NULL.

Referenced by __ast_read().

◆ set_channel_answer_time()

static void set_channel_answer_time ( struct ast_channel chan)
static

Definition at line 2647 of file channel.c.

2648{
2650 struct timeval answertime;
2651
2652 answertime = ast_tvnow();
2653 ast_channel_answertime_set(chan, &answertime);
2654 }
2655}
void ast_channel_answertime_set(struct ast_channel *chan, struct timeval *value)

References ast_channel_answertime(), ast_channel_answertime_set(), ast_tvnow(), and ast_tvzero().

Referenced by __ast_read(), and ast_raw_answer_with_stream_topology().

◆ set_format()

static int set_format ( struct ast_channel chan,
struct ast_format_cap cap_set,
const int  direction,
int  interleaved_stereo 
)
static

Definition at line 5612 of file channel.c.

5613{
5614 struct ast_trans_pvt *trans_pvt;
5615 struct ast_format_cap *cap_native;
5616 const struct set_format_access *access;
5617 struct ast_format *rawformat;
5618 struct ast_format *format;
5619 RAII_VAR(struct ast_format *, best_set_fmt, NULL, ao2_cleanup);
5620 RAII_VAR(struct ast_format *, best_native_fmt, NULL, ao2_cleanup);
5621 int res;
5622
5623 if (!direction) {
5624 /* reading */
5625 access = &set_format_access_read;
5626 } else {
5627 /* writing */
5628 access = &set_format_access_write;
5629 }
5630
5632 if (!best_set_fmt) {
5633 /*
5634 * Not setting any audio formats?
5635 * Assume a call without any sounds (video, text)
5636 */
5637 return 0;
5638 }
5639
5640 /* See if the underlying channel driver is capable of performing transcoding for us */
5641 res = ast_channel_setoption(chan, access->setoption,
5642 &best_set_fmt, sizeof(best_set_fmt), 0);
5643 if (!res) {
5644 ast_debug(1, "Channel driver natively set channel %s to %s format %s\n",
5645 ast_channel_name(chan), access->direction, ast_format_get_name(best_set_fmt));
5646
5647 ast_channel_lock(chan);
5649 if (!cap_native
5650 || ast_format_cap_append(cap_native, best_set_fmt, 0)) {
5651 ast_channel_unlock(chan);
5652 ao2_cleanup(cap_native);
5653 return -1;
5654 }
5655 ast_channel_nativeformats_set(chan, cap_native);
5656 ao2_cleanup(cap_native);
5657 access->set_format(chan, best_set_fmt);
5658 access->set_rawformat(chan, best_set_fmt);
5659
5660 trans_pvt = access->get_trans(chan);
5661 if (trans_pvt) {
5662 ast_translator_free_path(trans_pvt);
5663 access->set_trans(chan, NULL);
5664 }
5665 ast_channel_unlock(chan);
5666
5667 /* If there is a generator on the channel, it needs to know about this
5668 * change if it is the write format. */
5669 if (direction && ast_channel_generatordata(chan)) {
5671 }
5672
5673 return 0;
5674 }
5675
5676 ast_channel_lock(chan);
5677
5678 format = access->get_format(chan);
5679 rawformat = access->get_rawformat(chan);
5680 ast_assert(format != NULL);
5681 ast_assert(rawformat != NULL);
5682
5683 cap_native = ast_channel_nativeformats(chan);
5684 if (ast_format_cap_empty(cap_native)) {
5685 ast_channel_unlock(chan);
5686 ast_log(LOG_ERROR, "Unable to set format because channel %s supports no formats\n",
5687 ast_channel_name(chan));
5688 return -1;
5689 }
5690
5691 /* Find a translation path from the native format to one of the desired formats */
5692 if (!direction) {
5693 /* reading */
5694 res = ast_translator_best_choice(cap_set, cap_native, &best_set_fmt, &best_native_fmt);
5695 } else {
5696 /* writing */
5697 res = ast_translator_best_choice(cap_native, cap_set, &best_native_fmt, &best_set_fmt);
5698 }
5699 if (res < 0) {
5700 struct ast_str *codec_native = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5701 struct ast_str *codec_set = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5702
5703 ast_format_cap_get_names(cap_native, &codec_native);
5704 ast_channel_unlock(chan);
5705 ast_format_cap_get_names(cap_set, &codec_set);
5706
5707 ast_log(LOG_WARNING, "Unable to find a codec translation path: %s -> %s\n",
5708 ast_str_buffer(direction ? codec_set : codec_native),
5709 ast_str_buffer(direction ? codec_native : codec_set));
5710 return -1;
5711 }
5712
5713 /* Now we have a good choice for both. */
5714 trans_pvt = access->get_trans(chan);
5715 if ((ast_format_cmp(rawformat, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
5716 (ast_format_cmp(format, best_set_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
5717 ((ast_format_cmp(rawformat, format) != AST_FORMAT_CMP_NOT_EQUAL) || access->get_trans(chan))) {
5718 /* the channel is already in these formats, so nothing to do, unless the interleaved format is not set correctly */
5719 if (trans_pvt != NULL) {
5720 if (trans_pvt->interleaved_stereo == interleaved_stereo) {
5721 ast_channel_unlock(chan);
5722 return 0;
5723 }
5724 }
5725 }
5726
5727 /* Free any translation we have right now */
5728 if (trans_pvt) {
5729 ast_translator_free_path(trans_pvt);
5730 access->set_trans(chan, NULL);
5731 }
5732
5733 /* Build a translation path from the raw format to the desired format */
5734 if (ast_format_cmp(best_set_fmt, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) {
5735 /*
5736 * If we were able to swap the native format to the format that
5737 * has been requested, then there is no need to try to build
5738 * a translation path.
5739 */
5740 res = 0;
5741 } else {
5742 if (!direction) {
5743 /* reading */
5744 trans_pvt = ast_translator_build_path(best_set_fmt, best_native_fmt);
5745 if (trans_pvt) {
5746 trans_pvt->interleaved_stereo = 0;
5747 }
5748 } else {
5749 /* writing */
5750 trans_pvt = ast_translator_build_path(best_native_fmt, best_set_fmt);
5751 if (trans_pvt) {
5752 trans_pvt->interleaved_stereo = interleaved_stereo;
5753 }
5754 }
5755 access->set_trans(chan, trans_pvt);
5756 res = trans_pvt ? 0 : -1;
5757 }
5758
5759 if (!res) {
5760 access->set_format(chan, best_set_fmt);
5761 access->set_rawformat(chan, best_native_fmt);
5762
5763 ast_debug(1, "Channel %s setting %s format path: %s -> %s\n",
5764 ast_channel_name(chan),
5765 access->direction,
5766 ast_format_get_name(direction ? best_set_fmt : best_native_fmt),
5767 ast_format_get_name(direction ? best_native_fmt : best_set_fmt));
5768 }
5769
5770 ast_channel_unlock(chan);
5771
5772 /* If there is a generator on the channel, it needs to know about this
5773 * change if it is the write format. */
5774 if (direction && ast_channel_generatordata(chan)) {
5776 }
5777
5778 return res;
5779}
static void generator_write_format_change(struct ast_channel *chan)
Definition: channel.c:2923
int ast_channel_setoption(struct ast_channel *chan, int option, void *data, int datalen, int block)
Sets an option on a channel.
Definition: channel.c:7444
static const struct set_format_access set_format_access_write
Definition: channel.c:5601
static const struct set_format_access set_format_access_read
Definition: channel.c:5590
struct ast_format * ast_format_cap_get_best_by_type(const struct ast_format_cap *cap, enum ast_media_type type)
Get the most preferred format for a particular media type.
Definition: format_cap.c:417
int interleaved_stereo
Definition: translate.h:238
struct ast_format *(* get_format)(struct ast_channel *chan)
Definition: channel.c:5583
void(* set_trans)(struct ast_channel *chan, struct ast_trans_pvt *value)
Definition: channel.c:5582
void(* set_rawformat)(struct ast_channel *chan, struct ast_format *format)
Definition: channel.c:5586
struct ast_trans_pvt *(* get_trans)(const struct ast_channel *chan)
Definition: channel.c:5581
void(* set_format)(struct ast_channel *chan, struct ast_format *format)
Definition: channel.c:5584
const char * direction
Definition: channel.c:5580
struct ast_format *(* get_rawformat)(struct ast_channel *chan)
Definition: channel.c:5585

References ao2_cleanup, ast_assert, ast_channel_generatordata(), ast_channel_lock, ast_channel_name(), ast_channel_nativeformats(), ast_channel_nativeformats_set(), ast_channel_setoption(), ast_channel_unlock, ast_debug, ast_format_cap_alloc, ast_format_cap_append, ast_format_cap_empty(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_best_by_type(), ast_format_cap_get_names(), AST_FORMAT_CAP_NAMES_LEN, ast_format_cmp(), AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_name(), ast_log, AST_MEDIA_TYPE_AUDIO, ast_str_alloca, ast_str_buffer(), ast_translator_best_choice(), ast_translator_build_path(), ast_translator_free_path(), set_format_access::direction, generator_write_format_change(), set_format_access::get_format, set_format_access::get_rawformat, set_format_access::get_trans, ast_trans_pvt::interleaved_stereo, LOG_ERROR, LOG_WARNING, NULL, RAII_VAR, set_format_access::set_format, set_format_access_read, set_format_access_write, set_format_access::set_rawformat, set_format_access::set_trans, and set_format_access::setoption.

Referenced by ast_set_read_format(), ast_set_read_format_from_cap(), ast_set_write_format(), ast_set_write_format_from_cap(), and ast_set_write_format_interleaved_stereo().

◆ set_security_requirements()

static int set_security_requirements ( const struct ast_channel requestor,
struct ast_channel out 
)
static

Definition at line 6198 of file channel.c.

6199{
6200 int ops[2][2] = {
6203 };
6204 int i;
6205 struct ast_channel *r = (struct ast_channel *) requestor; /* UGLY */
6206 struct ast_datastore *ds;
6207
6208 if (!requestor || !out) {
6209 return 0;
6210 }
6211
6214 struct ast_secure_call_store *encrypt = ds->data;
6215 ops[0][1] = encrypt->signaling;
6216 ops[1][1] = encrypt->media;
6217 } else {
6219 return 0;
6220 }
6222
6223 for (i = 0; i < 2; i++) {
6224 if (ops[i][1]) {
6225 if (ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0)) {
6226 /* We require a security feature, but the channel won't provide it */
6227 return -1;
6228 }
6229 } else {
6230 /* We don't care if we can't clear the option on a channel that doesn't support it */
6231 ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0);
6232 }
6233 }
6234
6235 return 0;
6236}
const struct ast_datastore_info secure_call_info
#define AST_OPTION_SECURE_MEDIA
#define AST_OPTION_SECURE_SIGNALING
FILE * out
Definition: utils/frame.c:33

References ast_channel_datastore_find(), ast_channel_lock, ast_channel_setoption(), ast_channel_unlock, AST_OPTION_SECURE_MEDIA, AST_OPTION_SECURE_SIGNALING, ast_datastore::data, ast_secure_call_store::media, NULL, out, secure_call_info, and ast_secure_call_store::signaling.

Referenced by request_channel().

◆ should_skip_dtmf()

static int should_skip_dtmf ( struct ast_channel chan)
inlinestatic

Determine whether or not we should ignore DTMF in the readq.

Definition at line 3504 of file channel.c.

3505{
3507 /* We're in the middle of emulating a digit, or DTMF has been
3508 * explicitly deferred. Skip this digit, then. */
3509 return 1;
3510 }
3511
3512 if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
3514 /* We're not in the middle of a digit, but it hasn't been long enough
3515 * since the last digit, so we'll have to skip DTMF for now. */
3516 return 1;
3517 }
3518
3519 return 0;
3520}

References ast_channel_dtmf_tv(), ast_channel_flags(), AST_FLAG_DEFER_DTMF, AST_FLAG_EMULATE_DTMF, AST_MIN_DTMF_GAP, ast_test_flag, ast_tvdiff_ms(), ast_tvnow(), and ast_tvzero().

Referenced by __ast_read().

◆ should_trigger_dtmf_emulating()

static int should_trigger_dtmf_emulating ( struct ast_channel chan)
inlinestatic

Determine whether or not we have to trigger dtmf emulating using 50 fps timer events especially when no voice frames are received during dtmf processing (direct media or muted sender case using SIP INFO)

Definition at line 2874 of file channel.c.

2875{
2877 /* We're in the middle of emulating a digit, or DTMF has been
2878 * explicitly deferred. Trigger dtmf with periodic 50 pfs timer events, then. */
2879 return 1;
2880 }
2881
2882 if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
2884 /*
2885 * We're not in the middle of a digit, but it hasn't been long enough
2886 * since the last digit, so we'll have to trigger DTMF further on.
2887 * Using 2 times AST_MIN_DTMF_GAP to trigger readq reading for possible
2888 * buffered next dtmf event
2889 */
2890 return 1;
2891 }
2892
2893 return 0;
2894}

References ast_channel_dtmf_tv(), ast_channel_flags(), AST_FLAG_DEFER_DTMF, AST_FLAG_EMULATE_DTMF, AST_MIN_DTMF_GAP, ast_test_flag, ast_tvdiff_ms(), ast_tvnow(), and ast_tvzero().

Referenced by __ast_read(), and ast_deactivate_generator().

◆ silence_generator_alloc()

static void * silence_generator_alloc ( struct ast_channel chan,
void *  data 
)
static

Definition at line 8146 of file channel.c.

8147{
8148 /* just store the data pointer in the channel structure */
8149 return data;
8150}

◆ silence_generator_generate()

static int silence_generator_generate ( struct ast_channel chan,
void *  data,
int  len,
int  samples 
)
static

Definition at line 8157 of file channel.c.

8158{
8159 short buf[samples];
8160 struct ast_frame frame = {
8162 .data.ptr = buf,
8163 .samples = samples,
8164 .datalen = sizeof(buf),
8165 };
8167
8168 memset(buf, 0, sizeof(buf));
8169
8170 if (ast_write(chan, &frame))
8171 return -1;
8172
8173 return 0;
8174}

References ast_format_slin, AST_FRAME_VOICE, ast_write(), buf, ast_frame_subclass::format, ast_frame::frametype, ast_frame::samples, and ast_frame::subclass.

◆ silence_generator_release()

static void silence_generator_release ( struct ast_channel chan,
void *  data 
)
static

Definition at line 8152 of file channel.c.

8153{
8154 /* nothing to do */
8155}

◆ suppress_datastore_destroy_cb()

static void suppress_datastore_destroy_cb ( void *  data)
static

Definition at line 10726 of file channel.c.

10727{
10728 ao2_cleanup(data);
10729}

References ao2_cleanup.

◆ suppress_framehook_destroy_cb()

static void suppress_framehook_destroy_cb ( void *  data)
static

Definition at line 10736 of file channel.c.

10737{
10738 ao2_cleanup(data);
10739}

References ao2_cleanup.

Referenced by ast_channel_suppress().

◆ suppress_framehook_event_cb()

static struct ast_frame * suppress_framehook_event_cb ( struct ast_channel chan,
struct ast_frame frame,
enum ast_framehook_event  event,
void *  data 
)
static

Definition at line 10754 of file channel.c.

10755{
10756 struct suppress_data *suppress = data;
10757 int suppress_frame = 0;
10758
10759 if (!frame) {
10760 return NULL;
10761 }
10762
10763 if (frame->frametype != suppress->frametype) {
10764 return frame;
10765 }
10766
10768 suppress_frame = 1;
10769 } else if (event == AST_FRAMEHOOK_EVENT_WRITE && (suppress->direction & AST_MUTE_DIRECTION_WRITE)) {
10770 suppress_frame = 1;
10771 }
10772
10773 if (suppress_frame) {
10774 switch (frame->frametype) {
10775 case AST_FRAME_VOICE:
10777 ast_frfree(frame);
10778 }
10779 frame = &ast_null_frame;
10780 break;
10781 default:
10782 break;
10783 }
10784 }
10785
10786 return frame;
10787}
#define AST_MUTE_DIRECTION_READ
Definition: channel.h:4760
#define AST_MUTE_DIRECTION_WRITE
Definition: channel.h:4761
@ AST_FRAMEHOOK_EVENT_WRITE
Definition: framehook.h:153
@ AST_FRAMEHOOK_EVENT_READ
Definition: framehook.h:152
Definition: astman.c:222

References AST_FRAME_VOICE, AST_FRAMEHOOK_EVENT_READ, AST_FRAMEHOOK_EVENT_WRITE, ast_frfree, AST_MUTE_DIRECTION_READ, AST_MUTE_DIRECTION_WRITE, ast_null_frame, suppress_data::direction, ast_frame::frametype, suppress_data::frametype, and NULL.

Referenced by ast_channel_suppress().

◆ suppress_framehook_fixup_cb()

static void suppress_framehook_fixup_cb ( void *  data,
int  framehook_id,
struct ast_channel old_chan,
struct ast_channel new_chan 
)
static

Definition at line 10747 of file channel.c.

10748{
10749 struct suppress_data *suppress = data;
10750
10751 suppress->framehook_id = framehook_id;
10752}

References suppress_data::framehook_id.

Referenced by ast_channel_suppress().

◆ suppress_get_datastore_information()

static const struct ast_datastore_info * suppress_get_datastore_information ( enum ast_frame_type  frametype)
static

Definition at line 10789 of file channel.c.

10790{
10791 switch (frametype) {
10792 case AST_FRAME_VOICE:
10794 default:
10795 return NULL;
10796 }
10797}
static const struct ast_datastore_info suppress_datastore_voice
Definition: channel.c:10731

References AST_FRAME_VOICE, NULL, and suppress_datastore_voice.

Referenced by ast_channel_suppress(), and ast_channel_unsuppress().

◆ tech_write()

static int tech_write ( struct ast_channel chan,
struct ast_stream stream,
struct ast_stream default_stream,
struct ast_frame frame 
)
static

Definition at line 5151 of file channel.c.

5153{
5154 if (ast_channel_tech(chan)->write_stream) {
5155 return stream ? ast_channel_tech(chan)->write_stream(
5156 chan, ast_stream_get_position(stream), frame) : 0;
5157 }
5158
5159 return ((stream == default_stream) && ast_channel_tech(chan)->write) ?
5160 ast_channel_tech(chan)->write(chan, frame) : 0;
5161}

References ast_channel_tech(), ast_stream_get_position(), ast_channel_tech::write, write_stream(), and ast_channel_tech::write_stream.

Referenced by ast_write_stream().

◆ tonepair_alloc()

static void * tonepair_alloc ( struct ast_channel chan,
void *  params 
)
static

Definition at line 7520 of file channel.c.

7521{
7522 struct tonepair_state *ts;
7523 struct tonepair_def *td = params;
7524
7525 if (!(ts = ast_calloc(1, sizeof(*ts)))) {
7526 return NULL;
7527 }
7528
7531 ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", ast_channel_name(chan));
7533 ts = NULL;
7534 } else {
7535 ts->fac1 = 2.0 * cos(2.0 * M_PI * (td->freq1 / 8000.0)) * 32768.0;
7536 ts->v1_1 = 0;
7537 ts->v2_1 = sin(-4.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
7538 ts->v3_1 = sin(-2.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
7539 ts->v2_1 = 0;
7540 ts->fac2 = 2.0 * cos(2.0 * M_PI * (td->freq2 / 8000.0)) * 32768.0;
7541 ts->v2_2 = sin(-4.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
7542 ts->v3_2 = sin(-2.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
7543 ts->duration = td->duration;
7544 ts->modulate = 0;
7545 }
7546 /* Let interrupts interrupt :) */
7548 return ts;
7549}
unsigned int cos
Definition: chan_iax2.c:356
static void tonepair_release(struct ast_channel *chan, void *params)
Definition: channel.c:7509
#define M_PI
Definition: resample.c:83
struct ast_format * origwfmt
Definition: channel.c:7500

References ao2_bump, ast_calloc, ast_channel_flags(), ast_channel_name(), ast_channel_writeformat(), AST_FLAG_WRITE_INT, ast_format_slin, ast_log, ast_set_flag, ast_set_write_format(), cos, tonepair_def::duration, tonepair_state::duration, tonepair_state::fac1, tonepair_state::fac2, tonepair_def::freq1, tonepair_def::freq2, LOG_WARNING, M_PI, tonepair_state::modulate, NULL, tonepair_state::origwfmt, tonepair_release(), tonepair_state::v1_1, tonepair_state::v2_1, tonepair_state::v2_2, tonepair_state::v3_1, tonepair_state::v3_2, and tonepair_def::vol.

◆ tonepair_generator()

static int tonepair_generator ( struct ast_channel chan,
void *  data,
int  len,
int  samples 
)
static

Definition at line 7551 of file channel.c.

7552{
7553 struct tonepair_state *ts = data;
7554 int x;
7555
7556 /* we need to prepare a frame with 16 * timelen samples as we're
7557 * generating SLIN audio
7558 */
7559 len = samples * 2;
7560
7561 if (len > sizeof(ts->data) / 2 - 1) {
7562 ast_log(LOG_WARNING, "Can't generate that much data!\n");
7563 return -1;
7564 }
7565 memset(&ts->f, 0, sizeof(ts->f));
7566 for (x=0;x<len/2;x++) {
7567 ts->v1_1 = ts->v2_1;
7568 ts->v2_1 = ts->v3_1;
7569 ts->v3_1 = (ts->fac1 * ts->v2_1 >> 15) - ts->v1_1;
7570
7571 ts->v1_2 = ts->v2_2;
7572 ts->v2_2 = ts->v3_2;
7573 ts->v3_2 = (ts->fac2 * ts->v2_2 >> 15) - ts->v1_2;
7574 if (ts->modulate) {
7575 int p;
7576 p = ts->v3_2 - 32768;
7577 if (p < 0) p = -p;
7578 p = ((p * 9) / 10) + 1;
7579 ts->data[x] = (ts->v3_1 * p) >> 15;
7580 } else
7581 ts->data[x] = ts->v3_1 + ts->v3_2;
7582 }
7585 ts->f.datalen = len;
7586 ts->f.samples = samples;
7588 ts->f.data.ptr = ts->data;
7589 ast_write(chan, &ts->f);
7590 ts->pos += x;
7591 if (ts->duration > 0) {
7592 if (ts->pos >= ts->duration * 8)
7593 return -1;
7594 }
7595 return 0;
7596}
struct ast_frame f
Definition: channel.c:7504
short data[4000]
Definition: channel.c:7506

References ast_format_slin, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log, ast_write(), ast_frame::data, tonepair_state::data, ast_frame::datalen, tonepair_state::duration, tonepair_state::f, tonepair_state::fac1, tonepair_state::fac2, ast_frame_subclass::format, ast_frame::frametype, len(), LOG_WARNING, tonepair_state::modulate, ast_frame::offset, tonepair_state::pos, ast_frame::ptr, ast_frame::samples, ast_frame::subclass, tonepair_state::v1_1, tonepair_state::v1_2, tonepair_state::v2_1, tonepair_state::v2_2, tonepair_state::v3_1, and tonepair_state::v3_2.

◆ tonepair_release()

static void tonepair_release ( struct ast_channel chan,
void *  params 
)
static

Definition at line 7509 of file channel.c.

7510{
7511 struct tonepair_state *ts = params;
7512
7513 if (chan) {
7514 ast_set_write_format(chan, ts->origwfmt);
7515 }
7516 ao2_cleanup(ts->origwfmt);
7517 ast_free(ts);
7518}

References ao2_cleanup, ast_free, ast_set_write_format(), and tonepair_state::origwfmt.

Referenced by tonepair_alloc().

◆ varshead_dtor()

static void varshead_dtor ( void *  obj)
static

Destructor for lists of variables.

Parameters
objAO2 object.

Definition at line 7923 of file channel.c.

7924{
7925 struct varshead *head = obj;
7926 struct ast_var_t *var;
7927
7928 while ((var = AST_RWLIST_REMOVE_HEAD(head, entries))) {
7930 }
7931}

References AST_RWLIST_REMOVE_HEAD, ast_var_delete(), ast_var_t::entries, and var.

Referenced by ast_channel_get_vars(), and channel_get_external_vars().

Variable Documentation

◆ ami_vars

struct external_vars ami_vars
static

◆ ari_vars

struct external_vars ari_vars
static

◆ ast_kill_tech

const struct ast_channel_tech ast_kill_tech

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_moh_cleanup_ptr

void(* ast_moh_cleanup_ptr) (struct ast_channel *) ( struct ast_channel ) = NULL
static

◆ ast_moh_start_ptr

int(* ast_moh_start_ptr) (struct ast_channel *, const char *, const char *) ( struct ast_channel ,
const char *  ,
const char *   
) = NULL
static

◆ ast_moh_stop_ptr

void(* ast_moh_stop_ptr) (struct ast_channel *) ( struct ast_channel ) = NULL
static

◆ backends

struct backends backends = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
static

◆ bridge_features_info

const struct ast_datastore_info bridge_features_info
static
Initial value:
= {
.type = "bridge-features",
.destroy = features_destroy,
}
static void features_destroy(void *obj)
Definition: channel.c:10915

Definition at line 10920 of file channel.c.

Referenced by ast_channel_feature_hooks_get(), and channel_feature_hooks_set_full().

◆ causes

const struct causes_map causes[]
static

Definition at line 136 of file channel.c.

Referenced by ast_cause2str(), ast_str2cause(), and dump_cause().

◆ cc_channel_datastore_info

const struct ast_datastore_info cc_channel_datastore_info
static
Initial value:
= {
.type = "Call Completion",
.duplicate = channel_cc_params_copy,
}
static void * channel_cc_params_copy(void *data)
Definition: channel.c:10450
static void channel_cc_params_destroy(void *data)
Definition: channel.c:10461

Definition at line 10467 of file channel.c.

Referenced by ast_channel_cc_params_init(), and ast_channel_get_cc_config_params().

◆ chancount

int chancount
static

◆ channel_move_lock

ast_mutex_t channel_move_lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} }
static

Mutex that prevents multiple ast_channel_move() operations from occurring simultaneously. This is necessary since the involved channels have to be locked and unlocked throughout the move operation.

The most important data being protected are the masq and masqr data on channels. We don't want them getting criss-crossed due to multiple moves mucking with them.

Definition at line 10686 of file channel.c.

Referenced by ast_channel_move().

◆ channels

struct ao2_container* channels
static

◆ cli_channel

struct ast_cli_entry cli_channel[]
static
Initial value:
= {
{ .handler = handle_cli_core_show_channeltypes , .summary = "List available channel types" ,},
{ .handler = handle_cli_core_show_channeltype , .summary = "Give more details on that channel type" ,}
}
static char * handle_cli_core_show_channeltype(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Show details about a channel driver - CLI command.
Definition: channel.c:326
static char * handle_cli_core_show_channeltypes(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Show channel types - CLI command.
Definition: channel.c:261

Definition at line 390 of file channel.c.

Referenced by ast_channels_init(), and channels_shutdown().

◆ global_fin

unsigned long global_fin

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

Referenced by __ast_channel_alloc_ap().

◆ null_tech

const struct ast_channel_tech null_tech
static
Initial value:
= {
.type = "NULL",
.description = "Null channel (should not see this)",
}

Definition at line 702 of file channel.c.

Referenced by __ast_channel_alloc_ap().

◆ plc_ds_info

const struct ast_datastore_info plc_ds_info
static
Initial value:
= {
.type = "plc",
.destroy = plc_ds_destroy,
}
static void plc_ds_destroy(void *data)
Definition: channel.c:5060

Definition at line 5067 of file channel.c.

Referenced by apply_plc().

◆ set_format_access_read

const struct set_format_access set_format_access_read
static

Definition at line 5590 of file channel.c.

Referenced by set_format().

◆ set_format_access_write

const struct set_format_access set_format_access_write
static

Definition at line 5601 of file channel.c.

Referenced by set_format().

◆ silence_generator

struct ast_generator silence_generator
static
Initial value:
= {
}
static int silence_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
Definition: channel.c:8157
static void silence_generator_release(struct ast_channel *chan, void *data)
Definition: channel.c:8152
static void * silence_generator_alloc(struct ast_channel *chan, void *data)
Definition: channel.c:8146

Definition at line 8176 of file channel.c.

Referenced by ast_channel_start_silence_generator(), and deactivate_silence_generator().

◆ state2str_threadbuf

struct ast_threadstorage state2str_threadbuf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_state2str_threadbuf , .custom_init = NULL , }
static

Definition at line 97 of file channel.c.

Referenced by ast_state2str().

◆ suppress_datastore_voice

const struct ast_datastore_info suppress_datastore_voice
static
Initial value:
= {
.type = "suppressvoice",
}
static void suppress_datastore_destroy_cb(void *data)
Definition: channel.c:10726

Definition at line 10731 of file channel.c.

Referenced by suppress_get_datastore_information().

◆ surrogate_tech

const struct ast_channel_tech surrogate_tech
static
Initial value:
= {
.type = "Surrogate",
.description = "Surrogate channel used to pull channel from an application",
.properties = AST_CHAN_TP_INTERNAL,
}
@ AST_CHAN_TP_INTERNAL
Channels with this particular technology are an implementation detail of Asterisk and should generall...
Definition: channel.h:991

Channel technology used to extract a channel from a running application. The channel created with this technology will be immediately hung up - most external applications won't ever want to see this.

Definition at line 696 of file channel.c.

Referenced by ast_channels_init(), and channels_shutdown().

◆ tonepair

struct ast_generator tonepair
static
Initial value:
= {
.alloc = tonepair_alloc,
.release = tonepair_release,
.generate = tonepair_generator,
}
static int tonepair_generator(struct ast_channel *chan, void *data, int len, int samples)
Definition: channel.c:7551
static void * tonepair_alloc(struct ast_channel *chan, void *params)
Definition: channel.c:7520

Definition at line 7598 of file channel.c.

Referenced by ast_tonepair_start().