diff --git a/cli.c b/cli.c index 18aadd871c4a7514d7b5eac76a84b02b42adc037..4f1ce103a61f5ab2a723c137c0f55d3f5dd04ea8 100755 --- a/cli.c +++ b/cli.c @@ -227,19 +227,18 @@ static int handle_unload(int fd, int argc, char *argv[]) return RESULT_SUCCESS; } -#define MODLIST_FORMAT "%-25s %-40.40s %-10d\n" -#define MODLIST_FORMAT2 "%-25s %-40.40s %-10s\n" +#define MODLIST_FORMAT "%-30s %-40.40s %-20.20s %-10d\n" +#define MODLIST_FORMAT2 "%-30s %-40.40s %-20.20s %-10s\n" AST_MUTEX_DEFINE_STATIC(climodentrylock); static int climodentryfd = -1; -static int modlist_modentry(char *module, char *description, int usecnt, char *like) +static int modlist_modentry(const char *module, const char *description, int usecnt, const char *version, const char *like) { /* Comparing the like with the module */ - if ( strstr(module,like) != NULL) { - ast_cli(climodentryfd, MODLIST_FORMAT, module, description, usecnt); + if (strstr(module, like) != NULL) { + ast_cli(climodentryfd, MODLIST_FORMAT, module, description, version, usecnt); return 1; - } return 0; } @@ -385,8 +384,8 @@ static int handle_modlist(int fd, int argc, char *argv[]) ast_mutex_lock(&climodentrylock); climodentryfd = fd; - ast_cli(fd, MODLIST_FORMAT2, "Module", "Description", "Use Count"); - ast_cli(fd,"%d modules loaded\n",ast_update_module_list(modlist_modentry,like)); + ast_cli(fd, MODLIST_FORMAT2, "Module", "Description", "Version", "Use Count"); + ast_cli(fd,"%d modules loaded\n", ast_update_module_list(modlist_modentry, like)); climodentryfd = -1; ast_mutex_unlock(&climodentrylock); return RESULT_SUCCESS; diff --git a/funcs/pbx_functions.c b/funcs/pbx_functions.c index 59925dafd5a85ba539cd881c86be138cac803409..5171c6271bfbe6a08553fc5d411486e286415532 100755 --- a/funcs/pbx_functions.c +++ b/funcs/pbx_functions.c @@ -56,3 +56,8 @@ char *key() { return ASTERISK_GPL_KEY; } + +const char *version() +{ + return "$Revision$"; +} diff --git a/include/asterisk/module.h b/include/asterisk/module.h index f1cc115f1ff3f0e94fa783cb41cc5472ecb27281..c674d16ae6c298309fcf8bb5789feb2376d72389 100755 --- a/include/asterisk/module.h +++ b/include/asterisk/module.h @@ -66,6 +66,8 @@ char *key(void); /*! Return the below mentioned key, unmodified */ */ int reload(void); /*! reload configs */ +const char *version(void); + #define ASTERISK_GPL_KEY \ "This paragraph is Copyright (C) 2000, Linux Support Services, Inc. \ In order for your module to load, it must return this key via a function \ @@ -112,9 +114,10 @@ void ast_update_use_count(void); /*! * \param modentry a callback to an updater function * For each of the modules loaded, modentry will be executed with the resource, description, - * and usecount values of each particular module. + * version, and usecount values of each particular module. */ -int ast_update_module_list(int (*modentry)(char *module, char *description, int usecnt, char *like), char *like); +int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *version, const char *like), + const char *like); /*! Ask this procedure to be run with modules have been updated */ /*! diff --git a/loader.c b/loader.c index 4403652e4d6bc8cc47b6bb655f65e097235b3ea7..6c3f9ef21c52d587948d82447086934ad4ddb37e 100755 --- a/loader.c +++ b/loader.c @@ -51,6 +51,7 @@ struct module { char *(*description)(void); char *(*key)(void); int (*reload)(void); + const char *(*version)(void); void *lib; char resource[256]; struct module *next; @@ -252,6 +253,11 @@ int ast_module_reload(const char *name) return reloaded; } +static const char *unknown_version(void) +{ + return "--unknown--"; +} + static int __load_resource(const char *resource_name, const struct ast_config *cfg) { static char fn[256]; @@ -347,9 +353,17 @@ static int __load_resource(const char *resource_name, const struct ast_config *c ast_log(LOG_WARNING, "No key routine in module %s\n", fn); errors++; } + m->reload = dlsym(m->lib, "reload"); if (m->reload == NULL) m->reload = dlsym(m->lib, "_reload"); + + m->version = dlsym(m->lib, "version"); + if (m->version == NULL) + m->version = dlsym(m->lib, "_version"); + if (m->version == NULL) + m->version = unknown_version; + if (!m->key || !(key = m->key())) { ast_log(LOG_WARNING, "Key routine returned NULL in module %s\n", fn); key = NULL; @@ -549,20 +563,23 @@ void ast_update_use_count(void) } -int ast_update_module_list(int (*modentry)(char *module, char *description, int usecnt, char *like), char *like) +int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *version, const char *like), + const char *like) { struct module *m; int unlock = -1; int total_mod_loaded = 0; + if (ast_mutex_trylock(&modlock)) unlock = 0; m = module_list; - while(m) { - total_mod_loaded += modentry(m->resource, m->description(), m->usecount(), like); + while (m) { + total_mod_loaded += modentry(m->resource, m->description(), m->usecount(), m->version(), like); m = m->next; } if (unlock) ast_mutex_unlock(&modlock); + return total_mod_loaded; }