Asterisk - The Open Source Telephony Project GIT-master-754dea3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Macros | Functions | Variables
func_channel.c File Reference

Channel info dialplan functions. More...

#include "asterisk.h"
#include <regex.h>
#include <ctype.h>
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/bridge.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/indications.h"
#include "asterisk/stringfields.h"
#include "asterisk/global_datastores.h"
#include "asterisk/bridge_basic.h"
#include "asterisk/bridge_after.h"
#include "asterisk/max_forwards.h"
Include dependency graph for func_channel.c:

Go to the source code of this file.

Macros

#define locked_copy_string(chan, dest, source, len)
 
#define locked_string_field_set(chan, field, source)
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int func_chan_exists_read (struct ast_channel *chan, const char *function, char *data, char *buf, size_t maxlen)
 
static int func_channel_read (struct ast_channel *chan, const char *function, char *data, char *buf, size_t len)
 
static int func_channel_write (struct ast_channel *chan, const char *function, char *data, const char *value)
 
static int func_channel_write_real (struct ast_channel *chan, const char *function, char *data, const char *value)
 
static int func_channels_read (struct ast_channel *chan, const char *function, char *data, char *buf, size_t maxlen)
 
static int func_mchan_read (struct ast_channel *chan, const char *function, char *data, struct ast_str **buf, ssize_t len)
 
static int func_mchan_write (struct ast_channel *chan, const char *function, char *data, const char *value)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Channel information dialplan functions" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_custom_function chan_exists_function
 
static struct ast_custom_function channel_function
 
static struct ast_custom_function channels_function
 
static struct ast_custom_function mchan_function
 
static const char *const transfercapability_table [0x20]
 

Detailed Description

Channel info dialplan functions.

Author
Kevin P. Fleming kpfle.nosp@m.ming.nosp@m.@digi.nosp@m.um.c.nosp@m.om
Ben Winslow
Naveen Albert aster.nosp@m.isk@.nosp@m.phrea.nosp@m.knet.nosp@m..org

Definition in file func_channel.c.

Macro Definition Documentation

◆ locked_copy_string

#define locked_copy_string (   chan,
  dest,
  source,
  len 
)
Value:
do { \
ast_channel_lock(chan); \
ast_copy_string(dest, source, len); \
ast_channel_unlock(chan); \
} while (0)
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)

Definition at line 361 of file func_channel.c.

◆ locked_string_field_set

#define locked_string_field_set (   chan,
  field,
  source 
)
Value:
do { \
ast_channel_lock(chan); \
ast_channel_##field##_set(chan, source); \
ast_channel_unlock(chan); \
} while (0)

Definition at line 367 of file func_channel.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 942 of file func_channel.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 942 of file func_channel.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 942 of file func_channel.c.

◆ func_chan_exists_read()

static int func_chan_exists_read ( struct ast_channel chan,
const char *  function,
char *  data,
char *  buf,
size_t  maxlen 
)
static

Definition at line 852 of file func_channel.c.

853{
854 struct ast_channel *chan_found = NULL;
855
856 if (ast_strlen_zero(data)) {
857 ast_log(LOG_WARNING, "%s: Channel name or unique ID required\n", function);
858 return -1;
859 }
860
861 chan_found = ast_channel_get_by_name(data);
862 snprintf(buf, maxlen, "%d", (chan_found ? 1 : 0));
863 if (chan_found) {
864 ast_channel_unref(chan_found);
865 }
866 return 0;
867}
#define ast_log
Definition: astobj2.c:42
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:3006
struct ast_channel * ast_channel_get_by_name(const char *name)
Find a channel by name.
Definition: channel.c:1481
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define LOG_WARNING
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Main Channel structure associated with a channel.
const char * data

References ast_channel_get_by_name(), ast_channel_unref, ast_log, ast_strlen_zero(), buf, ast_channel::data, LOG_WARNING, and NULL.

◆ func_channel_read()

