From 8190e96fad6481eed053dc724ce5d8fbb89d8ad1 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher <tilghman@meg.abyt.es> Date: Thu, 2 Sep 2010 05:27:53 +0000 Subject: [PATCH] Merged revisions 284610 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r284610 | tilghman | 2010-09-02 00:20:59 -0500 (Thu, 02 Sep 2010) | 10 lines When optional_api is non-optional, force dependent modules to be loaded. (closes issue #17707) Reported by: ira Patches: 20100819__issue17707__asterisk1.8.diff.txt uploaded by tilghman (license 14) Tested by: tilghman Review: https://reviewboard.asterisk.org/r/876/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@284628 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_adsiprog.c | 6 +++++- apps/app_followme.c | 1 - apps/app_getcpeid.c | 6 +++++- apps/app_queue.c | 3 ++- apps/app_speech_utils.c | 6 +++++- apps/app_stack.c | 6 +++++- apps/app_voicemail.c | 4 +++- channels/chan_agent.c | 2 ++ channels/chan_dahdi.c | 3 ++- channels/chan_iax2.c | 1 + channels/chan_mgcp.c | 3 ++- channels/chan_sip.c | 2 ++ funcs/func_aes.c | 6 +++++- include/asterisk/module.h | 5 +++++ main/loader.c | 20 ++++++++++++++++++++ pbx/pbx_dundi.c | 1 + pbx/pbx_loopback.c | 1 - pbx/pbx_realtime.c | 1 - 18 files changed, 65 insertions(+), 12 deletions(-) diff --git a/apps/app_adsiprog.c b/apps/app_adsiprog.c index 8af1473d1e..c138f04296 100644 --- a/apps/app_adsiprog.c +++ b/apps/app_adsiprog.c @@ -1591,4 +1591,8 @@ static int load_module(void) return AST_MODULE_LOAD_SUCCESS; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Asterisk ADSI Programming Application"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Asterisk ADSI Programming Application", + .load = load_module, + .unload = unload_module, + .nonoptreq = "res_adsi", + ); diff --git a/apps/app_followme.c b/apps/app_followme.c index fcab992d39..b17d5252bb 100644 --- a/apps/app_followme.c +++ b/apps/app_followme.c @@ -51,7 +51,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/cli.h" #include "asterisk/manager.h" #include "asterisk/config.h" -#include "asterisk/monitor.h" #include "asterisk/utils.h" #include "asterisk/causes.h" #include "asterisk/astdb.h" diff --git a/apps/app_getcpeid.c b/apps/app_getcpeid.c index 93df1623ad..2207081568 100644 --- a/apps/app_getcpeid.c +++ b/apps/app_getcpeid.c @@ -132,4 +132,8 @@ static int load_module(void) return ast_register_application_xml(app, cpeid_exec); } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Get ADSI CPE ID"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Get ADSI CPE ID", + .load = load_module, + .unload = unload_module, + .nonoptreq = "res_adsi", + ); diff --git a/apps/app_queue.c b/apps/app_queue.c index ccdee7fb31..08167b4630 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -57,7 +57,7 @@ */ /*** MODULEINFO - <depend>res_monitor</depend> + <use>res_monitor</use> ***/ #include "asterisk.h" @@ -8197,5 +8197,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "True Call Queueing", .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_DEVSTATE_CONSUMER, + .nonoptreq = "res_monitor", ); diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c index 60af43640e..0323f7c471 100644 --- a/apps/app_speech_utils.c +++ b/apps/app_speech_utils.c @@ -955,4 +955,8 @@ static int load_module(void) return res; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Dialplan Speech Applications"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Dialplan Speech Applications", + .load = load_module, + .unload = unload_module, + .nonoptreq = "res_speech", + ); diff --git a/apps/app_stack.c b/apps/app_stack.c index dcf13a00df..29c37a20b0 100644 --- a/apps/app_stack.c +++ b/apps/app_stack.c @@ -704,4 +704,8 @@ static int load_module(void) return 0; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Dialplan subroutines (Gosub, Return, etc)"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Dialplan subroutines (Gosub, Return, etc)", + .load = load_module, + .unload = unload_module, + .nonoptreq = "res_agi", + ); diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 4ff67e3714..5b050e99df 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -38,7 +38,8 @@ */ /*** MODULEINFO - <depend>res_smdi</depend> + <use>res_adsi</use> + <use>res_smdi</use> ***/ /*** MAKEOPTS @@ -13085,4 +13086,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, tdesc, .load = load_module, .unload = unload_module, .reload = reload, + .nonoptreq = "res_adsi,res_smdi", ); diff --git a/channels/chan_agent.c b/channels/chan_agent.c index b8e142d046..37a6688d79 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -32,6 +32,7 @@ */ /*** MODULEINFO <depend>chan_local</depend> + <depend>res_monitor</depend> ***/ #include "asterisk.h" @@ -2484,4 +2485,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Agent Proxy Channel", .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .nonoptreq = "res_monitor,chan_local", ); diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 14c43f8fac..25246cd566 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -38,7 +38,7 @@ */ /*** MODULEINFO - <depend>res_smdi</depend> + <use>res_smdi</use> <depend>dahdi</depend> <depend>tonezone</depend> <use>pri</use> @@ -17941,4 +17941,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, tdesc, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .nonoptreq = "res_smdi", ); diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index f038f205e3..90ae4eef53 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -14620,4 +14620,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Inter Asterisk eXchan .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .nonoptreq = "res_crypto", ); diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index a787eab720..2f953a9ae5 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -30,7 +30,7 @@ */ /*** MODULEINFO - <depend>res_pktccops</depend> + <use>res_pktccops</use> ***/ #include "asterisk.h" @@ -4915,4 +4915,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Media Gateway Control .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .nonoptreq = "res_pktccops", ); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 09531f2ad8..432adedfe2 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -162,6 +162,7 @@ */ /*** MODULEINFO + <depend>res_crypto</depend> <depend>chan_local</depend> ***/ @@ -28623,4 +28624,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Session Initiation Pr .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .nonoptreq = "res_crypto,chan_local", ); diff --git a/funcs/func_aes.c b/funcs/func_aes.c index 21ee244ab9..7cc8f4d575 100644 --- a/funcs/func_aes.c +++ b/funcs/func_aes.c @@ -163,4 +163,8 @@ static int load_module(void) return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "AES dialplan functions"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "AES dialplan functions", + .load = load_module, + .unload = unload_module, + .nonoptreq = "res_crypto", + ); diff --git a/include/asterisk/module.h b/include/asterisk/module.h index 24f66fc369..aaa8cbef32 100644 --- a/include/asterisk/module.h +++ b/include/asterisk/module.h @@ -242,6 +242,11 @@ struct ast_module_info { * this value will never be read and the module will be given the lowest possible priority * on load. */ unsigned char load_pri; + + /*! Modules which should be loaded first, in comma-separated string format. + * These are only required for loading, when the optional_api header file + * detects that the compiler does not support the optional API featureset. */ + const char *nonoptreq; }; void ast_module_register(const struct ast_module_info *); diff --git a/main/loader.c b/main/loader.c index 17bb1f8211..dea236b052 100644 --- a/main/loader.c +++ b/main/loader.c @@ -414,6 +414,26 @@ static struct ast_module *load_dynamic_module(const char *resource_in, unsigned return NULL; } + /* This section is a workaround for a gcc 4.1 bug that has already been + * fixed in later versions. Unfortunately, some distributions, such as + * RHEL/CentOS 5, distribute gcc 4.1, so we're stuck with having to deal + * with this issue. This basically ensures that optional_api modules are + * loaded before any module which requires their functionality. */ +#if !defined(HAVE_ATTRIBUTE_weak_import) && !defined(HAVE_ATTRIBUTE_weakref) + if (!ast_strlen_zero(mod->info->nonoptreq)) { + /* Force any required dependencies to load */ + char *each, *required_resource = ast_strdupa(mod->info->nonoptreq); + while ((each = strsep(&required_resource, ","))) { + each = ast_strip(each); + + /* Is it already loaded? */ + if (!find_resource(each, 0)) { + load_dynamic_module(each, global_symbols_only); + } + } + } +#endif + while (!dlclose(lib)); resource_being_loaded = NULL; diff --git a/pbx/pbx_dundi.c b/pbx/pbx_dundi.c index aaa30da0cb..ef482df2c9 100644 --- a/pbx/pbx_dundi.c +++ b/pbx/pbx_dundi.c @@ -4880,5 +4880,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Distributed Universal Nu .load = load_module, .unload = unload_module, .reload = reload, + .nonoptreq = "res_crypto", ); diff --git a/pbx/pbx_loopback.c b/pbx/pbx_loopback.c index f51ec8204d..9ab146398d 100644 --- a/pbx/pbx_loopback.c +++ b/pbx/pbx_loopback.c @@ -41,7 +41,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/sched.h" #include "asterisk/io.h" #include "asterisk/utils.h" -#include "asterisk/crypto.h" #include "asterisk/astdb.h" diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index 2697ea0d28..f183c867b0 100644 --- a/pbx/pbx_realtime.c +++ b/pbx/pbx_realtime.c @@ -46,7 +46,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/sched.h" #include "asterisk/io.h" #include "asterisk/utils.h" -#include "asterisk/crypto.h" #include "asterisk/astdb.h" #include "asterisk/app.h" #include "asterisk/astobj2.h" -- GitLab