diff options
author | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-01-27 18:29:49 +0000 |
---|---|---|
committer | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-01-27 18:29:49 +0000 |
commit | dd43b1905e4c4177b84bac51e4f0d02538cbf0ae (patch) | |
tree | 2f8be97f4da2d33e2bcaa8caddcb6f0037931465 /main/loader.c | |
parent | 182dc0d6c4e61c3edbfd836c7a03e17956f9fb9b (diff) |
Add new option to asterisk.conf (lockconfdir) to protect conf dir during reloads
(closes issue #16358)
Reported by: raarts
Patches:
lockconfdir.diff uploaded by raarts (license 937)
modified by me
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@243551 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/loader.c')
-rw-r--r-- | main/loader.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/main/loader.c b/main/loader.c index 8c0067d92..99c9f124f 100644 --- a/main/loader.c +++ b/main/loader.c @@ -49,6 +49,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/dsp.h" #include "asterisk/udptl.h" #include "asterisk/heap.h" +#include "asterisk/app.h" #include <dlfcn.h> @@ -652,6 +653,22 @@ int ast_module_reload(const char *name) } ast_lastreloadtime = ast_tvnow(); + if (ast_opt_lock_confdir) { + int try; + int res; + for (try = 1, res = AST_LOCK_TIMEOUT; try < 6 && (res == AST_LOCK_TIMEOUT); try++) { + res = ast_lock_path(ast_config_AST_CONFIG_DIR); + if (res == AST_LOCK_TIMEOUT) { + ast_log(LOG_WARNING, "Failed to grab lock on %s, try %d\n", ast_config_AST_CONFIG_DIR, try); + } + } + if (res != AST_LOCK_SUCCESS) { + ast_verbose("Cannot grab lock on %s\n", ast_config_AST_CONFIG_DIR); + ast_mutex_unlock(&reloadlock); + return -1; + } + } + /* Call "predefined" reload here first */ for (i = 0; reload_classes[i].name; i++) { if (!name || !strcasecmp(name, reload_classes[i].name)) { @@ -661,6 +678,9 @@ int ast_module_reload(const char *name) } if (name && res) { + if (ast_opt_lock_confdir) { + ast_unlock_path(ast_config_AST_CONFIG_DIR); + } ast_mutex_unlock(&reloadlock); return res; } @@ -695,6 +715,9 @@ int ast_module_reload(const char *name) } AST_LIST_UNLOCK(&module_list); + if (ast_opt_lock_confdir) { + ast_unlock_path(ast_config_AST_CONFIG_DIR); + } ast_mutex_unlock(&reloadlock); return res; |