aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorroot <root@f38db490-d61c-443f-a65b-d21fe96a405b>2006-06-14 23:11:07 +0000
committerroot <root@f38db490-d61c-443f-a65b-d21fe96a405b>2006-06-14 23:11:07 +0000
commit4e719b4078676930cb7f6030a56228fde3f33b79 (patch)
tree85f8d0e110f7e70fbfaef083d37d41b88e2d6d8e /channels
parentdc25b6fd37bd40faa8eaf78ec8767ef66761dcec (diff)
automerge commit
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2-netsec@34192 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_iax2.c62
1 files changed, 25 insertions, 37 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 1f66bbc26..8b2416762 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -9330,51 +9330,39 @@ struct ast_custom_function iaxpeer_function = {
/*--- iax2_devicestate: Part of the device state notification system ---*/
static int iax2_devicestate(void *data)
{
- char *dest = (char *) data;
+ struct parsed_dial_string pds;
+ char *tmp = ast_strdupa(data);
struct iax2_peer *p;
- int found = 0;
- char *ext, *host;
- char tmp[256];
int res = AST_DEVICE_INVALID;
- ast_copy_string(tmp, dest, sizeof(tmp));
- host = strchr(tmp, '@');
- if (host) {
- *host = '\0';
- host++;
- ext = tmp;
- } else {
- host = tmp;
- ext = NULL;
- }
-
+ parse_dial_string(tmp, &pds);
+ if (!pds.peer || ast_strlen_zero(pds.peer))
+ return res;
+
if (option_debug > 2)
- ast_log(LOG_DEBUG, "Checking device state for device %s\n", dest);
+ ast_log(LOG_DEBUG, "Checking device state for device %s\n", pds.peer);
/* SLD: FIXME: second call to find_peer during registration */
- p = find_peer(host, 1);
- if (p) {
- found++;
- res = AST_DEVICE_UNAVAILABLE;
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "iax2_devicestate(%s): Found peer. What's device state of %s? addr=%d, defaddr=%d maxms=%d, lastms=%d\n",
- host, dest, p->addr.sin_addr.s_addr, p->defaddr.sin_addr.s_addr, p->maxms, p->lastms);
-
- if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
- (!p->maxms || ((p->lastms > -1) && (p->historicms <= p->maxms)))) {
- /* Peer is registered, or have default IP address
- and a valid registration */
- if (p->historicms == 0 || p->historicms <= p->maxms)
- /* let the core figure out whether it is in use or not */
- res = AST_DEVICE_UNKNOWN;
- }
- } else {
- if (option_debug > 2)
- ast_log(LOG_DEBUG, "Devicestate: Can't find peer %s.\n", host);
- }
+ if (!(p = find_peer(pds.peer, 1)))
+ return res;
+
+ res = AST_DEVICE_UNAVAILABLE;
+ if (option_debug > 2)
+ ast_log(LOG_DEBUG, "iax2_devicestate: Found peer. What's device state of %s? addr=%d, defaddr=%d maxms=%d, lastms=%d\n",
+ pds.peer, p->addr.sin_addr.s_addr, p->defaddr.sin_addr.s_addr, p->maxms, p->lastms);
- if (p && ast_test_flag(p, IAX_TEMPONLY))
+ if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
+ (!p->maxms || ((p->lastms > -1) && (p->historicms <= p->maxms)))) {
+ /* Peer is registered, or have default IP address
+ and a valid registration */
+ if (p->historicms == 0 || p->historicms <= p->maxms)
+ /* let the core figure out whether it is in use or not */
+ res = AST_DEVICE_UNKNOWN;
+ }
+
+ if (ast_test_flag(p, IAX_TEMPONLY))
destroy_peer(p);
+
return res;
}