Merged revisions 34159-34160 via svnmerge from
[asterisk/asterisk.git] / channels / chan_iax2.c
index 27560a2..9a703a0 100644 (file)
@@ -9509,51 +9509,39 @@ struct ast_custom_function iaxpeer_function = {
 /*! \brief 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 (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;
 }