static int func_channel_read ( struct ast_channel chan,
const char *  function,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 380 of file func_channel.c.

382{
383 int ret = 0;
384 struct ast_format_cap *tmpcap;
385
386 if (!chan) {
387 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
388 return -1;
389 }
390
391 if (!strcasecmp(data, "audionativeformat")) {
393 if (tmpcap) {
395
396 ast_channel_lock(chan);
398 ast_channel_unlock(chan);
399 ast_copy_string(buf, ast_format_cap_get_names(tmpcap, &codec_buf), len);
400 ao2_ref(tmpcap, -1);
401 }
402 } else if (!strcasecmp(data, "videonativeformat")) {
404 if (tmpcap) {
406
407 ast_channel_lock(chan);
409 ast_channel_unlock(chan);
410 ast_copy_string(buf, ast_format_cap_get_names(tmpcap, &codec_buf), len);
411 ao2_ref(tmpcap, -1);
412 }
413 } else if (!strcasecmp(data, "audioreadformat")) {
415 } else if (!strcasecmp(data, "audiowriteformat")) {
417 } else if (!strcasecmp(data, "tonezone") && ast_channel_zone(chan)) {
419 } else if (!strcasecmp(data, "dtmf_features")) {
421 buf[0] = '\0';
422 }
423 } else if (!strcasecmp(data, "language"))
425 else if (!strcasecmp(data, "musicclass"))
427 else if (!strcasecmp(data, "name")) {
429 } else if (!strcasecmp(data, "parkinglot"))
431 else if (!strcasecmp(data, "state"))
433 else if (!strcasecmp(data, "onhold")) {
435 ast_channel_hold_state(chan) == AST_CONTROL_HOLD ? "1" : "0", len);
436 } else if (!strcasecmp(data, "channeltype"))
438 else if (!strcasecmp(data, "accountcode"))
440 else if (!strcasecmp(data, "checkhangup")) {
441 locked_copy_string(chan, buf, ast_check_hangup(chan) ? "1" : "0", len);
442 } else if (!strcasecmp(data, "peeraccount"))
444 else if (!strcasecmp(data, "hangupsource"))
446 else if (!strcasecmp(data, "appname") && ast_channel_appl(chan))
448 else if (!strcasecmp(data, "appdata") && ast_channel_data(chan))
450 else if (!strcasecmp(data, "exten"))
452 else if (!strcasecmp(data, "context"))
454 else if (!strcasecmp(data, "lastexten"))
456 else if (!strcasecmp(data, "lastcontext"))
458 else if (!strcasecmp(data, "userfield"))
460 else if (!strcasecmp(data, "channame"))
462 else if (!strcasecmp(data, "linkedid")) {
463 ast_channel_lock(chan);
465 /* fall back on the channel's uniqueid if linkedid is unset */
467 }
468 else {
470 }
471 ast_channel_unlock(chan);
472 } else if (!strcasecmp(data, "peer")) {
473 struct ast_channel *peer;
474
475 peer = ast_channel_bridge_peer(chan);
476 if (peer) {
477 /* Only real channels could have a bridge peer this way. */
478 ast_channel_lock(peer);
480 ast_channel_unlock(peer);
481 ast_channel_unref(peer);
482 } else {
483 buf[0] = '\0';
484 ast_channel_lock(chan);
485 if (!ast_channel_tech(chan)) {
486 const char *pname;
487
488 /*
489 * A dummy channel can still pass along bridged peer info
490 * via the BRIDGEPEER variable.
491 *
492 * A horrible kludge, but... how else?
493 */
494 pname = pbx_builtin_getvar_helper(chan, "BRIDGEPEER");
495 if (!ast_strlen_zero(pname)) {
496 ast_copy_string(buf, pname, len);
497 }
498 }
499 ast_channel_unlock(chan);
500 }
501 } else if (!strcasecmp(data, "uniqueid")) {
503 } else if (!strcasecmp(data, "transfercapability")) {
505 } else if (!strcasecmp(data, "callgroup")) {
506 char groupbuf[256];
507
508 locked_copy_string(chan, buf, ast_print_group(groupbuf, sizeof(groupbuf), ast_channel_callgroup(chan)), len);
509 } else if (!strcasecmp(data, "pickupgroup")) {
510 char groupbuf[256];
511
512 locked_copy_string(chan, buf, ast_print_group(groupbuf, sizeof(groupbuf), ast_channel_pickupgroup(chan)), len);
513 } else if (!strcasecmp(data, "namedcallgroup")) {
514 struct ast_str *tmp_str = ast_str_alloca(1024);
515
517 } else if (!strcasecmp(data, "namedpickupgroup")) {
518 struct ast_str *tmp_str = ast_str_alloca(1024);
519
521 } else if (!strcasecmp(data, "after_bridge_goto")) {
523 } else if (!strcasecmp(data, "amaflags")) {
524 ast_channel_lock(chan);
525 snprintf(buf, len, "%u", ast_channel_amaflags(chan));
526 ast_channel_unlock(chan);
527 } else if (!strncasecmp(data, "secure_bridge_", 14)) {
528 struct ast_datastore *ds;
529
530 buf[0] = '\0';
531 ast_channel_lock(chan);
533 struct ast_secure_call_store *encrypt = ds->data;
534
535 if (!strcasecmp(data, "secure_bridge_signaling")) {
536 snprintf(buf, len, "%s", encrypt->signaling ? "1" : "");
537 } else if (!strcasecmp(data, "secure_bridge_media")) {
538 snprintf(buf, len, "%s", encrypt->media ? "1" : "");
539 }
540 }
541 ast_channel_unlock(chan);
542 } else if (!strcasecmp(data, "max_forwards")) {
543 ast_channel_lock(chan);
544 snprintf(buf, len, "%d", ast_max_forwards_get(chan));
545 ast_channel_unlock(chan);
546 } else if (!strcasecmp(data, "callid")) {
547 ast_callid callid;
548
549 buf[0] = '\0';
550 ast_channel_lock(chan);
551 callid = ast_channel_callid(chan);
552 if (callid) {
553 ast_callid_strnprint(buf, len, callid);
554 }
555 ast_channel_unlock(chan);
556 } else if (!strcasecmp(data, "tdd")) {
557 char status;
558 int status_size = (int) sizeof(status);
559 ret = ast_channel_queryoption(chan, AST_OPTION_TDD, &status, &status_size, 0);
560 if (!ret) {
561 ast_copy_string(buf, status == 2 ? "mate" : status ? "1" : "0", len);
562 }
563 } else if (!strcasecmp(data, "digitdetect")) {
564 char status;
565 int status_size = (int) sizeof(status);
566 ret = ast_channel_queryoption(chan, AST_OPTION_DIGIT_DETECT, &status, &status_size, 0);
567 if (!ret) {
568 ast_copy_string(buf, status ? "1" : "0", len);
569 }
570 } else if (!strcasecmp(data, "faxdetect")) {
571 char status;
572 int status_size = (int) sizeof(status);
573 ret = ast_channel_queryoption(chan, AST_OPTION_FAX_DETECT, &status, &status_size, 0);
574 if (!ret) {
575 ast_copy_string(buf, status ? "1" : "0", len);
576 }
577 } else if (!strcasecmp(data, "device_name")) {
578 ret = ast_channel_get_device_name(chan, buf, len);
579 } else if (!strcasecmp(data, "tenantid")) {
581 } else if (!ast_channel_tech(chan) || !ast_channel_tech(chan)->func_channel_read || ast_channel_tech(chan)->func_channel_read(chan, function, data, buf, len)) {
582 ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n", data);
583 ret = -1;
584 }
585
586 return ret;
587}
jack_status_t status
Definition: app_jack.c:149
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
void ast_bridge_read_after_goto(struct ast_channel *chan, char *buffer, size_t buf_size)
Read after bridge goto if it exists.
Definition: bridge_after.c:394
int ast_bridge_features_ds_get_string(struct ast_channel *chan, char *buffer, size_t buf_size)
writes a channel's DTMF features to a buffer string
Definition: bridge_basic.c:208
static const char type[]
Definition: chan_ooh323.c:109
const char * ast_channel_linkedid(const struct ast_channel *chan)
const char * ast_channel_name(const struct ast_channel *chan)
char * ast_print_namedgroups(struct ast_str **buf, struct ast_namedgroups *groups)
Print named call groups and named pickup groups.
Definition: channel.c:8082
int ast_channel_get_device_name(struct ast_channel *chan, char *device_name, size_t name_buffer_length)
Get a device name given its channel structure.
Definition: channel.c:10522
struct ast_namedgroups * ast_channel_named_pickupgroups(const struct ast_channel *chan)
const char * ast_channel_data(const struct ast_channel *chan)
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
Definition: channel.c:10590
const char * ast_channel_tenantid(const struct ast_channel *chan)
const char * ast_channel_musicclass(const struct ast_channel *chan)
#define ast_channel_lock(chan)
Definition: channel.h:2970
const char * ast_channel_lastexten(const struct ast_channel *chan)
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
unsigned short ast_channel_transfercapability(const struct ast_channel *chan)
struct ast_namedgroups * ast_channel_named_callgroups(const struct ast_channel *chan)
ast_group_t ast_channel_pickupgroup(const struct ast_channel *chan)
int ast_channel_queryoption(struct ast_channel *channel, int option, void *data, int *datalen, int block)
Checks the value of an option.
Definition: channel.c:7463
ast_callid ast_channel_callid(const struct ast_channel *chan)
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_accountcode(const struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
const char * ast_channel_userfield(const struct ast_channel *chan)
char * ast_print_group(char *buf, int buflen, ast_group_t group)
Print call and pickup groups into buffer.
Definition: channel.c:8057
const char * ast_channel_parkinglot(const struct ast_channel *chan)
const char * ast_channel_appl(const struct ast_channel *chan)
const char * ast_channel_peeraccount(const struct ast_channel *chan)
enum ama_flags ast_channel_amaflags(const struct ast_channel *chan)
const char * ast_channel_hangupsource(const struct ast_channel *chan)
int ast_check_hangup(struct ast_channel *chan)
Check to see if a channel is needing hang up.
Definition: channel.c:445
struct ast_tone_zone * ast_channel_zone(const struct ast_channel *chan)
const char * ast_channel_lastcontext(const struct ast_channel *chan)
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
ast_group_t ast_channel_callgroup(const struct ast_channel *chan)
int ast_channel_hold_state(const struct ast_channel *chan)
const char * ast_channel_language(const struct ast_channel *chan)
const char * ast_state2str(enum ast_channel_state state)
Gives the string form of a given channel state.
Definition: channel.c:636
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
const char * ast_channel_exten(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2971
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:2428
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_MEDIA_TYPE_AUDIO
Definition: codec.h:32
@ AST_MEDIA_TYPE_VIDEO
Definition: codec.h:33
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition: format.c:334
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:324
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
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
const char * ast_format_cap_get_names(const struct ast_format_cap *cap, struct ast_str **buf)
Get the names of codecs of a set of formats.
Definition: format_cap.c:734
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
#define locked_copy_string(chan, dest, source, len)
Definition: func_channel.c:361
static const char *const transfercapability_table[0x20]
Definition: func_channel.c:374
static int func_channel_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t len)
Definition: func_channel.c:380
const struct ast_datastore_info secure_call_info
#define AST_OPTION_DIGIT_DETECT
#define AST_OPTION_TDD
#define AST_OPTION_FAX_DETECT
@ AST_CONTROL_HOLD
void ast_callid_strnprint(char *buffer, size_t buffer_size, ast_callid callid)
copy a string representation of the callid into a target string
Definition: logger.c:2263
unsigned int ast_callid
int ast_max_forwards_get(struct ast_channel *chan)
Get the current max forwards for a particular channel.
Definition: max_forwards.c:121
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
static char country[80]
Definition: pbx_dundi.c:214
#define ast_str_alloca(init_len)
Definition: strings.h:848
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
Structure for a data store object.
Definition: datastore.h:64
void * data
Definition: datastore.h:66
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
Support for dynamic strings.
Definition: strings.h:623

References ao2_ref, ast_bridge_features_ds_get_string(), ast_bridge_read_after_goto(), ast_callid_strnprint(), ast_channel_accountcode(), ast_channel_amaflags(), ast_channel_appl(), ast_channel_bridge_peer(), ast_channel_callgroup(), ast_channel_callid(), ast_channel_context(), ast_channel_data(), ast_channel_datastore_find(), ast_channel_exten(), ast_channel_get_device_name(), ast_channel_hangupsource(), ast_channel_hold_state(), ast_channel_language(), ast_channel_lastcontext(), ast_channel_lastexten(), ast_channel_linkedid(), ast_channel_lock, ast_channel_musicclass(), ast_channel_name(), ast_channel_named_callgroups(), ast_channel_named_pickupgroups(), ast_channel_nativeformats(), ast_channel_parkinglot(), ast_channel_peeraccount(), ast_channel_pickupgroup(), ast_channel_queryoption(), ast_channel_readformat(), ast_channel_tech(), ast_channel_tenantid(), ast_channel_transfercapability(), ast_channel_uniqueid(), ast_channel_unlock, ast_channel_unref, ast_channel_userfield(), ast_channel_writeformat(), ast_channel_zone(), ast_check_hangup(), AST_CONTROL_HOLD, ast_copy_string(), ast_format_cap_alloc, ast_format_cap_append_from_cap(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_names(), AST_FORMAT_CAP_NAMES_LEN, ast_format_get_name(), ast_log, ast_max_forwards_get(), AST_MEDIA_TYPE_AUDIO, AST_MEDIA_TYPE_VIDEO, AST_OPTION_DIGIT_DETECT, AST_OPTION_FAX_DETECT, AST_OPTION_TDD, ast_print_group(), ast_print_namedgroups(), ast_state2str(), ast_str_alloca, ast_strlen_zero(), buf, country, ast_datastore::data, ast_channel::data, func_channel_read(), len(), locked_copy_string, LOG_WARNING, ast_secure_call_store::media, NULL, pbx_builtin_getvar_helper(), secure_call_info, ast_secure_call_store::signaling, status, transfercapability_table, and type.

Referenced by func_channel_read().

◆ func_channel_write()

static int func_channel_write ( struct ast_channel chan,
const char *  function,
char *  data,
const char *  value 
)
static

Definition at line 765 of file func_channel.c.

766{
767 int res;
768 ast_chan_write_info_t write_info = {
770 .write_fn = func_channel_write_real,
771 .chan = chan,
772 .function = function,
773 .data = data,
774 .value = value,
775 };
776
777 if (!chan) {
778 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
779 return -1;
780 }
781
782 res = func_channel_write_real(chan, function, data, value);
783 ast_channel_setoption(chan, AST_OPTION_CHANNEL_WRITE, &write_info, sizeof(write_info), 0);
784
785 return res;
786}
#define AST_CHAN_WRITE_INFO_T_VERSION
ast_chan_write_info_t version. Must be incremented if structure is changed
Definition: channel.h:593
int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block)
Sets an option on a channel.
Definition: channel.c:7443
static int func_channel_write_real(struct ast_channel *chan, const char *function, char *data, const char *value)
Definition: func_channel.c:589
#define AST_OPTION_CHANNEL_WRITE
Handle channel write data If a channel needs to process the data from a func_channel write operation ...
Structure to handle passing func_channel_write info to channels via setoption.
Definition: channel.h:591
int value
Definition: syslog.c:37

References AST_CHAN_WRITE_INFO_T_VERSION, ast_channel_setoption(), ast_log, AST_OPTION_CHANNEL_WRITE, ast_channel::data, func_channel_write_real(), LOG_WARNING, value, and ast_chan_write_info_t::version.

Referenced by func_channel_write_real().

◆ func_channel_write_real()

static int func_channel_write_real ( struct ast_channel chan,
const char *  function,
char *  data,
const char *  value 
)
static

Definition at line 589 of file func_channel.c.

591{
592 int ret = 0;
593 signed char gainset;
594
595 if (!strcasecmp(data, "language"))
597 else if (!strcasecmp(data, "parkinglot"))
598 locked_string_field_set(chan, parkinglot, value);
599 else if (!strcasecmp(data, "musicclass"))
600 locked_string_field_set(chan, musicclass, value);
601 else if (!strcasecmp(data, "accountcode"))
603 else if (!strcasecmp(data, "userfield"))
604 locked_string_field_set(chan, userfield, value);
605 else if (!strcasecmp(data, "after_bridge_goto")) {
606 if (ast_strlen_zero(value)) {
608 } else {
610 }
611 } else if (!strcasecmp(data, "amaflags")) {
612 int amaflags;
613
614 if (isdigit(*value)) {
615 if (sscanf(value, "%30d", &amaflags) != 1) {
617 }
618 } else {
620 }
621 ast_channel_lock(chan);
623 ast_channel_unlock(chan);
624 } else if (!strcasecmp(data, "peeraccount"))
625 locked_string_field_set(chan, peeraccount, value);
626 else if (!strcasecmp(data, "hangupsource"))
627 /* XXX - should we be forcing this here? */
628 ast_set_hangupsource(chan, value, 0);
629 else if (!strcasecmp(data, "tonezone")) {
630 struct ast_tone_zone *new_zone;
631 if (!(new_zone = ast_get_indication_zone(value))) {
632 ast_log(LOG_ERROR, "Unknown country code '%s' for tonezone. Check indications.conf for available country codes.\n", value);
633 ret = -1;
634 } else {
635 ast_channel_lock(chan);
636 if (ast_channel_zone(chan)) {
638 }
640 ast_channel_unlock(chan);
641 new_zone = ast_tone_zone_unref(new_zone);
642 }
643 } else if (!strcasecmp(data, "dtmf_features")) {
645 } else if (!strcasecmp(data, "callgroup")) {
646 ast_channel_lock(chan);
648 ast_channel_unlock(chan);
649 } else if (!strcasecmp(data, "pickupgroup")) {
650 ast_channel_lock(chan);
652 ast_channel_unlock(chan);
653 } else if (!strcasecmp(data, "namedcallgroup")) {
654 struct ast_namedgroups *groups = ast_get_namedgroups(value);
655
656 ast_channel_lock(chan);
658 ast_channel_unlock(chan);
660 } else if (!strcasecmp(data, "namedpickupgroup")) {
661 struct ast_namedgroups *groups = ast_get_namedgroups(value);
662
663 ast_channel_lock(chan);
665 ast_channel_unlock(chan);
667 } else if (!strcasecmp(data, "tdd")) {
668 char enabled;
669 if (!strcasecmp(value, "mate")) {
670 enabled = 2;
671 } else {
672 enabled = ast_true(value) ? 1 : 0;
673 }
675 } else if (!strcasecmp(data, "relaxdtmf")) {
676 char enabled = ast_true(value) ? 1 : 0;
678 } else if (!strcasecmp(data, "txgain")) {
679 sscanf(value, "%4hhd", &gainset);
680 ast_channel_setoption(chan, AST_OPTION_TXGAIN, &gainset, sizeof(gainset), 0);
681 } else if (!strcasecmp(data, "rxgain")) {
682 sscanf(value, "%4hhd", &gainset);
683 ast_channel_setoption(chan, AST_OPTION_RXGAIN, &gainset, sizeof(gainset), 0);
684 } else if (!strcasecmp(data, "digitdetect")) {
685 char enabled = ast_true(value) ? 1 : 0;
687 } else if (!strcasecmp(data, "faxdetect")) {
688 char enabled = ast_true(value) ? 1 : 0;
690 } else if (!strcasecmp(data, "transfercapability")) {
691 unsigned short i;
692
693 ast_channel_lock(chan);
694 for (i = 0; i < 0x20; i++) {
695 if (!strcasecmp(transfercapability_table[i], value) && strcmp(value, "UNK")) {
697 break;
698 }
699 }
700 ast_channel_unlock(chan);
701 } else if (!strcasecmp(data, "hangup_handler_pop")) {
702 /* Pop one hangup handler before pushing the new handler. */
705 } else if (!strcasecmp(data, "hangup_handler_push")) {
707 } else if (!strcasecmp(data, "hangup_handler_wipe")) {
708 /* Pop all hangup handlers before pushing the new handler. */
709 while (ast_pbx_hangup_handler_pop(chan)) {
710 }
712 } else if (!strncasecmp(data, "secure_bridge_", 14)) {
713 struct ast_datastore *ds;
714 struct ast_secure_call_store *store;
715
716 if (!chan || !value) {
717 return -1;
718 }
719
720 ast_channel_lock(chan);
721 if (!(ds = ast_channel_datastore_find(chan, &secure_call_info, NULL))) {
723 ast_channel_unlock(chan);
724 return -1;
725 }
726 if (!(store = ast_calloc(1, sizeof(*store)))) {
727 ast_channel_unlock(chan);
728 ast_free(ds);
729 return -1;
730 }
731 ds->data = store;
733 } else {
734 store = ds->data;
735 }
736
737 if (!strcasecmp(data, "secure_bridge_signaling")) {
738 store->signaling = ast_true(value) ? 1 : 0;
739 } else if (!strcasecmp(data, "secure_bridge_media")) {
740 store->media = ast_true(value) ? 1 : 0;
741 }
742 ast_channel_unlock(chan);
743 } else if (!strcasecmp(data, "max_forwards")) {
744 int max_forwards;
745 if (sscanf(value, "%d", &max_forwards) != 1) {
746 ast_log(LOG_WARNING, "Unable to set max forwards to '%s'\n", value);
747 ret = -1;
748 } else {
749 ast_channel_lock(chan);
751 ast_channel_unlock(chan);
752 }
753 } else if (!strcasecmp(data, "tenantid")) {
755 } else if (!ast_channel_tech(chan)->func_channel_write
756 || ast_channel_tech(chan)->func_channel_write(chan, function, data, value)) {
757 ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n",
758 data);
759 ret = -1;
760 }
761
762 return ret;
763}
#define ast_free(a)
Definition: astmm.h:180
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
void ast_bridge_discard_after_goto(struct ast_channel *chan)
Discard channel after bridge goto location.
Definition: bridge_after.c:384
void ast_bridge_set_after_go_on(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *parseable_goto)
Set channel to go on in the dialplan after the bridge.
Definition: bridge_after.c:622
int ast_bridge_features_ds_set_string(struct ast_channel *chan, const char *features)
Sets the features a channel will use upon being bridged.
Definition: bridge_basic.c:189
static int amaflags
Definition: chan_iax2.c:500
static char language[MAX_LANGUAGE]
Definition: chan_iax2.c:348
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: chan_iax2.c:497
void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2414
void ast_channel_tenantid_set(struct ast_channel *chan, const char *value)
int ast_channel_priority(const struct ast_channel *chan)
@ AST_AMA_NONE
Definition: channel.h:1198
struct ast_namedgroups * ast_get_namedgroups(const char *s)
Create an ast_namedgroups set with group names from comma separated string.
Definition: channel.c:7696
void ast_channel_callgroup_set(struct ast_channel *chan, ast_group_t value)
void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
Set the source of the hangup in this channel and it's bridge.
Definition: channel.c:2528
void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
enum ama_flags ast_channel_string2amaflag(const char *flag)
Convert a string to a detail record AMA flag.
Definition: channel.c:4377
void ast_channel_zone_set(struct ast_channel *chan, struct ast_tone_zone *value)
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
Definition: channel.c:7753
void ast_channel_transfercapability_set(struct ast_channel *chan, unsigned short value)
void ast_channel_pickupgroup_set(struct ast_channel *chan, ast_group_t value)
ast_group_t ast_get_group(const char *s)
Definition: channel.c:7639
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:85
static int enabled
Definition: dnsmgr.c:91
#define locked_string_field_set(chan, field, source)
Definition: func_channel.c:367
static int func_channel_write(struct ast_channel *chan, const char *function, char *data, const char *value)
Definition: func_channel.c:765
#define AST_OPTION_RELAXDTMF
#define AST_OPTION_RXGAIN
#define AST_OPTION_TXGAIN
#define LOG_ERROR
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_tone_zone * ast_get_indication_zone(const char *country)
locate ast_tone_zone
Definition: indications.c:439
static struct ast_tone_zone * ast_tone_zone_ref(struct ast_tone_zone *tz)
Increase the reference count on an ast_tone_zone.
Definition: indications.h:216
int ast_max_forwards_set(struct ast_channel *chan, int starting_count)
Set the starting max forwards for a particular channel.
Definition: max_forwards.c:105
void ast_pbx_hangup_handler_push(struct ast_channel *chan, const char *handler)
Push the given hangup handler onto the channel hangup handler stack.
int ast_pbx_hangup_handler_pop(struct ast_channel *chan)
Pop the top of the channel hangup handler stack.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition: utils.c:2199
A set of tones for a given locale.
Definition: indications.h:74
Channel datastore data for max forwards.
Definition: max_forwards.c:29

