From 54f5e1f84097db8db181feb2358d64c19dc11aa0 Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Thu, 25 Mar 2010 17:29:47 +0000 Subject: [PATCH] Add new rtpsource options to the CHANNEL function. This adds rtpsource options analogous to the rtpdest functions that already exist. In addition, this fixes potential crashes which could result due to trying to read values from nonexistent RTP streams. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@254551 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/sip/dialplan_functions.c | 42 ++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/channels/sip/dialplan_functions.c b/channels/sip/dialplan_functions.c index 473199c714..297f9f5dab 100644 --- a/channels/sip/dialplan_functions.c +++ b/channels/sip/dialplan_functions.c @@ -28,6 +28,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/channel.h" #include "asterisk/rtp_engine.h" #include "asterisk/pbx.h" +#include "asterisk/acl.h" #include "include/sip.h" #include "include/globals.h" @@ -76,19 +77,54 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p ast_copy_string(buf, (p->t38.state == T38_DISABLED) ? "0" : "1", buflen); } else if (!strcasecmp(args.param, "rtpdest")) { struct sockaddr_in sin; + struct ast_rtp_instance *stream; if (ast_strlen_zero(args.type)) args.type = "audio"; if (!strcasecmp(args.type, "audio")) - ast_rtp_instance_get_remote_address(p->rtp, &sin); + stream = p->rtp; else if (!strcasecmp(args.type, "video")) - ast_rtp_instance_get_remote_address(p->vrtp, &sin); + stream = p->vrtp; else if (!strcasecmp(args.type, "text")) - ast_rtp_instance_get_remote_address(p->trtp, &sin); + stream = p->trtp; else return -1; + if (!stream) { + return -1; + } + + ast_rtp_instance_get_remote_address(stream, &sin); + snprintf(buf, buflen, "%s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + } else if (!strcasecmp(args.param, "rtpsource")) { + struct sockaddr_in sin; + struct ast_rtp_instance *stream; + + if (ast_strlen_zero(args.type)) + args.type = "audio"; + + if (!strcasecmp(args.type, "audio")) + stream = p->rtp; + else if (!strcasecmp(args.type, "video")) + stream = p->vrtp; + else if (!strcasecmp(args.type, "text")) + stream = p->trtp; + else + return -1; + + if (!stream) { + return -1; + } + + ast_rtp_instance_get_local_address(stream, &sin); + + if (!sin.sin_addr.s_addr) { + struct sockaddr_in dest_sin; + ast_rtp_instance_get_remote_address(stream, &dest_sin); + ast_ouraddrfor(&dest_sin.sin_addr, &sin.sin_addr); + } + snprintf(buf, buflen, "%s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); } else if (!strcasecmp(args.param, "rtpqos")) { struct ast_rtp_instance *rtp = NULL;