Asterisk - The Open Source Telephony Project GIT-master-27fb039
Loading...
Searching...
No Matches
Macros | Functions | Variables
channel_internal.h File Reference

Internal channel functions for channel.c to use. More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ast_channel_internal_alloc(destructor, assignedid, requestor)   __ast_channel_internal_alloc(destructor, assignedid, requestor, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 

Functions

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)
 
struct ast_channel__ast_channel_internal_alloc_with_initializers (void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const struct ast_channel_initializers *initializers, const char *file, int line, const char *function)
 
void ast_channel_close_storage (void)
 
void ast_channel_internal_cleanup (struct ast_channel *chan)
 
enum ast_channel_error ast_channel_internal_errno (void)
 
void ast_channel_internal_errno_set (enum ast_channel_error error)
 
void ast_channel_internal_finalize (struct ast_channel *chan)
 
int ast_channel_internal_is_finalized (struct ast_channel *chan)
 
void ast_channel_internal_set_stream_topology (struct ast_channel *chan, struct ast_stream_topology *topology)
 
void ast_channel_internal_set_stream_topology_change_source (struct ast_channel *chan, void *change_source)
 
int ast_channel_internal_setup_topics (struct ast_channel *chan)
 
void ast_channel_internal_swap_stream_topology (struct ast_channel *chan1, struct ast_channel *chan2)
 
int ast_channel_open_storage (void)
 

Variables

const struct ast_channelstorage_drivercurrent_channel_storage_driver
 The current channel storage driver.
 
struct ast_channelstorage_instancecurrent_channel_storage_instance
 The current channel storage instance.
 

Detailed Description

Internal channel functions for channel.c to use.

Definition in file channel_internal.h.

Macro Definition Documentation

◆ ast_channel_internal_alloc