References accountcode, amaflags, AST_AMA_NONE, ast_bridge_discard_after_goto(), ast_bridge_features_ds_set_string(), ast_bridge_set_after_go_on(), ast_calloc, ast_channel_amaflags_set(), ast_channel_callgroup_set(), ast_channel_context(), ast_channel_datastore_add(), ast_channel_datastore_find(), ast_channel_exten(), ast_channel_lock, ast_channel_named_callgroups_set(), ast_channel_named_pickupgroups_set(), ast_channel_pickupgroup_set(), ast_channel_priority(), ast_channel_setoption(), ast_channel_string2amaflag(), ast_channel_tech(), ast_channel_tenantid_set(), ast_channel_transfercapability_set(), ast_channel_unlock, ast_channel_zone(), ast_channel_zone_set(), ast_datastore_alloc, ast_free, ast_get_group(), ast_get_indication_zone(), ast_get_namedgroups(), ast_log, ast_max_forwards_set(), AST_OPTION_DIGIT_DETECT, AST_OPTION_FAX_DETECT, AST_OPTION_RELAXDTMF, AST_OPTION_RXGAIN, AST_OPTION_TDD, AST_OPTION_TXGAIN, ast_pbx_hangup_handler_pop(), ast_pbx_hangup_handler_push(), ast_set_hangupsource(), ast_strlen_zero(), ast_tone_zone_ref(), ast_tone_zone_unref(), ast_true(), ast_unref_namedgroups(), ast_datastore::data, enabled, func_channel_write(), language, locked_string_field_set, LOG_ERROR, LOG_WARNING, ast_secure_call_store::media, NULL, secure_call_info, ast_secure_call_store::signaling, transfercapability_table, and value.

