aboutsummaryrefslogtreecommitdiffstats
path: root/main/loader.c
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-01-27 18:29:49 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-01-27 18:29:49 +0000
commitdd43b1905e4c4177b84bac51e4f0d02538cbf0ae (patch)
tree2f8be97f4da2d33e2bcaa8caddcb6f0037931465 /main/loader.c
parent182dc0d6c4e61c3edbfd836c7a03e17956f9fb9b (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.c23
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;