Asterisk - The Open Source Telephony Project GIT-master-0bf3178
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 353 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 359 of file func_channel.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 934 of file func_channel.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 934 of file func_channel.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 934 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 844 of file func_channel.c.

845{
846 struct ast_channel *chan_found = NULL;
847
848 if (ast_strlen_zero(data)) {
849 ast_log(LOG_WARNING, "%s: Channel name or unique ID required\n", function);
850 return -1;
851 }
852
853 chan_found = ast_channel_get_by_name(data);
854 snprintf(buf, maxlen, "%d", (chan_found ? 1 : 0));
855 if (chan_found) {
856 ast_channel_unref(chan_found);
857 }
858 return 0;
859}
#define ast_log
Definition: astobj2.c:42
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:3004
struct ast_channel * ast_channel_get_by_name(const char *name)
Find a channel by name.
Definition: channel.c:1473
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 372 of file func_channel.c.

374{
375 int ret = 0;
376 struct ast_format_cap *tmpcap;
377
378 if (!chan) {
379 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
380 return -1;
381 }
382
383 if (!strcasecmp(data, "audionativeformat")) {
385 if (tmpcap) {
387
388 ast_channel_lock(chan);
390 ast_channel_unlock(chan);
391 ast_copy_string(buf, ast_format_cap_get_names(tmpcap, &codec_buf), len);
392 ao2_ref(tmpcap, -1);
393 }
394 } else if (!strcasecmp(data, "videonativeformat")) {
396 if (tmpcap) {
398
399 ast_channel_lock(chan);
401 ast_channel_unlock(chan);
402 ast_copy_string(buf, ast_format_cap_get_names(tmpcap, &codec_buf), len);
403 ao2_ref(tmpcap, -1);
404 }
405 } else if (!strcasecmp(data, "audioreadformat")) {
407 } else if (!strcasecmp(data, "audiowriteformat")) {
409 } else if (!strcasecmp(data, "tonezone") && ast_channel_zone(chan)) {
411 } else if (!strcasecmp(data, "dtmf_features")) {
413 buf[0] = '\0';
414 }
415 } else if (!strcasecmp(data, "language"))
417 else if (!strcasecmp(data, "musicclass"))
419 else if (!strcasecmp(data, "name")) {
421 } else if (!strcasecmp(data, "parkinglot"))
423 else if (!strcasecmp(data, "state"))
425 else if (!strcasecmp(data, "onhold")) {
427 ast_channel_hold_state(chan) == AST_CONTROL_HOLD ? "1" : "0", len);
428 } else if (!strcasecmp(data, "channeltype"))
430 else if (!strcasecmp(data, "accountcode"))
432 else if (!strcasecmp(data, "checkhangup")) {
433 locked_copy_string(chan, buf, ast_check_hangup(chan) ? "1" : "0", len);
434 } else if (!strcasecmp(data, "peeraccount"))
436 else if (!strcasecmp(data, "hangupsource"))
438 else if (!strcasecmp(data, "appname") && ast_channel_appl(chan))
440 else if (!strcasecmp(data, "appdata") && ast_channel_data(chan))
442 else if (!strcasecmp(data, "exten"))
444 else if (!strcasecmp(data, "context"))
446 else if (!strcasecmp(data, "lastexten"))
448 else if (!strcasecmp(data, "lastcontext"))
450 else if (!strcasecmp(data, "userfield"))
452 else if (!strcasecmp(data, "channame"))
454 else if (!strcasecmp(data, "linkedid")) {
455 ast_channel_lock(chan);
457 /* fall back on the channel's uniqueid if linkedid is unset */
459 }
460 else {
462 }
463 ast_channel_unlock(chan);
464 } else if (!strcasecmp(data, "peer")) {
465 struct ast_channel *peer;
466
467 peer = ast_channel_bridge_peer(chan);
468 if (peer) {
469 /* Only real channels could have a bridge peer this way. */
470 ast_channel_lock(peer);
472 ast_channel_unlock(peer);
473 ast_channel_unref(peer);
474 } else {
475 buf[0] = '\0';
476 ast_channel_lock(chan);
477 if (!ast_channel_tech(chan)) {
478 const char *pname;
479
480 /*
481 * A dummy channel can still pass along bridged peer info
482 * via the BRIDGEPEER variable.
483 *
484 * A horrible kludge, but... how else?
485 */
486 pname = pbx_builtin_getvar_helper(chan, "BRIDGEPEER");
487 if (!ast_strlen_zero(pname)) {
488 ast_copy_string(buf, pname, len);
489 }
490 }
491 ast_channel_unlock(chan);
492 }
493 } else if (!strcasecmp(data, "uniqueid")) {
495 } else if (!strcasecmp(data, "transfercapability")) {
497 } else if (!strcasecmp(data, "callgroup")) {
498 char groupbuf[256];
499
500 locked_copy_string(chan, buf, ast_print_group(groupbuf, sizeof(groupbuf), ast_channel_callgroup(chan)), len);
501 } else if (!strcasecmp(data, "pickupgroup")) {
502 char groupbuf[256];
503
504 locked_copy_string(chan, buf, ast_print_group(groupbuf, sizeof(groupbuf), ast_channel_pickupgroup(chan)), len);
505 } else if (!strcasecmp(data, "namedcallgroup")) {
506 struct ast_str *tmp_str = ast_str_alloca(1024);
507
509 } else if (!strcasecmp(data, "namedpickupgroup")) {
510 struct ast_str *tmp_str = ast_str_alloca(1024);
511
513 } else if (!strcasecmp(data, "after_bridge_goto")) {
515 } else if (!strcasecmp(data, "amaflags")) {
516 ast_channel_lock(chan);
517 snprintf(buf, len, "%u", ast_channel_amaflags(chan));
518 ast_channel_unlock(chan);
519 } else if (!strncasecmp(data, "secure_bridge_", 14)) {
520 struct ast_datastore *ds;
521
522 buf[0] = '\0';
523 ast_channel_lock(chan);
525 struct ast_secure_call_store *encrypt = ds->data;
526
527 if (!strcasecmp(data, "secure_bridge_signaling")) {
528 snprintf(buf, len, "%s", encrypt->signaling ? "1" : "");
529 } else if (!strcasecmp(data, "secure_bridge_media")) {
530 snprintf(buf, len, "%s", encrypt->media ? "1" : "");
531 }
532 }
533 ast_channel_unlock(chan);
534 } else if (!strcasecmp(data, "max_forwards")) {
535 ast_channel_lock(chan);
536 snprintf(buf, len, "%d", ast_max_forwards_get(chan));
537 ast_channel_unlock(chan);
538 } else if (!strcasecmp(data, "callid")) {
539 ast_callid callid;
540
541 buf[0] = '\0';
542 ast_channel_lock(chan);
543 callid = ast_channel_callid(chan);
544 if (callid) {
545 ast_callid_strnprint(buf, len, callid);
546 }
547 ast_channel_unlock(chan);
548 } else if (!strcasecmp(data, "tdd")) {
549 char status;
550 int status_size = (int) sizeof(status);
551 ret = ast_channel_queryoption(chan, AST_OPTION_TDD, &status, &status_size, 0);
552 if (!ret) {
553 ast_copy_string(buf, status == 2 ? "mate" : status ? "1" : "0", len);
554 }
555 } else if (!strcasecmp(data, "digitdetect")) {
556 char status;
557 int status_size = (int) sizeof(status);
558 ret = ast_channel_queryoption(chan, AST_OPTION_DIGIT_DETECT, &status, &status_size, 0);
559 if (!ret) {
560 ast_copy_string(buf, status ? "1" : "0", len);
561 }
562 } else if (!strcasecmp(data, "faxdetect")) {
563 char status;
564 int status_size = (int) sizeof(status);
565 ret = ast_channel_queryoption(chan, AST_OPTION_FAX_DETECT, &status, &status_size, 0);
566 if (!ret) {
567 ast_copy_string(buf, status ? "1" : "0", len);
568 }
569 } else if (!strcasecmp(data, "device_name")) {
570 ret = ast_channel_get_device_name(chan, buf, len);
571 } else if (!strcasecmp(data, "tenantid")) {
573 } 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)) {
574 ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n", data);
575 ret = -1;
576 }
577
578 return ret;
579}
jack_status_t status
Definition: app_jack.c:146
#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:8078
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:10518
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:10586
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:2968
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:7464
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:8053
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:2969
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Definition: channel.c:2418
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:353
static const char *const transfercapability_table[0x20]
Definition: func_channel.c:366
static int func_channel_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t len)
Definition: func_channel.c:372
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:2288
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:205
#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 757 of file func_channel.c.

