[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