[commit] r2655 - freeswitch/branches/james/src/mod/languages/mod_mono
Author: james Date: Tue Sep 12 04:58:23 2006 New Revision: 2655 Modified: freeswitch/branches/james/src/mod/languages/mod_mono/Makefile freeswitch/branches/james/src/mod/languages/mod_mono/mod_mono.c Log: Cleaning up, adding error checking, etc before release. Modified: freeswitch/branches/james/src/mod/languages/mod_mono/Makefile ============================================================================== --- freeswitch/branches/james/src/mod/languages/mod_mono/Makefile (original) +++ freeswitch/branches/james/src/mod/languages/mod_mono/Makefile Tue Sep 12 04:58:23 2006 @@ -1,14 +1,22 @@ +VERSION = mono-1.1.13.8 +TARBALL = mono-1.1.13.8.tar.gz CFLAGS += `pkg-config --cflags mono` LDFLAGS += `pkg-config --libs mono` -all: $(MODNAME).so +all: depends $(MODNAME).$(DYNAMIC_LIB_EXTEN) -$(MODNAME).so: $(MODNAME).c +depends: + MAKE=$(MAKE) $(BASE)/build/buildlib.sh $(BASE) install $(TARBALL) --prefix=$(PREFIX) --with-pic + +%.o: %.c + $(CC) -fPIC $(CFLAGS) -c -o $@ $< + +$(MODNAME).$(DYNAMIC_LIB_EXTEN): $(MODNAME).c $(CC) $(CFLAGS) -fPIC -c $(MODNAME).c -o $(MODNAME).o - $(CC) $(SOLINK) -o $(MODNAME).so $(MODNAME).o $(LDFLAGS) + $(LINKER) $(SOLINK) -o $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(MODNAME).o $(LDFLAGS) clean: - rm -fr *.so *.o *~ + rm -fr *.$(DYNAMIC_LIB_EXTEN) *.o *~ install: - cp -f $(MODNAME).so $(PREFIX)/mod + cp -f $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(PREFIX)/mod Modified: freeswitch/branches/james/src/mod/languages/mod_mono/mod_mono.c ============================================================================== --- freeswitch/branches/james/src/mod/languages/mod_mono/mod_mono.c (original) +++ freeswitch/branches/james/src/mod/languages/mod_mono/mod_mono.c Tue Sep 12 04:58:23 2006 @@ -39,27 +39,23 @@ #include <gc/gc.h> #include <switch.h> -#define SWITCH_MONO_MODULES "/usr/local/freeswitch/mod/mono" -#define SWITCH_MONO_ASSEMBLY "Freeswitch.dll" +#define SWITCH_MONO_MODULES "mono/" +#define SWITCH_MONO_LIBDIR "lib/" +#define SWITCH_MONO_ASSEMBLY "Freeswitch.dll" -switch_status_t mod_mono_load_plugins(); -void mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, char *msg); -MonoClass* find_assembly_class(MonoImage *image); +/* Module functions */ +switch_status_t mod_mono_load_modules(const char *module_dir); +MonoClass* mod_mono_find_assembly_class(MonoImage *image); +/* Managed functions */ +void mod_mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, char *msg); + static const char modname[] = "mod_mono"; +static switch_memory_pool_t *mono_pool = NULL; -switch_memory_pool_t *mono_pool; -switch_hash_t *mono_plugins; - static struct { MonoDomain *domain; - MonoObject *object; - MonoImage *image; - MonoClass *class; - MonoAssembly *assembly; - MonoMethod *event; - MonoMethod *api; - MonoMethod *application; + switch_hash_t *plugins; } globals; typedef struct { @@ -72,11 +68,6 @@ /*.module_name */ modname, }; -void mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, char *msg) -{ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, msg); -} - /* * Load mod_mono module and initialise domain * @@ -85,53 +76,89 @@ */ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **interface, char *filename) { - apr_hash_index_t *plugin; - *interface = &mono_module_interface; /* Initialise memory pool */ if (switch_core_new_memory_pool(&mono_pool) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not allocate memory pool\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate memory pool\n"); return SWITCH_STATUS_FALSE; } /* Initialise plugin hash */ - if (switch_core_hash_init(&mono_plugins, mono_pool) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not initialise plugins hash.\n"); + if (switch_core_hash_init(&globals.plugins, mono_pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not initialise plugins hash\n"); return SWITCH_STATUS_FALSE; } - /* Initialise the mono domain */ - if (!(globals.domain = mono_jit_init("freeswitch"))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not initialise mono runtime.\n"); + /* Construct the path to the Freeswitch assembly, then check to make sure it exists */ + switch_size_t assembly_dir_len = strlen(SWITCH_GLOBAL_dirs.base_dir) + strlen(SWITCH_MONO_LIBDIR) + 2; /* Account for / and \0 */ + switch_size_t assembly_file_len = assembly_dir_len + strlen(SWITCH_MONO_ASSEMBLY); + char *assembly_dir = (char *) switch_core_alloc(mono_pool, assembly_dir_len); + char *assembly_file = (char *) switch_core_alloc(mono_pool, assembly_file_len); + + apr_finfo_t *finfo = (apr_finfo_t *) switch_core_alloc(mono_pool, sizeof(*finfo)); + + snprintf(assembly_dir, assembly_dir_len, "%s/%s", SWITCH_GLOBAL_dirs.base_dir, SWITCH_MONO_LIBDIR); + snprintf(assembly_file, assembly_file_len, "%s/%s%s", SWITCH_GLOBAL_dirs.base_dir, SWITCH_MONO_LIBDIR, SWITCH_MONO_ASSEMBLY); + + if (apr_stat(finfo, assembly_file, 0, mono_pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not find Freeswitch.NET assembly"); return SWITCH_STATUS_FALSE; } + + /* Mono wants to know where it will be able to find the Freeswitch assembly if it's not in the GAC */ + if (getenv("MONO_PATH") != NULL) { + switch_size_t mono_path_len = strlen(getenv("MONO_PATH")) + strlen(assembly_dir) + 2; /* Account for : and \0 */ + char *mono_path = (char *) switch_core_alloc(mono_pool, mono_path_len); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Initialised mono runtime.\n"); + snprintf(mono_path, mono_path_len, "%s:%s", getenv("MONO_PATH"), assembly_dir); + + setenv("MONO_PATH", mono_path, 1); + } + else + setenv("MONO_PATH", assembly_dir, 1); + + /* Now find where our managed modules are */ + switch_size_t module_dir_len = strlen(SWITCH_GLOBAL_dirs.mod_dir) + strlen(SWITCH_MONO_MODULES) + 2; /* Account for / and \0 */ + char *module_dir = (char *) switch_core_alloc(mono_pool, module_dir_len); + + snprintf(module_dir, module_dir_len, "%s/%s", SWITCH_GLOBAL_dirs.mod_dir, SWITCH_MONO_MODULES); - /* Load our plugins */ - if (mod_mono_load_plugins() != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error loading plugins.\n"); + /* Initialise the mono domain */ + if (!(globals.domain = mono_jit_init("freeswitch"))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error initialising mono runtime\n"); return SWITCH_STATUS_FALSE; } - for (plugin = switch_hash_first(mono_pool, mono_plugins); plugin; plugin = switch_hash_next(plugin)) { - mono_plugin *p = (mono_plugin *)switch_core_alloc(mono_pool, sizeof(*p)); - apr_ssize_t *key_length = NULL; - const void *k; - void *v; + /* Let user know everything initialised fine */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Initialised mono runtime\n"); - switch_hash_this(plugin, &k, key_length, &v); - p = (mono_plugin *)v; + /* Load our modules */ + if (mod_mono_load_modules(module_dir) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error loading modules\n"); + return SWITCH_STATUS_FALSE; + } + + /* Finally, go through and initialise each plugin before returning SUCCESS */ + switch_hash_index_t *p = NULL; + + for (p = switch_hash_first(mono_pool, globals.plugins); p; p = switch_hash_next(p)) { + mono_plugin *plugin = (mono_plugin *) switch_core_alloc(mono_pool, sizeof(*plugin)); + switch_size_t *key_length = NULL; + const void *key = NULL; + void *value = NULL; + + switch_hash_this(p, &key, key_length, &value); + plugin = (mono_plugin *) value; - mono_runtime_object_init(p->object); + mono_runtime_object_init(plugin->object); } return SWITCH_STATUS_SUCCESS; } /* - * Function for cleaning shutting down mod_mono + * Function for cleanly shutting down mod_mono * */ SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void) @@ -146,39 +173,38 @@ } /* - * This function will load the managed portion of mod_mono. + * This function will load the managed modules + * */ -switch_status_t mod_mono_load_plugins() +switch_status_t mod_mono_load_modules(const char *module_dir) { + apr_dir_t *module_dir_handle; char *file; size_t len; char *ptr; apr_finfo_t finfo; - apr_dir_t *module_dir_handle; apr_int32_t finfo_flags = APR_FINFO_DIRENT | APR_FINFO_TYPE | APR_FINFO_NAME; const char *ext = ".dll"; const char *EXT = ".DLL"; - apr_pool_t *mp; - apr_pool_create(&mp, NULL); MonoAssembly *assembly; MonoImage *image; gpointer iter; iter=NULL; mono_plugin *plugin=NULL; - if (apr_dir_open(&module_dir_handle, SWITCH_MONO_MODULES, mp) != APR_SUCCESS) - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not open directory: %s\n", SWITCH_MONO_MODULES); + if (apr_dir_open(&module_dir_handle, module_dir, mono_pool) != SWITCH_STATUS_SUCCESS) + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Could not open directory: %s\n", module_dir); /* Read the modules directory */ - while (apr_dir_read(&finfo, finfo_flags, module_dir_handle) == APR_SUCCESS) + while (apr_dir_read(&finfo, finfo_flags, module_dir_handle) == SWITCH_STATUS_SUCCESS) { - assembly = (MonoAssembly *)switch_core_alloc(mono_pool, sizeof(assembly)); - image = (MonoImage *)switch_core_alloc(mono_pool, sizeof(image)); + assembly = (MonoAssembly *) switch_core_alloc(mono_pool, sizeof(assembly)); + image = (MonoImage *) switch_core_alloc(mono_pool, sizeof(image)); const char *fname = finfo.fname; if (finfo.filetype != APR_REG) continue; - + if (!fname) fname = finfo.name; @@ -188,9 +214,9 @@ if (!strstr(fname, ext) && !strstr(fname, EXT)) continue; - len = strlen(SWITCH_MONO_MODULES) + strlen(fname) + 3; + len = strlen(module_dir) + strlen(fname) + 2; file = (char *)switch_core_alloc(mono_pool, len); - snprintf(file, len, "%s/%s", SWITCH_MONO_MODULES, fname); + snprintf(file, len, "%s%s", module_dir, fname); /* Attempt to open the assembly */ assembly = mono_domain_assembly_open(globals.domain, file); @@ -206,21 +232,24 @@ plugin = (mono_plugin *)switch_core_alloc(mono_pool, sizeof(*plugin)); plugin->assembly = assembly; - plugin->class = find_assembly_class(mono_assembly_get_image(plugin->assembly)); + plugin->class = mod_mono_find_assembly_class(mono_assembly_get_image(plugin->assembly)); if (!plugin->class) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No plugin class\n"); plugin->object = mono_object_new(globals.domain, plugin->class); - switch_core_hash_insert(mono_plugins, (char *) mono_image_get_name(mono_assembly_get_image(assembly)), plugin); + switch_core_hash_insert(globals.plugins, (char *) mono_image_get_name(mono_assembly_get_image(assembly)), plugin); plugin = NULL; } return SWITCH_STATUS_SUCCESS; } -MonoClass* find_assembly_class(MonoImage *image) +/* + * + */ +MonoClass* mod_mono_find_assembly_class(MonoImage *image) { MonoClass *class, *parent_class = NULL; int i, total; @@ -238,4 +267,12 @@ } return NULL; +} + +/* + * + */ +void mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, char *msg) +{ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, msg); }
participants (1)
-
Freeswitch SVN