758{
759 int res;
760 ast_chan_write_info_t write_info = {
762 .write_fn = func_channel_write_real,
763 .chan = chan,
764 .function = function,
765 .data = data,
766 .value = value,
767 };
768
769 if (!chan) {
770 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
771 return -1;
772 }
773
774 res = func_channel_write_real(chan, function, data, value);
775 ast_channel_setoption(chan, AST_OPTION_CHANNEL_WRITE, &write_info, sizeof(write_info), 0);
776
777 return res;
778}
#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:7444
static int func_channel_write_real(struct ast_channel *chan, const char *function, char *data, const char *value)
Definition: func_channel.c:581
#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 581 of file func_channel.c.

583{
584 int ret = 0;
585 signed char gainset;
586
587 if (!strcasecmp(data, "language"))
589 else if (!strcasecmp(data, "parkinglot"))
590 locked_string_field_set(chan, parkinglot, value);
591 else if (!strcasecmp(data, "musicclass"))
592 locked_string_field_set(chan, musicclass, value);
593 else if (!strcasecmp(data, "accountcode"))
595 else if (!strcasecmp(data, "userfield"))
596 locked_string_field_set(chan, userfield, value);
597 else if (!strcasecmp(data, "after_bridge_goto")) {
598 if (ast_strlen_zero(value)) {
600 } else {
602 }
603 } else if (!strcasecmp(data, "amaflags")) {
604 int amaflags;
605
606 if (isdigit(*value)) {
607 if (sscanf(value, "%30d", &amaflags) != 1) {
609 }
610 } else {
612 }
613 ast_channel_lock(chan);
615 ast_channel_unlock(chan);
616 } else if (!strcasecmp(data, "peeraccount"))
617 locked_string_field_set(chan, peeraccount, value);
618 else if (!strcasecmp(data, "hangupsource"))
619 /* XXX - should we be forcing this here? */
620 ast_set_hangupsource(chan, value, 0);
621 else if (!strcasecmp(data, "tonezone")) {
622 struct ast_tone_zone *new_zone;
623 if (!(new_zone = ast_get_indication_zone(value))) {
624 ast_log(LOG_ERROR, "Unknown country code '%s' for tonezone. Check indications.conf for available country codes.\n", value);
625 ret = -1;
626 } else {
627 ast_channel_lock(chan);
628 if (ast_channel_zone(chan)) {
630 }
632 ast_channel_unlock(chan);
633 new_zone = ast_tone_zone_unref(new_zone);
634 }
635 } else if (!strcasecmp(data, "dtmf_features")) {
637 } else if (!strcasecmp(data, "callgroup")) {
638 ast_channel_lock(chan);
640 ast_channel_unlock(chan);
641 } else if (!strcasecmp(data, "pickupgroup")) {
642 ast_channel_lock(chan);
644 ast_channel_unlock(chan);
645 } else if (!strcasecmp(data, "namedcallgroup")) {
646 struct ast_namedgroups *groups = ast_get_namedgroups(value);
647
648 ast_channel_lock(chan);
650 ast_channel_unlock(chan);
652 } else if (!strcasecmp(data, "namedpickupgroup")) {
653 struct ast_namedgroups *groups = ast_get_namedgroups(value);
654
655 ast_channel_lock(chan);
657 ast_channel_unlock(chan);
659 } else if (!strcasecmp(data, "tdd")) {
660 char enabled;
661 if (!strcasecmp(value, "mate")) {
662 enabled = 2;
663 } else {
664 enabled = ast_true(value) ? 1 : 0;
665 }
667 } else if (!strcasecmp(data, "relaxdtmf")) {
668 char enabled = ast_true(value) ? 1 : 0;
670 } else if (!strcasecmp(data, "txgain")) {
671 sscanf(value, "%4hhd", &gainset);
672 ast_channel_setoption(chan, AST_OPTION_TXGAIN, &gainset, sizeof(gainset), 0);
673 } else if (!strcasecmp(data, "rxgain")) {
674 sscanf(value, "%4hhd", &gainset);
675 ast_channel_setoption(chan, AST_OPTION_RXGAIN, &gainset, sizeof(gainset), 0);
676 } else if (!strcasecmp(data, "digitdetect")) {
677 char enabled = ast_true(value) ? 1 : 0;
679 } else if (!strcasecmp(data, "faxdetect")) {
680 char enabled = ast_true(value) ? 1 : 0;
682 } else if (!strcasecmp(data, "transfercapability")) {
683 unsigned short i;
684
685 ast_channel_lock(chan);
686 for (i = 0; i < 0x20; i++) {
687 if (!strcasecmp(transfercapability_table[i], value) && strcmp(value, "UNK")) {
689 break;
690 }
691 }
692 ast_channel_unlock(chan);
693 } else if (!strcasecmp(data, "hangup_handler_pop")) {
694 /* Pop one hangup handler before pushing the new handler. */
697 } else if (!strcasecmp(data, "hangup_handler_push")) {
699 } else if (!strcasecmp(data, "hangup_handler_wipe")) {
700 /* Pop all hangup handlers before pushing the new handler. */
701 while (ast_pbx_hangup_handler_pop(chan)) {
702 }
704 } else if (!strncasecmp(data, "secure_bridge_", 14)) {
705 struct ast_datastore *ds;
706 struct ast_secure_call_store *store;
707
708 if (!chan || !value) {
709 return -1;
710 }
711
712 ast_channel_lock(chan);
713 if (!(ds = ast_channel_datastore_find(chan, &secure_call_info, NULL))) {
715 ast_channel_unlock(chan);
716 return -1;
717 }
718 if (!(store = ast_calloc(1, sizeof(*store)))) {
719 ast_channel_unlock(chan);
720 ast_free(ds);
721 return -1;
722 }
723 ds->data = store;
725 } else {
726 store = ds->data;
727 }
728
729 if (!strcasecmp(data, "secure_bridge_signaling")) {
730 store->signaling = ast_true(value) ? 1 : 0;
731 } else if (!strcasecmp(data, "secure_bridge_media")) {
732 store->media = ast_true(value) ? 1 : 0;
733 }
734 ast_channel_unlock(chan);
735 } else if (!strcasecmp(data, "max_forwards")) {
736 int max_forwards;
737 if (sscanf(value, "%d", &max_forwards) != 1) {
738 ast_log(LOG_WARNING, "Unable to set max forwards to '%s'\n", value);
739 ret = -1;
740 } else {
741 ast_channel_lock(chan);
743 ast_channel_unlock(chan);
744 }
745 } else if (!strcasecmp(data, "tenantid")) {
747 } else if (!ast_channel_tech(chan)->func_channel_write
748 || ast_channel_tech(chan)->func_channel_write(chan, function, data, value)) {
749 ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n",
750 data);
751 ret = -1;
752 }
753
754 return ret;
755}
#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:476
static char language[MAX_LANGUAGE]
Definition: chan_iax2.c:324
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: chan_iax2.c:473
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:2404
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:7697
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:2518
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:4379
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:7754
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:7640
#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:359
static int func_channel_write(struct ast_channel *chan, const char *function, char *data, const char *value)
Definition: func_channel.c:757
#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 786 of file func_channel.c.

