Asterisk - The Open Source Telephony Project  18.5.0
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, 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_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)
 
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_macro (struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const void *connected_info, int is_caller, int is_frame)
 Run a connected line interception macro and update a channel's connected line information. 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_macro (struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const void *redirecting_info, int is_caller, int is_frame)
 Run a redirecting interception macro and update a channel's redirecting information. 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_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 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.

Referenced by __ast_read(), ast_senddigit(), and ast_senddigit_external().

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

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

◆ DEFAULT_AMA_FLAGS

#define DEFAULT_AMA_FLAGS   AST_AMA_DOCUMENTATION

Definition at line 108 of file channel.c.

Referenced by __ast_channel_alloc_ap(), and ast_channel_string2amaflag().

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

Referenced by ast_senddigit_mf().

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

Referenced by ast_state2str().

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

8757  {
8761  AST_CONNECTED_LINE_ID_PRESENTATION,/* Combined number and name presentation. */
8769  /*
8770  * No more party id combined number and name presentation values
8771  * need to be created.
8772  */
8791 };

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

9232  {
9236  AST_REDIRECTING_FROM_ID_PRESENTATION,/* Combined number and name presentation. */
9240  AST_REDIRECTING_TO_ID_PRESENTATION,/* Combined number and name presentation. */
9254  /*
9255  * No more party id combined number and name presentation values
9256  * need to be created.
9257  */
9323 };

◆ DtmfDirection

Enumerator
DTMF_RECEIVED 
DTMF_SENT 

Definition at line 3361 of file channel.c.

3361  {
3362  DTMF_RECEIVED,
3363  DTMF_SENT
3364 };

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

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

2705 {
2706  int res = 0;
2707  enum ast_channel_state old_state;
2708  SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2709 
2710  old_state = ast_channel_state(chan);
2711  if ((res = ast_raw_answer(chan))) {
2712  return res;
2713  }
2714 
2715  switch (old_state) {
2716  case AST_STATE_RINGING:
2717  case AST_STATE_RING:
2718  /* wait for media to start flowing, but don't wait any longer
2719  * than 'delay' or 500 milliseconds, whichever is longer
2720  */
2721  do {
2723  struct ast_frame *cur;
2724  struct ast_frame *new_frame;
2725  int timeout_ms = MAX(delay, 500);
2726  unsigned int done = 0;
2727  struct timeval start;
2728 
2730 
2731  start = ast_tvnow();
2732  for (;;) {
2733  int ms = ast_remaining_ms(start, timeout_ms);
2734  ms = ast_waitfor(chan, ms);
2735  if (ms < 0) {
2736  ast_log(LOG_WARNING, "Error condition occurred when polling channel %s for a voice frame: %s\n", ast_channel_name(chan), strerror(errno));
2737  res = -1;
2738  break;
2739  }
2740  if (ms == 0) {
2741  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));
2742  break;
2743  }
2744  cur = ast_read(chan);
2745  if (!cur || ((cur->frametype == AST_FRAME_CONTROL) &&
2746  (cur->subclass.integer == AST_CONTROL_HANGUP))) {
2747  if (cur) {
2748  ast_frfree(cur);
2749  }
2750  res = -1;
2751  ast_debug(2, "Hangup of channel %s detected in answer routine\n", ast_channel_name(chan));
2752  break;
2753  }
2754 
2755  if ((new_frame = ast_frisolate(cur)) != cur) {
2756  ast_frfree(cur);
2757  }
2758 
2759  AST_LIST_INSERT_HEAD(&frames, new_frame, frame_list);
2760 
2761  /* if a specific delay period was requested, continue
2762  * until that delay has passed. don't stop just because
2763  * incoming media has arrived.
2764  */
2765  if (delay) {
2766  continue;
2767  }
2768 
2769  switch (new_frame->frametype) {
2770  /* all of these frametypes qualify as 'media' */
2771  case AST_FRAME_VOICE:
2772  case AST_FRAME_VIDEO:
2773  case AST_FRAME_TEXT:
2774  case AST_FRAME_TEXT_DATA:
2775  case AST_FRAME_DTMF_BEGIN:
2776  case AST_FRAME_DTMF_END:
2777  case AST_FRAME_IMAGE:
2778  case AST_FRAME_HTML:
2779  case AST_FRAME_MODEM:
2780  case AST_FRAME_RTCP:
2781  done = 1;
2782  break;
2783  case AST_FRAME_CONTROL:
2784  case AST_FRAME_IAX:
2787  case AST_FRAME_NULL:
2788  case AST_FRAME_CNG:
2789  break;
2790  }
2791 
2792  if (done) {
2793  break;
2794  }
2795  }
2796 
2797  ast_channel_lock(chan);
2798  while ((cur = AST_LIST_REMOVE_HEAD(&frames, frame_list))) {
2799  if (res == 0) {
2800  ast_queue_frame_head(chan, cur);
2801  }
2802  ast_frfree(cur);
2803  }
2804  ast_channel_unlock(chan);
2805  } while (0);
2806  break;
2807  default:
2808  break;
2809  }
2810 
2811  return res;
2812 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define LOG_WARNING
Definition: logger.h:274
ast_channel_state
ast_channel states
Definition: channelstate.h:35
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
struct ast_frame_subclass subclass
int done
Definition: test_amihooks.c:48
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
#define MAX(a, b)
Definition: utils.h:228
static int frames
Definition: parser.c:51
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
AST_LIST_HEAD_NOLOCK(contactliststruct, contact)
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition: main/utils.c:2033
int errno
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4302
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:710
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
int ast_raw_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2699
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680
#define SCOPE_TRACE(level,...)
Print a trace message with details when a scope is entered or existed.
Definition: logger.h:749
const char * ast_channel_name(const struct ast_channel *chan)
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3171
#define ast_frfree(fr)
Data structure associated with a single frame of data.
enum ast_frame_type frametype
int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to the head of a channel&#39;s frame queue.
Definition: channel.c:1144

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

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

Referenced by ast_change_name().

6840 {
6841  /*** DOCUMENTATION
6842  <managerEventInstance>
6843  <synopsis>Raised when the name of a channel is changed.</synopsis>
6844  </managerEventInstance>
6845  ***/
6846  ast_manager_event(chan, EVENT_FLAG_CALL, "Rename",
6847  "Channel: %s\r\n"
6848  "Newname: %s\r\n"
6849  "Uniqueid: %s\r\n",
6850  ast_channel_name(chan), newname, ast_channel_uniqueid(chan));
6851  ast_channel_name_set(chan, newname);
6852 }
#define EVENT_FLAG_CALL
Definition: manager.h:72
#define ast_manager_event(chan, category, event, contents,...)
Definition: manager.h:250
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_name_set(struct ast_channel *chan, const char *name)
Set the channel 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 960 of file channel.c.

References __ast_channel_alloc_ap(), and result.

967 {
968  va_list ap;
969  struct ast_channel *result;
970 
971  va_start(ap, name_fmt);
972  result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
973  assignedids, requestor, amaflag, endpoint, file, line, function, name_fmt, ap);
974  va_end(ap);
975 
976  return result;
977 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
Main Channel structure associated with a channel.
static char cid_num[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:164
static struct ast_channel * __ast_channel_alloc_ap(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, const char *file, int line, const char *function, const char *name_fmt, va_list ap)
Create a new channel structure.
Definition: channel.c:739
static char cid_name[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:165
static PGresult * result
Definition: cel_pgsql.c:88
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ __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,
const char *  file,
int  line,
const char *  function,
const char *  name_fmt,
va_list  ap 
)
static

Create a new channel structure.

Definition at line 739 of file channel.c.

References __ast_channel_internal_alloc(), 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_name_set(), 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, cid_name, cid_num, context, DEFAULT_AMA_FLAGS, does_id_conflict(), exten, make_ari_stubs::file, global_fin, global_fout, ast_party_caller::id, LOG_WARNING, name, ast_party_id::name, NULL, ast_party_id::number, OBJ_NOLOCK, S_OR, ast_party_name::str, ast_party_number::str, chanlist::tech, timer, tmp(), ast_party_name::valid, and ast_party_number::valid.

Referenced by __ast_channel_alloc().

744 {
745  struct ast_channel *tmp;
746  struct varshead *headp;
747  char *tech = "", *tech2 = NULL;
748  struct ast_format_cap *nativeformats;
749  struct ast_sched_context *schedctx;
750  struct ast_timer *timer;
751  struct timeval now;
752  const struct ast_channel_tech *channel_tech;
753  struct ast_stream_topology *topology;
754 
755  /* If shutting down, don't allocate any new channels */
756  if (ast_shutting_down()) {
757  ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
758  return NULL;
759  }
760 
761  tmp = __ast_channel_internal_alloc(ast_channel_destructor, assignedids, requestor,
762  file, line, function);
763  if (!tmp) {
764  /* Channel structure allocation failure. */
765  return NULL;
766  }
767 
769 
770  /*
771  * Init file descriptors to unopened state so
772  * the destructor can know not to close them.
773  */
774  ast_channel_timingfd_set(tmp, -1);
777 
779  if (!nativeformats) {
780  /*
781  * Aborting the channel creation. We do not need to complete staging
782  * the channel snapshot because the channel has not been finalized or
783  * linked into the channels container yet. Nobody else knows about
784  * this channel nor will anybody ever know about it.
785  */
786  return ast_channel_unref(tmp);
787  }
788  ast_format_cap_append(nativeformats, ast_format_none, 0);
789  ast_channel_nativeformats_set(tmp, nativeformats);
790  ao2_ref(nativeformats, -1);
791 
796 
797  if (!(schedctx = ast_sched_context_create())) {
798  ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
799  /* See earlier channel creation abort comment above. */
800  return ast_channel_unref(tmp);
801  }
802  ast_channel_sched_set(tmp, schedctx);
803 
809 
810  if (cid_name) {
811  ast_channel_caller(tmp)->id.name.valid = 1;
813  if (!ast_channel_caller(tmp)->id.name.str) {
814  /* See earlier channel creation abort comment above. */
815  return ast_channel_unref(tmp);
816  }
817  }
818  if (cid_num) {
819  ast_channel_caller(tmp)->id.number.valid = 1;
821  if (!ast_channel_caller(tmp)->id.number.str) {
822  /* See earlier channel creation abort comment above. */
823  return ast_channel_unref(tmp);
824  }
825  }
826 
827  if ((timer = ast_timer_open())) {
828  ast_channel_timer_set(tmp, timer);
829  if (strcmp(ast_timer_get_name(ast_channel_timer(tmp)), "timerfd")) {
830  needqueue = 0;
831  }
833  }
834 
835  if (needqueue && ast_channel_internal_alertpipe_init(tmp)) {
836  /* See earlier channel creation abort comment above. */
837  return ast_channel_unref(tmp);
838  }
839 
840  if (!(topology = ast_stream_topology_alloc())) {
841  return ast_channel_unref(tmp);
842  }
844 
845  /* Always watch the alertpipe */
847  /* And timing pipe */
849 
850  /* Initial state */
853 
854  ast_channel_streamid_set(tmp, -1);
855  ast_channel_vstreamid_set(tmp, -1);
856 
859 
860  now = ast_tvnow();
861  ast_channel_creationtime_set(tmp, &now);
862 
864 
865  if (!ast_strlen_zero(name_fmt)) {
866  char *slash, *slash2;
867  /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
868  * And they all use slightly different formats for their name string.
869  * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
870  * This means, that the stringfields must have a routine that takes the va_lists directly, and
871  * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
872  * This new function was written so this can be accomplished.
873  */
874  ast_channel_name_build_va(tmp, name_fmt, ap);
875  tech = ast_strdupa(ast_channel_name(tmp));
876  if ((slash = strchr(tech, '/'))) {
877  if ((slash2 = strchr(slash + 1, '/'))) {
878  tech2 = slash + 1;
879  *slash2 = '\0';
880  }
881  *slash = '\0';
882  }
883  } else {
884  /*
885  * Start the string with '-' so it becomes an empty string
886  * in the destructor.
887  */
888  ast_channel_name_set(tmp, "-**Unknown**");
889  }
890 
891  if (amaflag != AST_AMA_NONE) {
892  ast_channel_amaflags_set(tmp, amaflag);
893  } else {
895  }
896 
897  if (!ast_strlen_zero(acctcode)) {
898  ast_channel_accountcode_set(tmp, acctcode);
899  }
900  ast_channel_language_set(tmp, ast_defaultlanguage);
901 
902  ast_channel_context_set(tmp, S_OR(context, "default"));
903  ast_channel_exten_set(tmp, S_OR(exten, "s"));
904  ast_channel_priority_set(tmp, 1);
905 
906  headp = ast_channel_varshead(tmp);
908 
912 
913  channel_tech = ast_get_channel_tech(tech);
914  if (!channel_tech && !ast_strlen_zero(tech2)) {
915  channel_tech = ast_get_channel_tech(tech2);
916  }
917  if (channel_tech) {
918  ast_channel_tech_set(tmp, channel_tech);
919  } else {
921  }
922 
923  /* You might scream "locking inversion" at seeing this but it is actually perfectly fine.
924  * Since the channel was just created nothing can know about it yet or even acquire it.
925  */
926  ast_channel_lock(tmp);
927 
929 
930  if (assignedids && (does_id_conflict(assignedids->uniqueid) || does_id_conflict(assignedids->uniqueid2))) {
933  ast_channel_unlock(tmp);
934  /* See earlier channel creation abort comment above. */
935  return ast_channel_unref(tmp);
936  }
937 
938  /* Finalize and link into the channels container. */
942 
944 
945  if (endpoint) {
946  ast_endpoint_add_channel(endpoint, tmp);
947  }
948 
949  /*
950  * And now, since the channel structure is built, and has its name, let
951  * the world know of its existance
952  */
954 
955  ast_debug(1, "Channel %p '%s' allocated\n", tmp, ast_channel_name(tmp));
956 
957  return tmp;
958 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
void ast_channel_internal_alertpipe_clear(struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2945
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
Main Channel structure associated with a channel.
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition: channel.c:1978
int ast_shutting_down(void)
Definition: asterisk.c:1834
void ast_channel_timer_set(struct ast_channel *chan, struct ast_timer *value)
int ast_channel_internal_alert_readfd(struct ast_channel *chan)
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2981
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
#define LOG_WARNING
Definition: logger.h:274
void ast_pbx_hangup_handler_init(struct ast_channel *chan)
Init the hangup handler container on a channel.
static int tmp()
Definition: bt_open.c:389
Assume that the ao2_container is already locked.
Definition: astobj2.h:1067
struct ast_timer * ast_timer_open(void)
Open a timer.
Definition: timing.c:122
char * str
Subscriber name (Malloced)
Definition: channel.h:265
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2022
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
const char * uniqueid
Definition: channel.h:606
#define ao2_link_flags(container, obj, flags)
Definition: astobj2.h:1572
#define ao2_unlock(a)
Definition: astobj2.h:730
void ast_channel_internal_errno_set(enum ast_channel_error error)
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
struct varshead * ast_channel_varshead(struct ast_channel *chan)
#define NULL
Definition: resample.c:96
void ast_channel_internal_fd_clear_all(struct ast_channel *chan)
static char cid_num[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:164
struct ast_format * ast_format_none
Built-in "null" format.
Definition: format_cache.c:251
#define AST_ALERT_FD
Definition: channel.h:201
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:755
unsigned long global_fin
Definition: channel.c:95
void ast_party_dialed_init(struct ast_party_dialed *init)
Initialize the given dialed structure.
Definition: channel.c:1928
static int does_id_conflict(const char *uniqueid)
Definition: channel.c:717
#define ast_strlen_zero(foo)
Definition: strings.h:52
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
Number structure.
Definition: app_followme.c:154
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
char ast_defaultlanguage[]
Definition: options.c:98
#define ao2_ref(o, delta)
Definition: astobj2.h:464
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
#define ao2_lock(a)
Definition: astobj2.h:718
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
Structure to describe a channel "technology", ie a channel driver See for examples: ...
Definition: channel.h:629
int ast_endpoint_add_channel(struct ast_endpoint *endpoint, struct ast_channel *chan)
Adds a channel to the given endpoint.
struct ast_sched_context * ast_sched_context_create(void)
Create a scheduler context.
Definition: sched.c:236
int ast_channel_timingfd(const struct ast_channel *chan)
#define DEFAULT_AMA_FLAGS
Definition: channel.c:108
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition: channel.c:2122
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
int ast_channel_internal_alertpipe_init(struct ast_channel *chan)
struct ast_stream_topology * ast_stream_topology_alloc(void)
Create a stream topology.
Definition: stream.c:650
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
void ast_channel_streamid_set(struct ast_channel *chan, int value)
#define AST_TIMING_FD
Definition: channel.h:202
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
void ast_channel_fout_set(struct ast_channel *chan, unsigned int value)
#define ast_channel_unlock(chan)
Definition: channel.h:2946
static const char name[]
Definition: cdr_mysql.c:74
const struct ast_channel_tech * ast_get_channel_tech(const char *name)
Get handle to channel driver based on name.
Definition: channel.c:592
struct ast_autochan_list * ast_channel_autochans(struct ast_channel *chan)
void ast_channel_timingfd_set(struct ast_channel *chan, int value)
int ast_timer_fd(const struct ast_timer *handle)
Get a poll()-able file descriptor for a timer.
Definition: timing.c:161
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
static char cid_name[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:165
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
void ast_channel_creationtime_set(struct ast_channel *chan, struct timeval *value)
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680
static int chancount
Definition: channel.c:93
void ast_channel_context_set(struct ast_channel *chan, const char *value)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_state_set(struct ast_channel *chan, enum ast_channel_state)
static const struct ast_channel_tech null_tech
Definition: channel.c:708
void ast_channel_sched_set(struct ast_channel *chan, struct ast_sched_context *value)
unsigned long global_fout
Definition: channel.c:95
static void ast_channel_destructor(void *obj)
Free a channel structure.
Definition: channel.c:2192
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
void ast_channel_hold_state_set(struct ast_channel *chan, int value)
void ast_channel_fin_set(struct ast_channel *chan, unsigned int value)
const char * ast_timer_get_name(const struct ast_timer *handle)
Get name of timer in use.
Definition: timing.c:196
void ast_channel_name_set(struct ast_channel *chan, const char *name)
Set the channel name.
struct ast_channel * __ast_channel_internal_alloc(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *file, int line, const char *function)
int ast_channel_internal_setup_topics(struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)
static struct ast_timer * timer
Definition: chan_iax2.c:360
struct ast_party_connected_line * ast_channel_connected_indicated(struct ast_channel *chan)
void ast_channel_internal_finalize(struct ast_channel *chan)
const char * uniqueid2
Definition: channel.h:607
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298
void ast_channel_vstreamid_set(struct ast_channel *chan, int value)
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
Definition: channel.c:2431
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)
void ast_channel_internal_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

◆ __ast_dummy_channel_alloc()

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

Definition at line 981 of file channel.c.

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

982 {
983  struct ast_channel *tmp;
984  struct varshead *headp;
985 
987  file, line, function);
988  if (!tmp) {
989  /* Dummy channel structure allocation failure. */
990  return NULL;
991  }
992 
995 
996  /*
997  * Init file descriptors to unopened state just in case
998  * autoservice is called on the channel or something tries to
999  * read a frame from it.
1000  */
1001  ast_channel_timingfd_set(tmp, -1);
1004 
1006 
1008 
1009  headp = ast_channel_varshead(tmp);
1011 
1012  return tmp;
1013 }
void ast_channel_internal_alertpipe_clear(struct ast_channel *chan)
Main Channel structure associated with a channel.
static void ast_dummy_channel_destructor(void *obj)
Free a dummy channel structure.
Definition: channel.c:2338
void ast_pbx_hangup_handler_init(struct ast_channel *chan)
Init the hangup handler container on a channel.
static int tmp()
Definition: bt_open.c:389
struct varshead * ast_channel_varshead(struct ast_channel *chan)
#define NULL
Definition: resample.c:96
void ast_channel_internal_fd_clear_all(struct ast_channel *chan)
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
void ast_channel_timingfd_set(struct ast_channel *chan, int value)
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680
void ast_channel_hold_state_set(struct ast_channel *chan, int value)
struct ast_channel * __ast_channel_internal_alloc(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *file, int line, const char *function)
int ast_channel_internal_setup_topics(struct ast_channel *chan)

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

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

1016 {
1017  struct ast_frame *f;
1018  struct ast_frame *cur;
1019  unsigned int new_frames = 0;
1020  unsigned int new_voice_frames = 0;
1021  unsigned int queued_frames = 0;
1022  unsigned int queued_voice_frames = 0;
1024 
1025  ast_channel_lock(chan);
1026 
1027  /*
1028  * Check the last frame on the queue if we are queuing the new
1029  * frames after it.
1030  */
1031  cur = AST_LIST_LAST(ast_channel_readq(chan));
1032  if (cur && cur->frametype == AST_FRAME_CONTROL && !head && (!after || after == cur)) {
1033  switch (cur->subclass.integer) {
1034  case AST_CONTROL_END_OF_Q:
1035  if (fin->frametype == AST_FRAME_CONTROL
1036  && fin->subclass.integer == AST_CONTROL_HANGUP) {
1037  /*
1038  * Destroy the end-of-Q marker frame so we can queue the hangup
1039  * frame in its place.
1040  */
1042  ast_frfree(cur);
1043 
1044  /*
1045  * This has degenerated to a normal queue append anyway. Since
1046  * we just destroyed the last frame in the queue we must make
1047  * sure that "after" is NULL or bad things will happen.
1048  */
1049  after = NULL;
1050  break;
1051  }
1052  /* Fall through */
1053  case AST_CONTROL_HANGUP:
1054  /* Don't queue anything. */
1055  ast_channel_unlock(chan);
1056  return 0;
1057  default:
1058  break;
1059  }
1060  }
1061 
1062  /* Build copies of all the new frames and count them */
1064  for (cur = fin; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
1065  if (!(f = ast_frdup(cur))) {
1066  if (AST_LIST_FIRST(&frames)) {
1068  }
1069  ast_channel_unlock(chan);
1070  return -1;
1071  }
1072 
1074  new_frames++;
1075  if (f->frametype == AST_FRAME_VOICE) {
1076  new_voice_frames++;
1077  }
1078  }
1079 
1080  /* Count how many frames exist on the queue */
1082  queued_frames++;
1083  if (cur->frametype == AST_FRAME_VOICE) {
1084  queued_voice_frames++;
1085  }
1086  }
1087 
1088  if ((queued_frames + new_frames > 128 || queued_voice_frames + new_voice_frames > 96)) {
1089  int count = 0;
1090  ast_log(LOG_WARNING, "Exceptionally long %squeue length queuing to %s\n", queued_frames + new_frames > 128 ? "" : "voice ", ast_channel_name(chan));
1092  /* Save the most recent frame */
1093  if (!AST_LIST_NEXT(cur, frame_list)) {
1094  break;
1095  } else if (cur->frametype == AST_FRAME_VOICE || cur->frametype == AST_FRAME_VIDEO || cur->frametype == AST_FRAME_NULL) {
1096  if (++count > 64) {
1097  break;
1098  }
1100  ast_frfree(cur);
1101 
1102  /* Read from the alert pipe for each flushed frame. */
1104  }
1105  }
1107  }
1108 
1109  if (after) {
1111  } else {
1112  if (head) {
1115  }
1117  }
1118 
1119  if (ast_channel_alert_writable(chan)) {
1120  /* Write to the alert pipe for each added frame */
1121  while (new_frames--) {
1122  if (ast_channel_alert_write(chan)) {
1123  ast_log(LOG_WARNING, "Unable to write to alert pipe on %s (qlen = %u): %s!\n",
1124  ast_channel_name(chan), queued_frames, strerror(errno));
1125  break;
1126  }
1127  }
1128  } else if (ast_channel_timingfd(chan) > -1) {
1130  } else if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING)) {
1131  pthread_kill(ast_channel_blocker(chan), SIGURG);
1132  }
1133 
1134  ast_channel_unlock(chan);
1135 
1136  return 0;
1137 }
#define AST_LIST_INSERT_LIST_AFTER(head, list, elm, field)
Inserts a whole list after a specific entry in a list.
Definition: linkedlists.h:811
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_frdup(fr)
Copies a frame.
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:420
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define LOG_WARNING
Definition: logger.h:274
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:438
#define NULL
Definition: resample.c:96
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: linkedlists.h:855
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
struct ast_frame_subclass subclass
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
#define ast_log
Definition: astobj2.c:42
static int frames
Definition: parser.c:51
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
ast_alert_status_t ast_channel_internal_alert_read(struct ast_channel *chan)
AST_LIST_HEAD_NOLOCK(contactliststruct, contact)
int ast_channel_timingfd(const struct ast_channel *chan)
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
int errno
pthread_t ast_channel_blocker(const struct ast_channel *chan)
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:428
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_timer_enable_continuous(const struct ast_timer *handle)
Enable continuous mode.
Definition: timing.c:176
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680
const char * ast_channel_name(const struct ast_channel *chan)
int ast_channel_alert_writable(struct ast_channel *chan)
#define ast_frfree(fr)
Data structure associated with a single frame of data.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
enum ast_frame_type frametype
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
int ast_channel_alert_write(struct ast_channel *chan)
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)
#define AST_LIST_APPEND_LIST(head, list, field)
Appends a whole list to the tail of a list.
Definition: linkedlists.h:782

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

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_macro(), 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_insmpl(), ast_channel_insmpl_set(), ast_channel_internal_alert_read(), ast_channel_is_bridged(), ast_channel_lock, ast_channel_monitor(), ast_channel_music_state(), ast_channel_name(), ast_channel_outsmpl(), 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_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_sample_rate(), 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_MONITOR_RUNNING, 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_seekstream(), 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(), ast_writestream(), calc_monitor_jump(), ast_frame::data, DEBUGCHAN_FLAG, digit, ast_generator::digit, done, DTMF_RECEIVED, ast_channel_tech::exception, ast_frame_subclass::format, ast_channel_monitor::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, ast_frame::samples, SEEK_FORCECUR, send_dtmf_begin_event(), send_dtmf_end_event(), send_flash_event(), set_channel_answer_time(), should_skip_dtmf(), should_trigger_dtmf_emulating(), ast_frame::stream_num, ast_frame::subclass, and ast_frame::uint32.

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

3530 {
3531  struct ast_frame *f = NULL; /* the return value */
3532  int prestate;
3533  int cause = 0;
3534  struct ast_stream *stream = NULL, *default_stream = NULL;
3535 
3536  /* this function is very long so make sure there is only one return
3537  * point at the end (there are only two exceptions to this).
3538  */
3539  ast_channel_lock(chan);
3540 
3541  /* Stop if we're a zombie or need a soft hangup */
3543  if (ast_channel_generator(chan))
3545 
3546  /*
3547  * It is possible for chan->_softhangup to be set and there
3548  * still be control frames that need to be read. Instead of
3549  * just going to 'done' in the case of ast_check_hangup(), we
3550  * need to queue the end-of-Q frame so that it can mark the end
3551  * of the read queue. If there are frames to be read,
3552  * ast_queue_control() will be called repeatedly, but will only
3553  * queue the first end-of-Q frame.
3554  */
3556  ast_log(LOG_WARNING, "GOT HERE\n");
3558  } else {
3559  goto done;
3560  }
3561  } else {
3562 #ifdef AST_DEVMODE
3563  /*
3564  * The ast_waitfor() code records which of the channel's file
3565  * descriptors reported that data is available. In theory,
3566  * ast_read() should only be called after ast_waitfor() reports
3567  * that a channel has data available for reading. However,
3568  * there still may be some edge cases throughout the code where
3569  * ast_read() is called improperly. This can potentially cause
3570  * problems, so if this is a developer build, make a lot of
3571  * noise if this happens so that it can be addressed.
3572  *
3573  * One of the potential problems is blocking on a dead channel.
3574  */
3575  if (ast_channel_fdno(chan) == -1) {
3577  "ast_read() on chan '%s' called with no recorded file descriptor.\n",
3578  ast_channel_name(chan));
3579  }
3580 #endif
3581  }
3582 
3583  prestate = ast_channel_state(chan);
3584 
3585  if (ast_channel_timingfd(chan) > -1 && ast_channel_fdno(chan) == AST_TIMING_FD) {
3586  enum ast_timer_event res;
3587  int trigger_dtmf_emulating = should_trigger_dtmf_emulating(chan);
3588 
3590 
3592 
3593  switch (res) {
3595  if (ast_timer_ack(ast_channel_timer(chan), 1) < 0) {
3596  ast_log(LOG_ERROR, "Failed to acknoweldge timer in ast_read\n");
3597  goto done;
3598  }
3599 
3600  if (ast_channel_timingfunc(chan)) {
3601  /* save a copy of func/data before unlocking the channel */
3603  void *data = ast_channel_timingdata(chan);
3604  int got_ref = 0;
3606  ao2_ref(data, 1);
3607  got_ref = 1;
3608  }
3609  ast_channel_fdno_set(chan, -1);
3610  ast_channel_unlock(chan);
3611  func(data);
3612  if (got_ref) {
3613  ao2_ref(data, -1);
3614  }
3615 
3616  if (trigger_dtmf_emulating) {
3617  /*
3618  * Since we're breaking out of this switch block and not
3619  * returning, we need to re-lock the channel.
3620  */
3621  ast_channel_lock(chan);
3622  /* generate null frame to trigger dtmf emulating */
3623  f = &ast_null_frame;
3624  break;
3625  }
3626  } else if (trigger_dtmf_emulating) {
3627  /* generate null frame to trigger dtmf emualating */
3628  f = &ast_null_frame;
3629  break;
3630  } else {
3632  /* generate very last null frame to trigger dtmf emulating */
3633  f = &ast_null_frame;
3634  break;
3635  }
3636 
3637  /* cannot 'goto done' because the channel is already unlocked */
3638  return &ast_null_frame;
3639 
3641  if (AST_LIST_EMPTY(ast_channel_readq(chan)) ||
3644  }
3645  break;
3646  }
3647 
3649  /* if the AST_GENERATOR_FD is set, call the generator with args
3650  * set to -1 so it can do whatever it needs to.
3651  */
3652  void *tmp = ast_channel_generatordata(chan);
3653  ast_channel_generatordata_set(chan, NULL); /* reset to let ast_write get through */
3654  ast_channel_generator(chan)->generate(chan, tmp, -1, -1);
3655  ast_channel_generatordata_set(chan, tmp);
3656  f = &ast_null_frame;
3657  ast_channel_fdno_set(chan, -1);
3658  goto done;
3661  }
3662 
3663  /* Read and ignore anything on the alertpipe, but read only
3664  one sizeof(blah) per frame that we send from it */
3666  f = &ast_null_frame;
3667  goto done;
3668  }
3669 
3670  /* Check for pending read queue */
3671  if (!AST_LIST_EMPTY(ast_channel_readq(chan))) {
3672  int skipped_dtmf_frame = 0;
3673  int skip_dtmf = should_skip_dtmf(chan);
3674 
3676  /* We have to be picky about which frame we pull off of the readq because
3677  * there are cases where we want to leave DTMF frames on the queue until
3678  * some later time. */
3679 
3680  if ( (f->frametype == AST_FRAME_DTMF_BEGIN || f->frametype == AST_FRAME_DTMF_END) && skip_dtmf) {
3681  skipped_dtmf_frame = 1;
3682  continue;
3683  }
3684 
3686  break;
3687  }
3689 
3690  if (!f) {
3691  /* There were no acceptable frames on the readq. */
3692  f = &ast_null_frame;
3693  if (!skipped_dtmf_frame) {
3694  /*
3695  * Do not trigger alert pipe if only buffered dtmf begin or end frames
3696  * are left in the readq.
3697  */
3699  } else {
3700  /*
3701  * Safely disable continous timer events if only buffered dtmf begin or end
3702  * frames are left in the readq.
3703  */
3705  }
3706  }
3707 
3708  /* Interpret hangup and end-of-Q frames to return NULL */
3709  /* XXX why not the same for frames from the channel ? */
3710  if (f->frametype == AST_FRAME_CONTROL) {
3711  switch (f->subclass.integer) {
3712  case AST_CONTROL_HANGUP:
3714  cause = f->data.uint32;
3715  /* Fall through */
3716  case AST_CONTROL_END_OF_Q:
3717  ast_frfree(f);
3718  f = NULL;
3719  break;
3720  default:
3721  break;
3722  }
3723  } else if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO) {
3724  if (ast_channel_tech(chan) && ast_channel_tech(chan)->read_stream) {
3727  } else {
3728  /* Since this channel driver does not support multistream determine the default stream this frame
3729  * originated from and update the frame to include it.
3730  */
3731  stream = default_stream = ast_channel_get_default_stream(chan, ast_format_get_type(f->subclass.format));
3732  /* In order to allow media to be passed up the underlying media type has to have a format negotiated on
3733  * the channel itself. In cases where this hasn't happened the channel driver is incorrectly passing up
3734  * a frame for a format that has not been negotiated. If this occurs just drop the frame as we have no
3735  * stream that it came from.
3736  */
3737  if (!stream) {
3738  ast_frfree(f);
3739  f = &ast_null_frame;
3740  } else {
3741  f->stream_num = ast_stream_get_position(stream);
3742  }
3743  }
3744  }
3745  } else {
3747  if (ast_channel_tech(chan)->exception)
3748  f = ast_channel_tech(chan)->exception(chan);
3749  else {
3750  ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", ast_channel_name(chan));
3751  f = &ast_null_frame;
3752  }
3753  /* Clear the exception flag */
3755  } else if (ast_channel_tech(chan) && ast_channel_tech(chan)->read_stream) {
3756  f = ast_channel_tech(chan)->read_stream(chan);
3757 
3758  /* This channel driver supports multistream so the stream_num on the frame is valid, the only
3759  * thing different is that we need to find the default stream so we know whether to invoke the
3760  * default stream logic or not (such as transcoding).
3761  */
3762  if (f && (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO)) {
3765  }
3766  } else if (ast_channel_tech(chan) && ast_channel_tech(chan)->read) {
3767  f = ast_channel_tech(chan)->read(chan);
3768 
3769  /* Since this channel driver does not support multistream determine the default stream this frame
3770  * originated from and update the frame to include it.
3771  */
3772  if (f && (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO)) {
3773  stream = default_stream = ast_channel_get_default_stream(chan, ast_format_get_type(f->subclass.format));
3774  if (!stream) {
3775  ast_frfree(f);
3776  f = &ast_null_frame;
3777  } else {
3778  f->stream_num = ast_stream_get_position(stream);
3779  }
3780  }
3781  }
3782  else
3783  ast_log(LOG_WARNING, "No read routine on channel %s\n", ast_channel_name(chan));
3784  }
3785 
3786  if (stream == default_stream) {
3787  /* Perform the framehook read event here. After the frame enters the framehook list
3788  * there is no telling what will happen, <insert mad scientist laugh here>!!! */
3790  }
3791 
3792  /*
3793  * Reset the recorded file descriptor that triggered this read so that we can
3794  * easily detect when ast_read() is called without properly using ast_waitfor().
3795  */
3796  ast_channel_fdno_set(chan, -1);
3797 
3798  if (f) {
3799  struct ast_frame *readq_tail = AST_LIST_LAST(ast_channel_readq(chan));
3800  struct ast_control_read_action_payload *read_action_payload;
3802  int hooked = 0;
3803 
3804 
3805  /* if the channel driver returned more than one frame, stuff the excess
3806  into the readq for the next ast_read call
3807  */
3808  if (AST_LIST_NEXT(f, frame_list)) {
3812  }
3813 
3814  if (dropnondefault && stream != default_stream) {
3815  /* If the frame originates from a non-default stream and the caller can not handle other streams
3816  * absorb the frame and replace it with a null one instead.
3817  */
3818  ast_frfree(f);
3819  f = &ast_null_frame;
3820  }
3821 
3822  switch (f->frametype) {
3823  case AST_FRAME_CONTROL:
3824  if (f->subclass.integer == AST_CONTROL_ANSWER) {
3825  if (prestate == AST_STATE_UP && ast_channel_is_bridged(chan)) {
3826  ast_debug(1, "Dropping duplicate answer!\n");
3827  ast_frfree(f);
3828  f = &ast_null_frame;
3829  } else {
3830  /*
3831  * Mark when outgoing channel answered so we can know how
3832  * long the channel has been up.
3833  */
3835 
3836  ast_setstate(chan, AST_STATE_UP);
3837  }
3838  } else if (f->subclass.integer == AST_CONTROL_READ_ACTION) {
3839  read_action_payload = f->data.ptr;
3840  switch (read_action_payload->action) {
3844  if (ast_connected_line_parse_data(read_action_payload->payload,
3845  read_action_payload->payload_size, &connected)) {
3847  break;
3848  }
3849  ast_channel_unlock(chan);
3850  if (ast_channel_connected_line_sub(NULL, chan, &connected, 0) &&
3853  read_action_payload->payload,
3854  read_action_payload->payload_size);
3855  }
3857  ast_channel_lock(chan);
3858  break;
3860  ast_channel_unlock(chan);
3861  ast_sendtext(chan, (const char *)read_action_payload->payload);
3862  ast_channel_lock(chan);
3863  break;
3865  ast_channel_unlock(chan);
3866  ast_sendtext_data(chan, (struct ast_msg_data *)read_action_payload->payload);
3867  ast_channel_lock(chan);
3868  break;
3869  }
3870  ast_frfree(f);
3871  f = &ast_null_frame;
3872  } else if (f->subclass.integer == AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE && dropnondefault) {
3873  /* The caller of this function is incapable of handling streams so we don't accept the change request
3874  * and stick to the streams currently on the channel.
3875  */
3877  ast_frfree(f);
3878  f = &ast_null_frame;
3879  } else if (f->subclass.integer == AST_CONTROL_STREAM_TOPOLOGY_CHANGED && dropnondefault) {
3880  /* The caller of this function is incapable of handling streams so we absorb the notification that the
3881  * stream topology has changed.
3882  */
3883  ast_frfree(f);
3884  f = &ast_null_frame;
3885  } else if (f->subclass.integer == AST_CONTROL_FLASH) {
3886  send_flash_event(chan);
3887  }
3888  break;
3889  case AST_FRAME_DTMF_END:
3891  ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass.integer, ast_channel_name(chan), f->len);
3892  /* Queue it up if DTMF is deferred, or if DTMF emulation is forced. */
3894  queue_dtmf_readq(chan, f);
3895  ast_frfree(f);
3896  f = &ast_null_frame;
3898  if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
3900  /* If it hasn't been long enough, defer this digit */
3901  queue_dtmf_readq(chan, f);
3902  ast_frfree(f);
3903  f = &ast_null_frame;
3904  } else {
3905  /* There was no begin, turn this into a begin and send the end later */
3906  struct timeval tv = ast_tvnow();
3910  ast_channel_dtmf_tv_set(chan, &tv);
3911  if (f->len) {
3912  if (f->len > option_dtmfminduration)
3914  else
3916  } else
3918  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));
3919 
3920  /*
3921  * Start generating 50 fps timer events (null frames) for dtmf emulating
3922  * independently from any existing incoming voice frames.
3923  * If channel generator is already activated in regular mode use these
3924  * timer events to generate null frames.
3925  */
3926  if (!ast_channel_generator(chan)) {
3928  }
3929  }
3930  if (ast_channel_audiohooks(chan)) {
3931  struct ast_frame *old_frame = f;
3932  /*!
3933  * \todo XXX It is possible to write a digit to the audiohook twice
3934  * if the digit was originally read while the channel was in autoservice. */
3936  if (old_frame != f)
3937  ast_frfree(old_frame);
3938  }
3939  } else {
3940  struct timeval now = ast_tvnow();
3942  ast_log(LOG_DTMF, "DTMF end accepted with begin '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3944  if (!f->len)
3945  f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
3946 
3947  /* detect tones that were received on
3948  * the wire with durations shorter than
3949  * option_dtmfminduration and set f->len
3950  * to the actual duration of the DTMF
3951  * frames on the wire. This will cause
3952  * dtmf emulation to be triggered later
3953  * on.
3954  */
3956  f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
3957  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));
3958  }
3959  } else if (!f->len) {
3960  ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3962  }
3964  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));
3968  ast_frfree(f);
3969  f = &ast_null_frame;
3970 
3971  /* Start generating 50 fps timer events (null frames) for dtmf emulating
3972  * independently from any existing incoming voice frames.
3973  * If channel generator is already activated in regular mode use these
3974  * timer events to generate null frames.
3975  */
3976  if (!ast_channel_generator(chan)) {
3978  }
3979  } else {
3980  ast_log(LOG_DTMF, "DTMF end passthrough '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3981  if (f->len < option_dtmfminduration) {
3983  }
3984  ast_channel_dtmf_tv_set(chan, &now);
3985 
3986  /* Start generating 50 fps timer events (null frames) for dtmf emulating
3987  * independently from any existing incoming voice frames.
3988  * If channel generator is already activated in regular mode use these
3989  * timer events to generate null frames.
3990  */
3991  if (!ast_channel_generator(chan)) {
3993  }
3994  }
3995  if (ast_channel_audiohooks(chan)) {
3996  struct ast_frame *old_frame = f;
3998  if (old_frame != f)
3999  ast_frfree(old_frame);
4000  }
4001  }
4002  break;
4003  case AST_FRAME_DTMF_BEGIN:
4005  ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass.integer, ast_channel_name(chan));
4007  (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
4009  ast_log(LOG_DTMF, "DTMF begin ignored '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
4010  ast_frfree(f);
4011  f = &ast_null_frame;
4012  } else {
4013  struct timeval now = ast_tvnow();
4015  ast_channel_dtmf_tv_set(chan, &now);
4016  ast_log(LOG_DTMF, "DTMF begin passthrough '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
4017  }
4018  break;
4019  case AST_FRAME_NULL:
4020  /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
4021  * is reached , because we want to make sure we pass at least one
4022  * voice frame through before starting the next digit, to ensure a gap
4023  * between DTMF digits. */
4025  struct timeval now = ast_tvnow();
4026  if (!ast_channel_emulate_dtmf_duration(chan)) {
4029  } else if (ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan)) >= ast_channel_emulate_dtmf_duration(chan)) {
4031  ast_frfree(f);
4032  f = ast_channel_dtmff(chan);
4035  f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
4036  ast_channel_dtmf_tv_set(chan, &now);
4039  ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, ast_channel_name(chan));
4040  if (ast_channel_audiohooks(chan)) {
4041  struct ast_frame *old_frame = f;
4043  if (old_frame != f) {
4044  ast_frfree(old_frame);
4045  }
4046  }
4047 
4048  /* Start generating 50 fps timer events (null frames) for dtmf emulating
4049  * independently from any existing incoming voice frames.
4050  * If channel generator is already activated in regular mode use these
4051  * timer events to generate null frames.
4052  */
4053  if (!ast_channel_generator(chan)) {
4055  }
4056  }
4057  }
4058  break;
4059  case AST_FRAME_VOICE:
4060  /* If media was received from a non-default stream don't perform any actions, let it just go through */
4061  if (stream != default_stream) {
4062  break;
4063  }
4064 
4065  /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
4066  * is reached , because we want to make sure we pass at least one
4067  * voice frame through before starting the next digit, to ensure a gap
4068  * between DTMF digits. */
4070  ast_log(LOG_WARNING, "!!! t5a\n");
4073  }
4074 
4075  if (dropaudio || ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_DTMF)) {
4076  ast_log(LOG_WARNING, "!!! t5b\n");
4077  if (dropaudio)
4078  ast_read_generator_actions(chan, f);
4079  ast_frfree(f);
4080  f = &ast_null_frame;
4081  }
4082 
4084  struct timeval now = ast_tvnow();
4085  ast_log(LOG_WARNING, "!!! t5c\n");
4088  ast_frfree(f);
4089  f = ast_channel_dtmff(chan);
4092  f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
4093  ast_channel_dtmf_tv_set(chan, &now);
4094  if (ast_channel_audiohooks(chan)) {
4095  struct ast_frame *old_frame = f;
4097  if (old_frame != f)
4098  ast_frfree(old_frame);
4099  }
4100  ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, ast_channel_name(chan));
4101  } else {
4102  /* Drop voice frames while we're still in the middle of the digit */
4103  ast_frfree(f);
4104  f = &ast_null_frame;
4105  }
4106  break;
4107  }
4108  if (f->frametype != AST_FRAME_VOICE) {
4109  ast_log(LOG_WARNING, "!!! t5d\n");
4110  break;
4111  }
4114  struct ast_format *core_format;
4115 
4116  /*
4117  * Note: This frame may not be one of the current native
4118  * formats. We may have gotten it out of the read queue from
4119  * a previous multi-frame translation, from a framehook
4120  * injected frame, or the device we're talking to isn't
4121  * respecting negotiated formats. Regardless we will accept
4122  * all frames.
4123  *
4124  * Update the read translation path to handle the new format
4125  * that just came in. If the core wants slinear we need to
4126  * setup a new translation path because the core is usually
4127  * doing something with the audio itself and may not handle
4128  * any other format. e.g., Softmix bridge, holding bridge
4129  * announcer channel, recording, AMD... Otherwise, we'll
4130  * setup to pass the frame as is to the core. In this case
4131  * the core doesn't care. The channel is likely in
4132  * autoservice, safesleep, or the channel is in a bridge.
4133  * Let the bridge technology deal with format compatibility
4134  * between the channels in the bridge.
4135  *
4136  * Beware of the transcode_via_slin and genericplc options as
4137  * they force any transcoding to go through slin on a bridge.
4138  * Unfortunately transcode_via_slin is enabled by default and
4139  * genericplc is enabled in the codecs.conf.sample file.
4140  *
4141  * XXX Only updating translation to slinear frames has some
4142  * corner cases if slinear is one of the native formats and
4143  * there are different sample rates involved. We might wind
4144  * up with conflicting translation paths between channels
4145  * where the read translation path on this channel reduces
4146  * the sample rate followed by a write translation path on
4147  * the peer channel that increases the sample rate.
4148  */
4149  core_format = ast_channel_readformat(chan);
4150  if (!ast_format_cache_is_slinear(core_format)) {
4151  core_format = f->subclass.format;
4152  }
4153  ast_log(LOG_WARNING, "!!! t5f\n");
4154  if (ast_set_read_format_path(chan, f->subclass.format, core_format)) {
4155  /* Drop frame. We couldn't make it compatible with the core. */
4156  ast_frfree(f);
4157  f = &ast_null_frame;
4158  break;
4159  }
4160  }
4161  /*
4162  * Send frame to audiohooks if present, if frametype is linear, to preserve
4163  * functional compatibility with previous behavior. If not linear, hold off
4164  * until transcoding is done where we are more likely to have a linear frame
4165  */
4167  /* Place hooked after declaration */
4168  struct ast_frame *old_frame = f;
4169  hooked = 1;
4170  ast_log(LOG_WARNING, "!!! t5h\n");
4172  if (old_frame != f) {
4173  ast_frfree(old_frame);
4174  }
4175  }
4176 
4177  if (ast_channel_monitor(chan) && ast_channel_monitor(chan)->read_stream) {
4178  /* XXX what does this do ? */
4179 #ifndef MONITOR_CONSTANT_DELAY
4180  int jump = ast_channel_outsmpl(chan) - ast_channel_insmpl(chan) - 4 * f->samples;
4181  if (jump >= 0) {
4184  ast_format_get_sample_rate(ast_channel_monitor(chan)->read_stream->fmt->format));
4185  if (ast_seekstream(ast_channel_monitor(chan)->read_stream, jump, SEEK_FORCECUR) == -1) {
4186  ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
4187  }
4189  } else {
4191  }
4192 #else
4193  int jump = calc_monitor_jump((ast_channel_outsmpl(chan) - ast_channel_insmpl(chan)),
4195  ast_format_get_sample_rate(ast_channel_monitor(chan)->read_stream->fmt->format));
4196  if (jump - MONITOR_DELAY >= 0) {
4197  if (ast_seekstream(ast_channel_monitor(chan)->read_stream, jump - f->samples, SEEK_FORCECUR) == -1) {
4198  ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
4199  }
4201  } else {
4202  ast_channel_insmpl(chan) += f->samples;
4203  }
4204 #endif
4206  if (ast_writestream(ast_channel_monitor(chan)->read_stream, f) < 0)
4207  ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
4208  }
4209  ast_log(LOG_WARNING, "!!! t5jj\n");
4210  }
4211 
4212  if (ast_channel_readtrans(chan)
4214  f = ast_translate(ast_channel_readtrans(chan), f, 1);
4215  if (!f) {
4216  f = &ast_null_frame;
4217  }
4218  }
4219 
4220  /* Second chance at hooking a linear frame, also the last chance */
4221  if (ast_channel_audiohooks(chan) && !hooked) {
4222  struct ast_frame *old_frame = f;
4224  if (old_frame != f) {
4225  ast_frfree(old_frame);
4226  }
4227  }
4228 
4229  /*
4230  * It is possible for the translation process on the channel to have
4231  * produced multiple frames from the single input frame we passed it; if
4232  * this happens, queue the additional frames *before* the frames we may
4233  * have queued earlier. if the readq was empty, put them at the head of
4234  * the queue, and if it was not, put them just after the frame that was
4235  * at the end of the queue.
4236  */
4237  if (AST_LIST_NEXT(f, frame_list)) {
4238  struct ast_frame *cur, *multi_frame = AST_LIST_NEXT(f, frame_list);
4239  ast_log(LOG_WARNING, "!!! t5k\n");
4240  /* Mark these frames as being re-queued */
4241  for (cur = multi_frame; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
4243  }
4244 
4245  if (!readq_tail) {
4246  ast_queue_frame_head(chan, multi_frame);
4247  } else {
4248  __ast_queue_frame(chan, multi_frame, 0, readq_tail);
4249  }
4250  ast_frfree(multi_frame);
4252  }
4253 
4254  /*
4255  * Run generator sitting on the line if timing device not available
4256  * and synchronous generation of outgoing frames is necessary
4257  */
4258  ast_read_generator_actions(chan, f);
4259  break;
4260  case AST_FRAME_RTCP:
4261  /* Incoming RTCP feedback needs to get to the translator for
4262  * outgoing media, which means we treat it as an ast_write */
4263  if (ast_channel_writetrans(chan)) {
4265  }
4266  break;
4267  default:
4268  /* Just pass it on! */
4269  break;
4270  }
4271  } else {
4272  /* Make sure we always return NULL in the future */
4275  }
4276  if (cause)
4277  ast_channel_hangupcause_set(chan, cause);
4278  if (ast_channel_generator(chan))
4280  /* We no longer End the CDR here */
4281  }
4282 
4283  /* High bit prints debugging */
4284  if (ast_channel_fin(chan) & DEBUGCHAN_FLAG)
4285  ast_frame_dump(ast_channel_name(chan), f, "<<");
4287 
4288 done:
4290  ast_channel_generator(chan)->digit(chan, f->subclass.integer);
4291  }
4292 
4294  /* The list gets recreated if audiohooks are added again later */
4297  }
4298  ast_channel_unlock(chan);
4299  return f;
4300 }
void ast_channel_dtmf_digit_to_emulate_set(struct ast_channel *chan, char value)
void ast_channel_fdno_set(struct ast_channel *chan, int value)
int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
Queue a control frame.
Definition: channel.c:1231
int ast_channel_fd_isset(const struct ast_channel *chan, int which)
char digit
#define ast_channel_lock(chan)
Definition: channel.h:2945
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition: format.c:354
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:420
void * ast_channel_generatordata(const struct ast_channel *chan)
static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
Definition: channel.c:1015
void ast_channel_insmpl_set(struct ast_channel *chan, unsigned long value)
unsigned int option_dtmfminduration
Definition: options.c:83
struct ast_stream_topology * ast_channel_get_stream_topology(const struct ast_channel *chan)
Retrieve the topology of streams on a channel.
#define DEBUGCHAN_FLAG
Definition: channel.h:858
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.
Definition: channel.c:3516
#define ast_test_flag(p, flag)
Definition: utils.h:63
static void send_dtmf_begin_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit)
Definition: channel.c:3378
void ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list)
Detach audiohooks from list and destroy said list.
Definition: audiohook.c:594
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
#define AST_DEFAULT_EMULATE_DTMF_DURATION
Definition: channel.c:102
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition: audiohook.c:1112
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:8881
#define ast_set_flag(p, flag)
Definition: utils.h:70
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
#define LOG_WARNING
Definition: logger.h:274
unsigned long ast_channel_insmpl(const struct ast_channel *chan)
ast_timer_event
Definition: timing.h:57
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:11197
#define AST_MIN_DTMF_GAP
Definition: channel.c:112
static int tmp()
Definition: bt_open.c:389
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.h), with stream num.
Definition: channel.h:748
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:438
Structure used to transport a message through the frame core.
Definition: message.c:1406
ast_channel_state
ast_channel states
Definition: channelstate.h:35
void ast_channel_audiohooks_set(struct ast_channel *chan, struct ast_audiohook_list *value)
void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix)
Definition: main/frame.c:731
Definition of a media format.
Definition: format.c:43
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2022
int ast_channel_connected_line_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const void *connected_info, int is_caller, int is_frame)
Run a connected line interception macro and update a channel&#39;s connected line information.
Definition: channel.c:10435
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
static void send_flash_event(struct ast_channel *chan)
Definition: channel.c:3411
static int should_skip_dtmf(struct ast_channel *chan)
Determine whether or not we should ignore DTMF in the readq.
Definition: channel.c:3489
int(* generate)(struct ast_channel *chan, void *data, int len, int samples)
Definition: channel.h:234
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:449
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:565
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
struct ast_stream * ast_stream_topology_get_stream(const struct ast_stream_topology *topology, unsigned int position)
Get a specific stream from the topology.
Definition: stream.c:788
#define NULL
Definition: resample.c:96
static void set_channel_answer_time(struct ast_channel *chan)
Definition: channel.c:2637
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:2864
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
struct ast_frame_subclass subclass
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
int done
Definition: test_amihooks.c:48
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
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:4698
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
unsigned int ast_channel_emulate_dtmf_duration(const struct ast_channel *chan)
unsigned int ast_channel_fin(const struct ast_channel *chan)
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition: channel.c:2072
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
struct ast_stream * ast_channel_get_default_stream(struct ast_channel *chan, enum ast_media_type type)
Retrieve the default stream of a specific media type on a channel.
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
int ast_timer_disable_continuous(const struct ast_timer *handle)
Disable continuous mode.
Definition: timing.c:181
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
ast_alert_status_t ast_channel_internal_alert_read(struct ast_channel *chan)
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define AST_GENERATOR_FD
Definition: channel.h:204
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:4796
void * ast_channel_timingdata(const struct ast_channel *chan)
int(* ast_timing_func_t)(const void *data)
Definition: channel.h:900
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:542
void ast_channel_dtmf_tv_set(struct ast_channel *chan, struct timeval *value)
int ast_channel_fdno(const struct ast_channel *chan)
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition: channel.c:2031
int ast_channel_timingfd(const struct ast_channel *chan)
int ast_timer_ack(const struct ast_timer *handle, unsigned int quantity)
Acknowledge a timer event.
Definition: timing.c:171
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
int ast_sendtext(struct ast_channel *chan, const char *text)
Sends text to a channel.
Definition: channel.c:4854
#define LOG_ERROR
Definition: logger.h:285
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
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:1127
struct timeval * ast_channel_dtmf_tv(struct ast_channel *chan)
#define AST_TIMING_FD
Definition: channel.h:202
Connected Line/Party information.
Definition: channel.h:457
enum ast_frame_read_action action
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:428
int ast_seekstream(struct ast_filestream *fs, off_t sample_offset, int whence)
Seeks into stream.
Definition: file.c:1038
void(* digit)(struct ast_channel *chan, char digit)
Definition: channel.h:236
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define SEEK_FORCECUR
Definition: file.h:51
struct ast_frame *(*const exception)(struct ast_channel *chan)
Handle an exception, reading a frame.
Definition: channel.h:766
#define FRAMECOUNT_INC(x)
Definition: channel.h:861
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2902
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
Definition: timing.c:166
#define ast_clear_flag(p, flag)
Definition: utils.h:77
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.h)
Definition: channel.h:735
char ast_channel_dtmf_digit_to_emulate(const struct ast_channel *chan)
struct ast_frame ast_null_frame
Definition: main/frame.c:79
#define LOG_DTMF
Definition: logger.h:307
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:5575
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
static void send_dtmf_end_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit, long duration_ms)
Definition: channel.c:3394
int ast_channel_is_bridged(const struct ast_channel *chan)
Determine if a channel is in a bridge.
Definition: channel.c:10746
const char * ast_channel_name(const struct ast_channel *chan)
int ast_writestream(struct ast_filestream *fs, struct ast_frame *f)
Writes a frame to a stream.
Definition: file.c:209
void * ast_channel_music_state(const struct ast_channel *chan)
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
#define ast_frfree(fr)
Data structure associated with a single frame of data.
void ast_channel_emulate_dtmf_duration_set(struct ast_channel *chan, unsigned int value)
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
#define AST_JITTERBUFFER_FD
Definition: channel.h:205
unsigned long ast_channel_outsmpl(const struct ast_channel *chan)
union ast_frame::@263 data
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
enum ast_frame_type frametype
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_format * format
void ast_channel_fin_set(struct ast_channel *chan, unsigned int value)
static void queue_dtmf_readq(struct ast_channel *chan, struct ast_frame *f)
Definition: channel.c:3470
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
enum ast_timer_event ast_timer_get_event(const struct ast_timer *handle)
Retrieve timing event.
Definition: timing.c:186
int ast_stream_get_position(const struct ast_stream *stream)
Get the position of the stream in the topology.
Definition: stream.c:500
char connected
Definition: eagi_proxy.c:82
struct ast_channel_monitor * ast_channel_monitor(const struct ast_channel *chan)
ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan)
struct ast_frame * ast_channel_dtmff(struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
Definition: channel.c:3416
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&#39;s framehook list.
Definition: framehook.c:318
int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
Change the state of a channel.
Definition: channel.c:7486
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&#39;s connected line information...
Definition: channel.c:10539
int ast_channel_alert_write(struct ast_channel *chan)
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)
int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to the head of a channel&#39;s frame queue.
Definition: channel.c:1144

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

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(), chanlist::chan, outgoing_helper::cid_name, outgoing_helper::cid_num, outgoing_helper::connect_on_early_media, outgoing_helper::context, ast_frame::data, ast_frame::datalen, outgoing_helper::exten, ast_frame::frametype, handle_cause(), ast_party_connected_line::id, ast_frame_subclass::integer, LOG_NOTICE, ast_party_id::name, NULL, ast_party_id::number, outgoing_helper::parent_channel, ast_party_name::presentation, ast_party_number::presentation, outgoing_helper::priority, ast_frame::ptr, ast_party_name::str, ast_party_number::str, ast_frame::subclass, ast_party_name::valid, ast_party_number::valid, and outgoing_helper::vars.

Referenced by announce_to_dial(), and ast_request_and_dial().

6067 {
6068  int dummy_outstate;
6069  int cause = 0;
6070  struct ast_channel *chan;
6071  int res = 0;
6072  int last_subclass = 0;
6074 
6075  if (outstate)
6076  *outstate = 0;
6077  else
6078  outstate = &dummy_outstate; /* make outstate always a valid pointer */
6079 
6080  chan = ast_request(type, cap, assignedids, requestor, addr, &cause);
6081  if (!chan) {
6082  ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, addr);
6083  handle_cause(cause, outstate);
6084  return NULL;
6085  }
6086 
6087  if (oh) {
6088  if (oh->vars) {
6089  ast_channel_lock(chan);
6090  ast_set_variables(chan, oh->vars);
6091  ast_channel_unlock(chan);
6092  }
6093  if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name)) {
6094  /*
6095  * Use the oh values instead of the function parameters for the
6096  * outgoing CallerID.
6097  */
6098  cid_num = oh->cid_num;
6099  cid_name = oh->cid_name;
6100  }
6101  if (oh->parent_channel) {
6102  /* Safely inherit variables and datastores from the parent channel. */
6108  ast_channel_unlock(chan);
6109  }
6110  if (!ast_strlen_zero(oh->account)) {
6111  ast_channel_lock(chan);
6113  ast_channel_accountcode_set(chan, oh->account);
6114  ast_channel_peeraccount_set(chan, oh->account);
6116  ast_channel_unlock(chan);
6117  }
6118  }
6119 
6120  /*
6121  * I seems strange to set the CallerID on an outgoing call leg
6122  * to whom we are calling, but this function's callers are doing
6123  * various Originate methods. This call leg goes to the local
6124  * user. Once the local user answers, the dialplan needs to be
6125  * able to access the CallerID from the CALLERID function as if
6126  * the local user had placed this call.
6127  */
6129 
6130  ast_channel_lock(chan);
6132  ast_channel_unlock(chan);
6134  if (cid_num) {
6135  connected.id.number.valid = 1;
6136  connected.id.number.str = (char *) cid_num;
6137  connected.id.number.presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
6138  }
6139  if (cid_name) {
6140  connected.id.name.valid = 1;
6141  connected.id.name.str = (char *) cid_name;
6143  }
6145  if (requestor) {
6146  ast_channel_lock_both(chan, (struct ast_channel *) requestor);
6148  ast_channel_unlock(chan);
6149  ast_channel_unlock((struct ast_channel *) requestor);
6150  }
6151 
6152  if (ast_call(chan, addr, 0)) { /* ast_call failed... */
6153  ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, addr);
6154  } else {
6155  struct timeval start = ast_tvnow();
6156  res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
6157  while (timeout && ast_channel_state(chan) != AST_STATE_UP) {
6158  struct ast_frame *f;
6159  int ms = ast_remaining_ms(start, timeout);
6160 
6161  res = ast_waitfor(chan, ms);
6162  if (res == 0) { /* timeout, treat it like ringing */
6163  *outstate = AST_CONTROL_RINGING;
6164  break;
6165  }
6166  if (res < 0) /* error or done */
6167  break;
6169  if (!(chan = ast_call_forward(NULL, chan, NULL, cap, oh, outstate))) {
6170  return NULL;
6171  }
6172  continue;
6173  }
6174 
6175  f = ast_read(chan);
6176  if (!f) {
6177  *outstate = AST_CONTROL_HANGUP;
6178  res = 0;
6179  break;
6180  }
6181  if (f->frametype == AST_FRAME_CONTROL) {
6182  switch (f->subclass.integer) {
6183  case AST_CONTROL_RINGING: /* record but keep going */
6184  *outstate = f->subclass.integer;
6185  break;
6186 
6187  case AST_CONTROL_BUSY:
6188  *outstate = f->subclass.integer;
6189  timeout = 0;
6190  break;
6191 
6193  *outstate = AST_CONTROL_CONGESTION;
6194  timeout = 0;
6195  break;
6196 
6198  *outstate = f->subclass.integer;
6199  timeout = 0;
6200  break;
6201 
6202  case AST_CONTROL_ANSWER:
6203  *outstate = f->subclass.integer;
6204  timeout = 0; /* trick to force exit from the while() */
6205  break;
6206 
6209  break;
6210 
6211  case AST_CONTROL_PROGRESS:
6212  if (oh && oh->connect_on_early_media) {
6213  *outstate = f->subclass.integer;
6214  timeout = 0; /* trick to force exit from the while() */
6215  break;
6216  }
6217  /* Fallthrough */
6218  /* Ignore these */
6220  case AST_CONTROL_HOLD:
6221  case AST_CONTROL_UNHOLD:
6222  case AST_CONTROL_VIDUPDATE:
6223  case AST_CONTROL_SRCUPDATE:
6224  case AST_CONTROL_SRCCHANGE:
6227  case AST_CONTROL_CC:
6228  case -1: /* Ignore -- just stopping indications */
6229  break;
6230 
6231  default:
6232  ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass.integer);
6233  }
6234  last_subclass = f->subclass.integer;
6235  }
6236  ast_frfree(f);
6237  }
6238  }
6239 
6240  /* Final fixups */
6241  if (oh) {
6242  if (!ast_strlen_zero(oh->context))
6243  ast_channel_context_set(chan, oh->context);
6244  if (!ast_strlen_zero(oh->exten))
6245  ast_channel_exten_set(chan, oh->exten);
6246  if (oh->priority)
6248  }
6249  if (ast_channel_state(chan) == AST_STATE_UP)
6250  *outstate = AST_CONTROL_ANSWER;
6251 
6252  if (res <= 0) {
6253  ast_channel_lock(chan);
6254  if (AST_CONTROL_RINGING == last_subclass) {
6256  }
6257  ast_channel_unlock(chan);
6258  ast_hangup(chan);
6259  chan = NULL;
6260  }
6261  return chan;
6262 }
static const char type[]
Definition: chan_ooh323.c:109
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
const char * cid_num
Definition: channel.h:1110
void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
Initialize the given connected line structure using the given guide for a set update operation...
Definition: channel.c:2045
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:8404
struct ast_channel * parent_channel
Definition: channel.h:1114
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
#define ast_set_flag(p, flag)
Definition: utils.h:70
static int timeout
Definition: cdr_mysql.c:86
ast_channel_state
ast_channel states
Definition: channelstate.h:35
int connect_on_early_media
Definition: channel.h:1109
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
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:6866
#define NULL
Definition: resample.c:96
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition: callerid.h:329
const char * ast_channel_call_forward(const struct ast_channel *chan)
static char cid_num[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:164
struct ast_variable * vars
Definition: channel.h:1113
struct ast_frame_subclass subclass
int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
Inherit datastores from a parent to a child.
Definition: channel.c:2373
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&#39;s call_forward str...
Definition: channel.c:5988
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
const char * exten
Definition: channel.h:1107
const char * cid_name
Definition: channel.h:1111
int ast_call(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition: channel.c:6553
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
const char * account
Definition: channel.h:1112
static void handle_cause(int cause, int *outstate)
Definition: channel.c:5936
#define AST_CAUSE_NO_ANSWER
Definition: causes.h:108
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
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:6526
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition: main/utils.c:2033
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:7434
Connected Line/Party information.
Definition: channel.h:457
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4302
#define LOG_NOTICE
Definition: logger.h:263
#define ast_channel_unlock(chan)
Definition: channel.h:2946
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:4391
static char cid_name[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:165
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2952
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:6444
int ast_max_forwards_decrement(struct ast_channel *chan)
Decrement the max forwards count for a particular channel.
Definition: max_forwards.c:135
void ast_channel_context_set(struct ast_channel *chan, const char *value)
const char * context
Definition: channel.h:1106
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3171
#define ast_frfree(fr)
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition: channel.c:2548
Data structure associated with a single frame of data.
union ast_frame::@263 data
enum ast_frame_type frametype
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)
char connected
Definition: eagi_proxy.c:82
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition: channel.c:8217

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

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

5099 {
5100  int num_new_samples = frame->samples;
5101  struct plc_ds *plc = datastore->data;
5102 
5103  /* As a general note, let me explain the somewhat odd calculations used when taking
5104  * the frame offset into account here. According to documentation in frame.h, the frame's
5105  * offset field indicates the number of bytes that the audio is offset. The plc->samples_buf
5106  * is not an array of bytes, but rather an array of 16-bit integers since it holds SLIN
5107  * samples. So I had two choices to make here with the offset.
5108  *
5109  * 1. Make the offset AST_FRIENDLY_OFFSET bytes. The main downside for this is that
5110  * I can't just add AST_FRIENDLY_OFFSET to the plc->samples_buf and have the pointer
5111  * arithmetic come out right. I would have to do some odd casting or division for this to
5112  * work as I wanted.
5113  * 2. Make the offset AST_FRIENDLY_OFFSET * 2 bytes. This allows the pointer arithmetic
5114  * to work out better with the plc->samples_buf. The downside here is that the buffer's
5115  * allocation contains an extra 64 bytes of unused space.
5116  *
5117  * I decided to go with option 2. This is why in the calloc statement and the statement that
5118  * sets the frame's offset, AST_FRIENDLY_OFFSET is multiplied by 2.
5119  */
5120 
5121  /* If this audio frame has no samples to fill in, ignore it */
5122  if (!num_new_samples) {
5123  return;
5124  }
5125 
5126  /* First, we need to be sure that our buffer is large enough to accomodate
5127  * the samples we need to fill in. This will likely only occur on the first
5128  * frame we write.
5129  */
5130  if (plc->num_samples < num_new_samples) {
5131  ast_free(plc->samples_buf);
5132  plc->samples_buf = ast_calloc(1, (num_new_samples * sizeof(*plc->samples_buf)) + (AST_FRIENDLY_OFFSET * 2));
5133  if (!plc->samples_buf) {
5134  ast_channel_datastore_remove(chan, datastore);
5135  ast_datastore_free(datastore);
5136  return;
5137  }
5138  plc->num_samples = num_new_samples;
5139  }
5140 
5141  if (frame->datalen == 0) {
5143  frame->data.ptr = plc->samples_buf + AST_FRIENDLY_OFFSET;
5144  frame->datalen = num_new_samples * 2;
5145  frame->offset = AST_FRIENDLY_OFFSET * 2;
5146  } else {
5147  plc_rx(&plc->plc_state, frame->data.ptr, frame->samples);
5148  }
5149 }
plc_state_t plc_state
Definition: channel.c:5083
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 ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition: channel.c:2399
int16_t * samples_buf
Definition: channel.c:5078
#define AST_FRIENDLY_OFFSET
Offset into a frame&#39;s data buffer.
#define ast_free(a)
Definition: astmm.h:182
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
size_t num_samples
Definition: channel.c:5082
void * data
Definition: datastore.h:70
int plc_rx(plc_state_t *s, int16_t amp[], int len)
Process a block of received audio samples.
Definition: plc.c:132
union ast_frame::@263 data

◆ apply_plc()

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

Definition at line 5151 of file channel.c.

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

Referenced by ast_write_stream().

5152 {
5153  struct ast_datastore *datastore;
5154  struct plc_ds *plc;
5155 
5156  datastore = ast_channel_datastore_find(chan, &plc_ds_info, NULL);
5157  if (datastore) {
5158  plc = datastore->data;
5159  adjust_frame_for_plc(chan, frame, datastore);
5160  return;
5161  }
5162 
5163  datastore = ast_datastore_alloc(&plc_ds_info, NULL);
5164  if (!datastore) {
5165  return;
5166  }
5167  plc = ast_calloc(1, sizeof(*plc));
5168  if (!plc) {
5169  ast_datastore_free(datastore);
5170  return;
5171  }
5172  datastore->data = plc;
5173  ast_channel_datastore_add(chan, datastore);
5174  adjust_frame_for_plc(chan, frame, datastore);
5175 }
static void adjust_frame_for_plc(struct ast_channel *chan, struct ast_frame *frame, struct ast_datastore *datastore)
Definition: channel.c:5098
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:2404
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
void * data
Definition: datastore.h:70
static const struct ast_datastore_info plc_ds_info
Definition: channel.c:5093
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2390
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89

◆ ast_activate_generator()

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

Activate a given generator

Definition at line 2960 of file channel.c.

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(), 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(), eivr_comm(), local_ast_moh_start(), old_milliwatt_exec(), sms_exec(), spandsp_fax_gateway_start(), and transmit_audio().

2961 {
2962  int res = 0;
2963  void *generatordata = NULL;
2964 
2965  ast_channel_lock(chan);
2966  if (ast_channel_generatordata(chan)) {
2967  struct ast_generator *generator_old = ast_channel_generator(chan);
2968 
2969  if (generator_old && generator_old->release) {
2970  generator_old->release(chan, ast_channel_generatordata(chan));
2971  }
2972  }
2973  if (gen->alloc && !(generatordata = gen->alloc(chan, params))) {
2974  res = -1;
2975  }
2976  ast_channel_generatordata_set(chan, generatordata);
2977  if (!res) {
2978  ast_settimeout(chan, 50, generator_force, chan);
2979  ast_channel_generator_set(chan, gen);
2980  }
2981  ast_channel_unlock(chan);
2982 
2983  ast_prod(chan);
2984 
2985  return res;
2986 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
void * ast_channel_generatordata(const struct ast_channel *chan)
void *(* alloc)(struct ast_channel *chan, void *params)
Definition: channel.h:227
void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value)
#define NULL
Definition: resample.c:96
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
void(* release)(struct ast_channel *chan, void *data)
Definition: channel.h:229
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:3189
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_prod(struct ast_channel *chan)
Send empty audio to prime a channel driver.
Definition: channel.c:5045
static int generator_force(const void *data)
Definition: channel.c:2925

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

References ao2_container_count().

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

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

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

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

Referenced by agent_login_exec(), agi_exec_full(), alarmreceiver_exec(), announce_request(), answer_trunk_chan(), 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(), dahdiras_exec(), dial_exec_full(), dictate_exec(), directory_exec(), disa_exec(), eivr_comm(), handle_answer(), ices_exec(), 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(), sms_exec(), speech_background(), testclient_exec(), testserver_exec(), transmit(), vm_exec(), vm_execmain(), vm_playmsgexec(), waitfor_exec(), and zapateller_exec().

2815 {
2816  SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2817  return __ast_answer(chan, 0);
2818 }
int __ast_answer(struct ast_channel *chan, unsigned int delay)
Answer a channel, with a selectable delay before returning.
Definition: channel.c:2704
#define SCOPE_TRACE(level,...)
Print a trace message with details when a scope is entered or existed.
Definition: logger.h:749
const char * ast_channel_name(const struct ast_channel *chan)

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

References ast_answer(), and AST_STATE_UP.

Referenced by record_file().

2821 {
2822  if (ast_channel_state(chan) == AST_STATE_UP) {
2823  /* Already answered */
2824  return 0;
2825  }
2826  return ast_answer(chan);
2827 }
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2814
ast_channel_state
ast_channel states
Definition: channelstate.h:35

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

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, ast_channel_tech::call, and 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().

6554 {
6555  /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
6556  If the remote end does not answer within the timeout, then do NOT hang up, but
6557  return anyway. */
6558  int res = -1;
6559  /* Stop if we're a zombie or need a soft hangup */
6560  ast_channel_lock(chan);
6562  if (ast_channel_tech(chan)->call)
6563  res = ast_channel_tech(chan)->call(chan, addr, timeout);
6565  }
6566  ast_channel_unlock(chan);
6567  return res;
6568 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define ast_set_flag(p, flag)
Definition: utils.h:70
static int timeout
Definition: cdr_mysql.c:86
static int call(void *data)
Definition: chan_pjsip.c:2358
int(*const call)(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition: channel.h:702
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

◆ 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 uncuccessful)
Returns
Returns the forwarded call's ast_channel on success or NULL on failure

Definition at line 5988 of file channel.c.

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

5989 {
5990  char tmpchan[256];
5991  char forwarder[AST_CHANNEL_NAME];
5992  struct ast_channel *new_chan = NULL;
5993  char *data, *type;
5994  int cause = 0;
5995  int res;
5996 
5997  /* gather data and request the new forward channel */
5998  ast_copy_string(tmpchan, ast_channel_call_forward(orig), sizeof(tmpchan));
5999  ast_copy_string(forwarder, ast_channel_name(orig), sizeof(forwarder));
6000  if ((data = strchr(tmpchan, '/'))) {
6001  *data++ = '\0';
6002  type = tmpchan;
6003  } else {
6004  const char *forward_context;
6005  ast_channel_lock(orig);
6006  forward_context = pbx_builtin_getvar_helper(orig, "FORWARD_CONTEXT");
6007  snprintf(tmpchan, sizeof(tmpchan), "%s@%s", ast_channel_call_forward(orig), S_OR(forward_context, ast_channel_context(orig)));
6008  ast_channel_unlock(orig);
6009  data = tmpchan;
6010  type = "Local";
6011  }
6012  if (!(new_chan = ast_request(type, cap, NULL, orig, data, &cause))) {
6013  ast_log(LOG_NOTICE, "Unable to create channel for call forward to '%s/%s' (cause = %d)\n", type, data, cause);
6014  handle_cause(cause, outstate);
6015  ast_hangup(orig);
6016  return NULL;
6017  }
6018 
6019  /* Copy/inherit important information into new channel */
6020  if (oh) {
6021  if (oh->vars) {
6022  ast_channel_lock(new_chan);
6023  ast_set_variables(new_chan, oh->vars);
6024  ast_channel_unlock(new_chan);
6025  }
6026  if (oh->parent_channel) {
6027  call_forward_inherit(new_chan, oh->parent_channel, orig);
6028  }
6029  if (!ast_strlen_zero(oh->account)) {
6030  ast_channel_lock(new_chan);
6031  ast_channel_stage_snapshot(new_chan);
6032  ast_channel_accountcode_set(new_chan, oh->account);
6033  ast_channel_peeraccount_set(new_chan, oh->account);
6035  ast_channel_unlock(new_chan);
6036  }
6037  } else if (caller) { /* no outgoing helper so use caller if available */
6038  call_forward_inherit(new_chan, caller, orig);
6039  }
6040 
6041  ast_channel_lock_both(orig, new_chan);
6043  pbx_builtin_setvar_helper(new_chan, "FORWARDERNAME", forwarder);
6047  ast_channel_unlock(new_chan);
6048  ast_channel_unlock(orig);
6049 
6050  /* call new channel */
6051  res = ast_call(new_chan, data, 0);
6052  if (timeout) {
6053  *timeout = res;
6054  }
6055  if (res) {
6056  ast_log(LOG_NOTICE, "Unable to call forward to channel %s/%s\n", type, (char *)data);
6057  ast_hangup(orig);
6058  ast_hangup(new_chan);
6059  return NULL;
6060  }
6061  ast_hangup(orig);
6062 
6063  return new_chan;
6064 }
static const char type[]
Definition: chan_ooh323.c:109
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
struct ast_channel * parent_channel
Definition: channel.h:1114
static int timeout
Definition: cdr_mysql.c:86
#define NULL
Definition: resample.c:96
const char * data
const char * ast_channel_call_forward(const struct ast_channel *chan)
struct ast_variable * vars
Definition: channel.h:1113
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
int ast_call(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition: channel.c:6553
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
const char * account
Definition: channel.h:1112
static void handle_cause(int cause, int *outstate)
Definition: channel.c:5936
void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
Set a flag on a channel.
Definition: channel.c:11228
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition: channel.c:2031
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
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:6526
#define LOG_NOTICE
Definition: logger.h:263
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define AST_CHANNEL_NAME
Definition: channel.h:172
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition: channel.c:2135
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name...
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2952
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:6444
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const char * ast_channel_name(const struct ast_channel *chan)
static void call_forward_inherit(struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
Definition: channel.c:5959
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition: channel.c:2548
const char * ast_channel_context(const struct ast_channel *chan)
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition: channel.c:8217

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

References ARRAY_LEN, and causes_map::desc.

Referenced by __transmit_response(), bridge_dissolve(), channel_destroyed_event(), channel_state_change(), dial_exec_full(), findmeexec(), hangupcause_read(), rfc3326_add_reason_header(), sip_hangup(), and transmit_request_with_auth().

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 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static const struct causes_map causes[]
Definition: channel.c:136
const char * desc
Definition: channel.c:133
char x
Definition: extconf.c:81

◆ 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
Returns
nothing
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 6854 of file channel.c.

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

Referenced by update_name().

6855 {
6856  /* We must re-link, as the hash value will change here. */
6857  ao2_lock(channels);
6858  ast_channel_lock(chan);
6859  ao2_unlink(channels, chan);
6860  __ast_change_name_nolink(chan, newname);
6861  ao2_link(channels, chan);
6862  ast_channel_unlock(chan);
6864 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ao2_unlock(a)
Definition: astobj2.h:730
#define ao2_lock(a)
Definition: astobj2.h:718
#define ao2_unlink(container, obj)
Definition: astobj2.h:1598
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
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:6839
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ao2_link(container, obj)
Definition: astobj2.h:1549

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

References AST_AMA_BILLING, AST_AMA_DOCUMENTATION, and AST_AMA_OMIT.

Referenced by _sip_show_peer(), _skinny_show_line(), 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(), sip_show_user(), and tds_log().

4419 {
4420  switch (flag) {
4421  case AST_AMA_OMIT:
4422  return "OMIT";
4423  case AST_AMA_BILLING:
4424  return "BILLING";
4425  case AST_AMA_DOCUMENTATION:
4426  return "DOCUMENTATION";
4427  default:
4428  return "Unknown";
4429  }
4430 }
long int flag
Definition: f2c.h:83

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

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

Referenced by _skinny_show_lines(), analog_ss_thread(), ast_rtp_instance_set_stats_vars(), ast_set_hangupsource(), ast_unreal_queryoption(), ast_var_channels_table(), attach_barge(), cb_events(), channel_do_masquerade(), create_jb(), export_aoc_vars(), fax_detect_framehook(), fax_gateway_framehook(), func_channel_read(), get_refer_info(), handle_incoming_request(), handle_request_bye(), manager_park(), mgcp_hangup(), my_get_sigpvt_bridged_channel(), and spandsp_fax_gateway_start().

10766 {
10767  struct ast_channel *peer;
10768  struct ast_bridge *bridge;
10769 
10770  /* Get the bridge the channel is in. */
10771  ast_channel_lock(chan);
10772  bridge = ast_channel_get_bridge(chan);
10773  ast_channel_unlock(chan);
10774  if (!bridge) {
10775  return NULL;
10776  }
10777 
10778  peer = ast_bridge_peer(bridge, chan);
10779  ao2_ref(bridge, -1);
10780  return peer;
10781 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
#define NULL
Definition: resample.c:96
struct ast_channel * ast_bridge_peer(struct ast_bridge *bridge, struct ast_channel *chan)
Get the channel&#39;s bridge peer only if the bridge is two-party.
Definition: bridge.c:4142
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition: channel.c:10735
#define ao2_ref(o, delta)
Definition: astobj2.h:464
Structure that contains information about a bridge.
Definition: bridge.h:357
#define ast_channel_unlock(chan)
Definition: channel.h:2946

◆ ast_channel_by_exten_cb()

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

Definition at line 1306 of file channel.c.

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

Referenced by ast_channel_get_by_exten(), and ast_channel_iterator_by_exten_new().

1307 {
1308  struct ast_channel *chan = obj;
1309  char *context = arg;
1310  char *exten = data;
1311  int ret = CMP_MATCH;
1312 
1313  if (ast_strlen_zero(exten) || ast_strlen_zero(context)) {
1314  ast_log(LOG_ERROR, "BUG! Must have a context and extension to match!\n");
1315  return CMP_STOP;
1316  }
1317 
1318  ast_channel_lock(chan);
1319  if (strcasecmp(ast_channel_context(chan), context) && strcasecmp(ast_channel_macrocontext(chan), context)) {
1320  ret = 0; /* Context match failed, continue */
1321  } else if (strcasecmp(ast_channel_exten(chan), exten) && strcasecmp(ast_channel_macroexten(chan), exten)) {
1322  ret = 0; /* Extension match failed, continue */
1323  }
1324  ast_channel_unlock(chan);
1325 
1326  return ret;
1327 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
Main Channel structure associated with a channel.
const char * data
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
const char * ast_channel_exten(const struct ast_channel *chan)
#define LOG_ERROR
Definition: logger.h:285
#define ast_channel_unlock(chan)
Definition: channel.h:2946
const char * ast_channel_context(const struct ast_channel *chan)
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
const char * ast_channel_macrocontext(const struct ast_channel *chan)
const char * ast_channel_macroexten(const struct ast_channel *chan)

◆ ast_channel_by_name_cb()

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

Definition at line 1284 of file channel.c.

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

Referenced by ast_channel_get_by_name_prefix(), and ast_channel_iterator_by_name_new().

1285 {
1286  struct ast_channel *chan = obj;
1287  const char *name = arg;
1288  size_t name_len = *(size_t *) data;
1289  int ret = CMP_MATCH;
1290 
1291  if (ast_strlen_zero(name)) {
1292  ast_log(LOG_ERROR, "BUG! Must supply a channel name or partial name to match!\n");
1293  return CMP_STOP;
1294  }
1295 
1296  ast_channel_lock(chan);
1297  if ((!name_len && strcasecmp(ast_channel_name(chan), name))
1298  || (name_len && strncasecmp(ast_channel_name(chan), name, name_len))) {
1299  ret = 0; /* name match failed, keep looking */
1300  }
1301  ast_channel_unlock(chan);
1302 
1303  return ret;
1304 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
const char * data
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285
#define ast_channel_unlock(chan)
Definition: channel.h:2946
static const char name[]
Definition: cdr_mysql.c:74
const char * ast_channel_name(const struct ast_channel *chan)

◆ ast_channel_by_uniqueid_cb()

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

Definition at line 1329 of file channel.c.

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

Referenced by ast_channel_get_by_name_prefix(), and does_id_conflict().

1330 {
1331  struct ast_channel *chan = obj;
1332  char *uniqueid = arg;
1333  size_t id_len = *(size_t *) data;
1334  int ret = CMP_MATCH;
1335 
1336  if (ast_strlen_zero(uniqueid)) {
1337  ast_log(LOG_ERROR, "BUG! Must supply a uniqueid or partial uniqueid to match!\n");
1338  return CMP_STOP;
1339  }
1340 
1341  ast_channel_lock(chan);
1342  if ((!id_len && strcasecmp(ast_channel_uniqueid(chan), uniqueid))
1343  || (id_len && strncasecmp(ast_channel_uniqueid(chan), uniqueid, id_len))) {
1344  ret = 0; /* uniqueid match failed, keep looking */
1345  }
1346  ast_channel_unlock(chan);
1347 
1348  return ret;
1349 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
const char * data
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
const char * ast_channel_uniqueid(const struct ast_channel *chan)
#define LOG_ERROR
Definition: logger.h:285
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_channel_id uniqueid

◆ ast_channel_callback()

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

Call a function with every active channel.

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

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

Definition at line 1278 of file channel.c.

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

1280 {
1281  return ao2_callback_data(channels, ao2_flags, cb_fn, arg, data);
1282 }
const char * data
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
#define ao2_callback_data(container, flags, cb_fn, arg, data)
Definition: astobj2.h:1743

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

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

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

10654 {
10655  struct ast_cc_config_params *cc_params;
10656  struct ast_datastore *cc_datastore;
10657 
10658  if (!(cc_params = ast_cc_config_params_init())) {
10659  return -1;
10660  }
10661 
10662  if (!(cc_datastore = ast_datastore_alloc(&cc_channel_datastore_info, NULL))) {
10663  ast_cc_config_params_destroy(cc_params);
10664  return -1;
10665  }
10666 
10667  if (base_params) {
10668  ast_cc_copy_config_params(cc_params, base_params);
10669  }
10670  cc_datastore->data = cc_params;
10671  ast_channel_datastore_add(chan, cc_datastore);
10672  return 0;
10673 }
static const struct ast_datastore_info cc_channel_datastore_info
Definition: channel.c:10646
void ast_cc_config_params_destroy(struct ast_cc_config_params *params)
Free memory from CCSS configuration params.
Definition: ccss.c:693
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
#define ast_cc_config_params_init()
Allocate and initialize an ast_cc_config_params structure.
Definition: ccss.h:135
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:861
void * data
Definition: datastore.h:70
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2390
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89

◆ ast_channel_clear_flag()

void ast_channel_clear_flag ( struct ast_channel chan,
unsigned int  flag 
)
Since
13.17.0
Parameters
Cleara flag on a channel
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 11235 of file channel.c.

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

11236 {
11237  ast_channel_lock(chan);
11239  ast_channel_unlock(chan);
11240 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
long int flag
Definition: f2c.h:83
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ast_clear_flag(p, flag)
Definition: utils.h:77
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

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

Definition at line 2437 of file channel.c.

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

2438 {
2439  ast_channel_lock(chan);
2440 
2442 
2444  struct ast_frame *fr;
2445 
2446  /* If we have completely cleared the softhangup flag,
2447  * then we need to fully abort the hangup process. This requires
2448  * pulling the END_OF_Q frame out of the channel frame queue if it
2449  * still happens to be there. */
2450 
2451  fr = AST_LIST_LAST(ast_channel_readq(chan));
2452  if (fr && fr->frametype == AST_FRAME_CONTROL &&
2455  ast_frfree(fr);
2456  }
2457  }
2458 
2459  ast_channel_unlock(chan);
2460 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: linkedlists.h:855
struct ast_frame_subclass subclass
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:428
long int flag
Definition: f2c.h:83
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
#define ast_frfree(fr)
Data structure associated with a single frame of data.
enum ast_frame_type frametype
void ast_channel_softhangup_internal_flag_clear(struct ast_channel *chan, int value)

◆ ast_channel_cmp_cb()

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

Definition at line 1428 of file channel.c.

References ast_log, CMP_STOP, and LOG_ERROR.

Referenced by ast_channels_init().

1429 {
1430  ast_log(LOG_ERROR, "BUG! Should never be called!\n");
1431  return CMP_STOP;
1432 }
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285

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

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

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 }
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
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:2283

◆ ast_channel_connected_line_macro()

int ast_channel_connected_line_macro ( struct ast_channel autoservice_chan,
struct ast_channel macro_chan,
const void *  connected_info,
int  is_caller,
int  frame 
)

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

Since
1.8
Deprecated:
You should use the ast_channel_connected_line_sub() function instead.

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

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

Have multiple return codes based on the MACRO_RESULT

Make constants so that caller and frame can be more expressive than just '1' and '0'

Definition at line 10435 of file channel.c.

References ast_app_run_macro(), ast_channel_connected(), ast_channel_lock, ast_channel_unlock, ast_channel_update_connected_line(), ast_connected_line_parse_data(), ast_log, ast_party_connected_line_copy(), ast_party_connected_line_free(), ast_party_connected_line_init(), ast_strdupa, ast_strlen_zero, channel_set_intercept_mode(), chanlist::connected, ast_frame::data, ast_frame::datalen, LOG_WARNING, NULL, pbx_builtin_getvar_helper(), ast_frame::ptr, retval, and S_OR.

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

10436 {
10437  static int deprecation_warning = 0;
10438  const char *macro;
10439  const char *macro_args;
10440  int retval;
10441 
10442  ast_channel_lock(macro_chan);
10443  macro = pbx_builtin_getvar_helper(macro_chan, is_caller
10444  ? "CONNECTED_LINE_CALLER_SEND_MACRO" : "CONNECTED_LINE_CALLEE_SEND_MACRO");
10445  macro = ast_strdupa(S_OR(macro, ""));
10446  macro_args = pbx_builtin_getvar_helper(macro_chan, is_caller
10447  ? "CONNECTED_LINE_CALLER_SEND_MACRO_ARGS" : "CONNECTED_LINE_CALLEE_SEND_MACRO_ARGS");
10448  macro_args = ast_strdupa(S_OR(macro_args, ""));
10449 
10450  if (ast_strlen_zero(macro)) {
10451  ast_channel_unlock(macro_chan);
10452  return -1;
10453  }
10454 
10455  if (!deprecation_warning) {
10456  deprecation_warning = 1;
10457  ast_log(LOG_WARNING, "Usage of CONNECTED_LINE_CALLE[ER]_SEND_MACRO is deprecated. Please use CONNECTED_LINE_SEND_SUB instead.\n");
10458  }
10459  if (is_frame) {
10460  const struct ast_frame *frame = connected_info;
10461 
10463  } else {
10464  const struct ast_party_connected_line *connected = connected_info;
10465 
10466  ast_party_connected_line_copy(ast_channel_connected(macro_chan), connected);
10467  }
10468  ast_channel_unlock(macro_chan);
10469 
10471  retval = ast_app_run_macro(autoservice_chan, macro_chan, macro, macro_args);
10473  if (!retval) {
10474  struct ast_party_connected_line saved_connected;
10475 
10476  ast_party_connected_line_init(&saved_connected);
10477  ast_channel_lock(macro_chan);
10478  ast_party_connected_line_copy(&saved_connected, ast_channel_connected(macro_chan));
10479  ast_channel_unlock(macro_chan);
10480  ast_channel_update_connected_line(macro_chan, &saved_connected, NULL);
10481  ast_party_connected_line_free(&saved_connected);
10482  }
10483 
10484  return retval;
10485 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
int ast_app_run_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const char *macro_name, const char *macro_args)
Run a macro on a channel, placing an optional second channel into autoservice.
Definition: main/app.c:320
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:8881
#define LOG_WARNING
Definition: logger.h:274
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2022
static void channel_set_intercept_mode(int in_intercept_mode)
Definition: channel.c:10419
#define NULL
Definition: resample.c:96
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition: channel.c:2072
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition: channel.c:2031
Connected Line/Party information.
Definition: channel.h:457
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
static ENTRY retval
Definition: hsearch.c:50
Data structure associated with a single frame of data.
union ast_frame::@263 data
char connected
Definition: eagi_proxy.c:82
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:9189

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

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

10540 {
10541  const char *sub;
10542  const char *sub_args;
10543  int retval;
10544 
10545  ast_channel_lock(sub_chan);
10546  sub = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB");
10547  sub = ast_strdupa(S_OR(sub, ""));
10548  sub_args = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB_ARGS");
10549  sub_args = ast_strdupa(S_OR(sub_args, ""));
10550 
10551  if (ast_strlen_zero(sub)) {
10552  ast_channel_unlock(sub_chan);
10553  return -1;
10554  }
10555 
10556  if (is_frame) {
10557  const struct ast_frame *frame = connected_info;
10558 
10560  } else {
10561  const struct ast_party_connected_line *connected = connected_info;
10562 
10564  }
10565  ast_channel_unlock(sub_chan);
10566 
10568  retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10570  if (!retval) {
10571  struct ast_party_connected_line saved_connected;
10572 
10573  ast_party_connected_line_init(&saved_connected);
10574  ast_channel_lock(sub_chan);
10575  ast_party_connected_line_copy(&saved_connected, ast_channel_connected(sub_chan));
10576  ast_channel_unlock(sub_chan);
10577  ast_channel_update_connected_line(sub_chan, &saved_connected, NULL);
10578  ast_party_connected_line_free(&saved_connected);
10579  }
10580 
10581  return retval;
10582 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
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:8881
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition: channel.c:2022
static void channel_set_intercept_mode(int in_intercept_mode)
Definition: channel.c:10419
#define NULL
Definition: resample.c:96
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
#define ast_strlen_zero(foo)
Definition: strings.h:52
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition: channel.c:2072
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition: channel.c:2031
Connected Line/Party information.
Definition: channel.h:457
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:401
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
static ENTRY retval
Definition: hsearch.c:50
struct stasis_forward * sub
Definition: res_corosync.c:240
Data structure associated with a single frame of data.
union ast_frame::@263 data
char connected
Definition: eagi_proxy.c:82
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:9189

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

References ast_channel_datastores(), and AST_LIST_INSERT_HEAD.

Referenced by __after_bridge_set_goto(), _macro_exec(), acf_curlopt_write(), acf_iaxvar_write(), acf_odbc_read(), 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_verification(), 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_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(), 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(), MYSQL_exec(), pitchshift_helper(), raise_exception(), reload(), 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(), and volume_write().

2391 {
2392  int res = 0;
2393 
2395 
2396  return res;
2397 }
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:710
Definition: search.h:40

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

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

Referenced by _macro_exec(), 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_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(), 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(), 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_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_chan_by_ast_name(), 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(), MYSQL_exec(), pitchshift_cb(), pitchshift_helper(), pop_exec(), raise_exception(), remb_hook_event_cb(), remove_detect(), remove_dtmf_store(), 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().

2405 {
2406  struct ast_datastore *datastore = NULL;
2407 
2408  if (info == NULL)
2409  return NULL;
2410 
2411  AST_LIST_TRAVERSE(ast_channel_datastores(chan), datastore, entry) {
2412  if (datastore->info != info) {
2413  continue;
2414  }
2415 
2416  if (uid == NULL) {
2417  /* matched by type only */
2418  break;
2419  }
2420 
2421  if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
2422  /* Matched by type AND uid */
2423  break;
2424  }
2425  }
2426 
2427  return datastore;
2428 }
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
const char * uid
Definition: datastore.h:69
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
const struct ast_datastore_info * info
Definition: datastore.h:71
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
Definition: search.h:40

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

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

2374 {
2375  struct ast_datastore *datastore = NULL, *datastore2;
2376 
2377  AST_LIST_TRAVERSE(ast_channel_datastores(from), datastore, entry) {
2378  if (datastore->inheritance > 0) {
2379  datastore2 = ast_datastore_alloc(datastore->info, datastore->uid);
2380  if (datastore2) {
2381  datastore2->data = datastore->info->duplicate ? datastore->info->duplicate(datastore->data) : NULL;
2382  datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
2384  }
2385  }
2386  }
2387  return 0;
2388 }
void *(* duplicate)(void *data)
Definition: datastore.h:33
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
const char * uid
Definition: datastore.h:69
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
const struct ast_datastore_info * info
Definition: datastore.h:71
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
#define DATASTORE_INHERIT_FOREVER
Definition: channel.h:193
unsigned int inheritance
Definition: datastore.h:73
void * data
Definition: datastore.h:70
Definition: search.h:40
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89

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

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

1258 {
1259  int pre = 0;
1260 
1261  if (chan) {
1262  ast_channel_lock(chan);
1265  ast_channel_unlock(chan);
1266  }
1267  return pre;
1268 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

◆ ast_channel_destructor()

static void ast_channel_destructor ( void *  obj)
static

Free a channel structure.

Definition at line 2192 of file channel.c.

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_monitor(), 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, NULL, and ast_channel_monitor::stop.

Referenced by __ast_channel_alloc_ap().

2193 {
2194  struct ast_channel *chan = obj;
2195  struct ast_var_t *vardata;
2196  struct ast_frame *f;
2197  struct varshead *headp;
2198  struct ast_datastore *datastore;
2199  char device_name[AST_CHANNEL_NAME];
2200  ast_callid callid;
2201 
2202  ast_debug(1, "Channel %p '%s' destroying\n", chan, ast_channel_name(chan));
2203 
2204  /* Stop monitoring */
2205  if (ast_channel_monitor(chan)) {
2206  ast_channel_monitor(chan)->stop(chan, 0);
2207  }
2208 
2209  /* If there is native format music-on-hold state, free it */
2210  if (ast_channel_music_state(chan)) {
2211  ast_moh_cleanup(chan);
2212  }
2213 
2215 
2216  /* Things that may possibly raise Stasis messages shouldn't occur after this point */
2218 
2220  /* A channel snapshot should not be in the process of being staged now. */
2222 
2223  ast_channel_lock(chan);
2225  ast_channel_unlock(chan);
2226  }
2227 
2228  ast_channel_lock(chan);
2229 
2230  /* Get rid of each of the data stores on the channel */
2231  while ((datastore = AST_LIST_REMOVE_HEAD(ast_channel_datastores(chan), entry)))
2232  /* Free the data store */
2233  ast_datastore_free(datastore);
2234 
2235  /* While the channel is locked, take the reference to its callid while we tear down the call. */
2236  callid = ast_channel_callid(chan);
2238 
2239  ast_channel_unlock(chan);
2240 
2241  /* Lock and unlock the channel just to be sure nobody has it locked still
2242  due to a reference that was stored in a datastore. (i.e. app_chanspy) */
2243  ast_channel_lock(chan);
2244  ast_channel_unlock(chan);
2245 
2246  if (ast_channel_tech_pvt(chan)) {
2247  ast_log_callid(LOG_WARNING, callid, "Channel '%s' may not have been hung up properly\n", ast_channel_name(chan));
2249  }
2250 
2251  if (ast_channel_sched(chan)) {
2253  }
2254 
2256  char *dashptr;
2257 
2258  ast_copy_string(device_name, ast_channel_name(chan), sizeof(device_name));
2259  if ((dashptr = strrchr(device_name, '-'))) {
2260  *dashptr = '\0';
2261  }
2262  } else {
2263  device_name[0] = '\0';
2264  }
2265 
2266  /* Free translators */
2267  if (ast_channel_readtrans(chan))
2269  if (ast_channel_writetrans(chan))
2271  if (ast_channel_pbx(chan))
2272  ast_log_callid(LOG_WARNING, callid, "PBX may not have been terminated properly on '%s'\n", ast_channel_name(chan));
2273 
2274  /* Free formats */
2280 
2286 
2287  /* Close pipes if appropriate */
2289  if (ast_channel_timer(chan)) {
2291  ast_channel_timer_set(chan, NULL);
2292  }
2293  while ((f = AST_LIST_REMOVE_HEAD(ast_channel_readq(chan), frame_list)))
2294  ast_frfree(f);
2295 
2296  /* loop over the variables list, freeing all data and deleting list items */
2297  /* no need to lock the list, as the channel is already locked */
2298  headp = ast_channel_varshead(chan);
2299  while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
2300  ast_var_delete(vardata);
2301 
2302  ast_app_group_discard(chan);
2303 
2304  /* Destroy the jitterbuffer */
2305  ast_jb_destroy(chan);
2306 
2307  if (ast_channel_cdr(chan)) {
2309  ast_channel_cdr_set(chan, NULL);
2310  }
2311 
2312  if (ast_channel_zone(chan)) {
2314  }
2315 
2317 
2318  if (device_name[0]) {
2319  /*
2320  * We have a device name to notify of a new state.
2321  *
2322  * Queue an unknown state, because, while we know that this particular
2323  * instance is dead, we don't know the state of all other possible
2324  * instances.
2325  */
2327  }
2328 
2330 
2333 
2335 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
void ast_channel_timer_set(struct ast_channel *chan, struct ast_timer *value)
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
struct ast_cdr * ast_channel_cdr(const struct ast_channel *chan)
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_set_oldwriteformat(struct ast_channel *chan, struct ast_format *format)
int(* stop)(struct ast_channel *chan, int need_lock)
Definition: channel.h:4250
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:2149
void * ast_channel_tech_pvt(const struct ast_channel *chan)
#define ast_test_flag(p, flag)
Definition: utils.h:63
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define LOG_WARNING
Definition: logger.h:274
struct ast_tone_zone * ast_channel_zone(const struct ast_channel *chan)
void ast_timer_close(struct ast_timer *handle)
Close an opened timing handle.
Definition: timing.c:154
void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_channel_internal_alertpipe_close(struct ast_channel *chan)
unsigned int ast_callid
Definition: logger.h:87
#define ast_assert(a)
Definition: utils.h:695
Structure for a data store object.
Definition: datastore.h:68
struct varshead * ast_channel_varshead(struct ast_channel *chan)
#define NULL
Definition: resample.c:96
void ast_channel_zone_set(struct ast_channel *chan, struct ast_tone_zone *value)
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
void ast_channel_callid_cleanup(struct ast_channel *chan)
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:755
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
void ast_party_caller_free(struct ast_party_caller *doomed)
Destroy the caller party contents.
Definition: channel.c:2015
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_cdr_set(struct ast_channel *chan, struct ast_cdr *value)
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition: channel.c:2072
void ast_moh_cleanup(struct ast_channel *chan)
Definition: channel.c:7882
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
void ast_jb_destroy(struct ast_channel *chan)
Destroys jitterbuffer on a channel.
Definition: abstract_jb.c:502
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
void ast_channel_internal_cleanup(struct ast_channel *chan)
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2179
struct ast_sched_context * ast_channel_sched(const struct ast_channel *chan)
void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_channel_publish_final_snapshot(struct ast_channel *chan)
Send the final channel snapshot for a channel, thus removing it from cache.
void ast_var_delete(struct ast_var_t *var)
Definition: extconf.c:2473
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ast_free(a)
Definition: astmm.h:182
#define AST_CHANNEL_NAME
Definition: channel.h:172
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
int ast_channel_internal_is_finalized(struct ast_channel *chan)
static int chancount
Definition: channel.c:93
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
const char * ast_channel_name(const struct ast_channel *chan)
void ast_party_dialed_free(struct ast_party_dialed *doomed)
Destroy the dialed party contents.
Definition: channel.c:1971
void * ast_channel_music_state(const struct ast_channel *chan)
void ast_pbx_hangup_handler_destroy(struct ast_channel *chan)
Destroy the hangup handler container on a channel.
#define ast_frfree(fr)
void ast_cdr_free(struct ast_cdr *cdr)
Free a CDR record.
Definition: cdr.c:3411
Data structure associated with a single frame of data.
Definition: search.h:40
int ast_app_group_discard(struct ast_channel *chan)
Discard all group counting for a channel.
Definition: main/app.c:2162
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
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
struct ast_party_connected_line * ast_channel_connected_indicated(struct ast_channel *chan)
struct ast_channel_monitor * ast_channel_monitor(const struct ast_channel *chan)
ast_callid ast_channel_callid(const struct ast_channel *chan)
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
Definition: sched.c:269
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition: translate.c:475
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)

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

References ast_channel_tech(), and ast_channel_tech::early_bridge.

Referenced by dial_exec_full(), and wait_for_answer().

7513 {
7514  /* Make sure we can early bridge, if not error out */
7515  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)))
7516  return -1;
7517 
7518  return ast_channel_tech(c0)->early_bridge(c0, c1);
7519 }
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:769
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

Definition at line 11070 of file channel.c.

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_SOFTHANGUP_ASYNCGOTO, ast_test_flag, ast_tvdiff_ms(), ast_tvnow(), LOG_DTMF, and option_dtmfminduration.

Referenced by bridge_channel_internal_join(), and channel_do_masquerade().

11071 {
11072  int dead;
11073  long duration;
11074 
11075  ast_channel_lock(chan);
11079  ast_channel_unlock(chan);
11080  if (dead) {
11081  /* Channel is a zombie or a real hangup. */
11082  return;
11083  }
11084 
11085  duration = ast_tvdiff_ms(ast_tvnow(), start);
11086  if (duration < option_dtmfminduration) {
11087  duration = option_dtmfminduration;
11088  }
11089  ast_senddigit_end(chan, digit, duration);
11090  ast_log(LOG_DTMF, "DTMF end '%c' simulated on %s due to %s, duration %ld ms\n",
11091  digit, ast_channel_name(chan), why, duration);
11092 }
char digit
#define ast_channel_lock(chan)
Definition: channel.h:2945
unsigned int option_dtmfminduration
Definition: options.c:83
#define ast_test_flag(p, flag)
Definition: utils.h:63
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
#define ast_log
Definition: astobj2.c:42
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition: channel.c:4969
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define LOG_DTMF
Definition: logger.h:307
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

◆ ast_channel_errno()

enum ast_channel_error ast_channel_errno ( void  )

Get error code for latest channel operation.

Definition at line 11162 of file channel.c.

References ast_channel_internal_errno().

Referenced by ari_channels_handle_originate_with_id(), and ast_ari_channels_create().

11163 {
11164  return ast_channel_internal_errno();
11165 }
enum ast_channel_error ast_channel_internal_errno(void)

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

References channel_feature_hooks_set_full().

Referenced by AST_TEST_DEFINE().

11153 {
11154  return channel_feature_hooks_set_full(chan, features, 0);
11155 }
static int channel_feature_hooks_set_full(struct ast_channel *chan, struct ast_bridge_features *features, int replace)
Definition: channel.c:11115

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

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

Referenced by bridge_channel_internal_join().

11105 {
11106  struct ast_datastore *datastore;
11107 
11109  if (!datastore) {
11110  return NULL;
11111  }
11112  return datastore->data;
11113 }
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:2404
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
void * data
Definition: datastore.h:70
static const struct ast_datastore_info bridge_features_info
Definition: channel.c:11099

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

References channel_feature_hooks_set_full().

11158 {
11159  return channel_feature_hooks_set_full(chan, features, 1);
11160 }
static int channel_feature_hooks_set_full(struct ast_channel *chan, struct ast_bridge_features *features, int replace)
Definition: channel.c:11115

◆ 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.
NULL on error

Definition at line 8090 of file channel.c.

References ari_vars, and channel_get_external_vars().

Referenced by ast_channel_snapshot_create().

8091 {
8092  return channel_get_external_vars(&ari_vars, chan);
8093 }
static struct external_vars ari_vars
Definition: channel.c:7934
static struct varshead * channel_get_external_vars(struct external_vars *channelvars, struct ast_channel *chan)
Definition: channel.c:8038

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

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

10736 {
10737  struct ast_bridge *bridge;
10738 
10739  bridge = ast_channel_internal_bridge(chan);
10740  if (bridge) {
10741  ao2_ref(bridge, +1);
10742  }
10743  return bridge;
10744 }
struct ast_bridge * ast_channel_internal_bridge(const struct ast_channel *chan)
#define ao2_ref(o, delta)
Definition: astobj2.h:464
Structure that contains information about a bridge.
Definition: bridge.h:357

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

References ao2_ref, and ast_channel_internal_bridge_channel().

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(), handle_soft_key_event_message(), handle_stimulus_message(), hold(), internal_bridge_after_cb(), manager_park_bridged(), mgcp_ss(), parker_parked_call_message_response(), play_sound(), recall_pull(), ringing(), send_message(), set_interval_hook(), transfer_pull(), try_parking(), and unhold().

10784 {
10785  struct ast_bridge_channel *bridge_channel;
10786 
10787  bridge_channel = ast_channel_internal_bridge_channel(chan);
10788  if (bridge_channel) {
10789  ao2_ref(bridge_channel, +1);
10790  }
10791  return bridge_channel;
10792 }
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ast_bridge_channel * ast_channel_internal_bridge_channel(const struct ast_channel *chan)
Structure that contains information regarding a channel in a bridge.

◆ ast_channel_get_by_exten()

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

Find a channel by extension and context.

Parameters
extenthe extension to search for
contextthe context to search for

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

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

Definition at line 1459 of file channel.c.

References ast_channel_by_exten_cb(), and ast_channel_callback().

1460 {
1461  char *l_exten = (char *) exten;
1462  char *l_context = (char *) context;
1463 
1464  return ast_channel_callback(ast_channel_by_exten_cb, l_context, l_exten, 0);
1465 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int ast_channel_by_exten_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1306
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1278
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_channel_get_by_name()

struct ast_channel* ast_channel_get_by_name ( const char *  name)

Find a channel by name.

Channel search functions

Parameters
namethe name or uniqueid of the channel to search for

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

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

Definition at line 1454 of file channel.c.

References ast_channel_get_by_name_prefix().

Referenced by action_add_agi_cmd(), action_aocmessage(), action_atxfer(), action_blind_transfer(), action_cancel_atxfer(), action_getvar(), action_hangup(), 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(), asyncgoto_exec(), bridge_channel_attended_transfer(), call_forwarded_handler(), change_monitor_action(), channel_find(), cli_channelstats_print_body(), common_exec(), controlplayback_manager(), do_pause_or_unpause(), find_control(), func_mchan_read(), func_mchan_write(), handle_cli_agi_add_cmd(), handle_core_set_debug_channel(), 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_stop_mixmonitor(), moh_channel_thread(), parker_parked_call_message_response(), parking_park_bridge_channel(), pbx_builtin_importvar(), push_notify_channel(), refer_progress_bridge(), rtp_check_timeout(), senddtmf_exec(), sendmf_exec(), shared_read(), shared_write(), start_monitor_action(), stasis_app_bridge_moh_channel(), stasis_app_bridge_moh_stop(), stasis_app_bridge_playback_channel_find(), and stop_monitor_action().

1455 {
1457 }
static const char name[]
Definition: cdr_mysql.c:74
struct ast_channel * ast_channel_get_by_name_prefix(const char *name, size_t name_len)
Find a channel by a name prefix.
Definition: channel.c:1434

◆ ast_channel_get_by_name_prefix()

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

Find a channel by a name prefix.

Parameters
nameThe channel name or uniqueid prefix to search for
name_lenOnly search for up to this many characters from the name

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

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

Definition at line 1434 of file channel.c.

References ast_channel_by_name_cb(), ast_channel_by_uniqueid_cb(), ast_channel_callback(), ast_strlen_zero, chanlist::chan, 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().

1435 {
1436  struct ast_channel *chan;
1437  char *l_name = (char *) name;
1438 
1439  chan = ast_channel_callback(ast_channel_by_name_cb, l_name, &name_len,
1440  (name_len == 0) /* optimize if it is a complete name match */ ? OBJ_KEY : 0);
1441  if (chan) {
1442  return chan;
1443  }
1444 
1445  if (ast_strlen_zero(l_name)) {
1446  /* We didn't have a name to search for so quit. */
1447  return NULL;
1448  }
1449 
1450  /* Now try a search for uniqueid. */
1451  return ast_channel_callback(ast_channel_by_uniqueid_cb, l_name, &name_len, 0);
1452 }
Main Channel structure associated with a channel.
#define OBJ_KEY
Definition: astobj2.h:1155
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
static int ast_channel_by_uniqueid_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1329
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1278
static const char name[]
Definition: cdr_mysql.c:74
static int ast_channel_by_name_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1284

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

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

Referenced by find_agent_callbacks().

10715 {
10716  int len = size;
10717  char *slash;
10718 
10720  return 0;
10721  }
10722 
10724  if ((slash = strchr(agent_type, '/'))) {
10725  *slash = '\0';
10726  }
10727  return 0;
10728 }
static struct aco_type agent_type
#define AST_OPTION_CC_AGENT_TYPE
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
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:7542
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
const char * ast_channel_name(const struct ast_channel *chan)

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

References ast_assert, ast_channel_cc_params_init(), ast_channel_datastore_find(), 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().

10676 {
10677  struct ast_datastore *cc_datastore;
10678 
10679  if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10680  /* If we can't find the datastore, it almost definitely means that the channel type being
10681  * used has not had its driver modified to parse CC config parameters. The best action
10682  * to take here is to create the parameters on the spot with the defaults set.
10683  */
10684  if (ast_channel_cc_params_init(chan, NULL)) {
10685  return NULL;
10686  }
10687  if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10688  /* Should be impossible */
10689  return NULL;
10690  }
10691  }
10692 
10693  ast_assert(cc_datastore->data != NULL);
10694  return cc_datastore->data;
10695 }
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:2404
static const struct ast_datastore_info cc_channel_datastore_info
Definition: channel.c:10646
#define ast_assert(a)
Definition: utils.h:695
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
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:10652
void * data
Definition: datastore.h:70

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

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

10698 {
10699  int len = name_buffer_length;
10700  char *dash;
10701  if (!ast_channel_queryoption(chan, AST_OPTION_DEVICE_NAME, device_name, &len, 0)) {
10702  return 0;
10703  }
10704 
10705  /* Dang. Do it the old-fashioned way */
10706  ast_copy_string(device_name, ast_channel_name(chan), name_buffer_length);
10707  if ((dash = strrchr(device_name, '-'))) {
10708  *dash = '\0';
10709  }
10710 
10711  return 0;
10712 }
#define AST_OPTION_DEVICE_NAME
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
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:7542
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
const char * ast_channel_name(const struct ast_channel *chan)

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

References ast_channel_get_duration_ms().

Referenced by end_bridge_callback(), serialize_showchan(), and show_chanstats_cb().

2840 {
2841  return (ast_channel_get_duration_ms(chan) / 1000);
2842 }
int64_t ast_channel_get_duration_ms(struct ast_channel *chan)
Obtain how long it&#39;s been, in milliseconds, since the channel was created.
Definition: channel.c:2829

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

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

2830 {
2831  ast_assert(NULL != chan);
2832 
2833  if (ast_tvzero(ast_channel_creationtime(chan))) {
2834  return 0;
2835  }
2837 }
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define ast_assert(a)
Definition: utils.h:695
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
#define NULL
Definition: resample.c:96
struct timeval ast_channel_creationtime(struct ast_channel *chan)

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

References ast_threadstorage_get_ptr().

Referenced by run_agi().

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

◆ 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.
NULL on error

Definition at line 8085 of file channel.c.

References ami_vars, and channel_get_external_vars().

Referenced by append_channel_vars(), and ast_channel_snapshot_create().

8086 {
8087  return channel_get_external_vars(&ami_vars, chan);
8088 }
static struct external_vars ami_vars
Definition: channel.c:7933
static struct varshead * channel_get_external_vars(struct external_vars *channelvars, struct ast_channel *chan)
Definition: channel.c:8038

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

References ast_channel_get_up_time_ms().

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

2855 {
2856  return (ast_channel_get_up_time_ms(chan) / 1000);
2857 }
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:2844

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

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

2845 {
2846  ast_assert(NULL != chan);
2847 
2848  if (ast_tvzero(ast_channel_answertime(chan))) {
2849  return 0;
2850  }
2852 }
struct timeval ast_channel_answertime(struct ast_channel *chan)
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define ast_assert(a)
Definition: utils.h:695
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
#define NULL
Definition: resample.c:96

◆ 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.
NULL on error

Definition at line 8013 of file channel.c.

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

8014 {
8015  RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
8016  struct ast_var_t *cv;
8017 
8018  ret = ao2_alloc(sizeof(*ret), varshead_dtor);
8019 
8020  if (!ret) {
8021  return NULL;
8022  }
8023 
8026 
8027  if (!var) {
8028  return NULL;
8029  }
8030 
8031  AST_LIST_INSERT_TAIL(ret, var, entries);
8032  }
8033 
8034  ao2_ref(ret, +1);
8035  return ret;
8036 }
const char * ast_var_value(const struct ast_var_t *var)
Definition: chanvars.c:80
const char * ast_var_name(const struct ast_var_t *var)
Definition: chanvars.c:60
#define var
Definition: ast_expr2f.c:614
struct varshead * ast_channel_varshead(struct ast_channel *chan)
#define NULL
Definition: resample.c:96
static void varshead_dtor(void *obj)
Destructor for lists of variables.
Definition: channel.c:8003
#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:911
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
struct ast_var_t::@249 entries
#define ast_var_assign(name, value)
Definition: chanvars.h:40
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

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

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_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(), handle_clear_alarms(), handle_incoming(), iax2_key_rotate(), indicate_data_internal(), jingle_action_session_terminate(), misdn_write(), and socket_process_helper().

4392 {
4393  char causevar[256];
4394 
4395  if (ast_channel_dialed_causes_add(chan, cause_code, datalen)) {
4396  ast_log(LOG_WARNING, "Unable to store hangup cause for %s on %s\n", cause_code->chan_name, ast_channel_name(chan));
4397  }
4398 
4399  if (cause_code->emulate_sip_cause) {
4400  snprintf(causevar, sizeof(causevar), "HASH(SIP_CAUSE,%s)", cause_code->chan_name);
4401  ast_func_write(chan, causevar, cause_code->code);
4402  }
4403 }
char chan_name[AST_CHANNEL_NAME]
#define LOG_WARNING
Definition: logger.h:274
#define ast_log
Definition: astobj2.c:42
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.
const char * ast_channel_name(const struct ast_channel *chan)
int ast_func_write(struct ast_channel *chan, const char *function, const char *value)
executes a write operation on a function

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

References ari_vars, and channel_has_external_vars().

7963 {
7965 }
static struct external_vars ari_vars
Definition: channel.c:7934
static int channel_has_external_vars(struct external_vars *channelvars)
Definition: channel.c:7946

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

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

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

2524 {
2525  return ast_channel_monitor(chan)
2528 }
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition: audiohook.c:1112
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
int ast_framehook_list_contains_no_active(struct ast_framehook_list *framehooks)
Determine if a framehook list is free of active framehooks or not.
Definition: framehook.c:282
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
struct ast_channel_monitor * ast_channel_monitor(const struct ast_channel *chan)

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

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

Referenced by native_rtp_bridge_capable().

2531 {
2532  return ast_channel_monitor(chan)
2535 }
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition: audiohook.c:1112
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
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
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
struct ast_channel_monitor * ast_channel_monitor(const struct ast_channel *chan)

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

References ami_vars, and channel_has_external_vars().

Referenced by ast_channel_publish_varset().

7958 {
7960 }
static struct external_vars ami_vars
Definition: channel.c:7933
static int channel_has_external_vars(struct external_vars *channelvars)
Definition: channel.c:7946

◆ ast_channel_hash_cb()

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

Definition at line 7888 of file channel.c.

References ast_channel_name(), ast_str_case_hash(), ast_strlen_zero, name, and OBJ_KEY.

Referenced by ast_channels_init().

7889 {
7890  const char *name = (flags & OBJ_KEY) ? obj : ast_channel_name((struct ast_channel *) obj);
7891 
7892  /* If the name isn't set, return 0 so that the ao2_find() search will
7893  * start in the first bucket. */
7894  if (ast_strlen_zero(name)) {
7895  return 0;
7896  }
7897 
7898  return ast_str_case_hash(name);
7899 }
Main Channel structure associated with a channel.
#define OBJ_KEY
Definition: astobj2.h:1155
#define ast_strlen_zero(foo)
Definition: strings.h:52
static const char name[]
Definition: cdr_mysql.c:74
const char * ast_channel_name(const struct ast_channel *chan)
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:1250

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

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

6867 {
6868  struct ast_var_t *current;
6869  struct ast_var_t *newvar;
6870  const char *varname;
6871  int vartype;
6872 
6873  AST_LIST_TRAVERSE(ast_channel_varshead((struct ast_channel *) parent), current, entries) {
6874  varname = ast_var_full_name(current);
6875  if (!varname) {
6876  continue;
6877  }
6878 
6879  vartype = 0;
6880  if (varname[0] == '_') {
6881  vartype = 1;
6882  if (varname[1] == '_') {
6883  vartype = 2;
6884  }
6885  }
6886 
6887  switch (vartype) {
6888  case 1:
6889  newvar = ast_var_assign(&varname[1], ast_var_value(current));
6890  break;
6891  case 2:
6892  newvar = ast_var_assign(varname, ast_var_value(current));
6893  break;
6894  default:
6895  continue;
6896  }
6897  if (newvar) {
6898  ast_debug(1, "Inheriting variable %s from %s to %s.\n",
6899  ast_var_full_name(newvar), ast_channel_name(parent),
6900  ast_channel_name(child));
6903  ast_var_value(newvar));
6904  }
6905  }
6906 }
Main Channel structure associated with a channel.
const char * ast_var_value(const struct ast_var_t *var)
Definition: chanvars.c:80
struct varshead * ast_channel_varshead(struct ast_channel *chan)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
void ast_channel_publish_varset(struct ast_channel *chan, const char *variable, const char *value)
Publish a ast_channel_varset for a channel.
const char * ast_var_full_name(const struct ast_var_t *var)
Definition: chanvars.c:75
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
struct ast_var_t::@249 entries
#define ast_var_assign(name, value)
Definition: chanvars.h:40
const char * ast_channel_name(const struct ast_channel *chan)

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

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(), audio_audiohook_write_list(), chan_pjsip_read_stream(), chan_pjsip_set_rtp_peer(), common_exec(), console_transfer(), dtmf_audiohook_write_list(), mixmonitor_autochan_is_bridged(), set_caps(), set_timeout(), sip_set_rtp_peer(), wait_for_bridged(), and wait_for_unbridged().

10747 {
10748  return ast_channel_internal_bridge(chan) != NULL;
10749 }
struct ast_bridge * ast_channel_internal_bridge(const struct ast_channel *chan)
#define NULL
Definition: resample.c:96

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

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

Referenced by ast_indicate_data(), and bridge_channel_internal_pull().

10752 {
10753  int hangup_flags = ast_channel_softhangup_internal_flag(chan);
10754  int hangup_test = hangup_flags & AST_SOFTHANGUP_ASYNCGOTO;
10755  int unbridge = ast_channel_unbridged(chan);
10756 
10757  /* This function should only return true if either the unbridged flag or
10758  * the ASYNCGOTO soft hangup flag is set and when no other soft hangup
10759  * flags are set. Any other soft hangup flags being set should make it
10760  * return false.
10761  */
10762  return ((hangup_test || unbridge) && (hangup_test == hangup_flags));
10763 }
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
int ast_channel_unbridged(struct ast_channel *chan)
This function will check if the bridge needs to be re-evaluated due to external changes.

◆ ast_channel_iterator_all_new()

struct ast_channel_iterator* ast_channel_iterator_all_new ( void  )

Create a new channel iterator.

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

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

Definition at line 1408 of file channel.c.

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

Referenced by action_hangup(), action_status(), 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().

1409 {
1410  struct ast_channel_iterator *i;
1411 
1412  if (!(i = ast_calloc(1, sizeof(*i)))) {
1413  return NULL;
1414  }
1415 
1418 
1419  return i;
1420 }
#define NULL
Definition: resample.c:96
struct ao2_iterator simple_iterator
Definition: channel.c:1353
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct ao2_iterator * active_iterator
Definition: channel.c:1357
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.

◆ ast_channel_iterator_by_exten_new()

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

Create a new channel iterator based on extension.

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

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

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

Definition at line 1368 of file channel.c.

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

Referenced by common_exec(), and pickup_by_exten().

1369 {
1370  struct ast_channel_iterator *i;
1371  char *l_exten = (char *) exten;
1372  char *l_context = (char *) context;
1373 
1374  if (!(i = ast_calloc(1, sizeof(*i)))) {
1375  return NULL;
1376  }
1377 
1379  l_context, l_exten, OBJ_MULTIPLE);
1380  if (!i->active_iterator) {
1381  ast_free(i);
1382  return NULL;
1383  }
1384 
1385  return i;
1386 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
static int ast_channel_by_exten_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1306
#define NULL
Definition: resample.c:96
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1278
#define ast_free(a)
Definition: astmm.h:182
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct ao2_iterator * active_iterator
Definition: channel.c:1357
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_channel_iterator_by_name_new()

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

Create a new channel iterator based on name.

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

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

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

Definition at line 1388 of file channel.c.

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

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

1389 {
1390  struct ast_channel_iterator *i;
1391  char *l_name = (char *) name;
1392 
1393  if (!(i = ast_calloc(1, sizeof(*i)))) {
1394  return NULL;
1395  }
1396 
1398  l_name, &name_len,
1399  OBJ_MULTIPLE | (name_len == 0 /* match the whole word, so optimize */ ? OBJ_KEY : 0));
1400  if (!i->active_iterator) {
1401  ast_free(i);
1402  return NULL;
1403  }
1404 
1405  return i;
1406 }
#define OBJ_KEY
Definition: astobj2.h:1155
#define NULL
Definition: resample.c:96
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1278
static const char name[]
Definition: cdr_mysql.c:74
#define ast_free(a)
Definition: astmm.h:182
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
static int ast_channel_by_name_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1284
struct ao2_iterator * active_iterator
Definition: channel.c:1357

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

Returns
NULL, for convenience to clear out the pointer to the iterator that was just destroyed.
Since
1.8

Definition at line 1360 of file channel.c.

References ast_channel_iterator::active_iterator, ao2_iterator_destroy(), ast_free, and NULL.

Referenced by action_hangup(), action_status(), 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().

1361 {
1363  ast_free(i);
1364 
1365  return NULL;
1366 }
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182
struct ao2_iterator * active_iterator
Definition: channel.c:1357

◆ 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.
NULL,ifno more channels match the iterator parameters.
Since
1.8

Definition at line 1422 of file channel.c.

References ast_channel_iterator::active_iterator, and ao2_iterator_next.

Referenced by action_hangup(), action_status(), 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().

1423 {
1425 }
#define ao2_iterator_next(iter)
Definition: astobj2.h:1933
struct ao2_iterator * active_iterator
Definition: channel.c:1357

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

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

6818 {
6819  /*
6820  * Set up translation from the peer to the chan first in case we
6821  * need to hear any in-band tones and the other direction fails.
6822  */
6823  if (ast_channel_make_compatible_helper(peer, chan)) {
6824  return -1;
6825  }
6826 
6827  /* Set up translation from the chan to the peer */
6828  if (ast_channel_make_compatible_helper(chan, peer)) {
6829  return -1;
6830  }
6831 
6832  return 0;
6833 }
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:6738

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

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

6739 {
6740  struct ast_format_cap *src_cap;
6741  struct ast_format_cap *dst_cap;
6742  RAII_VAR(struct ast_format *, best_src_fmt, NULL, ao2_cleanup);
6743  RAII_VAR(struct ast_format *, best_dst_fmt, NULL, ao2_cleanup);
6744  int no_path;
6745 
6746  /*
6747  * We cannot short circuit this code because it is possible to ask
6748  * to make compatible two channels that are "compatible" because
6749  * they already have translation paths setup but together make for
6750  * a sub-optimal path. e.g., The From channel has g722 -> ulaw
6751  * and the To channel has ulaw -> g722. They are "compatible" but
6752  * together the translations are unnecessary and the audio loses
6753  * fidelity in the process.
6754  */
6755 
6756  ast_channel_lock_both(from, to);
6757 
6758  src_cap = ast_channel_nativeformats(from); /* shallow copy, do not destroy */
6759  dst_cap = ast_channel_nativeformats(to); /* shallow copy, do not destroy */
6760 
6761  /* If there's no audio in this call, don't bother with trying to find a translation path */
6764  ast_channel_unlock(to);
6765  ast_channel_unlock(from);
6766  return 0;
6767  }
6768 
6769  no_path = ast_translator_best_choice(dst_cap, src_cap, &best_dst_fmt, &best_src_fmt);
6770 
6771  ast_channel_unlock(to);
6772  ast_channel_unlock(from);
6773 
6774  if (no_path) {
6775  ast_log(LOG_WARNING, "No path to translate from %s to %s\n",
6776  ast_channel_name(from), ast_channel_name(to));
6777  return -1;
6778  }
6779 
6780  /* if the best path is not 'pass through', then
6781  * transcoding is needed; if desired, force transcode path
6782  * to use SLINEAR between channels, but only if there is
6783  * no direct conversion available. If generic PLC is
6784  * desired, then transcoding via SLINEAR is a requirement
6785  * even if the formats are the same.
6786  */
6788  || (ast_format_cmp(best_dst_fmt, best_src_fmt) == AST_FORMAT_CMP_NOT_EQUAL
6790 
6791  int use_slin = (ast_format_cache_is_slinear(best_src_fmt)
6792  || ast_format_cache_is_slinear(best_dst_fmt))
6794 
6795  if (use_slin || ast_translate_path_steps(best_dst_fmt, best_src_fmt) != 1) {
6796  int best_sample_rate = (ast_format_get_sample_rate(best_src_fmt) > ast_format_get_sample_rate(best_dst_fmt)) ?
6797  ast_format_get_sample_rate(best_src_fmt) : ast_format_get_sample_rate(best_dst_fmt);
6798 
6799  /* pick the best signed linear format based upon what preserves the sample rate the best. */
6800  ao2_replace(best_src_fmt, ast_format_cache_get_slin_by_rate(best_sample_rate));
6801  }
6802  }
6803 
6804  if (ast_set_read_format(from, best_src_fmt)) {
6805  ast_log(LOG_WARNING, "Unable to set read format on channel %s to %s\n",
6806  ast_channel_name(from), ast_format_get_name(best_src_fmt));
6807  return -1;
6808  }
6809  if (ast_set_write_format(to, best_src_fmt)) {
6810  ast_log(LOG_WARNING, "Unable to set write format on channel %s to %s\n",
6811  ast_channel_name(to), ast_format_get_name(best_src_fmt));
6812  return -1;
6813  }
6814  return 0;
6815 }
int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
Sets read format on channel chan.
Definition: channel.c:5849
#define LOG_WARNING
Definition: logger.h:274
Definition of a media format.
Definition: format.c:43
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
#define NULL
Definition: resample.c:96
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:1385
#define ast_log
Definition: astobj2.c:42
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
#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:911
#define ast_opt_generic_plc
Definition: options.h:134
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:542
#define ast_opt_transcode_via_slin
Definition: options.h:116
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
#define ast_opt_generic_plc_on_equal_codecs
Definition: options.h:136
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2952
#define ao2_replace(dst, src)
Definition: astobj2.h:517
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_channel_name(const struct ast_channel *chan)
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
unsigned int ast_translate_path_steps(struct ast_format *dest, struct ast_format *src)
Returns the number of steps required to convert from &#39;src&#39; to &#39;dest&#39;.
Definition: translate.c:1491
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890
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:615
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:520

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

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(), handle_invite_replaces(), local_call(), and refer_incoming_invite_request().

10868 {
10869  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
10871 
10872  if (dest == source) {
10873  ast_log(LOG_WARNING, "Can't move channel '%s' into itself!\n",
10874  ast_channel_name(dest));
10875  return -1;
10876  }
10877 
10878  ast_channel_lock_both(dest, source);
10879 
10882  /* Zombies! Run! */
10884  "Can't move channel. One or both is dead (%s <-- %s)\n",
10885  ast_channel_name(dest), ast_channel_name(source));
10886  ast_channel_unlock(source);
10887  ast_channel_unlock(dest);
10888  return -1;
10889  }
10890 
10891  ast_channel_masq_set(dest, source);
10892  ast_channel_masqr_set(source, dest);
10893 
10894  blob = ast_json_pack("{s: s}",
10895  "newchanneluniqueid", ast_channel_uniqueid(dest));
10897 
10898  ast_channel_unlock(dest);
10899  ast_channel_unlock(source);
10900 
10901  channel_do_masquerade(dest, source);
10902  return 0;
10903 }
static ast_mutex_t channel_move_lock
Definition: channel.c:10865
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
#define ast_test_flag(p, flag)
Definition: utils.h:63
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
#define LOG_WARNING
Definition: logger.h:274
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
void ast_channel_masq_set(struct ast_channel *chan, struct ast_channel *value)
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition: lock.h:587
#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:911
ast_mutex_t lock
Definition: app_meetme.c:1091
void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value)
const char * ast_channel_uniqueid(const struct ast_channel *chan)
static void channel_do_masquerade(struct ast_channel *original, struct ast_channel *clonechan)
Masquerade a channel.
Definition: channel.c:6952
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2952
const char * ast_channel_name(const struct ast_channel *chan)
Abstract JSON element (object, array, string, int, ...).
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct stasis_message_type * ast_channel_masquerade_type(void)
Message type for when a channel is being masqueraded.

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

Referenced by parked_user_set_parker_dial_string(), and setup_park_common_datastore().

6935 {
6936  char *dash;
6937 
6938  /* Truncate after the dash */
6939  dash = strrchr(channel_name, '-');
6940  if (dash) {
6941  *dash = '\0';
6942  }
6943 }

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

References ast_channel_lock, ast_channel_tech(), ast_channel_unlock, ast_log, 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(), rcvfax_exec(), and sndfax_exec().

7543 {
7544  int res;
7545 
7546  ast_channel_lock(chan);
7547  if (!ast_channel_tech(chan)->queryoption) {
7548  errno = ENOSYS;
7549  ast_channel_unlock(chan);
7550  return -1;
7551  }
7552 
7553  if (block)
7554  ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7555 
7556  res = ast_channel_tech(chan)->queryoption(chan, option, data, datalen);
7557  ast_channel_unlock(chan);
7558 
7559  return res;
7560 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285
int errno
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int(*const queryoption)(struct ast_channel *chan, int option, void *data, int *datalen)
Query a given option. Called with chan locked.
Definition: channel.h:781
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

Definition at line 9202 of file channel.c.

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

Referenced by after_bridge_move_channel(), ast_do_pickup(), handle_request_invite(), handle_request_update(), handle_response_invite(), misdn_queue_connected_line_update(), onAlerting(), onCallEstablished(), onProgress(), queue_connected_line_update(), sip_call(), and update_initial_connected_line().

9203 {
9204  unsigned char data[1024]; /* This should be large enough */
9205  size_t datalen;
9206 
9207  datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9208  if (datalen == (size_t) -1) {
9209  return;
9210  }
9211 
9212  ast_queue_control_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
9213 }
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:8793
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
Definition: channel.c:1238

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

Definition at line 10392 of file channel.c.

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

Referenced by cb_events(), handle_response_invite(), misdn_facility_ie_handler(), and set_redirecting().

10393 {
10394  unsigned char data[1024]; /* This should be large enough */
10395  size_t datalen;
10396 
10397  datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10398  if (datalen == (size_t) -1) {
10399  return;
10400  }
10401 
10402  ast_queue_control_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10403 }
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:9363
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
Definition: channel.c:1238

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

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

Referenced by attempt_thread().

5914 {
5915  switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
5916  {
5917  case 0:
5918  return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
5919  case AST_CONTROL_HANGUP:
5920  return "Hangup";
5921  case AST_CONTROL_RING:
5922  return "Local Ring";
5923  case AST_CONTROL_RINGING:
5924  return "Remote end Ringing";
5925  case AST_CONTROL_ANSWER:
5926  return "Remote end has Answered";
5927  case AST_CONTROL_BUSY:
5928  return "Remote end is Busy";
5930  return "Congestion (circuits busy)";
5931  default:
5932  return "Unknown Reason!!";
5933  }
5934 }

◆ ast_channel_redirecting_macro()

int ast_channel_redirecting_macro ( struct ast_channel autoservice_chan,
struct ast_channel macro_chan,
const void *  redirecting_info,
int  is_caller,
int  is_frame 
)

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

Since
1.8
Deprecated:
You should use the ast_channel_redirecting_sub() function instead.

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

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

Have multiple return codes based on the MACRO_RESULT

Make constants so that caller and frame can be more expressive than just '1' and '0'

Definition at line 10487 of file channel.c.

References ast_app_run_macro(), ast_channel_lock, ast_channel_redirecting(), ast_channel_unlock, ast_channel_update_redirecting(), ast_log, 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, LOG_WARNING, NULL, pbx_builtin_getvar_helper(), ast_frame::ptr, retval, and S_OR.

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

10488 {
10489  static int deprecation_warning = 0;
10490  const char *macro;
10491  const char *macro_args;
10492  int retval;
10493 
10494  ast_channel_lock(macro_chan);
10495  macro = pbx_builtin_getvar_helper(macro_chan, is_caller
10496  ? "REDIRECTING_CALLER_SEND_MACRO" : "REDIRECTING_CALLEE_SEND_MACRO");
10497  macro = ast_strdupa(S_OR(macro, ""));
10498  macro_args = pbx_builtin_getvar_helper(macro_chan, is_caller
10499  ? "REDIRECTING_CALLER_SEND_MACRO_ARGS" : "REDIRECTING_CALLEE_SEND_MACRO_ARGS");
10500  macro_args = ast_strdupa(S_OR(macro_args, ""));
10501 
10502  if (ast_strlen_zero(macro)) {
10503  ast_channel_unlock(macro_chan);
10504  return -1;
10505  }
10506 
10507  if (!deprecation_warning) {
10508  deprecation_warning = 1;
10509  ast_log(LOG_WARNING, "Usage of REDIRECTING_CALLE[ER]_SEND_MACRO is deprecated. Please use REDIRECTING_SEND_SUB instead.\n");
10510  }
10511  if (is_frame) {
10512  const struct ast_frame *frame = redirecting_info;
10513 
10514  ast_redirecting_parse_data(frame->data.ptr, frame->datalen, ast_channel_redirecting(macro_chan));
10515  } else {
10516  const struct ast_party_redirecting *redirecting = redirecting_info;
10517 
10518  ast_party_redirecting_copy(ast_channel_redirecting(macro_chan), redirecting);
10519  }
10520  ast_channel_unlock(macro_chan);
10521 
10523  retval = ast_app_run_macro(autoservice_chan, macro_chan, macro, macro_args);
10525  if (!retval) {
10526  struct ast_party_redirecting saved_redirecting;
10527 
10528  ast_party_redirecting_init(&saved_redirecting);
10529  ast_channel_lock(macro_chan);
10530  ast_party_redirecting_copy(&saved_redirecting, ast_channel_redirecting(macro_chan));
10531  ast_channel_unlock(macro_chan);
10532  ast_channel_update_redirecting(macro_chan, &saved_redirecting, NULL);
10533  ast_party_redirecting_free(&saved_redirecting);
10534  }
10535 
10536  return retval;
10537 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
int ast_app_run_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const char *macro_name, const char *macro_args)
Run a macro on a channel, placing an optional second channel into autoservice.
Definition: main/app.c:320
#define LOG_WARNING
Definition: logger.h:274
static void channel_set_intercept_mode(int in_intercept_mode)
Definition: channel.c:10419
#define NULL
Definition: resample.c:96
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
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:9574
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2179
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition: channel.c:2122
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition: channel.h:523
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition: channel.c:2135
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:10379
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
static ENTRY retval
Definition: hsearch.c:50
Data structure associated with a single frame of data.
union ast_frame::@263 data

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

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

10585 {
10586  const char *sub;
10587  const char *sub_args;
10588  int retval;
10589 
10590  ast_channel_lock(sub_chan);
10591  sub = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB");
10592  sub = ast_strdupa(S_OR(sub, ""));
10593  sub_args = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB_ARGS");
10594  sub_args = ast_strdupa(S_OR(sub_args, ""));
10595 
10596  if (ast_strlen_zero(sub)) {
10597  ast_channel_unlock(sub_chan);
10598  return -1;
10599  }
10600 
10601  if (is_frame) {
10602  const struct ast_frame *frame = redirecting_info;
10603 
10605  } else {
10606  const struct ast_party_redirecting *redirecting = redirecting_info;
10607 
10608  ast_party_redirecting_copy(ast_channel_redirecting(sub_chan), redirecting);
10609  }
10610  ast_channel_unlock(sub_chan);
10611 
10613  retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10615  if (!retval) {
10616  struct ast_party_redirecting saved_redirecting;
10617 
10618  ast_party_redirecting_init(&saved_redirecting);
10619  ast_channel_lock(sub_chan);
10620  ast_party_redirecting_copy(&saved_redirecting, ast_channel_redirecting(sub_chan));
10621  ast_channel_unlock(sub_chan);
10622  ast_channel_update_redirecting(sub_chan, &saved_redirecting, NULL);
10623  ast_party_redirecting_free(&saved_redirecting);
10624  }
10625 
10626  return retval;
10627 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
static void channel_set_intercept_mode(int in_intercept_mode)
Definition: channel.c:10419
#define NULL
Definition: resample.c:96
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
#define ast_strlen_zero(foo)
Definition: strings.h:52
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:9574
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2179
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition: channel.c:2122
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition: channel.h:523
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:401
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition: channel.c:2135
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:10379
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
static ENTRY retval
Definition: hsearch.c:50
struct stasis_forward * sub
Definition: res_corosync.c:240
Data structure associated with a single frame of data.
union ast_frame::@263 data

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

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

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

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(1, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
561 
562  ast_verb(2, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
563 
565 
566  return 0;
567 }
const char *const type
Definition: channel.h:630
const char * tech
Definition: app_dial.c:802
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
struct chanlist::@369 list
#define LOG_WARNING
Definition: logger.h:274
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_verb(level,...)
Definition: logger.h:463
the list of registered channel types
Definition: channel.c:121
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:717
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
struct ast_channel * chan
Definition: app_dial.c:798
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
List of channel drivers.
Definition: app_dial.c:796
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204

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

Returns
NULL, convenient for clearing invalid pointers
Note
Absolutely NO channel locks should be held before calling this function.
Since
1.8

Definition at line 1584 of file channel.c.

References ao2_unlink, and ast_channel_unref.

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

1585 {
1586  /* Safe, even if already unlinked. */
1587  ao2_unlink(channels, chan);
1588  return ast_channel_unref(chan);
1589 }
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2981
#define ao2_unlink(container, obj)
Definition: astobj2.h:1598
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124

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

Definition at line 6526 of file channel.c.

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

6527 {
6528  channel_req_accountcodes(chan, requestor, relationship, 0);
6529 }
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:6468

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

Definition at line 6531 of file channel.c.

References channel_req_accountcodes().

Referenced by ring_entry().

6532 {
6533  channel_req_accountcodes(chan, requestor, relationship, 1);
6534 }
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:6468

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

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

11169 {
11170  int res;
11171 
11172  ast_assert(chan != NULL);
11173  ast_assert(topology != NULL);
11174 
11175  ast_channel_lock(chan);
11176  if (!ast_channel_is_multistream(chan) || !ast_channel_tech(chan)->indicate) {
11177  ast_channel_unlock(chan);
11178  return -1;
11179  }
11180 
11182  ast_debug(2, "%s: Topologies already match. Current: %s Requested: %s\n",
11183  ast_channel_name(chan),
11185  ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
11186  ast_channel_unlock(chan);
11187  return 0;
11188  }
11189 
11191 
11192  res = ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, topology, sizeof(topology));
11193  ast_channel_unlock(chan);
11194  return res;
11195 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
static int indicate(void *data)
Definition: chan_pjsip.c:1333
int ast_channel_is_multistream(struct ast_channel *chan)
Determine if a channel is multi-stream capable.
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_internal_set_stream_topology_change_source(struct ast_channel *chan, void *change_source)
#define ast_assert(a)
Definition: utils.h:695
#define NULL
Definition: resample.c:96
#define ast_str_tmp(init_len, __expr)
Definition: strings.h:1136
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
const char * ast_stream_topology_to_str(const struct ast_stream_topology *topology, struct ast_str **buf)
Get a string representing the topology for debugging/display purposes.
Definition: stream.c:936
int ast_stream_topology_equal(const struct ast_stream_topology *left, const struct ast_stream_topology *right)
Compare two stream topologies to see if they are equal.
Definition: stream.c:696
#define ast_channel_unlock(chan)
Definition: channel.h:2946
const char * ast_channel_name(const struct ast_channel *chan)
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:772
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

References ast_channel_tech(), and ast_channel_tech::send_html.

Referenced by ast_channel_sendurl(), and wait_for_answer().

6726 {
6727  if (ast_channel_tech(chan)->send_html)
6728  return ast_channel_tech(chan)->send_html(chan, subclass, data, datalen);
6729  return -1;
6730 }
int(*const send_html)(struct ast_channel *chan, int subclass, const char *data, int len)
Send HTML data.
Definition: channel.h:763
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

References ast_channel_sendhtml(), and AST_HTML_URL.

Referenced by dial_exec_full(), sendurl_exec(), and try_calling().

6733 {
6734  return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
6735 }
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:6725
#define AST_HTML_URL
static char url[512]

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

References ari_vars, and channel_set_external_vars().

Referenced by channelvars_handler().

7995 {
7996  channel_set_external_vars(&ari_vars, varc, vars);
7997 }
static struct external_vars ari_vars
Definition: channel.c:7934
static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
Definition: channel.c:7967

◆ 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.
Returns
Nothing
Note
The channel does not need to be locked before calling this function.

Definition at line 7459 of file channel.c.

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

Referenced by create_alice_channel().

7460 {
7461  if (ast_channel_caller(chan) == caller) {
7462  /* Don't set to self */
7463  return;
7464  }
7465 
7466  ast_channel_lock(chan);
7467  ast_party_caller_set(ast_channel_caller(chan), caller, update);
7469  ast_channel_unlock(chan);
7470 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2945
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
Set the caller information based on another caller source.
Definition: channel.c:2007
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.
#define ast_channel_unlock(chan)
Definition: channel.h:2946

◆ 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.
Returns
Nothing
Note
The channel does not need to be locked before calling this function.

Definition at line 7472 of file channel.c.

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

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

7473 {
7474  if (ast_channel_caller(chan) == caller) {
7475  /* Don't set to self */
7476  return;
7477  }
7478 
7479  ast_channel_lock(chan);
7480  ast_party_caller_set(ast_channel_caller(chan), caller, update);
7483  ast_channel_unlock(chan);
7484 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2945
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
Set the caller information based on another caller source.
Definition: channel.c:2007
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.
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.

◆ 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.
Returns
Nothing
Note
The channel does not need to be locked before calling this function.

Definition at line 8404 of file channel.c.

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

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

8405 {
8406  if (ast_channel_connected(chan) == connected) {
8407  /* Don't set to self */
8408  return;
8409  }
8410 
8411  ast_channel_lock(chan);
8412  ast_party_connected_line_set(ast_channel_connected(chan), connected, update);
8415  ast_channel_unlock(chan);
8416 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
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.
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
void ast_party_connected_line_set(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src, const struct ast_set_party_connected_line *update)
Set the connected line information based on another connected line source.
Definition: channel.c:2054
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.

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

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

11229 {
11230  ast_channel_lock(chan);
11232  ast_channel_unlock(chan);
11233 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_set_flag(p, flag)
Definition: utils.h:70
long int flag
Definition: f2c.h:83
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

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

References ami_vars, and channel_set_external_vars().

Referenced by load_channelvars().

7990 {
7991  channel_set_external_vars(&ami_vars, varc, vars);
7992 }
static struct external_vars ami_vars
Definition: channel.c:7933
static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
Definition: channel.c:7967

◆ 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.
Returns
Nothing
Note
The channel does not need to be locked before calling this function.

Definition at line 9215 of file channel.c.

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

Referenced by handle_request_invite(), handle_response(), indicate_redirecting(), misdn_copy_redirecting_to_ast(), redirecting_write(), and set_redirecting().

9216 {
9217  if (ast_channel_redirecting(chan) == redirecting) {
9218  /* Don't set to self */
9219  return;
9220  }
9221 
9222  ast_channel_lock(chan);
9223  ast_party_redirecting_set(ast_channel_redirecting(chan), redirecting, update);
9225  ast_channel_unlock(chan);
9226 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
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.
void ast_party_redirecting_set(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src, const struct ast_set_party_redirecting *update)
Set the redirecting information based on another redirecting source.
Definition: channel.c:2166
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)

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

References ast_channel_lock, ast_channel_tech(), ast_channel_unlock, ast_log, 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(), rcvfax_exec(), reset_volumes(), set_format(), set_listen_volume(), set_security_requirements(), set_talk_volume(), sndfax_exec(), try_calling(), and vm_forwardoptions().

7523 {
7524  int res;
7525 
7526  ast_channel_lock(chan);
7527  if (!ast_channel_tech(chan)->setoption) {
7528  errno = ENOSYS;
7529  ast_channel_unlock(chan);
7530  return -1;
7531  }
7532 
7533  if (block)
7534  ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7535 
7536  res = ast_channel_tech(chan)->setoption(chan, option, data, datalen);
7537  ast_channel_unlock(chan);
7538 
7539  return res;
7540 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
int(*const setoption)(struct ast_channel *chan, int option, void *data, int datalen)
Set a given option. Called with chan locked.
Definition: channel.h:778
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285
int errno
#define ast_channel_unlock(chan)
Definition: channel.h:2946
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

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

511 {
512  if (ast_tvzero(offset)) {
513  ast_channel_whentohangup_set(chan, &offset);
514  } else {
515  struct timeval tv = ast_tvadd(offset, ast_tvnow());
516  ast_channel_whentohangup_set(chan, &tv);
517  }
519  return;
520 }
void ast_channel_whentohangup_set(struct ast_channel *chan, struct timeval *value)
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition: extconf.c:2283
struct ast_frame ast_null_frame
Definition: main/frame.c:79

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

References ast_softhangup(), AST_SOFTHANGUP_SHUTDOWN, and chanlist::chan.

Referenced by ast_softhangup_all().

485 {
486  struct ast_channel *chan = obj;
487 
489 
490  return 0;
491 }
Main Channel structure associated with a channel.
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup a channel, lock.
Definition: channel.c:2476

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

Definition at line 468 of file channel.c.

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

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 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
Softly hangup a channel, don&#39;t lock.
Definition: channel.c:2463
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_channel_hangupcause(const struct ast_channel *chan)
const char * ast_channel_name(const struct ast_channel *chan)

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

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, ast_silence_generator::old_write_format, and state.

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

8267 {
8268  struct ast_silence_generator *state;
8269 
8270  if (!(state = ast_calloc(1, sizeof(*state)))) {
8271  return NULL;
8272  }
8273 
8275 
8276  if (ast_set_write_format(chan, ast_format_slin) < 0) {
8277  ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
8278  ast_free(state);
8279  return NULL;
8280  }
8281 
8283 
8284  ast_debug(1, "Started silence generator on '%s'\n", ast_channel_name(chan));
8285 
8286  return state;
8287 }
enum sip_cc_notify_state state
Definition: chan_sip.c:959
#define NULL
Definition: resample.c:96
#define ao2_bump(obj)
Definition: astobj2.h:491
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
static struct ast_generator silence_generator
Definition: channel.c:8256
#define LOG_ERROR
Definition: logger.h:285
#define ast_free(a)
Definition: astmm.h:182
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_format * old_write_format
Definition: channel.c:8263
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition: channel.c:2960

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

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

Definition at line 8312 of file channel.c.

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

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

8313 {
8314  if (!state) {
8315  return;
8316  }
8317 
8318  if (deactivate_silence_generator(chan)) {
8319  ast_debug(1, "Stopped silence generator on '%s'\n", ast_channel_name(chan));
8320  if (ast_set_write_format(chan, state->old_write_format) < 0) {
8321  ast_log(LOG_ERROR, "Could not return write format to its original state\n");
8322  }
8323  }
8324  ao2_cleanup(state->old_write_format);
8325  ast_free(state);
8326 }
static int deactivate_silence_generator(struct ast_channel *chan)
Definition: channel.c:8289
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285
#define ast_free(a)
Definition: astmm.h:182
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_format * old_write_format
Definition: channel.c:8263
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890

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

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

Referenced by __ast_read(), and AST_TEST_DEFINE().

11198 {
11199  ast_assert(chan != NULL);
11200  ast_assert(topology != NULL);
11201 
11202  if (!ast_channel_is_multistream(chan) || !ast_channel_tech(chan)->indicate) {
11203  return -1;
11204  }
11205 
11206  return ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, topology, sizeof(topology));
11207 }
static int indicate(void *data)
Definition: chan_pjsip.c:1333
int ast_channel_is_multistream(struct ast_channel *chan)
Determine if a channel is multi-stream capable.
#define ast_assert(a)
Definition: utils.h:695
#define NULL
Definition: resample.c:96
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:772
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

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

11210 {
11211  int res;
11212  struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_STREAM_TOPOLOGY_CHANGED };
11213 
11214  ast_assert(chan != NULL);
11215 
11216  if (!ast_channel_is_multistream(chan)) {
11217  return -1;
11218  }
11219 
11220  ast_channel_lock(chan);
11222  res = ast_queue_frame(chan, &f);
11223  ast_channel_unlock(chan);
11224 
11225  return res;
11226 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
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)
#define ast_assert(a)
Definition: utils.h:695
#define NULL
Definition: resample.c:96
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
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:222
#define ast_channel_unlock(chan)
Definition: channel.h:2946
Data structure associated with a single frame of data.

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

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

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

4406 {
4407  if (!strcasecmp(flag, "default"))
4408  return DEFAULT_AMA_FLAGS;
4409  if (!strcasecmp(flag, "omit"))
4410  return AST_AMA_OMIT;
4411  if (!strcasecmp(flag, "billing"))
4412  return AST_AMA_BILLING;
4413  if (!strcasecmp(flag, "documentation"))
4414  return AST_AMA_DOCUMENTATION;
4415  return AST_AMA_NONE;
4416 }
#define DEFAULT_AMA_FLAGS
Definition: channel.c:108
long int flag
Definition: f2c.h:83

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

References ast_channel_tech().

Referenced by dial_exec_full(), sendurl_exec(), and try_calling().

6721 {
6722  return (ast_channel_tech(chan)->send_html) ? 1 : 0;
6723 }
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

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

10979 {
10980  struct suppress_data *suppress;
10981  const struct ast_datastore_info *datastore_info = NULL;
10982  struct ast_datastore *datastore = NULL;
10983  struct ast_framehook_interface interface = {
10985  .event_cb = suppress_framehook_event_cb,
10986  .destroy_cb = suppress_framehook_destroy_cb,
10987  .chan_fixup_cb = suppress_framehook_fixup_cb,
10988  };
10989  int framehook_id;
10990 
10991  if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10992  ast_log(LOG_WARNING, "Attempted to suppress an unsupported frame type (%u).\n", frametype);
10993  return -1;
10994  }
10995 
10996  if ((datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10997  suppress = datastore->data;
10998  suppress->direction |= direction;
10999  return 0;
11000  }
11001 
11002  if (!(suppress = ao2_alloc(sizeof(*suppress), NULL))) {
11003  ast_log(LOG_WARNING, "Failed to allocate data while attempting to suppress a stream.\n");
11004  return -1;
11005  }
11006 
11007  suppress->frametype = frametype;
11008  suppress->direction |= direction;
11009 
11010  interface.data = suppress;
11011 
11012  framehook_id = ast_framehook_attach(chan, &interface);
11013  if (framehook_id < 0) {
11014  /* Hook attach failed. Get rid of the evidence. */
11015  ast_log(LOG_WARNING, "Failed to attach framehook while attempting to suppress a stream.\n");
11016  ao2_ref(suppress, -1);
11017  return -1;
11018  }
11019 
11020  /* One ref for the framehook */
11021  ao2_ref(suppress, +1);
11022 
11023  suppress->framehook_id = framehook_id;
11024 
11025  if (!(datastore = ast_datastore_alloc(datastore_info, NULL))) {
11026  ast_log(LOG_WARNING, "Failed to allocate datastore while attempting to suppress a stream.\n");
11027  ast_framehook_detach(chan, framehook_id);
11028  ao2_ref(suppress, -1);
11029  return -1;
11030  }
11031 
11032  /* the ref provided by the allocation is taken by the datastore */
11033  datastore->data = suppress;
11034 
11035  ast_channel_datastore_add(chan, datastore);
11036 
11037  return 0;
11038 }
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:2404
static void suppress_framehook_destroy_cb(void *data)
Definition: channel.c:10915
#define LOG_WARNING
Definition: logger.h:274
int ast_framehook_detach(struct ast_channel *chan, int framehook_id)
Detach an framehook from a channel.
Definition: framehook.c:177
Structure for a data store type.
Definition: datastore.h:31
static const struct ast_datastore_info * suppress_get_datastore_information(enum ast_frame_type frametype)
Definition: channel.c:10968
enum ast_frame_type frametype
Definition: channel.c:10921
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
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
static void suppress_framehook_fixup_cb(void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
Definition: channel.c:10926
#define ast_log
Definition: astobj2.c:42
#define ao2_ref(o, delta)
Definition: astobj2.h:464
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:10933
#define AST_FRAMEHOOK_INTERFACE_VERSION
Definition: framehook.h:227
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411
int framehook_id
Definition: channel.c:10923
void * data
Definition: datastore.h:70
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2390
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89
unsigned int direction
Definition: channel.c:10922
direction

◆ ast_channel_undefer_dtmf()

void ast_channel_undefer_dtmf ( struct ast_channel chan)

Unset defer DTMF flag on channel.

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

Definition at line 1271 of file channel.c.

References ast_channel_clear_flag(), and AST_FLAG_DEFER_DTMF.

Referenced by __adsi_transmit_messages(), and find_cache().

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

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

References ao2_unlink.

Referenced by create_msg_q_chan().

10731 {
10732  ao2_unlink(channels, chan);
10733 }
#define ao2_unlink(container, obj)
Definition: astobj2.h:1598
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124

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

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::type.

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

571 {
572  struct chanlist *chan;
573 
574  ast_debug(1, "Unregistering channel type '%s'\n", tech->type);
575 
577 
579  if (chan->tech == tech) {
581  ast_free(chan);
582  ast_verb(2, "Unregistered channel type '%s'\n", tech->type);
583  break;
584  }
585  }
587 
589 }
const char *const type
Definition: channel.h:630
const char * tech
Definition: app_dial.c:802
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
struct chanlist::@369 list
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
#define ast_verb(level,...)
Definition: logger.h:463
the list of registered channel types
Definition: channel.c:121
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
struct ast_channel * chan
Definition: app_dial.c:798
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
List of channel drivers.
Definition: app_dial.c:796
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:544
#define ast_free(a)
Definition: astmm.h:182

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

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, LOG_WARNING, NULL, and suppress_get_datastore_information().

Referenced by app_control_unmute(), and mute_channel().

11041 {
11042  const struct ast_datastore_info *datastore_info = NULL;
11043  struct ast_datastore *datastore = NULL;
11044  struct suppress_data *suppress;
11045 
11046  if (!(datastore_info = suppress_get_datastore_information(frametype))) {
11047  ast_log(LOG_WARNING, "Attempted to unsuppress an unsupported frame type (%u).\n", frametype);
11048  return -1;
11049  }
11050 
11051  if (!(datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
11052  /* Nothing to do! */
11053  return 0;
11054  }
11055 
11056  suppress = datastore->data;
11057 
11058  suppress->direction &= ~(direction);
11059 
11060  if (suppress->direction == 0) {
11061  /* Nothing left to suppress. Bye! */
11062  ast_framehook_detach(chan, suppress->framehook_id);
11063  ast_channel_datastore_remove(chan, datastore);
11064  ast_datastore_free(datastore);
11065  }
11066 
11067  return 0;
11068 }
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:2404
#define LOG_WARNING
Definition: logger.h:274
int ast_framehook_detach(struct ast_channel *chan, int framehook_id)
Detach an framehook from a channel.
Definition: framehook.c:177
Structure for a data store type.
Definition: datastore.h:31
static const struct ast_datastore_info * suppress_get_datastore_information(enum ast_frame_type frametype)
Definition: channel.c:10968
enum ast_frame_type frametype
Definition: channel.c:10921
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition: channel.c:2399
#define ast_log
Definition: astobj2.c:42
int framehook_id
Definition: channel.c:10923
void * data
Definition: datastore.h:70
unsigned int direction
Definition: channel.c:10922
direction

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

Definition at line 9189 of file channel.c.

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

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

9190 {
9191  unsigned char data[1024]; /* This should be large enough */
9192  size_t datalen;
9193 
9194  datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9195  if (datalen == (size_t) -1) {
9196  return;
9197  }
9198 
9199  ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
9200 }
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:4698
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:8793

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

Definition at line 10379 of file channel.c.

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

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

10380 {
10381  unsigned char data[1024]; /* This should be large enough */
10382  size_t datalen;
10383 
10384  datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10385  if (datalen == (size_t) -1) {
10386  return;
10387  }
10388 
10389  ast_indicate_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10390 }
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:4698
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:9363

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

References accountcode, 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, context, exten, name, ast_channel::name, NULL, and priority.

Referenced by ast_async_goto(), and ast_bridge_add_channel().

10795 {
10796  struct ast_channel *yanked_chan;
10797  struct {
10798  char *accountcode;
10799  char *exten;
10800  char *context;
10801  char *name;
10802  int amaflags;
10803  int priority;
10804  struct ast_format *readformat;
10805  struct ast_format *writeformat;
10806  } my_vars = { 0, };
10807 
10808  ast_channel_lock(yankee);
10809  my_vars.accountcode = ast_strdupa(ast_channel_accountcode(yankee));
10810  my_vars.exten = ast_strdupa(ast_channel_exten(yankee));
10811  my_vars.context = ast_strdupa(ast_channel_context(yankee));
10812  my_vars.name = ast_strdupa(ast_channel_name(yankee));
10813  my_vars.amaflags = ast_channel_amaflags(yankee);
10814  my_vars.priority = ast_channel_priority(yankee);
10815  /* The priority as returned by ast_channel_yank is where the channel
10816  * should go if the dialplan is executed on it. If the channel is
10817  * already executing dialplan then the priority currently set is
10818  * where it is currently. We increment it so it becomes where it should
10819  * execute.
10820  */
10822  my_vars.priority++;
10823  }
10824  my_vars.writeformat = ao2_bump(ast_channel_writeformat(yankee));
10825  my_vars.readformat = ao2_bump(ast_channel_readformat(yankee));
10826  ast_channel_unlock(yankee);
10827 
10828  /* Do not hold any channel locks while calling channel_alloc() since the function
10829  * locks the channel container when linking the new channel in. */
10830  if (!(yanked_chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, my_vars.accountcode,
10831  my_vars.exten, my_vars.context, NULL, yankee, my_vars.amaflags,
10832  "Surrogate/%s", my_vars.name))) {
10833  ao2_cleanup(my_vars.writeformat);
10834  ao2_cleanup(my_vars.readformat);
10835  return NULL;
10836  }
10837 
10838  /* Make formats okay */
10839  ast_channel_set_readformat(yanked_chan, my_vars.readformat);
10840  ast_channel_set_writeformat(yanked_chan, my_vars.writeformat);
10841  ao2_cleanup(my_vars.readformat);
10842  ao2_cleanup(my_vars.writeformat);
10843  ast_channel_priority_set(yanked_chan, my_vars.priority);
10844 
10845  ast_channel_unlock(yanked_chan);
10846 
10847  if (ast_channel_move(yanked_chan, yankee)) {
10848  ast_hangup(yanked_chan);
10849  return NULL;
10850  }
10851 
10852  return yanked_chan;
10853 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:118
Main Channel structure associated with a channel.
static int amaflags
Definition: chan_iax2.c:431
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
#define ast_test_flag(p, flag)
Definition: utils.h:63
Definition of a media format.
Definition: format.c:43
#define NULL
Definition: resample.c:96
static int priority
int ast_channel_priority(const struct ast_channel *chan)
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
#define ao2_bump(obj)
Definition: astobj2.h:491
const char * ast_channel_accountcode(const struct ast_channel *chan)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
const char * ast_channel_exten(const struct ast_channel *chan)
const ast_string_field name
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_channel_name(const struct ast_channel *chan)
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition: channel.c:2548
const ast_string_field accountcode
const char * ast_channel_context(const struct ast_channel *chan)
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
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:10867
void ast_channel_priority_set(struct ast_channel *chan, int value)
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
Definition: channel.h:1259
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
enum ama_flags ast_channel_amaflags(const struct ast_channel *chan)

◆ ast_channels_init()

int ast_channels_init ( void  )

Provided by channel.c

Definition at line 8109 of file channel.c.

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_shutdown(), NULL, and prnt_channel_key().

Referenced by asterisk_daemon().

8110 {
8113  if (!channels) {
8114  return -1;
8115  }
8117 
8119 
8121 
8123 
8125 
8128 
8129  return 0;
8130 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define AST_NUM_CHANNEL_BUCKETS
Definition: channel.h:156
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
static struct external_vars ami_vars
Definition: channel.c:7933
#define AST_RWLIST_HEAD_INIT(head)
Initializes an rwlist head structure.
Definition: linkedlists.h:638
#define NULL
Definition: resample.c:96
static int ast_channel_hash_cb(const void *obj, const int flags)
Definition: channel.c:7888
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:702
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.
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
static int ast_channel_cmp_cb(void *obj, void *arg, int flags)
Definition: channel.c:1428
static struct external_vars ari_vars
Definition: channel.c:7934
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Definition: astobj2.h:1310
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
static void channels_shutdown(void)
Definition: channel.c:8095
int ast_stasis_channels_init(void)
Initialize the stasis channel topic and message types.
int ast_channel_register(const struct ast_channel_tech *tech)
Register a new telephony channel in Asterisk.
Definition: channel.c:539
static void prnt_channel_key(void *v_obj, void *where, ao2_prnt_fn *prnt)
Definition: channel.c:7912
static struct ast_cli_entry cli_channel[]
Definition: channel.c:390

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

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_variable_new, chanlist::list, NULL, chanlist::tech, and var.

Referenced by ast_var_channel_types(), and ast_var_channel_types_table().

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 }
const char * tech
Definition: app_dial.c:802
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Structure for variables, used for configurations and for channel variables.
#define var
Definition: ast_expr2f.c:614
#define NULL
Definition: resample.c:96
the list of registered channel types
Definition: channel.c:121
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
List of channel drivers.
Definition: app_dial.c:796
#define ast_variable_new(name, value, filename)

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

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(), _macro_exec(), 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(), destroy_all_channels(), dial_exec_full(), directory_exec(), dundi_lookup_internal(), eagi_exec(), eivr_comm(), fax_gateway_framehook(), findmeexec(), func_channel_read(), gosub_run(), handle_sendimage(), iax2_key_rotate(), join_conference_bridge(), launch_asyncagi(), lua_check_hangup(), ospfinished_exec(), pbx_builtin_incomplete(), pbx_builtin_waitexten(), playback_exec(), read_exec(), readexten_exec(), run_agi(), run_ras(), stasis_app_exec(), transfer_target_framehook_cb(), try_calling(), and wait_for_answer().

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 }
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
struct timeval * ast_channel_whentohangup(struct ast_channel *chan)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_test_suite_event_notify(s, f,...)
Definition: test.h:196
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)

◆ ast_check_hangup_locked()

int ast_check_hangup_locked ( struct ast_channel chan)

Definition at line 459 of file channel.c.

References ast_channel_lock, ast_channel_unlock, and ast_check_hangup().

Referenced by action_redirect(), agent_run(), ast_app_exec_macro(), ast_app_exec_sub(), ast_bridge_channel_feature_digit(), bridge_channel_handle_action(), bridge_reconfigured_connected_line_update(), bridge_stasis_run_cb(), bridgewait_exec(), dial_exec_full(), launch_asyncagi(), pbx_builtin_saynumber(), stasis_app_exec(), and wait_for_answer().

460 {
461  int res;
462  ast_channel_lock(chan);
463  res = ast_check_hangup(chan);
464  ast_channel_unlock(chan);
465  return res;
466 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
#define ast_channel_unlock(chan)
Definition: channel.h:2946

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

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, ast_party_connected_line::id, ast_set_party_connected_line::id, LOG_WARNING, ast_party_id_ies::name, NULL, party_id_build_data(), ast_party_connected_line::priv, ast_set_party_connected_line::priv, ast_party_connected_line::source, ast_party_name_ies::str, 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().

8794 {
8795  int32_t value;
8796  size_t pos = 0;
8797  int res;
8798 
8799  static const struct ast_party_id_ies ies = {
8801  .name.char_set = AST_CONNECTED_LINE_NAME_CHAR_SET,
8802  .name.presentation = AST_CONNECTED_LINE_NAME_PRESENTATION,
8803  .name.valid = AST_CONNECTED_LINE_NAME_VALID,
8804 
8805  .number.str = AST_CONNECTED_LINE_NUMBER,
8806  .number.plan = AST_CONNECTED_LINE_NUMBER_PLAN,
8807  .number.presentation = AST_CONNECTED_LINE_NUMBER_PRESENTATION,
8808  .number.valid = AST_CONNECTED_LINE_NUMBER_VALID,
8809 
8810  .subaddress.str = AST_CONNECTED_LINE_SUBADDRESS,
8811  .subaddress.type = AST_CONNECTED_LINE_SUBADDRESS_TYPE,
8812  .subaddress.odd_even_indicator = AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN,
8813  .subaddress.valid = AST_CONNECTED_LINE_SUBADDRESS_VALID,
8814 
8815  .tag = AST_CONNECTED_LINE_TAG,
8816  .combined_presentation = AST_CONNECTED_LINE_ID_PRESENTATION,
8817  };
8818 
8819  static const struct ast_party_id_ies priv_ies = {
8821  .name.char_set = AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET,
8822  .name.presentation = AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION,
8823  .name.valid = AST_CONNECTED_LINE_PRIV_NAME_VALID,
8824 
8825  .number.str = AST_CONNECTED_LINE_PRIV_NUMBER,
8826  .number.plan = AST_CONNECTED_LINE_PRIV_NUMBER_PLAN,
8827  .number.presentation = AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION,
8828  .number.valid = AST_CONNECTED_LINE_PRIV_NUMBER_VALID,
8829 
8830  .subaddress.str = AST_CONNECTED_LINE_PRIV_SUBADDRESS,
8831  .subaddress.type = AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE,
8832  .subaddress.odd_even_indicator = AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN,
8833  .subaddress.valid = AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID,
8834 
8836  .combined_presentation = 0,/* Not sent. */
8837  };
8838 
8839  /*
8840  * The size of integer values must be fixed in case the frame is
8841  * shipped to another machine.
8842  */
8843 
8844  /* Connected line frame version */
8845  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8846  ast_log(LOG_WARNING, "No space left for connected line frame version\n");
8847  return -1;
8848  }
8849  data[pos++] = AST_CONNECTED_LINE_VERSION;
8850  data[pos++] = 1;
8851  data[pos++] = 2;/* Version 1 did not have a version ie */
8852 
8853  res = party_id_build_data(data + pos, datalen - pos, &connected->id,
8854  "connected line", &ies, update ? &update->id : NULL);
8855  if (res < 0) {
8856  return -1;
8857  }
8858  pos += res;
8859 
8860  res = party_id_build_data(data + pos, datalen - pos, &connected->priv,
8861  "connected line priv", &priv_ies, update ? &update->priv : NULL);
8862  if (res < 0) {
8863  return -1;
8864  }
8865  pos += res;
8866 
8867  /* Connected line source */
8868  if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
8869  ast_log(LOG_WARNING, "No space left for connected line source\n");
8870  return -1;
8871  }
8872  data[pos++] = AST_CONNECTED_LINE_SOURCE;
8873  data[pos++] = sizeof(value);
8874  value = htonl(connected->source);
8875  memcpy(data + pos, &value, sizeof(value));
8876  pos += sizeof(value);
8877 
8878  return pos;
8879 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
#define LOG_WARNING
Definition: logger.h:274
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
struct ast_party_name_ies name
Subscriber name ies.
Definition: channel.c:8644
#define ast_log
Definition: astobj2.c:42
struct ast_set_party_id priv
Definition: channel.h:496
int source
Information about the source of an update.
Definition: channel.h:483
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:8673
struct ast_set_party_id id
Definition: channel.h:492
int int32_t
Definition: db.h:60
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469
int str
Subscriber name ie.
Definition: channel.c:8421

◆ 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
Returns
Nothing
Note
Assumes locks are already acquired

Definition at line 8389 of file channel.c.

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

8390 {
8391  ast_party_id_copy(&dest->id, &src->id);
8392  ast_party_id_copy(&dest->ani, &src->ani);
8393  dest->ani2 = src->ani2;
8394 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition: channel.c:1765
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:476
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:434

◆ 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
Returns
Nothing
Note
Assumes locks are already acquired

Definition at line 8396 of file channel.c.

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

8397 {
8398  ast_party_id_copy(&dest->id, &src->id);
8399  ast_party_id_copy(&dest->ani, &src->ani);
8400 
8401  dest->ani2 = src->ani2;
8402 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition: channel.c:1765
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:476
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:434

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

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_name::char_set, ast_party_id_ies::combined_presentation, ast_party_connected_line::id, LOG_WARNING, ast_party_id::name, ast_party_id::number, ast_party_subaddress::odd_even_indicator, ast_party_number::plan, ast_party_name::presentation, ast_party_number::presentation, ast_party_connected_line::priv, ast_party_connected_line::source, ast_party_name::str, ast_party_number::str, ast_party_subaddress::str, ast_party_id::subaddress, ast_party_id::tag, ast_party_subaddress::type, ast_party_name::valid, ast_party_number::valid, ast_party_subaddress::valid, and value.

Referenced by __ast_read(), ast_channel_connected_line_macro(), ast_channel_connected_line_sub(), indicate_connected_line(), socket_process_helper(), wait_for_answer(), and wait_for_winner().

8882 {
8883  size_t pos;
8884  unsigned char ie_len;
8885  unsigned char ie_id;
8886  int32_t value;
8887  int frame_version = 1;
8888  int combined_presentation = 0;
8889  int got_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
8890 
8891  for (pos = 0; pos < datalen; pos += ie_len) {
8892  if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
8893  ast_log(LOG_WARNING, "Invalid connected line update\n");
8894  return -1;
8895  }
8896  ie_id = data[pos++];
8897  ie_len = data[pos++];
8898  if (datalen < pos + ie_len) {
8899  ast_log(LOG_WARNING, "Invalid connected line update\n");
8900  return -1;
8901  }
8902 
8903  switch (ie_id) {
8904 /* Connected line party frame version */
8906  if (ie_len != 1) {
8907  ast_log(LOG_WARNING, "Invalid connected line frame version (%u)\n",
8908  (unsigned) ie_len);
8909  break;
8910  }
8911  frame_version = data[pos];
8912  break;
8913 /* Connected line party id name */
8915  ast_free(connected->id.name.str);
8916  connected->id.name.str = ast_malloc(ie_len + 1);
8917  if (connected->id.name.str) {
8918  memcpy(connected->id.name.str, data + pos, ie_len);
8919  connected->id.name.str[ie_len] = 0;
8920  }
8921  break;
8923  if (ie_len != 1) {
8924  ast_log(LOG_WARNING, "Invalid connected line name char set (%u)\n",
8925  (unsigned) ie_len);
8926  break;
8927  }
8928  connected->id.name.char_set = data[pos];
8929  break;
8931  if (ie_len != 1) {
8932  ast_log(LOG_WARNING, "Invalid connected line name presentation (%u)\n",
8933  (unsigned) ie_len);
8934  break;
8935  }
8936  connected->id.name.presentation = data[pos];
8937  break;
8939  if (ie_len != 1) {
8940  ast_log(LOG_WARNING, "Invalid connected line name valid (%u)\n",
8941  (unsigned) ie_len);
8942  break;
8943  }
8944  connected->id.name.valid = data[pos];
8945  break;
8946 /* Connected line party id number */
8948  ast_free(connected->id.number.str);
8949  connected->id.number.str = ast_malloc(ie_len + 1);
8950  if (connected->id.number.str) {
8951  memcpy(connected->id.number.str, data + pos, ie_len);
8952  connected->id.number.str[ie_len] = 0;
8953  }
8954  break;
8956  if (ie_len != 1) {
8957  ast_log(LOG_WARNING, "Invalid connected line numbering plan (%u)\n",
8958  (unsigned) ie_len);
8959  break;
8960  }
8961  connected->id.number.plan = data[pos];
8962  break;
8964  if (ie_len != 1) {
8965  ast_log(LOG_WARNING, "Invalid connected line number presentation (%u)\n",
8966  (unsigned) ie_len);
8967  break;
8968  }
8969  connected->id.number.presentation = data[pos];
8970  break;
8972  if (ie_len != 1) {
8973  ast_log(LOG_WARNING, "Invalid connected line number valid (%u)\n",
8974  (unsigned) ie_len);
8975  break;
8976  }
8977  connected->id.number.valid = data[pos];
8978  break;
8979 /* Connected line party id subaddress */
8981  ast_free(connected->id.subaddress.str);
8982  connected->id.subaddress.str = ast_malloc(ie_len + 1);
8983  if (connected->id.subaddress.str) {
8984  memcpy(connected->id.subaddress.str, data + pos, ie_len);
8985  connected->id.subaddress.str[ie_len] = 0;
8986  }
8987  break;
8989  if (ie_len != 1) {
8990  ast_log(LOG_WARNING, "Invalid connected line type of subaddress (%u)\n",
8991  (unsigned) ie_len);
8992  break;
8993  }
8994  connected->id.subaddress.type = data[pos];
8995  break;
8997  if (ie_len != 1) {
8999  "Invalid connected line subaddress odd-even indicator (%u)\n",
9000  (unsigned) ie_len);
9001  break;
9002  }
9003  connected->id.subaddress.odd_even_indicator = data[pos];
9004  break;
9006  if (ie_len != 1) {
9007  ast_log(LOG_WARNING, "Invalid connected line subaddress valid (%u)\n",
9008  (unsigned) ie_len);
9009  break;
9010  }
9011  connected->id.subaddress.valid = data[pos];
9012  break;
9013 /* Connected line party tag */
9015  ast_free(connected->id.tag);
9016  connected->id.tag = ast_malloc(ie_len + 1);
9017  if (connected->id.tag) {
9018  memcpy(connected->id.tag, data + pos, ie_len);
9019  connected->id.tag[ie_len] = 0;
9020  }
9021  break;
9022 /* Connected line party id combined presentation */
9024  if (ie_len != 1) {
9025  ast_log(LOG_WARNING, "Invalid connected line combined presentation (%u)\n",
9026  (unsigned) ie_len);
9027  break;
9028  }
9029  combined_presentation = data[pos];
9030  got_combined_presentation = 1;
9031  break;
9032 /* Private connected line party id name */
9034  ast_free(connected->priv.name.str);
9035  connected->priv.name.str = ast_malloc(ie_len + 1);
9036  if (connected->priv.name.str) {
9037  memcpy(connected->priv.name.str, data + pos, ie_len);
9038  connected->priv.name.str[ie_len] = 0;
9039  }
9040  break;
9042  if (ie_len != 1) {
9043  ast_log(LOG_WARNING, "Invalid connected line private name char set (%u)\n",
9044  (unsigned) ie_len);
9045  break;
9046  }
9047  connected->priv.name.char_set = data[pos];
9048  break;
9050  if (ie_len != 1) {
9051  ast_log(LOG_WARNING, "Invalid connected line private name presentation (%u)\n",
9052  (unsigned) ie_len);
9053  break;
9054  }
9055  connected->priv.name.presentation = data[pos];
9056  break;
9058  if (ie_len != 1) {
9059  ast_log(LOG_WARNING, "Invalid connected line private name valid (%u)\n",
9060  (unsigned) ie_len);
9061  break;
9062  }
9063  connected->priv.name.valid = data[pos];
9064  break;
9065 /* Private connected line party id number */
9067  ast_free(connected->priv.number.str);
9068  connected->priv.number.str = ast_malloc(ie_len + 1);
9069  if (connected->priv.number.str) {
9070  memcpy(connected->priv.number.str, data + pos, ie_len);
9071  connected->priv.number.str[ie_len] = 0;
9072  }
9073  break;
9075  if (ie_len != 1) {
9076  ast_log(LOG_WARNING, "Invalid connected line private numbering plan (%u)\n",
9077  (unsigned) ie_len);
9078  break;
9079  }
9080  connected->priv.number.plan = data[pos];
9081  break;
9083  if (ie_len != 1) {
9084  ast_log(LOG_WARNING, "Invalid connected line private number presentation (%u)\n",
9085  (unsigned) ie_len);
9086  break;
9087  }
9088  connected->priv.number.presentation = data[pos];
9089  break;
9091  if (ie_len != 1) {
9092  ast_log(LOG_WARNING, "Invalid connected line private number valid (%u)\n",
9093  (unsigned) ie_len);
9094  break;
9095  }
9096  connected->priv.number.valid = data[pos];
9097  break;
9098 /* Private connected line party id subaddress */
9100  ast_free(connected->priv.subaddress.str);
9101  connected->priv.subaddress.str = ast_malloc(ie_len + 1);
9102  if (connected->priv.subaddress.str) {
9103  memcpy(connected->priv.subaddress.str, data + pos, ie_len);
9104  connected->priv.subaddress.str[ie_len] = 0;
9105  }
9106  break;
9108  if (ie_len != 1) {
9109  ast_log(LOG_WARNING, "Invalid connected line private type of subaddress (%u)\n",
9110  (unsigned) ie_len);
9111  break;
9112  }
9113  connected->priv.subaddress.type = data[pos];
9114  break;
9116  if (ie_len != 1) {
9118  "Invalid connected line private subaddress odd-even indicator (%u)\n",
9119  (unsigned) ie_len);
9120  break;
9121  }
9122  connected->priv.subaddress.odd_even_indicator = data[pos];
9123  break;
9125  if (ie_len != 1) {
9126  ast_log(LOG_WARNING, "Invalid connected line private subaddress valid (%u)\n",
9127  (unsigned) ie_len);
9128  break;
9129  }
9130  connected->priv.subaddress.valid = data[pos];
9131  break;
9132 /* Private connected line party tag */
9134  ast_free(connected->priv.tag);
9135  connected->priv.tag = ast_malloc(ie_len + 1);
9136  if (connected->priv.tag) {
9137  memcpy(connected->priv.tag, data + pos, ie_len);
9138  connected->priv.tag[ie_len] = 0;
9139  }
9140  break;
9141 /* Connected line party source */
9143  if (ie_len != sizeof(value)) {
9144  ast_log(LOG_WARNING, "Invalid connected line source (%u)\n",
9145  (unsigned) ie_len);
9146  break;
9147  }
9148  memcpy(&value, data + pos, sizeof(value));
9149  connected->source = ntohl(value);
9150  break;
9151 /* Connected line party unknown element */
9152  default:
9153  ast_debug(1, "Unknown connected line element: %u (%u)\n",
9154  (unsigned) ie_id, (unsigned) ie_len);
9155  break;
9156  }
9157  }
9158 
9159  switch (frame_version) {
9160  case 1:
9161  /*
9162  * The other end is an earlier version that we need to adjust
9163  * for compatibility.
9164  */
9165  connected->id.name.valid = 1;
9167  connected->id.number.valid = 1;
9168  if (got_combined_presentation) {
9171  }
9172  break;
9173  case 2:
9174  /* The other end is at the same level as we are. */
9175  break;
9176  default:
9177  /*
9178  * The other end is newer than we are.
9179  * We need to assume that they are compatible with us.
9180  */
9181  ast_debug(1, "Connected line frame has newer version: %u\n",
9182  (unsigned) frame_version);
9183  break;
9184  }
9185 
9186  return 0;
9187 }
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:278
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:296
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
#define LOG_WARNING
Definition: logger.h:274
int char_set
Character set the name is using.
Definition: channel.h:273
char * str
Subscriber name (Malloced)
Definition: channel.h:265
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:329
char * str
Malloced subaddress string.
Definition: channel.h:314
int value
Definition: syslog.c:37
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:327
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:193
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:294
int source
Information about the source of an update.
Definition: channel.h:483
#define ast_free(a)
Definition: astmm.h:182
int combined_presentation
Combined name and number presentation ie.
Definition: channel.c:8655
char * tag
User-set "tag".
Definition: channel.h:355
int type
Q.931 subaddress type.
Definition: channel.h:321
int int32_t
Definition: db.h:60
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

◆ ast_deactivate_generator()

void ast_deactivate_generator ( struct ast_channel chan)

Deactivate an active generator

Definition at line 2902 of file channel.c.

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(), cb_events(), channel_spy(), dial_exec_full(), generator_force(), local_ast_moh_stop(), old_milliwatt_exec(), sms_exec(), transmit_audio(), and wait_for_answer().

2903 {
2904  ast_channel_lock(chan);
2906  if (should_trigger_dtmf_emulating(chan)) {
2907  /* if in the middle of dtmf emulation keep 50 tick per sec timer on rolling */
2909  }
2910  ast_channel_unlock(chan);
2911 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
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:2864
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
Definition: timing.c:166
static void deactivate_generator_nolock(struct ast_channel *chan)
Definition: channel.c:2886
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)

◆ ast_dummy_channel_destructor()

static void ast_dummy_channel_destructor ( void *  obj)
static

Free a dummy channel structure.

Definition at line 2338 of file channel.c.

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

2339 {
2340  struct ast_channel *chan = obj;
2341  struct ast_datastore *datastore;
2342  struct ast_var_t *vardata;
2343  struct varshead *headp;
2344 
2346 
2347  /* Get rid of each of the data stores on the channel */
2348  while ((datastore = AST_LIST_REMOVE_HEAD(ast_channel_datastores(chan), entry))) {
2349  /* Free the data store */
2350  ast_datastore_free(datastore);
2351  }
2352 
2358 
2359  /* loop over the variables list, freeing all data and deleting list items */
2360  /* no need to lock the list, as the channel is already locked */
2361  headp = ast_channel_varshead(chan);
2362  while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
2363  ast_var_delete(vardata);
2364 
2365  if (ast_channel_cdr(chan)) {
2367  ast_channel_cdr_set(chan, NULL);
2368  }
2369 
2371 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
Main Channel structure associated with a channel.
struct ast_cdr * ast_channel_cdr(const struct ast_channel *chan)
Structure for a data store object.
Definition: datastore.h:68
struct varshead * ast_channel_varshead(struct ast_channel *chan)
#define NULL
Definition: resample.c:96
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
void ast_party_caller_free(struct ast_party_caller *doomed)
Destroy the caller party contents.
Definition: channel.c:2015
void ast_channel_cdr_set(struct ast_channel *chan, struct ast_cdr *value)
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition: channel.c:2072
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
void ast_channel_internal_cleanup(struct ast_channel *chan)
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2179
void ast_var_delete(struct ast_var_t *var)
Definition: extconf.c:2473
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_party_dialed_free(struct ast_party_dialed *doomed)
Destroy the dialed party contents.
Definition: channel.c:1971
void ast_pbx_hangup_handler_destroy(struct ast_channel *chan)
Destroy the hangup handler container on a channel.
void ast_cdr_free(struct ast_cdr *cdr)
Free a CDR record.
Definition: cdr.c:3411
Definition: search.h:40
struct ast_party_connected_line * ast_channel_connected_indicated(struct ast_channel *chan)

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

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, chanlist::list, 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().

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 }
const char * tech
Definition: app_dial.c:802
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define NULL
Definition: resample.c:96
the list of registered channel types
Definition: channel.c:121
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
List of channel drivers.
Definition: app_dial.c:796
Structure to describe a channel "technology", ie a channel driver See for examples: ...
Definition: channel.h:629
static const char name[]
Definition: cdr_mysql.c:74

◆ ast_get_group()

ast_group_t ast_get_group ( const char *  s)

Definition at line 7718 of file channel.c.

References ast_log, ast_strdupa, ast_strlen_zero, c, LOG_ERROR, LOG_WARNING, and strsep().

Referenced by _parse(), build_device(), build_gateway(), build_peer(), config_parse_variables(), custom_group_handler(), func_channel_write_real(), group_handler(), and process_dahdi().

7719 {
7720  char *piece;
7721  char *c;
7722  int start=0, finish=0, x;
7723  ast_group_t group = 0;
7724 
7725  if (ast_strlen_zero(s))
7726  return 0;
7727 
7728  c = ast_strdupa(s);
7729 
7730  while ((piece = strsep(&c, ","))) {
7731  if (sscanf(piece, "%30d-%30d", &start, &finish) == 2) {
7732  /* Range */
7733  } else if (sscanf(piece, "%30d", &start)) {
7734  /* Just one */
7735  finish = start;
7736  } else {
7737  ast_log(LOG_ERROR, "Syntax error parsing group configuration '%s' at '%s'. Ignoring.\n", s, piece);
7738  continue;
7739  }
7740  for (x = start; x <= finish; x++) {
7741  if ((x > 63) || (x < 0)) {
7742  ast_log(LOG_WARNING, "Ignoring invalid group %d (maximum group is 63)\n", x);
7743  } else
7744  group |= ((ast_group_t) 1 << x);
7745  }
7746  }
7747  return group;
7748 }
unsigned long long ast_group_t
Definition: channel.h:214
#define LOG_WARNING
Definition: logger.h:274
static struct test_val c
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
#define LOG_ERROR
Definition: logger.h:285
char * strsep(char **str, const char *delims)

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

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, namedgroup_member::hash, len(), namedgroup_member::name, namedgroup_cmp_cb(), namedgroup_hash_cb(), NULL, OBJ_NODATA, OBJ_POINTER, OBJ_UNLINK, and strsep().

Referenced by _parse(), build_peer(), config_parse_variables(), func_channel_write_real(), named_groups_handler(), and process_dahdi().

7776 {
7777  struct ao2_container *namedgroups;
7778  char *piece;
7779  char *c;
7780 
7781  if (!s) {
7782  return NULL;
7783  }
7784 
7785  /*! \brief Remove leading and trailing whitespace */
7787  if (ast_strlen_zero(c)) {
7788  return NULL;
7789  }
7790 
7793  if (!namedgroups) {
7794  return NULL;
7795  }
7796 
7797  while ((piece = strsep(&c, ","))) {
7798  struct namedgroup_member *member;
7799  size_t len;
7800 
7801  /* remove leading/trailing whitespace */
7802  piece = ast_strip(piece);
7803 
7804  len = strlen(piece);
7805  if (!len) {
7806  continue;
7807  }
7808 
7809  member = ao2_alloc_options(sizeof(*member) + len, NULL, AO2_ALLOC_OPT_LOCK_NOLOCK);
7810  if (!member) {
7811  ao2_ref(namedgroups, -1);
7812  return NULL;
7813  }
7814  strcpy(member->name, piece);/* Safe */
7815  member->hash = ast_str_hash(member->name);
7816 
7817  /* every group name may exist only once, delete duplicates */
7818  ao2_find(namedgroups, member, OBJ_POINTER | OBJ_UNLINK | OBJ_NODATA);
7819  ao2_link(namedgroups, member);
7820  ao2_ref(member, -1);
7821  }
7822 
7823  if (!ao2_container_count(namedgroups)) {
7824  /* There were no group names specified. */
7825  ao2_ref(namedgroups, -1);
7826  namedgroups = NULL;
7827  }
7828 
7829  return (struct ast_namedgroups *) namedgroups;
7830 }
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define OBJ_POINTER
Definition: astobj2.h:1154
Named group member structure.
Definition: channel.c:7751
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:406
static struct test_val c
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:219
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
unsigned int hash
Definition: channel.c:7753
static int namedgroup_hash_cb(const void *obj, const int flags)
Hashing function used for named group container.
Definition: channel.c:7768
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Definition: astobj2.h:1310
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:157
char * ast_trim_blanks(char *str)
Trims trailing whitespace characters from a string.
Definition: strings.h:182
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
static int namedgroup_cmp_cb(void *obj, void *arg, int flags)
Comparison function used for named group container.
Definition: channel.c:7759
char * strsep(char **str, const char *delims)
Generic container type.
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:1206
#define ao2_link(container, obj)
Definition: astobj2.h:1549

◆ ast_hangup()

void ast_hangup ( struct ast_channel chan)

Hangup a channel.

Hang up a channel.

Definition at line 2548 of file channel.c.

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, destroy_hooks(), free_translation(), ast_channel_tech::hangup, 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(), alsa_new(), 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_frame(), handle_hd_hf(), handle_init_event(), handle_invite_replaces(), handle_request_invite(), handle_soft_key_event_message(), handle_timeout_trip(), hangup_chan(), hangup_channel(), hangup_playback(), hangupcalls(), hanguptree(), iax2_request(), jingle_action_session_initiate(), local_call(), make_channel(), mbl_ast_hangup(), media_request_helper(), meetme_menu_admin_extended(), mgcp_new(), mgcp_ss(), moh_channel_thread(), monitor_dial(), mwi_thread(), my_distinctive_ring(), my_handle_notify_message(), nbs_new(), ooh323_new(), oss_new(), park_local_transfer(), parking_blind_transfer_park(), pbx_outgoing_exec(), pbx_start_incoming_request(), phone_new(), push_announcer(), read_test(), recalling_exit(), refer_incoming_invite_request(), request_channel(), retransfer_enter(), safe_hangup(), setsubstate(), sip_new(), sip_pickup_thread(), skinny_new(), snoop_stasis_thread(), stasis_app_control_snoop(), unistim_new(), and wait_for_answer().

2549 {
2550  /* Be NULL safe for RAII_VAR() usage. */
2551  if (!chan) {
2552  return;
2553  }
2554 
2555  ast_debug(1, "Channel %p '%s' hanging up. Refs: %d\n", chan, ast_channel_name(chan),
2556  ao2_ref(chan, 0));
2557 
2558  ast_autoservice_stop(chan);
2559 
2560  ast_channel_lock(chan);
2561 
2562  while (ast_channel_masq(chan) || ast_channel_masqr(chan)) {
2564  }
2565 
2566  /* Mark as a zombie so a masquerade cannot be setup on this channel. */
2568 
2569  ast_channel_unlock(chan);
2570 
2571  /*
2572  * XXX if running the hangup handlers here causes problems
2573  * because the handlers take too long to execute, we could move
2574  * the meat of this function into another thread. A thread
2575  * where channels go to die.
2576  *
2577  * If this is done, ast_autoservice_chan_hangup_peer() will no
2578  * longer be needed.
2579  */
2581  ao2_unlink(channels, chan);
2582  ast_channel_lock(chan);
2583 
2584  destroy_hooks(chan);
2585 
2586  free_translation(chan);
2587  /* Close audio stream */
2588  if (ast_channel_stream(chan)) {
2591  }
2592  /* Close video stream */
2593  if (ast_channel_vstream(chan)) {
2596  }
2597  if (ast_channel_sched(chan)) {
2599  ast_channel_sched_set(chan, NULL);
2600  }
2601 
2602  if (ast_channel_generatordata(chan)) { /* Clear any tone stuff remaining */
2603  if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
2605  }
2606  }
2609 
2611  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",
2613  ast_channel_blockproc(chan));
2614  ast_assert(0);
2615  }
2616 
2617  if (ast_channel_tech(chan)->hangup) {
2618  ast_channel_tech(chan)->hangup(chan);
2619  }
2620 
2621  ast_channel_unlock(chan);
2622 
2623  ast_cc_offer(chan);
2624 
2625  ast_channel_unref(chan);
2626 }
const char * ast_channel_blockproc(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2945
struct ast_filestream * ast_channel_vstream(const struct ast_channel *chan)
void * ast_channel_generatordata(const struct ast_channel *chan)
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2981
#define ast_test_flag(p, flag)
Definition: utils.h:63
static void free_translation(struct ast_channel *clonechan)
Definition: channel.c:2492
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define LOG_WARNING
Definition: logger.h:274
static void destroy_hooks(struct ast_channel *chan)
Definition: channel.c:2537
void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value)
void ast_channel_vstream_set(struct ast_channel *chan, struct ast_filestream *value)
int(*const hangup)(struct ast_channel *chan)
Hangup (and possibly destroy) the channel.
Definition: channel.h:705
#define ast_assert(a)
Definition: utils.h:695
int ast_channel_blocker_tid(const struct ast_channel *chan)
static int hangup(void *data)
Definition: chan_pjsip.c:2483
#define NULL
Definition: resample.c:96
void ast_channel_stream_set(struct ast_channel *chan, struct ast_filestream *value)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
int ast_get_tid(void)
Get current thread ID.
Definition: main/utils.c:2504
#define ao2_ref(o, delta)
Definition: astobj2.h:464
void(* release)(struct ast_channel *chan, void *data)
Definition: channel.h:229
int ast_autoservice_stop(struct ast_channel *chan)
Stop servicing a channel for us...
Definition: autoservice.c:266
struct ast_sched_context * ast_channel_sched(const struct ast_channel *chan)
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
int ast_cc_offer(struct ast_channel *caller_chan)
Offer CC to a caller.
Definition: ccss.c:3751
#define ao2_unlink(container, obj)
Definition: astobj2.h:1598
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
struct ast_channel * ast_channel_masq(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define CHANNEL_DEADLOCK_AVOIDANCE(chan)
Definition: lock.h:352
int ast_closestream(struct ast_filestream *f)
Closes a stream.
Definition: file.c:1068
struct ast_filestream * ast_channel_stream(const struct ast_channel *chan)
int ast_pbx_hangup_handler_run(struct ast_channel *chan)
Run all hangup handlers on the channel.
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_sched_set(struct ast_channel *chan, struct ast_sched_context *value)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
struct ast_channel * ast_channel_masqr(const struct ast_channel *chan)
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
Definition: sched.c:269

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

References ast_indicate_data(), and NULL.

Referenced by __ast_play_and_record(), alsa_call(), 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(), mgcp_ss(), monitor_dial(), oss_call(), 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(), sla_handle_hold_event(), sla_station_exec(), sla_trunk_exec(), softmix_bridge_join(), try_calling(), valid_priv_reply(), vm_exec(), and wait_for_answer().

4323 {
4324  return ast_indicate_data(chan, condition, NULL, 0);
4325 }
#define NULL
Definition: resample.c:96
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:4698

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

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(), transmit_audio(), transmit_t38(), wait_for_answer(), and wait_for_winner().

4699 {
4700  int res;
4701  /* this frame is used by framehooks. if it is set, we must free it at the end of this function */
4702  struct ast_frame *awesome_frame = NULL;
4703 
4704  ast_channel_lock(chan);
4705 
4706  /* Don't bother if the channel is about to go away, anyway. */
4708  || (ast_check_hangup(chan) && !ast_channel_is_leaving_bridge(chan)))
4709  && _condition != AST_CONTROL_MASQUERADE_NOTIFY) {
4710  res = -1;
4711  goto indicate_cleanup;
4712  }
4713 
4715  /* Do framehooks now, do it, go, go now */
4716  struct ast_frame frame = {
4718  .subclass.integer = _condition,
4719  .data.ptr = (void *) data, /* this cast from const is only okay because we do the ast_frdup below */
4720  .datalen = datalen
4721  };
4722 
4723  /* we have now committed to freeing this frame */
4724  awesome_frame = ast_frdup(&frame);
4725 
4726  /* who knows what we will get back! the anticipation is killing me. */
4728  awesome_frame);
4729  if (!awesome_frame
4730  || awesome_frame->frametype != AST_FRAME_CONTROL) {
4731  res = 0;
4732  goto indicate_cleanup;
4733  }
4734 
4735  _condition = awesome_frame->subclass.integer;
4736  data = awesome_frame->data.ptr;
4737  datalen = awesome_frame->datalen;
4738  }
4739 
4740  res = indicate_data_internal(chan, _condition, data, datalen);
4741 
4742 indicate_cleanup:
4743  ast_channel_unlock(chan);
4744  if (awesome_frame) {
4745  ast_frfree(awesome_frame);
4746  }
4747 
4748  return res;
4749 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_frdup(fr)
Copies a frame.
#define ast_test_flag(p, flag)
Definition: utils.h:63
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
int ast_framehook_list_is_empty(struct ast_framehook_list *framehooks)
Determine if an framehook list is empty or not.
Definition: framehook.c:274
#define NULL
Definition: resample.c:96
struct ast_frame_subclass subclass
static int indicate_data_internal(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Definition: channel.c:4515
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
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&#39;s framehook list...
Definition: framehook.c:313
#define ast_channel_unlock(chan)
Definition: channel.h:2946
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:10751
#define ast_frfree(fr)
Data structure associated with a single frame of data.
union ast_frame::@263 data
enum ast_frame_type frametype
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

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

References ast_moh_cleanup_ptr, ast_moh_start_ptr, and ast_moh_stop_ptr.

Referenced by load_module(), and reload().

7853 {
7854  ast_moh_start_ptr = start_ptr;
7855  ast_moh_stop_ptr = stop_ptr;
7856  ast_moh_cleanup_ptr = cleanup_ptr;
7857 }
static int(* ast_moh_start_ptr)(struct ast_channel *, const char *, const char *)
Definition: channel.c:7846
static void(* ast_moh_stop_ptr)(struct ast_channel *)
Definition: channel.c:7847
static void(* ast_moh_cleanup_ptr)(struct ast_channel *)
Definition: channel.c:7848

◆ ast_is_deferrable_frame()

int ast_is_deferrable_frame ( const struct ast_frame frame)

Should we keep this frame for later?

There are functions such as ast_safe_sleep which will service a channel to ensure that it does not have a large backlog of queued frames. When this happens, we want to hold on to specific frame types and just drop others. This function will tell if the frame we just read should be held onto.

Parameters
frameThe frame we just read
Return values
1frame should be kept
0frame should be dropped

Definition at line 1467 of file channel.c.

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

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

◆ ast_moh_cleanup()

void ast_moh_cleanup ( struct ast_channel chan)

Definition at line 7882 of file channel.c.

References ast_moh_cleanup_ptr.

Referenced by ast_channel_destructor().

7883 {
7884  if (ast_moh_cleanup_ptr)
7885  ast_moh_cleanup_ptr(chan);
7886 }
static void(* ast_moh_cleanup_ptr)(struct ast_channel *)
Definition: channel.c:7848

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

References ast_moh_start_ptr, and ast_verb.

Referenced by alsa_indicate(), 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(), mgcp_indicate(), misdn_indication(), moh_handle_digit(), monitor_dial(), ooh323_indicate(), oss_indicate(), participant_entertainment_start(), phone_indicate(), play_moh_exec(), queue_exec(), retrydial_exec(), rna(), say_periodic_announcement(), say_position(), sip_indicate(), skinny_indicate(), start_moh_exec(), unistim_indicate(), and valid_priv_reply().

7867 {
7868  if (ast_moh_start_ptr)
7869  return ast_moh_start_ptr(chan, mclass, interpclass);
7870 
7871  ast_verb(3, "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : (interpclass ? interpclass : "default"));
7872 
7873  return -1;
7874 }
static int(* ast_moh_start_ptr)(struct ast_channel *, const char *, const char *)
Definition: channel.c:7846
#define ast_verb(level,...)
Definition: logger.h:463

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

References ao2_callback, ao2_cleanup, ao2_container_count(), match(), namedgroup_match(), NULL, and SWAP.

Referenced by find_channel_by_group().

8193 {
8194  void *match;
8195  struct ao2_container *group_a = (struct ao2_container *) a;
8196  struct ao2_container *group_b = (struct ao2_container *) b;
8197 
8198  if (!a || !b) {
8199  return 0;
8200  }
8201 
8202  /*
8203  * Do groups a and b intersect? Since a and b are hash tables,
8204  * the average time complexity is:
8205  * O(a.count <= b.count ? a.count : b.count)
8206  */
8207  if (ao2_container_count(group_b) < ao2_container_count(group_a)) {
8208  /* Traverse over the smaller group. */
8209  SWAP(group_a, group_b);
8210  }
8211  match = ao2_callback(group_a, 0, namedgroup_match, group_b);
8212  ao2_cleanup(match);
8213 
8214  return match != NULL;
8215 }
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
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:2315
#define SWAP(a, b)
Definition: utils.h:230
#define NULL
Definition: resample.c:96
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
static struct test_val b
Generic container type.
static int namedgroup_match(void *obj, void *arg, int flags)
Definition: channel.c:8182
static struct test_val a

◆ 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
Returns
Nothing

Definition at line 1986 of file channel.c.

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

1987 {
1988  if (dest == src) {
1989  /* Don't copy to self */
1990  return;
1991  }
1992 
1993  ast_party_id_copy(&dest->id, &src->id);
1994  ast_party_id_copy(&dest->ani, &src->ani);
1995  ast_party_id_copy(&dest->priv, &src->priv);
1996  dest->ani2 = src->ani2;
1997 }
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition: channel.c:1765
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:431
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:434

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

Definition at line 2015 of file channel.c.

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

2016 {
2017  ast_party_id_free(&doomed->id);
2018  ast_party_id_free(&doomed->ani);
2019  ast_party_id_free(&doomed->priv);
2020 }
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1811
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:431

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

Definition at line 1978 of file channel.c.

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

1979 {
1980  ast_party_id_init(&init->id);
1981  ast_party_id_init(&init->ani);
1982  ast_party_id_init(&init->priv);
1983  init->ani2 = 0;
1984 }
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:431
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:434
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1757

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

Definition at line 2007 of file channel.c.

References ast_party_caller::ani, ast_set_party_caller::ani, ast_party_caller::ani2, ast_party_id_set(), ast_party_caller::id, ast_set_party_caller::id, NULL, ast_party_caller::priv, and ast_set_party_caller::priv.

Referenced by ast_channel_set_caller(), ast_channel_set_caller_event(), and callerid_write().

2008 {
2009  ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2010  ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2011  ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2012  dest->ani2 = src->ani2;
2013 }
struct ast_set_party_id ani
Definition: channel.h:445
#define NULL
Definition: resample.c:96
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
Set the source party id information into the destination party id.
Definition: channel.c:1788
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:431
struct ast_set_party_id id
Definition: channel.h:443
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:434
struct ast_set_party_id priv
Definition: channel.h:447

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

Definition at line 1999 of file channel.c.

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

2000 {
2001  ast_party_id_set_init(&init->id, &guide->id);
2002  ast_party_id_set_init(&init->ani, &guide->ani);
2003  ast_party_id_set_init(&init->priv, &guide->priv);
2004  init->ani2 = guide->ani2;
2005 }
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:431
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:434
void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
Initialize the given party id structure using the given guide for a set update operation.
Definition: channel.c:1780

◆ 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.
Returns
Nothing
Warning
This is a shallow copy.
DO NOT call ast_party_connected_line_free() on the filled in connected line structure!

Definition at line 2063 of file channel.c.

References ast_party_caller::ani, ast_party_connected_line::ani, ast_party_caller::ani2, ast_party_connected_line::ani2, AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN, ast_party_caller::id, ast_party_connected_line::id, ast_party_caller::priv, ast_party_connected_line::priv, and ast_party_connected_line::source.

2064 {
2065  connected->id = caller->id;
2066  connected->ani = caller->ani;
2067  connected->priv = caller->priv;
2068  connected->ani2 = caller->ani2;
2070 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:476
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
struct ast_party_id priv
Private caller party ID.
Definition: channel.h:431
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:434
int source
Information about the source of an update.
Definition: channel.h:483
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469

◆ 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
Returns
Nothing

Definition at line 2031 of file channel.c.

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

2032 {
2033  if (dest == src) {
2034  /* Don't copy to self */
2035  return;
2036  }
2037 
2038  ast_party_id_copy(&dest->id, &src->id);
2039  ast_party_id_copy(&dest->ani, &src->ani);
2040  ast_party_id_copy(&dest->priv, &src->priv);
2041  dest->ani2 = src->ani2;
2042  dest->source = src->source;
2043 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition: channel.c:1765
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:476
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
int source
Information about the source of an update.
Definition: channel.h:483
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469

◆ ast_party_connected_line_free()

void ast_party_connected_line_free ( struct ast_party_connected_line doomed)

Destroy the connected line information contents.

Since
1.8
Parameters
doomedThe connected line information to destroy.
Returns
Nothing

Definition at line 2072 of file channel.c.

References ast_party_connected_line::ani, ast_party_id_free(), ast_party_connected_line::id, and ast_party_connected_line::priv.

Referenced by __ast_read(), after_bridge_move_channel(), agent_login_channel_config(), agent_pvt_destructor(), agent_request_exec(), app_exec(), ast_channel_connected_line_macro(), ast_channel_connected_line_sub(), ast_channel_destructor(), ast_do_pickup(), ast_dummy_channel_destructor(), attended_transfer_properties_destructor(), bridge_reconfigured_connected_line_update(), callattempt_free(), chanlist_free(), connectedline_write(), destroy_calling_node(), indicate_connected_line(), socket_process_helper(), update_connected_line_from_peer(), wait_for_answer(), and wait_for_winner().

2073 {
2074  ast_party_id_free(&doomed->id);
2075  ast_party_id_free(&doomed->ani);
2076  ast_party_id_free(&doomed->priv);
2077 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1811
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469

◆ ast_party_connected_line_init()

void ast_party_connected_line_init ( struct ast_party_connected_line init)

Initialize the given connected line structure.

Since
1.8
Parameters
initConnected line structure to initialize.
Returns
Nothing

Definition at line 2022 of file channel.c.

References ast_party_connected_line::ani, ast_party_connected_line::ani2, AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN, ast_party_id_init(), ast_party_connected_line::id, ast_party_connected_line::priv, and ast_party_connected_line::source.

Referenced by __ast_channel_alloc_ap(), __ast_read(), after_bridge_move_channel(), agent_login_channel_config(), agent_pvt_new(), agent_request_exec(), ast_channel_connected_line_macro(), ast_channel_connected_line_sub(), ast_do_pickup(), bridge_reconfigured_connected_line_update(), do_forward(), handle_request_invite(), handle_request_update(), handle_response_invite(), misdn_queue_connected_line_update(), onAlerting(), onCallEstablished(), onProgress(), queue_connected_line_update(), sip_call(), socket_process_helper(), update_connected_line_from_peer(), and update_initial_connected_line().

2023 {
2024  ast_party_id_init(&init->id);
2025  ast_party_id_init(&init->ani);
2026  ast_party_id_init(&init->priv);
2027  init->ani2 = 0;
2029 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:476
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
int source
Information about the source of an update.
Definition: channel.h:483
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1757
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469

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

Definition at line 2054 of file channel.c.

References ast_party_connected_line::ani, ast_set_party_connected_line::ani, ast_party_connected_line::ani2, ast_party_id_set(), ast_party_connected_line::id, ast_set_party_connected_line::id, NULL, ast_party_connected_line::priv, ast_set_party_connected_line::priv, and ast_party_connected_line::source.

Referenced by ast_channel_set_connected_line(), wait_for_answer(), and wait_for_winner().

2055 {
2056  ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2057  ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2058  ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2059  dest->ani2 = src->ani2;
2060  dest->source = src->source;
2061 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:476
#define NULL
Definition: resample.c:96
void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
Set the source party id information into the destination party id.
Definition: channel.c:1788
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
struct ast_set_party_id priv
Definition: channel.h:496
int source
Information about the source of an update.
Definition: channel.h:483
struct ast_set_party_id id
Definition: channel.h:492
struct ast_set_party_id ani
Definition: channel.h:494
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469

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

Definition at line 2045 of file channel.c.

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

2046 {
2047  ast_party_id_set_init(&init->id, &guide->id);
2048  ast_party_id_set_init(&init->ani, &guide->ani);
2049  ast_party_id_set_init(&init->priv, &guide->priv);
2050  init->ani2 = guide->ani2;
2051  init->source = guide->source;
2052 }
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:476
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:466
int source
Information about the source of an update.
Definition: channel.h:483
void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
Initialize the given party id structure using the given guide for a set update operation.
Definition: channel.c:1780
struct ast_party_id priv
Private connected party ID.
Definition: channel.h:469

◆ 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
Returns
Nothing

Definition at line 1936 of file channel.c.

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

1937 {
1938  if (dest == src) {
1939  /* Don't copy to self */
1940  return;
1941  }
1942 
1943  ast_free(dest->number.str);
1944  dest->number.str = ast_strdup(src->number.str);
1945  dest->number.plan = src->number.plan;
1948 }
struct ast_party_dialed::@246 number
Dialed/Called number.
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:389
char * str
Subscriber phone number (Malloced)
Definition: channel.h:387
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
void ast_party_subaddress_copy(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Copy the source party subaddress information to the destination party subaddress. ...
Definition: channel.c:1705
#define ast_free(a)
Definition: astmm.h:182
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition: channel.h:392
int transit_network_select
Transit Network Select.
Definition: channel.h:398

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

Definition at line 1971 of file channel.c.

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

1972 {
1973  ast_free(doomed->number.str);
1974  doomed->number.str = NULL;
1976 }
struct ast_party_dialed::@246 number
Dialed/Called number.
char * str
Subscriber phone number (Malloced)
Definition: channel.h:387
#define NULL
Definition: resample.c:96
void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
Destroy the party subaddress contents.
Definition: channel.c:1744
#define ast_free(a)
Definition: astmm.h:182
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition: channel.h:392

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

Definition at line 1928 of file channel.c.

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

1929 {
1930  init->number.str = NULL;
1931  init->number.plan = 0;/* Unknown */
1933  init->transit_network_select = 0;
1934 }
struct ast_party_dialed::@246 number
Dialed/Called number.
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:389
char * str
Subscriber phone number (Malloced)
Definition: channel.h:387
#define NULL
Definition: resample.c:96
void ast_party_subaddress_init(struct ast_party_subaddress *init)
Initialize the given subaddress structure.
Definition: channel.c:1697
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition: channel.h:392
int transit_network_select
Transit Network Select.
Definition: channel.h:398

◆ 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
Returns
Nada

Definition at line 1958 of file channel.c.

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

1959 {
1960  if (src->number.str && src->number.str != dest->number.str) {
1961  ast_free(dest->number.str);
1962  dest->number.str = ast_strdup(src->number.str);
1963  }
1964  dest->number.plan = src->number.plan;
1965 
1967 
1969 }
struct ast_party_dialed::@246 number
Dialed/Called number.
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:389
char * str
Subscriber phone number (Malloced)
Definition: channel.h:387
void ast_party_subaddress_set(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Set the source party subaddress information into the destination party subaddress.
Definition: channel.c:1727
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define ast_free(a)
Definition: astmm.h:182
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition: channel.h:392
int transit_network_select
Transit Network Select.
Definition: channel.h:398

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

Definition at line 1950 of file channel.c.

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

1951 {
1952  init->number.str = NULL;
1953  init->number.plan = guide->number.plan;
1956 }
struct ast_party_dialed::@246 number
Dialed/Called number.
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:389
char * str
Subscriber phone number (Malloced)
Definition: channel.h:387
#define NULL
Definition: resample.c:96
void ast_party_subaddress_set_init(struct ast_party_subaddress *init, const struct ast_party_subaddress *guide)
Initialize the given party subaddress structure using the given guide for a set update operation...
Definition: channel.c:1719
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition: channel.h:392
int transit_network_select
Transit Network Select.
Definition: channel.h:398

◆ 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
Returns
Nothing

Definition at line 1765 of file channel.c.

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(), caller_id_incoming_request(), caller_id_outgoing_request(), caller_id_outgoing_response(), chan_pjsip_new(), copy_redirecting_id(), queue_connected_line_update(), set_from_header(), and update_initial_connected_line().

1766 {
1767  if (dest == src) {
1768  /* Don't copy to self */
1769  return;
1770  }
1771 
1772  ast_party_name_copy(&dest->name, &src->name);
1773  ast_party_number_copy(&dest->number, &src->number);
1775 
1776  ast_free(dest->tag);
1777  dest->tag = ast_strdup(src->tag);
1778 }
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
void ast_party_number_copy(struct ast_party_number *dest, const struct ast_party_number *src)
Copy the source party number information to the destination party number.
Definition: channel.c:1652
void ast_party_subaddress_copy(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Copy the source party subaddress information to the destination party subaddress. ...
Definition: channel.c:1705
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
void ast_party_name_copy(struct ast_party_name *dest, const struct ast_party_name *src)
Copy the source party name information to the destination party name.
Definition: channel.c:1599
#define ast_free(a)
Definition: astmm.h:182
char * tag
User-set "tag".
Definition: channel.h:355
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

Definition at line 1811 of file channel.c.

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(), session_destructor(), set_from_header(), and update_incoming_connected_line().

1812 {
1813  ast_party_name_free(&doomed->name);
1814  ast_party_number_free(&doomed->number);
1816 
1817  ast_free(doomed->tag);
1818  doomed->tag = NULL;
1819 }
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
#define NULL
Definition: resample.c:96
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
Definition: channel.c:1691
void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
Destroy the party subaddress contents.
Definition: channel.c:1744
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
Definition: channel.c:1638
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
#define ast_free(a)
Definition: astmm.h:182
char * tag
User-set "tag".
Definition: channel.h:355
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

Definition at line 1757 of file channel.c.

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

1758 {
1759  ast_party_name_init(&init->name);
1760  ast_party_number_init(&init->number);
1762  init->tag = NULL;
1763 }
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
#define NULL
Definition: resample.c:96
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
Definition: channel.c:1591
void ast_party_subaddress_init(struct ast_party_subaddress *init)
Initialize the given subaddress structure.
Definition: channel.c:1697
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
Definition: channel.c:1644
char * tag
User-set "tag".
Definition: channel.h:355
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

Definition at line 1889 of file channel.c.

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

◆ ast_party_id_merge()

struct ast_party_id ast_party_id_merge ( struct ast_party_id base,
struct ast_party_id overlay 
)

Merge a given party id into another given party id.

Since
11.0

This function will generate an effective party id.

Each party id component of the party id 'base' is overwritten by components of the party id 'overlay' if the overlay component is marked as valid. However the component 'tag' of the base party id remains untouched.

Parameters
baseThe party id which is merged.
overlayThe party id which is used to merge into.
Returns
The merged party id as a struct, not as a pointer.
Note
The merged party id returned is a shallow copy and must not be freed.

Definition at line 1902 of file channel.c.

References ast_party_id::name.

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

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

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

Definition at line 1920 of file channel.c.

References ast_party_id_copy(), and ast_party_id_merge().

1921 {
1922  struct ast_party_id merged;
1923 
1924  merged = ast_party_id_merge(base, overlay);
1925  ast_party_id_copy(dest, &merged);
1926 }
struct ast_party_id ast_party_id_merge(struct ast_party_id *base, struct ast_party_id *overlay)
Merge a given party id into another given party id.
Definition: channel.c:1902
Information needed to identify an endpoint in a call.
Definition: channel.h:339
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition: channel.c:1765

◆ ast_party_id_presentation()

int ast_party_id_presentation ( const struct ast_party_id id)

Determine the overall presentation value for the given party.

Since
1.8
Parameters
idParty to determine the overall presentation value.
Returns
Overall presentation value for the given party.

Definition at line 1821 of file channel.c.

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, ast_party_id::name, ast_party_id::number, ast_party_name::valid, and ast_party_number::valid.

Referenced by add_id_headers(), add_privacy_header(), add_privacy_params(), add_rpid(), ast_json_party_id(), ast_str_retrieve_variable(), ast_var_channels_table(), channel_snapshot_caller_create(), iax2_call(), initreqprep(), is_colp_update_allowed(), my_on_hook(), party_id_build_data(), party_id_read(), push_callinfo(), redirecting_read(), send_callinfo(), set_from_header(), setsubstate(), setup_env(), sip_call(), and socket_process_helper().

1822 {
1823  int number_priority;
1824  int number_value;
1825  int number_screening;
1826  int name_priority;
1827  int name_value;
1828 
1829  /* Determine name presentation priority. */
1830  if (!id->name.valid) {
1831  name_value = AST_PRES_UNAVAILABLE;
1832  name_priority = 3;
1833  } else {
1834  name_value = id->name.presentation & AST_PRES_RESTRICTION;
1835  switch (name_value) {
1836  case AST_PRES_RESTRICTED:
1837  name_priority = 0;
1838  break;
1839  case AST_PRES_ALLOWED:
1840  name_priority = 1;
1841  break;
1842  case AST_PRES_UNAVAILABLE:
1843  name_priority = 2;
1844  break;
1845  default:
1846  name_value = AST_PRES_UNAVAILABLE;
1847  name_priority = 3;
1848  break;
1849  }
1850  }
1851 
1852  /* Determine number presentation priority. */
1853  if (!id->number.valid) {
1854  number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1855  number_value = AST_PRES_UNAVAILABLE;
1856  number_priority = 3;
1857  } else {
1858  number_screening = id->number.presentation & AST_PRES_NUMBER_TYPE;
1859  number_value = id->number.presentation & AST_PRES_RESTRICTION;
1860  switch (number_value) {
1861  case AST_PRES_RESTRICTED:
1862  number_priority = 0;
1863  break;
1864  case AST_PRES_ALLOWED:
1865  number_priority = 1;
1866  break;
1867  case AST_PRES_UNAVAILABLE:
1868  number_priority = 2;
1869  break;
1870  default:
1871  number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1872  number_value = AST_PRES_UNAVAILABLE;
1873  number_priority = 3;
1874  break;
1875  }
1876  }
1877 
1878  /* Select the wining presentation value. */
1879  if (name_priority < number_priority) {
1880  number_value = name_value;
1881  }
1882  if (number_value == AST_PRES_UNAVAILABLE) {
1884  }
1885 
1886  return number_value | number_screening;
1887 }
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
#define AST_PRES_RESTRICTED
Definition: callerid.h:325
#define AST_PRES_USER_NUMBER_UNSCREENED
Definition: callerid.h:318
#define AST_PRES_NUMBER_TYPE
Definition: callerid.h:317
#define AST_PRES_NUMBER_NOT_AVAILABLE
Definition: callerid.h:353
#define AST_PRES_RESTRICTION
Definition: callerid.h:323
#define AST_PRES_ALLOWED
Definition: callerid.h:324
#define AST_PRES_UNAVAILABLE
Definition: callerid.h:326
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

Definition at line 1896 of file channel.c.

References ast_party_id_free(), and ast_party_id_init().

Referenced by after_bridge_move_channel(), ast_do_pickup(), cb_events(), channel_do_masquerade(), misdn_facility_ie_handler(), and retransfer_enter().

1897 {
1898  ast_party_id_free(id);
1899  ast_party_id_init(id);
1900 }
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1811
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1757

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

Definition at line 1788 of file channel.c.

References ast_free, ast_party_name_set(), ast_party_number_set(), ast_party_subaddress_set(), ast_strdup, ast_party_id::name, ast_set_party_id::name, ast_party_id::number, ast_set_party_id::number, ast_party_id::subaddress, ast_set_party_id::subaddress, and ast_party_id::tag.

Referenced by ast_party_caller_set(), ast_party_connected_line_set(), and ast_party_redirecting_set().

1789 {
1790  if (dest == src) {
1791  /* Don't set to self */
1792  return;
1793  }
1794 
1795  if (!update || update->name) {
1796  ast_party_name_set(&dest->name, &src->name);
1797  }
1798  if (!update || update->number) {
1799  ast_party_number_set(&dest->number, &src->number);
1800  }
1801  if (!update || update->subaddress) {
1803  }
1804 
1805  if (src->tag && src->tag != dest->tag) {
1806  ast_free(dest->tag);
1807  dest->tag = ast_strdup(src->tag);
1808  }
1809 }
void ast_party_name_set(struct ast_party_name *dest, const struct ast_party_name *src)
Set the source party name information into the destination party name.
Definition: channel.c:1621
void ast_party_subaddress_set(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Set the source party subaddress information into the destination party subaddress.
Definition: channel.c:1727
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
unsigned char subaddress
Definition: channel.h:368
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
unsigned char number
Definition: channel.h:366
#define ast_free(a)
Definition: astmm.h:182
char * tag
User-set "tag".
Definition: channel.h:355
unsigned char name
Definition: channel.h:364
void ast_party_number_set(struct ast_party_number *dest, const struct ast_party_number *src)
Set the source party number information into the destination party number.
Definition: channel.c:1674
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

Definition at line 1780 of file channel.c.

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

1781 {
1782  ast_party_name_set_init(&init->name, &guide->name);
1783  ast_party_number_set_init(&init->number, &guide->number);
1785  init->tag = NULL;
1786 }
void ast_party_number_set_init(struct ast_party_number *init, const struct ast_party_number *guide)
Initialize the given party number structure using the given guide for a set update operation...
Definition: channel.c:1666
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
#define NULL
Definition: resample.c:96
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
void ast_party_subaddress_set_init(struct ast_party_subaddress *init, const struct ast_party_subaddress *guide)
Initialize the given party subaddress structure using the given guide for a set update operation...
Definition: channel.c:1719
void ast_party_name_set_init(struct ast_party_name *init, const struct ast_party_name *guide)
Initialize the given party name structure using the given guide for a set update operation.
Definition: channel.c:1613
char * tag
User-set "tag".
Definition: channel.h:355
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

◆ 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
Returns
Nothing

Definition at line 1599 of file channel.c.

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

1600 {
1601  if (dest == src) {
1602  /* Don't copy to self */
1603  return;
1604  }
1605 
1606  ast_free(dest->str);
1607  dest->str = ast_strdup(src->str);
1608  dest->char_set = src->char_set;
1609  dest->presentation = src->presentation;
1610  dest->valid = src->valid;
1611 }
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:278
int char_set
Character set the name is using.
Definition: channel.h:273
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define ast_free(a)
Definition: astmm.h:182
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280

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

Definition at line 1638 of file channel.c.

References ast_free, NULL, and ast_party_name::str.

Referenced by __analog_ss_thread(), analog_ss_thread(), ast_party_id_free(), and skinny_newcall().

1639 {
1640  ast_free(doomed->str);
1641  doomed->str = NULL;
1642 }
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182

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

Definition at line 1591 of file channel.c.

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(), analog_ss_thread(), ast_party_id_init(), and skinny_newcall().

1592 {
1593  init->str = NULL;
1596  init->valid = 0;
1597 }
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:278
int char_set
Character set the name is using.
Definition: channel.h:273
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define NULL
Definition: resample.c:96
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition: callerid.h:329
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280

◆ 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
Returns
Nothing

Definition at line 1621 of file channel.c.

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

1622 {
1623  if (dest == src) {
1624  /* Don't set to self */
1625  return;
1626  }
1627 
1628  if (src->str && src->str != dest->str) {
1629  ast_free(dest->str);
1630  dest->str = ast_strdup(src->str);
1631  }
1632 
1633  dest->char_set = src->char_set;
1634  dest->presentation = src->presentation;
1635  dest->valid = src->valid;
1636 }
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:278
int char_set
Character set the name is using.
Definition: channel.h:273
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define ast_free(a)
Definition: astmm.h:182
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280

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

Definition at line 1613 of file channel.c.

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

1614 {
1615  init->str = NULL;
1616  init->char_set = guide->char_set;
1617  init->presentation = guide->presentation;
1618  init->valid = guide->valid;
1619 }
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:278
int char_set
Character set the name is using.
Definition: channel.h:273
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define NULL
Definition: resample.c:96
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280

◆ 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
Returns
Nothing

Definition at line 1652 of file channel.c.

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

1653 {
1654  if (dest == src) {
1655  /* Don't copy to self */
1656  return;
1657  }
1658 
1659  ast_free(dest->str);
1660  dest->str = ast_strdup(src->str);
1661  dest->plan = src->plan;
1662  dest->presentation = src->presentation;
1663  dest->valid = src->valid;
1664 }
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:296
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:294
#define ast_free(a)
Definition: astmm.h:182
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298

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

Definition at line 1691 of file channel.c.

References ast_free, NULL, and ast_party_number::str.

Referenced by __analog_ss_thread(), analog_ss_thread(), ast_party_id_free(), do_forward(), skinny_newcall(), and wait_for_answer().

1692 {
1693  ast_free(doomed->str);
1694  doomed->str = NULL;
1695 }
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182

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

Definition at line 1644 of file channel.c.

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(), analog_ss_thread(), ast_party_id_init(), do_forward(), skinny_newcall(), and wait_for_answer().

1645 {
1646  init->str = NULL;
1647  init->plan = 0;/* Unknown */
1649  init->valid = 0;
1650 }
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:296
#define NULL
Definition: resample.c:96
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition: callerid.h:329
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:294
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298

◆ 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
Returns
Nothing

Definition at line 1674 of file channel.c.

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

1675 {
1676  if (dest == src) {
1677  /* Don't set to self */
1678  return;
1679  }
1680 
1681  if (src->str && src->str != dest->str) {
1682  ast_free(dest->str);
1683  dest->str = ast_strdup(src->str);
1684  }
1685 
1686  dest->plan = src->plan;
1687  dest->presentation = src->presentation;
1688  dest->valid = src->valid;
1689 }
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:296
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:294
#define ast_free(a)
Definition: astmm.h:182
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298

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

Definition at line 1666 of file channel.c.

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

1667 {
1668  init->str = NULL;
1669  init->plan = guide->plan;
1670  init->presentation = guide->presentation;
1671  init->valid = guide->valid;
1672 }
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:296
#define NULL
Definition: resample.c:96
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:294
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298

◆ 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
Returns
Nothing

Definition at line 2135 of file channel.c.

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_macro(), ast_channel_redirecting_sub(), ast_unreal_call_setup(), begin_dial_prerun(), call_forward_inherit(), cb_events(), dial_exec_full(), do_forward(), misdn_facility_ie_handler(), ring_entry(), and wait_for_answer().

2136 {
2137  if (dest == src) {
2138  /* Don't copy to self */
2139  return;
2140  }
2141 
2142  ast_party_id_copy(&dest->orig, &src->orig);
2143  ast_party_id_copy(&dest->from, &src->from);
2144  ast_party_id_copy(&dest->to, &src->to);
2145  ast_party_id_copy(&dest->priv_orig, &src->priv_orig);
2146  ast_party_id_copy(&dest->priv_from, &src->priv_from);
2147  ast_party_id_copy(&dest->priv_to, &src->priv_to);
2150  dest->count = src->count;
2151 }
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation. ...
Definition: channel.h:540
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:534
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
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:537
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition: channel.c:1765
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward) ...
Definition: channel.h:525
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:546
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:543
void ast_party_redirecting_reason_copy(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Copy the source redirecting reason information to the destination redirecting reason.
Definition: channel.c:2085
int count
Number of times the call was redirected.
Definition: channel.h:549
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:531

◆ ast_party_redirecting_free()

void ast_party_redirecting_free ( struct ast_party_redirecting doomed)

Destroy the redirecting information contents.

Since
1.8
Parameters
doomedThe redirecting information to destroy.
Returns
Nothing

Definition at line 2179 of file channel.c.

References ast_party_id_free(), ast_party_redirecting_reason_free(), 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_destructor(), ast_channel_redirecting_macro(), ast_channel_redirecting_sub(), ast_dummy_channel_destructor(), call_forward_inherit(), cb_events(), do_forward(), handle_request_invite(), handle_request_refer(), handle_response(), handle_response_invite(), indicate_redirecting(), misdn_facility_ie_handler(), redirecting_write(), set_redirecting(), and wait_for_answer().

2180 {
2181  ast_party_id_free(&doomed->orig);
2182  ast_party_id_free(&doomed->from);
2183  ast_party_id_free(&doomed->to);
2184  ast_party_id_free(&doomed->priv_orig);
2185  ast_party_id_free(&doomed->priv_from);
2186  ast_party_id_free(&doomed->priv_to);
2189 }
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation. ...
Definition: channel.h:540
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:534
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
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:537
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1811
void ast_party_redirecting_reason_free(struct ast_party_redirecting_reason *doomed)
Destroy the redirecting reason contents.
Definition: channel.c:2116
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward) ...
Definition: channel.h:525
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:546
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:543
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:531

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

Definition at line 2122 of file channel.c.

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_macro(), ast_channel_redirecting_sub(), call_forward_inherit(), cb_events(), do_forward(), handle_request_invite(), handle_request_refer(), handle_response(), handle_response_invite(), misdn_facility_ie_handler(), set_redirecting(), and wait_for_answer().

2123 {
2124  ast_party_id_init(&init->orig);
2125  ast_party_id_init(&init->from);
2126  ast_party_id_init(&init->to);
2127  ast_party_id_init(&init->priv_orig);
2128  ast_party_id_init(&init->priv_from);
2129  ast_party_id_init(&init->priv_to);
2132  init->count = 0;
2133 }
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation. ...
Definition: channel.h:540
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:534
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
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:537
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward) ...
Definition: channel.h:525
void ast_party_redirecting_reason_init(struct ast_party_redirecting_reason *init)
Initialize the given redirecting reason structure.
Definition: channel.c:2079
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:546
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:543
int count
Number of times the call was redirected.
Definition: channel.h:549
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:531
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1757

◆ 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
Returns
Nothing

Definition at line 2085 of file channel.c.

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

Referenced by ast_party_redirecting_copy().

2086 {
2087  if (dest == src) {
2088  return;
2089  }
2090 
2091  ast_free(dest->str);
2092  dest->str = ast_strdup(src->str);
2093  dest->code = src->code;
2094 }
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:511
char * str
a string value for the redirecting reason
Definition: channel.h:508
#define ast_free(a)
Definition: astmm.h:182

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

Definition at line 2116 of file channel.c.

References ast_free, and ast_party_redirecting_reason::str.

Referenced by ast_party_redirecting_free().

2117 {
2118  ast_free(doomed->str);
2119 }
char * str
a string value for the redirecting reason
Definition: channel.h:508
#define ast_free(a)
Definition: astmm.h:182

◆ 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
Returns
Nothing

Definition at line 2079 of file channel.c.

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

Referenced by ast_party_redirecting_init().

2080 {
2081  init->str = NULL;
2083 }
#define NULL
Definition: resample.c:96
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:511
char * str
a string value for the redirecting reason
Definition: channel.h:508

◆ 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
Returns
Nothing

Definition at line 2102 of file channel.c.

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

Referenced by ast_party_redirecting_set().

2103 {
2104  if (dest == src) {
2105  return;
2106  }
2107 
2108  if (src->str && src->str != dest->str) {
2109  ast_free(dest->str);
2110  dest->str = ast_strdup(src->str);
2111  }
2112 
2113  dest->code = src->code;
2114 }
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:511
char * str
a string value for the redirecting reason
Definition: channel.h:508
#define ast_free(a)
Definition: astmm.h:182

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

Definition at line 2096 of file channel.c.

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

Referenced by ast_party_redirecting_set_init().

2097 {
2098  init->str = NULL;
2099  init->code = guide->code;
2100 }
#define NULL
Definition: resample.c:96
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:511
char * str
a string value for the redirecting reason
Definition: channel.h:508

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

Definition at line 2166 of file channel.c.

References ast_party_id_set(), ast_party_redirecting_reason_set(), ast_party_redirecting::count, ast_party_redirecting::from, ast_set_party_redirecting::from, NULL, ast_party_redirecting::orig, ast_set_party_redirecting::orig, ast_party_redirecting::orig_reason, ast_party_redirecting::priv_from, ast_set_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_set_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_set_party_redirecting::priv_to, ast_party_redirecting::reason, ast_party_redirecting::to, and ast_set_party_redirecting::to.

Referenced by ast_channel_set_redirecting().

2167 {
2168  ast_party_id_set(&dest->orig, &src->orig, update ? &update->orig : NULL);
2169  ast_party_id_set(&dest->from, &src->from, update ? &update->from : NULL);
2170  ast_party_id_set(&dest->to, &src->to, update ? &update->to : NULL);
2171  ast_party_id_set(&dest->priv_orig, &src->priv_orig, update ? &update->priv_orig : NULL);
2172  ast_party_id_set(&dest->priv_from, &src->priv_from, update ? &update->priv_from : NULL);
2173  ast_party_id_set(&dest->priv_to, &src->priv_to, update ? &update->priv_to : NULL);
2176  dest->count = src->count;
2177 }
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation. ...
Definition: channel.h:540
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:534
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
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:537
struct ast_set_party_id priv_orig
Definition: channel.h:564
#define NULL
Definition: resample.c:96
void ast_party_redirecting_reason_set(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Set the redirecting reason information based on another redirecting reason source.
Definition: channel.c:2102
struct ast_set_party_id from
Definition: channel.h:560
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward) ...
Definition: channel.h:525
void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
Set the source party id information into the destination party id.
Definition: channel.c:1788
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:546
struct ast_set_party_id priv_from
Definition: channel.h:566
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:543
struct ast_set_party_id orig
Definition: channel.h:558
struct ast_set_party_id to
Definition: channel.h:562
int count
Number of times the call was redirected.
Definition: channel.h:549
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:531
struct ast_set_party_id priv_to
Definition: channel.h:568

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

Definition at line 2153 of file channel.c.

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 handle_response_invite(), indicate_redirecting(), misdn_copy_redirecting_to_ast(), and redirecting_write().

2154 {
2155  ast_party_id_set_init(&init->orig, &guide->orig);
2156  ast_party_id_set_init(&init->from, &guide->from);
2157  ast_party_id_set_init(&init->to, &guide->to);
2158  ast_party_id_set_init(&init->priv_orig, &guide->priv_orig);
2159  ast_party_id_set_init(&init->priv_from, &guide->priv_from);
2160  ast_party_id_set_init(&init->priv_to, &guide->priv_to);
2163  init->count = guide->count;
2164 }
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation. ...
Definition: channel.h:540
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:534
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
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:537
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward) ...
Definition: channel.h:525
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:546
void ast_party_redirecting_reason_set_init(struct ast_party_redirecting_reason *init, const struct ast_party_redirecting_reason *guide)
Initialize the given redirecting reason structure using the given guide for a set update operation...
Definition: channel.c:2096
void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
Initialize the given party id structure using the given guide for a set update operation.
Definition: channel.c:1780
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:543
int count
Number of times the call was redirected.
Definition: channel.h:549
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:531

◆ 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
Returns
Nothing

Definition at line 1705 of file channel.c.

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

1706 {
1707  if (dest == src) {
1708  /* Don't copy to self */
1709  return;
1710  }
1711 
1712  ast_free(dest->str);
1713  dest->str = ast_strdup(src->str);
1714  dest->type = src->type;
1716  dest->valid = src->valid;
1717 }
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:329
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
char * str
Malloced subaddress string.
Definition: channel.h:314
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:327
#define ast_free(a)
Definition: astmm.h:182
int type
Q.931 subaddress type.
Definition: channel.h:321

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

Definition at line 1744 of file channel.c.

References ast_free, NULL, and ast_party_subaddress::str.

Referenced by ast_party_dialed_free(), and ast_party_id_free().

1745 {
1746  ast_free(doomed->str);
1747  doomed->str = NULL;
1748 }
char * str
Malloced subaddress string.
Definition: channel.h:314
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182

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

Definition at line 1697 of file channel.c.

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

1698 {
1699  init->str = NULL;
1700  init->type = 0;
1701  init->odd_even_indicator = 0;
1702  init->valid = 0;
1703 }
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:329
char * str
Malloced subaddress string.
Definition: channel.h:314
#define NULL
Definition: resample.c:96
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:327
int type
Q.931 subaddress type.
Definition: channel.h:321

◆ 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
Returns
Nothing

Definition at line 1727 of file channel.c.

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

1728 {
1729  if (dest == src) {
1730  /* Don't set to self */
1731  return;
1732  }
1733 
1734  if (src->str && src->str != dest->str) {
1735  ast_free(dest->str);
1736  dest->str = ast_strdup(src->str);
1737  }
1738 
1739  dest->type = src->type;
1741  dest->valid = src->valid;
1742 }
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:329
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
char * str
Malloced subaddress string.
Definition: channel.h:314
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:327
#define ast_free(a)
Definition: astmm.h:182
int type
Q.931 subaddress type.
Definition: channel.h:321

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

Definition at line 1719 of file channel.c.

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

1720 {
1721  init->str = NULL;
1722  init->type = guide->type;
1723  init->odd_even_indicator = guide->odd_even_indicator;
1724  init->valid = guide->valid;
1725 }
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:329
char * str
Malloced subaddress string.
Definition: channel.h:314
#define NULL
Definition: resample.c:96
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:327
int type
Q.931 subaddress type.
Definition: channel.h:321

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

References ast_app_exec_sub(), ast_channel_lock, ast_channel_tech(), ast_channel_unlock, chanlist::chan, NULL, and ast_channel_tech::pre_call.

Referenced by begin_dial_prerun(), dial_exec_full(), findmeexec(), and ring_entry().

6537 {
6538  int (*pre_call)(struct ast_channel *chan, const char *sub_args);
6539 
6540  ast_channel_lock(chan);
6541  pre_call = ast_channel_tech(chan)->pre_call;
6542  if (pre_call) {
6543  int res;
6544 
6545  res = pre_call(chan, sub_args);
6546  ast_channel_unlock(chan);
6547  return res;
6548  }
6549  ast_channel_unlock(chan);
6550  return ast_app_exec_sub(NULL, chan, sub_args, 0);
6551 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
#define NULL
Definition: resample.c:96
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:842
#define ast_channel_unlock(chan)
Definition: channel.h:2946
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:370
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

References buf, and first.

Referenced by _sip_show_peer(), _skinny_show_line(), callgroup_to_str(), func_channel_read(), function_sippeer(), misdn_cfg_get_config_string(), pickupgroup_to_str(), print_group(), read_config(), and serialize_showchan().

8134 {
8135  unsigned int i;
8136  int first = 1;
8137  char num[3];
8138 
8139  buf[0] = '\0';
8140 
8141  if (!group) /* Return empty string if no group */
8142  return buf;
8143 
8144  for (i = 0; i <= 63; i++) { /* Max group is 63 */
8145  if (group & ((ast_group_t) 1 << i)) {
8146  if (!first) {
8147  strncat(buf, ", ", buflen - strlen(buf) - 1);
8148  } else {
8149  first = 0;
8150  }
8151  snprintf(num, sizeof(num), "%u", i);
8152  strncat(buf, num, buflen - strlen(buf) - 1);
8153  }
8154  }
8155  return buf;
8156 }
unsigned long long ast_group_t
Definition: channel.h:214
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092

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

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_str_append(), ast_str_buffer(), first, and namedgroup_member::name.

Referenced by _sip_show_peer(), _skinny_show_line(), func_channel_read(), function_sippeer(), misdn_cfg_get_config_string(), named_callgroups_to_str(), named_pickupgroups_to_str(), print_named_groups(), and read_config().

8159 {
8160  struct ao2_container *grp = (struct ao2_container *) group;
8161  struct namedgroup_member *ng;
8162  int first = 1;
8163  struct ao2_iterator it;
8164 
8165  if (!grp) {
8166  return ast_str_buffer(*buf);
8167  }
8168 
8169  for (it = ao2_iterator_init(grp, 0); (ng = ao2_iterator_next(&it)); ao2_ref(ng, -1)) {
8170  if (!first) {
8171  ast_str_append(buf, 0, ", ");
8172  } else {
8173  first = 0;
8174  }
8175  ast_str_append(buf, 0, "%s", ng->name);
8176  }
8177  ao2_iterator_destroy(&it);
8178 
8179  return ast_str_buffer(*buf);
8180 }
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
Named group member structure.
Definition: channel.c:7751
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:1091
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct sla_ringing_trunk * first
Definition: app_meetme.c:1092
#define ao2_iterator_next(iter)
Definition: astobj2.h:1933
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1841
Generic container type.
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.

◆ ast_prod()

int ast_prod ( struct ast_channel chan)

Send empty audio to prime a channel driver.

Definition at line 5045 of file channel.c.

References ast_channel_name(), ast_channel_rawwriteformat(), ast_debug, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log, AST_STATE_UP, ast_write(), ast_frame::data, ast_frame_subclass::format, LOG_WARNING, ast_frame::ptr, ast_frame::src, and ast_frame::subclass.

Referenced by ast_activate_generator().

5046 {
5047  struct ast_frame a = { AST_FRAME_VOICE };
5048  char nothing[128];
5049 
5050  /* Send an empty audio frame to get things moving */
5051  if (ast_channel_state(chan) != AST_STATE_UP) {
5052  ast_debug(1, "Prodding channel '%s'\n", ast_channel_name(chan));
5054  a.data.ptr = nothing + AST_FRIENDLY_OFFSET;
5055  a.src = "ast_prod"; /* this better match check in ast_write */
5056  if (ast_write(chan, &a))
5057  ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", ast_channel_name(chan));
5058  }
5059  return 0;
5060 }
#define LOG_WARNING
Definition: logger.h:274
ast_channel_state
ast_channel states
Definition: channelstate.h:35
struct ast_frame_subclass subclass
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
#define AST_FRIENDLY_OFFSET
Offset into a frame&#39;s data buffer.
const char * src
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:5189
const char * ast_channel_name(const struct ast_channel *chan)
Data structure associated with a single frame of data.
union ast_frame::@263 data
struct ast_format * format
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)
static struct test_val a

◆ ast_queue_answer()

int ast_queue_answer ( struct ast_channel chan,
const struct ast_stream_topology topology 
)

Queue an ANSWER control frame with topology.

Parameters
chanchannel to queue frame onto
topologytopology to be passed through the core to the peer channel
Return values
0success
non-zerofailure

Definition at line 1246 of file channel.c.

References AST_CONTROL_ANSWER, AST_FRAME_CONTROL, and ast_queue_frame().

1247 {
1248  struct ast_frame f = {
1250  .subclass.integer = AST_CONTROL_ANSWER,
1251  .subclass.topology = (struct ast_stream_topology *)topology,
1252  };
1253  return ast_queue_frame(chan, &f);
1254 }
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
Data structure associated with a single frame of data.

◆ ast_queue_control()

int ast_queue_control ( struct ast_channel chan,
enum ast_control_frame_type  control 
)

Queue a control frame.

Queue a control frame without payload.

Definition at line 1231 of file channel.c.

References AST_FRAME_CONTROL, and ast_queue_frame().

Referenced by __analog_handle_event(), __ast_read(), analog_call(), analog_exception(), analog_hangup(), apply_negotiated_sdp_stream(), ast_do_pickup(), attempt_transfer(), audiosocket_call(), auto_congest(), cb_events(), chan_pjsip_incoming_ack(), chan_pjsip_incoming_response(), cli_console_answer(), cli_console_flash(), console_answer(), console_call(), console_sendtext(), controlplayback_manager(), handle_call_incoming(), handle_incoming(), handle_request_info(), handle_request_invite(), handle_response(), handle_response_invite(), handle_response_refer(), jingle_action_session_accept(), jingle_action_session_info(), jingle_outgoing_hook(), mbl_queue_control(), misdn_facility_ie_handler(), nbs_call(), on_topology_change_response(), onAlerting(), onCallEstablished(), onProgress(), pbx_outgoing_state_callback(), phone_call(), rtp_call(), send_cause2ast(), setsubstate(), skinny_call(), skinny_cfwd_cb(), skinny_transfer_attended(), skinny_transfer_blind(), stasis_app_control_queue_control(), unistim_call(), unreal_colp_stream_topology_request_change(), and video_info_incoming_request().

1232 {
1233  struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control };
1234  return ast_queue_frame(chan, &f);
1235 }
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
Data structure associated with a single frame of data.

◆ ast_queue_control_data()

int ast_queue_control_data ( struct ast_channel chan,
enum ast_control_frame_type  control,
const void *  data,
size_t  datalen 
)

Queue a control frame with payload.

Parameters
chanchannel to queue frame onto
controltype of control frame
datapointer to payload data to be included in frame
datalennumber of bytes of payload data
Return values
0success
non-zerofailure

The supplied payload data is copied into the frame, so the caller's copy is not modified nor freed, and the resulting frame will retain a copy of the data even if the caller frees their local copy.

Note
This method should be treated as a 'network transport'; in other words, your frames may be transferred across an IAX2 channel to another system, which may be a different endianness than yours. Because of this, you should ensure that either your frames will never be expected to work across systems, or that you always put your payload data into 'network byte order' before calling this function.
The channel does not need to be locked before calling this function.

Definition at line 1238 of file channel.c.

References AST_FRAME_CONTROL, and ast_queue_frame().

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(), change_t38_state(), close_udptl_connection(), fax_gateway_indicate_t38(), handle_clear_alarms(), handle_incoming(), handle_request_notify(), handle_response_refer(), iax2_transfer(), interpret_t38_parameters(), jingle_action_session_terminate(), onModeChanged(), ooh323_indicate(), queue_read_action_payload(), setup_udptl_connection(), sip_sipredirect(), socket_process_helper(), t38_change_state(), t38_framehook(), t38_interpret_parameters(), transfer_redirect(), transfer_refer(), and xfer_client_on_evsub_state().

1240 {
1241  struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control, .data.ptr = (void *) data, .datalen = datalen };
1242  return ast_queue_frame(chan, &f);
1243 }
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
Data structure associated with a single frame of data.
union ast_frame::@263 data

◆ ast_queue_frame()

int ast_queue_frame ( struct ast_channel chan,
struct ast_frame f 
)

Queue one or more frames to a channel's frame queue.

Parameters
chanthe channel to queue the frame(s) on
fthe frame(s) to queue. Note that the frame(s) will be duplicated by this function. It is the responsibility of the caller to handle freeing the memory associated with the frame(s) being passed if necessary.
Return values
0success
non-zerofailure

Definition at line 1139 of file channel.c.

References __ast_queue_frame(), and NULL.

Referenced by __ast_read(), action_atxfer(), action_cancel_atxfer(), alsa_call(), 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(), cb_events(), channel_do_masquerade(), cli_console_dial(), cli_console_sendtext(), conf_stop_record(), console_dial(), console_do_answer(), console_flash(), console_sendtext(), dahdi_queue_frame(), dahdi_read(), dictate_exec(), do_immediate_setup(), dtmf_info_incoming_request(), handle_incoming_request(), handle_keypad_button_message(), handle_negotiated_sdp(), handle_request_info(), handle_request_invite(), handle_response_invite(), iax2_queue_frame(), keypad_cfg_read(), load_stream_readqueue(), manager_play_dtmf(), mgcp_queue_frame(), ooh323_onReceivedDigit(), oss_call(), process_sdp(), queue_dtmf_readq(), receive_message(), set_interval_hook(), stream_monitor(), stream_periodic_frames(), t38_tx_packet_handler(), unistim_do_senddigit(), unreal_queue_frame(), and wakeup_sub().

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

◆ ast_queue_frame_head()

int ast_queue_frame_head ( struct ast_channel chan,
struct ast_frame f 
)

Queue one or more frames to the head of a channel's frame queue.

Parameters
chanthe channel to queue the frame(s) on
fthe frame(s) to queue. Note that the frame(s) will be duplicated by this function. It is the responsibility of the caller to handle freeing the memory associated with the frame(s) being passed if necessary.
Return values
0success
non-zerofailure

Definition at line 1144 of file channel.c.

References __ast_queue_frame(), and NULL.

Referenced by __ast_answer(), __ast_read(), ast_autoservice_stop(), bridge_channel_queue_deferred_frames(), and safe_sleep_conditional().

1145 {
1146  return __ast_queue_frame(chan, fin, 1, NULL);
1147 }
static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
Definition: channel.c:1015
#define NULL
Definition: resample.c:96

◆ ast_queue_hangup()

int ast_queue_hangup ( struct ast_channel chan)

Queue a hangup frame for channel.

Queue a hangup frame.

Definition at line 1150 of file channel.c.

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_macro(), ast_app_exec_sub(), ast_unreal_fixup(), call(), chan_pjsip_session_end(), cli_console_hangup(), close_call(), handle_request_bye(), iax2_destroy(), iax2_queue_hangup(), mbl_queue_hangup(), mgcp_queue_hangup(), refer_incoming_invite_request(), session_inv_on_media_update(), setsubstate(), and sip_queue_hangup_cause().

1151 {
1152  struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
1153  int res;
1154 
1155  /* Yeah, let's not change a lock-critical value without locking */
1156  ast_channel_lock(chan);
1159 
1160  res = ast_queue_frame(chan, &f);
1161  ast_channel_unlock(chan);
1162  return res;
1163 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define NULL
Definition: resample.c:96
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
#define ast_channel_unlock(chan)
Definition: channel.h:2946
Data structure associated with a single frame of data.
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
struct stasis_message_type * ast_channel_hangup_request_type(void)
Message type for when a hangup is requested on a channel.

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

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_log, ast_queue_frame(), AST_SOFTHANGUP_DEV, ast_frame::data, LOG_WARNING, NULL, RAII_VAR, and ast_frame::uint32.

Referenced by __analog_handle_event(), __sip_autodestruct(), ast_unreal_hangup(), chan_pjsip_session_end(), close_call(), close_client(), console_hangup(), dahdi_handle_event(), discard_call(), handle_call_outgoing(), handle_clear_alarms(), handle_request_bye(), handle_response(), handle_response_invite(), hangup_chan(), jingle_action_session_terminate(), jingle_queue_hangup_with_cause(), misdn_answer(), onCallCleared(), retrans_pkt(), sip_queue_hangup_cause(), and transfer_cancel_step2().

1167 {
1168  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
1169  struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
1170  int res;
1171 
1172  if (cause >= 0) {
1173  f.data.uint32 = cause;
1174  }
1175  ast_log(LOG_WARNING, "Queuing hangup with cause: %d !!!\n", cause);
1176  /* Yeah, let's not change a lock-critical value without locking */
1177  ast_channel_lock(chan);
1179  if (cause < 0) {
1181  }
1182  blob = ast_json_pack("{s: i}",
1183  "cause", cause);
1185 
1186  res = ast_queue_frame(chan, &f);
1187  ast_channel_unlock(chan);
1188  return res;
1189 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
#define LOG_WARNING
Definition: logger.h:274
#define NULL
Definition: resample.c:96
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
#define ast_log
Definition: astobj2.c:42
#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:911
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_channel_hangupcause(const struct ast_channel *chan)
Data structure associated with a single frame of data.
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
Abstract JSON element (object, array, string, int, ...).
union ast_frame::@263 data
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
struct stasis_message_type * ast_channel_hangup_request_type(void)
Message type for when a hangup is requested on a channel.

◆ ast_queue_hold()

int ast_queue_hold ( struct ast_channel chan,
const char *  musicclass 
)

Queue a hold frame.

Parameters
chanchannel to queue frame onto
musicclassThe suggested musicclass for the other end to use
Note
The channel does not need to be locked before calling this function.
Return values
zeroon success
non-zeroon failure

Definition at line 1191 of file channel.c.

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(), cb_events(), dahdi_handle_event(), dahdi_hangup(), handle_request(), iax2_queue_hold(), jingle_action_session_info(), process_sdp(), setsubstate(), sub_hold(), and transfer_call_step1().

1192 {
1193  struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HOLD };
1194  struct ast_json *blob = NULL;
1195  int res;
1196 
1197  if (!ast_strlen_zero(musicclass)) {
1198  f.data.ptr = (void *) musicclass;
1199  f.datalen = strlen(musicclass) + 1;
1200 
1201  blob = ast_json_pack("{s: s}",
1202  "musicclass", musicclass);
1203  }
1204 
1205  ast_channel_lock(chan);
1207  ast_channel_unlock(chan);
1208 
1209  res = ast_queue_frame(chan, &f);
1210 
1211  ast_json_unref(blob);
1212 
1213  return res;
1214 }
struct stasis_message_type * ast_channel_hold_type(void)
Message type for when a channel is placed on hold.
static char musicclass[MAX_MUSICCLASS]
Definition: chan_mgcp.c:162
#define ast_channel_lock(chan)
Definition: channel.h:2945
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
#define NULL
Definition: resample.c:96
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_channel_unlock(chan)
Definition: channel.h:2946
Data structure associated with a single frame of data.
Abstract JSON element (object, array, string, int, ...).
union ast_frame::@263 data
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.

◆ ast_queue_unhold()

int ast_queue_unhold ( struct ast_channel chan)

Queue an unhold frame.

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

Definition at line 1216 of file channel.c.

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(), attempt_transfer(), cb_events(), dahdi_handle_event(), dahdi_hangup(), handle_hd_hf(), handle_request(), handle_request_bye(), handle_request_invite(), iax2_queue_unhold(), jingle_action_session_info(), key_dial_page(), process_sdp(), session_inv_on_create_offer(), setsubstate(), sub_unhold(), transfer_cancel_step2(), and unistim_hangup().

1217 {
1218  struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_UNHOLD };
1219  int res;
1220 
1221  ast_channel_lock(chan);
1223  ast_channel_unlock(chan);
1224 
1225  res = ast_queue_frame(chan, &f);
1226 
1227  return res;
1228 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
struct stasis_message_type * ast_channel_unhold_type(void)
Message type for when a channel is removed from hold.
#define NULL
Definition: resample.c:96
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
#define ast_channel_unlock(chan)
Definition: channel.h:2946
Data structure associated with a single frame of data.
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.

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

References ast_raw_answer_with_stream_topology(), and NULL.

Referenced by __ast_answer(), app_control_answer(), handle_invite_replaces(), and refer_incoming_invite_request().

2700 {
2702 }
#define NULL
Definition: resample.c:96
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:2648

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

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

2649 {
2650  int res = 0;
2651  SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2652 
2653  ast_channel_lock(chan);
2654 
2655  /* You can't answer an outbound call */
2657  ast_channel_unlock(chan);
2658  return 0;
2659  }
2660 
2661  /* Stop if we're a zombie or need a soft hangup */
2663  ast_channel_unlock(chan);
2664  return -1;
2665  }
2666 
2667  /*
2668  * Mark when incoming channel answered so we can know how
2669  * long the channel has been up.
2670  */
2672 
2673  ast_channel_unlock(chan);
2674 
2675  switch (ast_channel_state(chan)) {
2676  case AST_STATE_RINGING:
2677  case AST_STATE_RING:
2678  ast_channel_lock(chan);
2679  if (ast_channel_tech(chan)->answer_with_stream_topology) {
2680  res = ast_channel_tech(chan)->answer_with_stream_topology(chan, topology);
2681 
2682  } else if (ast_channel_tech(chan)->answer) {
2683  res = ast_channel_tech(chan)->answer(chan);
2684  }
2685  ast_setstate(chan, AST_STATE_UP);
2686  ast_channel_unlock(chan);
2687  break;
2688  case AST_STATE_UP:
2689  break;
2690  default:
2691  break;
2692  }
2693 
2694  ast_indicate(chan, -1);
2695 
2696  return res;
2697 }
int(*const answer_with_stream_topology)(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer the channel with topology.
Definition: channel.h:721
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_test_flag(p, flag)
Definition: utils.h:63
int(*const answer)(struct ast_channel *chan)
Answer the channel.
Definition: channel.h:708
ast_channel_state
ast_channel states
Definition: channelstate.h:35
static void set_channel_answer_time(struct ast_channel *chan)
Definition: channel.c:2637
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition: channel.c:4322
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
static int answer(void *data)
Definition: chan_pjsip.c:682
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define SCOPE_TRACE(level,...)
Print a trace message with details when a scope is entered or existed.
Definition: logger.h:749
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
Change the state of a channel.
Definition: channel.c:7486

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

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(), destroy_all_channels(), dial_exec_full(), dictate_exec(), disa_exec(), disable_t38(), do_waiting(), echo_exec(), eivr_comm(), find_cache(), generic_fax_exec(), handle_recordfile(), handle_speechrecognize(), iax2_key_rotate(), ices_exec(), isAnsweringMachine(), jack_exec(), measurenoise(), misdn_write(), moh_channel_thread(), monitor_dial(), mp3_exec(), NBScat_exec(), read_from_chan(), read_mf_digits(), read_sf_digits(), receive_dtmf_digits(), receivefax_t38_init(), record_exec(), recordthread(), run_agi(), safe_sleep_conditional(), send_waveform_to_channel(), sendfax_t38_init(), sendurl_exec(), sms_exec(), speech_background(), stasis_app_exec(), transmit_audio(), transmit_t38(), wait_exec(), wait_for_answer(), wait_for_hangup(), wait_for_winner(), waitforring_exec(), and waitstream_core().

4303 {
4304  return __ast_read(chan, 0, 1);
4305 }
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition: channel.c:3529

◆ ast_read_generator_actions()

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

Definition at line 3416 of file channel.c.

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, generator, NULL, ast_frame::samples, and ast_frame::subclass.

Referenced by __ast_read().

3417 {
3418  struct ast_generator *generator;
3419  void *gendata;
3420  int res;
3421  int samples;
3422 
3423  generator = ast_channel_generator(chan);
3424  if (!generator
3425  || !generator->generate
3426  || f->frametype != AST_FRAME_VOICE
3427  || !ast_channel_generatordata(chan)
3428  || ast_channel_timingfunc(chan)) {
3429  return;
3430  }
3431 
3432  /*
3433  * We must generate frames in phase locked mode since
3434  * we have no internal timer available.
3435  */
3437  float factor;
3439  samples = (int) (((float) f->samples) * factor);
3440  } else {
3441  samples = f->samples;
3442  }
3443 
3444  gendata = ast_channel_generatordata(chan);
3445  ast_channel_generatordata_set(chan, NULL); /* reset, to let writes go through */
3446 
3447  /*
3448  * This unlock is here based on two assumptions that hold true at
3449  * this point in the code. 1) this function is only called from
3450  * within __ast_read() and 2) all generators call ast_write() in
3451  * their generate callback.
3452  *
3453  * The reason this is added is so that when ast_write is called,
3454  * the lock that occurs there will not recursively lock the
3455  * channel. Doing this will allow deadlock avoidance to work in
3456  * deeper functions.
3457  */
3458  ast_channel_unlock(chan);
3459  res = generator->generate(chan, gendata, f->datalen, samples);
3460  ast_channel_lock(chan);
3461  if (generator == ast_channel_generator(chan)) {
3462  ast_channel_generatordata_set(chan, gendata);
3463  if (res) {
3464  ast_debug(1, "Auto-deactivating generator\n");
3466  }
3467  }
3468 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
void * ast_channel_generatordata(const struct ast_channel *chan)
int(* generate)(struct ast_channel *chan, void *data, int len, int samples)
Definition: channel.h:234
#define NULL
Definition: resample.c:96
struct ast_frame_subclass subclass
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
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
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
static struct ast_generator generator
Definition: app_fax.c:359
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2902
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
enum ast_frame_type frametype
struct ast_format * format
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan)

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

References __ast_read().

Referenced by ast_control_tone(), and conf_run().

4313 {
4314  return __ast_read(chan, 1, 1);
4315 }
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition: channel.c:3529

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

References __ast_read().

Referenced by AST_TEST_DEFINE(), bridge_handle_trip(), read_from_chan(), and stream_echo_perform().

4308 {
4309  return __ast_read(chan, 0, 0);
4310 }
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition: channel.c:3529

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

References __ast_read().

Referenced by bridge_handle_trip().

4318 {
4319  return __ast_read(chan, 1, 0);
4320 }
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition: channel.c:3529

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

References ast_readstring_full().

Referenced by __adsi_transmit_messages(), adsi_begin_download(), adsi_get_cpeinfo(), adsi_load_session(), app_exec(), ast_app_getdata(), dialout(), do_directory(), forward_message(), privacy_exec(), vm_authenticate(), vm_newuser_setup(), and vm_options().

6656 {
6657  return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
6658 }
static int timeout
Definition: cdr_mysql.c:86
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:6660
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)

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

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(), d, NULL, and timeout.

Referenced by ast_app_getdata_full(), and ast_readstring().

6661 {
6662  int pos = 0; /* index in the buffer where we accumulate digits */
6663  int to = ftimeout;
6664 
6665  struct ast_silence_generator *silgen = NULL;
6666 
6667  /* Stop if we're a zombie or need a soft hangup */
6669  return -1;
6670  if (!len)
6671  return -1;
6672  for (;;) {
6673  int d;
6674  if (ast_channel_stream(c)) {
6675  d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
6676  ast_stopstream(c);
6677  if (!silgen && ast_opt_transmit_silence)
6679  usleep(1000);
6680  if (!d)
6681  d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6682  } else {
6683  if (!silgen && ast_opt_transmit_silence)
6685  d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6686  }
6687  if (d < 0) {
6689  return AST_GETDATA_FAILED;
6690  }
6691  if (d == 0) {
6692  s[pos] = '\0';
6694  return AST_GETDATA_TIMEOUT;
6695  }
6696  if (d == 1) {
6697  s[pos] = '\0';
6699  return AST_GETDATA_INTERRUPTED;
6700  }
6701  if (strchr(enders, d) && (pos == 0)) {
6702  s[pos] = '\0';
6705  }
6706  if (!strchr(enders, d)) {
6707  s[pos++] = d;
6708  }
6709  if (strchr(enders, d) || (pos >= len)) {
6710  s[pos] = '\0';
6712  return AST_GETDATA_COMPLETE;
6713  }
6714  to = timeout;
6715  }
6716  /* Never reached */
6717  return 0;
6718 }
#define AST_DIGIT_ANY
Definition: file.h:48
#define ast_test_flag(p, flag)
Definition: utils.h:63
struct ast_silence_generator * ast_channel_start_silence_generator(struct ast_channel *chan)
Starts a silence generator on the given channel.
Definition: channel.c:8266
static struct test_val d
static int timeout
Definition: cdr_mysql.c:86
#define ast_opt_transmit_silence
Definition: options.h:124
#define NULL
Definition: resample.c:96
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
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:8312
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:3248
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
struct ast_filestream * ast_channel_stream(const struct ast_channel *chan)
int ast_waitstream_full(struct ast_channel *c, const char *breakon, int audiofd, int monfd)
Definition: file.c:1785
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
int ast_stopstream(struct ast_channel *c)
Stops a stream.
Definition: file.c:187

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

References ast_free, ast_recvtext(), buf, c, and NULL.

Referenced by handle_recvchar().

4752 {
4753  int c;
4754  char *buf = ast_recvtext(chan, timeout);
4755  if (buf == NULL)
4756  return -1; /* error or timeout */
4757  c = *(unsigned char *)buf;
4758  ast_free(buf);
4759  return c;
4760 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static int timeout
Definition: cdr_mysql.c:86
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:4762
static struct test_val c
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182

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

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

4763 {
4764  int res;
4765  char *buf = NULL;
4766  struct timeval start = ast_tvnow();
4767  int ms;
4768 
4769  while ((ms = ast_remaining_ms(start, timeout))) {
4770  struct ast_frame *f;
4771 
4772  if (ast_check_hangup(chan)) {
4773  break;
4774  }
4775  res = ast_waitfor(chan, ms);
4776  if (res <= 0) {/* timeout or error */
4777  break;
4778  }
4779  f = ast_read(chan);
4780  if (f == NULL) {
4781  break; /* no frame */
4782  }
4784  ast_frfree(f);
4785  break;
4786  } else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
4787  buf = ast_strndup((char *) f->data.ptr, f->datalen); /* dup and break */
4788  ast_frfree(f);
4789  break;
4790  }
4791  ast_frfree(f);
4792  }
4793  return buf;
4794 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static int timeout
Definition: cdr_mysql.c:86
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define NULL
Definition: resample.c:96
struct ast_frame_subclass subclass
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition: main/utils.c:2033
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4302
#define ast_strndup(str, len)
A wrapper for strndup()
Definition: astmm.h:258
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3171
#define ast_frfree(fr)
Data structure associated with a single frame of data.
union ast_frame::@263 data
enum ast_frame_type frametype

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

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, ast_set_party_redirecting::from, LOG_WARNING, ast_party_id_ies::name, NULL, ast_party_redirecting::orig, ast_set_party_redirecting::orig, ast_party_redirecting::orig_reason, party_id_build_data(), ast_party_redirecting::priv_from, ast_set_party_redirecting::priv_from, ast_party_redirecting::priv_orig, ast_set_party_redirecting::priv_orig, ast_party_redirecting::priv_to, ast_set_party_redirecting::priv_to, ast_party_redirecting::reason, redirecting_reason_build_data(), ast_party_name_ies::str, ast_party_redirecting::to, ast_set_party_redirecting::to, and value.

Referenced by ast_channel_queue_redirecting_update(), ast_channel_update_redirecting(), and unreal_colp_redirect_indicate().

9364 {
9365  int32_t value;
9366  size_t pos = 0;
9367  int res;
9368 
9369  static const struct ast_party_id_ies orig_ies = {
9371  .name.char_set = AST_REDIRECTING_ORIG_NAME_CHAR_SET,
9372  .name.presentation = AST_REDIRECTING_ORIG_NAME_PRESENTATION,
9373  .name.valid = AST_REDIRECTING_ORIG_NAME_VALID,
9374 
9375  .number.str = AST_REDIRECTING_ORIG_NUMBER,
9376  .number.plan = AST_REDIRECTING_ORIG_NUMBER_PLAN,
9377  .number.presentation = AST_REDIRECTING_ORIG_NUMBER_PRESENTATION,
9378  .number.valid = AST_REDIRECTING_ORIG_NUMBER_VALID,
9379 
9380  .subaddress.str = AST_REDIRECTING_ORIG_SUBADDRESS,
9381  .subaddress.type = AST_REDIRECTING_ORIG_SUBADDRESS_TYPE,
9382  .subaddress.odd_even_indicator = AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN,
9383  .subaddress.valid = AST_REDIRECTING_ORIG_SUBADDRESS_VALID,
9384 
9385  .tag = AST_REDIRECTING_ORIG_TAG,
9386  .combined_presentation = 0,/* Not sent. */
9387  };
9388  static const struct ast_party_id_ies from_ies = {
9390  .name.char_set = AST_REDIRECTING_FROM_NAME_CHAR_SET,
9391  .name.presentation = AST_REDIRECTING_FROM_NAME_PRESENTATION,
9392  .name.valid = AST_REDIRECTING_FROM_NAME_VALID,
9393 
9394  .number.str = AST_REDIRECTING_FROM_NUMBER,
9395  .number.plan = AST_REDIRECTING_FROM_NUMBER_PLAN,
9396  .number.presentation = AST_REDIRECTING_FROM_NUMBER_PRESENTATION,
9397  .number.valid = AST_REDIRECTING_FROM_NUMBER_VALID,
9398 
9399  .subaddress.str = AST_REDIRECTING_FROM_SUBADDRESS,
9400  .subaddress.type = AST_REDIRECTING_FROM_SUBADDRESS_TYPE,
9401  .subaddress.odd_even_indicator = AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN,
9402  .subaddress.valid = AST_REDIRECTING_FROM_SUBADDRESS_VALID,
9403 
9404  .tag = AST_REDIRECTING_FROM_TAG,
9405  .combined_presentation = AST_REDIRECTING_FROM_ID_PRESENTATION,
9406  };
9407  static const struct ast_party_id_ies to_ies = {
9409  .name.char_set = AST_REDIRECTING_TO_NAME_CHAR_SET,
9410  .name.presentation = AST_REDIRECTING_TO_NAME_PRESENTATION,
9411  .name.valid = AST_REDIRECTING_TO_NAME_VALID,
9412 
9413  .number.str = AST_REDIRECTING_TO_NUMBER,
9414  .number.plan = AST_REDIRECTING_TO_NUMBER_PLAN,
9415  .number.presentation = AST_REDIRECTING_TO_NUMBER_PRESENTATION,
9416  .number.valid = AST_REDIRECTING_TO_NUMBER_VALID,
9417 
9418  .subaddress.str = AST_REDIRECTING_TO_SUBADDRESS,
9419  .subaddress.type = AST_REDIRECTING_TO_SUBADDRESS_TYPE,
9420  .subaddress.odd_even_indicator = AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN,
9421  .subaddress.valid = AST_REDIRECTING_TO_SUBADDRESS_VALID,
9422 
9423  .tag = AST_REDIRECTING_TO_TAG,
9424  .combined_presentation = AST_REDIRECTING_TO_ID_PRESENTATION,
9425  };
9426  static const struct ast_party_id_ies priv_orig_ies = {
9428  .name.char_set = AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET,
9429  .name.presentation = AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION,
9431 
9432  .number.str = AST_REDIRECTING_PRIV_ORIG_NUMBER,
9434  .number.presentation = AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION,
9436 
9437  .subaddress.str = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS,
9438  .subaddress.type = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE,
9439  .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN,
9440  .subaddress.valid = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID,
9441 
9443  .combined_presentation = 0,/* Not sent. */
9444  };
9445  static const struct ast_party_id_ies priv_from_ies = {
9447  .name.char_set = AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET,
9448  .name.presentation = AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION,
9450 
9451  .number.str = AST_REDIRECTING_PRIV_FROM_NUMBER,
9453  .number.presentation = AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION,
9455 
9456  .subaddress.str = AST_REDIRECTING_PRIV_FROM_SUBADDRESS,
9457  .subaddress.type = AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE,
9458  .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN,
9459  .subaddress.valid = AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID,
9460 
9462  .combined_presentation = 0,/* Not sent. */
9463  };
9464  static const struct ast_party_id_ies priv_to_ies = {
9466  .name.char_set = AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET,
9467  .name.presentation = AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION,
9468  .name.valid = AST_REDIRECTING_PRIV_TO_NAME_VALID,
9469 
9470  .number.str = AST_REDIRECTING_PRIV_TO_NUMBER,
9471  .number.plan = AST_REDIRECTING_PRIV_TO_NUMBER_PLAN,
9472  .number.presentation = AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION,
9473  .number.valid = AST_REDIRECTING_PRIV_TO_NUMBER_VALID,
9474 
9475  .subaddress.str = AST_REDIRECTING_PRIV_TO_SUBADDRESS,
9476  .subaddress.type = AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE,
9477  .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN,
9478  .subaddress.valid = AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID,
9479 
9481  .combined_presentation = 0,/* Not sent. */
9482  };
9483  static const struct ast_party_redirecting_reason_ies reason_ies = {
9486  };
9487 
9488  static const struct ast_party_redirecting_reason_ies orig_reason_ies = {
9491  };
9492 
9493  /* Redirecting frame version */
9494  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
9495  ast_log(LOG_WARNING, "No space left for redirecting frame version\n");
9496  return -1;
9497  }
9498  data[pos++] = AST_REDIRECTING_VERSION;
9499  data[pos++] = 1;
9500  data[pos++] = 2;/* Version 1 did not have a version ie */
9501 
9502  res = party_id_build_data(data + pos, datalen - pos, &redirecting->orig,
9503  "redirecting-orig", &orig_ies, update ? &update->orig : NULL);
9504  if (res < 0) {
9505  return -1;
9506  }
9507  pos += res;
9508 
9509  res = party_id_build_data(data + pos, datalen - pos, &redirecting->from,
9510  "redirecting-from", &from_ies, update ? &update->from : NULL);
9511  if (res < 0) {
9512  return -1;
9513  }
9514  pos += res;
9515 
9516  res = party_id_build_data(data + pos, datalen - pos, &redirecting->to,
9517  "redirecting-to", &to_ies, update ? &update->to : NULL);
9518  if (res < 0) {
9519  return -1;
9520  }
9521  pos += res;
9522 
9523  res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_orig,
9524  "redirecting-priv-orig", &priv_orig_ies, update ? &update->priv_orig : NULL);
9525  if (res < 0) {
9526  return -1;
9527  }
9528  pos += res;
9529 
9530  res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_from,
9531  "redirecting-priv-from", &priv_from_ies, update ? &update->priv_from : NULL);
9532  if (res < 0) {
9533  return -1;
9534  }
9535  pos += res;
9536 
9537  res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_to,
9538  "redirecting-priv-to", &priv_to_ies, update ? &update->priv_to : NULL);
9539  if (res < 0) {
9540  return -1;
9541  }
9542  pos += res;
9543 
9544  /* Redirecting reason */
9545  res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->reason,
9546  "redirecting-reason", &reason_ies);
9547  if (res < 0) {
9548  return -1;
9549  }
9550  pos += res;
9551 
9552  /* Redirecting original reason */
9553  res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->orig_reason,
9554  "redirecting-orig-reason", &orig_reason_ies);
9555  if (res < 0) {
9556  return -1;
9557  }
9558  pos += res;
9559 
9560  /* Redirecting count */
9561  if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9562  ast_log(LOG_WARNING, "No space left for redirecting count\n");
9563  return -1;
9564  }
9565  data[pos++] = AST_REDIRECTING_COUNT;
9566  data[pos++] = sizeof(value);
9567  value = htonl(redirecting->count);
9568  memcpy(data + pos, &value, sizeof(value));
9569  pos += sizeof(value);
9570 
9571  return pos;
9572 }
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation. ...
Definition: channel.h:540
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:534
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
#define LOG_WARNING
Definition: logger.h:274
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:537
struct ast_set_party_id priv_orig
Definition: channel.h:564
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
struct ast_party_name_ies name
Subscriber name ies.
Definition: channel.c:8644
struct ast_set_party_id from
Definition: channel.h:560
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward) ...
Definition: channel.h:525
#define ast_log
Definition: astobj2.c:42
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:9330
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:546
struct ast_set_party_id priv_from
Definition: channel.h:566
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:8673
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:543
struct ast_set_party_id orig
Definition: channel.h:558
struct ast_set_party_id to
Definition: channel.h:562
int count
Number of times the call was redirected.
Definition: channel.h:549
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:531
struct ast_set_party_id priv_to
Definition: channel.h:568
int int32_t
Definition: db.h:60
int str
Subscriber name ie.
Definition: channel.c:8421

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

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_macro(), ast_channel_redirecting_sub(), and indicate_redirecting().

9575 {
9576  size_t pos;
9577  unsigned char ie_len;
9578  unsigned char ie_id;
9579  int32_t value;
9580  int frame_version = 1;
9581  int from_combined_presentation = 0;
9582  int got_from_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9583  int to_combined_presentation = 0;
9584  int got_to_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9585 
9586  for (pos = 0; pos < datalen; pos += ie_len) {
9587  if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
9588  ast_log(LOG_WARNING, "Invalid redirecting update\n");
9589  return -1;
9590  }
9591  ie_id = data[pos++];
9592  ie_len = data[pos++];
9593  if (datalen < pos + ie_len) {
9594  ast_log(LOG_WARNING, "Invalid redirecting update\n");
9595  return -1;
9596  }
9597 
9598  switch (ie_id) {
9599 /* Redirecting frame version */
9601  if (ie_len != 1) {
9602  ast_log(LOG_WARNING, "Invalid redirecting frame version (%u)\n",
9603  (unsigned) ie_len);
9604  break;
9605  }
9606  frame_version = data[pos];
9607  break;
9608 /* Redirecting-orig party id name */
9610  ast_free(redirecting->orig.name.str);
9611  redirecting->orig.name.str = ast_malloc(ie_len + 1);
9612  if (redirecting->orig.name.str) {
9613  memcpy(redirecting->orig.name.str, data + pos, ie_len);
9614  redirecting->orig.name.str[ie_len] = 0;
9615  }
9616  break;
9618  if (ie_len != 1) {
9619  ast_log(LOG_WARNING, "Invalid redirecting-orig name char set (%u)\n",
9620  (unsigned) ie_len);
9621  break;
9622  }
9623  redirecting->orig.name.char_set = data[pos];
9624  break;
9626  if (ie_len != 1) {
9627  ast_log(LOG_WARNING, "Invalid redirecting-orig name presentation (%u)\n",
9628  (unsigned) ie_len);
9629  break;
9630  }
9631  redirecting->orig.name.presentation = data[pos];
9632  break;
9634  if (ie_len != 1) {
9635  ast_log(LOG_WARNING, "Invalid redirecting-orig name valid (%u)\n",
9636  (unsigned) ie_len);
9637  break;
9638  }
9639  redirecting->orig.name.valid = data[pos];
9640  break;
9641 /* Redirecting-orig party id number */
9643  ast_free(redirecting->orig.number.str);
9644  redirecting->orig.number.str = ast_malloc(ie_len + 1);
9645  if (redirecting->orig.number.str) {
9646  memcpy(redirecting->orig.number.str, data + pos, ie_len);
9647  redirecting->orig.number.str[ie_len] = 0;
9648  }
9649  break;
9651  if (ie_len != 1) {
9652  ast_log(LOG_WARNING, "Invalid redirecting-orig numbering plan (%u)\n",
9653  (unsigned) ie_len);
9654  break;
9655  }
9656  redirecting->orig.number.plan = data[pos];
9657  break;
9659  if (ie_len != 1) {
9660  ast_log(LOG_WARNING, "Invalid redirecting-orig number presentation (%u)\n",
9661  (unsigned) ie_len);
9662  break;
9663  }
9664  redirecting->orig.number.presentation = data[pos];
9665  break;
9667  if (ie_len != 1) {
9668  ast_log(LOG_WARNING, "Invalid redirecting-orig number valid (%u)\n",
9669  (unsigned) ie_len);
9670  break;
9671  }
9672  redirecting->orig.number.valid = data[pos];
9673  break;
9674 /* Redirecting-orig party id subaddress */
9676  ast_free(redirecting->orig.subaddress.str);
9677  redirecting->orig.subaddress.str = ast_malloc(ie_len + 1);
9678  if (redirecting->orig.subaddress.str) {
9679  memcpy(redirecting->orig.subaddress.str, data + pos, ie_len);
9680  redirecting->orig.subaddress.str[ie_len] = 0;
9681  }
9682  break;
9684  if (ie_len != 1) {
9685  ast_log(LOG_WARNING, "Invalid redirecting-orig type of subaddress (%u)\n",
9686  (unsigned) ie_len);
9687  break;
9688  }
9689  redirecting->orig.subaddress.type = data[pos];
9690  break;
9692  if (ie_len != 1) {
9694  "Invalid redirecting-orig subaddress odd-even indicator (%u)\n",
9695  (unsigned) ie_len);
9696  break;
9697  }
9698  redirecting->orig.subaddress.odd_even_indicator = data[pos];
9699  break;
9701  if (ie_len != 1) {
9702  ast_log(LOG_WARNING, "Invalid redirecting-orig subaddress valid (%u)\n",
9703  (unsigned) ie_len);
9704  break;
9705  }
9706  redirecting->orig.subaddress.valid = data[pos];
9707  break;
9708 /* Redirecting-orig party id tag */
9710  ast_free(redirecting->orig.tag);
9711  redirecting->orig.tag = ast_malloc(ie_len + 1);
9712  if (redirecting->orig.tag) {
9713  memcpy(redirecting->orig.tag, data + pos, ie_len);
9714  redirecting->orig.tag[ie_len] = 0;
9715  }
9716  break;
9717 /* Redirecting-from party id name */
9719  ast_free(redirecting->from.name.str);
9720  redirecting->from.name.str = ast_malloc(ie_len + 1);
9721  if (redirecting->from.name.str) {
9722  memcpy(redirecting->from.name.str, data + pos, ie_len);
9723  redirecting->from.name.str[ie_len] = 0;
9724  }
9725  break;
9727  if (ie_len != 1) {
9728  ast_log(LOG_WARNING, "Invalid redirecting-from name char set (%u)\n",
9729  (unsigned) ie_len);
9730  break;
9731  }
9732  redirecting->from.name.char_set = data[pos];
9733  break;
9735  if (ie_len != 1) {
9736  ast_log(LOG_WARNING, "Invalid redirecting-from name presentation (%u)\n",
9737  (unsigned) ie_len);
9738  break;
9739  }
9740  redirecting->from.name.presentation = data[pos];
9741  break;
9743  if (ie_len != 1) {
9744  ast_log(LOG_WARNING, "Invalid redirecting-from name valid (%u)\n",
9745  (unsigned) ie_len);
9746  break;
9747  }
9748  redirecting->from.name.valid = data[pos];
9749  break;
9750 /* Redirecting-from party id number */
9752  ast_free(redirecting->from.number.str);
9753  redirecting->from.number.str = ast_malloc(ie_len + 1);
9754  if (redirecting->from.number.str) {
9755  memcpy(redirecting->from.number.str, data + pos, ie_len);
9756  redirecting->from.number.str[ie_len] = 0;
9757  }
9758  break;
9760  if (ie_len != 1) {
9761  ast_log(LOG_WARNING, "Invalid redirecting-from numbering plan (%u)\n",
9762  (unsigned) ie_len);
9763  break;
9764  }
9765  redirecting->from.number.plan = data[pos];
9766  break;
9768  if (ie_len != 1) {
9769  ast_log(LOG_WARNING, "Invalid redirecting-from number presentation (%u)\n",
9770  (unsigned) ie_len);
9771  break;
9772  }
9773  redirecting->from.number.presentation = data[pos];
9774  break;
9776  if (ie_len != 1) {
9777  ast_log(LOG_WARNING, "Invalid redirecting-from number valid (%u)\n",
9778  (unsigned) ie_len);
9779  break;
9780  }
9781  redirecting->from.number.valid = data[pos];
9782  break;
9783 /* Redirecting-from party id combined presentation */
9785  if (ie_len != 1) {
9786  ast_log(LOG_WARNING, "Invalid redirecting-from combined presentation (%u)\n",
9787  (unsigned) ie_len);
9788  break;
9789  }
9790  from_combined_presentation = data[pos];
9791  got_from_combined_presentation = 1;
9792  break;
9793 /* Redirecting-from party id subaddress */
9795  ast_free(redirecting->from.subaddress.str);
9796  redirecting->from.subaddress.str = ast_malloc(ie_len + 1);
9797  if (redirecting->from.subaddress.str) {
9798  memcpy(redirecting->from.subaddress.str, data + pos, ie_len);
9799  redirecting->from.subaddress.str[ie_len] = 0;
9800  }
9801  break;
9803  if (ie_len != 1) {
9804  ast_log(LOG_WARNING, "Invalid redirecting-from type of subaddress (%u)\n",
9805  (unsigned) ie_len);
9806  break;
9807  }
9808  redirecting->from.subaddress.type = data[pos];
9809  break;
9811  if (ie_len != 1) {
9813  "Invalid redirecting-from subaddress odd-even indicator (%u)\n",
9814  (unsigned) ie_len);
9815  break;
9816  }
9817  redirecting->from.subaddress.odd_even_indicator = data[pos];
9818  break;
9820  if (ie_len != 1) {
9821  ast_log(LOG_WARNING, "Invalid redirecting-from subaddress valid (%u)\n",
9822  (unsigned) ie_len);
9823  break;
9824  }
9825  redirecting->from.subaddress.valid = data[pos];
9826  break;
9827 /* Redirecting-from party id tag */
9829  ast_free(redirecting->from.tag);
9830  redirecting->from.tag = ast_malloc(ie_len + 1);
9831  if (redirecting->from.tag) {
9832  memcpy(redirecting->from.tag, data + pos, ie_len);
9833  redirecting->from.tag[ie_len] = 0;
9834  }
9835  break;
9836 /* Redirecting-to party id name */
9838  ast_free(redirecting->to.name.str);
9839  redirecting->to.name.str = ast_malloc(ie_len + 1);
9840  if (redirecting->to.name.str) {
9841  memcpy(redirecting->to.name.str, data + pos, ie_len);
9842  redirecting->to.name.str[ie_len] = 0;
9843  }
9844  break;
9846  if (ie_len != 1) {
9847  ast_log(LOG_WARNING, "Invalid redirecting-to name char set (%u)\n",
9848  (unsigned) ie_len);
9849  break;
9850  }
9851  redirecting->to.name.char_set = data[pos];
9852  break;
9854  if (ie_len != 1) {
9855  ast_log(LOG_WARNING, "Invalid redirecting-to name presentation (%u)\n",
9856  (unsigned) ie_len);
9857  break;
9858  }
9859  redirecting->to.name.presentation = data[pos];
9860  break;
9862  if (ie_len != 1) {
9863  ast_log(LOG_WARNING, "Invalid redirecting-to name valid (%u)\n",
9864  (unsigned) ie_len);
9865  break;
9866  }
9867  redirecting->to.name.valid = data[pos];
9868  break;
9869 /* Redirecting-to party id number */
9871  ast_free(redirecting->to.number.str);
9872  redirecting->to.number.str = ast_malloc(ie_len + 1);
9873  if (redirecting->to.number.str) {
9874  memcpy(redirecting->to.number.str, data + pos, ie_len);
9875  redirecting->to.number.str[ie_len] = 0;
9876  }
9877  break;
9879  if (ie_len != 1) {
9880  ast_log(LOG_WARNING, "Invalid redirecting-to numbering plan (%u)\n",
9881  (unsigned) ie_len);
9882  break;
9883  }
9884  redirecting->to.number.plan = data[pos];
9885  break;
9887  if (ie_len != 1) {
9888  ast_log(LOG_WARNING, "Invalid redirecting-to number presentation (%u)\n",
9889  (unsigned) ie_len);
9890  break;
9891  }
9892  redirecting->to.number.presentation = data[pos];
9893  break;
9895  if (ie_len != 1) {
9896  ast_log(LOG_WARNING, "Invalid redirecting-to number valid (%u)\n",
9897  (unsigned) ie_len);
9898  break;
9899  }
9900  redirecting->to.number.valid = data[pos];
9901  break;
9902 /* Redirecting-to party id combined presentation */
9904  if (ie_len != 1) {
9905  ast_log(LOG_WARNING, "Invalid redirecting-to combined presentation (%u)\n",
9906  (unsigned) ie_len);
9907  break;
9908  }
9909  to_combined_presentation = data[pos];
9910  got_to_combined_presentation = 1;
9911  break;
9912 /* Redirecting-to party id subaddress */
9914  ast_free(redirecting->to.subaddress.str);
9915  redirecting->to.subaddress.str = ast_malloc(ie_len + 1);
9916  if (redirecting->to.subaddress.str) {
9917  memcpy(redirecting->to.subaddress.str, data + pos, ie_len);
9918  redirecting->to.subaddress.str[ie_len] = 0;
9919  }
9920  break;
9922  if (ie_len != 1) {
9923  ast_log(LOG_WARNING, "Invalid redirecting-to type of subaddress (%u)\n",
9924  (unsigned) ie_len);
9925  break;
9926  }
9927  redirecting->to.subaddress.type = data[pos];
9928  break;
9930  if (ie_len != 1) {
9932  "Invalid redirecting-to subaddress odd-even indicator (%u)\n",
9933  (unsigned) ie_len);
9934  break;
9935  }
9936  redirecting->to.subaddress.odd_even_indicator = data[pos];
9937  break;
9939  if (ie_len != 1) {
9940  ast_log(LOG_WARNING, "Invalid redirecting-to subaddress valid (%u)\n",
9941  (unsigned) ie_len);
9942  break;
9943  }
9944  redirecting->to.subaddress.valid = data[pos];
9945  break;
9946 /* Redirecting-to party id tag */
9948  ast_free(redirecting->to.tag);
9949  redirecting->to.tag = ast_malloc(ie_len + 1);
9950  if (redirecting->to.tag) {
9951  memcpy(redirecting->to.tag, data + pos, ie_len);
9952  redirecting->to.tag[ie_len] = 0;
9953  }
9954  break;
9955 /* Private redirecting-orig party id name */
9957  ast_free(redirecting->priv_orig.name.str);
9958  redirecting->priv_orig.name.str = ast_malloc(ie_len + 1);
9959  if (redirecting->priv_orig.name.str) {
9960  memcpy(redirecting->priv_orig.name.str, data + pos, ie_len);
9961  redirecting->priv_orig.name.str[ie_len] = 0;
9962  }
9963  break;
9965  if (ie_len != 1) {
9966  ast_log(LOG_WARNING, "Invalid private redirecting-orig name char set (%u)\n",
9967  (unsigned) ie_len);
9968  break;
9969  }
9970  redirecting->priv_orig.name.char_set = data[pos];
9971  break;
9973  if (ie_len != 1) {
9974  ast_log(LOG_WARNING, "Invalid private redirecting-orig name presentation (%u)\n",
9975  (unsigned) ie_len);
9976  break;
9977  }
9978  redirecting->priv_orig.name.presentation = data[pos];
9979  break;
9981  if (ie_len != 1) {
9982  ast_log(LOG_WARNING, "Invalid private redirecting-orig name valid (%u)\n",
9983  (unsigned) ie_len);
9984  break;
9985  }
9986  redirecting->priv_orig.name.valid = data[pos];
9987  break;
9988 /* Private redirecting-orig party id number */
9990  ast_free(redirecting->priv_orig.number.str);
9991  redirecting->priv_orig.number.str = ast_malloc(ie_len + 1);
9992  if (redirecting->priv_orig.number.str) {
9993  memcpy(redirecting->priv_orig.number.str, data + pos, ie_len);
9994  redirecting->priv_orig.number.str[ie_len] = 0;
9995  }
9996  break;
9998  if (ie_len != 1) {
9999  ast_log(LOG_WARNING, "Invalid private redirecting-orig numbering plan (%u)\n",
10000  (unsigned) ie_len);
10001  break;
10002  }
10003  redirecting->priv_orig.number.plan = data[pos];
10004  break;
10006  if (ie_len != 1) {
10007  ast_log(LOG_WARNING, "Invalid private redirecting-orig number presentation (%u)\n",
10008  (unsigned) ie_len);
10009  break;
10010  }
10011  redirecting->priv_orig.number.presentation = data[pos];
10012  break;
10014  if (ie_len != 1) {
10015  ast_log(LOG_WARNING, "Invalid private redirecting-orig number valid (%u)\n",
10016  (unsigned) ie_len);
10017  break;
10018  }
10019  redirecting->priv_orig.number.valid = data[pos];
10020  break;
10021 /* Private redirecting-orig party id subaddress */
10023  ast_free(redirecting->priv_orig.subaddress.str);
10024  redirecting->priv_orig.subaddress.str = ast_malloc(ie_len + 1);
10025  if (redirecting->priv_orig.subaddress.str) {
10026  memcpy(redirecting->priv_orig.subaddress.str, data + pos, ie_len);
10027  redirecting->priv_orig.subaddress.str[ie_len] = 0;
10028  }
10029  break;
10031  if (ie_len != 1) {
10032  ast_log(LOG_WARNING, "Invalid private redirecting-orig type of subaddress (%u)\n",
10033  (unsigned) ie_len);
10034  break;
10035  }
10036  redirecting->priv_orig.subaddress.type = data[pos];
10037  break;
10039  if (ie_len != 1) {
10041  "Invalid private redirecting-orig subaddress odd-even indicator (%u)\n",
10042  (unsigned) ie_len);
10043  break;
10044  }
10045  redirecting->priv_orig.subaddress.odd_even_indicator = data[pos];
10046  break;
10048  if (ie_len != 1) {
10049  ast_log(LOG_WARNING, "Invalid private redirecting-orig subaddress valid (%u)\n",
10050  (unsigned) ie_len);
10051  break;
10052  }
10053  redirecting->priv_orig.subaddress.valid = data[pos];
10054  break;
10055 /* Private redirecting-orig party id tag */
10057  ast_free(redirecting->priv_orig.tag);
10058  redirecting->priv_orig.tag = ast_malloc(ie_len + 1);
10059  if (redirecting->priv_orig.tag) {
10060  memcpy(redirecting->priv_orig.tag, data + pos, ie_len);
10061  redirecting->priv_orig.tag[ie_len] = 0;
10062  }
10063  break;
10064 /* Private redirecting-from party id name */
10066  ast_free(redirecting->priv_from.name.str);
10067  redirecting->priv_from.name.str = ast_malloc(ie_len + 1);
10068  if (redirecting->priv_from.name.str) {
10069  memcpy(redirecting->priv_from.name.str, data + pos, ie_len);
10070  redirecting->priv_from.name.str[ie_len] = 0;
10071  }
10072  break;
10074  if (ie_len != 1) {
10075  ast_log(LOG_WARNING, "Invalid private redirecting-from name char set (%u)\n",
10076  (unsigned) ie_len);
10077  break;
10078  }
10079  redirecting->priv_from.name.char_set = data[pos];
10080  break;
10082  if (ie_len != 1) {
10083  ast_log(LOG_WARNING, "Invalid private redirecting-from name presentation (%u)\n",
10084  (unsigned) ie_len);
10085  break;
10086  }
10087  redirecting->priv_from.name.presentation = data[pos];
10088  break;
10090  if (ie_len != 1) {
10091  ast_log(LOG_WARNING, "Invalid private redirecting-from name valid (%u)\n",
10092  (unsigned) ie_len);
10093  break;
10094  }
10095  redirecting->priv_from.name.valid = data[pos];
10096  break;
10097 /* Private redirecting-from party id number */
10099  ast_free(redirecting->priv_from.number.str);
10100  redirecting->priv_from.number.str = ast_malloc(ie_len + 1);
10101  if (redirecting->priv_from.number.str) {
10102  memcpy(redirecting->priv_from.number.str, data + pos, ie_len);
10103  redirecting->priv_from.number.str[ie_len] = 0;
10104  }
10105  break;
10107  if (ie_len != 1) {
10108  ast_log(LOG_WARNING, "Invalid private redirecting-from numbering plan (%u)\n",
10109  (unsigned) ie_len);
10110  break;
10111  }
10112  redirecting->priv_from.number.plan = data[pos];
10113  break;
10115  if (ie_len != 1) {
10116  ast_log(LOG_WARNING, "Invalid private redirecting-from number presentation (%u)\n",
10117  (unsigned) ie_len);
10118  break;
10119  }
10120  redirecting->priv_from.number.presentation = data[pos];
10121  break;
10123  if (ie_len != 1) {
10124  ast_log(LOG_WARNING, "Invalid private redirecting-from number valid (%u)\n",
10125  (unsigned) ie_len);
10126  break;
10127  }
10128  redirecting->priv_from.number.valid = data[pos];
10129  break;
10130 /* Private redirecting-from party id subaddress */
10132  ast_free(redirecting->priv_from.subaddress.str);
10133  redirecting->priv_from.subaddress.str = ast_malloc(ie_len + 1);
10134  if (redirecting->priv_from.subaddress.str) {
10135  memcpy(redirecting->priv_from.subaddress.str, data + pos, ie_len);
10136  redirecting->priv_from.subaddress.str[ie_len] = 0;
10137  }
10138  break;
10140  if (ie_len != 1) {
10141  ast_log(LOG_WARNING, "Invalid private redirecting-from type of subaddress (%u)\n",
10142  (unsigned) ie_len);
10143  break;
10144  }
10145  redirecting->priv_from.subaddress.type = data[pos];
10146  break;
10148  if (ie_len != 1) {
10150  "Invalid private redirecting-from subaddress odd-even indicator (%u)\n",
10151  (unsigned) ie_len);
10152  break;
10153  }
10154  redirecting->priv_from.subaddress.odd_even_indicator = data[pos];
10155  break;
10157  if (ie_len != 1) {
10158  ast_log(LOG_WARNING, "Invalid private redirecting-from subaddress valid (%u)\n",
10159  (unsigned) ie_len);
10160  break;
10161  }
10162  redirecting->priv_from.subaddress.valid = data[pos];
10163  break;
10164 /* Private redirecting-from party id tag */
10166  ast_free(redirecting->priv_from.tag);
10167  redirecting->priv_from.tag = ast_malloc(ie_len + 1);
10168  if (redirecting->priv_from.tag) {
10169  memcpy(redirecting->priv_from.tag, data + pos, ie_len);
10170  redirecting->priv_from.tag[ie_len] = 0;
10171  }
10172  break;
10173 /* Private redirecting-to party id name */
10175  ast_free(redirecting->priv_to.name.str);
10176  redirecting->priv_to.name.str = ast_malloc(ie_len + 1);
10177  if (redirecting->priv_to.name.str) {
10178  memcpy(redirecting->priv_to.name.str, data + pos, ie_len);
10179  redirecting->priv_to.name.str[ie_len] = 0;
10180  }
10181  break;
10183  if (ie_len != 1) {
10184  ast_log(LOG_WARNING, "Invalid private redirecting-to name char set (%u)\n",
10185  (unsigned) ie_len);
10186  break;
10187  }
10188  redirecting->priv_to.name.char_set = data[pos];
10189  break;
10191  if (ie_len != 1) {
10192  ast_log(LOG_WARNING, "Invalid private redirecting-to name presentation (%u)\n",
10193  (unsigned) ie_len);
10194  break;
10195  }
10196  redirecting->priv_to.name.presentation = data[pos];
10197  break;
10199  if (ie_len != 1) {
10200  ast_log(LOG_WARNING, "Invalid private redirecting-to name valid (%u)\n",
10201  (unsigned) ie_len);
10202  break;
10203  }
10204  redirecting->priv_to.name.valid = data[pos];
10205  break;
10206 /* Private redirecting-to party id number */
10208  ast_free(redirecting->priv_to.number.str);
10209  redirecting->priv_to.number.str = ast_malloc(ie_len + 1);
10210  if (redirecting->priv_to.number.str) {
10211  memcpy(redirecting->priv_to.number.str, data + pos, ie_len);
10212  redirecting->priv_to.number.str[ie_len] = 0;
10213  }
10214  break;
10216  if (ie_len != 1) {
10217  ast_log(LOG_WARNING, "Invalid private redirecting-to numbering plan (%u)\n",
10218  (unsigned) ie_len);
10219  break;
10220  }
10221  redirecting->priv_to.number.plan = data[pos];
10222  break;
10224  if (ie_len != 1) {
10225  ast_log(LOG_WARNING, "Invalid private redirecting-to number presentation (%u)\n",
10226  (unsigned) ie_len);
10227  break;
10228  }
10229  redirecting->priv_to.number.presentation = data[pos];
10230  break;
10232  if (ie_len != 1) {
10233  ast_log(LOG_WARNING, "Invalid private redirecting-to number valid (%u)\n",
10234  (unsigned) ie_len);
10235  break;
10236  }
10237  redirecting->priv_to.number.valid = data[pos];
10238  break;
10239 /* Private redirecting-to party id subaddress */
10241  ast_free(redirecting->priv_to.subaddress.str);
10242  redirecting->priv_to.subaddress.str = ast_malloc(ie_len + 1);
10243  if (redirecting->priv_to.subaddress.str) {
10244  memcpy(redirecting->priv_to.subaddress.str, data + pos, ie_len);
10245  redirecting->priv_to.subaddress.str[ie_len] = 0;
10246  }
10247  break;
10249  if (ie_len != 1) {
10250  ast_log(LOG_WARNING, "Invalid private redirecting-to type of subaddress (%u)\n",
10251  (unsigned) ie_len);
10252  break;
10253  }
10254  redirecting->priv_to.subaddress.type = data[pos];
10255  break;
10257  if (ie_len != 1) {
10259  "Invalid private redirecting-to subaddress odd-even indicator (%u)\n",
10260  (unsigned) ie_len);
10261  break;
10262  }
10263  redirecting->priv_to.subaddress.odd_even_indicator = data[pos];
10264  break;
10266  if (ie_len != 1) {
10267  ast_log(LOG_WARNING, "Invalid private redirecting-to subaddress valid (%u)\n",
10268  (unsigned) ie_len);
10269  break;
10270  }
10271  redirecting->priv_to.subaddress.valid = data[pos];
10272  break;
10273 /* Private redirecting-to party id tag */
10275  ast_free(redirecting->priv_to.tag);
10276  redirecting->priv_to.tag = ast_malloc(ie_len + 1);
10277  if (redirecting->priv_to.tag) {
10278  memcpy(redirecting->priv_to.tag, data + pos, ie_len);
10279  redirecting->priv_to.tag[ie_len] = 0;
10280  }
10281  break;
10282 /* Redirecting reason code */
10284  if (ie_len != sizeof(value)) {
10285  ast_log(LOG_WARNING, "Invalid redirecting reason (%u)\n",
10286  (unsigned) ie_len);
10287  break;
10288  }
10289  memcpy(&value, data + pos, sizeof(value));
10290  redirecting->reason.code = ntohl(value);
10291  break;
10292 /* Redirecting reason string */
10294  ast_free(redirecting->reason.str);
10295  redirecting->reason.str = ast_malloc(ie_len + 1);
10296  if (redirecting->reason.str) {
10297  memcpy(redirecting->reason.str, data + pos, ie_len);
10298  redirecting->reason.str[ie_len] = 0;
10299  }
10300  break;
10301 /* Redirecting orig-reason code */
10303  if (ie_len != sizeof(value)) {
10304  ast_log(LOG_WARNING, "Invalid redirecting original reason (%u)\n",
10305  (unsigned) ie_len);
10306  break;
10307  }
10308  memcpy(&value, data + pos, sizeof(value));
10309  redirecting->orig_reason.code = ntohl(value);
10310  break;
10311 /* Redirecting orig-reason string */
10313  ast_free(redirecting->orig_reason.str);
10314  redirecting->orig_reason.str = ast_malloc(ie_len + 1);
10315  if (redirecting->orig_reason.str) {
10316  memcpy(redirecting->orig_reason.str, data + pos, ie_len);
10317  redirecting->orig_reason.str[ie_len] = 0;
10318  }
10319  break;
10320 /* Redirecting count */
10321  case AST_REDIRECTING_COUNT:
10322  if (ie_len != sizeof(value)) {
10323  ast_log(LOG_WARNING, "Invalid redirecting count (%u)\n",
10324  (unsigned) ie_len);
10325  break;
10326  }
10327  memcpy(&value, data + pos, sizeof(value));
10328  redirecting->count = ntohl(value);
10329  break;
10330 /* Redirecting unknown element */
10331  default:
10332  ast_debug(1, "Unknown redirecting element: %u (%u)\n",
10333  (unsigned) ie_id, (unsigned) ie_len);
10334  break;
10335  }
10336  }
10337 
10338  switch (frame_version) {
10339  case 1:
10340  /*
10341  * The other end is an earlier version that we need to adjust
10342  * for compatibility.
10343  *
10344  * The earlier version did not have the orig party id or
10345  * orig_reason value.
10346  */
10347  redirecting->from.name.valid = 1;
10349  redirecting->from.number.valid = 1;
10350  if (got_from_combined_presentation) {
10351  redirecting->from.name.presentation = from_combined_presentation;
10352  redirecting->from.number.presentation = from_combined_presentation;
10353  }
10354 
10355  redirecting->to.name.valid = 1;
10357  redirecting->to.number.valid = 1;
10358  if (got_to_combined_presentation) {
10359  redirecting->to.name.presentation = to_combined_presentation;
10360  redirecting->to.number.presentation = to_combined_presentation;
10361  }
10362  break;
10363  case 2:
10364  /* The other end is at the same level as we are. */
10365  break;
10366  default:
10367  /*
10368  * The other end is newer than we are.
10369  * We need to assume that they are compatible with us.
10370  */
10371  ast_debug(1, "Redirecting frame has newer version: %u\n",
10372  (unsigned) frame_version);
10373  break;
10374  }
10375 
10376  return 0;
10377 }
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:278
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation. ...
Definition: channel.h:540
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:296
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:534
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
#define LOG_WARNING
Definition: logger.h:274
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:537
int char_set
Character set the name is using.
Definition: channel.h:273
char * str
Subscriber name (Malloced)
Definition: channel.h:265
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:329
char * str
Malloced subaddress string.
Definition: channel.h:314
int value
Definition: syslog.c:37
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:511
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:327
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward) ...
Definition: channel.h:525
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition: channel.h:546
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:193
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:294
char * str
a string value for the redirecting reason
Definition: channel.h:508
#define ast_free(a)
Definition: astmm.h:182
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition: channel.h:543
char * tag
User-set "tag".
Definition: channel.h:355
int type
Q.931 subaddress type.
Definition: channel.h:321
int count
Number of times the call was redirected.
Definition: channel.h:549
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition: channel.h:531
int int32_t
Definition: db.h:60
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

◆ ast_ref_namedgroups()

struct ast_namedgroups* ast_ref_namedgroups ( struct ast_namedgroups *  groups)

Definition at line 7838 of file channel.c.

References ao2_ref, and groups.

Referenced by ast_channel_named_callgroups_set(), ast_channel_named_pickupgroups_set(), check_peer_ok(), create_addr_from_peer(), and mkintf().

7839 {
7840  if (groups) {
7841  ao2_ref(groups, 1);
7842  }
7843  return groups;
7844 }
#define ao2_ref(o, delta)
Definition: astobj2.h:464
static struct groups groups

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

References NULL, and request_channel().

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

6445 {
6446  return request_channel(type, request_cap, NULL, assignedids, requestor, addr, cause);
6447 }
static const char type[]
Definition: chan_ooh323.c:109
#define NULL
Definition: resample.c:96
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:6309

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

References __ast_request_and_dial(), and NULL.

Referenced by generic_recall().

6265 {
6266  return __ast_request_and_dial(type, cap, assignedids, requestor, addr, timeout, outstate, cidnum, cidname, NULL);
6267 }
static const char type[]
Definition: chan_ooh323.c:109
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:6066
static int timeout
Definition: cdr_mysql.c:86
#define NULL
Definition: resample.c:96

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

References NULL, and request_channel().

Referenced by dial_exec_full(), and do_forward().

6450 {
6451  return request_channel(type, NULL, topology, assignedids, requestor, addr, cause);
6452 }
static const char type[]
Definition: chan_ooh323.c:109
#define NULL
Definition: resample.c:96
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:6309

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

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(), destroy_all_channels(), dial_trunk(), dictate_exec(), disa_exec(), dtmf_no_bridge(), dtmf_stream(), flash_exec(), mf_stream(), mgcp_ss(), milliwatt_exec(), misdn_check_l2l1(), old_milliwatt_exec(), pbx_builtin_wait(), play_moh_exec(), playtone(), privacy_exec(), send_tone_burst(), testclient_exec(), testserver_exec(), try_calling(), wait_for_hangup(), waituntil_exec(), and zapateller_exec().

1575 {
1576  return safe_sleep_conditional(chan, ms, NULL, NULL, 1);
1577 }
#define NULL
Definition: resample.c:96
static int safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int(*cond)(void *), void *data, unsigned int generate_silence)
Wait, look for hangups and condition arg.
Definition: channel.c:1498

◆ ast_safe_sleep_conditional()

int ast_safe_sleep_conditional ( struct ast_channel chan,
int  ms,
int(*)(void *)  cond,
void *  data 
)

Wait for a specified amount of time, looking for hangups and a condition argument.

Parameters
chanchannel to wait for
mslength of time in milliseconds to sleep.
conda function pointer for testing continue condition
dataargument to be passed to the condition test function
Returns
returns -1 on hangup, otherwise 0.

Waits for a specified amount of time, servicing the channel as required. If cond returns 0, this function returns.

Definition at line 1568 of file channel.c.

References cond, and safe_sleep_conditional().

Referenced by get_chan_by_ast_name().

1569 {
1570  return safe_sleep_conditional(chan, timeout_ms, cond, data, 1);
1571 }
ast_cond_t cond
Definition: app_meetme.c:1090
static int safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int(*cond)(void *), void *data, unsigned int generate_silence)
Wait, look for hangups and condition arg.
Definition: channel.c:1498

◆ ast_safe_sleep_without_silence()

int ast_safe_sleep_without_silence ( struct ast_channel chan,
int  ms 
)

Wait for a specified amount of time, looking for hangups, and do not generate silence.

Parameters
chanchannel to wait for
mslength of time in milliseconds to sleep. This should never be less than zero.

Waits for a specified amount of time, servicing the channel as required.

Returns
returns -1 on hangup, otherwise 0.
Note
Unlike ast_safe_sleep this will not generate silence if Asterisk is configured to do so.

Definition at line 1579 of file channel.c.

References NULL, and safe_sleep_conditional().

1580 {
1581  return safe_sleep_conditional(chan, ms, NULL, NULL, 0);
1582 }
#define NULL
Definition: resample.c:96
static int safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int(*cond)(void *), void *data, unsigned int generate_silence)
Wait, look for hangups and condition arg.
Definition: channel.c:1498

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

References ast_say_character_str_full.

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

8369 {
8370  return ast_say_character_str_full(chan, str, ints, lang, sensitivity, -1, -1);
8371 }
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:175

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

References ast_say_digit_str_full.

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

8357 {
8358  return ast_say_digit_str_full(chan, str, ints, lang, -1, -1);
8359 }
const char * str
Definition: app_jack.c:147
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:143

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

References ast_say_digits_full().

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

8351 {
8352  return ast_say_digits_full(chan, num, ints, lang, -1, -1);
8353 }
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:8379

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

Same as ast_say_digits() with audiofd for received audio and returns 1 on ctrlfd being readable.

Definition at line 8379 of file channel.c.

References ast_say_digit_str_full, and buf.

Referenced by ast_say_digits(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_is(), ast_say_number_full_cs(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_is(), ast_say_number_full_it(), ast_say_number_full_ja(), ast_say_number_full_ka(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_th(), ast_say_number_full_ur(), ast_say_number_full_vi(), ast_say_number_full_zh(), and say_init_mode().

8381 {
8382  char buf[256];
8383 
8384  snprintf(buf, sizeof(buf), "%d", num);
8385 
8386  return ast_say_digit_str_full(chan, buf, ints, lang, audiofd, ctrlfd);
8387 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
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:143

◆ 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, sencond, 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 8343 of file channel.c.

References ast_say_enumeration_full.

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

8345 {
8346  return ast_say_enumeration_full(chan, num, ints, language, options, -1, -1);
8347 }
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:106
static char language[MAX_LANGUAGE]
Definition: chan_alsa.c:117
static struct test_options options

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

References ast_say_money_str_full.

Referenced by pbx_builtin_saymoney().

8363 {
8364  return ast_say_money_str_full(chan, str, ints, lang, -1, -1);
8365 }
const char * str
Definition: app_jack.c:147
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:151

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

References ast_say_number_full.

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

8339 {
8340  return ast_say_number_full(chan, num, ints, language, options, -1, -1);
8341 }
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
static char language[MAX_LANGUAGE]
Definition: chan_alsa.c:117
static struct test_options options

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

References ast_say_phonetic_str_full.

Referenced by pbx_builtin_sayphonetic().

8375 {
8376  return ast_say_phonetic_str_full(chan, str, ints, lang, -1, -1);
8377 }
const char * str
Definition: app_jack.c:147
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:180

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

References ast_channel_tech(), AST_DEFAULT_EMULATE_DTMF_DURATION, ast_safe_sleep(), ast_senddigit_begin(), and ast_senddigit_end().

Referenced by dial_exec_full(), and dtmf_stream().

5020 {
5021  if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
5023  }
5024  if (ast_channel_tech(chan)->send_digit_begin) {
5025  ast_senddigit_begin(chan, digit);
5026  ast_safe_sleep(chan, duration);
5027  }
5028 
5029  return ast_senddigit_end(chan, digit, duration);
5030 }
char digit
#define AST_DEFAULT_EMULATE_DTMF_DURATION
Definition: channel.c:102
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait, look for hangups.
Definition: channel.c:1574
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition: channel.c:4919
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition: channel.c:4969
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

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

Referenced by ast_senddigit(), ast_senddigit_external(), and ast_write_stream().

4920 {
4921  /* Device does not support DTMF tones, lets fake
4922  * it by doing our own generation. */
4923  static const char * const dtmf_tones[] = {
4924  "941+1336", /* 0 */
4925  "697+1209", /* 1 */
4926  "697+1336", /* 2 */
4927  "697+1477", /* 3 */
4928  "770+1209", /* 4 */
4929  "770+1336", /* 5 */
4930  "770+1477", /* 6 */
4931  "852+1209", /* 7 */
4932  "852+1336", /* 8 */
4933  "852+1477", /* 9 */
4934  "697+1633", /* A */
4935  "770+1633", /* B */
4936  "852+1633", /* C */
4937  "941+1633", /* D */
4938  "941+1209", /* * */
4939  "941+1477" /* # */
4940  };
4941 
4942  if (!ast_channel_tech(chan)->send_digit_begin)
4943  return 0;
4944 
4945  ast_channel_lock(chan);
4948  ast_channel_unlock(chan);
4949 
4950  if (!ast_channel_tech(chan)->send_digit_begin(chan, digit))
4951  return 0;
4952 
4953  if (digit >= '0' && digit <='9')
4954  ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
4955  else if (digit >= 'A' && digit <= 'D')
4956  ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
4957  else if (digit == '*')
4958  ast_playtones_start(chan, 0, dtmf_tones[14], 0);
4959  else if (digit == '#')
4960  ast_playtones_start(chan, 0, dtmf_tones[15], 0);
4961  else {
4962  /* not handled */
4963  ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4964  }
4965 
4966  return 0;
4967 }
char digit
#define ast_channel_lock(chan)
Definition: channel.h:2945
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_channel_sending_dtmf_tv_set(struct ast_channel *chan, struct timeval value)
const char * ast_channel_name(const struct ast_channel *chan)
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
void ast_channel_sending_dtmf_digit_set(struct ast_channel *chan, char value)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

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(), and ast_channel_tech::send_digit_end.

Referenced by ast_channel_end_dtmf(), ast_senddigit(), ast_senddigit_external(), and ast_write_stream().

4970 {
4971  int res = -1;
4972 
4973  if (ast_channel_tech(chan)->send_digit_end)
4974  res = ast_channel_tech(chan)->send_digit_end(chan, digit, duration);
4975 
4976  ast_channel_lock(chan);
4977  if (ast_channel_sending_dtmf_digit(chan) == digit) {
4979  }
4980  ast_channel_unlock(chan);
4981 
4982  if (res && ast_channel_generator(chan))
4983  ast_playtones_stop(chan);
4984 
4985  return 0;
4986 }
char digit
#define ast_channel_lock(chan)
Definition: channel.h:2945
char ast_channel_sending_dtmf_digit(const struct ast_channel *chan)
int(*const send_digit_end)(struct ast_channel *chan, char digit, unsigned int duration)
Stop sending a literal DTMF digit.
Definition: channel.h:691
void ast_playtones_stop(struct ast_channel *chan)
Stop playing tones on a channel.
Definition: indications.c:393
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_channel_sending_dtmf_digit_set(struct ast_channel *chan, char value)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

References ast_channel_tech(), AST_DEFAULT_EMULATE_DTMF_DURATION, ast_senddigit_begin(), and ast_senddigit_end().

Referenced by dtmf_stream(), and manager_play_dtmf().

5033 {
5034  if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
5036  }
5037  if (ast_channel_tech(chan)->send_digit_begin) {
5038  ast_senddigit_begin(chan, digit);
5039  usleep(duration * 1000);
5040  }
5041 
5042  return ast_senddigit_end(chan, digit, duration);
5043 }
char digit
#define AST_DEFAULT_EMULATE_DTMF_DURATION
Definition: channel.c:102
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition: channel.c:4919
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition: channel.c:4969
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

◆ 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
durationthe duration of a KP digit ending in ms
durationthe 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 4997 of file channel.c.

References ast_channel_tech(), ast_safe_sleep(), ast_senddigit_mf_begin(), ast_senddigit_mf_end(), and DEFAULT_EMULATE_MF_DURATION.

Referenced by mf_stream().

4999 {
5000  if (duration < DEFAULT_EMULATE_MF_DURATION) {
5001  duration = DEFAULT_EMULATE_MF_DURATION;
5002  }
5003  if (ast_channel_tech(chan)->send_digit_begin) {
5004  if (digit == '*') {
5005  duration = durationkp;
5006  } else if (digit == '#' || digit == 'A' || digit == 'B' || digit == 'C') {
5007  duration = durationst;
5008  }
5010  if (is_external) {
5011  usleep(duration * 1000);
5012  } else {
5013  ast_safe_sleep(chan, duration);
5014  }
5015  }
5016  return ast_senddigit_mf_end(chan);
5017 }
char digit
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait, look for hangups.
Definition: channel.c:1574
int ast_senddigit_mf_begin(struct ast_channel *chan, char digit)
Send an MF digit to a channel.
Definition: channel.c:4880
int ast_senddigit_mf_end(struct ast_channel *chan)
End sending an MF digit to a channel.
Definition: channel.c:4988
#define DEFAULT_EMULATE_MF_DURATION
Definition: channel.c:106
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

References ast_channel_name(), ast_log, ast_playtones_start(), LOG_WARNING, and mf_tones.

Referenced by ast_senddigit_mf().

4881 {
4882  static const char * const mf_tones[] = {
4883  "1300+1500", /* 0 */
4884  "700+900", /* 1 */
4885  "700+1100", /* 2 */
4886  "900+1100", /* 3 */
4887  "700+1300", /* 4 */
4888  "900+1300", /* 5 */
4889  "1100+1300", /* 6 */
4890  "700+1500", /* 7 */
4891  "900+1500", /* 8 */
4892  "1100+1500", /* 9 */
4893  "1100+1700", /* * (KP) */
4894  "1500+1700", /* # (ST) */
4895  "900+1700", /* A (STP) */
4896  "1300+1700", /* B (ST2P) */
4897  "700+1700" /* C (ST3P) */
4898  };
4899 
4900  if (digit >= '0' && digit <='9') {
4901  ast_playtones_start(chan, 0, mf_tones[digit-'0'], 0);
4902  } else if (digit == '*') {
4903  ast_playtones_start(chan, 0, mf_tones[10], 0);
4904  } else if (digit == '#') {
4905  ast_playtones_start(chan, 0, mf_tones[11], 0);
4906  } else if (digit == 'A') {
4907  ast_playtones_start(chan, 0, mf_tones[12], 0);
4908  } else if (digit == 'B') {
4909  ast_playtones_start(chan, 0, mf_tones[13], 0);
4910  } else if (digit == 'C') {
4911  ast_playtones_start(chan, 0, mf_tones[14], 0);
4912  } else {
4913  /* not handled */
4914  ast_log(LOG_WARNING, "Unable to generate MF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4915  }
4916  return 0;
4917 }
char digit
#define LOG_WARNING
Definition: logger.h:274
#define ast_log
Definition: astobj2.c:42
static const float mf_tones[]
Definition: dsp.c:323
const char * ast_channel_name(const struct ast_channel *chan)
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

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

References ast_channel_generator(), and ast_playtones_stop().

Referenced by ast_senddigit_mf(), and mf_stream().

4989 {
4990  if (ast_channel_generator(chan)) {
4991  ast_playtones_stop(chan);
4992  return 0;
4993  }
4994  return -1;
4995 }
void ast_playtones_stop(struct ast_channel *chan)
Stop playing tones on a channel.
Definition: indications.c:393
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)

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

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, and ast_msg_data_attribute::type.

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

4855 {
4856  struct ast_msg_data *msg;
4857  int rc;
4858  struct ast_msg_data_attribute attrs[] =
4859  {
4860  {
4862  .value = (char *)text,
4863  }
4864  };
4865 
4866  if (ast_strlen_zero(text)) {
4867  return 0;
4868  }
4869 
4871  if (!msg) {
4872  return -1;
4873  }
4874  rc = ast_sendtext_data(chan, msg);
4875  ast_free(msg);
4876 
4877  return rc;
4878 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
enum ast_msg_data_attribute_type type
Definition: message.h:463
Structure used to transport a message through the frame core.
Definition: message.c:1406
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.
Definition: message.c:1418
char * text
Definition: app_queue.c:1508
#define ast_strlen_zero(foo)
Definition: strings.h:52
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:4796
#define ast_free(a)
Definition: astmm.h:182

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

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

4797 {
4798  int res = 0;
4799  const char *body = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_BODY);
4800  const char *content_type = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_CONTENT_TYPE);
4801 
4802  ast_channel_lock(chan);
4803  /* Stop if we're a zombie or need a soft hangup */
4805  ast_channel_unlock(chan);
4806  return -1;
4807  }
4808 
4809  CHECK_BLOCKING(chan);
4810  if (ast_channel_tech(chan)->write_text
4811  && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))
4813  struct ast_frame f;
4814  /* T.140 payload does not include the null byte terminator */
4815  size_t body_len = strlen(body);
4816 
4817  /* Process as T.140 text (moved here from ast_sendtext() */
4818  memset(&f, 0, sizeof(f));
4819  f.src = "DIALPLAN";
4820  f.subclass.format = ast_format_t140;
4821  f.frametype = AST_FRAME_TEXT;
4822  f.datalen = body_len;
4823  f.mallocd = AST_MALLOCD_DATA;
4824  f.data.ptr = ast_strdup(body);
4825  if (f.data.ptr) {
4826  res = ast_channel_tech(chan)->write_text(chan, &f);
4827  } else {
4828  res = -1;
4829  }
4830  ast_frfree(&f);
4831  } else if ((ast_channel_tech(chan)->properties & AST_CHAN_TP_SEND_TEXT_DATA)
4832  && ast_channel_tech(chan)->send_text_data) {
4833  /* Send enhanced message to a channel driver that supports it */
4834  ast_debug(1, "Sending TEXT_DATA from '%s' to %s:%s %s\n",
4837  ast_channel_name(chan), body);
4838  res = ast_channel_tech(chan)->send_text_data(chan, msg);
4839  } else if (ast_channel_tech(chan)->send_text
4840  && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))) {
4841  /* Send the body of an enhanced message to a channel driver that supports only a char str */
4842  ast_debug(1, "Sending TEXT to %s: %s\n", ast_channel_name(chan), body);
4843  res = ast_channel_tech(chan)->send_text(chan, body);
4844  } else {
4845  ast_debug(1, "Channel technology does not support sending content type '%s' on channel '%s'\n",
4846  S_OR(content_type, "text/plain"), ast_channel_name(chan));
4847  res = -1;
4848  }
4850  ast_channel_unlock(chan);
4851  return res;
4852 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Channels have this property if they implement send_text_data.
Definition: channel.h:976
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define AST_MALLOCD_DATA
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define ast_strlen_zero(foo)
Definition: strings.h:52
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
int(*const write_text)(struct ast_channel *chan, struct ast_frame *frame)
Write a text frame, in standard format.
Definition: channel.h:790
int(*const send_text)(struct ast_channel *chan, const char *text)
Display or transmit text.
Definition: channel.h:757
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.
Definition: message.c:1533
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ast_clear_flag(p, flag)
Definition: utils.h:77
static void send_text(unsigned char pos, unsigned char inverse, struct unistimsession *pte, const char *text)
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
Definition: channel.h:2894
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const char * ast_channel_name(const struct ast_channel *chan)
#define ast_frfree(fr)
Data structure associated with a single frame of data.
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Definition: strings.h:94
int(*const send_text_data)(struct ast_channel *chan, struct ast_msg_data *data)
Display or transmit text with data.
Definition: channel.h:845
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_format * ast_format_t140
Built-in cached t140 format.
Definition: format_cache.c:236
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
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:615

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

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(), cb_events(), disa_exec(), get_pai(), get_rpid(), handle_setcallerid(), mgcp_ss(), pbx_outgoing_attempt(), privacy_exec(), ring_entry(), skinny_newcall(), and socket_process_helper().

7435 {
7436  ast_channel_lock(chan);
7437 
7438  if (cid_num) {
7439  ast_channel_caller(chan)->id.number.valid = 1;
7440  ast_free(ast_channel_caller(chan)->id.number.str);
7442  }
7443  if (cid_name) {
7444  ast_channel_caller(chan)->id.name.valid = 1;
7445  ast_free(ast_channel_caller(chan)->id.name.str);
7447  }
7448  if (cid_ani) {
7449  ast_channel_caller(chan)->ani.number.valid = 1;
7450  ast_free(ast_channel_caller(chan)->ani.number.str);
7451  ast_channel_caller(chan)->ani.number.str = ast_strdup(cid_ani);
7452  }
7453 
7455 
7456  ast_channel_unlock(chan);
7457 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2945
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
static char cid_num[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:164
Number structure.
Definition: app_followme.c:154
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
#define ast_channel_unlock(chan)
Definition: channel.h:2946
static const char name[]
Definition: cdr_mysql.c:74
#define ast_free(a)
Definition: astmm.h:182
static char cid_name[AST_MAX_EXTENSION]
Definition: chan_mgcp.c:165
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

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

2505 {
2507 
2508  ast_channel_lock(chan);
2509  if (force || ast_strlen_zero(ast_channel_hangupsource(chan))) {
2510  ast_channel_hangupsource_set(chan, source);
2511  }
2512  ast_channel_unlock(chan);
2513 
2514  if (bridge) {
2515  ast_channel_lock(bridge);
2516  if (force || ast_strlen_zero(ast_channel_hangupsource(bridge))) {
2517  ast_channel_hangupsource_set(bridge, source);
2518  }
2519  ast_channel_unlock(bridge);
2520  }
2521 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
#define ast_strlen_zero(foo)
Definition: strings.h:52
#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:911
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition: channel.h:2992
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel&#39;s bridge peer only if the bridge is two-party.
Definition: channel.c:10765
const char * ast_channel_hangupsource(const struct ast_channel *chan)

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

Definition at line 1750 of file channel.c.

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

Referenced by handle_request_invite(), handle_request_update(), handle_response_invite(), misdn_queue_connected_line_update(), set_redirecting(), and sip_call().

1751 {
1752  update_id->name = 1;
1753  update_id->number = 1;
1754  update_id->subaddress = 1;
1755 }
unsigned char subaddress
Definition: channel.h:368
unsigned char number
Definition: channel.h:366
unsigned char name
Definition: channel.h:364

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

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(), ices_exec(), isAnsweringMachine(), jack_exec(), jingle_interpret_content(), jingle_read(), measurenoise(), meetme_menu_admin_extended(), mgcp_rtp_read(), old_milliwatt_exec(), ooh323_new(), ooh323_rtp_read(), ooh323_set_read_format(), ooh323_set_write_format(), process_sdp(), record_exec(), set_caps(), set_read_to_slin(), sip_rtp_read(), skinny_rtp_read(), sms_exec(), socket_process_helper(), speech_background(), transmit_audio(), and unistim_rtp_read().

5850 {
5852  int res;
5853 
5854  ast_assert(format != NULL);
5855 
5856  if (!cap) {
5857  return -1;
5858  }
5859  ast_format_cap_append(cap, format, 0);
5860 
5861  res = set_format(chan, cap, 0, 0);
5862 
5863  ao2_cleanup(cap);
5864  return res;
5865 }
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition: channel.c:5680
#define ast_assert(a)
Definition: utils.h:695
#define NULL
Definition: resample.c:96
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

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

References set_format().

5868 {
5869  return set_format(chan, cap, 0, 0);
5870 }
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition: channel.c:5680

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

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

5576 {
5577  struct ast_trans_pvt *trans_old;
5578  struct ast_trans_pvt *trans_new;
5579 
5581  && ast_format_cmp(ast_channel_readformat(chan), core_format) == AST_FORMAT_CMP_EQUAL) {
5582  /* Nothing to setup */
5583  return 0;
5584  }
5585 
5586  ast_debug(1, "Channel %s setting read format path: %s -> %s\n",
5587  ast_channel_name(chan),
5588  ast_format_get_name(raw_format),
5589  ast_format_get_name(core_format));
5590 
5591  /* Setup new translation path. */
5592  if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5593  trans_new = ast_translator_build_path(core_format, raw_format);
5594  if (!trans_new) {
5595  return -1;
5596  }
5597  } else {
5598  /* No translation needed. */
5599  trans_new = NULL;
5600  }
5601  trans_old = ast_channel_readtrans(chan);
5602  if (trans_old) {
5603  ast_translator_free_path(trans_old);
5604  }
5605  ast_channel_readtrans_set(chan, trans_new);
5606  ast_channel_set_rawreadformat(chan, raw_format);
5607  ast_channel_set_readformat(chan, core_format);
5608  return 0;
5609 }
void ast_channel_readtrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
#define NULL
Definition: resample.c:96
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
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
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:485
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
const char * ast_channel_name(const struct ast_channel *chan)
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition: translate.c:475

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

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

8218 {
8219  struct ast_variable *cur;
8220 
8221  for (cur = vars; cur; cur = cur->next) {
8222  pbx_builtin_setvar_helper(chan, cur->name, cur->value);
8223  }
8224 }
struct ast_variable * next
Structure for variables, used for configurations and for channel variables.
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...

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

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(), 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(), mgcp_rtp_read(), moh_alloc(), moh_files_release(), moh_files_write_format_change(), moh_release(), mp3_exec(), NBScat_exec(), old_milliwatt_exec(), ooh323_new(), ooh323_rtp_read(), ooh323_set_write_format(), ooh323_write(), participant_reaction_announcer_join(), playtones_alloc(), playtones_release(), process_sdp(), send_waveform_to_channel(), set_caps(), set_softmix_bridge_data(), sip_rtp_read(), skinny_rtp_read(), sms_exec(), socket_process_helper(), tonepair_alloc(), tonepair_release(), transmit_audio(), and unistim_rtp_read().

5891 {
5893  int res;
5894 
5895  ast_assert(format != NULL);
5896 
5897  if (!cap) {
5898  return -1;
5899  }
5900  ast_format_cap_append(cap, format, 0);
5901 
5902  res = set_format(chan, cap, 1, 0);
5903 
5904  ao2_cleanup(cap);
5905  return res;
5906 }
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition: channel.c:5680
#define ast_assert(a)
Definition: utils.h:695
#define NULL
Definition: resample.c:96
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

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

References set_format().

Referenced by ast_openstream_full().

5909 {
5910  return set_format(chan, cap, 1, 0);
5911 }
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition: channel.c:5680

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

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

5873 {
5875  int res;
5876 
5877  ast_assert(format != NULL);
5878 
5879  if (!cap) {
5880  return -1;
5881  }
5882  ast_format_cap_append(cap, format, 0);
5883 
5884  res = set_format(chan, cap, 1, 1);
5885 
5886  ao2_cleanup(cap);
5887  return res;
5888 }
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition: channel.c:5680
#define ast_assert(a)
Definition: utils.h:695
#define NULL
Definition: resample.c:96
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

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

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

5612 {
5613  struct ast_trans_pvt *trans_old;
5614  struct ast_trans_pvt *trans_new;
5615 
5617  && ast_format_cmp(ast_channel_writeformat(chan), core_format) == AST_FORMAT_CMP_EQUAL) {
5618  /* Nothing to setup */
5619  return 0;
5620  }
5621 
5622  ast_debug(1, "Channel %s setting write format path: %s -> %s\n",
5623  ast_channel_name(chan),
5624  ast_format_get_name(core_format),
5625  ast_format_get_name(raw_format));
5626 
5627  /* Setup new translation path. */
5628  if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5629  trans_new = ast_translator_build_path(raw_format, core_format);
5630  if (!trans_new) {
5631  return -1;
5632  }
5633  } else {
5634  /* No translation needed. */
5635  trans_new = NULL;
5636  }
5637  trans_old = ast_channel_writetrans(chan);
5638  if (trans_old) {
5639  ast_translator_free_path(trans_old);
5640  }
5641  ast_channel_writetrans_set(chan, trans_new);
5642  ast_channel_set_rawwriteformat(chan, raw_format);
5643  ast_channel_set_writeformat(chan, core_format);
5644  return 0;
5645 }
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
#define NULL
Definition: resample.c:96
void ast_channel_writetrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
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
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:485
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition: translate.c:475

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

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(), alsa_answer(), analog_answer(), analog_call(), analog_exception(), analog_ss_thread(), ast_raw_answer_with_stream_topology(), AST_TEST_DEFINE(), cb_events(), chan_pjsip_answer(), chan_pjsip_incoming_response(), console_answer(), dahdi_answer(), dahdi_call(), dahdi_handle_event(), dahdi_indicate(), dahdi_read(), handle_invite_replaces(), handle_request_invite(), handle_response_ciev(), handle_response_invite(), iax2_call(), indicate_busy(), indicate_congestion(), jingle_action_session_info(), jingle_action_session_initiate(), jingle_call(), mbl_hangup(), mgcp_answer(), mgcp_call(), mgcp_ss(), misdn_call(), misdn_indication(), my_set_waitingfordt(), nbs_call(), nbs_hangup(), onAlerting(), onProgress(), ooh323_answer(), ooh323_new(), oss_answer(), phone_answer(), phone_call(), phone_exception(), phone_hangup(), phone_write(), refer_incoming_invite_request(), release_chan(), release_chan_early(), setsubstate(), sip_answer(), skinny_newcall(), unistim_answer(), unistim_call(), unistim_new(), unistim_ss(), and unreal_queue_frame().

7487 {
7488  int oldstate = ast_channel_state(chan);
7489  char name[AST_CHANNEL_NAME], *dashptr;
7490 
7491  if (oldstate == state)
7492  return 0;
7493 
7494  ast_copy_string(name, ast_channel_name(chan), sizeof(name));
7495  if ((dashptr = strrchr(name, '-'))) {
7496  *dashptr = '\0';
7497  }
7498 
7500 
7502 
7503  /* We have to pass AST_DEVICE_UNKNOWN here because it is entirely possible that the channel driver
7504  * for this channel is using the callback method for device state. If we pass in an actual state here
7505  * we override what they are saying the state is and things go amuck. */
7507 
7508  return 0;
7509 }
#define ast_test_flag(p, flag)
Definition: utils.h:63
ast_channel_state
ast_channel states
Definition: channelstate.h:35
static const char name[]
Definition: cdr_mysql.c:74
#define AST_CHANNEL_NAME
Definition: channel.h:172
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_state_set(struct ast_channel *chan, enum ast_channel_state)
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
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_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, accomodates new timing methods

Definition at line 3189 of file channel.c.

References ast_settimeout_full().

Referenced by ast_activate_generator(), ast_readaudio_callback(), deactivate_generator_nolock(), and filestream_close().

3190 {
3191  return ast_settimeout_full(c, rate, func, data, 0);
3192 }
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:3194

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

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

Referenced by ast_readaudio_callback(), and ast_settimeout().

3195 {
3196  int res;
3197  unsigned int real_rate = rate, max_rate;
3198 
3199  ast_channel_lock(c);
3200 
3201  if (ast_channel_timingfd(c) == -1) {
3202  ast_channel_unlock(c);
3203  return -1;
3204  }
3205 
3206  if (!func) {
3207  rate = 0;
3208  data = NULL;
3209  }
3210 
3211  if (rate && rate > (max_rate = ast_timer_get_max_rate(ast_channel_timer(c)))) {
3212  real_rate = max_rate;
3213  }
3214 
3215  ast_debug(1, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
3216 
3217  res = ast_timer_set_rate(ast_channel_timer(c), real_rate);
3218 
3221  }
3222 
3223  ast_channel_timingfunc_set(c, func);
3224  ast_channel_timingdata_set(c, data);
3225 
3226  if (data && is_ao2_obj) {
3227  ao2_ref(data, 1);
3229  } else {
3231  }
3232 
3233  if (func == NULL && rate == 0 && ast_channel_fdno(c) == AST_TIMING_FD) {
3234  /* Clearing the timing func and setting the rate to 0
3235  * means that we don't want to be reading from the timingfd
3236  * any more. Setting c->fdno to -1 means we won't have any
3237  * errant reads from the timingfd, meaning we won't potentially
3238  * miss any important frames.
3239  */
3240  ast_channel_fdno_set(c, -1);
3241  }
3242 
3243  ast_channel_unlock(c);
3244 
3245  return res;
3246 }
void ast_channel_fdno_set(struct ast_channel *chan, int value)
void ast_channel_timingfunc_set(struct ast_channel *chan, ast_timing_func_t value)
#define ast_channel_lock(chan)
Definition: channel.h:2945
unsigned int ast_timer_get_max_rate(const struct ast_timer *handle)
Get maximum rate supported for a timer.
Definition: timing.c:191
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define NULL
Definition: resample.c:96
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ao2_ref(o, delta)
Definition: astobj2.h:464
void * ast_channel_timingdata(const struct ast_channel *chan)
int ast_channel_fdno(const struct ast_channel *chan)
void ast_channel_timingdata_set(struct ast_channel *chan, void *value)
int ast_channel_timingfd(const struct ast_channel *chan)
#define AST_TIMING_FD
Definition: channel.h:202
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
Definition: timing.c:166
#define ast_clear_flag(p, flag)
Definition: utils.h:77
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)

◆ ast_softhangup()

int ast_softhangup ( struct ast_channel chan,
int  cause 
)

Softly hangup a channel, lock.

Softly hangup up a channel.

Definition at line 2476 of file channel.c.

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

Referenced by __analog_handle_event(), __ast_module_user_hangup_all(), __ast_pbx_run(), __unload_module(), after_bridge_move_channel(), after_bridge_move_channel_fail(), agent_logoff_request(), agents_sweep(), analog_attempt_transfer(), ast_ari_channels_hangup(), ast_bridge_transfer_attended(), ast_channel_softhangup_cb(), ast_dial_join(), attempt_transfer(), blond_nonfinal_exit(), bridge_channel_attended_transfer(), cc_generic_agent_stop_ringing(), conf_free(), dahdi_handle_event(), handle_hangup(), handle_softhangup(), hangup_channel(), mgcp_pktcgate_remove(), retransfer_exit(), rtp_check_timeout(), sla_handle_hold_event(), softhangup_exec(), stasis_app_bridge_moh_stop(), and unload_module().

2477 {
2478  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
2479  int res;
2480 
2481  ast_channel_lock(chan);
2482  res = ast_softhangup_nolock(chan, cause);
2483  blob = ast_json_pack("{s: i, s: b}",
2484  "cause", cause,
2485  "soft", 1);
2487  ast_channel_unlock(chan);
2488 
2489  return res;
2490 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
Softly hangup a channel, don&#39;t lock.
Definition: channel.c:2463
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
#define NULL
Definition: resample.c:96
#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:911
#define ast_channel_unlock(chan)
Definition: channel.h:2946
Abstract JSON element (object, array, string, int, ...).
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
struct stasis_message_type * ast_channel_hangup_request_type(void)
Message type for when a hangup is requested on a channel.

◆ ast_softhangup_all()

void ast_softhangup_all ( void  )

Soft hangup all active channels.

Since
13.3.0
Returns
Nothing

Definition at line 493 of file channel.c.

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

Referenced by can_safely_quit().

494 {
496 }
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
#define NULL
Definition: resample.c:96
static int ast_channel_softhangup_cb(void *obj, void *arg, int flags)
Definition: channel.c:484
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124

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

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(), check_pendings(), check_rtp_timeout(), dahdi_softhangup_all(), do_monitor(), gosub_run(), internal_bridge_after_cb(), jingle_indicate(), pbx_builtin_hangup(), proc_session_timer(), and sip_indicate().

2464 {
2465  ast_debug(1, "Soft-Hanging (%#04x) up channel '%s'\n", (unsigned)cause, ast_channel_name(chan));
2466  /* Inform channel driver that we need to be hung up, if it cares */
2469  /* Interrupt any poll call or such */
2471  pthread_kill(ast_channel_blocker(chan), SIGURG);
2472  return 0;
2473 }
#define ast_test_flag(p, flag)
Definition: utils.h:63
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
pthread_t ast_channel_blocker(const struct ast_channel *chan)
struct ast_frame ast_null_frame
Definition: main/frame.c:79
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

◆ ast_state2str()

const char* ast_state2str ( enum ast_channel_state  state)

Gives the string form of a given channel state.

Note
This function is not reentrant.
Parameters
state

Definition at line 642 of file channel.c.

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(), mgcp_new(), serialize_showchan(), sip_hangup(), and update_connectedline().

643 {
644  char *buf;
645 
646  switch (state) {
647  case AST_STATE_DOWN:
648  return "Down";
649  case AST_STATE_RESERVED:
650  return "Rsrvd";
651  case AST_STATE_OFFHOOK:
652  return "OffHook";
653  case AST_STATE_DIALING:
654  return "Dialing";
655  case AST_STATE_RING:
656  return "Ring";
657  case AST_STATE_RINGING:
658  return "Ringing";
659  case AST_STATE_UP:
660  return "Up";
661  case AST_STATE_BUSY:
662  return "Busy";
664  return "Dialing Offhook";
665  case AST_STATE_PRERING:
666  return "Pre-ring";
667  case AST_STATE_MUTE:
668  return "Mute";
669  default:
671  return "Unknown";
672  snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%u)", state);
673  return buf;
674  }
675 }
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
#define STATE2STR_BUFSIZE
Definition: channel.c:98
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static struct ast_threadstorage state2str_threadbuf
Definition: channel.c:97

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

References ARRAY_LEN.

Referenced by dial_exec_full(), and pbx_builtin_hangup().

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 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static const struct causes_map causes[]
Definition: channel.c:136
static const char name[]
Definition: cdr_mysql.c:74

◆ AST_THREADSTORAGE_RAW()

AST_THREADSTORAGE_RAW ( in_intercept_routine  )

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

Referenced by ast_channel_queue_redirecting_update().

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

References ast_channel_generatordata(), ast_frfree, ast_read(), ast_tonepair_start(), and ast_waitfor().

Referenced by zapateller_exec().

7701 {
7702  int res;
7703 
7704  if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
7705  return res;
7706 
7707  /* Give us some wiggle room */
7708  while (ast_channel_generatordata(chan) && ast_waitfor(chan, 100) >= 0) {
7709  struct ast_frame *f = ast_read(chan);
7710  if (f)
7711  ast_frfree(f);
7712  else
7713  return -1;
7714  }
7715  return 0;
7716 }
void * ast_channel_generatordata(const struct ast_channel *chan)
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4302
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3171
#define ast_frfree(fr)
Data structure associated with a single frame of data.
int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition: channel.c:7682

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

References ast_activate_generator(), tonepair_def::duration, tonepair_def::freq1, tonepair_def::freq2, and tonepair_def::vol.

Referenced by ast_tonepair(), pbx_builtin_waitexten(), play_dialtone(), and sendnoise().

7683 {
7684  struct tonepair_def d = { 0, };
7685 
7686  d.freq1 = freq1;
7687  d.freq2 = freq2;
7688  d.duration = duration;
7689  d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
7690  if (ast_activate_generator(chan, &tonepair, &d))
7691  return -1;
7692  return 0;
7693 }
static struct test_val d
int duration
Definition: channel.c:7565
static struct ast_generator tonepair
Definition: channel.c:7676
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition: channel.c:2960

◆ ast_tonepair_stop()

void ast_tonepair_stop ( struct ast_channel chan)

Stop a tone from playing

Definition at line 7695 of file channel.c.

References ast_deactivate_generator().

Referenced by sendnoise().

7696 {
7698 }
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2902

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

References ast_transfer_protocol().

Referenced by app_control_redirect().

6578 {
6579  int protocol;
6580  return ast_transfer_protocol(chan, dest, &protocol);
6581 }
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:6595

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

Parameters
chanchannel to transfer
destdestination to transfer to
protocolis the protocol result SIP example, 0=success, 3xx-6xx is SIP error code

Called by:

  • app_transfer
  • the manager interface

Definition at line 6595 of file channel.c.

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

6596 {
6597  int res = -1;
6598 
6599  if (protocol) {
6600  *protocol = 0;
6601  }
6602 
6603  /* Stop if we're a zombie or need a soft hangup */
6604  ast_channel_lock(chan);
6606  if (ast_channel_tech(chan)->transfer) {
6607  res = ast_channel_tech(chan)->transfer(chan, dest);
6608  if (!res)
6609  res = 1;
6610  } else
6611  res = 0;
6612  }
6613  ast_channel_unlock(chan);
6614 
6615  if (res <= 0) {
6616  return res;
6617  }
6618 
6619  for (;;) {
6620  struct ast_frame *fr;
6621 
6622  res = ast_waitfor(chan, -1);
6623 
6624  if (res < 0 || !(fr = ast_read(chan))) {
6625  res = -1;
6626  break;
6627  }
6628 
6630  enum ast_control_transfer *message = fr->data.ptr;
6631 
6632  if (*message == AST_TRANSFER_SUCCESS) {
6633  res = 1;
6634  } else {
6635  res = -1;
6636  /* Message can contain a protocol specific code
6637  AST_TRANSFER_SUCCESS indicates success
6638  Else, failure. Protocol will be set to the failure reason.
6639  SIP example, 0 is success, else error code 3xx-6xx */
6640  if (protocol) {
6641  *protocol = *message;
6642  }
6643  }
6644 
6645  ast_frfree(fr);
6646  break;
6647  }
6648 
6649  ast_frfree(fr);
6650  }
6651 
6652  return res;
6653 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
int(*const transfer)(struct ast_channel *chan, const char *newdest)
Blind transfer other side (see app_transfer.c and ast_transfer()
Definition: channel.h:784
#define ast_test_flag(p, flag)
Definition: utils.h:63
ast_control_transfer
static int transfer
Definition: chan_mgcp.c:194
struct ast_frame_subclass subclass
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4302
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3171
#define ast_frfree(fr)
Data structure associated with a single frame of data.
union ast_frame::@263 data
enum ast_frame_type frametype
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

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.

Referenced by cb_events(), and misdn_call().

679 {
680  switch (transfercapability) {
682  return "SPEECH";
684  return "DIGITAL";
686  return "RESTRICTED_DIGITAL";
688  return "3K1AUDIO";
690  return "DIGITAL_W_TONES";
691  case AST_TRANS_CAP_VIDEO:
692  return "VIDEO";
693  default:
694  return "UNKNOWN";
695  }
696 }
#define AST_TRANS_CAP_DIGITAL_W_TONES
Definition: transcap.h:39
#define AST_TRANS_CAP_3_1K_AUDIO
Definition: transcap.h:37
#define AST_TRANS_CAP_VIDEO
Definition: transcap.h:40
#define AST_TRANS_CAP_RESTRICTED_DIGITAL
Definition: transcap.h:36
#define AST_TRANS_CAP_SPEECH
Definition: transcap.h:34
#define AST_TRANS_CAP_DIGITAL
Definition: transcap.h:35

◆ ast_undestroyed_channels()

int ast_undestroyed_channels ( void  )
Returns
the number of channels not yet destroyed

Definition at line 504 of file channel.c.

References ast_atomic_fetchadd_int(), and chancount.

Referenced by wait_for_channels_to_die().

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

◆ ast_uninstall_music_functions()

void ast_uninstall_music_functions ( void  )

Definition at line 7859 of file channel.c.

References ast_moh_cleanup_ptr, ast_moh_start_ptr, ast_moh_stop_ptr, and NULL.

Referenced by unload_module().

7860 {
7864 }
static int(* ast_moh_start_ptr)(struct ast_channel *, const char *, const char *)
Definition: channel.c:7846
#define NULL
Definition: resample.c:96
static void(* ast_moh_stop_ptr)(struct ast_channel *)
Definition: channel.c:7847
static void(* ast_moh_cleanup_ptr)(struct ast_channel *)
Definition: channel.c:7848

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

References ast_waitfor_nandfds(), 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(), destroy_all_channels(), dictate_exec(), disa_exec(), disable_t38(), do_waiting(), echo_exec(), handle_recordfile(), handle_speechrecognize(), ices_exec(), isAnsweringMachine(), jack_exec(), launch_asyncagi(), measurenoise(), moh_channel_thread(), mp3_exec(), NBScat_exec(), read_mf_digits(), read_sf_digits(), receive_dtmf_digits(), receivefax_t38_init(), record_exec(), recordthread(), safe_sleep_conditional(), send_waveform_to_channel(), sendfax_t38_init(), sendurl_exec(), sms_exec(), speech_background(), stasis_app_exec(), stream_echo_perform(), transmit_audio(), transmit_t38(), wait_exec(), wait_for_hangup(), waitforring_exec(), and waitstream_core().

3172 {
3173  if (ms < 0) {
3174  do {
3175  ms = 100000;
3176  ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3177  } while (!ms);
3178  } else {
3179  ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3180  }
3181  return ms;
3182 }
#define NULL
Definition: resample.c:96
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:2997

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

References ast_waitfor_nandfds(), and NULL.

Referenced by autoservice_run(), dial_exec_full(), iax2_key_rotate(), misdn_write(), monitor_dial(), wait_for_answer(), and wait_for_winner().

3167 {
3168  return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
3169 }
#define NULL
Definition: resample.c:96
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:2997

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

References ast_waitfor_nandfds(), and NULL.

Referenced by dundi_lookup_internal(), dundi_precache_internal(), rfcomm_wait(), and softmix_mixing_loop().

2990 {
2991  int winner = -1;
2992  ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
2993  return winner;
2994 }
#define NULL
Definition: resample.c:96
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:2997

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

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(), chanlist::chan, 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(), find_cache(), generic_fax_exec(), run_agi(), and waitstream_core().

2999 {
3000  struct timeval start = { 0 , 0 };
3001  struct pollfd *pfds = NULL;
3002  int res;
3003  long rms;
3004  int x, y, max;
3005  int sz = nfds;
3006  struct timeval now = { 0, 0 };
3007  struct timeval whentohangup = { 0, 0 }, diff;
3008  struct ast_channel *winner = NULL;
3009  struct fdmap {
3010  int chan;
3011  int fdno;
3012  } *fdmap = NULL;
3013 
3014  if (outfd) {
3015  *outfd = -99999;
3016  }
3017  if (exception) {
3018  *exception = 0;
3019  }
3020 
3021  for (x = 0; x < n; x++) {
3022  ast_channel_lock(c[x]);
3023  if (!ast_tvzero(*ast_channel_whentohangup(c[x]))) {
3024  if (ast_tvzero(whentohangup))
3025  now = ast_tvnow();
3026  diff = ast_tvsub(*ast_channel_whentohangup(c[x]), now);
3027  if (diff.tv_sec < 0 || ast_tvzero(diff)) {
3028  ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3029  /* Should already be hungup */
3031  ast_channel_unlock(c[x]);
3032  return c[x];
3033  }
3034  if (ast_tvzero(whentohangup) || ast_tvcmp(diff, whentohangup) < 0)
3035  whentohangup = diff;
3036  }
3037  sz += ast_channel_fd_count(c[x]);
3038  ast_channel_unlock(c[x]);
3039  }
3040 
3041  if (!sz) {
3042  return NULL;
3043  }
3044 
3045  pfds = ast_alloca(sizeof(*pfds) * sz);
3046  fdmap = ast_alloca(sizeof(*fdmap) * sz);
3047 
3048  /* Wait full interval */
3049  rms = *ms;
3050  /* INT_MAX, not LONG_MAX, because it matters on 64-bit */
3051  if (!ast_tvzero(whentohangup) && whentohangup.tv_sec < INT_MAX / 1000) {
3052  rms = whentohangup.tv_sec * 1000 + whentohangup.tv_usec / 1000; /* timeout in milliseconds */
3053  if (*ms >= 0 && *ms < rms) { /* original *ms still smaller */
3054  rms = *ms;
3055  }
3056  } else if (!ast_tvzero(whentohangup) && rms < 0) {
3057  /* Tiny corner case... call would need to last >24 days */
3058  rms = INT_MAX;
3059  }
3060  /*
3061  * Build the pollfd array, putting the channels' fds first,
3062  * followed by individual fds. Order is important because
3063  * individual fd's must have priority over channel fds.
3064  */
3065  max = 0;
3066  for (x = 0; x < n; x++) {
3067  ast_channel_lock(c[x]);
3068  for (y = 0; y < ast_channel_fd_count(c[x]); y++) {
3069  fdmap[max].fdno = y; /* fd y is linked to this pfds */
3070  fdmap[max].chan = x; /* channel x is linked to this pfds */
3071  max += ast_add_fd(&pfds[max], ast_channel_fd(c[x], y));
3072  }
3073  CHECK_BLOCKING(c[x]);
3074  ast_channel_unlock(c[x]);
3075  }
3076  /* Add the individual fds */
3077  for (x = 0; x < nfds; x++) {
3078  fdmap[max].chan = -1;
3079  max += ast_add_fd(&pfds[max], fds[x]);
3080  }
3081 
3082  if (*ms > 0) {
3083  start = ast_tvnow();
3084  }
3085 
3086  if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
3087  do {
3088  int kbrms = rms;
3089  if (kbrms > 600000) {
3090  kbrms = 600000;
3091  }
3092  res = ast_poll(pfds, max, kbrms);
3093  if (!res) {
3094  rms -= kbrms;
3095  }
3096  } while (!res && (rms > 0));
3097  } else {
3098  res = ast_poll(pfds, max, rms);
3099  }
3100  for (x = 0; x < n; x++) {
3101  ast_channel_lock(c[x]);
3103  ast_channel_unlock(c[x]);
3104  }
3105  if (res < 0) { /* Simulate a timeout if we were interrupted */
3106  if (errno != EINTR) {
3107  *ms = -1;
3108  }
3109  return NULL;
3110  }
3111  if (!ast_tvzero(whentohangup)) { /* if we have a timeout, check who expired */
3112  now = ast_tvnow();
3113  for (x = 0; x < n; x++) {
3114  if (!ast_tvzero(*ast_channel_whentohangup(c[x])) && ast_tvcmp(*ast_channel_whentohangup(c[x]), now) <= 0) {
3115  ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3117  if (winner == NULL) {
3118  winner = c[x];
3119  }
3120  }
3121  }
3122  }
3123  if (res == 0) { /* no fd ready, reset timeout and done */
3124  *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
3125  return winner;
3126  }
3127  /*
3128  * Then check if any channel or fd has a pending event.
3129  * Remember to check channels first and fds last, as they
3130  * must have priority on setting 'winner'
3131  */
3132  for (x = 0; x < max; x++) {
3133  res = pfds[x].revents;
3134  if (res == 0) {
3135  continue;
3136  }
3137  if (fdmap[x].chan >= 0) { /* this is a channel */
3138  winner = c[fdmap[x].chan]; /* override previous winners */
3139  ast_channel_lock(winner);
3140  if (res & POLLPRI) {
3142  } else {
3144  }
3145  ast_channel_fdno_set(winner, fdmap[x].fdno);
3146  ast_channel_unlock(winner);
3147  } else { /* this is an fd */
3148  if (outfd) {
3149  *outfd = pfds[x].fd;
3150  }
3151  if (exception) {
3152  *exception = (res & POLLPRI) ? -1 : 0;
3153  }
3154  winner = NULL;
3155  }
3156  }
3157  if (*ms > 0) {
3158  *ms -= ast_tvdiff_ms(ast_tvnow(), start);
3159  if (*ms < 0) {
3160  *ms = 0;
3161  }
3162  }
3163  return winner;
3164 }
void ast_channel_fdno_set(struct ast_channel *chan, int value)
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
#define ast_set_flag(p, flag)
Definition: utils.h:70
static int ast_add_fd(struct pollfd *pfd, int fd)
if fd is a valid descriptor, set *pfd with the descriptor
Definition: channel.h:2842
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
#define NULL
Definition: resample.c:96
struct timeval * ast_channel_whentohangup(struct ast_channel *chan)
#define ast_poll(a, b, c)
Definition: poll-compat.h:88
#define ast_test_suite_event_notify(s, f,...)
Definition: test.h:196
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:290
int ast_tvcmp(struct timeval _a, struct timeval _b)
Compres two struct timeval instances returning -1, 0, 1 if the first arg is smaller, equal or greater to the second.
Definition: time.h:128
int errno
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define ast_clear_flag(p, flag)
Definition: utils.h:77
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
Definition: channel.h:2894
int ast_channel_fd(const struct ast_channel *chan, int which)
const char * ast_channel_name(const struct ast_channel *chan)
int ast_channel_fd_count(const struct ast_channel *chan)
Retrieve the number of file decriptor positions present on the channel.
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
Definition: extconf.c:2298
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
#define max(a, b)
Definition: f2c.h:198

◆ ast_waitfordigit()

int ast_waitfordigit ( struct ast_channel c,
int  ms 
)

Waits for a digit.

Parameters
cchannel to wait for a digit on
mshow many milliseconds to wait (<0 for indefinite).
Returns
Returns <0 on error, 0 on no entry, and the digit on success.

Definition at line 3184 of file channel.c.

References ast_waitfordigit_full(), and NULL.

Referenced by __analog_ss_thread(), _while_exec(), adsi_get_cpeid(), adsi_get_cpeinfo(), adsi_print(), adsi_read_encoded_dtmf(), adsi_transmit_message_full(), advanced_options(), analog_my_getsigstr(), analog_ss_thread(), ast_app_dtget(), ast_record_review(), collect_digits(), common_exec(), control_streamfile(), cpeid_exec(), dialout(), directory_exec(), forward_message(), get_folder(), get_folder_ja(), ivr_dispatch(), mgcp_ss(), my_getsigstr(), pbx_builtin_waitexten(), play_record_review(), read_exec(), read_newoption(), readexten_exec(), retrydial_exec(), select_item_menu(), select_item_pause(), select_item_seq(), sendnoise(), testclient_exec(), testserver_exec(), vm_execmain(), vm_forwardoptions(), vm_instructions_en(), vm_instructions_ja(), vm_options(), vm_tempgreeting(), wait_a_bit(), and wait_our_turn().

3185 {
3186  return ast_waitfordigit_full(c, ms, NULL, -1, -1);
3187 }
#define NULL
Definition: resample.c:96
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:3248

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

References ast_channel_clear_flag(), ast_channel_flags(), ast_channel_set_flag(), ast_check_hangup(), AST_CONTROL_ANSWER, AST_CONTROL_CONNECTED_LINE, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_PVT_CAUSE_CODE, AST_CONTROL_REDIRECTING, AST_CONTROL_RINGING, AST_CONTROL_SRCCHANGE, AST_CONTROL_SRCUPDATE, AST_CONTROL_STREAM_FORWARD, AST_CONTROL_STREAM_RESTART, AST_CONTROL_STREAM_REVERSE, AST_CONTROL_STREAM_STOP, AST_CONTROL_STREAM_SUSPEND, AST_CONTROL_UNHOLD, AST_CONTROL_UPDATE_RTP_PEER, AST_FLAG_END_DTMF_ONLY, AST_FLAG_ZOMBIE, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_VOICE, ast_frfree, ast_log, ast_read(), ast_remaining_ms(), ast_test_flag, ast_tvnow(), ast_waitfor_nandfds(), 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().

3249 {
3250  struct timeval start = ast_tvnow();
3251  int ms;
3252 
3253  /* Stop if we're a zombie or need a soft hangup */
3255  return -1;
3256 
3257  /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
3259 
3260  /* Wait for a digit, no more than timeout_ms milliseconds total.
3261  * Or, wait indefinitely if timeout_ms is <0.
3262  */
3263  while ((ms = ast_remaining_ms(start, timeout_ms))) {
3264  struct ast_channel *rchan;
3265  int outfd = -1;
3266 
3267  errno = 0;
3268  /* While ast_waitfor_nandfds tries to help by reducing the timeout by how much was waited,
3269  * it is unhelpful if it waited less than a millisecond.
3270  */
3271  rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
3272 
3273  if (!rchan && outfd < 0 && ms) {
3274  if (errno == 0 || errno == EINTR)
3275  continue;
3276  ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
3278  return -1;
3279  } else if (outfd > -1) {
3280  /* The FD we were watching has something waiting */
3281  ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
3283  return 1;
3284  } else if (rchan) {
3285  int res;
3286  struct ast_frame *f = ast_read(c);
3287 
3288  if (!f) {
3290 
3291  return -1;
3292  }
3293 
3294  switch (f->frametype) {
3295  case AST_FRAME_DTMF_BEGIN:
3296  break;
3297  case AST_FRAME_DTMF_END:
3298  res = f->subclass.integer;
3299  if (!breakon || strchr(breakon, res)) {
3300  ast_frfree(f);
3302  return res;
3303  }
3304  break;
3305  case AST_FRAME_CONTROL:
3306  switch (f->subclass.integer) {
3307  case AST_CONTROL_HANGUP:
3308  ast_frfree(f);
3310  return -1;
3316  /* Fall-through and treat as if it were a DTMF signal. Items
3317  * that perform stream control will handle this. */
3318  res = f->subclass.integer;
3319  ast_frfree(f);
3321  return res;
3323  case AST_CONTROL_RINGING:
3324  case AST_CONTROL_ANSWER:
3325  case AST_CONTROL_SRCUPDATE:
3326  case AST_CONTROL_SRCCHANGE:
3330  case AST_CONTROL_HOLD:
3331  case AST_CONTROL_UNHOLD:
3332  case AST_CONTROL_FLASH:
3333  case -1:
3334  /* Unimportant */
3335  break;
3336  default:
3337  ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass.integer);
3338  break;
3339  }
3340  break;
3341  case AST_FRAME_VOICE:
3342  /* Write audio if appropriate */
3343  if (audiofd > -1) {
3344  if (write(audiofd, f->data.ptr, f->datalen) < 0) {
3345  ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
3346  }
3347  }
3348  default:
3349  /* Ignore */
3350  break;
3351  }
3352  ast_frfree(f);
3353  }
3354  }
3355 
3357 
3358  return 0; /* Time is up */
3359 }
Main Channel structure associated with a channel.
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define LOG_WARNING
Definition: logger.h:274
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define NULL
Definition: resample.c:96
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:2997
struct ast_frame_subclass subclass
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
#define ast_log
Definition: astobj2.c:42
void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag)
Definition: channel.c:11235
void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
Set a flag on a channel.
Definition: channel.c:11228
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition: main/utils.c:2033
int errno
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4302
#define ast_frfree(fr)
Data structure associated with a single frame of data.
union ast_frame::@263 data
enum ast_frame_type frametype
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

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

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(), fax_generator_generate(), gen_generate(), generic_fax_exec(), handle_jack_audio(), iax2_key_rotate(), jb_get_and_deliver(), linear_generator(), milliwatt_generate(), misdn_write(), moh_files_generator(), moh_generate(), mp3_exec(), NBScat_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().

5190 {
5191  return ast_write_stream(chan, -1, fr);
5192 }
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:5194

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

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_insmpl(), ast_channel_lock, ast_channel_monitor(), ast_channel_name(), ast_channel_nativeformats(), ast_channel_outsmpl(), ast_channel_outsmpl_set(), 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_sample_rate(), 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_log, AST_MEDIA_TYPE_IMAGE, AST_MEDIA_TYPE_UNKNOWN, AST_MONITOR_RUNNING, ast_opt_generic_plc, ast_seekstream(), 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(), ast_writestream(), calc_monitor_jump(), 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, LOG_WARNING, chanlist::next, NULL, ast_frame::ptr, ast_frame::samples, SEEK_FORCECUR, send_dtmf_begin_event(), send_dtmf_end_event(), ast_channel_tech::send_html, ast_channel_tech::send_text, ast_frame::src, 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().

5195 {
5196  struct ast_stream *stream = NULL, *default_stream = NULL;
5197  int res = -1;
5198  struct ast_frame *f = NULL;
5199  int count = 0;
5200  int hooked = 0;
5201 
5202  /*Deadlock avoidance*/
5203  while(ast_channel_trylock(chan)) {
5204  /*cannot goto done since the channel is not locked*/
5205  if(count++ > 10) {
5206  ast_debug(1, "Deadlock avoided for write to channel '%s'\n", ast_channel_name(chan));
5207  return 0;
5208  }
5209  usleep(1);
5210  }
5211 
5212  /* Stop if we're a zombie or need a soft hangup */
5214  goto done;
5215  }
5216 
5217  if (stream_num >= 0) {
5218  /* If we were told to write to an explicit stream then allow this frame through, no matter
5219  * if the type is expected or not (a framehook could change)
5220  */
5222  goto done;
5223  }
5225  default_stream = ast_channel_get_default_stream(chan, ast_stream_get_type(stream));
5226  } else if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO || fr->frametype == AST_FRAME_MODEM) {
5227  /* If we haven't been told of a stream then we need to figure out which once we need */
5229 
5230  /* Some frame types have a fixed media type */
5231  if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO) {
5232  type = ast_format_get_type(fr->subclass.format);
5233  } else if (fr->frametype == AST_FRAME_MODEM) {
5234  type = AST_MEDIA_TYPE_IMAGE;
5235  }
5236 
5237  /* No stream was specified, so use the default one */
5238  stream = default_stream = ast_channel_get_default_stream(chan, type);
5239  }
5240 
5241  /* Perform the framehook write event here. After the frame enters the framehook list
5242  * there is no telling what will happen, how awesome is that!!! */
5243  if ((stream == default_stream) && !(fr = ast_framehook_list_write_event(ast_channel_framehooks(chan), fr))) {
5244  res = 0;
5245  goto done;
5246  }
5247 
5248  if (ast_channel_generatordata(chan) && (fr->frametype != AST_FRAME_RTCP) && (!fr->src || strcasecmp(fr->src, "ast_prod"))) {
5251  } else {
5252  if (fr->frametype == AST_FRAME_DTMF_END) {
5253  /* There is a generator running while we're in the middle of a digit.
5254  * It's probably inband DTMF, so go ahead and pass it so it can
5255  * stop the generator */
5256  ast_channel_unlock(chan);
5257  res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5258  ast_channel_lock(chan);
5259  } else if (fr->frametype == AST_FRAME_CONTROL
5260  && fr->subclass.integer == AST_CONTROL_UNHOLD) {
5261  /*
5262  * This is a side case where Echo is basically being called
5263  * and the person put themselves on hold and took themselves
5264  * off hold.
5265  */
5267  fr->datalen);
5268  }
5269  res = 0; /* XXX explain, why 0 ? */
5270  goto done;
5271  }
5272  }
5273  /* High bit prints debugging */
5274  if (ast_channel_fout(chan) & DEBUGCHAN_FLAG)
5275  ast_frame_dump(ast_channel_name(chan), fr, ">>");
5276  switch (fr->frametype) {
5277  case AST_FRAME_CONTROL:
5278  indicate_data_internal(chan, fr->subclass.integer, fr->data.ptr, fr->datalen);
5279  res = 0;
5280  break;
5281  case AST_FRAME_DTMF_BEGIN:
5282  if (ast_channel_audiohooks(chan)) {
5283  struct ast_frame *old_frame = fr;
5285  if (old_frame != fr)
5286  f = fr;
5287  }
5289  ast_channel_unlock(chan);
5290  res = ast_senddigit_begin(chan, fr->subclass.integer);
5291  ast_channel_lock(chan);
5292  break;
5293  case AST_FRAME_DTMF_END:
5294  if (ast_channel_audiohooks(chan)) {
5295  struct ast_frame *new_frame = fr;
5296 
5298  if (new_frame != fr) {
5299  ast_frfree(new_frame);
5300  }
5301  }
5303  ast_channel_unlock(chan);
5304  res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5305  ast_channel_lock(chan);
5306  break;
5307  case AST_FRAME_TEXT:
5308  CHECK_BLOCKING(chan);
5310  res = (ast_channel_tech(chan)->write_text == NULL) ? 0 :
5311  ast_channel_tech(chan)->write_text(chan, fr);
5312  } else {
5313  res = (ast_channel_tech(chan)->send_text == NULL) ? 0 :
5314  ast_channel_tech(chan)->send_text(chan, (char *) fr->data.ptr);
5315  }
5317  break;
5318  case AST_FRAME_HTML:
5319  CHECK_BLOCKING(chan);
5320  res = (ast_channel_tech(chan)->send_html == NULL) ? 0 :
5321  ast_channel_tech(chan)->send_html(chan, fr->subclass.integer, (char *) fr->data.ptr, fr->datalen);
5323  break;
5324  case AST_FRAME_VIDEO:
5325  /* XXX Handle translation of video codecs one day XXX */
5326  CHECK_BLOCKING(chan);
5327  if (ast_channel_tech(chan)->write_stream) {
5328  if (stream) {
5329  res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5330  } else {
5331  res = 0;
5332  }
5333  } else if ((stream == default_stream) && ast_channel_tech(chan)->write_video) {
5334  res = ast_channel_tech(chan)->write_video(chan, fr);
5335  } else {
5336  res = 0;
5337  }
5339  break;
5340  case AST_FRAME_MODEM:
5341  CHECK_BLOCKING(chan);
5342  res = tech_write(chan, stream, default_stream, fr);
5344  break;
5345  case AST_FRAME_VOICE:
5347  apply_plc(chan, fr);
5348  }
5349 
5350  f = fr;
5351 
5352  /*
5353  * Send frame to audiohooks if present, if frametype is linear (else, later as per
5354  * previous behavior)
5355  */
5356  if ((stream == default_stream) && ast_channel_audiohooks(chan)) {
5358  hooked = 1;
5360  }
5361  }
5362 
5363  /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
5364  if ((stream == default_stream) && ast_format_cmp(fr->subclass.format, ast_channel_rawwriteformat(chan)) != AST_FORMAT_CMP_EQUAL) {
5366  struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5367 
5368  /*
5369  * We are not setup to write this frame. Things may have changed
5370  * on the peer side of the world and we try to adjust the format to
5371  * make it compatible again. However, bad things can happen if we
5372  * cannot setup a new translation path. Problems range from no
5373  * audio, one-way audio, to garbled audio. The best we can do is
5374  * request the call to hangup since we could not make it compatible.
5375  *
5376  * Being continuously spammed by this message likely indicates a
5377  * problem with the peer because it cannot make up its mind about
5378  * which format to use.
5379  */
5380  ast_debug(1, "Channel %s changing write format from %s to %s, native formats %s\n",
5381  ast_channel_name(chan),
5385  if (ast_set_write_format(chan, fr->subclass.format)) {
5386  /* Could not handle the new write format. Induce a hangup. */
5387  break;
5388  }
5389  }
5390 
5391  if (ast_channel_writetrans(chan)) {
5392  struct ast_frame *trans_frame = ast_translate(ast_channel_writetrans(chan), f, 0);
5393  if (trans_frame != f && f != fr) {
5394  /*
5395  * If translate gives us a new frame and so did the audio
5396  * hook then we need to free the one from the audio hook.
5397  */
5398  ast_frfree(f);
5399  }
5400  f = trans_frame;
5401  }
5402  }
5403 
5404  if (!f) {
5405  res = 0;
5406  break;
5407  }
5408 
5409  if ((stream == default_stream) && ast_channel_audiohooks(chan) && !hooked) {
5410  struct ast_frame *prev = NULL, *new_frame, *cur, *dup;
5411  int freeoldlist = 0;
5412 
5413  if (f != fr) {
5414  freeoldlist = 1;
5415  }
5416 
5417  /* Since ast_audiohook_write may return a new frame, and the cur frame is
5418  * an item in a list of frames, create a new list adding each cur frame back to it
5419  * regardless if the cur frame changes or not. */
5420  for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
5422 
5423  /* if this frame is different than cur, preserve the end of the list,
5424  * free the old frames, and set cur to be the new frame */
5425  if (new_frame != cur) {
5426 
5427  /* doing an ast_frisolate here seems silly, but we are not guaranteed the new_frame
5428  * isn't part of local storage, meaning if ast_audiohook_write is called multiple
5429  * times it may override the previous frame we got from it unless we dup it */
5430  if ((dup = ast_frisolate(new_frame))) {
5432  if (freeoldlist) {
5433  AST_LIST_NEXT(cur, frame_list) = NULL;
5434  ast_frfree(cur);
5435  }
5436  if (new_frame != dup) {
5437  ast_frfree(new_frame);
5438  }
5439  cur = dup;
5440  }
5441  }
5442 
5443  /* now, regardless if cur is new or not, add it to the new list,
5444  * if the new list has not started, cur will become the first item. */
5445  if (prev) {
5446  AST_LIST_NEXT(prev, frame_list) = cur;
5447  } else {
5448  f = cur; /* set f to be the beginning of our new list */
5449  }
5450  prev = cur;
5451  }
5452  }
5453 
5454  /* If Monitor is running on this channel, then we have to write frames out there too */
5455  /* the translator on chan->writetrans may have returned multiple frames
5456  from the single frame we passed in; if so, feed each one of them to the
5457  monitor */
5458  if ((stream == default_stream) && ast_channel_monitor(chan) && ast_channel_monitor(chan)->write_stream) {
5459  struct ast_frame *cur;
5460 
5461  for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
5462  /* XXX must explain this code */
5463 #ifndef MONITOR_CONSTANT_DELAY
5464  int jump = ast_channel_insmpl(chan) - ast_channel_outsmpl(chan) - 4 * cur->samples;
5465  if (jump >= 0) {
5469  if (ast_seekstream(ast_channel_monitor(chan)->write_stream, jump, SEEK_FORCECUR) == -1) {
5470  ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
5471  }
5473  } else {
5475  }
5476 #else
5477  int jump = calc_monitor_jump((ast_channel_insmpl(chan) - ast_channel_outsmpl(chan)),
5480  if (jump - MONITOR_DELAY >= 0) {
5481  if (ast_seekstream(ast_channel_monitor(chan)->write_stream, jump - cur->samples, SEEK_FORCECUR) == -1) {
5482  ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
5483  }
5485  } else {
5487  }
5488 #endif
5490  if (ast_writestream(ast_channel_monitor(chan)->write_stream, cur) < 0)
5491  ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
5492  }
5493  }
5494  }
5495 
5496  /* the translator on chan->writetrans may have returned multiple frames
5497  from the single frame we passed in; if so, feed each one of them to the
5498  channel, freeing each one after it has been written */
5499  CHECK_BLOCKING(chan);
5500  if ((f != fr) && AST_LIST_NEXT(f, frame_list)) {
5501  struct ast_frame *cur, *next = NULL;
5502  unsigned int skip = 0;
5503 
5504  cur = f;
5505  while (cur) {
5506  next = AST_LIST_NEXT(cur, frame_list);
5507  AST_LIST_NEXT(cur, frame_list) = NULL;
5508  if (!skip) {
5509  res = tech_write(chan, stream, default_stream, cur);
5510  if (res < 0) {
5512  skip = 1;
5513  } else if (next) {
5514  /* don't do this for the last frame in the list,
5515  as the code outside the loop will do it once
5516  */
5518  }
5519  }
5520  ast_frfree(cur);
5521  cur = next;
5522  }
5523 
5524  /* reset f so the code below doesn't attempt to free it */
5525  f = NULL;
5526  } else {
5527  res = tech_write(chan, stream, default_stream, f);
5528  }
5530  break;
5531  case AST_FRAME_NULL:
5532  case AST_FRAME_IAX:
5533  /* Ignore these */
5534  res = 0;
5535  break;
5536  case AST_FRAME_RTCP:
5537  /* RTCP information is on a per-stream basis and only available on multistream capable channels */
5538  CHECK_BLOCKING(chan);
5539  if (ast_channel_tech(chan)->write_stream && stream) {
5540  res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5541  } else {
5542  res = 0;
5543  }
5545  break;
5546  default:
5547  /* At this point, fr is the incoming frame and f is NULL. Channels do
5548  * not expect to get NULL as a frame pointer and will segfault. Hence,
5549  * we output the original frame passed in. */
5550  CHECK_BLOCKING(chan);
5551  res = ast_channel_tech(chan)->write(chan, fr);
5553  break;
5554  }
5555 
5556  if (f && f != fr)
5557  ast_frfree(f);
5558 
5559  /* Consider a write failure to force a soft hangup */
5560  if (res < 0) {
5562  } else {
5564  }
5565 done:
5567  /* The list gets recreated if audiohooks are added again later */
5570  }
5571  ast_channel_unlock(chan);
5572  return res;
5573 }
static const char type[]
Definition: chan_ooh323.c:109
#define ast_channel_lock(chan)
Definition: channel.h:2945
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition: format.c:354
void * ast_channel_generatordata(const struct ast_channel *chan)
int(*const write_video)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format.
Definition: channel.h:787
struct ast_stream_topology * ast_channel_get_stream_topology(const struct ast_channel *chan)
Retrieve the topology of streams on a channel.
#define DEBUGCHAN_FLAG
Definition: channel.h:858
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.
Definition: channel.c:3516
int(*const write)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format (see frame.h)
Definition: channel.h:751
#define ast_test_flag(p, flag)
Definition: utils.h:63
static void send_dtmf_begin_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit)
Definition: channel.c:3378
unsigned int ast_channel_fout(const struct ast_channel *chan)
void ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list)
Detach audiohooks from list and destroy said list.
Definition: audiohook.c:594
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition: audiohook.c:1112
enum ast_media_type ast_stream_get_type(const struct ast_stream *stream)
Get the media type of a stream.
Definition: stream.c:316
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
#define LOG_WARNING
Definition: logger.h:274
unsigned long ast_channel_insmpl(const struct ast_channel *chan)
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:326
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:438
static void write_stream(struct ogg_vorbis_desc *s, FILE *f)
Write out any pending encoded data.
void ast_channel_audiohooks_set(struct ast_channel *chan, struct ast_audiohook_list *value)
void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix)
Definition: main/frame.c:731
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition: channel.c:4919
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:565
#define ast_str_alloca(init_len)
Definition: strings.h:800
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
struct ast_stream * ast_stream_topology_get_stream(const struct ast_stream_topology *topology, unsigned int position)
Get a specific stream from the topology.
Definition: stream.c:788
#define NULL
Definition: resample.c:96
struct ast_frame_subclass subclass
int done
Definition: test_amihooks.c:48
static int indicate_data_internal(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Definition: channel.c:4515
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition: channel.c:445
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
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
int(*const send_html)(struct ast_channel *chan, int subclass, const char *data, int len)
Send HTML data.
Definition: channel.h:763
const char * src
struct ast_stream * ast_channel_get_default_stream(struct ast_channel *chan, enum ast_media_type type)
Retrieve the default stream of a specific media type on a channel.
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
int(*const write_text)(struct ast_channel *chan, struct ast_frame *frame)
Write a text frame, in standard format.
Definition: channel.h:790
static int tech_write(struct ast_channel *chan, struct ast_stream *stream, struct ast_stream *default_stream, struct ast_frame *frame)
Definition: channel.c:5177
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition: channel.c:4969
int(*const send_text)(struct ast_channel *chan, const char *text)
Display or transmit text.
Definition: channel.h:757
#define ast_opt_generic_plc
Definition: options.h:134
static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
Definition: channel.c:5151
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:542
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:1127
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:754
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
void ast_channel_fout_set(struct ast_channel *chan, unsigned int value)
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:736
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&#39;s framehook list...
Definition: framehook.c:313
int ast_seekstream(struct ast_filestream *fs, off_t sample_offset, int whence)
Seeks into stream.
Definition: file.c:1038
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define SEEK_FORCECUR
Definition: file.h:51
#define FRAMECOUNT_INC(x)
Definition: channel.h:861
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2902
int ast_stream_topology_get_count(const struct ast_stream_topology *topology)
Get the number of streams in a topology.
Definition: stream.c:765
#define ast_clear_flag(p, flag)
Definition: utils.h:77
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
Definition: channel.h:2894
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
static void send_dtmf_end_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit, long duration_ms)
Definition: channel.c:3394
const char * ast_channel_name(const struct ast_channel *chan)
int ast_writestream(struct ast_filestream *fs, struct ast_frame *f)
Writes a frame to a stream.
Definition: file.c:209
struct ast_frame * next
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
#define ast_frfree(fr)
Data structure associated with a single frame of data.
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
unsigned long ast_channel_outsmpl(const struct ast_channel *chan)
union ast_frame::@263 data
ast_media_type
Types of media.
Definition: codec.h:30
enum ast_frame_type frametype
#define ast_channel_trylock(chan)
Definition: channel.h:2947
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_format * format
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
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_format * ast_format_t140
Built-in cached t140 format.
Definition: format_cache.c:236
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
struct ast_channel_monitor * ast_channel_monitor(const struct ast_channel *chan)
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
void ast_channel_outsmpl_set(struct ast_channel *chan, unsigned long value)

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

References ast_channel_tech(), and ast_write().

5063 {
5064  int res;
5065  if (!ast_channel_tech(chan)->write_video)
5066  return 0;
5067  res = ast_write(chan, fr);
5068  if (!res)
5069  res = 1;
5070  return res;
5071 }
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:5189
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

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

References ast_frame::samples.

Referenced by __ast_read(), and ast_write_stream().

3517 {
3518  int diff = sample_rate - seek_rate;
3519 
3520  if (diff > 0) {
3521  samples = samples / (float) (sample_rate / seek_rate);
3522  } else if (diff < 0) {
3523  samples = samples * (float) (seek_rate / sample_rate);
3524  }
3525 
3526  return samples;
3527 }

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

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

Referenced by ast_call_forward().

5960 {
5961  if (!ast_test_flag(ast_channel_flags(parent), AST_FLAG_ZOMBIE) && !ast_check_hangup(parent)) {
5962  struct ast_party_redirecting redirecting;
5963 
5964  /*
5965  * The parent is not a ZOMBIE or hungup so update it with the
5966  * original channel's redirecting information.
5967  */
5968  ast_party_redirecting_init(&redirecting);
5969  ast_channel_lock(orig);
5971  ast_channel_unlock(orig);
5972  if (ast_channel_redirecting_sub(orig, parent, &redirecting, 0) &&
5973  ast_channel_redirecting_macro(orig, parent, &redirecting, 1, 0)) {
5974  ast_channel_update_redirecting(parent, &redirecting, NULL);
5975  }
5976  ast_party_redirecting_free(&redirecting);
5977  }
5978 
5979  /* Safely inherit variables and datastores from the parent channel. */
5980  ast_channel_lock_both(parent, new_chan);
5981  ast_channel_inherit_variables(parent, new_chan);
5982  ast_channel_datastore_inherit(parent, new_chan);
5983  ast_max_forwards_decrement(new_chan);
5984  ast_channel_unlock(new_chan);
5985  ast_channel_unlock(parent);
5986 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
#define ast_test_flag(p, flag)
Definition: utils.h:63
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:6866
#define NULL
Definition: resample.c:96
int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
Inherit datastores from a parent to a child.
Definition: channel.c:2373
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_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&#39;s redirecting information.
Definition: channel.c:10584
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2179
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition: channel.c:2122
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition: channel.h:523
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition: channel.c:2135
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:10379
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2952
int ast_max_forwards_decrement(struct ast_channel *chan)
Decrement the max forwards count for a particular channel.
Definition: max_forwards.c:135
int ast_channel_redirecting_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const void *redirecting_info, int is_caller, int is_frame)
Run a redirecting interception macro and update a channel&#39;s redirecting information.
Definition: channel.c:10487
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

◆ channel_cc_params_copy()

static void* channel_cc_params_copy ( void *  data)
static

Definition at line 10629 of file channel.c.

References ast_cc_config_params_init, ast_cc_copy_config_params(), and NULL.

10630 {
10631  const struct ast_cc_config_params *src = data;
10633  if (!dest) {
10634  return NULL;
10635  }
10636  ast_cc_copy_config_params(dest, src);
10637  return dest;
10638 }
#define NULL
Definition: resample.c:96
#define ast_cc_config_params_init()
Allocate and initialize an ast_cc_config_params structure.
Definition: ccss.h:135
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:861

◆ channel_cc_params_destroy()

static void channel_cc_params_destroy ( void *  data)
static

Definition at line 10640 of file channel.c.

References ast_cc_config_params_destroy().

10641 {
10642  struct ast_cc_config_params *cc_params = data;
10643  ast_cc_config_params_destroy(cc_params);
10644 }
void ast_cc_config_params_destroy(struct ast_cc_config_params *params)
Free memory from CCSS configuration params.
Definition: ccss.c:693

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

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_monitor(), ast_channel_monitor_set(), ast_channel_musicclass(), AST_CHANNEL_NAME, ast_channel_name(), ast_channel_name_set(), 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_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, clone_variables(), ast_channel::connected, ast_datastore::data, ast_channel::dialed, errno, free_translation(), ast_datastore::info, len(), LOG_WARNING, NULL, ast_channel::redirecting, S_OR, and type.

Referenced by ast_channel_move().

6953 {
6954  int x;
6955  int origstate;
6956  unsigned int orig_disablestatecache;
6957  unsigned int clone_disablestatecache;
6958  int generator_fd;
6959  int visible_indication;
6960  int clone_hold_state;
6961  int moh_is_playing;
6962  struct ast_frame *current;
6963  const struct ast_channel_tech *t;
6964  void *t_pvt;
6965  union {
6966  struct ast_hangup_handler_list handlers;
6967  struct ast_party_dialed dialed;
6968  struct ast_party_caller caller;
6970  struct ast_party_redirecting redirecting;
6971  } exchange;
6972  struct ast_channel *bridged;
6973  struct ast_format *rformat;
6974  struct ast_format *wformat;
6975  struct ast_format *tmp_format;
6976  struct ast_format_cap *tmp_cap;
6977  char tmp_name[AST_CHANNEL_NAME];
6978  char clone_sending_dtmf_digit;
6979  struct timeval clone_sending_dtmf_tv;
6980 
6981  /* XXX This operation is a bit odd. We're essentially putting the guts of
6982  * the clone channel into the original channel. Start by killing off the
6983  * original channel's backend. While the features are nice, which is the
6984  * reason we're keeping it, it's still awesomely weird. XXX */
6985 
6986  /* Indicate to each channel that a masquerade is about to begin. */
6987  x = 1;
6988  ast_indicate_data(original, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
6989  ast_indicate_data(clonechan, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
6990 
6991  /*
6992  * The container lock is necessary for proper locking order
6993  * because the channels must be unlinked to change their
6994  * names.
6995  *
6996  * The original and clonechan locks must be held while the
6997  * channel contents are shuffled around for the masquerade.
6998  *
6999  * The masq and masqr pointers need to be left alone until the masquerade
7000  * has restabilized the channels to hold off ast_hangup() and until
7001  * AST_FLAG_ZOMBIE can be set on the clonechan.
7002  */
7003  ao2_lock(channels);
7004 
7005  /* Bump the refs to ensure that they won't dissapear on us. */
7006  ast_channel_ref(original);
7007  ast_channel_ref(clonechan);
7008 
7009  /* unlink from channels container as name (which is the hash value) will change */
7010  ao2_unlink(channels, original);
7011  ao2_unlink(channels, clonechan);
7012 
7013  moh_is_playing = ast_test_flag(ast_channel_flags(original), AST_FLAG_MOH);
7014  if (moh_is_playing) {
7015  /* Stop MOH on the old original channel. */
7016  ast_moh_stop(original);
7017  }
7018 
7019  /*
7020  * Stop any visible indication on the original channel so we can
7021  * transfer it to the clonechan taking the original's place.
7022  */
7023  ast_channel_lock(original);
7024  visible_indication = ast_channel_visible_indication(original);
7025  ast_channel_unlock(original);
7026  ast_indicate(original, -1);
7027 
7028  /* Start the masquerade channel contents rearangement. */
7029  ast_channel_lock_both(original, clonechan);
7030 
7031  ast_debug(1, "Actually Masquerading %s(%u) into the structure of %s(%u)\n",
7032  ast_channel_name(clonechan), ast_channel_state(clonechan),
7033  ast_channel_name(original), ast_channel_state(original));
7034 
7035  /* When all is said and done force new snapshot segments so they are
7036  * up to date.
7037  */
7040 
7041  /*
7042  * Remember the original read/write formats. We turn off any
7043  * translation on either one
7044  */
7045  rformat = ao2_bump(ast_channel_readformat(original));
7046  wformat = ao2_bump(ast_channel_writeformat(original));
7047  free_translation(clonechan);
7048  free_translation(original);
7049 
7050  clone_hold_state = ast_channel_hold_state(clonechan);
7051 
7052  /* Save the current DTMF digit being sent if any. */
7053  clone_sending_dtmf_digit = ast_channel_sending_dtmf_digit(clonechan);
7054  clone_sending_dtmf_tv = ast_channel_sending_dtmf_tv(clonechan);
7055 
7056  /* Swap uniqueid's of the channels. This needs to happen before channel renames,
7057  * so rename events get the proper id's.
7058  */
7060 
7061  /* Make sure the Stasis topic on the channel is updated appropriately */
7062  ast_channel_internal_swap_topics(clonechan, original);
7063 
7064  /* Swap endpoint forward so channel created with endpoint exchanges its state
7065  * with other channel for proper endpoint cleanup.
7066  */
7067  ast_channel_internal_swap_endpoint_forward(clonechan, original);
7068 
7069  /* The old snapshots need to follow the channels so the snapshot update is correct */
7070  ast_channel_internal_swap_snapshots(clonechan, original);
7071 
7072  /* Swap channel names. This uses ast_channel_name_set directly, so we
7073  * don't get any spurious rename events.
7074  */
7075  ast_copy_string(tmp_name, ast_channel_name(clonechan), sizeof(tmp_name));
7076  ast_channel_name_set(clonechan, ast_channel_name(original));
7077  ast_channel_name_set(original, tmp_name);
7078 
7079  /* Swap the technologies */
7080  t = ast_channel_tech(original);
7081  ast_channel_tech_set(original, ast_channel_tech(clonechan));
7082  ast_channel_tech_set(clonechan, t);
7083 
7084  t_pvt = ast_channel_tech_pvt(original);
7085  ast_channel_tech_pvt_set(original, ast_channel_tech_pvt(clonechan));
7086  ast_channel_tech_pvt_set(clonechan, t_pvt);
7087 
7088  /* Swap the alertpipes */
7089  ast_channel_internal_alertpipe_swap(original, clonechan);
7090 
7091  /*
7092  * Swap the readq's. The end result should be this:
7093  *
7094  * 1) All frames should be on the new (original) channel.
7095  * 2) Any frames that were already on the new channel before this
7096  * masquerade need to be at the end of the readq, after all of the
7097  * frames on the old (clone) channel.
7098  * 3) The alertpipe needs to get poked for every frame that was already
7099  * on the new channel, since we are now using the alert pipe from the
7100  * old (clone) channel.
7101  */
7102  {
7103  AST_LIST_HEAD_NOLOCK(, ast_frame) tmp_readq;
7104 
7105  AST_LIST_HEAD_INIT_NOLOCK(&tmp_readq);
7106  AST_LIST_APPEND_LIST(&tmp_readq, ast_channel_readq(original), frame_list);
7108 
7109  while ((current = AST_LIST_REMOVE_HEAD(&tmp_readq, frame_list))) {
7110  AST_LIST_INSERT_TAIL(ast_channel_readq(original), current, frame_list);
7111  if (ast_channel_alert_write(original)) {
7112  ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
7113  }
7114  }
7115  }
7116 
7117  /* Swap the raw formats */
7118  tmp_format = ao2_bump(ast_channel_rawreadformat(original));
7120  ast_channel_set_rawreadformat(clonechan, tmp_format);
7121  ao2_cleanup(tmp_format);
7122 
7123  tmp_format = ao2_bump(ast_channel_rawwriteformat(original));
7125  ast_channel_set_rawwriteformat(clonechan, tmp_format);
7126  ao2_cleanup(tmp_format);
7127 
7129 
7130  /* And of course, so does our current state. Note we need not
7131  call ast_setstate since the event manager doesn't really consider
7132  these separate. We do this early so that the clone has the proper
7133  state of the original channel. */
7134  origstate = ast_channel_state(original);
7135  ast_channel_state_set(original, ast_channel_state(clonechan));
7136  ast_channel_state_set(clonechan, origstate);
7137 
7138  /* And the swap the cachable state too. Otherwise we'd start caching
7139  * Local channels and ignoring real ones. */
7140  orig_disablestatecache = ast_test_flag(ast_channel_flags(original), AST_FLAG_DISABLE_DEVSTATE_CACHE);
7141  clone_disablestatecache = ast_test_flag(ast_channel_flags(clonechan), AST_FLAG_DISABLE_DEVSTATE_CACHE);
7142  if (orig_disablestatecache != clone_disablestatecache) {
7143  if (orig_disablestatecache) {
7146  } else {
7149  }
7150  }
7151 
7152  /* Update the type. */
7153  t_pvt = ast_channel_monitor(original);
7154  ast_channel_monitor_set(original, ast_channel_monitor(clonechan));
7155  ast_channel_monitor_set(clonechan, t_pvt);
7156 
7157  /* Keep the same language. */
7158  ast_channel_language_set(original, ast_channel_language(clonechan));
7159 
7160  /* Keep the same parkinglot. */
7161  ast_channel_parkinglot_set(original, ast_channel_parkinglot(clonechan));
7162 
7163  /* Clear all existing file descriptors but retain the generator */
7164  generator_fd = ast_channel_fd(original, AST_GENERATOR_FD);
7166  ast_channel_set_fd(original, AST_GENERATOR_FD, generator_fd);
7167 
7168  /* Copy all file descriptors present on clonechan to original, skipping generator */
7169  for (x = 0; x < ast_channel_fd_count(clonechan); x++) {
7170  if (x != AST_GENERATOR_FD)
7171  ast_channel_set_fd(original, x, ast_channel_fd(clonechan, x));
7172  }
7173 
7174  ast_app_group_update(clonechan, original);
7175 
7176  /* Swap hangup handlers. */
7177  exchange.handlers = *ast_channel_hangup_handlers(original);
7179  *ast_channel_hangup_handlers(clonechan) = exchange.handlers;
7180 
7181  /* Call fixup handlers for the clone chan */
7182  if (AST_LIST_FIRST(ast_channel_datastores(clonechan))) {
7183  struct ast_datastore *ds;
7184  /* We use a safe traversal here because some fixup routines actually
7185  * remove the datastore from the list and free them.
7186  */
7188  if (ds->info->chan_fixup) {
7189  ds->info->chan_fixup(ds->data, clonechan, original);
7190  }
7191  }
7193  }
7194 
7195  /* Call breakdown handlers for the original chan */
7196  if (AST_LIST_FIRST(ast_channel_datastores(original))) {
7197  struct ast_datastore *ds;
7198  /* We use a safe traversal here because some breakdown routines may
7199  * remove the datastore from the list and free them.
7200  */
7202  if (ds->info->chan_breakdown) {
7203  ds->info->chan_breakdown(ds->data, clonechan, original);
7204  }
7205  }
7207  }
7208 
7209  /* Move data stores over */
7210  if (AST_LIST_FIRST(ast_channel_datastores(clonechan))) {
7212  }
7213 
7214  /* Move framehooks over */
7215  ast_framehook_list_fixup(clonechan, original);
7216 
7217  /* Move audiohooks over */
7218  ast_audiohook_move_all(clonechan, original);
7219 
7220  ast_autochan_new_channel(clonechan, original);
7221 
7222  clone_variables(original, clonechan);
7223  /* Presense of ADSI capable CPE follows clone */
7224  ast_channel_adsicpe_set(original, ast_channel_adsicpe(clonechan));
7225  /* Bridge remains the same */
7226  /* CDR fields remain the same */
7227  /* XXX What about blocking, softhangup, blocker, and lock and blockproc? XXX */
7228  /* Application and data remain the same */
7229  /* Clone exception becomes real one, as with fdno */
7231  ast_channel_fdno_set(original, ast_channel_fdno(clonechan));
7232  /* Schedule context remains the same */
7233  /* Stream stuff stays the same */
7234  /* Keep the original state. The fixup code will need to work with it most likely */
7235 
7236  /*
7237  * Just swap the whole structures, nevermind the allocations,
7238  * they'll work themselves out.
7239  */
7240  exchange.dialed = *ast_channel_dialed(original);
7241  ast_channel_dialed_set(original, ast_channel_dialed(clonechan));
7242  ast_channel_dialed_set(clonechan, &exchange.dialed);
7243 
7244  /* Reset any earlier private caller id representations */
7245  ast_party_id_reset(&ast_channel_caller(original)->priv);
7246  ast_party_id_reset(&ast_channel_caller(clonechan)->priv);
7247 
7248  exchange.caller = *ast_channel_caller(original);
7249  ast_channel_caller_set(original, ast_channel_caller(clonechan));
7250  ast_channel_caller_set(clonechan, &exchange.caller);
7251 
7252  /* Reset any earlier private connected id representations */
7253  ast_party_id_reset(&ast_channel_connected(original)->priv);
7254  ast_party_id_reset(&ast_channel_connected(clonechan)->priv);
7255 
7256  exchange.connected = *ast_channel_connected(original);
7257  ast_channel_connected_set(original, ast_channel_connected(clonechan));
7258  ast_channel_connected_set(clonechan, &exchange.connected);
7259 
7260  /* Reset any earlier private redirecting orig, from or to representations */
7261  ast_party_id_reset(&ast_channel_redirecting(original)->priv_orig);
7262  ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_orig);
7263  ast_party_id_reset(&ast_channel_redirecting(original)->priv_from);
7264  ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_from);
7265  ast_party_id_reset(&ast_channel_redirecting(original)->priv_to);
7266  ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_to);
7267 
7268  exchange.redirecting = *ast_channel_redirecting(original);
7270  ast_channel_redirecting_set(clonechan, &exchange.redirecting);
7271 
7272  ast_channel_publish_snapshot(original);
7273 
7274  /* Restore original timing file descriptor */
7276 
7277  /* Our native formats are different now */
7279  if (tmp_cap) {
7281  ast_channel_nativeformats_set(original, tmp_cap);
7282  ao2_ref(tmp_cap, -1);
7283  }
7284 
7285  /* Context, extension, priority, app data, jump table, remain the same */
7286  /* pvt switches. pbx stays the same, as does next */
7287 
7288  /* Set the write format */
7289  ast_set_write_format(original, wformat);
7290 
7291  /* Set the read format */
7292  ast_set_read_format(original, rformat);
7293 
7294  /* Copy the music class */
7295  ast_channel_musicclass_set(original, ast_channel_musicclass(clonechan));
7296 
7297  /* copy over accuntcode and set peeraccount across the bridge */
7298  ast_channel_accountcode_set(original, S_OR(ast_channel_accountcode(clonechan), ""));
7299 
7300  ast_debug(1, "Putting channel %s in %s/%s formats\n", ast_channel_name(original),
7301  ast_format_get_name(wformat), ast_format_get_name(rformat));
7302 
7303  /* Fixup the original clonechan's physical side */
7304  if (ast_channel_tech(original)->fixup && ast_channel_tech(original)->fixup(clonechan, original)) {
7305  ast_log(LOG_WARNING, "Channel type '%s' could not fixup channel %s, strange things may happen. (clonechan)\n",
7306  ast_channel_tech(original)->type, ast_channel_name(original));
7307  }
7308 
7309  /* Fixup the original original's physical side */
7310  if (ast_channel_tech(clonechan)->fixup && ast_channel_tech(clonechan)->fixup(original, clonechan)) {
7311  ast_log(LOG_WARNING, "Channel type '%s' could not fixup channel %s, strange things may happen. (original)\n",
7312  ast_channel_tech(clonechan)->type, ast_channel_name(clonechan));
7313  }
7314 
7315  ast_channel_internal_swap_stream_topology(original, clonechan);
7316 
7317  /*
7318  * Now, at this point, the "clone" channel is totally F'd up.
7319  * We mark it as a zombie so nothing tries to touch it.
7320  *
7321  * This must be done before we unlock clonechan to prevent
7322  * setting up another masquerade on the clonechan.
7323  */
7325  ast_queue_frame(clonechan, &ast_null_frame);
7326 
7327  ast_channel_unlock(original);
7328  ast_channel_unlock(clonechan);
7329 
7330  /*
7331  * Indicate to each channel that a masquerade is complete.
7332  *
7333  * We can still do this to clonechan even though it is a
7334  * zombie because ast_indicate_data() will explicitly pass
7335  * this control and ast_hangup() is held off until the
7336  * ast_channel_masq() and ast_channel_masqr() pointers are
7337  * cleared.
7338  */
7339  x = 0;
7340  ast_indicate_data(original, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
7341  ast_indicate_data(clonechan, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
7342 
7343  ast_bridge_notify_masquerade(original);
7344 
7345  if (clone_hold_state == AST_CONTROL_HOLD) {
7346  ast_debug(1, "Channel %s simulating UNHOLD for masquerade.\n",
7347  ast_channel_name(original));
7348  ast_indicate(original, AST_CONTROL_UNHOLD);
7349  }
7350  if (clone_sending_dtmf_digit) {
7351  /*
7352  * The clonechan was sending a DTMF digit that was not completed
7353  * before the masquerade.
7354  */
7355  ast_channel_end_dtmf(original, clone_sending_dtmf_digit, clone_sending_dtmf_tv,
7356  "masquerade");
7357  }
7358 
7359  /*
7360  * If an indication is currently playing, maintain it on the
7361  * channel that is taking the place of original.
7362  *
7363  * This is needed because the masquerade is swapping out the
7364  * internals of the channel, and the new channel private data
7365  * needs to be made aware of the current visible indication
7366  * (RINGING, CONGESTION, etc.)
7367  */
7368  if (visible_indication) {
7369  if (visible_indication == AST_CONTROL_HOLD) {
7370  const char *latest_musicclass;
7371  int len;
7372 
7373  ast_channel_lock(original);
7374  latest_musicclass = ast_strdupa(ast_channel_latest_musicclass(original));
7375  ast_channel_unlock(original);
7376  if (ast_strlen_zero(latest_musicclass)) {
7377  latest_musicclass = NULL;
7378  len = 0;
7379  } else {
7380  len = strlen(latest_musicclass) + 1;
7381  }
7382  ast_indicate_data(original, visible_indication, latest_musicclass, len);
7383  } else {
7384  ast_indicate(original, visible_indication);
7385  }
7386  }
7387 
7388  /*
7389  * If MOH was playing on the original channel then it needs to be
7390  * maintained on the channel that is replacing it.
7391  */
7392  if (moh_is_playing) {
7393  /* Start MOH on the new original channel. */
7394  ast_moh_start(original, NULL, NULL);
7395  }
7396 
7397  ast_channel_lock(original);
7398 
7399  /* Signal any blocker */
7401  pthread_kill(ast_channel_blocker(original), SIGURG);
7402  }
7403 
7404  ast_debug(1, "Done Masquerading %s (%u)\n", ast_channel_name(original), ast_channel_state(original));
7405  ast_channel_unlock(original);
7406 
7407  if ((bridged = ast_channel_bridge_peer(original))) {
7409  ast_channel_unref(bridged);
7410  }
7412 
7413  /* Now that the operation is complete, we can clear the masq
7414  * and masqr fields of both channels.
7415  */
7416  ast_channel_lock_both(original, clonechan);
7417  ast_channel_masq_set(original, NULL);
7418  ast_channel_masqr_set(clonechan, NULL);
7419  ast_channel_unlock(original);
7420  ast_channel_unlock(clonechan);
7421 
7422  ao2_link(channels, clonechan);
7423  ao2_link(channels, original);
7425 
7426  /* Release our held safety references. */
7427  ast_channel_unref(original);
7428  ast_channel_unref(clonechan);
7429 
7430  ao2_cleanup(rformat);
7431  ao2_cleanup(wformat);
7432 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
void ast_channel_fdno_set(struct ast_channel *chan, int value)
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
Sets read format on channel chan.
Definition: channel.c:5849
int ast_channel_hold_state(const struct ast_channel *chan)
struct ast_party_connected_line connected
Channel Connected Line ID information.
const char *const type
Definition: channel.h:630
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:420
struct ast_party_caller caller
Channel Caller ID information.
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:64
void * ast_channel_tech_pvt(const struct ast_channel *chan)
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2981
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
#define ast_test_flag(p, flag)
Definition: utils.h:63
char ast_channel_sending_dtmf_digit(const struct ast_channel *chan)
static void free_translation(struct ast_channel *clonechan)
Definition: channel.c:2492
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
#define ast_set_flag(p, flag)
Definition: utils.h:70
void ast_channel_dialed_set(struct ast_channel *chan, struct ast_party_dialed *value)
#define LOG_WARNING
Definition: logger.h:274
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
Definition: channel.c:7876
struct ast_party_redirecting redirecting
Redirecting/Diversion information.
ast_channel_state
ast_channel states
Definition: channelstate.h:35
static void clone_variables(struct ast_channel *original, struct ast_channel *clonechan)
Clone channel variables from &#39;clone&#39; channel into &#39;original&#39; channel.
Definition: channel.c:6917
Definition of a media format.
Definition: format.c:43
#define ao2_unlock(a)
Definition: astobj2.h:730
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
Structure for a data store object.
Definition: datastore.h:68
void ast_channel_softhangup_internal_flag_set(struct ast_channel *chan, int value)
#define NULL
Definition: resample.c:96
void ast_channel_internal_fd_clear_all(struct ast_channel *chan)
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
void ast_channel_internal_swap_stream_topology(struct ast_channel *chan1, struct ast_channel *chan2)
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
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:2143
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition: channel.c:4322
#define ast_strlen_zero(foo)
Definition: strings.h:52
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
#define ao2_bump(obj)
Definition: astobj2.h:491
void ast_channel_internal_alertpipe_swap(struct ast_channel *chan1, struct ast_channel *chan2)
Swap the interal alertpipe between two channels.
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:7866
struct ast_readq_list * ast_channel_readq(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.
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:50
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:4698
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
void ast_channel_masq_set(struct ast_channel *chan, struct ast_channel *value)
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_internal_swap_topics(struct ast_channel *a, struct ast_channel *b)
Swap topics beteween two channels.
const char * ast_channel_latest_musicclass(const struct ast_channel *chan)
const char * ast_channel_accountcode(const struct ast_channel *chan)
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
int ast_channel_visible_indication(const struct ast_channel *chan)
Caller Party information.
Definition: channel.h:419
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
const struct ast_datastore_info * info
Definition: datastore.h:71
#define ao2_lock(a)
Definition: astobj2.h:718
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
#define AST_GENERATOR_FD
Definition: channel.h:204
void ast_channel_internal_swap_uniqueid_and_linkedid(struct ast_channel *a, struct ast_channel *b)
Swap uniqueid and linkedid beteween two channels.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
AST_LIST_HEAD_NOLOCK(contactliststruct, contact)
void ast_party_id_reset(struct ast_party_id *id)
Destroy and initialize the given party id structure.
Definition: channel.c:1896
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
void ast_channel_caller_set(struct ast_channel *chan, struct ast_party_caller *value)
Structure to describe a channel "technology", ie a channel driver See for examples: ...
Definition: channel.h:629
void ast_channel_adsicpe_set(struct ast_channel *chan, enum ast_channel_adsicpe value)
int ast_channel_fdno(const struct ast_channel *chan)
void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value)
int ast_channel_timingfd(const struct ast_channel *chan)
struct ast_party_dialed dialed
Dialed/Called information.
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
Dialed/Called Party information.
Definition: channel.h:379
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
#define ao2_unlink(container, obj)
Definition: astobj2.h:1598
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define AST_TIMING_FD
Definition: channel.h:202
ast_channel_adsicpe
Definition: channel.h:869
int errno
pthread_t ast_channel_blocker(const struct ast_channel *chan)
Connected Line/Party information.
Definition: channel.h:457
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
int(*const fixup)(struct ast_channel *oldchan, struct ast_channel *newchan)
Fix up a channel: If a channel is consumed, this is called. Basically update any ->owner links...
Definition: channel.h:775
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition: channel.h:523
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:11070
#define ast_channel_unlock(chan)
Definition: channel.h:2946
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel&#39;s bridge peer only if the bridge is two-party.
Definition: channel.c:10765
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
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
#define AST_CHANNEL_NAME
Definition: channel.h:172
#define AST_FLAGS_ALL
Definition: utils.h:196
void ast_bridge_notify_masquerade(struct ast_channel *chan)
Notify bridging that this channel was just masqueraded.
Definition: bridge.c:1482
#define ast_clear_flag(p, flag)
Definition: utils.h:77
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
struct ast_frame ast_null_frame
Definition: main/frame.c:79
struct timeval ast_channel_sending_dtmf_tv(const struct ast_channel *chan)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2952
int ast_channel_fd(const struct ast_channel *chan, int which)
void * data
Definition: datastore.h:70
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680
#define ast_channel_ref(c)
Increase channel reference count.
Definition: channel.h:2970
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const char * ast_channel_name(const struct ast_channel *chan)
int ast_channel_fd_count(const struct ast_channel *chan)
Retrieve the number of file decriptor positions present on the channel.
void ast_channel_state_set(struct ast_channel *chan, enum ast_channel_state)
void ast_channel_connected_set(struct ast_channel *chan, struct ast_party_connected_line *value)
Data structure associated with a single frame of data.
const char * ast_channel_language(const struct ast_channel *chan)
struct ast_flags * ast_channel_snapshot_segment_flags(struct ast_channel *chan)
Definition: search.h:40
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
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
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
void ast_channel_internal_swap_snapshots(struct ast_channel *a, struct ast_channel *b)
Swap snapshots beteween two channels.
void ast_channel_name_set(struct ast_channel *chan, const char *name)
Set the channel name.
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890
char connected
Definition: eagi_proxy.c:82
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
struct ast_channel_monitor * ast_channel_monitor(const struct ast_channel *chan)
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
const char * ast_channel_parkinglot(const struct ast_channel *chan)
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
Definition: channel.c:2431
int ast_channel_alert_write(struct ast_channel *chan)
const char * ast_channel_musicclass(const struct ast_channel *chan)
void ast_channel_redirecting_set(struct ast_channel *chan, struct ast_party_redirecting *value)
void ast_channel_monitor_set(struct ast_channel *chan, struct ast_channel_monitor *value)
#define AST_LIST_APPEND_LIST(head, list, field)
Appends a whole list to the tail of a list.
Definition: linkedlists.h:782
#define ao2_link(container, obj)
Definition: astobj2.h:1549

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

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(), ast_datastore::data, and NULL.

Referenced by ast_channel_feature_hooks_append(), and ast_channel_feature_hooks_replace().

11116 {
11117  struct ast_datastore *datastore;
11118  struct ast_bridge_features *ds_features;
11119 
11121  if (datastore) {
11122  ds_features = datastore->data;
11123  if (replace) {
11124  ast_bridge_features_cleanup(ds_features);
11125  ast_bridge_features_init(ds_features);
11126  }
11127  if (features) {
11128  ast_bridge_features_merge(ds_features, features);
11129  }
11130  return 0;
11131  }
11132 
11134  if (!datastore) {
11135  return -1;
11136  }
11137 
11138  ds_features = ast_bridge_features_new();
11139  if (!ds_features) {
11140  ast_datastore_free(datastore);
11141  return -1;
11142  }
11143 
11144  if (features) {
11145  ast_bridge_features_merge(ds_features, features);
11146  }
11147  datastore->data = ds_features;
11148  ast_channel_datastore_add(chan, datastore);
11149  return 0;
11150 }
void ast_bridge_features_cleanup(struct ast_bridge_features *features)
Clean up the contents of a bridge features structure.
Definition: bridge.c:3720
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:2404
Structure that contains features information.
int ast_bridge_features_init(struct ast_bridge_features *features)
Initialize bridge features structure.
Definition: bridge.c:3687
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
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:3662
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:790
struct ast_bridge_features * ast_bridge_features_new(void)
Allocate a new bridge features struct.
Definition: bridge.c:3750
void * data
Definition: datastore.h:70
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2390
static const struct ast_datastore_info bridge_features_info
Definition: channel.c:11099
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89

◆ channel_get_external_vars()

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

Definition at line 8038 of file channel.c.

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

Referenced by ast_channel_get_ari_vars(), and ast_channel_get_manager_vars().

8040 {
8041  RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
8042  RAII_VAR(struct ast_str *, tmp, NULL, ast_free);
8043  struct manager_channel_variable *mcv;
8045 
8046  if (AST_LIST_EMPTY(channelvars)) {
8047  return NULL;
8048  }
8049 
8050  ret = ao2_alloc(sizeof(*ret), varshead_dtor);
8051  tmp = ast_str_create(16);
8052 
8053  if (!ret || !tmp) {
8054  return NULL;
8055  }
8056 
8057  AST_LIST_TRAVERSE(channelvars, mcv, entry) {
8058  const char *val = NULL;
8059  struct ast_var_t *var;
8060 
8061  if (mcv->isfunc) {
8062  if (ast_func_read2(chan, mcv->name, &tmp, 0) == 0) {
8063  val = ast_str_buffer(tmp);
8064  } else {
8066  "Error invoking function %s\n", mcv->name);
8067  }
8068  } else {
8069  val = pbx_builtin_getvar_helper(chan, mcv->name);
8070  }
8071 
8072  var = ast_var_assign(mcv->name, val ? val : "");
8073  if (!var) {
8074  return NULL;
8075  }
8076 
8077  AST_RWLIST_INSERT_TAIL(ret, var, entries);
8078  }
8079 
8080  ao2_ref(ret, +1);
8081  return ret;
8082 
8083 }
Definition: ast_expr2.c:325
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
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
static int tmp()
Definition: bt_open.c:389
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define var
Definition: ast_expr2f.c:614
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:449
#define NULL
Definition: resample.c:96
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
List of channel variables to append to all channel-related events.
Definition: channel.c:7925
#define ast_log
Definition: astobj2.c:42
unsigned int isfunc
Definition: channel.c:7927
static void varshead_dtor(void *obj)
Destructor for lists of variables.
Definition: channel.c:8003
#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:911
ast_mutex_t lock
Definition: app_meetme.c:1091
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define SCOPED_LOCK(varname, lock, lockfunc, unlockfunc)
Scoped Locks.
Definition: lock.h:581
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
#define ast_free(a)
Definition: astmm.h:182
struct ast_var_t::@249 entries
#define ast_var_assign(name, value)
Definition: chanvars.h:40
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:740
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
Definition: search.h:40
#define ast_str_create(init_len)
Create a malloc&#39;ed dynamic length string.
Definition: strings.h:620

◆ channel_has_external_vars()

static int channel_has_external_vars ( struct external_vars channelvars)
static

Definition at line 7946 of file channel.c.

References AST_LIST_EMPTY, AST_RWLIST_RDLOCK, and AST_RWLIST_UNLOCK.

Referenced by ast_channel_has_ari_vars(), and ast_channel_has_manager_vars().

7947 {
7948  int vars_present;
7949 
7950  AST_RWLIST_RDLOCK(channelvars);
7951  vars_present = !AST_LIST_EMPTY(channelvars);
7952  AST_RWLIST_UNLOCK(channelvars);
7953 
7954  return vars_present;
7955 }
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:449
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77

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

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

6469 {
6470  /*
6471  * The primary reason for the existence of this function is
6472  * so local channels can propagate accountcodes to the ;2
6473  * channel before ast_call().
6474  *
6475  * The secondary reason is to propagate the CHANNEL(peeraccount)
6476  * value set before Dial, FollowMe, and Queue while maintaining
6477  * the historic straight across accountcode propagation as a
6478  * fallback.
6479  */
6480  switch (relationship) {
6482  /* Crossover the requestor's accountcode and peeraccount */
6483  if (!precious || ast_strlen_zero(ast_channel_accountcode(chan))) {
6484  /*
6485  * The newly created channel does not have an accountcode
6486  * or we don't care.
6487  */
6488  if (!ast_strlen_zero(ast_channel_peeraccount(requestor))) {
6489  /*
6490  * Set it to the requestor's peeraccount. This allows the
6491  * dialplan to indicate the accountcode to use when dialing
6492  * by setting CHANNEL(peeraccount).
6493  */
6494  ast_channel_accountcode_set(chan, ast_channel_peeraccount(requestor));
6495  } else if (!precious
6496  && !ast_strlen_zero(ast_channel_accountcode(requestor))) {
6497  /*
6498  * Fallback to the historic propagation and set it to the
6499  * requestor's accountcode.
6500  */
6501  ast_channel_accountcode_set(chan, ast_channel_accountcode(requestor));
6502  }
6503  }
6504  if (!ast_strlen_zero(ast_channel_accountcode(requestor))) {
6505  ast_channel_peeraccount_set(chan, ast_channel_accountcode(requestor));
6506  }
6507  break;
6509  /* Pass the requestor's accountcode and peeraccount straight. */
6510  if (!precious || ast_strlen_zero(ast_channel_accountcode(chan))) {
6511  /*
6512  * The newly created channel does not have an accountcode
6513  * or we don't care.
6514  */
6515  if (!ast_strlen_zero(ast_channel_accountcode(requestor))) {
6516  ast_channel_accountcode_set(chan, ast_channel_accountcode(requestor));
6517  }
6518  }
6519  if (!ast_strlen_zero(ast_channel_peeraccount(requestor))) {
6520  ast_channel_peeraccount_set(chan, ast_channel_peeraccount(requestor));
6521  }
6522  break;
6523  }
6524 }
#define ast_strlen_zero(foo)
Definition: strings.h:52
const char * ast_channel_accountcode(const struct ast_channel *chan)
const char * ast_channel_peeraccount(const struct ast_channel *chan)

◆ channel_set_external_vars()

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

Definition at line 7967 of file channel.c.

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

7968 {
7969  size_t i;
7970 
7971  free_external_channelvars(channelvars);
7972  AST_RWLIST_WRLOCK(channelvars);
7973  for (i = 0; i < varc; ++i) {
7974  const char *var = vars[i];
7975  struct manager_channel_variable *mcv;
7976  if (!(mcv = ast_calloc(1, sizeof(*mcv) + strlen(var) + 1))) {
7977  break;
7978  }
7979  strcpy(mcv->name, var); /* SAFE */
7980  if (strchr(var, '(')) {
7981  mcv->isfunc = 1;
7982  }
7983  AST_RWLIST_INSERT_TAIL(channelvars, mcv, entry);
7984  }
7985  AST_RWLIST_UNLOCK(channelvars);
7986 
7987 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define var
Definition: ast_expr2f.c:614
List of channel variables to append to all channel-related events.
Definition: channel.c:7925
unsigned int isfunc
Definition: channel.c:7927
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:740
Definition: search.h:40
static void free_external_channelvars(struct external_vars *channelvars)
Definition: channel.c:7936

◆ channel_set_intercept_mode()

static void channel_set_intercept_mode ( int  in_intercept_mode)
static

Definition at line 10419 of file channel.c.

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

Referenced by ast_channel_connected_line_macro(), ast_channel_connected_line_sub(), ast_channel_redirecting_macro(), and ast_channel_redirecting_sub().

10420 {
10421  int status;
10422 
10423  status = ast_threadstorage_set_ptr(&in_intercept_routine,
10424  in_intercept_mode ? (void *) 1 : (void *) 0);
10425  if (status) {
10426  ast_log(LOG_ERROR, "Failed to set dialplan intercept mode\n");
10427  }
10428 }
#define ast_log
Definition: astobj2.c:42
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.
#define LOG_ERROR
Definition: logger.h:285
jack_status_t status
Definition: app_jack.c:146

◆ channels_shutdown()

static void channels_shutdown ( void  )
static

Definition at line 8095 of file channel.c.

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

Referenced by ast_channels_init().

8096 {
8099 
8101  if (channels) {
8102  ao2_container_unregister("channels");
8103  ao2_ref(channels, -1);
8104  channels = NULL;
8105  }
8107 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
static struct external_vars ami_vars
Definition: channel.c:7933
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister channel driver.
Definition: channel.c:570
#define NULL
Definition: resample.c:96
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:702
void ao2_container_unregister(const char *name)
Unregister a container for CLI stats and integrity check.
#define ao2_ref(o, delta)
Definition: astobj2.h:464
static struct external_vars ari_vars
Definition: channel.c:7934
static struct ao2_container * channels
All active channels on the system.
Definition: channel.c:124
static void free_external_channelvars(struct external_vars *channelvars)
Definition: channel.c:7936
static struct ast_cli_entry cli_channel[]
Definition: channel.c:390

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

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

Referenced by channel_do_masquerade().

6918 {
6919  struct ast_var_t *current, *newvar;
6920  /* Append variables from clone channel into original channel */
6921  /* XXX Is this always correct? We have to in order to keep MACROS working XXX */
6923 
6924  /* then, dup the varshead list into the clone */
6925 
6926  AST_LIST_TRAVERSE(ast_channel_varshead(original), current, entries) {
6927  newvar = ast_var_assign(current->name, current->value);
6928  if (newvar)
6929  AST_LIST_INSERT_TAIL(ast_channel_varshead(clonechan), newvar, entries);
6930  }
6931 }
struct varshead * ast_channel_varshead(struct ast_channel *chan)
char name[0]
Definition: chanvars.h:31
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
char * value
Definition: chanvars.h:30
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
struct ast_var_t::@249 entries
#define ast_var_assign(name, value)
Definition: chanvars.h:40
#define AST_LIST_APPEND_LIST(head, list, field)
Appends a whole list to the tail of a list.
Definition: linkedlists.h:782

◆ complete_channeltypes()

static char* complete_channeltypes ( struct ast_cli_args a)
static

Definition at line 303 of file channel.c.

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

Referenced by handle_cli_core_show_channeltype().

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 }
const char * tech
Definition: app_dial.c:802
struct chanlist::@369 list
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
the list of registered channel types
Definition: channel.c:121
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
List of channel drivers.
Definition: app_dial.c:796
const char * word
Definition: cli.h:163
const int pos
Definition: cli.h:164
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition: main/cli.c:2726

◆ deactivate_generator_nolock()

static void deactivate_generator_nolock ( struct ast_channel chan)
static

Definition at line 2886 of file channel.c.

References ast_channel_flags(), ast_channel_generator(), ast_channel_generator_set(), ast_channel_generatordata(), ast_channel_generatordata_set(), ast_channel_set_fd(), ast_clear_flag, AST_FLAG_WRITE_INT, AST_GENERATOR_FD, ast_settimeout(), generator, NULL, and ast_generator::release.

Referenced by ast_deactivate_generator(), and deactivate_silence_generator().

2887 {
2888  if (ast_channel_generatordata(chan)) {
2890 
2891  if (generator && generator->release) {
2892  generator->release(chan, ast_channel_generatordata(chan));
2893  }
2898  ast_settimeout(chan, 0, NULL, NULL);
2899  }
2900 }
void * ast_channel_generatordata(const struct ast_channel *chan)
void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value)
#define NULL
Definition: resample.c:96
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
void(* release)(struct ast_channel *chan, void *data)
Definition: channel.h:229
#define AST_GENERATOR_FD
Definition: channel.h:204
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:3189
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
static struct ast_generator generator
Definition: app_fax.c:359
#define ast_clear_flag(p, flag)
Definition: utils.h:77
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
Definition: channel.c:2431

◆ deactivate_silence_generator()

static int deactivate_silence_generator ( struct ast_channel chan)
static

Definition at line 8289 of file channel.c.

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

Referenced by ast_channel_stop_silence_generator().

8290 {
8291  ast_channel_lock(chan);
8292 
8293  if (!ast_channel_generatordata(chan)) {
8294  ast_debug(1, "Trying to stop silence generator when there is no generator on '%s'\n",
8295  ast_channel_name(chan));
8296  ast_channel_unlock(chan);
8297  return 0;
8298  }
8299  if (ast_channel_generator(chan) != &silence_generator) {
8300  ast_debug(1, "Trying to stop silence generator when it is not the current generator on '%s'\n",
8301  ast_channel_name(chan));
8302  ast_channel_unlock(chan);
8303  return 0;
8304  }
8306 
8307  ast_channel_unlock(chan);
8308 
8309  return 1;
8310 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
void * ast_channel_generatordata(const struct ast_channel *chan)
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
static struct ast_generator silence_generator
Definition: channel.c:8256
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2946
const char * ast_channel_name(const struct ast_channel *chan)
static void deactivate_generator_nolock(struct ast_channel *chan)
Definition: channel.c:2886

◆ destroy_hooks()

static void destroy_hooks ( struct ast_channel chan)
static

Definition at line 2537 of file channel.c.

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

Referenced by ast_hangup().

2538 {
2539  if (ast_channel_audiohooks(chan)) {
2542  }
2543 
2545 }
void ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list)
Detach audiohooks from list and destroy said list.
Definition: audiohook.c:594
void ast_channel_audiohooks_set(struct ast_channel *chan, struct ast_audiohook_list *value)
#define NULL
Definition: resample.c:96
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
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)

◆ does_id_conflict()

static int does_id_conflict ( const char *  uniqueid)
static

Definition at line 717 of file channel.c.

References ast_channel_by_uniqueid_cb(), ast_channel_callback(), ast_channel_name(), ast_channel_unref, ast_log, ast_strlen_zero, format, LOG_ERROR, and OBJ_NOLOCK.

Referenced by __ast_channel_alloc_ap().

718 {
719  struct ast_channel *conflict;
720  size_t length = 0;
721 
722  if (ast_strlen_zero(uniqueid)) {
723  return 0;
724  }
725 
726  conflict = ast_channel_callback(ast_channel_by_uniqueid_cb, (char *) uniqueid, &length, OBJ_NOLOCK);
727  if (conflict) {
728  ast_log(LOG_ERROR, "Channel Unique ID '%s' already in use by channel %s(%p)\n",
729  uniqueid, ast_channel_name(conflict), conflict);
730  ast_channel_unref(conflict);
731  return 1;
732  }
733 
734  return 0;
735 }
Main Channel structure associated with a channel.
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2981
Assume that the ao2_container is already locked.
Definition: astobj2.h:1067
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
static int ast_channel_by_uniqueid_cb(void *obj, void *arg, void *data, int flags)
Definition: channel.c:1329
#define LOG_ERROR
Definition: logger.h:285
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1278
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_channel_id uniqueid

◆ dtmf_direction_to_string()

static const char* dtmf_direction_to_string ( enum DtmfDirection  direction)
static

Definition at line 3366 of file channel.c.

References DTMF_RECEIVED, and DTMF_SENT.

Referenced by send_dtmf_begin_event(), and send_dtmf_end_event().

3367 {
3368  switch (direction) {
3369  case DTMF_RECEIVED:
3370  return "Received";
3371  case DTMF_SENT:
3372  return "Sent";
3373  }
3374 
3375  return "?";
3376 }
direction

◆ features_destroy()

static void features_destroy ( void *  obj)
static

Definition at line 11094 of file channel.c.

References ast_bridge_features_destroy().

11095 {
11097 }
void ast_bridge_features_destroy(struct ast_bridge_features *features)
Destroy an allocated bridge features struct.
Definition: bridge.c:3741

◆ free_external_channelvars()

static void free_external_channelvars ( struct external_vars channelvars)
static

Definition at line 7936 of file channel.c.

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

Referenced by channel_set_external_vars(), and channels_shutdown().

7937 {
7938  struct manager_channel_variable *var;
7939  AST_RWLIST_WRLOCK(channelvars);
7940  while ((var = AST_RWLIST_REMOVE_HEAD(channelvars, entry))) {
7941  ast_free(var);
7942  }
7943  AST_RWLIST_UNLOCK(channelvars);
7944 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define var
Definition: ast_expr2f.c:614
List of channel variables to append to all channel-related events.
Definition: channel.c:7925
#define ast_free(a)
Definition: astmm.h:182
#define AST_RWLIST_REMOVE_HEAD
Definition: linkedlists.h:843
Definition: search.h:40

◆ free_translation()

static void free_translation ( struct ast_channel clonechan)
static

Definition at line 2492 of file channel.c.

References ast_channel_readtrans(), ast_channel_readtrans_set(), ast_channel_writetrans(), ast_channel_writetrans_set(), ast_translator_free_path(), and NULL.

Referenced by ast_hangup(), and channel_do_masquerade().

2493 {
2494  if (ast_channel_writetrans(clonechan)) {
2496  }
2497  if (ast_channel_readtrans(clonechan)) {
2499  }
2500  ast_channel_writetrans_set(clonechan, NULL);
2501  ast_channel_readtrans_set(clonechan, NULL);
2502 }
void ast_channel_readtrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
#define NULL
Definition: resample.c:96
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
void ast_channel_writetrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition: translate.c:475

◆ generator_force()

static int generator_force ( const void *  data)
static

Definition at line 2925 of file channel.c.

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(), chanlist::chan, ast_generator::generate, NULL, and tmp().

Referenced by ast_activate_generator().

2926 {
2927  /* Called if generator doesn't have data */
2928  void *tmp;
2929  int res;
2930  int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = NULL;
2931  struct ast_channel *chan = (struct ast_channel *)data;
2932 
2933  ast_channel_lock(chan);
2934  tmp = ast_channel_generatordata(chan);
2936  if (ast_channel_generator(chan))
2937  generate = ast_channel_generator(chan)->generate;
2938  ast_channel_unlock(chan);
2939 
2940  if (!tmp || !generate) {
2941  return 0;
2942  }
2943 
2944  res = generate(chan, tmp, 0, ast_format_get_sample_rate(ast_channel_writeformat(chan)) / 50);
2945 
2946  ast_channel_lock(chan);
2947  if (ast_channel_generator(chan) && generate == ast_channel_generator(chan)->generate) {
2948  ast_channel_generatordata_set(chan, tmp);
2949  }
2950  ast_channel_unlock(chan);
2951 
2952  if (res) {
2953  ast_debug(1, "Auto-deactivating generator\n");
2955  }
2956 
2957  return 0;
2958 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
void * ast_channel_generatordata(const struct ast_channel *chan)
static int tmp()
Definition: bt_open.c:389
int(* generate)(struct ast_channel *chan, void *data, int len, int samples)
Definition: channel.h:234
#define NULL
Definition: resample.c:96
const char * data
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2902
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)

◆ generator_write_format_change()

static void generator_write_format_change ( struct ast_channel chan)
static

Definition at line 2913 of file channel.c.

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

Referenced by set_format().

2914 {
2915  struct ast_generator *generator;
2916 
2917  ast_channel_lock(chan);
2918  generator = ast_channel_generator(chan);
2919  if (generator && generator->write_format_change) {
2920  generator->write_format_change(chan, ast_channel_generatordata(chan));
2921  }
2922  ast_channel_unlock(chan);
2923 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
void * ast_channel_generatordata(const struct ast_channel *chan)
void(* write_format_change)(struct ast_channel *chan, void *data)
Definition: channel.h:239
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
static struct ast_generator generator
Definition: app_fax.c:359
#define ast_channel_unlock(chan)
Definition: channel.h:2946

◆ handle_cause()

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

Definition at line 5936 of file channel.c.

References AST_CAUSE_BUSY, AST_CAUSE_CONGESTION, AST_CONTROL_BUSY, and AST_CONTROL_CONGESTION.

Referenced by __ast_request_and_dial(), and ast_call_forward().

5937 {
5938  if (outstate) {
5939  /* compute error and return */
5940  if (cause == AST_CAUSE_BUSY)
5941  *outstate = AST_CONTROL_BUSY;
5942  else if (cause == AST_CAUSE_CONGESTION)
5943  *outstate = AST_CONTROL_CONGESTION;
5944  else
5945  *outstate = 0;
5946  }
5947 }
#define AST_CAUSE_BUSY
Definition: causes.h:148
#define AST_CAUSE_CONGESTION
Definition: causes.h:152

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

References ast_cli_args::argc, ast_cli_args::argv, 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(), ast_cli_args::fd, chanlist::list, NULL, chanlist::tech, and ast_cli_entry::usage.

327 {
328  struct chanlist *cl = NULL;
329  struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
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 }
const char * tech
Definition: app_dial.c:802
const int argc
Definition: cli.h:160
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:326
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition: cli.h:152
#define ast_str_alloca(init_len)
Definition: strings.h:800
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
the list of registered channel types
Definition: channel.c:121
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
const int fd
Definition: cli.h:159
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
List of channel drivers.
Definition: app_dial.c:796
const char *const * argv
Definition: cli.h:161
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
#define CLI_SHOWUSAGE
Definition: cli.h:45
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:736
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
static char * complete_channeltypes(struct ast_cli_args *a)
Definition: channel.c:303
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44

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

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

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 }
const char * tech
Definition: app_dial.c:802
struct chanlist::@369 list
const int argc
Definition: cli.h:160
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition: cli.h:152
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
the list of registered channel types
Definition: channel.c:121
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
const int fd
Definition: cli.h:159
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
List of channel drivers.
Definition: app_dial.c:796
#define CLI_SHOWUSAGE
Definition: cli.h:45
#define FORMAT
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44

◆ indicate_connected_line()

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

Definition at line 4446 of file channel.c.

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

4447 {
4448  struct ast_party_connected_line *chan_connected = ast_channel_connected(chan);
4449  struct ast_party_connected_line *chan_indicated = ast_channel_connected_indicated(chan);
4451  unsigned char current[1024];
4452  unsigned char proposed[1024];
4453  int current_size;
4454  int proposed_size;
4455  int res;
4456 
4457  ast_party_connected_line_set_init(&connected, chan_connected);
4458  res = ast_connected_line_parse_data(data, datalen, &connected);
4459  if (!res) {
4461  }
4463  if (res) {
4464  return -1;
4465  }
4466 
4467  current_size = ast_connected_line_build_data(current, sizeof(current),
4468  chan_indicated, NULL);
4469  proposed_size = ast_connected_line_build_data(proposed, sizeof(proposed),
4470  chan_connected, NULL);
4471  if (current_size == -1 || proposed_size == -1) {
4472  return -1;
4473  }
4474 
4475  if (current_size == proposed_size && !memcmp(current, proposed, current_size)) {
4476  ast_debug(1, "%s: Dropping redundant connected line update \"%s\" <%s>.\n",
4477  ast_channel_name(chan),
4478  S_COR(chan_connected->id.name.valid, chan_connected->id.name.str, ""),
4479  S_COR(chan_connected->id.number.valid, chan_connected->id.number.str, ""));
4480  return -1;
4481  }
4482 
4483  ast_party_connected_line_copy(chan_indicated, chan_connected);
4484  return 0;
4485 }
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
Initialize the given connected line structure using the given guide for a set update operation...
Definition: channel.c:2045
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:8404
struct ast_party_id id
Connected party ID.
Definition: channel.h:459
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
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:8881
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define NULL
Definition: resample.c:96
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition: channel.c:2072
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:85
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition: channel.c:2031
Connected Line/Party information.
Definition: channel.h:457
const char * ast_channel_name(const struct ast_channel *chan)
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
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:8793
struct ast_party_connected_line * ast_channel_connected_indicated(struct ast_channel *chan)
char connected
Definition: eagi_proxy.c:82
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

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

4516 {
4517  /* By using an enum, we'll get compiler warnings for values not handled
4518  * in switch statements. */
4519  enum ast_control_frame_type condition = _condition;
4520  struct ast_tone_zone_sound *ts = NULL;
4521  const struct ast_control_t38_parameters *t38_parameters;
4522  int res;
4523 
4524  switch (condition) {
4526  if (indicate_connected_line(chan, data, datalen)) {
4527  res = 0;
4528  return res;
4529  }
4530  break;
4532  if (indicate_redirecting(chan, data, datalen)) {
4533  res = 0;
4534  return res;
4535  }
4536  break;
4537  case AST_CONTROL_HOLD:
4538  case AST_CONTROL_UNHOLD:
4539  ast_channel_hold_state_set(chan, _condition);
4540  break;
4542  t38_parameters = data;
4543  switch (t38_parameters->request_response) {
4545  case AST_T38_NEGOTIATED:
4547  break;
4549  case AST_T38_TERMINATED:
4550  case AST_T38_REFUSED:
4552  break;
4553  default:
4554  break;
4555  }
4556  break;
4557  default:
4558  break;
4559  }
4560 
4561  if (is_visible_indication(condition)) {
4562  /* A new visible indication is requested. */
4563  ast_channel_visible_indication_set(chan, _condition);
4564  } else if (condition == AST_CONTROL_UNHOLD || _condition < 0) {
4565  /* Visible indication is cleared/stopped. */
4567  }
4568 
4569  if (ast_channel_tech(chan)->indicate) {
4570  /* See if the channel driver can handle this condition. */
4571  res = ast_channel_tech(chan)->indicate(chan, _condition, data, datalen);
4572  } else {
4573  res = -1;
4574  }
4575 
4576  if (!res) {
4577  /* The channel driver successfully handled this indication */
4578  res = 0;
4579  return res;
4580  }
4581 
4582  /* The channel driver does not support this indication, let's fake
4583  * it by doing our own tone generation if applicable. */
4584 
4585  /*!\note If we compare the enumeration type, which does not have any
4586  * negative constants, the compiler may optimize this code away.
4587  * Therefore, we must perform an integer comparison here. */
4588  if (_condition < 0) {
4589  /* Stop any tones that are playing */
4590  ast_playtones_stop(chan);
4591  res = 0;
4592  return res;
4593  }
4594 
4595  /* Handle conditions that we have tones for. */
4596  switch (condition) {
4597  case _XXX_AST_CONTROL_T38:
4598  /* deprecated T.38 control frame */
4599  res = -1;
4600  return res;
4602  /* there is no way to provide 'default' behavior for these
4603  * control frames, so we need to return failure, but there
4604  * is also no value in the log message below being emitted
4605  * since failure to handle these frames is not an 'error'
4606  * so just return right now. in addition, we want to return
4607  * whatever value the channel driver returned, in case it
4608  * has some meaning.*/
4609  return res;
4610  case AST_CONTROL_RINGING:
4611  ts = ast_get_indication_tone(ast_channel_zone(chan), "ring");
4612  /* It is common practice for channel drivers to return -1 if trying
4613  * to indicate ringing on a channel which is up. The idea is to let the
4614  * core generate the ringing inband. However, we don't want the
4615  * warning message about not being able to handle the specific indication
4616  * to print nor do we want ast_indicate_data to return an "error" for this
4617  * condition
4618  */
4619  if (ast_channel_state(chan) == AST_STATE_UP) {
4620  res = 0;
4621  }
4622  break;
4623  case AST_CONTROL_BUSY:
4624  ts = ast_get_indication_tone(ast_channel_zone(chan), "busy");
4625  break;
4628  ts = ast_get_indication_tone(ast_channel_zone(chan), "congestion");
4629  break;
4631  ast_channel_hangupcause_hash_set(chan, data, datalen);
4632  res = 0;
4633  break;
4634  case AST_CONTROL_PROGRESS:
4636  case AST_CONTROL_VIDUPDATE:
4637  case AST_CONTROL_SRCUPDATE:
4638  case AST_CONTROL_SRCCHANGE:
4639  case AST_CONTROL_RADIO_KEY:
4641  case AST_CONTROL_OPTION:
4642  case AST_CONTROL_WINK:
4643  case AST_CONTROL_FLASH:
4644  case AST_CONTROL_OFFHOOK:
4646  case AST_CONTROL_ANSWER:
4647  case AST_CONTROL_HANGUP:
4648  case AST_CONTROL_RING:
4649  case AST_CONTROL_HOLD:
4650  case AST_CONTROL_UNHOLD:
4651  case AST_CONTROL_TRANSFER:
4654  case AST_CONTROL_CC:
4656  case AST_CONTROL_AOC:
4657  case AST_CONTROL_END_OF_Q:
4658  case AST_CONTROL_MCID:
4673  /* Nothing left to do for these. */
4674  res = 0;
4675  break;
4676  }
4677 
4678  if (ts) {
4679  /* We have a tone to play, yay. */
4680  ast_debug(1, "Driver for channel '%s' does not support indication %u, emulating it\n", ast_channel_name(chan), condition);
4681  res = ast_playtones_start(chan, 0, ts->data, 1);
4682  if (!res) {
4683  ast_test_suite_event_notify("RINGING_INBAND",
4684  "Channel: %s\r\n",
4685  ast_channel_name(chan));
4686  }
4687  ts = ast_tone_zone_sound_unref(ts);
4688  }
4689 
4690  if (res) {
4691  /* not handled */
4692  ast_log(LOG_WARNING, "Unable to handle indication %u for '%s'\n", condition, ast_channel_name(chan));
4693  }
4694 
4695  return res;
4696 }
static int indicate(void *data)
Definition: chan_pjsip.c:1333
void ast_channel_visible_indication_set(struct ast_channel *chan, int value)
static int attribute_const is_visible_indication(enum ast_control_frame_type condition)
Definition: channel.c:4327
#define LOG_WARNING
Definition: logger.h:274
struct ast_tone_zone * ast_channel_zone(const struct ast_channel *chan)
enum ast_control_t38 request_response
ast_channel_state
ast_channel states
Definition: channelstate.h:35
ast_control_frame_type
Internal control frame subtype field values.
void ast_playtones_stop(struct ast_channel *chan)
Stop playing tones on a channel.
Definition: indications.c:393
#define NULL
Definition: resample.c:96
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
static int indicate_connected_line(struct ast_channel *chan, const void *data, size_t datalen)
Definition: channel.c:4446
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
#define ast_test_suite_event_notify(s, f,...)
Definition: test.h:196
Description of a tone.
Definition: indications.h:35
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:455
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:4391
const char * ast_channel_name(const struct ast_channel *chan)
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
const char * data
Description of a tone.
Definition: indications.h:52
void ast_channel_hold_state_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...
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:772
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
static int indicate_redirecting(struct ast_channel *chan, const void *data, size_t datalen)
Definition: channel.c:4501

◆ indicate_redirecting()

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

Definition at line 4501 of file channel.c.

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

4502 {
4503  struct ast_party_redirecting redirecting;
4504  int res;
4505 
4507  res = ast_redirecting_parse_data(data, datalen, &redirecting);
4508  if (!res) {
4509  ast_channel_set_redirecting(chan, &redirecting, NULL);
4510  }
4511  ast_party_redirecting_free(&redirecting);
4512  return res ? -1 : 0;
4513 }
#define NULL
Definition: resample.c:96
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:9574
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition: channel.c:2179
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition: channel.h:523
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Set the redirecting id information in the Asterisk channel.
Definition: channel.c:9215
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:2153

◆ is_visible_indication()

static int attribute_const is_visible_indication ( enum ast_control_frame_type  condition)
static

Definition at line 4327 of file channel.c.

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

4328 {
4329  /* Don't include a default case here so that we get compiler warnings
4330  * when a new type is added. */
4331 
4332  switch (condition) {
4333  case AST_CONTROL_PROGRESS:
4335  case AST_CONTROL_VIDUPDATE:
4336  case AST_CONTROL_SRCUPDATE:
4337  case AST_CONTROL_SRCCHANGE:
4338  case AST_CONTROL_RADIO_KEY:
4340  case AST_CONTROL_OPTION:
4341  case AST_CONTROL_WINK:
4342  case AST_CONTROL_FLASH:
4343  case AST_CONTROL_OFFHOOK:
4345  case AST_CONTROL_ANSWER:
4346  case AST_CONTROL_HANGUP:
4349  case AST_CONTROL_TRANSFER:
4351  case _XXX_AST_CONTROL_T38:
4352  case AST_CONTROL_CC:
4354  case AST_CONTROL_AOC:
4355  case AST_CONTROL_END_OF_Q:
4356  case AST_CONTROL_MCID:
4372  break;
4373 
4376  case AST_CONTROL_BUSY:
4377  case AST_CONTROL_RINGING:
4378  case AST_CONTROL_RING:
4379  case AST_CONTROL_HOLD:
4380  /* You can hear these */
4381  return 1;
4382 
4383  case AST_CONTROL_UNHOLD:
4384  /* This is a special case. You stop hearing this. */
4385  break;
4386  }
4387 
4388  return 0;
4389 }

◆ kill_exception()

static struct ast_frame* kill_exception ( struct ast_channel chan)
static

Definition at line 401 of file channel.c.

References NULL.

402 {
403  /* Hangup channel. */
404  return NULL;
405 }
#define NULL
Definition: resample.c:96

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

References ast_channel_tech_pvt_set(), and NULL.

420 {
422  return 0;
423 }
#define NULL
Definition: resample.c:96
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)

◆ kill_read()

static struct ast_frame* kill_read ( struct ast_channel chan)
static

Definition at line 395 of file channel.c.

References NULL.

396 {
397  /* Hangup channel. */
398  return NULL;
399 }
#define NULL
Definition: resample.c:96

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

References CMP_MATCH, CMP_STOP, and namedgroup_member::name.

Referenced by ast_get_namedgroups().

7760 {
7761  const struct namedgroup_member *an = obj;
7762  const struct namedgroup_member *bn = arg;
7763 
7764  return strcmp(an->name, bn->name) ? 0 : CMP_MATCH | CMP_STOP;
7765 }
Named group member structure.
Definition: channel.c:7751

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

References namedgroup_member::hash.

Referenced by ast_get_namedgroups().

7769 {
7770  const struct namedgroup_member *member = obj;
7771 
7772  return member->hash;
7773 }
Named group member structure.
Definition: channel.c:7751
unsigned int hash
Definition: channel.c:7753

◆ namedgroup_match()

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

Definition at line 8182 of file channel.c.

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

Referenced by ast_namedgroups_intersect().

8183 {
8184  void *match;
8185 
8186  match = ao2_find(arg, obj, OBJ_POINTER);
8187  ao2_cleanup(match);
8188 
8189  return match ? CMP_MATCH | CMP_STOP : 0;
8190 }
#define OBJ_POINTER
Definition: astobj2.h:1154
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:2315
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

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

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

Referenced by ast_connected_line_build_data(), and ast_redirecting_build_data().

8676 {
8677  size_t length;
8678  size_t pos = 0;
8679  int res;
8680 
8681  /*
8682  * The size of integer values must be fixed in case the frame is
8683  * shipped to another machine.
8684  */
8685 
8686  if (!update || update->name) {
8687  res = party_name_build_data(data + pos, datalen - pos, &id->name, label,
8688  &ies->name);
8689  if (res < 0) {
8690  return -1;
8691  }
8692  pos += res;
8693  }
8694 
8695  if (!update || update->number) {
8696  res = party_number_build_data(data + pos, datalen - pos, &id->number, label,
8697  &ies->number);
8698  if (res < 0) {
8699  return -1;
8700  }
8701  pos += res;
8702  }
8703 
8704  if (!update || update->subaddress) {
8705  res = party_subaddress_build_data(data + pos, datalen - pos, &id->subaddress,
8706  label, &ies->subaddress);
8707  if (res < 0) {
8708  return -1;
8709  }
8710  pos += res;
8711  }
8712 
8713  /* *************** Party id user tag **************************** */
8714  if (id->tag) {
8715  length = strlen(id->tag);
8716  if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8717  ast_log(LOG_WARNING, "No space left for %s tag\n", label);
8718  return -1;
8719  }
8720  data[pos++] = ies->tag;
8721  data[pos++] = length;
8722  memcpy(data + pos, id->tag, length);
8723  pos += length;
8724  }
8725 
8726  /* *************** Party id combined presentation *************** */
8727  if (ies->combined_presentation && (!update || update->number)) {
8728  int presentation;
8729 
8730  if (!update || update->name) {
8731  presentation = ast_party_id_presentation(id);
8732  } else {
8733  /*
8734  * We must compromise because not all the information is available
8735  * to determine a combined presentation value.
8736  * We will only send the number presentation instead.
8737  */
8738  presentation = id->number.presentation;
8739  }
8740 
8741  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8742  ast_log(LOG_WARNING, "No space left for %s combined presentation\n", label);
8743  return -1;
8744  }
8745  data[pos++] = ies->combined_presentation;
8746  data[pos++] = 1;
8747  data[pos++] = presentation;
8748  }
8749 
8750  return pos;
8751 }
struct ast_party_subaddress_ies subaddress
Subscriber subaddress ies.
Definition: channel.c:8648
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
Definition: channel.c:1821
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
struct ast_party_number_ies number
Subscriber phone number ies.
Definition: channel.c:8646
#define LOG_WARNING
Definition: logger.h:274
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:8518
struct ast_party_name_ies name
Subscriber name ies.
Definition: channel.c:8644
#define ast_log
Definition: astobj2.c:42
unsigned char subaddress
Definition: channel.h:368
int tag
User party id tag ie.
Definition: channel.c:8650
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition: channel.h:345
unsigned char number
Definition: channel.h:366
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:8444
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:8592
int combined_presentation
Combined name and number presentation ie.
Definition: channel.c:8655
char * tag
User-set "tag".
Definition: channel.h:355
unsigned char name
Definition: channel.h:364
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

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

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

Referenced by party_id_build_data().

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 (name->str) {
8454  length = strlen(name->str);
8455  if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8456  ast_log(LOG_WARNING, "No space left for %s name\n", label);
8457  return -1;
8458  }
8459  data[pos++] = ies->str;
8460  data[pos++] = length;
8461  memcpy(data + pos, name->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 name char set\n", label);
8467  return -1;
8468  }
8469  data[pos++] = ies->char_set;
8470  data[pos++] = 1;
8471  data[pos++] = name->char_set;
8472 
8473  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8474  ast_log(LOG_WARNING, "No space left for %s name presentation\n", label);
8475  return -1;
8476  }
8477  data[pos++] = ies->presentation;
8478  data[pos++] = 1;
8479  data[pos++] = name->presentation;
8480 
8481  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8482  ast_log(LOG_WARNING, "No space left for %s name valid\n", label);
8483  return -1;
8484  }
8485  data[pos++] = ies->valid;
8486  data[pos++] = 1;
8487  data[pos++] = name->valid;
8488 
8489  return pos;
8490 }
int valid
valid/present ie
Definition: channel.c:8427
int char_set
Character set ie.
Definition: channel.c:8423
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:278
int presentation
presentation-indicator ie
Definition: channel.c:8425
#define LOG_WARNING
Definition: logger.h:274
int char_set
Character set the name is using.
Definition: channel.h:273
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define ast_log
Definition: astobj2.c:42
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
int str
Subscriber name ie.
Definition: channel.c:8421

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

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

Referenced by party_id_build_data().

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 (number->str) {
8528  length = strlen(number->str);
8529  if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8530  ast_log(LOG_WARNING, "No space left for %s number\n", label);
8531  return -1;
8532  }
8533  data[pos++] = ies->str;
8534  data[pos++] = length;
8535  memcpy(data + pos, number->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 numbering plan\n", label);
8541  return -1;
8542  }
8543  data[pos++] = ies->plan;
8544  data[pos++] = 1;
8545  data[pos++] = number->plan;
8546 
8547  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8548  ast_log(LOG_WARNING, "No space left for %s number presentation\n", label);
8549  return -1;
8550  }
8551  data[pos++] = ies->presentation;
8552  data[pos++] = 1;
8553  data[pos++] = number->presentation;
8554 
8555  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8556  ast_log(LOG_WARNING, "No space left for %s number valid\n", label);
8557  return -1;
8558  }
8559  data[pos++] = ies->valid;
8560  data[pos++] = 1;
8561  data[pos++] = number->valid;
8562 
8563  return pos;
8564 }
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
int str
Subscriber phone number ie.
Definition: channel.c:8495
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:296
#define LOG_WARNING
Definition: logger.h:274
int plan
Type-Of-Number and Numbering-Plan ie.
Definition: channel.c:8497
int presentation
presentation-indicator ie
Definition: channel.c:8499
#define ast_log
Definition: astobj2.c:42
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:294
int valid
valid/present ie
Definition: channel.c:8501
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298

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

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

8593 {
8594  size_t length;
8595  size_t pos = 0;
8596 
8597  /*
8598  * The size of integer values must be fixed in case the frame is
8599  * shipped to another machine.
8600  */
8601  if (subaddress->str) {
8602  length = strlen(subaddress->str);
8603  if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8604  ast_log(LOG_WARNING, "No space left for %s subaddress\n", label);
8605  return -1;
8606  }
8607  data[pos++] = ies->str;
8608  data[pos++] = length;
8609  memcpy(data + pos, subaddress->str, length);
8610  pos += length;
8611  }
8612 
8613  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8614  ast_log(LOG_WARNING, "No space left for %s type of subaddress\n", label);
8615  return -1;
8616  }
8617  data[pos++] = ies->type;
8618  data[pos++] = 1;
8619  data[pos++] = subaddress->type;
8620 
8621  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8623  "No space left for %s subaddress odd-even indicator\n", label);
8624  return -1;
8625  }
8626  data[pos++] = ies->odd_even_indicator;
8627  data[pos++] = 1;
8628  data[pos++] = subaddress->odd_even_indicator;
8629 
8630  if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8631  ast_log(LOG_WARNING, "No space left for %s subaddress valid\n", label);
8632  return -1;
8633  }
8634  data[pos++] = ies->valid;
8635  data[pos++] = 1;
8636  data[pos++] = subaddress->valid;
8637 
8638  return pos;
8639 }
#define LOG_WARNING
Definition: logger.h:274
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition: channel.h:329
char * str
Malloced subaddress string.
Definition: channel.h:314
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition: channel.h:327
#define ast_log
Definition: astobj2.c:42
int odd_even_indicator
odd/even indicator ie
Definition: channel.c:8573
int valid
valid/present ie
Definition: channel.c:8575
int str
subaddress ie.
Definition: channel.c:8569
int type
Q.931 subaddress type.
Definition: channel.h:321
int type
subaddress type ie
Definition: channel.c:8571

◆ plc_ds_destroy()

static void plc_ds_destroy ( void *  data)
static

Definition at line 5086 of file channel.c.

References ast_free, and plc_ds::samples_buf.

5087 {
5088  struct plc_ds *plc = data;
5089  ast_free(plc->samples_buf);
5090  ast_free(plc);
5091 }
int16_t * samples_buf
Definition: channel.c:5078
#define ast_free(a)
Definition: astmm.h:182

◆ prnt_channel_key()

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

Definition at line 7912 of file channel.c.

References ast_channel_name().

Referenced by ast_channels_init().

7913 {
7914  struct ast_channel *chan = v_obj;
7915 
7916  if (!chan) {
7917  return;
7918  }
7919  prnt(where, "%s", ast_channel_name(chan));
7920 }
Main Channel structure associated with a channel.
const char * ast_channel_name(const struct ast_channel *chan)

◆ queue_dtmf_readq()

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

Definition at line 3470 of file channel.c.

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

Referenced by __ast_read().

3471 {
3472  struct ast_frame *fr = ast_channel_dtmff(chan);
3473  ast_log(LOG_WARNING, "Came out of the chan driv\n");
3474 
3476  fr->subclass.integer = f->subclass.integer;
3477  fr->len = f->len;
3478 
3479  /* The only time this function will be called is for a frame that just came
3480  * out of the channel driver. So, we want to stick it on the tail of the
3481  * readq. */
3482 
3483  ast_queue_frame(chan, fr);
3484 }
#define LOG_WARNING
Definition: logger.h:274
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel&#39;s frame queue.
Definition: channel.c:1139
struct ast_frame_subclass subclass
#define ast_log
Definition: astobj2.c:42
Data structure associated with a single frame of data.
enum ast_frame_type frametype
struct ast_frame * ast_channel_dtmff(struct ast_channel *chan)

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

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

9333 {
9334  size_t length;
9335  size_t pos = 0;
9336  int32_t value;
9337 
9338  if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9339  ast_log(LOG_WARNING, "No space left for %s code\n", label);
9340  return -1;
9341  }
9342  data[pos++] = ies->code;
9343  data[pos++] = sizeof(value);
9344  value = htonl(reason->code);
9345  memcpy(data + pos, &value, sizeof(value));
9346  pos += sizeof(value);
9347 
9348  if (reason->str) {
9349  length = strlen(reason->str);
9350  if (datalen < pos + (sizeof(data[0]) * 2) + length) {
9351  ast_log(LOG_WARNING, "No space left for %s string\n", label);
9352  return -1;
9353  }
9354  data[pos++] = ies->str;
9355  data[pos++] = length;
9356  memcpy(data + pos, reason->str, length);
9357  pos += length;
9358  }
9359 
9360  return pos;
9361 }
#define LOG_WARNING
Definition: logger.h:274
int value
Definition: syslog.c:37
int code
enum AST_REDIRECTING_REASON value for redirection
Definition: channel.h:511
#define ast_log
Definition: astobj2.c:42
char * str
a string value for the redirecting reason
Definition: channel.h:508
union ast_frame::@263 data
int int32_t
Definition: db.h:60

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

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, chanlist::list, LOG_WARNING, NULL, RAII_VAR, set_security_requirements(), and chanlist::tech.

Referenced by ast_request(), and ast_request_with_stream_topology().

6311 {
6312  struct chanlist *chan;
6313  struct ast_channel *c = NULL;
6314  int res;
6315  int foo;
6316 
6317  if (!cause)
6318  cause = &foo;
6319  *cause = AST_CAUSE_NOTDEFINED;
6320 
6321  if (AST_RWLIST_RDLOCK(&backends)) {
6322  ast_log(LOG_WARNING, "Unable to lock technology backend list\n");
6323  return NULL;
6324  }
6325 
6326  AST_RWLIST_TRAVERSE(&backends, chan, list) {
6327  if (strcasecmp(type, chan->tech->type)) {
6328  continue;
6329  }
6330 
6331  break;
6332  }
6333 
6335 
6336  if (!chan) {
6337  ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
6338  *cause = AST_CAUSE_NOSUCHDRIVER;
6339  return NULL;
6340  }
6341 
6342  /* Allow either format capabilities or stream topology to be provided and adapt */
6343  if (chan->tech->requester_with_stream_topology) {
6344  struct ast_stream_topology *tmp_converted_topology = NULL;
6345 
6346  if (!topology && request_cap) {
6347  /* Turn the requested capabilities into a stream topology */
6348  topology = tmp_converted_topology = ast_stream_topology_create_from_format_cap(request_cap);
6349  }
6350 
6351  c = chan->tech->requester_with_stream_topology(type, topology, assignedids, requestor, addr, cause);
6352 
6353  ast_stream_topology_free(tmp_converted_topology);
6354  } else if (chan->tech->requester) {
6355  struct ast_format_cap *tmp_converted_cap = NULL;
6356  struct ast_format_cap *tmp_cap;
6357  RAII_VAR(struct ast_format *, tmp_fmt, NULL, ao2_cleanup);
6358  RAII_VAR(struct ast_format *, best_audio_fmt, NULL, ao2_cleanup);
6359  struct ast_format_cap *joint_cap;
6360 
6361  if (!request_cap && topology) {
6362  /* Turn the request stream topology into capabilities */
6363  request_cap = tmp_converted_cap = ast_stream_topology_get_formats(topology);
6364  }
6365 
6366  /* find the best audio format to use */
6368  if (!tmp_cap) {
6370  return NULL;
6371  }
6372 
6374  if (!ast_format_cap_empty(tmp_cap)) {
6375  /* We have audio - is it possible to connect the various calls to each other?
6376  (Avoid this check for calls without audio, like text+video calls)
6377  */
6378  res = ast_translator_best_choice(tmp_cap, chan->tech->capabilities, &tmp_fmt, &best_audio_fmt);
6379  ao2_ref(tmp_cap, -1);
6380  if (res < 0) {
6381  struct ast_str *tech_codecs = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
6382  struct ast_str *request_codecs = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
6383 
6384  ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %s) to %s\n", type,
6385  ast_format_cap_get_names(chan->tech->capabilities, &tech_codecs),
6386  ast_format_cap_get_names(request_cap, &request_codecs));
6388  ao2_cleanup(tmp_converted_cap);
6389  return NULL;
6390  }
6391  }
6392 
6393  /* XXX Only the audio format calculated as being the best for translation
6394  * purposes is used for the request. This is because we don't have the ability
6395  * to signal to the initiator which one of their codecs that was offered is
6396  * the one that was selected, particularly in a chain of Local channels.
6397  */
6399  if (!joint_cap) {
6400  ao2_cleanup(tmp_converted_cap);
6401  return NULL;
6402  }
6403  ast_format_cap_append_from_cap(joint_cap, request_cap, AST_MEDIA_TYPE_UNKNOWN);
6405  if (best_audio_fmt) { /* text+video call? then, this is NULL */
6406  ast_format_cap_append(joint_cap, best_audio_fmt, 0);
6407  }
6408  ao2_cleanup(tmp_converted_cap);
6409 
6410  c = chan->tech->requester(type, joint_cap, assignedids, requestor, addr, cause);
6411  ao2_ref(joint_cap, -1);
6412  }
6413 
6414  if (!c) {
6415  return NULL;
6416  }
6417 
6418  if (requestor) {
6419  ast_callid callid;
6420 
6421  ast_channel_lock_both(c, (struct ast_channel *) requestor);
6422 
6423  /* Set the newly created channel's callid to the same as the requestor. */
6424  callid = ast_channel_callid(requestor);
6425  if (callid) {
6426  ast_channel_callid_set(c, callid);
6427  }
6428 
6429  ast_channel_unlock(c);
6430  ast_channel_unlock((struct ast_channel *) requestor);
6431  }
6432 
6433  if (set_security_requirements(requestor, c)) {
6434  ast_log(LOG_WARNING, "Setting security requirements failed\n");
6435  ast_hangup(c);
6437  return NULL;
6438  }
6439 
6440  /* no need to generate a Newchannel event here; it is done in the channel_alloc call */
6441  return c;
6442 }
static const char type[]
Definition: chan_ooh323.c:109
Main Channel structure associated with a channel.
const char * tech
Definition: app_dial.c:802
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:930
#define AST_CAUSE_NOSUCHDRIVER
Definition: causes.h:155
#define LOG_WARNING
Definition: logger.h:274
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:326
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition of a media format.
Definition: format.c:43
struct ast_stream_topology * ast_stream_topology_create_from_format_cap(struct ast_format_cap *cap)
A helper function that, given a format capabilities structure, creates a topology and separates the m...
Definition: stream.c:848
unsigned int ast_callid
Definition: logger.h:87
static struct test_val c
#define ast_str_alloca(init_len)
Definition: strings.h:800
#define NULL
Definition: resample.c:96
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:1385
the list of registered channel types
Definition: channel.c:121
static int set_security_requirements(const struct ast_channel *requestor, struct ast_channel *out)
Definition: channel.c:6269
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define ast_log
Definition: astobj2.c:42
struct ast_channel * chan
Definition: app_dial.c:798
#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:911
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
#define ao2_ref(o, delta)
Definition: astobj2.h:464
List of channel drivers.
Definition: app_dial.c:796
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
#define AST_CAUSE_NOTDEFINED
Definition: causes.h:154
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:525
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
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:736
#define ast_channel_unlock(chan)
Definition: channel.h:2946
void ast_channel_callid_set(struct ast_channel *chan, ast_callid value)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2952
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition: channel.c:2548
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:746
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_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition: stream.c:743
#define AST_CAUSE_BEARERCAPABILITY_NOTAVAIL
Definition: causes.h:129
ast_callid ast_channel_callid(const struct ast_channel *chan)

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

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

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

1499 {
1500  struct ast_frame *f;
1501  struct ast_silence_generator *silgen = NULL;
1502  int res = 0;
1503  struct timeval start;
1504  int ms;
1505  AST_LIST_HEAD_NOLOCK(, ast_frame) deferred_frames;
1506 
1507  AST_LIST_HEAD_INIT_NOLOCK(&deferred_frames);
1508 
1509  /* If no other generator is present, start silencegen while waiting */
1510  if (generate_silence && ast_opt_transmit_silence && !ast_channel_generatordata(chan)) {
1511  silgen = ast_channel_start_silence_generator(chan);
1512  }
1513 
1514  start = ast_tvnow();
1515  while ((ms = ast_remaining_ms(start, timeout_ms))) {
1516  struct ast_frame *dup_f = NULL;
1517 
1518  if (cond && ((*cond)(data) == 0)) {
1519  break;
1520  }
1521  ms = ast_waitfor(chan, ms);
1522  if (ms < 0) {
1523  res = -1;
1524  break;
1525  }
1526  if (ms > 0) {
1527  f = ast_read(chan);
1528  if (!f) {
1529  res = -1;
1530  break;
1531  }
1532 
1533  if (!ast_is_deferrable_frame(f)) {
1534  ast_frfree(f);
1535  continue;
1536  }
1537 
1538  if ((dup_f = ast_frisolate(f))) {
1539  if (dup_f != f) {
1540  ast_frfree(f);
1541  }
1542  AST_LIST_INSERT_HEAD(&deferred_frames, dup_f, frame_list);
1543  }
1544  }
1545  }
1546 
1547  /* stop silgen if present */
1548  if (silgen) {
1549  ast_channel_stop_silence_generator(chan, silgen);
1550  }
1551 
1552  /* We need to free all the deferred frames, but we only need to
1553  * queue the deferred frames if there was no error and no
1554  * hangup was received
1555  */
1556  ast_channel_lock(chan);
1557  while ((f = AST_LIST_REMOVE_HEAD(&deferred_frames, frame_list))) {
1558  if (!res) {
1559  ast_queue_frame_head(chan, f);
1560  }
1561  ast_frfree(f);
1562  }
1563  ast_channel_unlock(chan);
1564 
1565  return res;
1566 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
void * ast_channel_generatordata(const struct ast_channel *chan)
struct ast_silence_generator * ast_channel_start_silence_generator(struct ast_channel *chan)
Starts a silence generator on the given channel.
Definition: channel.c:8266
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define ast_opt_transmit_silence
Definition: options.h:124
#define NULL
Definition: resample.c:96
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:8312
ast_cond_t cond
Definition: app_meetme.c:1090
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
AST_LIST_HEAD_NOLOCK(contactliststruct, contact)
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition: main/utils.c:2033
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition: channel.c:4302
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:710
#define ast_channel_unlock(chan)
Definition: channel.h:2946
int ast_is_deferrable_frame(const struct ast_frame *frame)
Should we keep this frame for later?
Definition: channel.c:1467
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition: channel.c:3171
#define ast_frfree(fr)
Data structure associated with a single frame of data.
union ast_frame::@263 data
int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to the head of a channel&#39;s frame queue.
Definition: channel.c:1144

◆ send_dtmf_begin_event()

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

Definition at line 3378 of file channel.c.

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

3380 {
3381  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
3382  char digit_str[] = { digit, '\0' };
3383 
3384  blob = ast_json_pack("{ s: s, s: s }",
3385  "digit", digit_str,
3386  "direction", dtmf_direction_to_string(direction));
3387  if (!blob) {
3388  return;
3389  }
3390 
3392 }
char digit
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
#define NULL
Definition: resample.c:96
#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:911
struct stasis_message_type * ast_channel_dtmf_begin_type(void)
Message type for when DTMF begins on a channel.
Abstract JSON element (object, array, string, int, ...).
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
direction
static const char * dtmf_direction_to_string(enum DtmfDirection direction)
Definition: channel.c:3366

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

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

3396 {
3397  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
3398  char digit_str[] = { digit, '\0' };
3399 
3400  blob = ast_json_pack("{ s: s, s: s, s: I }",
3401  "digit", digit_str,
3402  "direction", dtmf_direction_to_string(direction),
3403  "duration_ms", (ast_json_int_t)duration_ms);
3404  if (!blob) {
3405  return;
3406  }
3407 
3409 }
char digit
struct stasis_message_type * ast_channel_dtmf_end_type(void)
Message type for when DTMF ends on a channel.
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
AST_JSON_INT_T ast_json_int_t
Primarily used to cast when packing to an "I" type.
Definition: json.h:87
#define NULL
Definition: resample.c:96
#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:911
Abstract JSON element (object, array, string, int, ...).
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
direction
static const char * dtmf_direction_to_string(enum DtmfDirection direction)
Definition: channel.c:3366

◆ send_flash_event()

static void send_flash_event ( struct ast_channel chan)
static

Definition at line 3411 of file channel.c.

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

Referenced by __ast_read().

3412 {
3414 }
struct stasis_message_type * ast_channel_flash_type(void)
Message type for when a hook flash occurs on a channel.
#define NULL
Definition: resample.c:96
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.

◆ set_channel_answer_time()

static void set_channel_answer_time ( struct ast_channel chan)
static

Definition at line 2637 of file channel.c.

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

Referenced by __ast_read(), and ast_raw_answer_with_stream_topology().

2638 {
2639  if (ast_tvzero(ast_channel_answertime(chan))) {
2640  struct timeval answertime;
2641 
2642  answertime = ast_tvnow();
2643  ast_channel_answertime_set(chan, &answertime);
2644  }
2645 }
struct timeval ast_channel_answertime(struct ast_channel *chan)
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
void ast_channel_answertime_set(struct ast_channel *chan, struct timeval *value)
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150

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

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

5681 {
5682  struct ast_trans_pvt *trans_pvt;
5683  struct ast_format_cap *cap_native;
5684  const struct set_format_access *access;
5685  struct ast_format *rawformat;
5686  struct ast_format *format;
5687  RAII_VAR(struct ast_format *, best_set_fmt, NULL, ao2_cleanup);
5688  RAII_VAR(struct ast_format *, best_native_fmt, NULL, ao2_cleanup);
5689  int res;
5690 
5691  if (!direction) {
5692  /* reading */
5693  access = &set_format_access_read;
5694  } else {
5695  /* writing */
5696  access = &set_format_access_write;
5697  }
5698 
5699  best_set_fmt = ast_format_cap_get_best_by_type(cap_set, AST_MEDIA_TYPE_AUDIO);
5700  if (!best_set_fmt) {
5701  /*
5702  * Not setting any audio formats?
5703  * Assume a call without any sounds (video, text)
5704  */
5705  return 0;
5706  }
5707 
5708  /* See if the underlying channel driver is capable of performing transcoding for us */
5709  res = ast_channel_setoption(chan, access->setoption,
5710  &best_set_fmt, sizeof(best_set_fmt), 0);
5711  if (!res) {
5712  ast_debug(1, "Channel driver natively set channel %s to %s format %s\n",
5713  ast_channel_name(chan), access->direction, ast_format_get_name(best_set_fmt));
5714 
5715  ast_channel_lock(chan);
5717  if (!cap_native
5718  || ast_format_cap_append(cap_native, best_set_fmt, 0)) {
5719  ast_channel_unlock(chan);
5720  ao2_cleanup(cap_native);
5721  return -1;
5722  }
5723  ast_channel_nativeformats_set(chan, cap_native);
5724  ao2_cleanup(cap_native);
5725  access->set_format(chan, best_set_fmt);
5726  access->set_rawformat(chan, best_set_fmt);
5727 
5728  trans_pvt = access->get_trans(chan);
5729  if (trans_pvt) {
5730  ast_translator_free_path(trans_pvt);
5731  access->set_trans(chan, NULL);
5732  }
5733  ast_channel_unlock(chan);
5734 
5735  /* If there is a generator on the channel, it needs to know about this
5736  * change if it is the write format. */
5737  if (direction && ast_channel_generatordata(chan)) {
5739  }
5740 
5741  return 0;
5742  }
5743 
5744  ast_channel_lock(chan);
5745 
5746  format = access->get_format(chan);
5747  rawformat = access->get_rawformat(chan);
5748  ast_assert(format != NULL);
5749  ast_assert(rawformat != NULL);
5750 
5751  cap_native = ast_channel_nativeformats(chan);
5752  if (ast_format_cap_empty(cap_native)) {
5753  ast_channel_unlock(chan);
5754  ast_log(LOG_ERROR, "Unable to set format because channel %s supports no formats\n",
5755  ast_channel_name(chan));
5756  return -1;
5757  }
5758 
5759  /* Find a translation path from the native format to one of the desired formats */
5760  if (!direction) {
5761  /* reading */
5762  res = ast_translator_best_choice(cap_set, cap_native, &best_set_fmt, &best_native_fmt);
5763  } else {
5764  /* writing */
5765  res = ast_translator_best_choice(cap_native, cap_set, &best_native_fmt, &best_set_fmt);
5766  }
5767  if (res < 0) {
5768  struct ast_str *codec_native = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5769  struct ast_str *codec_set = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5770 
5771  ast_format_cap_get_names(cap_native, &codec_native);
5772  ast_channel_unlock(chan);
5773  ast_format_cap_get_names(cap_set, &codec_set);
5774 
5775  ast_log(LOG_WARNING, "Unable to find a codec translation path: %s -> %s\n",
5776  ast_str_buffer(direction ? codec_set : codec_native),
5777  ast_str_buffer(direction ? codec_native : codec_set));
5778  return -1;
5779  }
5780 
5781  /* Now we have a good choice for both. */
5782  trans_pvt = access->get_trans(chan);
5783  if ((ast_format_cmp(rawformat, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
5784  (ast_format_cmp(format, best_set_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
5785  ((ast_format_cmp(rawformat, format) != AST_FORMAT_CMP_NOT_EQUAL) || access->get_trans(chan))) {
5786  /* the channel is already in these formats, so nothing to do, unless the interleaved format is not set correctly */
5787  if (trans_pvt != NULL) {
5788  if (trans_pvt->interleaved_stereo == interleaved_stereo) {
5789  ast_channel_unlock(chan);
5790  return 0;
5791  }
5792  }
5793  }
5794 
5795  /* Free any translation we have right now */
5796  if (trans_pvt) {
5797  ast_translator_free_path(trans_pvt);
5798  access->set_trans(chan, NULL);
5799  }
5800 
5801  /* Build a translation path from the raw format to the desired format */
5802  if (ast_format_cmp(best_set_fmt, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) {
5803  /*
5804  * If we were able to swap the native format to the format that
5805  * has been requested, then there is no need to try to build
5806  * a translation path.
5807  */
5808  res = 0;
5809  } else {
5810  if (!direction) {
5811  /* reading */
5812  trans_pvt = ast_translator_build_path(best_set_fmt, best_native_fmt);
5813  if (trans_pvt) {
5814  trans_pvt->interleaved_stereo = 0;
5815  }
5816  } else {
5817  /* writing */
5818  trans_pvt = ast_translator_build_path(best_native_fmt, best_set_fmt);
5819  if (trans_pvt) {
5820  trans_pvt->interleaved_stereo = interleaved_stereo;
5821  }
5822  }
5823  access->set_trans(chan, trans_pvt);
5824  res = trans_pvt ? 0 : -1;
5825  }
5826 
5827  if (!res) {
5828  access->set_format(chan, best_set_fmt);
5829  access->set_rawformat(chan, best_native_fmt);
5830 
5831  ast_debug(1, "Channel %s setting %s format path: %s -> %s\n",
5832  ast_channel_name(chan),
5833  access->direction,
5834  ast_format_get_name(direction ? best_set_fmt : best_native_fmt),
5835  ast_format_get_name(direction ? best_native_fmt : best_set_fmt));
5836  }
5837 
5838  ast_channel_unlock(chan);
5839 
5840  /* If there is a generator on the channel, it needs to know about this
5841  * change if it is the write format. */
5842  if (direction && ast_channel_generatordata(chan)) {
5844  }
5845 
5846  return res;
5847 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
void(* set_trans)(struct ast_channel *chan, struct ast_trans_pvt *value)
Definition: channel.c:5650
static const struct set_format_access set_format_access_write
Definition: channel.c:5669
struct ast_format *(* get_rawformat)(struct ast_channel *chan)
Definition: channel.c:5653
void * ast_channel_generatordata(const struct ast_channel *chan)
const char * direction
Definition: channel.c:5648
#define LOG_WARNING
Definition: logger.h:274
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:326
void(* set_format)(struct ast_channel *chan, struct ast_format *format)
Definition: channel.c:5652
Definition of a media format.
Definition: format.c:43
struct ast_format *(* get_format)(struct ast_channel *chan)
Definition: channel.c:5651
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
#define ast_assert(a)
Definition: utils.h:695
#define ast_str_alloca(init_len)
Definition: strings.h:800
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
#define NULL
Definition: resample.c:96
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:1385
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
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
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:485
static const struct set_format_access set_format_access_read
Definition: channel.c:5658
#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:911
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
#define ast_format_cap_append(cap, format, framing)
Definition: format_cap.h:103
#define ast_format_cap_alloc(flags)
Definition: format_cap.h:52
int interleaved_stereo
Definition: translate.h:238
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition: translate.h:213
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:736
#define ast_channel_unlock(chan)
Definition: channel.h:2946
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:7522
static void generator_write_format_change(struct ast_channel *chan)
Definition: channel.c:2913
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_channel_name(const struct ast_channel *chan)
void(* set_rawformat)(struct ast_channel *chan, struct ast_format *format)
Definition: channel.c:5654
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:746
struct ast_trans_pvt *(* get_trans)(const struct ast_channel *chan)
Definition: channel.c:5649
direction
static snd_pcm_format_t format
Definition: chan_alsa.c:102
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition: translate.c:475

◆ set_security_requirements()

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

Definition at line 6269 of file channel.c.

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, secure_call_info, and ast_secure_call_store::signaling.

Referenced by request_channel().

6270 {
6271  int ops[2][2] = {
6274  };
6275  int i;
6276  struct ast_channel *r = (struct ast_channel *) requestor; /* UGLY */
6277  struct ast_datastore *ds;
6278 
6279  if (!requestor || !out) {
6280  return 0;
6281  }
6282 
6283  ast_channel_lock(r);
6285  struct ast_secure_call_store *encrypt = ds->data;
6286  ops[0][1] = encrypt->signaling;
6287  ops[1][1] = encrypt->media;
6288  } else {
6289  ast_channel_unlock(r);
6290  return 0;
6291  }
6292  ast_channel_unlock(r);
6293 
6294  for (i = 0; i < 2; i++) {
6295  if (ops[i][1]) {
6296  if (ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0)) {
6297  /* We require a security feature, but the channel won't provide it */
6298  return -1;
6299  }
6300  } else {
6301  /* We don't care if we can't clear the option on a channel that doesn't support it */
6302  ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0);
6303  }
6304  }
6305 
6306  return 0;
6307 }
#define ast_channel_lock(chan)
Definition: channel.h:2945
Main Channel structure associated with a channel.
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:2404
#define AST_OPTION_SECURE_MEDIA
Structure for a data store object.
Definition: datastore.h:68
#define NULL
Definition: resample.c:96
const struct ast_datastore_info secure_call_info
#define ast_channel_unlock(chan)
Definition: channel.h:2946
#define AST_OPTION_SECURE_SIGNALING
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:7522
void * data
Definition: datastore.h:70

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

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

3490 {
3492  /* We're in the middle of emulating a digit, or DTMF has been
3493  * explicitly deferred. Skip this digit, then. */
3494  return 1;
3495  }
3496 
3497  if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
3499  /* We're not in the middle of a digit, but it hasn't been long enough
3500  * since the last digit, so we'll have to skip DTMF for now. */
3501  return 1;
3502  }
3503 
3504  return 0;
3505 }
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define AST_MIN_DTMF_GAP
Definition: channel.c:112
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
struct timeval * ast_channel_dtmf_tv(struct ast_channel *chan)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

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

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

2865 {
2867  /* We're in the middle of emulating a digit, or DTMF has been
2868  * explicitly deferred. Trigger dtmf with periodic 50 pfs timer events, then. */
2869  return 1;
2870  }
2871 
2872  if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
2874  /*
2875  * We're not in the middle of a digit, but it hasn't been long enough
2876  * since the last digit, so we'll have to trigger DTMF furtheron.
2877  * Using 2 times AST_MIN_DTMF_GAP to trigger readq reading for possible
2878  * buffered next dtmf event
2879  */
2880  return 1;
2881  }
2882 
2883  return 0;
2884 }
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define AST_MIN_DTMF_GAP
Definition: channel.c:112
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition: time.h:108
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
struct timeval * ast_channel_dtmf_tv(struct ast_channel *chan)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)

◆ silence_generator_alloc()

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

Definition at line 8226 of file channel.c.

8227 {
8228  /* just store the data pointer in the channel structure */
8229  return data;
8230 }

◆ silence_generator_generate()

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

Definition at line 8237 of file channel.c.

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

8238 {
8239  short buf[samples];
8240  struct ast_frame frame = {
8242  .data.ptr = buf,
8243  .samples = samples,
8244  .datalen = sizeof(buf),
8245  };
8247 
8248  memset(buf, 0, sizeof(buf));
8249 
8250  if (ast_write(chan, &frame))
8251  return -1;
8252 
8253  return 0;
8254 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
struct ast_frame_subclass subclass
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:5189
Data structure associated with a single frame of data.
enum ast_frame_type frametype
struct ast_format * format
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41

◆ silence_generator_release()

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

Definition at line 8232 of file channel.c.

8233 {
8234  /* nothing to do */
8235 }

◆ suppress_datastore_destroy_cb()

static void suppress_datastore_destroy_cb ( void *  data)
static

Definition at line 10905 of file channel.c.

References ao2_cleanup.

10906 {
10907  ao2_cleanup(data);
10908 }
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
union ast_frame::@263 data

◆ suppress_framehook_destroy_cb()

static void suppress_framehook_destroy_cb ( void *  data)
static

Definition at line 10915 of file channel.c.

References ao2_cleanup.

Referenced by ast_channel_suppress().

10916 {
10917  ao2_cleanup(data);
10918 }
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
union ast_frame::@263 data

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

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

10934 {
10935  struct suppress_data *suppress = data;
10936  int suppress_frame = 0;
10937 
10938  if (!frame) {
10939  return NULL;
10940  }
10941 
10942  if (frame->frametype != suppress->frametype) {
10943  return frame;
10944  }
10945 
10947  suppress_frame = 1;
10948  } else if (event == AST_FRAMEHOOK_EVENT_WRITE && (suppress->direction & AST_MUTE_DIRECTION_WRITE)) {
10949  suppress_frame = 1;
10950  }
10951 
10952  if (suppress_frame) {
10953  switch (frame->frametype) {
10954  case AST_FRAME_VOICE:
10956  ast_frfree(frame);
10957  }
10958  frame = &ast_null_frame;
10959  break;
10960  default:
10961  break;
10962  }
10963  }
10964 
10965  return frame;
10966 }
Definition: astman.c:222
enum ast_frame_type frametype
Definition: channel.c:10921
#define NULL
Definition: resample.c:96
#define AST_MUTE_DIRECTION_WRITE
Definition: channel.h:4938
#define AST_MUTE_DIRECTION_READ
Definition: channel.h:4937
struct ast_frame ast_null_frame
Definition: main/frame.c:79
#define ast_frfree(fr)
enum ast_frame_type frametype
unsigned int direction
Definition: channel.c:10922

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

References suppress_data::framehook_id.

Referenced by ast_channel_suppress().

10927 {
10928  struct suppress_data *suppress = data;
10929 
10930  suppress->framehook_id = framehook_id;
10931 }
int framehook_id
Definition: channel.c:10923

◆ suppress_get_datastore_information()

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

Definition at line 10968 of file channel.c.

References AST_FRAME_VOICE, NULL, and suppress_datastore_voice.

Referenced by ast_channel_suppress(), and ast_channel_unsuppress().

10969 {
10970  switch (frametype) {
10971  case AST_FRAME_VOICE:
10972  return &suppress_datastore_voice;
10973  default:
10974  return NULL;
10975  }
10976 }
enum ast_frame_type frametype
Definition: channel.c:10921
#define NULL
Definition: resample.c:96
static const struct ast_datastore_info suppress_datastore_voice
Definition: channel.c:10910

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

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

5179 {
5180  if (ast_channel_tech(chan)->write_stream) {
5181  return stream ? ast_channel_tech(chan)->write_stream(
5182  chan, ast_stream_get_position(stream), frame) : 0;
5183  }
5184 
5185  return ((stream == default_stream) && ast_channel_tech(chan)->write) ?
5186  ast_channel_tech(chan)->write(chan, frame) : 0;
5187 }
int(*const write)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format (see frame.h)
Definition: channel.h:751
static void write_stream(struct ogg_vorbis_desc *s, FILE *f)
Write out any pending encoded data.
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:754
int ast_stream_get_position(const struct ast_stream *stream)
Get the position of the stream in the topology.
Definition: stream.c:500
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)

◆ tonepair_alloc()

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

Definition at line 7598 of file channel.c.

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.

7599 {
7600  struct tonepair_state *ts;
7601  struct tonepair_def *td = params;
7602 
7603  if (!(ts = ast_calloc(1, sizeof(*ts)))) {
7604  return NULL;
7605  }
7606 
7609  ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", ast_channel_name(chan));
7610  tonepair_release(NULL, ts);
7611  ts = NULL;
7612  } else {
7613  ts->fac1 = 2.0 * cos(2.0 * M_PI * (td->freq1 / 8000.0)) * 32768.0;
7614  ts->v1_1 = 0;
7615  ts->v2_1 = sin(-4.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
7616  ts->v3_1 = sin(-2.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
7617  ts->v2_1 = 0;
7618  ts->fac2 = 2.0 * cos(2.0 * M_PI * (td->freq2 / 8000.0)) * 32768.0;
7619  ts->v2_2 = sin(-4.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
7620  ts->v3_2 = sin(-2.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
7621  ts->duration = td->duration;
7622  ts->modulate = 0;
7623  }
7624  /* Let interrupts interrupt :) */
7626  return ts;
7627 }
unsigned int cos
Definition: chan_iax2.c:352
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define LOG_WARNING
Definition: logger.h:274
#define NULL
Definition: resample.c:96
#define ao2_bump(obj)
Definition: astobj2.h:491
int duration
Definition: channel.c:7565
#define ast_log
Definition: astobj2.c:42
#define M_PI
Definition: resample.c:83
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
static void tonepair_release(struct ast_channel *chan, void *params)
Definition: channel.c:7587
struct ast_format * origwfmt
Definition: channel.c:7578
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)

◆ tonepair_generator()

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

Definition at line 7629 of file channel.c.

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.

7630 {
7631  struct tonepair_state *ts = data;
7632  int x;
7633 
7634  /* we need to prepare a frame with 16 * timelen samples as we're
7635  * generating SLIN audio
7636  */
7637  len = samples * 2;
7638 
7639  if (len > sizeof(ts->data) / 2 - 1) {
7640  ast_log(LOG_WARNING, "Can't generate that much data!\n");
7641  return -1;
7642  }
7643  memset(&ts->f, 0, sizeof(ts->f));
7644  for (x=0;x<len/2;x++) {
7645  ts->v1_1 = ts->v2_1;
7646  ts->v2_1 = ts->v3_1;
7647  ts->v3_1 = (ts->fac1 * ts->v2_1 >> 15) - ts->v1_1;
7648 
7649  ts->v1_2 = ts->v2_2;
7650  ts->v2_2 = ts->v3_2;
7651  ts->v3_2 = (ts->fac2 * ts->v2_2 >> 15) - ts->v1_2;
7652  if (ts->modulate) {
7653  int p;
7654  p = ts->v3_2 - 32768;
7655  if (p < 0) p = -p;
7656  p = ((p * 9) / 10) + 1;
7657  ts->data[x] = (ts->v3_1 * p) >> 15;
7658  } else
7659  ts->data[x] = ts->v3_1 + ts->v3_2;
7660  }
7661  ts->f.frametype = AST_FRAME_VOICE;
7663  ts->f.datalen = len;
7664  ts->f.samples = samples;
7666  ts->f.data.ptr = ts->data;
7667  ast_write(chan, &ts->f);
7668  ts->pos += x;
7669  if (ts->duration > 0) {
7670  if (ts->pos >= ts->duration * 8)
7671  return -1;
7672  }
7673  return 0;
7674 }
#define LOG_WARNING
Definition: logger.h:274
struct ast_frame_subclass subclass
#define ast_log
Definition: astobj2.c:42
short data[4000]
Definition: channel.c:7584
struct ast_frame f
Definition: channel.c:7582
#define AST_FRIENDLY_OFFSET
Offset into a frame&#39;s data buffer.
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
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:5189
union ast_frame::@263 data
enum ast_frame_type frametype
struct ast_format * format
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41

◆ tonepair_release()

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

Definition at line 7587 of file channel.c.

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

Referenced by tonepair_alloc().

7588 {
7589  struct tonepair_state *ts = params;
7590 
7591  if (chan) {
7592  ast_set_write_format(chan, ts->origwfmt);
7593  }
7594  ao2_cleanup(ts->origwfmt);
7595  ast_free(ts);
7596 }
#define ast_free(a)
Definition: astmm.h:182
struct ast_format * origwfmt
Definition: channel.c:7578
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890

◆ varshead_dtor()

static void varshead_dtor ( void *  obj)
static

Destructor for lists of variables.

Parameters
objAO2 object.

Definition at line 8003 of file channel.c.

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

8004 {
8005  struct varshead *head = obj;
8006  struct ast_var_t *var;
8007 
8008  while ((var = AST_RWLIST_REMOVE_HEAD(head, entries))) {
8009  ast_var_delete(var);
8010  }
8011 }
#define var
Definition: ast_expr2f.c:614
void ast_var_delete(struct ast_var_t *var)
Definition: extconf.c:2473
struct ast_var_t::@249 entries
#define AST_RWLIST_REMOVE_HEAD
Definition: linkedlists.h:843

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 *) = NULL
static

◆ ast_moh_start_ptr

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

◆ ast_moh_stop_ptr

void(* ast_moh_stop_ptr) (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:11094

Definition at line 11099 of file channel.c.

◆ causes

const struct causes_map causes[]
static

Definition at line 136 of file channel.c.

Referenced by 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:10629
static void channel_cc_params_destroy(void *data)
Definition: channel.c:10640

Definition at line 10646 of file channel.c.

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

Referenced by ast_channel_move().

◆ channels

struct ao2_container* channels
static

All active channels on the system.

Definition at line 124 of file channel.c.

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

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

◆ null_tech

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

Definition at line 708 of file channel.c.

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

Definition at line 5093 of file channel.c.

◆ set_format_access_read

const struct set_format_access set_format_access_read
static

Definition at line 5658 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 5669 of file channel.c.

Referenced by set_format().

◆ silence_generator

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

Definition at line 8256 of file channel.c.

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

Definition at line 10910 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,
}
Channels with this particular technology are an implementation detail of Asterisk and should generall...
Definition: channel.h:972

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

◆ tonepair

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

Definition at line 7676 of file channel.c.