Referenced by func_channel_write().

◆ func_channels_read()

static int func_channels_read ( struct ast_channel chan,
const char *  function,
char *  data,
char *  buf,
size_t  maxlen 
)
static

Definition at line 794 of file func_channel.c.

795{
796 struct ast_channel *c = NULL;
797 regex_t re;
798 int res;
799 size_t buflen = 0;
800 struct ast_channel_iterator *iter;
801
802 buf[0] = '\0';
803
804 if (!ast_strlen_zero(data)) {
805 if ((res = regcomp(&re, data, REG_EXTENDED | REG_ICASE | REG_NOSUB))) {
806 regerror(res, &re, buf, maxlen);
807 ast_log(LOG_WARNING, "Error compiling regular expression for %s(%s): %s\n", function, data, buf);
808 return -1;
809 }
810 }
811
812 if (!(iter = ast_channel_iterator_all_new())) {
813 if (!ast_strlen_zero(data)) {
814 regfree(&re);
815 }
816 return -1;
817 }
818
819 while ((c = ast_channel_iterator_next(iter))) {
821 if (ast_strlen_zero(data) || regexec(&re, ast_channel_name(c), 0, NULL, 0) == 0) {
822 size_t namelen = strlen(ast_channel_name(c));
823 if (buflen + namelen + (ast_strlen_zero(buf) ? 0 : 1) + 1 < maxlen) {
824 if (!ast_strlen_zero(buf)) {
825 strcat(buf, " ");
826 buflen++;
827 }
828 strcat(buf, ast_channel_name(c));
829 buflen += namelen;
830 } else {
831 ast_log(LOG_WARNING, "Number of channels exceeds the available buffer space. Output will be truncated!\n");
832 }
833 }
836 }
837
839
840 if (!ast_strlen_zero(data)) {
841 regfree(&re);
842 }
843
844 return 0;
845}
struct ast_channel_iterator * ast_channel_iterator_destroy(struct ast_channel_iterator *i)
Destroy a channel iterator.
Definition: channel.c:1387
struct ast_channel * ast_channel_iterator_next(struct ast_channel_iterator *i)
Get the next channel for a channel iterator.
Definition: channel.c:1449
struct ast_channel_iterator * ast_channel_iterator_all_new(void)
Create a new channel iterator.
Definition: channel.c:1435
static struct test_val c