787{
788 struct ast_channel *c = NULL;
789 regex_t re;
790 int res;
791 size_t buflen = 0;
792 struct ast_channel_iterator *iter;
793
794 buf[0] = '\0';
795
796 if (!ast_strlen_zero(data)) {
797 if ((res = regcomp(&re, data, REG_EXTENDED | REG_ICASE | REG_NOSUB))) {
798 regerror(res, &re, buf, maxlen);
799 ast_log(LOG_WARNING, "Error compiling regular expression for %s(%s): %s\n", function, data, buf);
800 return -1;
801 }
802 }
803
804 if (!(iter = ast_channel_iterator_all_new())) {
805 if (!ast_strlen_zero(data)) {
806 regfree(&re);
807 }
808 return -1;
809 }
810
811 while ((c = ast_channel_iterator_next(iter))) {
813 if (ast_strlen_zero(data) || regexec(&re, ast_channel_name(c), 0, NULL, 0) == 0) {
814 size_t namelen = strlen(ast_channel_name(c));
815 if (buflen + namelen + (ast_strlen_zero(buf) ? 0 : 1) + 1 < maxlen) {
816 if (!ast_strlen_zero(buf)) {
817 strcat(buf, " ");
818 buflen++;
819 }
820 strcat(buf, ast_channel_name(c));
821 buflen += namelen;
822 } else {
823 ast_log(LOG_WARNING, "Number of channels exceeds the available buffer space. Output will be truncated!\n");
824 }
825 }
828 }
829
831
832 if (!ast_strlen_zero(data)) {
833 regfree(&re);
834 }
835
836 return 0;
837}
struct ast_channel_iterator * ast_channel_iterator_destroy(struct ast_channel_iterator *i)
Destroy a channel iterator.
Definition: channel.c:1379
struct ast_channel * ast_channel_iterator_next(struct ast_channel_iterator *i)
Get the next channel for a channel iterator.
Definition: channel.c:1441
struct ast_channel_iterator * ast_channel_iterator_all_new(void)
Create a new channel iterator.
Definition: channel.c:1427
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 866 of file func_channel.c.

