From 057505c5a302962a784c82e1d3cb15e758ba4f46 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Tue, 11 Sep 2007 16:03:42 +0000 Subject: [PATCH] The sample dundi.conf claims support for a wildcard peer entry - [*], but the code did not support it. This patch makes it work. (closes issue #10546, patch by dds, with some changes by me) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@82250 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- pbx/pbx_dundi.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c index 6ae74321f6..2f484242aa 100644 --- a/pbx/pbx_dundi.c +++ b/pbx/pbx_dundi.c @@ -268,6 +268,13 @@ static AST_LIST_HEAD_NOLOCK_STATIC(mappings, dundi_mapping); static AST_LIST_HEAD_NOLOCK_STATIC(requests, dundi_request); static AST_LIST_HEAD_NOLOCK_STATIC(alltrans, dundi_transaction); +/*! + * \brief Wildcard peer + * + * This peer is created if the [*] entry is specified in dundi.conf + */ +static struct dundi_peer *any_peer; + static int dundi_xmit(struct dundi_packet *pack); static void dundi_debug_output(const char *data) @@ -489,6 +496,9 @@ static struct dundi_peer *find_peer(dundi_eid *eid) break; } + if (!cur && any_peer) + cur = any_peer; + return cur; } @@ -1507,7 +1517,7 @@ static int handle_command_response(struct dundi_transaction *trans, struct dundi unsigned char *bufcpy; struct dundi_ie_data ied; struct dundi_ies ies; - struct dundi_peer *peer; + struct dundi_peer *peer = NULL; char eid_str[20]; char eid_str2[20]; memset(&ied, 0, sizeof(ied)); @@ -1591,6 +1601,23 @@ static int handle_command_response(struct dundi_transaction *trans, struct dundi case DUNDI_COMMAND_REGREQ: /* A register request -- should only have one entity */ peer = find_peer(ies.eids[0]); + + /* if the peer is not found and we have a valid 'any_peer' setting */ + if (any_peer && peer == any_peer) { + /* copy any_peer into a new peer object */ + peer = ast_calloc(1, sizeof(*peer)); + if (peer) { + memcpy(peer, any_peer, sizeof(*peer)); + + /* set EID to remote EID */ + peer->eid = *ies.eids[0]; + + AST_LIST_LOCK(&peers); + AST_LIST_INSERT_HEAD(&peers, peer, list); + AST_LIST_UNLOCK(&peers); + } + } + if (!peer || !peer->dynamic) { dundi_ie_append_cause(&ied, DUNDI_IE_CAUSE, DUNDI_CAUSE_NOAUTH, NULL); dundi_send(trans, DUNDI_COMMAND_REGRESPONSE, 0, 1, &ied); @@ -4331,8 +4358,9 @@ static int set_config(char *config_file, struct sockaddr_in* sin) dundi_ttl = DUNDI_DEFAULT_TTL; dundi_cache_time = DUNDI_DEFAULT_CACHE_TIME; - cfg = ast_config_load(config_file); + any_peer = NULL; + cfg = ast_config_load(config_file); if (!cfg) { ast_log(LOG_ERROR, "Unable to load config %s\n", config_file); @@ -4455,7 +4483,10 @@ static int set_config(char *config_file, struct sockaddr_in* sin) /* Entries */ if (!dundi_str_to_eid(&testeid, cat)) build_peer(&testeid, ast_variable_browse(cfg, cat), &globalpcmodel); - else + else if (!strcasecmp(cat, "*")) { + build_peer(&empty_eid, ast_variable_browse(cfg, cat), &globalpcmodel); + any_peer = find_peer(NULL); + } else ast_log(LOG_NOTICE, "Ignoring invalid EID entry '%s'\n", cat); } cat = ast_category_browse(cfg, cat);