References ast_channel_iterator_all_new(), ast_channel_iterator_destroy(), ast_channel_iterator_next(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, ast_channel_unref, ast_log, ast_strlen_zero(), buf, c, LOG_WARNING, and NULL.

◆ func_mchan_read()

static int func_mchan_read ( struct ast_channel chan,
const char *  function,
char *  data,
struct ast_str **  buf,
ssize_t  len 
)
static

Definition at line 874 of file func_channel.c.

876{
877 struct ast_channel *mchan;
878 char *template = ast_alloca(4 + strlen(data));
879
880 if (!chan) {
881 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
882 return -1;
883 }
884
886 sprintf(template, "${%s}", data); /* SAFE */
887 ast_str_substitute_variables(buf, len, mchan ? mchan : chan, template);
888 if (mchan) {
889 ast_channel_unref(mchan);
890 }
891 return 0;
892}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)

References ast_alloca, ast_channel_get_by_name(), ast_channel_linkedid(), ast_channel_unref, ast_log, ast_str_substitute_variables(), buf, ast_channel::data, len(), and LOG_WARNING.

◆ func_mchan_write()

static int func_mchan_write ( struct ast_channel chan,
const char *  function,
char *  data,
const char *  value 
)
static

Definition at line 894 of file func_channel.c.

