diff --git a/channels/chan_h323.c b/channels/chan_h323.c index 6c5e7a35e2119629810199a4b9439ac6dc0895a6..f6f138c8726bf39df54cd006e946562fd0dfc635 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -2746,6 +2746,56 @@ static struct ast_cli_entry cli_h323[] = { AST_CLI_DEFINE(handle_cli_h323_show_tokens, "Show all active call tokens"), }; +static void delete_users(void) +{ + int pruned = 0; + + /* Delete all users */ + ASTOBJ_CONTAINER_WRLOCK(&userl); + ASTOBJ_CONTAINER_TRAVERSE(&userl, 1, do { + ASTOBJ_RDLOCK(iterator); + ASTOBJ_MARK(iterator); + ++pruned; + ASTOBJ_UNLOCK(iterator); + } while (0) ); + if (pruned) { + ASTOBJ_CONTAINER_PRUNE_MARKED(&userl, oh323_destroy_user); + } + ASTOBJ_CONTAINER_UNLOCK(&userl); + + ASTOBJ_CONTAINER_WRLOCK(&peerl); + ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do { + ASTOBJ_RDLOCK(iterator); + ASTOBJ_MARK(iterator); + ASTOBJ_UNLOCK(iterator); + } while (0) ); + ASTOBJ_CONTAINER_UNLOCK(&peerl); +} + +static void delete_aliases(void) +{ + int pruned = 0; + + /* Delete all aliases */ + ASTOBJ_CONTAINER_WRLOCK(&aliasl); + ASTOBJ_CONTAINER_TRAVERSE(&aliasl, 1, do { + ASTOBJ_RDLOCK(iterator); + ASTOBJ_MARK(iterator); + ++pruned; + ASTOBJ_UNLOCK(iterator); + } while (0) ); + if (pruned) { + ASTOBJ_CONTAINER_PRUNE_MARKED(&aliasl, oh323_destroy_alias); + } + ASTOBJ_CONTAINER_UNLOCK(&aliasl); +} + +static void prune_peers(void) +{ + /* Prune peers who still are supposed to be deleted */ + ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer); +} + static int reload_config(int is_reload) { struct ast_config *cfg, *ucfg; @@ -2973,56 +3023,6 @@ static int reload_config(int is_reload) return 0; } -static void delete_users(void) -{ - int pruned = 0; - - /* Delete all users */ - ASTOBJ_CONTAINER_WRLOCK(&userl); - ASTOBJ_CONTAINER_TRAVERSE(&userl, 1, do { - ASTOBJ_RDLOCK(iterator); - ASTOBJ_MARK(iterator); - ++pruned; - ASTOBJ_UNLOCK(iterator); - } while (0) ); - if (pruned) { - ASTOBJ_CONTAINER_PRUNE_MARKED(&userl, oh323_destroy_user); - } - ASTOBJ_CONTAINER_UNLOCK(&userl); - - ASTOBJ_CONTAINER_WRLOCK(&peerl); - ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do { - ASTOBJ_RDLOCK(iterator); - ASTOBJ_MARK(iterator); - ASTOBJ_UNLOCK(iterator); - } while (0) ); - ASTOBJ_CONTAINER_UNLOCK(&peerl); -} - -static void delete_aliases(void) -{ - int pruned = 0; - - /* Delete all aliases */ - ASTOBJ_CONTAINER_WRLOCK(&aliasl); - ASTOBJ_CONTAINER_TRAVERSE(&aliasl, 1, do { - ASTOBJ_RDLOCK(iterator); - ASTOBJ_MARK(iterator); - ++pruned; - ASTOBJ_UNLOCK(iterator); - } while (0) ); - if (pruned) { - ASTOBJ_CONTAINER_PRUNE_MARKED(&aliasl, oh323_destroy_alias); - } - ASTOBJ_CONTAINER_UNLOCK(&aliasl); -} - -static void prune_peers(void) -{ - /* Prune peers who still are supposed to be deleted */ - ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer); -} - static int h323_reload(void) { ast_mutex_lock(&h323_reload_lock); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 19d3dba73b6b99f3d78b47fc2483b38494426ce7..46c3b56aa873f325067b426858a8e18612ab6be6 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -18201,6 +18201,36 @@ static int reload_config(enum channelreloadreason reason) ASTOBJ_CONTAINER_MARKALL(&peerl); } + if (option_debug > 3) + ast_log(LOG_DEBUG, "--------------- SIP reload started\n"); + + clear_realm_authentication(authl); + clear_sip_domains(); + authl = NULL; + + /* First, destroy all outstanding registry calls */ + /* This is needed, since otherwise active registry entries will not be destroyed */ + ASTOBJ_CONTAINER_TRAVERSE(®l, 1, do { + ASTOBJ_RDLOCK(iterator); + if (iterator->call) { + if (option_debug > 2) + ast_log(LOG_DEBUG, "Destroying active SIP dialog for registry %s@%s\n", iterator->username, iterator->hostname); + /* This will also remove references to the registry */ + sip_destroy(iterator->call); + } + ASTOBJ_UNLOCK(iterator); + + } while(0)); + + /* Then, actually destroy users and registry */ + ASTOBJ_CONTAINER_DESTROYALL(&userl, sip_destroy_user); + if (option_debug > 3) + ast_log(LOG_DEBUG, "--------------- Done destroying user list\n"); + ASTOBJ_CONTAINER_DESTROYALL(®l, sip_registry_destroy); + if (option_debug > 3) + ast_log(LOG_DEBUG, "--------------- Done destroying registry list\n"); + ASTOBJ_CONTAINER_MARKALL(&peerl); + /* Initialize copy of current global_regcontext for later use in removing stale contexts */ ast_copy_string(oldcontexts, global_regcontext, sizeof(oldcontexts)); oldregcontext = oldcontexts; diff --git a/main/config.c b/main/config.c index 379aa2b360da2afbece1b7994a11123c7feb9307..f2b54bc2d05150a080662ce3fc1d5ee29a135ec4 100644 --- a/main/config.c +++ b/main/config.c @@ -1008,7 +1008,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat, if (!ast_strlen_zero(exec_file)) unlink(exec_file); if (!do_include) - return 0; + return -1; /* XXX otherwise what ? the default return is 0 anyways */ } else {