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
This commit is contained in:
Mark Michelson
2010-03-25 17:29:47 +00:00
parent bd716c50fd
commit 54f5e1f840

View File

@@ -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;