896{
897 struct ast_channel *mchan;
898
899 if (!chan) {
900 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
901 return -1;
902 }
903
905 pbx_builtin_setvar_helper(mchan ? mchan : chan, data, value);
906 if (mchan) {
907 ast_channel_unref(mchan);
908 }
909 return 0;
910}
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.

References ast_channel_get_by_name(), ast_channel_linkedid(), ast_channel_unref, ast_log, ast_channel::data, LOG_WARNING, pbx_builtin_setvar_helper(), and value.

◆ load_module()

static int load_module ( void  )
static

Definition at line 930 of file func_channel.c.

931{
932 int res = 0;
933
938
939 return res;
940}
static struct ast_custom_function channels_function
Definition: func_channel.c:847
static struct ast_custom_function channel_function
Definition: func_channel.c:788
static struct ast_custom_function mchan_function
Definition: func_channel.c:912
static struct ast_custom_function chan_exists_function
Definition: func_channel.c:869
#define ast_custom_function_register(acf)
Register a custom function.
Definition: pbx.h:1559

References ast_custom_function_register, chan_exists_function, channel_function, channels_function, and mchan_function.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 918 of file func_channel.c.

919{
920 int res = 0;
921
926
927 return res;
928}
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.

References ast_custom_function_unregister(), chan_exists_function, channel_function, channels_function, and mchan_function.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Channel information dialplan functions" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
static

