From 3cf09f40f749c8889de7d2b1aadf05d122ccba4f Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Mon, 27 Feb 2012 16:31:24 +0000 Subject: Convert netsock.h over to use ast_sockaddrs rather than sockaddr_in and update chan_iax2 to pass in the correct types. chan_iax2 is the only consumer for the various ast_netsock_* functions in trunk at this point, so this feels like a safe change to make. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@357005 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 55 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) (limited to 'channels/chan_iax2.c') diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 543726c31..24f49d8bf 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -12266,19 +12266,17 @@ static int get_auth_methods(const char *value) /*! \brief Check if address can be used as packet source. \return 0 address available, 1 address unavailable, -1 error */ -static int check_srcaddr(struct sockaddr *sa, socklen_t salen) +static int check_srcaddr(struct ast_sockaddr *addr) { int sd; - int res; - sd = socket(AF_INET, SOCK_DGRAM, 0); + sd = socket(ast_sockaddr_is_ipv4(addr) ? AF_INET : AF_INET6, SOCK_DGRAM, 0); if (sd < 0) { ast_log(LOG_ERROR, "Socket: %s\n", strerror(errno)); return -1; } - res = bind(sd, sa, salen); - if (res < 0) { + if (ast_bind(sd, addr) < 0) { ast_debug(1, "Can't bind: %s\n", strerror(errno)); close(sd); return 1; @@ -12293,19 +12291,18 @@ static int check_srcaddr(struct sockaddr *sa, socklen_t salen) not found. */ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr) { - struct sockaddr_in sin; - struct ast_sockaddr sin_tmp; + struct ast_sockaddr addr; int nonlocal = 1; int port = IAX_DEFAULT_PORTNO; int sockfd = defaultsockfd; char *tmp; - char *addr; + char *host; char *portstr; if (!(tmp = ast_strdupa(srcaddr))) return -1; - addr = strsep(&tmp, ":"); + host = strsep(&tmp, ":"); portstr = tmp; if (portstr) { @@ -12314,27 +12311,25 @@ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr) port = IAX_DEFAULT_PORTNO; } - sin_tmp.ss.ss_family = AF_INET; - if (!ast_get_ip(&sin_tmp, addr)) { + addr.ss.ss_family = AF_INET; + + if (!ast_get_ip(&addr, host)) { struct ast_netsock *sock; - int res; - ast_sockaddr_to_sin(&sin_tmp, &sin); - sin.sin_port = 0; - sin.sin_family = AF_INET; - res = check_srcaddr((struct sockaddr *) &sin, sizeof(sin)); - if (res == 0) { + if (check_srcaddr(&addr) == 0) { /* ip address valid. */ - sin.sin_port = htons(port); - if (!(sock = ast_netsock_find(netsock, &sin))) - sock = ast_netsock_find(outsock, &sin); + ast_sockaddr_set_port(&addr, port); + + if (!(sock = ast_netsock_find(netsock, &addr))) + sock = ast_netsock_find(outsock, &addr); if (sock) { sockfd = ast_netsock_sockfd(sock); nonlocal = 0; } else { /* INADDR_ANY matches anyway! */ - sin.sin_addr.s_addr = INADDR_ANY; - if (ast_netsock_find(netsock, &sin)) { + ast_sockaddr_parse(&addr, "0.0.0.0", 0); + ast_sockaddr_set_port(&addr, port); + if (ast_netsock_find(netsock, &addr)) { sock = ast_netsock_bind(outsock, io, srcaddr, port, qos.tos, qos.cos, socket_read, NULL); if (sock) { sockfd = ast_netsock_sockfd(sock); @@ -12351,13 +12346,17 @@ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr) peer->sockfd = sockfd; if (nonlocal == 1) { - ast_log(LOG_WARNING, "Non-local or unbound address specified (%s) in sourceaddress for '%s', reverting to default\n", - srcaddr, peer->name); + ast_log(LOG_WARNING, + "Non-local or unbound address specified (%s) in sourceaddress for '%s', reverting to default\n", + srcaddr, + peer->name); + return -1; + } else if (nonlocal == 2) { + ast_log(LOG_WARNING, + "Unable to bind to sourceaddress '%s' for '%s', reverting to default\n", + srcaddr, + peer->name); return -1; - } else if (nonlocal == 2) { - ast_log(LOG_WARNING, "Unable to bind to sourceaddress '%s' for '%s', reverting to default\n", - srcaddr, peer->name); - return -1; } else { ast_debug(1, "Using sourceaddress %s for '%s'\n", srcaddr, peer->name); return 0; -- cgit v1.2.3