add support for 'early loading' modules, so that nearly all configuration files can...
authorKevin P. Fleming <kpfleming@digium.com>
Tue, 5 Jul 2005 22:11:43 +0000 (22:11 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Tue, 5 Jul 2005 22:11:43 +0000 (22:11 +0000)
add warning for when file mapping is found but the engine is not available
add warning for trying to map 'logger.conf', since it cannot be reliably mapped

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6034 65c4cc65-6c06-0410-ace0-fbb531ad65f3

asterisk.c
config.c
configs/extconfig.conf.sample
configs/modules.conf.sample
include/asterisk.h
loader.c

index e3daa1f..249931e 100755 (executable)
@@ -2081,6 +2081,11 @@ int main(int argc, char *argv[])
                printf(term_quit());
                exit(1);
        }
+       /* load 'preload' modules, required for access to Realtime-mapped configuration files */
+       if (load_modules(1)) {
+               printf(term_quit());
+               exit(1);
+       }
        ast_channels_init();
        if (init_manager()) {
                printf(term_quit());
@@ -2103,7 +2108,7 @@ int main(int argc, char *argv[])
                printf(term_quit());
                exit(1);
        }
-       if (load_modules()) {
+       if (load_modules(0)) {
                printf(term_quit());
                exit(1);
        }
index dcb5c44..cef3d61 100755 (executable)
--- a/config.c
+++ b/config.c
@@ -787,8 +787,18 @@ void read_config_maps(void)
                database = strsep(&stringp, ",");
                table = strsep(&stringp, ",");
                        
-               if (!strcmp(v->name, extconfig_conf) || !strcmp(v->name, "asterisk.conf")) {
-                       ast_log(LOG_WARNING, "Cannot bind asterisk.conf or extconfig.conf!\n");
+               if (!strcmp(v->name, extconfig_conf)) {
+                       ast_log(LOG_WARNING, "Cannot bind '%s'!\n", extconfig_conf);
+                       continue;
+               }
+
+               if (!strcmp(v->name, "asterisk.conf")) {
+                       ast_log(LOG_WARNING, "Cannot bind 'asterisk.conf'!\n");
+                       continue;
+               }
+
+               if (!strcmp(v->name, "logger.conf")) {
+                       ast_log(LOG_WARNING, "Cannot bind 'logger.conf'!\n");
                        continue;
                }
 
index 56ca2d1..1cf923f 100755 (executable)
 ;uncomment to load queues.conf via the odbc engine.
 ;
 ;queues.conf => odbc,asterisk,ast_config
-
+;
+; The following files CANNOT be loaded from Realtime storage:
+;      asterisk.conf
+;      extconfig.conf (this file)
+;      logger.conf
+;
+; Additionally, the following files cannot be loaded from
+; Realtime storage unless the storage driver is loaded
+; early using 'preload' statements in modules.conf:
+;      manager.conf
+;      cdr.conf
+;      rtp.conf
+;
 ;
 ; Realtime configuration engine
 ;
index 8dcee35..7162b72 100755 (executable)
@@ -7,6 +7,16 @@
 [modules]
 autoload=yes
 ;
+; Any modules that need to be loaded before the Asterisk core has been initialized
+; (just after the logger has been initialized) can be loaded using 'preload'. This
+; will frequently be needed if you wish to map all module configuration files into
+; Realtime storage, since the Realtime driver will need to be loaded before the
+; modules using those configuration files are initialized.
+;
+; An example of loading ODBC support would be:
+;preload => res_odbc.so
+;preload => res_config_odbc.so
+;
 ; If you want, load the GTK console right away.  
 ; Don't load the KDE console since
 ; it's not as sophisticated right now.
index 3b6f565..afba160 100755 (executable)
@@ -34,7 +34,7 @@ extern char ast_config_AST_SOCKET[AST_CONFIG_MAX_PATH];
 extern char ast_config_AST_RUN_DIR[AST_CONFIG_MAX_PATH];
 
 /* Provided by module.c */
-extern int load_modules(void);
+extern int load_modules(const int preload_only);
 /* Provided by pbx.c */
 extern int load_pbx(void);
 /* Provided by logger.c */
index 012491c..ec85851 100755 (executable)
--- a/loader.c
+++ b/loader.c
@@ -450,35 +450,53 @@ static const char *loadorder[] =
        NULL,
 };
 
-int load_modules()
+int load_modules(const int preload_only)
 {
        struct ast_config *cfg;
        struct ast_variable *v;
        char tmp[80];
-       if (option_verbose) 
-               ast_verbose( "Asterisk Dynamic Loader Starting:\n");
+
+       if (option_verbose) {
+               if (preload_only)
+                       ast_verbose("Asterisk Dynamic Loader loading preload modules:\n");
+               else
+                       ast_verbose("Asterisk Dynamic Loader Starting:\n");
+       }
+
        cfg = ast_config_load(AST_MODULE_CONFIG);
        if (cfg) {
+               int doload;
+
                /* Load explicitly defined modules */
-               v = ast_variable_browse(cfg, "modules");
-               while(v) {
-                       if (!strcasecmp(v->name, "load")) {
+               for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) {
+                       doload = 0;
+
+                       if (preload_only)
+                               doload = !strcasecmp(v->name, "preload");
+                       else
+                               doload = !strcasecmp(v->name, "load");
+
+                      if (doload) {
                                if (option_debug && !option_verbose)
                                        ast_log(LOG_DEBUG, "Loading module %s\n", v->value);
                                if (option_verbose) {
-                                       ast_verbose( VERBOSE_PREFIX_1 "[%s]", term_color(tmp, v->value, COLOR_BRWHITE, 0, sizeof(tmp)));
+                                       ast_verbose(VERBOSE_PREFIX_1 "[%s]", term_color(tmp, v->value, COLOR_BRWHITE, 0, sizeof(tmp)));
                                        fflush(stdout);
                                }
                                if (__load_resource(v->value, cfg)) {
                                        ast_log(LOG_WARNING, "Loading module %s failed!\n", v->value);
-                                       if (cfg)
-                                               ast_config_destroy(cfg);
+                                       ast_config_destroy(cfg);
                                        return -1;
                                }
                        }
-                       v=v->next;
                }
        }
+
+       if (preload_only) {
+               ast_config_destroy(cfg);
+               return 0;
+       }
+
        if (!cfg || ast_true(ast_variable_retrieve(cfg, "modules", "autoload"))) {
                /* Load all modules */
                DIR *mods;