868{
869 struct ast_channel *mchan;
870 char *template = ast_alloca(4 + strlen(data));
871
872 if (!chan) {
873 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
874 return -1;
875 }
876
878 sprintf(template, "${%s}", data); /* SAFE */
879 ast_str_substitute_variables(buf, len, mchan ? mchan : chan, template);
880 if (mchan) {
881 ast_channel_unref(mchan);
882 }
883 return 0;
884}
#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 886 of file func_channel.c.

888{
889 struct ast_channel *mchan;
890
891 if (!chan) {
892 ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
893 return -1;
894 }
895
897 pbx_builtin_setvar_helper(mchan ? mchan : chan, data, value);
898 if (mchan) {
899 ast_channel_unref(mchan);
900 }
901 return 0;
902}
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 922 of file func_channel.c.

923{
924 int res = 0;
925
930
931 return res;
932}
static struct ast_custom_function channels_function
Definition: func_channel.c:839
static struct ast_custom_function channel_function
Definition: func_channel.c:780
static struct ast_custom_function mchan_function
Definition: func_channel.c:904
static struct ast_custom_function chan_exists_function
Definition: func_channel.c:861
#define ast_custom_function_register(acf)
Register a custom function.
Definition: pbx.h:1558

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 910 of file func_channel.c.

911{
912 int res = 0;
913
918
919 return res;
920}
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 934 of file func_channel.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 934 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:844

Definition at line 861 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 780 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:786

Definition at line 839 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:866
static int func_mchan_write(struct ast_channel *chan, const char *function, char *data, const char *value)
Definition: func_channel.c:886

Definition at line 904 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 366 of file func_channel.c.

Referenced by func_channel_read(), and func_channel_write_real().