Skip to content
Snippets Groups Projects
Commit 11d00cac authored by Olle Johansson's avatar Olle Johansson
Browse files

Adding dialplan function IFMODULE, so you can create dialplans that handle

various PBX installations and checks if a module is loaded before using
it.
	example IFMODULE(chan_sip3.so)

issue #6671 in the bug tracker, finally gone. Thanks to mithraen for keeping
it updated.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@46513 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 79e45105
No related branches found
No related tags found
No related merge requests found
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2006, Digium, Inc.
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief Simple module check function
* \author Olle E. Johansson, Edvina.net
*/
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/logger.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/module.h"
static int ifmodule_read(struct ast_channel *chan, char *cmd, char *data,
char *buf, size_t len)
{
char *ret = "0";
*buf = '\0';
if (data)
if (ast_module_check(data))
ret = "1";
ast_copy_string(buf, ret, len);
return 0;
}
static struct ast_custom_function ifmodule_function = {
.name = "IFMODULE",
.synopsis = "Checks if an Asterisk module is loaded in memory",
.syntax = "IFMODULE(<modulename.so>)",
.read = ifmodule_read,
.desc = "Checks if a module is loaded. Use the full module name\n"
"as shown by the list in \"show modules\". \n"
"Returns \"1\" if module exists in memory, otherwise \"0\".\n",
};
static int unload_module(void)
{
return ast_custom_function_unregister(&ifmodule_function);
}
static int load_module(void)
{
return ast_custom_function_register(&ifmodule_function);
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Checks if Asterisk module is loaded in memory");
...@@ -113,6 +113,13 @@ void ast_update_use_count(void); ...@@ -113,6 +113,13 @@ void ast_update_use_count(void);
int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *like), int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *like),
const char *like); const char *like);
/*!
* \brief Check if module with the name given is loaded
* \param name Module name, like "chan_sip.so"
* \return 0 if false, 1 if true
*/
int ast_module_check(char *name);
/*! /*!
* \brief Add a procedure to be run when modules have been updated. * \brief Add a procedure to be run when modules have been updated.
* \param updater The function to run when modules have been updated. * \param updater The function to run when modules have been updated.
......
...@@ -871,6 +871,26 @@ int ast_update_module_list(int (*modentry)(const char *module, const char *descr ...@@ -871,6 +871,26 @@ int ast_update_module_list(int (*modentry)(const char *module, const char *descr
return total_mod_loaded; return total_mod_loaded;
} }
int ast_module_check(char *name)
{
struct ast_module *cur;
int unlock = -1;
int res = 0;
if (ast_strlen_zero(name))
return 0; /* FALSE */
if (ast_mutex_trylock(&module_list.lock))
unlock = 0;
AST_LIST_TRAVERSE(&module_list, cur, entry)
if (!res && !strcasecmp(name, cur->resource))
res = 1;
if (unlock)
AST_LIST_UNLOCK(&module_list);
return res;
}
int ast_loader_register(int (*v)(void)) int ast_loader_register(int (*v)(void))
{ {
struct loadupdate *tmp; struct loadupdate *tmp;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment