aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authorroot <root@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-06 16:06:48 +0000
committerroot <root@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-06 16:06:48 +0000
commitbe60380dac83fbd63b26b586ebfcefe10fa15c6c (patch)
treecc8ecb92831a59dd03021ab4e2c99f2a08c39aa6 /channels/chan_iax2.c
parent2993593622bec2056db9560074d9aff5609fa59d (diff)
automerge commit
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2-netsec@42107 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r--channels/chan_iax2.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index f57853ae0..88dc65561 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -2740,18 +2740,16 @@ static struct iax2_user *realtime_user(const char *username)
return user;
}
-static void realtime_update_peer(const char *peername, struct sockaddr_in *sin)
+static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime)
{
- char port[10];
- char ipaddr[20];
- char regseconds[20];
- time_t nowtime;
+ char port[10];
+ char ipaddr[20];
+ char regseconds[20];
- time(&nowtime);
- snprintf(regseconds, sizeof(regseconds), "%d", (int)nowtime);
- ast_inet_ntoa(ipaddr, sizeof(ipaddr), sin->sin_addr);
- snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
- ast_update_realtime("iaxpeers", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, NULL);
+ snprintf(regseconds, sizeof(regseconds), "%d", (int)regtime);
+ ast_inet_ntoa(ipaddr, sizeof(ipaddr), sin->sin_addr);
+ snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
+ ast_update_realtime("iaxpeers", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, NULL);
}
struct create_addr_info {
@@ -5654,6 +5652,8 @@ static int expire_registry(void *data)
struct iax2_peer *p = data;
ast_log(LOG_DEBUG, "Expiring registration for peer '%s'\n", p->name);
+ if (ast_test_flag((&globalflags), IAX_RTUPDATE) && (ast_test_flag(p, IAX_TEMPONLY|IAX_RTCACHEFRIENDS)))
+ realtime_update_peer(p->name, &p->addr, 0);
/* Reset the address */
memset(&p->addr, 0, sizeof(p->addr));
/* Reset expire notice */
@@ -5735,8 +5735,14 @@ static int update_registry(char *name, struct sockaddr_in *sin, int callno, char
return -1;
}
- if (ast_test_flag((&globalflags), IAX_RTUPDATE) && (ast_test_flag(p, IAX_TEMPONLY|IAX_RTCACHEFRIENDS)))
- realtime_update_peer(name, sin);
+ if (ast_test_flag((&globalflags), IAX_RTUPDATE) && (ast_test_flag(p, IAX_TEMPONLY|IAX_RTCACHEFRIENDS))) {
+ if (sin->sin_addr.s_addr) {
+ time_t nowtime;
+ time(&nowtime);
+ realtime_update_peer(name, sin, nowtime);
+ } else
+ realtime_update_peer(name, sin, 0);
+ }
if (inaddrcmp(&p->addr, sin)) {
if (iax2_regfunk)
iax2_regfunk(p->name, 1);