diff -urN asterisk-1.2.9.1/channels/chan_sip.c asterisk-1.2.9.1-sipregs/channels/chan_sip.c --- asterisk-1.2.9.1/channels/chan_sip.c 2006-05-25 12:18:01.000000000 -0500 +++ asterisk-1.2.9.1-sipregs/channels/chan_sip.c 2006-06-28 21:46:29.000000000 -0500 @@ -902,7 +902,7 @@ static void free_old_route(struct sip_route *route); static int build_reply_digest(struct sip_pvt *p, int method, char *digest, int digest_len); static int update_call_counter(struct sip_pvt *fup, int event); -static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int realtime); +static struct sip_peer *build_peer(const char *name, struct ast_variable *v, struct ast_variable *v2, int realtime); static struct sip_user *build_user(const char *name, struct ast_variable *v, int realtime); static int sip_do_reload(void); static int expire_register(void *data); @@ -1609,10 +1609,11 @@ ast_inet_ntoa(ipaddr, sizeof(ipaddr), sin->sin_addr); snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port)); - if (fullcontact) - ast_update_realtime("sippeers", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, "username", username, "fullcontact", fullcontact, NULL); - else + if (fullcontact) { + ast_update_realtime("sipregs", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, "username", username, "fullcontact", fullcontact, NULL); + } else { ast_update_realtime("sippeers", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, "username", username, NULL); + } } /*! \brief register_peer_exten: Automatically add peer extension to dial plan ---*/ @@ -1673,11 +1674,13 @@ /*! \brief realtime_peer: Get peer from realtime storage - * Checks the "sippeers" realtime family from extconfig.conf */ + * Checks the "sippeers" realtime family from extconfig.conf + * Also checks the "sipregs" realtime family from extconfig.conf */ static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *sin) { struct sip_peer *peer=NULL; - struct ast_variable *var; + struct ast_variable *var=NULL; + struct ast_variable *varregs=NULL; struct ast_variable *tmp; char *newpeername = (char *) peername; char iabuf[80]; @@ -1685,6 +1688,8 @@ /* First check on peer name */ if (newpeername) var = ast_load_realtime("sippeers", "name", peername, NULL); + if (var) + varregs = ast_load_realtime("sipregs", "name", peername, NULL); else if (sin) { /* Then check on IP address */ ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr); var = ast_load_realtime("sippeers", "host", iabuf, NULL); /* First check for fixed IP hosts */ @@ -1703,6 +1708,7 @@ if (!strcasecmp(tmp->name, "type") && !strcasecmp(tmp->value, "user")) { ast_variables_destroy(var); + ast_variables_destroy(varregs); return NULL; } else if (!newpeername && !strcasecmp(tmp->name, "name")) { newpeername = tmp->value; @@ -1713,13 +1719,15 @@ if (!newpeername) { /* Did not find peer in realtime */ ast_log(LOG_WARNING, "Cannot Determine peer name ip=%s\n", iabuf); ast_variables_destroy(var); + ast_variables_destroy(varregs); return (struct sip_peer *) NULL; } /* Peer found in realtime, now build it in memory */ - peer = build_peer(newpeername, var, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)); + peer = build_peer(newpeername, var, varregs, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)); if (!peer) { ast_variables_destroy(var); + ast_variables_destroy(varregs); return (struct sip_peer *) NULL; } @@ -1737,6 +1745,7 @@ ast_set_flag(peer, SIP_REALTIME); } ast_variables_destroy(var); + ast_variables_destroy(varregs); return peer; } @@ -5709,7 +5718,7 @@ { if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_IGNOREREGEXPIRE)) { if (ast_test_flag(&(peer->flags_page2), SIP_PAGE2_RT_FROMCONTACT)) { - ast_update_realtime("sippeers", "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", "username", "", NULL); + ast_update_realtime("sipregs", "name", peer->name, "ipaddr", "", "port", "", "regseconds", "0", "username", "", "fullcontact", "", NULL); } else { ast_db_del("SIP/Registry", peer->name); } @@ -12192,7 +12201,7 @@ } /*! \brief build_peer: Build peer from config file ---*/ -static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int realtime) +static struct sip_peer *build_peer(const char *name, struct ast_variable *v, struct ast_variable *v2, int realtime) { struct sip_peer *peer = NULL; struct ast_ha *oldha = NULL; @@ -12281,17 +12290,9 @@ continue; } - if (realtime && !strcasecmp(v->name, "regseconds")) { - if (sscanf(v->value, "%ld", (time_t *)®seconds) != 1) - regseconds = 0; - } else if (realtime && !strcasecmp(v->name, "ipaddr") && !ast_strlen_zero(v->value) ) { - inet_aton(v->value, &(peer->addr.sin_addr)); - } else if (realtime && !strcasecmp(v->name, "name")) + if (realtime && !strcasecmp(v->name, "name")) ast_copy_string(peer->name, v->value, sizeof(peer->name)); - else if (realtime && !strcasecmp(v->name, "fullcontact")) { - ast_copy_string(peer->fullcontact, v->value, sizeof(peer->fullcontact)); - ast_set_flag((&peer->flags_page2), SIP_PAGE2_RT_FROMCONTACT); - } else if (!strcasecmp(v->name, "secret")) + else if (!strcasecmp(v->name, "secret")) ast_copy_string(peer->secret, v->value, sizeof(peer->secret)); else if (!strcasecmp(v->name, "md5secret")) ast_copy_string(peer->md5secret, v->value, sizeof(peer->md5secret)); @@ -12354,17 +12355,10 @@ } } else if (!strcasecmp(v->name, "permit") || !strcasecmp(v->name, "deny")) { peer->ha = ast_append_ha(v->name, v->value, peer->ha); - } else if (!strcasecmp(v->name, "port")) { - if (!realtime && ast_test_flag(&peer->flags_page2, SIP_PAGE2_DYNAMIC)) - peer->defaddr.sin_port = htons(atoi(v->value)); - else - peer->addr.sin_port = htons(atoi(v->value)); } else if (!strcasecmp(v->name, "callingpres")) { peer->callingpres = ast_parse_caller_presentation(v->value); if (peer->callingpres == -1) peer->callingpres = atoi(v->value); - } else if (!strcasecmp(v->name, "username")) { - ast_copy_string(peer->username, v->value, sizeof(peer->username)); } else if (!strcasecmp(v->name, "language")) { ast_copy_string(peer->language, v->value, sizeof(peer->language)); } else if (!strcasecmp(v->name, "regexten")) { @@ -12437,6 +12431,29 @@ */ v=v->next; } + while (v2) { + if (handle_common_options(&peerflags, &mask, v2)) { + v2 = v2->next; + continue; + } + if (realtime && !strcasecmp(v2->name, "fullcontact")) { + ast_copy_string(peer->fullcontact, v2->value, sizeof(peer->fullcontact)); + ast_set_flag((&peer->flags_page2), SIP_PAGE2_RT_FROMCONTACT); + } else if (realtime && !strcasecmp(v2->name, "ipaddr") && !ast_strlen_zero(v2->value) ) { + inet_aton(v2->value, &(peer->addr.sin_addr)); + } else if (!strcasecmp(v2->name, "port")) { + if (!realtime && ast_test_flag(&peer->flags_page2, SIP_PAGE2_DYNAMIC)) + peer->defaddr.sin_port = htons(atoi(v2->value)); + else + peer->addr.sin_port = htons(atoi(v2->value)); + } else if (realtime && !strcasecmp(v2->name, "regseconds")) { + if (sscanf(v2->value, "%ld", (time_t *)®seconds) != 1) + regseconds = 0; + } else if (!strcasecmp(v2->name, "username")) { + ast_copy_string(peer->username, v2->value, sizeof(peer->username)); + } + v2=v2->next; + } if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_IGNOREREGEXPIRE) && ast_test_flag(&peer->flags_page2, SIP_PAGE2_DYNAMIC) && realtime) { time_t nowtime; @@ -12766,7 +12783,7 @@ } } if (!strcasecmp(utype, "peer") || !strcasecmp(utype, "friend")) { - peer = build_peer(cat, ast_variable_browse(cfg, cat), 0); + peer = build_peer(cat, ast_variable_browse(cfg, cat), NULL, 0); if (peer) { ASTOBJ_CONTAINER_LINK(&peerl,peer); ASTOBJ_UNREF(peer, sip_destroy_peer);