diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-10-13 22:48:11 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-10-13 22:48:11 +0000 |
commit | dc4b4ec91c628cb84b5e5a00688043eddfb79da6 (patch) | |
tree | 1c93449fc7be6c37c2dda3dad16850a0837def8f /channels/chan_iax2.c | |
parent | de92818c5a5635c9bb076121f1efcf3c6a0bc6a9 (diff) |
Fix naming on realtime peers (bug #5421)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6770 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rwxr-xr-x | channels/chan_iax2.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 33d90b90a..2743377ae 100755 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -637,7 +637,7 @@ static struct iax2_dpcache { AST_MUTEX_DEFINE_STATIC(dpcache_lock); static void reg_source_db(struct iax2_peer *p); -static struct iax2_peer *realtime_peer(const char *peername); +static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin); static void destroy_peer(struct iax2_peer *peer); static int ast_cli_netstats(int fd, int limit_fmt); @@ -838,7 +838,7 @@ static struct iax2_peer *find_peer(const char *name, int realtime) } ast_mutex_unlock(&peerl.lock); if(!peer && realtime) - peer = realtime_peer(name); + peer = realtime_peer(name, NULL); return peer; } @@ -860,6 +860,14 @@ static int iax2_getpeername(struct sockaddr_in sin, char *host, int len, int loc } if (lockpeer) ast_mutex_unlock(&peerl.lock); + if (!peer) { + peer = realtime_peer(NULL, &sin); + if (peer) { + ast_copy_string(host, peer->name, len); + if (ast_test_flag(peer, IAX_TEMPONLY)) + destroy_peer(peer); + } + } return res; } @@ -2509,7 +2517,7 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, in static void destroy_user(struct iax2_user *user); static int expire_registry(void *data); -static struct iax2_peer *realtime_peer(const char *peername) +static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin) { struct ast_variable *var; struct ast_variable *tmp; @@ -2517,7 +2525,15 @@ static struct iax2_peer *realtime_peer(const char *peername) time_t regseconds, nowtime; int dynamic=0; - var = ast_load_realtime("iaxpeers", "name", peername, NULL); + if (peername) + var = ast_load_realtime("iaxpeers", "name", peername, NULL); + else { + char iabuf[INET_ADDRSTRLEN]; + char porta[25]; + ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr); + sprintf(porta, "%d", ntohs(sin->sin_port)); + var = ast_load_realtime("iaxpeers", "ipaddr", iabuf, "port", porta, NULL); + } if (!var) return NULL; @@ -5175,7 +5191,7 @@ static int authenticate_reply(struct chan_iax2_pvt *p, struct sockaddr_in *sin, if (!peer) { /* We checked our list and didn't find one. It's unlikely, but possible, that we're trying to authenticate *to* a realtime peer */ - if ((peer = realtime_peer(p->peer))) { + if ((peer = realtime_peer(p->peer, NULL))) { res = authenticate(p->challenge, peer->secret,peer->outkey, authmethods, &ied, sin, &p->ecx, &p->dcx); if (ast_test_flag(peer, IAX_TEMPONLY)) destroy_peer(peer); |