Module: sip-router Branch: master Commit: 92da08fde8ee3273cb7b181f3320fd0f613aeb17 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=92da08fd...
Author: pd peter.dunkley@crocodile-rcs.com Committer: pd peter.dunkley@crocodile-rcs.com Date: Fri Oct 14 14:00:36 2011 +0100
modules_k/dispatcher: Fixes to handling of empty DB and hostnames that cannot be resolved
- Dispatcher handles an empty DB on start-up, but it doesn't do so well on a reload - especially when the DB is now empty, but previously contained records. This commit fixes these issues. - Dispatcher also doesn't cope well when a hostname cannot be resolved to an address. This means a mis-typed DB entry can stop Kamailio from starting up properly. Also fixed in this commit.
---
modules_k/dispatcher/dispatch.c | 29 ++++++++++++++++++++--------- 1 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/modules_k/dispatcher/dispatch.c b/modules_k/dispatcher/dispatch.c index 2c28fb6..9bb942a 100644 --- a/modules_k/dispatcher/dispatch.c +++ b/modules_k/dispatcher/dispatch.c @@ -252,6 +252,8 @@ int add_dest2list(int id, str uri, int flags, int priority, str *attrs, static char hn[256]; struct hostent* he; struct sip_uri puri; + int orig_id = 0, orig_nr = 0; + ds_set_t *orig_ds_lists = ds_lists[list_idx];
/* check uri */ if(parse_uri(uri.s, uri.len, &puri)!=0 || puri.host.len>254) @@ -283,6 +285,8 @@ int add_dest2list(int id, str uri, int flags, int priority, str *attrs, ds_lists[list_idx] = sp; *setn = *setn+1; } + orig_id = sp->id; + orig_nr = sp->nr; sp->id = id; sp->nr++;
@@ -365,6 +369,18 @@ err: shm_free(dp->uri.s); shm_free(dp); } + + if (sp != NULL) + { + sp->id = orig_id; + sp->nr = orig_nr; + if (sp->nr == 0) + { + shm_free(sp); + ds_lists[list_idx] = orig_ds_lists; + } + } + return -1; }
@@ -566,9 +582,8 @@ int ds_load_list(char *lfile) add_destination: if(add_dest2list(id, uri, flags, priority, &attrs, *next_idx, &setn) != 0) - goto error; - - + LM_WARN("unable to add destination %.*s to set %d -- skipping\n", + uri.len, uri.s, id); next_line: p = fgets(line, 256, f); } @@ -720,11 +735,7 @@ int ds_load_db(void) nr_rows = RES_ROW_N(res); rows = RES_ROWS(res); if(nr_rows == 0) - { LM_WARN("no dispatching data in the db -- empty destination set\n"); - ds_dbf.free_result(ds_db_handle, res); - return 0; - }
setn = 0; *next_idx = (*crt_idx + 1)%2; @@ -752,8 +763,8 @@ int ds_load_db(void) } if(add_dest2list(id, uri, flags, priority, &attrs, *next_idx, &setn) != 0) - goto err2; - + LM_WARN("unable to add destination %.*s to set %d -- skipping\n", + uri.len, uri.s, id); } ds_dbf.free_result(ds_db_handle, res);