]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 17 Mar 2007 19:51:08 +0000 (19:51 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 17 Mar 2007 19:51:08 +0000 (19:51 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4632 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch.h
src/include/switch_loadable_module.h
src/include/switch_types.h
src/mod/applications/mod_commands/mod_commands.c
src/switch_loadable_module.c

index 2d8936fdf2dab9002b8da0285589b0f97bf58d7f..201e5c815b4ff9a13a2ea47abe1afba52403302b 100644 (file)
@@ -48,7 +48,7 @@
 #endif
 
 #define FREESWITCH_PEN "27880"
-#define FREESWITCH_MIB ".1.3.6.1.4.1." FREESWITCH_PEN
+#define FREESWITCH_OID_PREFIX ".1.3.6.1.4.1." FREESWITCH_PEN
 #define FREESWITCH_ITAD "543"
 
 
index e66b35c65a479a990a26c5e6706789e03c81ea44..2766136224ed1d7bdb15c73c995e5c056b1cee07 100644 (file)
@@ -240,7 +240,7 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_
   \param fname the file name of the module
   \return the status
 */
-SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname);
+SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname, switch_bool_t runtime);
 
 /* Prototypes of module interface functions */
 
index 14fecdd7b9c31bf3b3dcddc333cd42eef9eb8e61..f0fc506b76fed4bd3a547327204e5745c2feafc8 100644 (file)
@@ -128,6 +128,11 @@ SWITCH_BEGIN_EXTERN_C
 #define SWITCH_BITS_PER_BYTE 8
 typedef uint8_t switch_byte_t;
 
+typedef enum {
+       SWITCH_FALSE = 0,
+       SWITCH_TRUE = 1
+} switch_bool_t;
+
 typedef enum {
        SSM_NA,
        SSM_PRONOUNCED,
index c37b1775c138e5ea654d4560911226cc605ab838..5e47fa2c85d3f47f5eaf8b7be67c40bddccbbf6f 100644 (file)
@@ -158,8 +158,11 @@ static switch_status_t load_function(char *mod, switch_core_session_t *session,
                return SWITCH_STATUS_SUCCESS;
        }
 
-       switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) mod);
-       stream->write_function(stream, "OK\n");
+       if (switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) mod, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) {
+               stream->write_function(stream, "OK\n");
+       } else {
+               stream->write_function(stream, "ERROR\n");
+       }
 
        return SWITCH_STATUS_SUCCESS;
 }
index e374ac56d2b408fd9fb3b34f21bd23b519b7bca7..14339402d7d182450816a9b5774e588aa4c46368 100644 (file)
@@ -96,8 +96,22 @@ static void *switch_loadable_module_exec(switch_thread_t *thread, void *obj)
 }
 
 
+static void switch_loadable_module_runtime(void)
+{
+       switch_hash_index_t *hi;
+       void *val;
+       switch_loadable_module_t *module;
 
-
+       for (hi = switch_hash_first(loadable_modules.pool, loadable_modules.module_hash); hi; hi = switch_hash_next(hi)) {
+               switch_hash_this(hi, NULL, NULL, &val);
+               module = (switch_loadable_module_t *) val;
+               
+               if (module->switch_module_runtime) {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Starting runtime thread for %s\n", module->module_interface->module_name);
+                       switch_core_launch_thread(switch_loadable_module_exec, module, loadable_modules.pool);
+               }
+       }
+}
 
 static switch_status_t switch_loadable_module_process(char *key, switch_loadable_module_t *new_module)
 {
@@ -349,13 +363,20 @@ static switch_status_t switch_loadable_module_process(char *key, switch_loadable
                        if (!ptr->relative_oid) {
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to load management interface from %s due to no interface name.\n", key);
                        } else {
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Adding Management interface '%s'\n", ptr->relative_oid);
-                               if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS) {
-                                       switch_event_add_header(event, SWITCH_STACK_BOTTOM, "type", "management");
-                                       switch_event_add_header(event, SWITCH_STACK_BOTTOM, "name", "%s", ptr->relative_oid);
-                                       switch_event_fire(&event);
+                               if (switch_core_hash_find(loadable_modules.management_hash, ptr->relative_oid)) {
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
+                                                                         "Failed to load management interface %s. OID %s already exists\n", key, ptr->relative_oid);
+                               } else {
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, 
+                                                                         "Adding Management interface '%s' OID[%s.%s]\n", key, FREESWITCH_OID_PREFIX, ptr->relative_oid);
+                                       switch_core_hash_insert(loadable_modules.management_hash, ptr->relative_oid, (const void *) ptr);
+                                       if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS) {
+                                               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "type", "management");
+                                               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "name", "%s", ptr->relative_oid);
+                                               switch_event_fire(&event);
+                                       }
                                }
-                               switch_core_hash_insert(loadable_modules.management_hash, ptr->relative_oid, (const void *) ptr);
+                               
                        }
                }
        }
@@ -429,10 +450,6 @@ static switch_status_t switch_loadable_module_load_file(char *filename, switch_l
 
        module->lib = dso;
 
-       if (module->switch_module_runtime) {
-               switch_core_launch_thread(switch_loadable_module_exec, module, loadable_modules.pool);
-       }
-
        *new_module = module;
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Successfully Loaded [%s]\n", module_interface->module_name);
 
@@ -440,7 +457,7 @@ static switch_status_t switch_loadable_module_load_file(char *filename, switch_l
 
 }
 
-SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname)
+SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname, switch_bool_t runtime)
 {
        switch_size_t len = 0;
        char *path;
@@ -485,10 +502,15 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, ch
     }
 
        if ((status = switch_loadable_module_load_file(path, &new_module) == SWITCH_STATUS_SUCCESS)) {
-               return switch_loadable_module_process((char *) file, new_module);
-       } else {
-               return status;
+               if ((status = switch_loadable_module_process((char *) file, new_module)) == SWITCH_STATUS_SUCCESS && runtime) {
+                       if (new_module->switch_module_runtime) {
+                               switch_core_launch_thread(switch_loadable_module_exec, new_module, loadable_modules.pool);
+                       }
+               }
        }
+
+       return status;
+       
 }
 
 SWITCH_DECLARE(switch_status_t) switch_loadable_module_build_dynamic(char *filename,
@@ -625,7 +647,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init()
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid extension for %s\n", val);
                                        continue;
                                }
-                               switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val);
+                               switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val, SWITCH_FALSE);
                                count++;
                        }
                }
@@ -645,7 +667,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init()
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid extension for %s\n", val);
                                        continue;
                                }
-                               switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val);
+                               switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val, SWITCH_FALSE);
                                count++;
                        }
                }
@@ -685,11 +707,12 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init()
                                continue;
                        }
 
-                       switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) fname);
+                       switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) fname, SWITCH_FALSE);
                }
                apr_dir_close(module_dir_handle);
        }
 
+       switch_loadable_module_runtime();
 
        return SWITCH_STATUS_SUCCESS;
 }