[asterisk-commits] mmichelson: trunk r254551 - /trunk/channels/sip/dialplan_functions.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Mar 25 12:29:50 CDT 2010
Author: mmichelson
Date: Thu Mar 25 12:29:47 2010
New Revision: 254551
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=254551
Log:
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.
Modified:
trunk/channels/sip/dialplan_functions.c
Modified: trunk/channels/sip/dialplan_functions.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/sip/dialplan_functions.c?view=diff&rev=254551&r1=254550&r2=254551
==============================================================================
--- trunk/channels/sip/dialplan_functions.c (original)
+++ trunk/channels/sip/dialplan_functions.c Thu Mar 25 12:29:47 2010
@@ -28,6 +28,7 @@
#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,18 +77,53 @@
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")) {
More information about the asterisk-commits
mailing list