From 86f9034a9fca696b8efaab1d5e297f29b8b3f0d5 Mon Sep 17 00:00:00 2001 From: tilghman Date: Sun, 15 Jun 2008 15:21:16 +0000 Subject: [PATCH] Add some more IAX2-specific information about the channel to the CHANNEL() function and begin the transition from SIPCHANINFO() to just using CHANNEL(). (closes issue #12856) Reported by: mostyn Patches: iax_and_sip_channel_info.patch uploaded by mostyn (license 398) (with some additional cleanup by me) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@122802 f38db490-d61c-443f-a65b-d21fe96a405b --- UPGRADE.txt | 3 +++ channels/chan_iax2.c | 9 +++++++-- channels/chan_sip.c | 26 +++++++++++++++++++++++++- funcs/func_channel.c | 9 +++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/UPGRADE.txt b/UPGRADE.txt index 8cbed3fb7..73f911a72 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -181,6 +181,9 @@ Channel Drivers: sip:defaultuser@defaultip The "username" setting still work, but is deprecated and will not work in the next version of Asterisk. +* SIP: All of the functionality in SIPCHANINFO() has been implemented in CHANNEL(), + and you should start using that function instead for retrieving information about + the channel in a technology-agnostic way. * chan_local.c: the comma delimiter inside the channel name has been changed to a semicolon, in order to make the Local channel driver compatible with the comma diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index a53b6bb56..2bd1de10b 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -11749,10 +11749,15 @@ static int acf_channel_read(struct ast_channel *chan, const char *funcname, char return -1; } - if (!strcasecmp(args, "osptoken")) + if (!strcasecmp(args, "osptoken")) { ast_copy_string(buf, pvt->osptoken, buflen); - else + } else if (!strcasecmp(args, "peerip")) { + ast_copy_string(buf, pvt->addr.sin_addr.s_addr ? ast_inet_ntoa(pvt->addr.sin_addr) : "", buflen); + } else if (!strcasecmp(args, "peername")) { + ast_copy_string(buf, pvt->username, buflen); + } else { res = -1; + } ast_mutex_unlock(&iaxsl[callno]); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index b5ac72d59..81ea9e96e 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -15510,6 +15510,7 @@ struct ast_custom_function sippeer_function = { static int function_sipchaninfo_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) { struct sip_pvt *p; + static int deprecated = 0; *buf = 0; @@ -15525,6 +15526,11 @@ static int function_sipchaninfo_read(struct ast_channel *chan, const char *cmd, return -1; } + if (deprecated++ % 20 == 0) { + /* Deprecated in 1.6.1 */ + ast_log(LOG_WARNING, "SIPCHANINFO() is deprecated. Please transition to using CHANNEL().\n"); + } + p = chan->tech_pvt; /* If there is no private structure, this channel is no longer alive */ @@ -18524,7 +18530,25 @@ static int acf_channel_read(struct ast_channel *chan, const char *funcname, char memset(buf, 0, buflen); - if (!strcasecmp(args.param, "rtpdest")) { + if (!strcasecmp(args.param, "peerip")) { + ast_copy_string(buf, p->sa.sin_addr.s_addr ? ast_inet_ntoa(p->sa.sin_addr) : "", buflen); + } else if (!strcasecmp(args.param, "recvip")) { + ast_copy_string(buf, p->recv.sin_addr.s_addr ? ast_inet_ntoa(p->recv.sin_addr) : "", buflen); + } else if (!strcasecmp(args.param, "from")) { + ast_copy_string(buf, p->from, buflen); + } else if (!strcasecmp(args.param, "uri")) { + ast_copy_string(buf, p->uri, buflen); + } else if (!strcasecmp(args.param, "useragent")) { + ast_copy_string(buf, p->useragent, buflen); + } else if (!strcasecmp(args.param, "peername")) { + ast_copy_string(buf, p->peername, buflen); + } else if (!strcasecmp(args.param, "t38passthrough")) { + if (p->t38.state == T38_DISABLED) { + ast_copy_string(buf, "0", sizeof("0")); + } else { /* T38 is offered or enabled in this call */ + ast_copy_string(buf, "1", sizeof("1")); + } + } else if (!strcasecmp(args.param, "rtpdest")) { struct sockaddr_in sin; if (ast_strlen_zero(args.type)) diff --git a/funcs/func_channel.c b/funcs/func_channel.c index 506cb2867..c13c668a3 100644 --- a/funcs/func_channel.c +++ b/funcs/func_channel.c @@ -190,6 +190,13 @@ static struct ast_custom_function channel_function = { #endif "\n" "chan_sip provides the following additional options:\n" + "R/O peerip Get the IP address of the peer\n" + "R/O recvip Get the source IP address of the peer\n" + "R/O from Get the URI from the From: header\n" + "R/O uri Get the URI from the Contact: header\n" + "R/O useragent Get the useragent\n" + "R/O peername Get the name of the peer\n" + "R/O t38passthrough 1 if T38 is offered or enabled in this channel, otherwise 0\n" "R/O rtpqos Get QOS information about the RTP stream\n" " This option takes two additional arguments:\n" " Argument 1:\n" @@ -227,6 +234,8 @@ static struct ast_custom_function channel_function = { "\n" "chan_iax2 provides the following additional options:\n" "R/W osptoken Get or set the OSP token information for a call\n" + "R/O peerip Get the peer's ip address\n" + "R/O peername Get the peer's username\n" "\n" "Additional items may be available from the channel driver providing\n" "the channel; see its documentation for details.\n"