Definition at line 942 of file func_channel.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 942 of file func_channel.c.

◆ chan_exists_function

struct ast_custom_function chan_exists_function
static
Initial value:
= {
.name = "CHANNEL_EXISTS",
}
static int func_chan_exists_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t maxlen)
Definition: func_channel.c:852

Definition at line 869 of file func_channel.c.

Referenced by load_module(), and unload_module().

◆ channel_function

struct ast_custom_function channel_function
static
Initial value:
= {
.name = "CHANNEL",
}

Definition at line 788 of file func_channel.c.

Referenced by load_module(), and unload_module().

◆ channels_function

struct ast_custom_function channels_function
static
Initial value:
= {
.name = "CHANNELS",
}
static int func_channels_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t maxlen)
Definition: func_channel.c:794

Definition at line 847 of file func_channel.c.

Referenced by load_module(), and unload_module().

◆ mchan_function

struct ast_custom_function mchan_function
static
Initial value:
= {
.name = "MASTER_CHANNEL",
.read2 = func_mchan_read,
.write = func_mchan_write,
}
static int func_mchan_read(struct ast_channel *chan, const char *function, char *data, struct ast_str **buf, ssize_t len)
Definition: func_channel.c:874
static int func_mchan_write(struct ast_channel *chan, const char *function, char *data, const char *value)
Definition: func_channel.c:894

Definition at line 912 of file func_channel.c.

Referenced by load_module(), and unload_module().

◆ transfercapability_table

const char* const transfercapability_table[0x20]
static
Initial value:
= {
"SPEECH", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK",
"DIGITAL", "RESTRICTED_DIGITAL", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK",
"3K1AUDIO", "DIGITAL_W_TONES", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK",
"VIDEO", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK", }

Definition at line 374 of file func_channel.c.

Referenced by func_channel_read(), and func_channel_write_real().