#define ast_channel_internal_alloc (   destructor,
  assignedid,
  requestor 
)    __ast_channel_internal_alloc(destructor, assignedid, requestor, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Definition at line 24 of file channel_internal.h.

Function Documentation

◆ __ast_channel_internal_alloc()

struct ast_channel * __ast_channel_internal_alloc ( void(*)(void *obj)  destructor,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  file,
int  line,
const char *  function 
)

Definition at line 1321 of file channel_internal_api.c.

1323{
1324 return __ast_channel_internal_alloc_with_initializers(destructor, assignedids, requestor, NULL, file, line, function);
1325}
struct ast_channel * __ast_channel_internal_alloc_with_initializers(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const struct ast_channel_initializers *initializers, const char *file, int line, const char *function)
#define NULL
Definition resample.c:96

References __ast_channel_internal_alloc_with_initializers(), and NULL.

Referenced by __ast_dummy_channel_alloc().

◆ __ast_channel_internal_alloc_with_initializers()

struct ast_channel * __ast_channel_internal_alloc_with_initializers ( void(*)(void *obj)  destructor,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const struct ast_channel_initializers initializers,
const char *  file,
int  line,
const char *  function 
)

Definition at line 1244 of file channel_internal_api.c.

1246{
1247 struct ast_channel *tmp;
1248
1249 tmp = __ao2_alloc(sizeof(*tmp), destructor,
1250 AO2_ALLOC_OPT_LOCK_MUTEX, "", file, line, function);
1251
1252 if (!tmp) {
1253 return NULL;
1254 }
1255
1256 if ((ast_string_field_init(tmp, 128))) {
1257 return ast_channel_unref(tmp);
1258 }
1259
1262 if (!tmp->dialed_causes) {
1263 return ast_channel_unref(tmp);
1264 }
1265
1266 /* Check initializers validity here for early abort. Unfortunately, we can't do much here because
1267 * tenant ID is part of linked ID, which would overwrite it further down. */
1268 if (initializers) {
1269 if (initializers->version == 0) {
1270 ast_log(LOG_ERROR, "Channel initializers must have a non-zero version.\n");
1271 return ast_channel_unref(tmp);
1272 } else if (initializers->version != AST_CHANNEL_INITIALIZERS_VERSION) {
1273 ast_log(LOG_ERROR, "ABI mismatch for ast_channel_initializers. "
1274 "Please ensure all modules were compiled for "
1275 "this version of Asterisk.\n");
1276 return ast_channel_unref(tmp);
1277 }
1278 }
1279
1280 /* set the creation time in the uniqueid */
1281 tmp->uniqueid.creation_time = time(NULL);
1283
1284 /* use provided id or default to historical {system-}time.# format */
1285 if (assignedids && !ast_strlen_zero(assignedids->uniqueid)) {
1286 ast_copy_string(tmp->uniqueid.unique_id, assignedids->uniqueid, sizeof(tmp->uniqueid.unique_id));
1288 snprintf(tmp->uniqueid.unique_id, sizeof(tmp->uniqueid.unique_id), "%li.%d",
1289 (long)(tmp->uniqueid.creation_time),
1291 } else {
1292 snprintf(tmp->uniqueid.unique_id, sizeof(tmp->uniqueid.unique_id), "%s-%li.%d",
1294 (long)(tmp->uniqueid.creation_time),
1296 }
1297
1298 /* copy linked id from parent channel if known */
1299 if (requestor) {
1300 tmp->linkedid = requestor->linkedid;
1301 } else {
1302 tmp->linkedid = tmp->uniqueid;
1303 }
1304
1305 /* Things like tenant ID need to be set here, otherwise they would be overwritten by
1306 * things like inheriting linked ID above. */
1307 if (initializers) {
1308 ast_copy_string(tmp->linkedid.tenant_id, initializers->tenantid, sizeof(tmp->linkedid.tenant_id));
1309 }
1310
1311 AST_VECTOR_INIT(&tmp->fds, AST_MAX_FDS);
1312
1313 /* Force all channel snapshot segments to be created on first use, so we don't have to check if
1314 * an old snapshot exists.
1315 */
1317
1318 return tmp;
1319}
#define ast_log
Definition astobj2.c:42
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition astobj2.h:363
void * __ao2_alloc(size_t data_size, ao2_destructor_fn destructor_fn, unsigned int options, const char *tag, const char *file, int line, const char *func) attribute_warn_unused_result
Definition astobj2.c:768
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition astobj2.h:1303
#define AST_CHANNEL_INITIALIZERS_VERSION
struct ABI version
Definition channel.h:620
#define AST_MAX_FDS
Definition channel.h:196
#define ast_channel_unref(c)
Decrease channel reference count.
Definition channel.h:3018
static int uniqueint
The monotonically increasing integer counter for channel uniqueids.
static int pvt_cause_cmp_fn(void *obj, void *vstr, int flags)
Comparison function for pvt cause code frames.
#define DIALED_CAUSES_BUCKETS
static int pvt_cause_hash_fn(const void *vpc, const int flags)
Hash function for pvt cause code frames.
#define LOG_ERROR
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition lock.h:764
const char * ast_config_AST_SYSTEM_NAME
Definition options.c:171
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
const char * uniqueid
Definition channel.h:607
char unique_id[AST_MAX_UNIQUEID]
char tenant_id[AST_MAX_TENANT_ID]
const char * tenantid
Definition channel.h:626
uint32_t version
struct ABI version
Definition channel.h:625
Main Channel structure associated with a channel.
struct ast_channel_id uniqueid
struct ao2_container * dialed_causes
struct ast_flags snapshot_segment_flags
struct ast_channel_id linkedid
#define ast_set_flag(p, flag)
Definition utils.h:71
#define AST_FLAGS_ALL
Definition utils.h:217
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition vector.h:124

References __ao2_alloc(), AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ast_atomic_fetchadd_int(), AST_CHANNEL_INITIALIZERS_VERSION, ast_channel_unref, ast_config_AST_SYSTEM_NAME, ast_copy_string(), AST_FLAGS_ALL, ast_log, AST_MAX_FDS, ast_set_flag, ast_string_field_init, ast_strlen_zero(), AST_VECTOR_INIT, ast_channel_id::creation_time, ast_channel_id::creation_unique, ast_channel::dialed_causes, DIALED_CAUSES_BUCKETS, ast_channel::linkedid, LOG_ERROR, NULL, pvt_cause_cmp_fn(), pvt_cause_hash_fn(), ast_channel::snapshot_segment_flags, ast_channel_id::tenant_id, ast_channel_initializers::tenantid, ast_channel_id::unique_id, ast_assigned_ids::uniqueid, ast_channel::uniqueid, uniqueint, and ast_channel_initializers::version.

Referenced by __ast_channel_alloc_ap(), and __ast_channel_internal_alloc().

◆ ast_channel_close_storage()

void ast_channel_close_storage ( void  )

Definition at line 7978 of file channel.c.

7979{
7981}
struct ast_channelstorage_instance * current_channel_storage_instance
The current channel storage instance.
void ast_channelstorage_close(struct ast_channelstorage_instance *storage_instance)

References ast_channelstorage_close(), and current_channel_storage_instance.

◆ ast_channel_internal_cleanup()

void ast_channel_internal_cleanup ( struct ast_channel chan)

Definition at line 1427 of file channel_internal_api.c.

1428{
1429 if (chan->dialed_causes) {
1430 ao2_t_ref(chan->dialed_causes, -1,
1431 "done with dialed causes since the channel is going away");
1432 chan->dialed_causes = NULL;
1433 }
1434
1436
1439
1440 ao2_cleanup(chan->topic);
1441 chan->topic = NULL;
1442
1444
1445 AST_VECTOR_FREE(&chan->fds);
1446}
#define ao2_t_ref(o, delta, tag)
Definition astobj2.h:460
#define ao2_cleanup(obj)
Definition astobj2.h:1934
void ast_channel_internal_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
struct stasis_forward * stasis_forward_cancel(struct stasis_forward *forward)
Definition stasis.c:1615
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
struct stasis_topic * topic
struct stasis_forward * endpoint_forward
struct stasis_forward * channel_forward
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition vector.h:185

References ao2_cleanup, ao2_t_ref, ast_channel_internal_set_stream_topology(), ast_string_field_free_memory, AST_VECTOR_FREE, ast_channel::channel_forward, ast_channel::dialed_causes, ast_channel::endpoint_forward, NULL, stasis_forward_cancel(), and ast_channel::topic.

Referenced by ast_channel_destructor(), and ast_dummy_channel_destructor().

◆ ast_channel_internal_errno()

enum ast_channel_error ast_channel_internal_errno ( void  )

Definition at line 1529 of file channel_internal_api.c.

1530{
1531 enum ast_channel_error *error_code = ast_threadstorage_get(&channel_errno, sizeof(*error_code));
1532 if (!error_code) {
1534 }
1535
1536 return *error_code;
1537}
ast_channel_error
Definition channel.h:4903
@ AST_CHANNEL_ERROR_UNKNOWN
Definition channel.h:4905
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.

References AST_CHANNEL_ERROR_UNKNOWN, and ast_threadstorage_get().

Referenced by ast_channel_errno().

◆ ast_channel_internal_errno_set()

void ast_channel_internal_errno_set ( enum ast_channel_error  error)

Definition at line 1519 of file channel_internal_api.c.

1520{
1521 enum ast_channel_error *error_code = ast_threadstorage_get(&channel_errno, sizeof(*error_code));
1522 if (!error_code) {
1523 return;
1524 }
1525
1526 *error_code = error;
1527}
int error(const char *format,...)

References ast_threadstorage_get(), and error().

Referenced by __ast_channel_alloc_ap().

◆ ast_channel_internal_finalize()

void ast_channel_internal_finalize ( struct ast_channel chan)

Definition at line 1448 of file channel_internal_api.c.

1449{
1450 chan->finalized = 1;
1451}
unsigned int finalized

References ast_channel::finalized.

Referenced by __ast_channel_alloc_ap().

◆ ast_channel_internal_is_finalized()

int ast_channel_internal_is_finalized ( struct ast_channel chan)

Definition at line 1453 of file channel_internal_api.c.

1454{
1455 return chan->finalized;
1456}

References ast_channel::finalized.

Referenced by ast_channel_destructor().

◆ ast_channel_internal_set_stream_topology()

void ast_channel_internal_set_stream_topology ( struct ast_channel chan,
struct ast_stream_topology topology 
)

Definition at line 525 of file channel_internal_api.c.

527{
529 chan->stream_topology = topology;
531}
static void channel_set_default_streams(struct ast_channel *chan)
void ast_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition stream.c:746
struct ast_stream_topology * stream_topology

References ast_stream_topology_free(), channel_set_default_streams(), and ast_channel::stream_topology.

Referenced by __ast_channel_alloc_ap(), ast_channel_internal_cleanup(), ast_channel_nativeformats_set(), and ast_channel_set_stream_topology().

◆ ast_channel_internal_set_stream_topology_change_source()

void ast_channel_internal_set_stream_topology_change_source ( struct ast_channel chan,
void *  change_source 
)

◆ ast_channel_internal_setup_topics()

int ast_channel_internal_setup_topics ( struct ast_channel chan)

Definition at line 1483 of file channel_internal_api.c.

1484{
1485 char *topic_name;
1486 int ret;
1487 ast_assert(chan->topic == NULL);
1488
1489 if (ast_strlen_zero(chan->uniqueid.unique_id)) {
1490 static int dummy_id;
1491 ret = ast_asprintf(&topic_name, "channel:dummy-%d", ast_atomic_fetchadd_int(&dummy_id, +1));
1492 } else {
1493 ret = ast_asprintf(&topic_name, "channel:%s", chan->uniqueid.unique_id);
1494 }
1495
1496 if (ret < 0) {
1497 return -1;
1498 }
1499
1500 chan->topic = stasis_topic_create(topic_name);
1501 ast_free(topic_name);
1502 if (!chan->topic) {
1503 return -1;
1504 }
1505
1508 if (!chan->channel_forward) {
1509 ao2_ref(chan->topic, -1);
1510 chan->topic = NULL;
1511 return -1;
1512 }
1513
1514 return 0;
1515}
#define ast_free(a)
Definition astmm.h:180
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition astmm.h:267
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
struct stasis_topic * ast_channel_topic(struct ast_channel *chan)
A topic which publishes the events for a particular channel.
struct stasis_topic * ast_channel_topic_all(void)
A topic which publishes the events for all channels.
struct stasis_topic * stasis_topic_create(const char *name)
Create a new topic.
Definition stasis.c:684
struct stasis_forward * stasis_forward_all(struct stasis_topic *from_topic, struct stasis_topic *to_topic)
Create a subscription which forwards all messages from one topic to another.
Definition stasis.c:1645
#define ast_assert(a)
Definition utils.h:779

References ao2_ref, ast_asprintf, ast_assert, ast_atomic_fetchadd_int(), ast_channel_topic(), ast_channel_topic_all(), ast_free, ast_strlen_zero(), ast_channel::channel_forward, NULL, stasis_forward_all(), stasis_topic_create(), ast_channel::topic, ast_channel_id::unique_id, and ast_channel::uniqueid.

Referenced by __ast_channel_alloc_ap(), and __ast_dummy_channel_alloc().

◆ ast_channel_internal_swap_stream_topology()

void ast_channel_internal_swap_stream_topology ( struct ast_channel chan1,
struct ast_channel chan2 
)

Definition at line 1584 of file channel_internal_api.c.

1586{
1587 struct ast_stream_topology *tmp_topology;
1588
1589 ast_assert(chan1 != NULL && chan2 != NULL);
1590
1591 tmp_topology = chan1->stream_topology;
1592 chan1->stream_topology = chan2->stream_topology;
1593 chan2->stream_topology = tmp_topology;
1594
1597}

References ast_assert, channel_set_default_streams(), NULL, and ast_channel::stream_topology.

Referenced by channel_do_masquerade().

◆ ast_channel_open_storage()

int ast_channel_open_storage ( void  )

Definition at line 7996 of file channel.c.

7997{
8000 if (rc) {
8001 ast_log(LOG_ERROR, "No channel storage backends available\n");
8002 return -1;
8003 }
8004 }
8005
8009 ast_log(LOG_ERROR, "Failed to open channel storage driver '%s'\n",
8011 return -1;
8012 }
8013
8014 return 0;
8015}
int internal_channel_set_current_storage_driver(const char *driver_name)
Definition channel.c:8023
const struct ast_channelstorage_driver * current_channel_storage_driver
The current channel storage driver.
struct ast_channelstorage_instance * ast_channelstorage_open(const struct ast_channelstorage_driver *storage_driver, const char *instance_name)
#define AST_CHANNELSTORAGE_DEFAULT_TYPE

References AST_CHANNELSTORAGE_DEFAULT_TYPE, ast_channelstorage_open(), ast_log, current_channel_storage_driver, current_channel_storage_instance, ast_channelstorage_driver::driver_name, internal_channel_set_current_storage_driver(), and LOG_ERROR.

Referenced by ast_channels_init().

Variable Documentation

◆ current_channel_storage_driver

const struct ast_channelstorage_driver* current_channel_storage_driver
extern

◆ current_channel_storage_instance

struct ast_channelstorage_instance* current_channel_storage_instance
extern