diff options
96 files changed, 817 insertions, 904 deletions
diff --git a/addons/cdr_mysql.c b/addons/cdr_mysql.c index 00c75dd68..2fefe4ed1 100644 --- a/addons/cdr_mysql.c +++ b/addons/cdr_mysql.c @@ -724,4 +724,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "MySQL CDR Backend", .load = load_module, .unload = unload_module, .reload = reload, + .requires = "cdr", ); diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c index 278c5876f..ffdbf6721 100644 --- a/addons/chan_ooh323.c +++ b/addons/chan_ooh323.c @@ -5243,5 +5243,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Objective Systems H32 .load = load_module, .unload = unload_module, .reload = reload_module, - .load_pri = AST_MODPRI_CHANNEL_DRIVER + .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .requires = "udptl", ); diff --git a/addons/res_config_mysql.c b/addons/res_config_mysql.c index ae4348500..edd938506 100644 --- a/addons/res_config_mysql.c +++ b/addons/res_config_mysql.c @@ -1559,4 +1559,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "MySQL RealTime Config .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_REALTIME_DRIVER, + .requires = "extconfig", ); diff --git a/apps/app_celgenuserevent.c b/apps/app_celgenuserevent.c index 67c7fbcbd..11b11b07c 100644 --- a/apps/app_celgenuserevent.c +++ b/apps/app_celgenuserevent.c @@ -103,4 +103,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Generate an User-Defined .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, + .requires = "cel", ); diff --git a/apps/app_dial.c b/apps/app_dial.c index 257ff472a..3d16fb6a1 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -1605,6 +1605,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, break; } break; + case AST_FRAME_VIDEO: case AST_FRAME_VOICE: case AST_FRAME_IMAGE: if (caller_entertained) { @@ -1703,6 +1704,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, ast_log(LOG_WARNING, "Unable to send URL\n"); } break; + case AST_FRAME_VIDEO: case AST_FRAME_VOICE: case AST_FRAME_IMAGE: if (!single || caller_entertained) { @@ -3378,4 +3380,9 @@ static int load_module(void) return res; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Dialing Application"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Dialing Application", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .requires = "ccss", +); diff --git a/apps/app_forkcdr.c b/apps/app_forkcdr.c index 73963f3e1..25b56cb5a 100644 --- a/apps/app_forkcdr.c +++ b/apps/app_forkcdr.c @@ -215,4 +215,9 @@ static int load_module(void) return AST_MODULE_LOAD_SUCCESS; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Fork The CDR into 2 separate entities"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Fork The CDR into 2 separate entities", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .requires = "cdr", +); diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 82fa3b341..c4df4dcbb 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -63,7 +63,6 @@ </member> <member name="ODBC_STORAGE" displayname="Storage of Voicemail using ODBC"> <depend>generic_odbc</depend> - <depend>ltdl</depend> <conflict>IMAP_STORAGE</conflict> <conflict>FILE_STORAGE</conflict> <defaultenabled>no</defaultenabled> @@ -7872,7 +7871,8 @@ static int get_folder2(struct ast_channel *chan, char *fn, int start) ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", '#', '#'); return '#'; } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", res, res); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(res) ? res : '?', isprint(res) ? res : '?'); return res; } @@ -8035,7 +8035,8 @@ static int vm_forwardoptions(struct ast_channel *chan, struct ast_vm_user *vmu, if (retries > 3) { cmd = '*'; /* Let's cancel this beast */ } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); } } @@ -8263,7 +8264,8 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st cmd = 't'; done = 1; } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); } } if (cmd < 0 || cmd == 't') @@ -8928,7 +8930,8 @@ static int play_message(struct ast_channel *chan, struct ast_vm_user *vmu, struc ast_log(AST_LOG_WARNING, "Playback of message %s failed\n", vms->fn); res = 0; } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", res, res); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(res) ? res : '?', isprint(res) ? res : '?'); } DISPOSE(vms->curdir, vms->curmsg); return res; @@ -10783,7 +10786,8 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct if (retries > 3) { cmd = 't'; } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); } } if (cmd == 't') @@ -10863,7 +10867,8 @@ static int vm_tempgreeting(struct ast_channel *chan, struct ast_vm_user *vmu, st if (retries > 3) { cmd = 't'; } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); } } DISPOSE(prefile, -1); @@ -11685,7 +11690,8 @@ static int vm_execmain(struct ast_channel *chan, const char *data) } else { cmd = vm_intro(chan, vmu, &vms); } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); vms.repeats = 0; vms.starting = 1; @@ -11705,7 +11711,8 @@ static int vm_execmain(struct ast_channel *chan, const char *data) adsi_folders(chan, 0, "Change to folder..."); cmd = get_folder2(chan, "vm-changeto", 0); - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); if (cmd == '#') { cmd = 0; } else if (cmd > 0) { @@ -11837,7 +11844,8 @@ static int vm_execmain(struct ast_channel *chan, const char *data) if (vms.repeats > 3) { cmd = 't'; } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); } } if (cmd == 't') { @@ -12015,7 +12023,8 @@ static int vm_execmain(struct ast_channel *chan, const char *data) if (useadsi) adsi_folders(chan, 1, "Save to folder..."); cmd = get_folder2(chan, "vm-savefolder", 1); - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); box = 0; /* Shut up compiler */ if (cmd == '#') { cmd = 0; @@ -15181,7 +15190,8 @@ static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, else cmd = 't'; } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", cmd, cmd); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(cmd) ? cmd : '?', isprint(cmd) ? cmd : '?'); } if (retries >= 3) { return 0; @@ -15346,7 +15356,8 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s res = 't'; } } - ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", res, res); + ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", + isprint(res) ? res : '?', isprint(res) ? res : '?'); break; } diff --git a/build_tools/menuselect-deps.in b/build_tools/menuselect-deps.in index afea01f59..e62c183b7 100644 --- a/build_tools/menuselect-deps.in +++ b/build_tools/menuselect-deps.in @@ -34,7 +34,6 @@ LIBEDIT=@PBX_LIBEDIT@ LIBXML2=@PBX_LIBXML2@ XMLSTARLET=@PBX_XMLSTARLET@ BASH=@PBX_BASH@ -LTDL=@PBX_LTDL@ LUA=@PBX_LUA@ MISDN=@PBX_MISDN@ MYSQLCLIENT=@PBX_MYSQLCLIENT@ diff --git a/cdr/cdr_adaptive_odbc.c b/cdr/cdr_adaptive_odbc.c index e04b9fec8..feb62e9fb 100644 --- a/cdr/cdr_adaptive_odbc.c +++ b/cdr/cdr_adaptive_odbc.c @@ -831,4 +831,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Adaptive ODBC CDR bac .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr,res_odbc", ); diff --git a/cdr/cdr_beanstalkd.c b/cdr/cdr_beanstalkd.c index 8f4863aa5..524274ffb 100644 --- a/cdr/cdr_beanstalkd.c +++ b/cdr/cdr_beanstalkd.c @@ -261,9 +261,10 @@ static int reload(void) { } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Asterisk Beanstalkd CDR Backend", -.support_level = AST_MODULE_SUPPORT_EXTENDED, -.load = load_module, -.unload = unload_module, -.reload = reload, -.load_pri = AST_MODPRI_CDR_DRIVER, + .support_level = AST_MODULE_SUPPORT_EXTENDED, + .load = load_module, + .unload = unload_module, + .reload = reload, + .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_csv.c b/cdr/cdr_csv.c index 5666a3d4e..e4c74ff1e 100644 --- a/cdr/cdr_csv.c +++ b/cdr/cdr_csv.c @@ -360,4 +360,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Comma Separated Value .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_custom.c b/cdr/cdr_custom.c index 5a5eb9ed0..72a475c8c 100644 --- a/cdr/cdr_custom.c +++ b/cdr/cdr_custom.c @@ -231,4 +231,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Customizable Comma Se .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_manager.c b/cdr/cdr_manager.c index 3f0cc6b6d..74f37d207 100644 --- a/cdr/cdr_manager.c +++ b/cdr/cdr_manager.c @@ -371,4 +371,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Asterisk Manager Inte .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_odbc.c b/cdr/cdr_odbc.c index efa68c1a9..54ca1b9e3 100644 --- a/cdr/cdr_odbc.c +++ b/cdr/cdr_odbc.c @@ -328,4 +328,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "ODBC CDR Backend", .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_pgsql.c b/cdr/cdr_pgsql.c index 3af9b4b3b..a4919d57f 100644 --- a/cdr/cdr_pgsql.c +++ b/cdr/cdr_pgsql.c @@ -794,4 +794,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PostgreSQL CDR Backen .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_radius.c b/cdr/cdr_radius.c index a43e96cd8..0a5fa6371 100644 --- a/cdr/cdr_radius.c +++ b/cdr/cdr_radius.c @@ -287,4 +287,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "RADIUS CDR Backend", .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_sqlite.c b/cdr/cdr_sqlite.c index b91296073..aceff0f57 100644 --- a/cdr/cdr_sqlite.c +++ b/cdr/cdr_sqlite.c @@ -248,4 +248,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "SQLite CDR Backend", .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_sqlite3_custom.c b/cdr/cdr_sqlite3_custom.c index 2212d0499..9f71c8481 100644 --- a/cdr/cdr_sqlite3_custom.c +++ b/cdr/cdr_sqlite3_custom.c @@ -360,4 +360,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "SQLite3 Custom CDR Mo .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_syslog.c b/cdr/cdr_syslog.c index bbc44064f..4f0a78ccb 100644 --- a/cdr/cdr_syslog.c +++ b/cdr/cdr_syslog.c @@ -292,4 +292,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Customizable syslog C .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cdr/cdr_tds.c b/cdr/cdr_tds.c index f3d0628ec..2de4e426a 100644 --- a/cdr/cdr_tds.c +++ b/cdr/cdr_tds.c @@ -635,4 +635,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "FreeTDS CDR Backend", .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cdr", ); diff --git a/cel/cel_beanstalkd.c b/cel/cel_beanstalkd.c index e6f23808c..fe4f430e9 100644 --- a/cel/cel_beanstalkd.c +++ b/cel/cel_beanstalkd.c @@ -272,4 +272,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Beanstalkd CEL Backen .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel", ); diff --git a/cel/cel_custom.c b/cel/cel_custom.c index 9c81ee1d4..73423a362 100644 --- a/cel/cel_custom.c +++ b/cel/cel_custom.c @@ -223,4 +223,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Customizable Comma Se .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel", ); diff --git a/cel/cel_manager.c b/cel/cel_manager.c index 365bb70c2..e485aab49 100644 --- a/cel/cel_manager.c +++ b/cel/cel_manager.c @@ -380,4 +380,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Asterisk Manager Inte .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel", ); diff --git a/cel/cel_odbc.c b/cel/cel_odbc.c index b4967b647..04d37346d 100644 --- a/cel/cel_odbc.c +++ b/cel/cel_odbc.c @@ -856,4 +856,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "ODBC CEL backend", .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel,res_odbc", ); diff --git a/cel/cel_pgsql.c b/cel/cel_pgsql.c index eb8f5d836..77dd46ae7 100644 --- a/cel/cel_pgsql.c +++ b/cel/cel_pgsql.c @@ -709,4 +709,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PostgreSQL CEL Backen .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel", ); diff --git a/cel/cel_radius.c b/cel/cel_radius.c index 250d6a778..4e87f86d5 100644 --- a/cel/cel_radius.c +++ b/cel/cel_radius.c @@ -259,4 +259,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "RADIUS CEL Backend", .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel", ); diff --git a/cel/cel_sqlite3_custom.c b/cel/cel_sqlite3_custom.c index 5675da6b3..db38eaf3e 100644 --- a/cel/cel_sqlite3_custom.c +++ b/cel/cel_sqlite3_custom.c @@ -360,4 +360,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "SQLite3 Custom CEL Mo .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel", ); diff --git a/cel/cel_tds.c b/cel/cel_tds.c index 0859fab7a..0aa73e522 100644 --- a/cel/cel_tds.c +++ b/cel/cel_tds.c @@ -580,4 +580,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "FreeTDS CEL Backend", .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, + .requires = "cel", ); diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c index ed7d5cfe3..a5dead1a2 100644 --- a/channels/chan_alsa.c +++ b/channels/chan_alsa.c @@ -39,6 +39,10 @@ #include "asterisk.h" +#include <errno.h> +#ifndef ESTRPIPE +#define ESTRPIPE EPIPE +#endif #include <fcntl.h> #include <sys/ioctl.h> #include <sys/time.h> diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 0579a5a36..37e277432 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -19542,5 +19542,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, tdesc, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .requires = "ccss", .optional_modules = "res_smdi", ); diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index eade5d13c..dec9dfda1 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -14902,5 +14902,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Inter Asterisk eXchan .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .requires = "dnsmgr", .optional_modules = "res_crypto", ); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index cd2929448..5030af453 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -35744,5 +35744,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Session Initiation Pr .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, + .requires = "ccss,dnsmgr,udptl", .optional_modules = "res_crypto,res_http_websocket", ); @@ -1046,10 +1046,6 @@ PBX_LUA LUA_DIR LUA_INCLUDE LUA_LIB -PBX_LTDL -LTDL_DIR -LTDL_INCLUDE -LTDL_LIB PBX_LIBXSLT_CLEANUP LIBXSLT_CLEANUP_DIR LIBXSLT_CLEANUP_INCLUDE @@ -1408,7 +1404,6 @@ with_libcurl with_libedit with_libxml2 with_libxslt -with_ltdl with_lua with_misdn with_mysqlclient @@ -2165,7 +2160,6 @@ Optional Packages: --with-libedit=PATH use NetBSD Editline library files in PATH --with-libxml2=PATH use LibXML2 files in PATH --with-libxslt=PATH use LibXSLT files in PATH - --with-ltdl=PATH use libtool files in PATH --with-lua=PATH use Lua files in PATH --with-misdn=PATH use mISDN user files in PATH --with-mysqlclient=PATH use MySQL client files in PATH @@ -7816,6 +7810,9 @@ fi +DOWNLOAD=":" +DOWNLOAD_TO_STDOUT= +DOWNLOAD_TIMEOUT= if test "${WGET}" != ":" ; then DOWNLOAD=${WGET} DOWNLOAD_TO_STDOUT="${WGET} -q -O-" @@ -7866,16 +7863,17 @@ $as_echo "no" >&6; } fi - DOWNLOAD=${FETCH} - DOWNLOAD_TO_STDOUT="${FETCH} -o-" - DOWNLOAD_TIMEOUT='--timeout=$(or $2,$1)' + if test "${FETCH}" != ":" ; then + DOWNLOAD=${FETCH} + DOWNLOAD_TO_STDOUT="${FETCH} -o-" + DOWNLOAD_TIMEOUT='--timeout=$(or $2,$1)' + fi fi fi - # Extract the first word of "ldconfig", so it can be a program name with args. set dummy ldconfig; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -9204,7 +9202,7 @@ $as_echo_n "checking for embedded pjproject (may have to download)... " >&6; } $as_echo "configuring" >&6; } if test "x${DOWNLOAD_TO_STDOUT}" = "x" ; then - as_fn_error $? "A download utility (wget, curl or fetch) is required to download bundled pjproject" "$LINENO" 5 + as_fn_error $? "A download utility (wget, curl, or fetch) is required to download bundled pjproject" "$LINENO" 5 fi if test "${BZIP2}" = ":" ; then as_fn_error $? "bzip2 is required to extract the pjproject tar file" "$LINENO" 5 @@ -10802,38 +10800,6 @@ PBX_LIBXSLT_CLEANUP=0 - LTDL_DESCRIP="libtool" - LTDL_OPTION="ltdl" - PBX_LTDL=0 - -# Check whether --with-ltdl was given. -if test "${with_ltdl+set}" = set; then : - withval=$with_ltdl; - case ${withval} in - n|no) - USE_LTDL=no - # -1 is a magic value used by menuselect to know that the package - # was disabled, other than 'not found' - PBX_LTDL=-1 - ;; - y|ye|yes) - ac_mandatory_list="${ac_mandatory_list} LTDL" - ;; - *) - LTDL_DIR="${withval}" - ac_mandatory_list="${ac_mandatory_list} LTDL" - ;; - esac - -fi - - - - - - - - LUA_DESCRIP="Lua" LUA_OPTION="lua" PBX_LUA=0 @@ -19463,6 +19429,41 @@ rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=${old_LIBS} +# re-check without -ldl +# Non-Linux platforms like FreeBSD and NetBSD do not need a library libdl.so. +if test "${PBX_DLADDR}" = "0"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dladdr in dlfcn.h without -ldl" >&5 +$as_echo_n "checking for dladdr in dlfcn.h without -ldl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _GNU_SOURCE 1 +#include <dlfcn.h> +int +main () +{ +dladdr((void *)0, (void *)0) + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + PBX_DLADDR=1 + + +$as_echo "#define HAVE_DLADDR 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + # PKGCONFIG is used in later tests @@ -19602,13 +19603,13 @@ if test "x${PBX_ALSA}" != "x1" -a "${USE_ALSA}" != "no"; then ast_ext_lib_check_save_CFLAGS="${CFLAGS}" CFLAGS="${CFLAGS} " - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_spcm_init in -lasound" >&5 -$as_echo_n "checking for snd_spcm_init in -lasound... " >&6; } -if ${ac_cv_lib_asound_snd_spcm_init+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 +$as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } +if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lasound ${pbxlibdir} -lm -ldl $LIBS" +LIBS="-lasound ${pbxlibdir} $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19618,27 +19619,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char snd_spcm_init (); +char snd_pcm_open (); int main () { -return snd_spcm_init (); +return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_asound_snd_spcm_init=yes + ac_cv_lib_asound_snd_pcm_open=yes else - ac_cv_lib_asound_snd_spcm_init=no + ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_spcm_init" >&5 -$as_echo "$ac_cv_lib_asound_snd_spcm_init" >&6; } -if test "x$ac_cv_lib_asound_snd_spcm_init" = xyes; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 +$as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } +if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : AST_ALSA_FOUND=yes else AST_ALSA_FOUND=no @@ -19649,7 +19650,7 @@ fi # now check for the header. if test "${AST_ALSA_FOUND}" = "yes"; then - ALSA_LIB="${pbxlibdir} -lasound -lm -ldl" + ALSA_LIB="${pbxlibdir} -lasound " # if --with-ALSA=DIR has been specified, use it. if test "x${ALSA_DIR}" != "x"; then ALSA_INCLUDE="-I${ALSA_DIR}/include" @@ -22439,104 +22440,6 @@ fi done -# Needed by unixodbc - -if test "x${PBX_LTDL}" != "x1" -a "${USE_LTDL}" != "no"; then - pbxlibdir="" - # if --with-LTDL=DIR has been specified, use it. - if test "x${LTDL_DIR}" != "x"; then - if test -d ${LTDL_DIR}/lib; then - pbxlibdir="-L${LTDL_DIR}/lib" - else - pbxlibdir="-L${LTDL_DIR}" - fi - fi - - ast_ext_lib_check_save_CFLAGS="${CFLAGS}" - CFLAGS="${CFLAGS} " - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lt_dlinit in -lltdl" >&5 -$as_echo_n "checking for lt_dlinit in -lltdl... " >&6; } -if ${ac_cv_lib_ltdl_lt_dlinit+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lltdl ${pbxlibdir} $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char lt_dlinit (); -int -main () -{ -return lt_dlinit (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ltdl_lt_dlinit=yes -else - ac_cv_lib_ltdl_lt_dlinit=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ltdl_lt_dlinit" >&5 -$as_echo "$ac_cv_lib_ltdl_lt_dlinit" >&6; } -if test "x$ac_cv_lib_ltdl_lt_dlinit" = xyes; then : - AST_LTDL_FOUND=yes -else - AST_LTDL_FOUND=no -fi - - CFLAGS="${ast_ext_lib_check_save_CFLAGS}" - - - # now check for the header. - if test "${AST_LTDL_FOUND}" = "yes"; then - LTDL_LIB="${pbxlibdir} -lltdl " - # if --with-LTDL=DIR has been specified, use it. - if test "x${LTDL_DIR}" != "x"; then - LTDL_INCLUDE="-I${LTDL_DIR}/include" - fi - LTDL_INCLUDE="${LTDL_INCLUDE} " - - # check for the header - ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}" - CPPFLAGS="${CPPFLAGS} ${LTDL_INCLUDE}" - ac_fn_c_check_header_mongrel "$LINENO" "ltdl.h" "ac_cv_header_ltdl_h" "$ac_includes_default" -if test "x$ac_cv_header_ltdl_h" = xyes; then : - LTDL_HEADER_FOUND=1 -else - LTDL_HEADER_FOUND=0 -fi - - - CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}" - - if test "x${LTDL_HEADER_FOUND}" = "x0" ; then - LTDL_LIB="" - LTDL_INCLUDE="" - else - - PBX_LTDL=1 - cat >>confdefs.h <<_ACEOF -#define HAVE_LTDL 1 -_ACEOF - - fi - fi -fi - - - if test "x${PBX_LDAP}" != "x1" -a "${USE_LDAP}" != "no"; then pbxlibdir="" @@ -24016,9 +23919,9 @@ if test "x${PBX_OGG}" != "x1" -a "${USE_OGG}" != "no"; then ast_ext_lib_check_save_CFLAGS="${CFLAGS}" CFLAGS="${CFLAGS} " - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ogg_sync_init in -logg" >&5 -$as_echo_n "checking for ogg_sync_init in -logg... " >&6; } -if ${ac_cv_lib_ogg_ogg_sync_init+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ogg_stream_init in -logg" >&5 +$as_echo_n "checking for ogg_stream_init in -logg... " >&6; } +if ${ac_cv_lib_ogg_ogg_stream_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -24032,27 +23935,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char ogg_sync_init (); +char ogg_stream_init (); int main () { -return ogg_sync_init (); +return ogg_stream_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ogg_ogg_sync_init=yes + ac_cv_lib_ogg_ogg_stream_init=yes else - ac_cv_lib_ogg_ogg_sync_init=no + ac_cv_lib_ogg_ogg_stream_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ogg_ogg_sync_init" >&5 -$as_echo "$ac_cv_lib_ogg_ogg_sync_init" >&6; } -if test "x$ac_cv_lib_ogg_ogg_sync_init" = xyes; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ogg_ogg_stream_init" >&5 +$as_echo "$ac_cv_lib_ogg_ogg_stream_init" >&6; } +if test "x$ac_cv_lib_ogg_ogg_stream_init" = xyes; then : AST_OGG_FOUND=yes else AST_OGG_FOUND=no @@ -24070,8 +23973,18 @@ fi fi OGG_INCLUDE="${OGG_INCLUDE} " - # no header, assume found - OGG_HEADER_FOUND="1" + # check for the header + ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}" + CPPFLAGS="${CPPFLAGS} ${OGG_INCLUDE}" + ac_fn_c_check_header_mongrel "$LINENO" "ogg/ogg.h" "ac_cv_header_ogg_ogg_h" "$ac_includes_default" +if test "x$ac_cv_header_ogg_ogg_h" = xyes; then : + OGG_HEADER_FOUND=1 +else + OGG_HEADER_FOUND=0 +fi + + + CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}" if test "x${OGG_HEADER_FOUND}" = "x0" ; then OGG_LIB="" @@ -33282,105 +33195,6 @@ fi -if test "${OSARCH}" = "OpenBSD"; -then - -if test "x${PBX_VORBIS}" != "x1" -a "${USE_VORBIS}" != "no"; then - pbxlibdir="" - # if --with-VORBIS=DIR has been specified, use it. - if test "x${VORBIS_DIR}" != "x"; then - if test -d ${VORBIS_DIR}/lib; then - pbxlibdir="-L${VORBIS_DIR}/lib" - else - pbxlibdir="-L${VORBIS_DIR}" - fi - fi - - ast_ext_lib_check_save_CFLAGS="${CFLAGS}" - CFLAGS="${CFLAGS} " - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vorbis_info_init in -lvorbis" >&5 -$as_echo_n "checking for vorbis_info_init in -lvorbis... " >&6; } -if ${ac_cv_lib_vorbis_vorbis_info_init+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lvorbis ${pbxlibdir} -lm -lvorbisenc -lvorbisfile -logg $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char vorbis_info_init (); -int -main () -{ -return vorbis_info_init (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_vorbis_vorbis_info_init=yes -else - ac_cv_lib_vorbis_vorbis_info_init=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vorbis_vorbis_info_init" >&5 -$as_echo "$ac_cv_lib_vorbis_vorbis_info_init" >&6; } -if test "x$ac_cv_lib_vorbis_vorbis_info_init" = xyes; then : - AST_VORBIS_FOUND=yes -else - AST_VORBIS_FOUND=no -fi - - CFLAGS="${ast_ext_lib_check_save_CFLAGS}" - - - # now check for the header. - if test "${AST_VORBIS_FOUND}" = "yes"; then - VORBIS_LIB="${pbxlibdir} -lvorbis -lm -lvorbisenc -lvorbisfile -logg" - # if --with-VORBIS=DIR has been specified, use it. - if test "x${VORBIS_DIR}" != "x"; then - VORBIS_INCLUDE="-I${VORBIS_DIR}/include" - fi - VORBIS_INCLUDE="${VORBIS_INCLUDE} " - - # check for the header - ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}" - CPPFLAGS="${CPPFLAGS} ${VORBIS_INCLUDE}" - ac_fn_c_check_header_mongrel "$LINENO" "vorbis/codec.h" "ac_cv_header_vorbis_codec_h" "$ac_includes_default" -if test "x$ac_cv_header_vorbis_codec_h" = xyes; then : - VORBIS_HEADER_FOUND=1 -else - VORBIS_HEADER_FOUND=0 -fi - - - CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}" - - if test "x${VORBIS_HEADER_FOUND}" = "x0" ; then - VORBIS_LIB="" - VORBIS_INCLUDE="" - else - - PBX_VORBIS=1 - cat >>confdefs.h <<_ACEOF -#define HAVE_VORBIS 1 -_ACEOF - - fi - fi -fi - - -else if test "x${PBX_VORBIS}" != "x1" -a "${USE_VORBIS}" != "no"; then pbxlibdir="" @@ -33477,7 +33291,6 @@ _ACEOF fi -fi if test "x${PBX_VORBIS_OPEN_CALLBACKS}" != "x1" -a "${USE_VORBIS_OPEN_CALLBACKS}" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OV_CALLBACKS_NOCLOSE declared in vorbis/vorbisfile.h" >&5 diff --git a/configure.ac b/configure.ac index 4b9b83038..787c50708 100644 --- a/configure.ac +++ b/configure.ac @@ -286,6 +286,9 @@ AC_PATH_PROG([PATCH], [patch], :) AC_PATH_PROG([SED], [sed], :) AC_PATH_PROG([NM], [nm], :) +DOWNLOAD=":" +DOWNLOAD_TO_STDOUT= +DOWNLOAD_TIMEOUT= if test "${WGET}" != ":" ; then DOWNLOAD=${WGET} DOWNLOAD_TO_STDOUT="${WGET} -q -O-" @@ -295,13 +298,14 @@ else if test "${CURL}" != ":" ; then DOWNLOAD_TO_STDOUT="${CURL} -Ls" DOWNLOAD_TIMEOUT='--max-time $(or $2,$1)' else - AC_PATH_PROG([FETCH], [fetch], [:]) - DOWNLOAD=${FETCH} - DOWNLOAD_TO_STDOUT="${FETCH} -o-" - DOWNLOAD_TIMEOUT='--timeout=$(or $2,$1)' + AC_PATH_PROG([FETCH], [fetch], :) + if test "${FETCH}" != ":" ; then + DOWNLOAD=${FETCH} + DOWNLOAD_TO_STDOUT="${FETCH} -o-" + DOWNLOAD_TIMEOUT='--timeout=$(or $2,$1)' + fi fi fi - AC_SUBST(DOWNLOAD) AC_SUBST(DOWNLOAD_TO_STDOUT) AC_SUBST(DOWNLOAD_TIMEOUT) @@ -484,7 +488,6 @@ AST_EXT_LIB_SETUP_OPTIONAL([LIBEDIT_IS_UNICODE], [Libedit compiled for unicode], AST_EXT_LIB_SETUP([LIBXML2], [LibXML2], [libxml2]) AST_EXT_LIB_SETUP([LIBXSLT], [LibXSLT], [libxslt]) AST_EXT_LIB_SETUP_OPTIONAL([LIBXSLT_CLEANUP], [LibXSLT Library Cleanup Function], [LIBXSLT], [libxslt]) -AST_EXT_LIB_SETUP([LTDL], [libtool], [ltdl]) AST_EXT_LIB_SETUP([LUA], [Lua], [lua]) AST_EXT_LIB_SETUP([MISDN], [mISDN user], [misdn]) AST_EXT_LIB_SETUP([MYSQLCLIENT], [MySQL client], [mysqlclient]) @@ -1460,13 +1463,30 @@ AC_LINK_IFELSE( ) LIBS=${old_LIBS} +# re-check without -ldl +# Non-Linux platforms like FreeBSD and NetBSD do not need a library libdl.so. +if test "${PBX_DLADDR}" = "0"; then + AC_MSG_CHECKING(for dladdr in dlfcn.h without -ldl) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#define _GNU_SOURCE 1 +#include <dlfcn.h>], + [dladdr((void *)0, (void *)0)] + )], + AC_MSG_RESULT(yes) + PBX_DLADDR=1 + AC_SUBST([PBX_DLADDR]) + AC_DEFINE([HAVE_DLADDR], 1, [Define to 1 if your system has the dladdr() GNU extension]), + AC_MSG_RESULT(no) + ) +fi + # PKGCONFIG is used in later tests PKG_PROG_PKG_CONFIG() # do the package library checks now -AST_EXT_LIB_CHECK([ALSA], [asound], [snd_spcm_init], [alsa/asoundlib.h], [-lm -ldl]) +AST_EXT_LIB_CHECK([ALSA], [asound], [snd_pcm_open], [alsa/asoundlib.h]) AST_EXT_LIB_CHECK([BFD], [bfd], [bfd_openr], [bfd.h]) # Fedora/RedHat/CentOS require extra libraries @@ -2133,9 +2153,6 @@ AST_EXT_LIB_CHECK([KQUEUE], [c], [kqueue], [sys/event.h]) # 64-bit version of kevent (from kqueue) on OS X AC_CHECK_FUNCS([kevent64]) -# Needed by unixodbc -AST_EXT_LIB_CHECK([LTDL], [ltdl], [lt_dlinit], [ltdl.h], []) - AST_EXT_LIB_CHECK([LDAP], [ldap], [ldap_initialize], [ldap.h]) AST_EXT_LIB_CHECK([MISDN], [mISDN], [mISDN_open], [mISDNuser/mISDNlib.h]) @@ -2181,7 +2198,7 @@ AST_C_DECLARE_CHECK([UNBOUND_CONST_PARAMS], [UNBOUND_VERSION_MAJOR], [unbound.h] AST_EXT_LIB_CHECK([UNIXODBC], [odbc], [SQLConnect], [sql.h], []) -AST_EXT_LIB_CHECK([OGG], [ogg], [ogg_sync_init], []) +AST_EXT_LIB_CHECK([OGG], [ogg], [ogg_stream_init], [ogg/ogg.h]) # Non-glibc platforms require libexecinfo for backtrace support AST_EXT_LIB_CHECK([BKTR], [execinfo], [backtrace], [execinfo.h]) @@ -2567,12 +2584,7 @@ fi AST_EXT_LIB_CHECK([TONEZONE], [tonezone], [tone_zone_find], [dahdi/tonezone.h], [${tonezone_extra} ${DAHDI_INCLUDE}]) -if test "${OSARCH}" = "OpenBSD"; -then - AST_EXT_LIB_CHECK([VORBIS], [vorbis], [vorbis_info_init], [vorbis/codec.h], [-lm -lvorbisenc -lvorbisfile -logg]) -else - AST_EXT_LIB_CHECK([VORBIS], [vorbis], [vorbis_info_init], [vorbis/codec.h], [-lm -lvorbisenc -lvorbisfile]) -fi +AST_EXT_LIB_CHECK([VORBIS], [vorbis], [vorbis_info_init], [vorbis/codec.h], [-lm -lvorbisenc -lvorbisfile]) AST_C_DECLARE_CHECK([VORBIS_OPEN_CALLBACKS], [OV_CALLBACKS_NOCLOSE], [vorbis/vorbisfile.h]) AC_LANG_PUSH(C++) diff --git a/contrib/scripts/install_prereq b/contrib/scripts/install_prereq index e588d5cd1..887c5e21d 100755 --- a/contrib/scripts/install_prereq +++ b/contrib/scripts/install_prereq @@ -24,7 +24,7 @@ PACKAGES_DEBIAN="build-essential pkg-config" PACKAGES_DEBIAN="$PACKAGES_DEBIAN libedit-dev libjansson-dev libsqlite3-dev uuid-dev libxml2-dev" # Asterisk: for addons: PACKAGES_DEBIAN="$PACKAGES_DEBIAN libspeex-dev libspeexdsp-dev libogg-dev libvorbis-dev libasound2-dev portaudio19-dev libcurl4-openssl-dev xmlstarlet bison flex" -PACKAGES_DEBIAN="$PACKAGES_DEBIAN libpq-dev unixodbc-dev libltdl-dev libneon27-dev libgmime-2.6-dev liblua5.2-dev liburiparser-dev libxslt1-dev libssl-dev" +PACKAGES_DEBIAN="$PACKAGES_DEBIAN libpq-dev unixodbc-dev libneon27-dev libgmime-2.6-dev liblua5.2-dev liburiparser-dev libxslt1-dev libssl-dev" PACKAGES_DEBIAN="$PACKAGES_DEBIAN libvpb-dev libmysqlclient-dev libbluetooth-dev libradcli-dev freetds-dev libosptk-dev libjack-jackd2-dev bash" PACKAGES_DEBIAN="$PACKAGES_DEBIAN libsnmp-dev libiksemel-dev libcorosync-common-dev libcpg-dev libcfg-dev libnewt-dev libpopt-dev libical-dev libspandsp-dev" PACKAGES_DEBIAN="$PACKAGES_DEBIAN libresample1-dev libc-client2007e-dev binutils-dev libsrtp0-dev libsrtp2-dev libgsm1-dev doxygen graphviz zlib1g-dev libldap2-dev" @@ -40,7 +40,7 @@ PACKAGES_RH="make gcc gcc-c++ pkgconfig" PACKAGES_RH="$PACKAGES_RH libedit-devel jansson-devel libuuid-devel sqlite-devel libxml2-devel" # Asterisk: for addons: PACKAGES_RH="$PACKAGES_RH speex-devel speexdsp-devel libogg-devel libvorbis-devel alsa-lib-devel portaudio-devel libcurl-devel xmlstarlet bison flex" -PACKAGES_RH="$PACKAGES_RH postgresql-devel unixODBC-devel libtool-ltdl-devel neon-devel gmime-devel lua-devel uriparser-devel libxslt-devel openssl-devel" +PACKAGES_RH="$PACKAGES_RH postgresql-devel unixODBC-devel neon-devel gmime-devel lua-devel uriparser-devel libxslt-devel openssl-devel" PACKAGES_RH="$PACKAGES_RH mysql-devel bluez-libs-devel radcli-devel freetds-devel jack-audio-connection-kit-devel bash" PACKAGES_RH="$PACKAGES_RH net-snmp-devel iksemel-devel corosynclib-devel newt-devel popt-devel libical-devel spandsp-devel" PACKAGES_RH="$PACKAGES_RH libresample-devel uw-imap-devel binutils-devel libsrtp-devel gsm-devel doxygen graphviz zlib-devel openldap-devel hoard" @@ -56,7 +56,7 @@ PACKAGES_SUSE="make gcc gcc-c++ pkg-config" PACKAGES_SUSE="$PACKAGES_SUSE libedit-devel libjansson-devel libuuid-devel sqlite3-devel libxml2-devel" # Asterisk: for addons: PACKAGES_SUSE="$PACKAGES_SUSE speex-devel speexdsp-devel libogg-devel libvorbis-devel alsa-devel portaudio-devel libcurl-devel xmlstarlet bison flex" -PACKAGES_SUSE="$PACKAGES_SUSE postgresql-devel unixODBC-devel libtool libneon-devel gmime-devel lua-devel liburiparser-devel libxslt-devel libopenssl-devel" +PACKAGES_SUSE="$PACKAGES_SUSE postgresql-devel unixODBC-devel libneon-devel gmime-devel lua-devel liburiparser-devel libxslt-devel libopenssl-devel" PACKAGES_SUSE="$PACKAGES_SUSE libmysqlclient-devel bluez-devel freeradius-client-devel freetds-devel bash" PACKAGES_SUSE="$PACKAGES_SUSE net-snmp-devel iksemel-devel libcorosync-devel newt-devel popt-devel libical-devel spandsp-devel" PACKAGES_SUSE="$PACKAGES_SUSE imap-devel libsrtp2-devel libgsm-devel doxygen graphviz zlib-devel openldap2-devel" @@ -72,7 +72,7 @@ PACKAGES_ARCH="make gcc pkg-config" PACKAGES_ARCH="$PACKAGES_ARCH libedit jansson libutil-linux libxml2 sqlite" # Asterisk: for addons: PACKAGES_ARCH="$PACKAGES_ARCH speex speexdsp libogg libvorbis alsa-lib portaudio curl xmlstarlet bison flex" -PACKAGES_ARCH="$PACKAGES_ARCH postgresql-libs unixodbc libtool neon gmime lua uriparser libxslt openssl" +PACKAGES_ARCH="$PACKAGES_ARCH postgresql-libs unixodbc neon gmime lua uriparser libxslt openssl" PACKAGES_ARCH="$PACKAGES_ARCH libmariadbclient bluez-libs radcli freetds bash" PACKAGES_ARCH="$PACKAGES_ARCH net-snmp libnewt popt libical spandsp" PACKAGES_ARCH="$PACKAGES_ARCH c-client binutils libsrtp gsm doxygen graphviz zlib libldap" @@ -88,7 +88,7 @@ PACKAGES_NBSD="gmake pkg-config" PACKAGES_NBSD="$PACKAGES_NBSD editline jansson sqlite3 libuuid libxml2" # Asterisk: for addons: PACKAGES_NBSD="$PACKAGES_NBSD speex speexdsp libogg libvorbis alsa-lib portaudio-devel curl bison flex" -PACKAGES_NBSD="$PACKAGES_NBSD postgresql10-client unixodbc libltdl neon gmime lua52 uriparser libxslt openssl" +PACKAGES_NBSD="$PACKAGES_NBSD postgresql10-client unixodbc neon gmime lua52 uriparser libxslt openssl" PACKAGES_NBSD="$PACKAGES_NBSD mysql-client radiusclient-ng freetds bash" PACKAGES_NBSD="$PACKAGES_NBSD net-snmp iksemel popt libical spandsp" PACKAGES_NBSD="$PACKAGES_NBSD imap-uw srtp gsm doxygen graphviz libzip openldap-client" @@ -104,7 +104,7 @@ PACKAGES_OBSD="gmake" PACKAGES_OBSD="$PACKAGES_OBSD libxml sqlite3 e2fsprogs jansson" # Asterisk: for addons: PACKAGES_OBSD="$PACKAGES_OBSD speex speexdsp libogg libvorbis portaudio-svn curl xmlstarlet bison" -PACKAGES_OBSD="$PACKAGES_OBSD postgresql-client iodbc libltdl neon gmime lua%5.2 uriparser libxslt" +PACKAGES_OBSD="$PACKAGES_OBSD postgresql-client iodbc neon gmime lua%5.2 uriparser libxslt" PACKAGES_OBSD="$PACKAGES_OBSD mariadb-client radcli freetds" PACKAGES_OBSD="$PACKAGES_OBSD net-snmp iksemel popt libical spandsp" PACKAGES_OBSD="$PACKAGES_OBSD c-client libsrtp gsm doxygen graphviz" @@ -120,7 +120,7 @@ PACKAGES_FBSD="gmake pkgconf" PACKAGES_FBSD="$PACKAGES_FBSD libedit jansson e2fsprogs-libuuid sqlite3 libxml2" # Asterisk: for addons: PACKAGES_FBSD="$PACKAGES_FBSD speex speexdsp libogg libvorbis alsa-lib portaudio curl xmlstarlet bison flex" -PACKAGES_FBSD="$PACKAGES_FBSD postgresql10-client unixODBC libltdl neon gmime26 lua52 uriparser libxslt openssl" +PACKAGES_FBSD="$PACKAGES_FBSD postgresql10-client unixODBC neon gmime26 lua52 uriparser libxslt openssl" PACKAGES_FBSD="$PACKAGES_FBSD mysql57-client radcli freetds" PACKAGES_FBSD="$PACKAGES_FBSD net-snmp iksemel corosync newt popt libical spandsp" PACKAGES_FBSD="$PACKAGES_FBSD cclient libbfd libsrtp gsm libilbc doxygen graphviz libzip openldap-client libhoard" diff --git a/formats/format_ogg_vorbis.c b/formats/format_ogg_vorbis.c index be5bb2bf9..ba86842f7 100644 --- a/formats/format_ogg_vorbis.c +++ b/formats/format_ogg_vorbis.c @@ -33,6 +33,7 @@ #include "asterisk.h" +#include <ogg/ogg.h> #include <vorbis/codec.h> #include <vorbis/vorbisenc.h> #include <vorbis/vorbisfile.h> diff --git a/funcs/func_callcompletion.c b/funcs/func_callcompletion.c index ed5238c1f..37ba38ce4 100644 --- a/funcs/func_callcompletion.c +++ b/funcs/func_callcompletion.c @@ -126,4 +126,9 @@ static int load_module(void) return ast_custom_function_register(&cc_function) == 0 ? AST_MODULE_LOAD_SUCCESS : AST_MODULE_LOAD_DECLINE; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Call Control Configuration Function"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Call Control Configuration Function", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .requires = "ccss", +); diff --git a/funcs/func_cdr.c b/funcs/func_cdr.c index 2dd9f1578..d7bc21145 100644 --- a/funcs/func_cdr.c +++ b/funcs/func_cdr.c @@ -704,4 +704,9 @@ static int load_module(void) return AST_MODULE_LOAD_SUCCESS; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Call Detail Record (CDR) dialplan functions"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Call Detail Record (CDR) dialplan functions", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .requires = "cdr", +); diff --git a/funcs/func_enum.c b/funcs/func_enum.c index 6929e3ccd..f649e0f29 100644 --- a/funcs/func_enum.c +++ b/funcs/func_enum.c @@ -472,4 +472,9 @@ static int load_module(void) return res; } -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "ENUM related dialplan functions"); +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "ENUM related dialplan functions", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .requires = "enum", +); diff --git a/include/asterisk/_private.h b/include/asterisk/_private.h index b9f552dd1..431f96108 100644 --- a/include/asterisk/_private.h +++ b/include/asterisk/_private.h @@ -33,26 +33,17 @@ int astdb_init(void); /*!< Provided by db.c */ int ast_channels_init(void); /*!< Provided by channel.c */ void ast_builtins_init(void); /*!< Provided by cli.c */ int ast_cli_perms_init(int reload); /*!< Provided by cli.c */ -int dnsmgr_init(void); /*!< Provided by dnsmgr.c */ void dnsmgr_start_refresh(void); /*!< Provided by dnsmgr.c */ -int dnsmgr_reload(void); /*!< Provided by dnsmgr.c */ int ast_dns_system_resolver_init(void); /*!< Provided by dns_system_resolver.c */ void threadstorage_init(void); /*!< Provided by threadstorage.c */ int ast_device_state_engine_init(void); /*!< Provided by devicestate.c */ int astobj2_init(void); /*!< Provided by astobj2.c */ int ast_named_locks_init(void); /*!< Provided by named_locks.c */ int ast_file_init(void); /*!< Provided by file.c */ -int ast_features_init(void); /*!< Provided by features.c */ void ast_autoservice_init(void); /*!< Provided by autoservice.c */ -int ast_http_init(void); /*!< Provided by http.c */ -int ast_http_reload(void); /*!< Provided by http.c */ int ast_tps_init(void); /*!< Provided by taskprocessor.c */ int ast_timing_init(void); /*!< Provided by timing.c */ -int ast_indications_init(void); /*!< Provided by indications.c */ -int ast_indications_reload(void);/*!< Provided by indications.c */ void ast_stun_init(void); /*!< Provided by stun.c */ -int ast_cel_engine_init(void); /*!< Provided by cel.c */ -int ast_cel_engine_reload(void); /*!< Provided by cel.c */ int ast_ssl_init(void); /*!< Provided by ssl.c */ int ast_pj_init(void); /*!< Provided by libasteriskpj.c */ int ast_test_init(void); /*!< Provided by test.c */ @@ -97,13 +88,6 @@ void ast_process_pending_reloads(void); */ int ast_xmldoc_load_documentation(void); -/*! - * \brief Reload genericplc configuration value from codecs.conf - * - * Implementation is in main/channel.c - */ -int ast_plc_reload(void); - /*! \brief initializes the rtp engine arrays */ int ast_rtp_engine_init(void); @@ -113,9 +97,6 @@ int ast_rtp_engine_init(void); */ int ast_parking_stasis_init(void); -/*! \brief initialize the sounds index */ -int ast_sounds_index_init(void); - /*! * \brief Endpoint support initialization. * \return 0 on success. diff --git a/include/asterisk/acl.h b/include/asterisk/acl.h index bda1c7606..09adc527d 100644 --- a/include/asterisk/acl.h +++ b/include/asterisk/acl.h @@ -382,24 +382,6 @@ const char *ast_tos2str(unsigned int tos); struct ast_ha *ast_named_acl_find(const char *name, int *is_realtime, int *is_undefined); /*! - * \brief Initialize and configure the named ACL system. - * - * \details - * This function will prepare the named ACL system for use. - * For this reason, it needs to be called before other things that use ACLs are initialized. - */ -int ast_named_acl_init(void); - -/*! - * \brief reload/reconfigure the named ACL system. - * - * \details - * This function is designed to trigger an event upon a successful reload that may update - * ACL consumers. - */ -int ast_named_acl_reload(void); - -/*! * \brief a \ref stasis_message_type for changes against a named ACL or the set of all named ACLs * \since 12 * diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index 6d747ae5a..5e9ba6011 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -483,9 +483,6 @@ than `double'. */ #undef HAVE_LONG_DOUBLE_WIDER -/* Define to 1 if you have the libtool library. */ -#undef HAVE_LTDL - /* Define to 1 if you have the Lua library. */ #undef HAVE_LUA diff --git a/include/asterisk/ccss.h b/include/asterisk/ccss.h index fb17500b6..c006c7639 100644 --- a/include/asterisk/ccss.h +++ b/include/asterisk/ccss.h @@ -1618,15 +1618,4 @@ typedef void (*ast_cc_callback_fn)(struct ast_channel *chan, struct ast_cc_confi */ int ast_cc_callback(struct ast_channel *inbound, const char * const tech, const char * const dest, ast_cc_callback_fn callback); -/*! - * \since 1.8 - * \brief Initialize CCSS - * - * Performs startup routines necessary for CC operation. - * - * \retval 0 Success - * \retval nonzero Failure - */ -int ast_cc_init(void); - #endif /* _ASTERISK_CCSS_H */ diff --git a/include/asterisk/cdr.h b/include/asterisk/cdr.h index e10da8223..c6b241315 100644 --- a/include/asterisk/cdr.h +++ b/include/asterisk/cdr.h @@ -581,12 +581,6 @@ const char *ast_cdr_disp2str(int disposition); */ void ast_cdr_setuserfield(const char *channel_name, const char *userfield); -/*! \brief Reload the configuration file cdr.conf and start/stop CDR scheduling thread */ -int ast_cdr_engine_reload(void); - -/*! \brief Load the configuration file cdr.conf and possibly start the CDR scheduling thread */ -int ast_cdr_engine_init(void); - /*! Submit any remaining CDRs and prepare for shutdown */ void ast_cdr_engine_term(void); diff --git a/include/asterisk/config.h b/include/asterisk/config.h index 891284039..c1b7dea8d 100644 --- a/include/asterisk/config.h +++ b/include/asterisk/config.h @@ -784,15 +784,6 @@ int ast_realtime_append_mapping(const char *name, const char *driver, const char */ int register_config_cli(void); -/*! - * \brief Exposed re-initialization method for core process - * - * \details - * This method is intended for use only with the core re-initialization and is - * not designed to be called from any user applications. - */ -int read_config_maps(void); - /*! \brief Create a new base configuration structure */ struct ast_config *ast_config_new(void); diff --git a/include/asterisk/dsp.h b/include/asterisk/dsp.h index d092e6b4c..769d3b981 100644 --- a/include/asterisk/dsp.h +++ b/include/asterisk/dsp.h @@ -193,16 +193,4 @@ int ast_dsp_get_tcount(struct ast_dsp *dsp); */ int ast_dsp_get_threshold_from_settings(enum threshold which); -/*! - * \brief Reloads dsp settings from dsp.conf - * \since 1.6.1 - */ -int ast_dsp_reload(void); - -/*! - * \brief Load dsp settings from dsp.conf - * \since 1.6.1 - */ -int ast_dsp_init(void); - #endif /* _ASTERISK_DSP_H */ diff --git a/include/asterisk/enum.h b/include/asterisk/enum.h index 877c0c3cf..2ce85ccb3 100644 --- a/include/asterisk/enum.h +++ b/include/asterisk/enum.h @@ -97,7 +97,4 @@ int ast_get_enum(struct ast_channel *chan, const char *number, char *location, i */ int ast_get_txt(struct ast_channel *chan, const char *number, char *txt, int maxtxt, char *suffix); -int ast_enum_init(void); -int ast_enum_reload(void); - #endif /* _ASTERISK_ENUM_H */ diff --git a/include/asterisk/features_config.h b/include/asterisk/features_config.h index 1bce50bba..cd1bbbcea 100644 --- a/include/asterisk/features_config.h +++ b/include/asterisk/features_config.h @@ -265,10 +265,4 @@ struct ast_applicationmap_item { */ struct ao2_container *ast_get_chan_applicationmap(struct ast_channel *chan); -void ast_features_config_shutdown(void); - -int ast_features_config_reload(void); - -int ast_features_config_init(void); - #endif /* _FEATURES_CONFIG_H */ diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h index 8b1e5fe01..df039313c 100644 --- a/include/asterisk/logger.h +++ b/include/asterisk/logger.h @@ -133,9 +133,6 @@ int ast_logger_remove_channel(const char *log_channel); */ void ast_log_backtrace(void); -/*! \brief Reload logger without rotating log files */ -int logger_reload(void); - /*! \brief Reload logger while rotating log files */ int ast_logger_rotate(void); diff --git a/include/asterisk/manager.h b/include/asterisk/manager.h index 35dc22763..97d4b9c29 100644 --- a/include/asterisk/manager.h +++ b/include/asterisk/manager.h @@ -356,12 +356,6 @@ void __attribute__((format(printf, 2, 3))) astman_append(struct mansession *s, c /*! \brief Determinie if a manager session ident is authenticated */ int astman_is_authed(uint32_t ident); -/*! \brief Called by Asterisk initialization */ -int init_manager(void); - -/*! \brief Called by Asterisk module functions and the CLI command */ -int reload_manager(void); - /*! * \brief Add a datastore to a session * diff --git a/include/asterisk/module.h b/include/asterisk/module.h index ebd41c06d..faa4f7f67 100644 --- a/include/asterisk/module.h +++ b/include/asterisk/module.h @@ -292,13 +292,14 @@ enum ast_module_load_priority { AST_MODPRI_REALTIME_DEPEND = 10, /*!< Dependency for a realtime driver */ AST_MODPRI_REALTIME_DEPEND2 = 20, /*!< Second level dependency for a realtime driver (func_curl needs res_curl, but is needed by res_config_curl) */ AST_MODPRI_REALTIME_DRIVER = 30, /*!< A realtime driver, which provides configuration services for other modules */ - AST_MODPRI_TIMING = 40, /*!< Dependency for a channel (MOH needs timing interfaces to be fully loaded) */ - AST_MODPRI_CHANNEL_DEPEND = 50, /*!< Channel driver dependency (may depend upon realtime, e.g. MOH) */ - AST_MODPRI_CHANNEL_DRIVER = 60, /*!< Channel drivers (provide devicestate) */ - AST_MODPRI_APP_DEPEND = 70, /*!< Dependency for an application */ - AST_MODPRI_DEVSTATE_PROVIDER = 80, /*!< Applications and other modules that _provide_ devicestate (e.g. meetme) */ - AST_MODPRI_DEVSTATE_PLUGIN = 90, /*!< Plugin for a module that provides devstate (e.g. res_calendar_*) */ - AST_MODPRI_CDR_DRIVER = 100, /*!< CDR or CEL backend */ + AST_MODPRI_CORE = 40, /*!< A core module originally meant to start between preload and load. */ + AST_MODPRI_TIMING = 50, /*!< Dependency for a channel (MOH needs timing interfaces to be fully loaded) */ + AST_MODPRI_CHANNEL_DEPEND = 60, /*!< Channel driver dependency (may depend upon realtime, e.g. MOH) */ + AST_MODPRI_CHANNEL_DRIVER = 70, /*!< Channel drivers (provide devicestate) */ + AST_MODPRI_APP_DEPEND = 80, /*!< Dependency for an application */ + AST_MODPRI_DEVSTATE_PROVIDER = 90, /*!< Applications and other modules that _provide_ devicestate (e.g. meetme) */ + AST_MODPRI_DEVSTATE_PLUGIN = 100, /*!< Plugin for a module that provides devstate (e.g. res_calendar_*) */ + AST_MODPRI_CDR_DRIVER = 110, /*!< CDR or CEL backend */ AST_MODPRI_DEFAULT = 128, /*!< Modules not otherwise defined (such as most apps) will load here */ AST_MODPRI_DEVSTATE_CONSUMER = 150, /*!< Certain modules, which consume devstate, need to load after all others (e.g. app_queue) */ }; diff --git a/include/asterisk/sounds_index.h b/include/asterisk/sounds_index.h index d7eb05332..bbd3965f4 100644 --- a/include/asterisk/sounds_index.h +++ b/include/asterisk/sounds_index.h @@ -33,14 +33,6 @@ extern "C" { struct ast_media_index; /*! - * \brief Reload the sounds index - * - * \retval zero on success - * \retval non-zero on failure - */ -int ast_sounds_reindex(void); - -/*! * \brief Get the sounds index * * \retval sounds index (must be ao2_cleanup()'ed) diff --git a/include/asterisk/stringfields.h b/include/asterisk/stringfields.h index e1ff2fc1d..ce978901b 100644 --- a/include/asterisk/stringfields.h +++ b/include/asterisk/stringfields.h @@ -228,11 +228,6 @@ struct ast_string_field_mgr { ast_string_field last_alloc; /*!< the last field allocated */ struct ast_string_field_pool *embedded_pool; /*!< pointer to the embedded pool, if any */ struct ast_string_field_vector string_fields; /*!< field vector for compare and copy */ - /* v-- MALLOC_DEBUG information */ - const char *owner_file; /*!< filename of owner */ - const char *owner_func; /*!< function name of owner */ - int owner_line; /*!< line number of owner */ - /* ^-- MALLOC_DEBUG information */ }; /*! @@ -266,7 +261,8 @@ int __ast_string_field_ptr_grow(struct ast_string_field_mgr *mgr, an additional pool will be allocated. */ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr, - struct ast_string_field_pool **pool_head, size_t needed); + struct ast_string_field_pool **pool_head, size_t needed, + const char *file, int lineno, const char *func); /*! \internal @@ -277,9 +273,9 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr \param format printf-style format string \return nothing */ -void __ast_string_field_ptr_build(struct ast_string_field_mgr *mgr, - struct ast_string_field_pool **pool_head, - ast_string_field *ptr, const char *format, ...) __attribute__((format(printf, 4, 5))); +void __ast_string_field_ptr_build(const char *file, int lineno, const char *func, + struct ast_string_field_mgr *mgr, struct ast_string_field_pool **pool_head, + ast_string_field *ptr, const char *format, ...) __attribute__((format(printf, 7, 8))); /*! \internal @@ -292,8 +288,9 @@ void __ast_string_field_ptr_build(struct ast_string_field_mgr *mgr, \return nothing */ void __ast_string_field_ptr_build_va(struct ast_string_field_mgr *mgr, - struct ast_string_field_pool **pool_head, - ast_string_field *ptr, const char *format, va_list ap) __attribute__((format(printf, 4, 0))); + struct ast_string_field_pool **pool_head, + ast_string_field *ptr, const char *format, va_list ap, + const char *file, int lineno, const char *func) __attribute__((format(printf, 4, 0))); /*! \brief Declare a string field @@ -479,7 +476,7 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, __res__; \ }) -#define ast_string_field_ptr_set_by_fields(field_mgr_pool, field_mgr, ptr, data) \ +#define __ast_string_field_ptr_set_by_fields(field_mgr_pool, field_mgr, ptr, data, file, lineno, func) \ ({ \ int __res__ = 0; \ const char *__d__ = (data); \ @@ -491,7 +488,7 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, *__p__ = __ast_string_field_empty; \ } else if ((__dlen__ <= AST_STRING_FIELD_ALLOCATION(*__p__)) || \ (!__ast_string_field_ptr_grow(&field_mgr, &field_mgr_pool, __dlen__, __p__)) || \ - (target = __ast_string_field_alloc_space(&field_mgr, &field_mgr_pool, __dlen__))) { \ + (target = __ast_string_field_alloc_space(&field_mgr, &field_mgr_pool, __dlen__, file, lineno, func))) { \ if (target != *__p__) { \ __ast_string_field_release_active(field_mgr_pool, *__p__); \ *__p__ = target; \ @@ -503,6 +500,9 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, __res__; \ }) +#define ast_string_field_ptr_set_by_fields(field_mgr_pool, field_mgr, ptr, data) \ + __ast_string_field_ptr_set_by_fields(field_mgr_pool, field_mgr, ptr, data, __FILE__, __LINE__, __PRETTY_FUNCTION__) + /*! \brief Set a field to a simple string value \param x Pointer to a structure containing fields @@ -532,7 +532,8 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, ({ \ int __res__ = -1; \ if (((void *)(x)) != NULL) { \ - __ast_string_field_ptr_build(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) ptr, fmt, args); \ + __ast_string_field_ptr_build(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ + &(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) ptr, fmt, args); \ __res__ = 0; \ } \ __res__; \ @@ -550,7 +551,8 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, ({ \ int __res__ = -1; \ if (((void *)(x)) != NULL) { \ - __ast_string_field_ptr_build(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) &(x)->field, fmt, args); \ + __ast_string_field_ptr_build(__FILE__, __LINE__, __PRETTY_FUNCTION__, \ + &(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) &(x)->field, fmt, args); \ __res__ = 0; \ } \ __res__; \ @@ -568,7 +570,8 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, ({ \ int __res__ = -1; \ if (((void *)(x)) != NULL) { \ - __ast_string_field_ptr_build_va(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) ptr, fmt, args); \ + __ast_string_field_ptr_build_va(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) ptr, fmt, args, \ + __FILE__, __LINE__, __PRETTY_FUNCTION__); \ __res__ = 0; \ } \ __res__; \ @@ -586,7 +589,8 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, ({ \ int __res__ = -1; \ if (((void *)(x)) != NULL) { \ - __ast_string_field_ptr_build_va(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) &(x)->field, fmt, args); \ + __ast_string_field_ptr_build_va(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) &(x)->field, fmt, args, \ + __FILE__, __LINE__, __PRETTY_FUNCTION__); \ __res__ = 0; \ } \ __res__; \ @@ -626,12 +630,14 @@ int __ast_string_fields_cmp(struct ast_string_field_vector *left, struct ast_str if (((void *)(copy)) != NULL && ((void *)(orig)) != NULL) { \ __res__ = __ast_string_fields_copy(((copy)->__field_mgr_pool), \ (struct ast_string_field_mgr *)&((copy)->__field_mgr), \ - (struct ast_string_field_mgr *)&((orig)->__field_mgr)); \ + (struct ast_string_field_mgr *)&((orig)->__field_mgr), \ + __FILE__, __LINE__, __PRETTY_FUNCTION__); \ } \ __res__; \ }) int __ast_string_fields_copy(struct ast_string_field_pool *copy_pool, - struct ast_string_field_mgr *copy_mgr, struct ast_string_field_mgr *orig_mgr); + struct ast_string_field_mgr *copy_mgr, struct ast_string_field_mgr *orig_mgr, + const char *file, int lineno, const char *func); #endif /* _ASTERISK_STRINGFIELDS_H */ diff --git a/include/asterisk/udptl.h b/include/asterisk/udptl.h index 7137ff936..0d79d6f66 100644 --- a/include/asterisk/udptl.h +++ b/include/asterisk/udptl.h @@ -126,13 +126,6 @@ void ast_udptl_setnat(struct ast_udptl *udptl, int nat); void ast_udptl_stop(struct ast_udptl *udptl); -void ast_udptl_init(void); - -/*! - * \version 1.6.1 return changed to int - */ -int ast_udptl_reload(void); - #if defined(__cplusplus) || defined(c_plusplus) } #endif diff --git a/main/Makefile b/main/Makefile index ba7491d0e..cd5c08c02 100644 --- a/main/Makefile +++ b/main/Makefile @@ -17,9 +17,9 @@ all: asterisk include $(ASTTOPDIR)/Makefile.moddir_rules -# Can the MODSRC list be automated without needing built-in modules to be -# in a different directory? Would a different directory be better? -MOD_SRC:= +MOD_SRC:=cdr.c cel.c config.c ccss.c dnsmgr.c dsp.c enum.c features.c http.c indications.c logger.c manager.c named_acl.c plc.c sounds.c udptl.c +# Allow deletion of built-in modules without needing to modify this source. +MOD_SRC:=$(wildcard $(MOD_SRC)) MOD_OBJS:=$(sort $(MOD_SRC:.c=.o)) # Must include the extra ast_expr2.c, ast_expr2f.c, in case they need to be regenerated (because to force regeneration, we delete them) diff --git a/main/asterisk.c b/main/asterisk.c index 1607bf40e..7a4424d22 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -199,7 +199,6 @@ int daemon(int, int); /* defined in libresolv of all places */ #include "asterisk/channel.h" #include "asterisk/translate.h" #include "asterisk/pickup.h" -#include "asterisk/features.h" #include "asterisk/acl.h" #include "asterisk/ulaw.h" #include "asterisk/alaw.h" @@ -209,11 +208,7 @@ int daemon(int, int); /* defined in libresolv of all places */ #include "asterisk/term.h" #include "asterisk/manager.h" #include "asterisk/cdr.h" -#include "asterisk/cel.h" #include "asterisk/pbx.h" -#include "asterisk/enum.h" -#include "asterisk/http.h" -#include "asterisk/udptl.h" #include "asterisk/app.h" #include "asterisk/lock.h" #include "asterisk/utils.h" @@ -225,11 +220,9 @@ int daemon(int, int); /* defined in libresolv of all places */ #include "asterisk/devicestate.h" #include "asterisk/presencestate.h" #include "asterisk/module.h" -#include "asterisk/dsp.h" #include "asterisk/buildinfo.h" #include "asterisk/xmldoc.h" #include "asterisk/poll-compat.h" -#include "asterisk/ccss.h" #include "asterisk/test.h" #include "asterisk/rtp_engine.h" #include "asterisk/format.h" @@ -4444,12 +4437,7 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou print_intro_message(runuser, rungroup); - if (ast_opt_console) { - ast_verb(0, "[ Initializing Custom Configuration Options ]\n"); - } - /* custom config setup */ register_config_cli(); - read_config_maps(); check_init(astobj2_init(), "AO2"); check_init(ast_named_locks_init(), "Named Locks"); @@ -4564,32 +4552,10 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou /* We should avoid most config loads before this point as they can't use realtime. */ check_init(load_modules(1), "Module Preload"); - /* Initialize core modules that have config files. These should be converted to - * built-in modules with load priority after realtime, that way users will not - * need to 'preload' realtime modules. */ - check_init(ast_features_init(), "Call Features"); - check_init(dnsmgr_init(), "DNS manager"); - check_init(ast_named_acl_init(), "Named ACL system"); - ast_http_init(); - check_init(ast_indications_init(), "Indication Tone Handling"); - check_init(ast_cdr_engine_init(), "CDR Engine"); - ast_dsp_init(); - ast_udptl_init(); - check_init(ast_cel_engine_init(), "CEL Engine"); - check_init(init_manager(), "Asterisk Manager Interface"); - check_init(ast_enum_init(), "ENUM Support"); - check_init(ast_cc_init(), "Call Completion Supplementary Services"); - /* Load remaining modules */ check_init(load_modules(0), "Module"); /* - * This is initialized after the dynamic modules load to avoid repeatedly - * reindexing sounds for every format module load. - */ - check_init(ast_sounds_index_init(), "Sounds Indexer"); - - /* * This has to load after the dynamic modules load, as items in the media * cache can't be constructed from items in the AstDB without their * bucket backends. diff --git a/main/bridge.c b/main/bridge.c index 4f79852cb..1109c4b76 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -5027,46 +5027,29 @@ struct ast_bridge *ast_bridge_find_by_id(const char *bridge_id) return ao2_find(bridges, bridge_id, OBJ_SEARCH_KEY); } -struct bridge_complete { - /*! Nth match to return. */ - int state; - /*! Which match currently on. */ - int which; -}; - -static int complete_bridge_live_search(void *obj, void *arg, void *data, int flags) +static int complete_bridge_live_search(void *obj, void *arg, int flags) { - struct bridge_complete *search = data; + struct ast_bridge *bridge = obj; - if (++search->which > search->state) { - return CMP_MATCH; + if (ast_cli_completion_add(ast_strdup(bridge->uniqueid))) { + return CMP_STOP; } + return 0; } -static char *complete_bridge_live(const char *word, int state) +static char *complete_bridge_live(const char *word) { - char *ret; - struct ast_bridge *bridge; - struct bridge_complete search = { - .state = state, - }; + ao2_callback(bridges, ast_strlen_zero(word) ? 0 : OBJ_PARTIAL_KEY, + complete_bridge_live_search, (char *) word); - bridge = ao2_callback_data(bridges, ast_strlen_zero(word) ? 0 : OBJ_PARTIAL_KEY, - complete_bridge_live_search, (char *) word, &search); - if (!bridge) { - return NULL; - } - ret = ast_strdup(bridge->uniqueid); - ao2_ref(bridge, -1); - return ret; + return NULL; } -static char *complete_bridge_stasis(const char *word, int state) +static char *complete_bridge_stasis(const char *word) { - char *ret = NULL; - int wordlen = strlen(word), which = 0; - RAII_VAR(struct ao2_container *, cached_bridges, NULL, ao2_cleanup); + int wordlen = strlen(word); + struct ao2_container *cached_bridges; struct ao2_iterator iter; struct stasis_message *msg; @@ -5079,15 +5062,17 @@ static char *complete_bridge_stasis(const char *word, int state) for (; (msg = ao2_iterator_next(&iter)); ao2_ref(msg, -1)) { struct ast_bridge_snapshot *snapshot = stasis_message_data(msg); - if (!strncasecmp(word, snapshot->uniqueid, wordlen) && (++which > state)) { - ret = ast_strdup(snapshot->uniqueid); - ao2_ref(msg, -1); - break; + if (!strncasecmp(word, snapshot->uniqueid, wordlen)) { + if (ast_cli_completion_add(ast_strdup(snapshot->uniqueid))) { + ao2_ref(msg, -1); + break; + } } } ao2_iterator_destroy(&iter); + ao2_ref(cached_bridges, -1); - return ret; + return NULL; } static char *handle_bridge_show_all(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) @@ -5168,7 +5153,7 @@ static char *handle_bridge_show_specific(struct ast_cli_entry *e, int cmd, struc return NULL; case CLI_GENERATE: if (a->pos == 2) { - return complete_bridge_stasis(a->word, a->n); + return complete_bridge_stasis(a->word); } return NULL; } @@ -5207,7 +5192,7 @@ static char *handle_bridge_destroy_specific(struct ast_cli_entry *e, int cmd, st return NULL; case CLI_GENERATE: if (a->pos == 2) { - return complete_bridge_live(a->word, a->n); + return complete_bridge_live(a->word); } return NULL; } @@ -5229,11 +5214,10 @@ static char *handle_bridge_destroy_specific(struct ast_cli_entry *e, int cmd, st } #endif -static char *complete_bridge_participant(const char *bridge_name, const char *line, const char *word, int pos, int state) +static char *complete_bridge_participant(const char *bridge_name, const char *word) { struct ast_bridge *bridge; struct ast_bridge_channel *bridge_channel; - int which; int wordlen; bridge = ast_bridge_find_by_id(bridge_name); @@ -5241,19 +5225,17 @@ static char *complete_bridge_participant(const char *bridge_name, const char *li return NULL; } - { - SCOPED_LOCK(bridge_lock, bridge, ast_bridge_lock, ast_bridge_unlock); + wordlen = strlen(word); - which = 0; - wordlen = strlen(word); - AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) { - if (!strncasecmp(ast_channel_name(bridge_channel->chan), word, wordlen) - && ++which > state) { - ao2_ref(bridge, -1); - return ast_strdup(ast_channel_name(bridge_channel->chan)); + ast_bridge_lock(bridge); + AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) { + if (!strncasecmp(ast_channel_name(bridge_channel->chan), word, wordlen)) { + if (ast_cli_completion_add(ast_strdup(ast_channel_name(bridge_channel->chan)))) { + break; } } } + ast_bridge_unlock(bridge); ao2_ref(bridge, -1); @@ -5263,7 +5245,6 @@ static char *complete_bridge_participant(const char *bridge_name, const char *li static char *handle_bridge_kick_channel(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { static const char * const completions[] = { "all", NULL }; - char *complete; struct ast_bridge *bridge; switch (cmd) { @@ -5277,14 +5258,11 @@ static char *handle_bridge_kick_channel(struct ast_cli_entry *e, int cmd, struct return NULL; case CLI_GENERATE: if (a->pos == 2) { - return complete_bridge_live(a->word, a->n); + return complete_bridge_live(a->word); } if (a->pos == 3) { - complete = ast_cli_complete(a->word, completions, a->n); - if (!complete) { - complete = complete_bridge_participant(a->argv[2], a->line, a->word, a->pos, a->n - 1); - } - return complete; + ast_cli_complete(a->word, completions, -1); + return complete_bridge_participant(a->argv[2], a->word); } return NULL; } @@ -5385,24 +5363,22 @@ static char *handle_bridge_technology_show(struct ast_cli_entry *e, int cmd, str #undef FORMAT } -static char *complete_bridge_technology(const char *word, int state) +static char *complete_bridge_technology(const char *word) { struct ast_bridge_technology *cur; - char *res; - int which; int wordlen; - which = 0; wordlen = strlen(word); AST_RWLIST_RDLOCK(&bridge_technologies); AST_RWLIST_TRAVERSE(&bridge_technologies, cur, entry) { - if (!strncasecmp(cur->name, word, wordlen) && ++which > state) { - res = ast_strdup(cur->name); - AST_RWLIST_UNLOCK(&bridge_technologies); - return res; + if (!strncasecmp(cur->name, word, wordlen)) { + if (ast_cli_completion_add(ast_strdup(cur->name))) { + break; + } } } AST_RWLIST_UNLOCK(&bridge_technologies); + return NULL; } @@ -5421,7 +5397,7 @@ static char *handle_bridge_technology_suspend(struct ast_cli_entry *e, int cmd, return NULL; case CLI_GENERATE: if (a->pos == 3) { - return complete_bridge_technology(a->word, a->n); + return complete_bridge_technology(a->word); } return NULL; } diff --git a/main/ccss.c b/main/ccss.c index fa569aaa0..9cf16e34d 100644 --- a/main/ccss.c +++ b/main/ccss.c @@ -4615,7 +4615,7 @@ static struct ast_cli_entry cc_cli[] = { AST_CLI_DEFINE(handle_cc_kill, "Kill a CC transaction"), }; -static void cc_shutdown(void) +static int unload_module(void) { ast_devstate_prov_del("ccss"); ast_cc_agent_unregister(&generic_agent_callbacks); @@ -4641,30 +4641,32 @@ static void cc_shutdown(void) ao2_t_ref(generic_monitors, -1, "Unref generic_monitor container in cc_shutdown"); generic_monitors = NULL; } + + return 0; } -int ast_cc_init(void) +static int load_module(void) { int res; if (!(cc_core_instances = ao2_t_container_alloc(CC_CORE_INSTANCES_BUCKETS, cc_core_instance_hash_fn, cc_core_instance_cmp_fn, "Create core instance container"))) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (!(generic_monitors = ao2_t_container_alloc(CC_CORE_INSTANCES_BUCKETS, generic_monitor_instance_list_hash_fn, generic_monitor_instance_list_cmp_fn, "Create generic monitor container"))) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (!(cc_core_taskprocessor = ast_taskprocessor_get("CCSS_core", TPS_REF_DEFAULT))) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (!(cc_sched_context = ast_sched_context_create())) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (ast_sched_start_thread(cc_sched_context)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } res = ast_register_application2(ccreq_app, ccreq_exec, NULL, NULL, NULL); res |= ast_register_application2(cccancel_app, cccancel_exec, NULL, NULL, NULL); @@ -4680,7 +4682,12 @@ int ast_cc_init(void) initialize_cc_devstate_map(); res |= ast_devstate_prov_add("ccss", ccss_device_state); - ast_register_cleanup(cc_shutdown); - - return res; + return res ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Call Completion Supplementary Services", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/cdr.c b/main/cdr.c index 4acadf975..528673311 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -53,6 +53,7 @@ #include "asterisk/cdr.h" #include "asterisk/callerid.h" #include "asterisk/manager.h" +#include "asterisk/module.h" #include "asterisk/causes.h" #include "asterisk/linkedlists.h" #include "asterisk/utils.h" @@ -3950,18 +3951,14 @@ static char *handle_cli_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_a /*! \brief Complete user input for 'cdr show' */ static char *cli_complete_show(struct ast_cli_args *a) { - char *result = NULL; int wordlen = strlen(a->word); - int which = 0; struct ao2_iterator it_cdrs; struct cdr_object *cdr; it_cdrs = ao2_iterator_init(active_cdrs_master, 0); while ((cdr = ao2_iterator_next(&it_cdrs))) { - if (!strncasecmp(a->word, cdr->party_a.snapshot->name, wordlen) && - (++which > a->n)) { - result = ast_strdup(cdr->party_a.snapshot->name); - if (result) { + if (!strncasecmp(a->word, cdr->party_a.snapshot->name, wordlen)) { + if (ast_cli_completion_add(ast_strdup(cdr->party_a.snapshot->name))) { ao2_ref(cdr, -1); break; } @@ -3969,7 +3966,8 @@ static char *cli_complete_show(struct ast_cli_args *a) ao2_ref(cdr, -1); } ao2_iterator_destroy(&it_cdrs); - return result; + + return NULL; } static void cli_show_channels(struct ast_cli_args *a) @@ -4366,11 +4364,6 @@ static int process_config(int reload) return 0; } -static void cdr_engine_cleanup(void) -{ - destroy_subscriptions(); -} - static void cdr_engine_shutdown(void) { stasis_message_router_unsubscribe_and_join(stasis_router); @@ -4503,26 +4496,33 @@ static int cdr_toggle_runtime_options(void) return mod_cfg ? 0 : -1; } -int ast_cdr_engine_init(void) +static int unload_module(void) +{ + destroy_subscriptions(); + + return 0; +} + +static int load_module(void) { if (process_config(0)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } cdr_topic = stasis_topic_create("cdr_engine"); if (!cdr_topic) { - return -1; + return AST_MODULE_LOAD_FAILURE; } stasis_router = stasis_message_router_create(cdr_topic); if (!stasis_router) { - return -1; + return AST_MODULE_LOAD_FAILURE; } stasis_message_router_set_congestion_limits(stasis_router, -1, 10 * AST_TASKPROCESSOR_HIGH_WATER_LEVEL); if (STASIS_MESSAGE_TYPE_INIT(cdr_sync_message_type)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } stasis_message_router_add_cache_update(stasis_router, ast_channel_snapshot_type(), handle_channel_cache_message, NULL); @@ -4535,28 +4535,27 @@ int ast_cdr_engine_init(void) active_cdrs_master = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NUM_CDR_BUCKETS, cdr_master_hash_fn, NULL, cdr_master_cmp_fn); if (!active_cdrs_master) { - return -1; + return AST_MODULE_LOAD_FAILURE; } ao2_container_register("cdrs_master", active_cdrs_master, cdr_master_print_fn); active_cdrs_all = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, NUM_CDR_BUCKETS, cdr_all_hash_fn, NULL, cdr_all_cmp_fn); if (!active_cdrs_all) { - return -1; + return AST_MODULE_LOAD_FAILURE; } ao2_container_register("cdrs_all", active_cdrs_all, cdr_all_print_fn); sched = ast_sched_context_create(); if (!sched) { ast_log(LOG_ERROR, "Unable to create schedule context.\n"); - return -1; + return AST_MODULE_LOAD_FAILURE; } ast_cli_register_multiple(cli_commands, ARRAY_LEN(cli_commands)); - ast_register_cleanup(cdr_engine_cleanup); ast_register_atexit(cdr_engine_shutdown); - return cdr_toggle_runtime_options(); + return cdr_toggle_runtime_options() ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } void ast_cdr_engine_term(void) @@ -4599,7 +4598,7 @@ void ast_cdr_engine_term(void) } } -int ast_cdr_engine_reload(void) +static int reload_module(void) { struct module_config *old_mod_cfg; struct module_config *mod_cfg; @@ -4625,3 +4624,11 @@ int ast_cdr_engine_reload(void) ao2_cleanup(old_mod_cfg); return cdr_toggle_runtime_options(); } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "CDR Engine", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/cel.c b/main/cel.c index 2813e60c4..91c625a3c 100644 --- a/main/cel.c +++ b/main/cel.c @@ -38,7 +38,7 @@ #include "asterisk.h" -#include "asterisk/_private.h" +#include "asterisk/module.h" #include "asterisk/channel.h" #include "asterisk/pbx.h" @@ -1421,7 +1421,7 @@ static void destroy_subscriptions(void) cel_cel_forwarder = stasis_forward_cancel(cel_cel_forwarder); } -static void cel_engine_cleanup(void) +static int unload_module(void) { destroy_routes(); destroy_subscriptions(); @@ -1433,6 +1433,8 @@ static void cel_engine_cleanup(void) ao2_global_obj_release(cel_dialstatus_store); ao2_global_obj_release(cel_linkedids); ao2_global_obj_release(cel_backends); + + return 0; } /*! @@ -1555,7 +1557,7 @@ static int create_routes(void) AO2_STRING_FIELD_HASH_FN(cel_linkedid, id) AO2_STRING_FIELD_CMP_FN(cel_linkedid, id) -int ast_cel_engine_init(void) +static int load_module(void) { struct ao2_container *container; @@ -1563,7 +1565,7 @@ int ast_cel_engine_init(void) ao2_global_obj_replace_unref(cel_linkedids, container); ao2_cleanup(container); if (!container) { - return -1; + return AST_MODULE_LOAD_FAILURE; } container = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS, @@ -1571,26 +1573,26 @@ int ast_cel_engine_init(void) ao2_global_obj_replace_unref(cel_dialstatus_store, container); ao2_cleanup(container); if (!container) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (STASIS_MESSAGE_TYPE_INIT(cel_generic_type)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (ast_cli_register(&cli_status)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } container = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash_fn, cel_backend_cmp_fn); ao2_global_obj_replace_unref(cel_backends, container); ao2_cleanup(container); if (!container) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (aco_info_init(&cel_cfg_info)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } aco_option_register(&cel_cfg_info, "enable", ACO_EXACT, general_options, "no", OPT_BOOL_T, 1, FLDSET(struct ast_cel_general_config, enable)); @@ -1602,7 +1604,7 @@ int ast_cel_engine_init(void) struct cel_config *cel_cfg = cel_config_alloc(); if (!cel_cfg) { - return -1; + return AST_MODULE_LOAD_FAILURE; } /* We couldn't process the configuration so create a default config. */ @@ -1614,18 +1616,17 @@ int ast_cel_engine_init(void) } if (create_subscriptions()) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (ast_cel_check_enabled() && create_routes()) { - return -1; + return AST_MODULE_LOAD_FAILURE; } - ast_register_cleanup(cel_engine_cleanup); - return 0; + return AST_MODULE_LOAD_SUCCESS; } -int ast_cel_engine_reload(void) +static int reload_module(void) { unsigned int was_enabled = ast_cel_check_enabled(); unsigned int is_enabled; @@ -1745,3 +1746,11 @@ int ast_cel_backend_register(const char *name, ast_cel_backend_cb backend_callba ao2_ref(backend, -1); return 0; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "CEL Engine", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/channel.c b/main/channel.c index 304fae18a..c7847cbd4 100644 --- a/main/channel.c +++ b/main/channel.c @@ -7581,22 +7581,6 @@ static int ast_channel_hash_cb(const void *obj, const int flags) return ast_str_case_hash(name); } -int ast_plc_reload(void) -{ - struct ast_variable *var; - struct ast_flags config_flags = { 0 }; - struct ast_config *cfg = ast_config_load("codecs.conf", config_flags); - if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) - return 0; - for (var = ast_variable_browse(cfg, "plc"); var; var = var->next) { - if (!strcasecmp(var->name, "genericplc")) { - ast_set2_flag(&ast_options, ast_true(var->value), AST_OPT_FLAG_GENERIC_PLC); - } - } - ast_config_destroy(cfg); - return 0; -} - /*! * \internal * \brief Print channel object key (name). @@ -7820,8 +7804,6 @@ int ast_channels_init(void) ast_cli_register_multiple(cli_channel, ARRAY_LEN(cli_channel)); - ast_plc_reload(); - ast_register_cleanup(channels_shutdown); AST_RWLIST_HEAD_INIT(&ami_vars); diff --git a/main/config.c b/main/config.c index dfa6f0923..5adcb2386 100644 --- a/main/config.c +++ b/main/config.c @@ -30,6 +30,11 @@ <support_level>core</support_level> ***/ +/* This maintains the original "module reload extconfig" CLI command instead + * of replacing it with "module reload config". */ +#undef AST_MODULE +#define AST_MODULE "extconfig" + #include "asterisk.h" #include "asterisk/paths.h" /* use ast_config_AST_CONFIG_DIR */ @@ -54,6 +59,7 @@ #include "asterisk/astobj2.h" #include "asterisk/strings.h" /* for the ast_str_*() API */ #include "asterisk/netsock2.h" +#include "asterisk/module.h" #define MAX_NESTED_COMMENTS 128 #define COMMENT_START ";--" @@ -2875,7 +2881,7 @@ static int ast_realtime_append_mapping(const char *name, const char *driver, con return 0; } -int read_config_maps(void) +static int reload_module(void) { struct ast_config *config, *configtmp; struct ast_variable *v; @@ -3924,8 +3930,8 @@ static char *handle_cli_core_show_config_mappings(struct ast_cli_entry *e, int c static char *handle_cli_config_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct cache_file_mtime *cfmtime; - char *prev = "", *completion_value = NULL; - int wordlen, which = 0; + char *prev = ""; + int wordlen; switch (cmd) { case CLI_INIT: @@ -3943,19 +3949,20 @@ static char *handle_cli_config_reload(struct ast_cli_entry *e, int cmd, struct a AST_LIST_LOCK(&cfmtime_head); AST_LIST_TRAVERSE(&cfmtime_head, cfmtime, list) { - /* Skip duplicates - this only works because the list is sorted by filename */ - if (strcmp(cfmtime->filename, prev) == 0) { + /* Core configs cannot be reloaded */ + if (ast_strlen_zero(cfmtime->who_asked)) { continue; } - /* Core configs cannot be reloaded */ - if (ast_strlen_zero(cfmtime->who_asked)) { + /* Skip duplicates - this only works because the list is sorted by filename */ + if (!strcmp(cfmtime->filename, prev)) { continue; } - if (++which > a->n && strncmp(cfmtime->filename, a->word, wordlen) == 0) { - completion_value = ast_strdup(cfmtime->filename); - break; + if (!strncmp(cfmtime->filename, a->word, wordlen)) { + if (ast_cli_completion_add(ast_strdup(cfmtime->filename))) { + break; + } } /* Otherwise save that we've seen this filename */ @@ -3963,7 +3970,7 @@ static char *handle_cli_config_reload(struct ast_cli_entry *e, int cmd, struct a } AST_LIST_UNLOCK(&cfmtime_head); - return completion_value; + return NULL; } if (a->argc != 3) { @@ -4034,6 +4041,7 @@ static void config_shutdown(void) int register_config_cli(void) { ast_cli_register_multiple(cli_config, ARRAY_LEN(cli_config)); + /* This is separate from the module load so cleanup can happen very late. */ ast_register_cleanup(config_shutdown); return 0; } @@ -4120,3 +4128,26 @@ int ast_config_hook_register(const char *name, ao2_ref(hook, -1); return 0; } + +static int unload_module(void) +{ + return 0; +} + +static int load_module(void) +{ + if (ast_opt_console) { + ast_verb(0, "[ Initializing Custom Configuration Options ]\n"); + } + + return reload_module() ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; +} + +/* This module explicitly loads before realtime drivers. */ +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Configuration", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = 0, +); diff --git a/main/config_options.c b/main/config_options.c index 3aa00f921..41c8b222c 100644 --- a/main/config_options.c +++ b/main/config_options.c @@ -958,88 +958,79 @@ int aco_set_defaults(struct aco_type *type, const char *category, void *obj) /*! \internal * \brief Complete the name of the module the user is looking for */ -static char *complete_config_module(const char *word, int pos, int state) +static char *complete_config_module(const char *word) { - char *c = NULL; size_t wordlen = strlen(word); - int which = 0; struct ao2_iterator i; struct ast_xml_doc_item *cur; - if (pos != 3) { - return NULL; - } - i = ao2_iterator_init(xmldocs, 0); while ((cur = ao2_iterator_next(&i))) { - if (!strncasecmp(word, cur->name, wordlen) && ++which > state) { - c = ast_strdup(cur->name); - ao2_ref(cur, -1); - break; + if (!strncasecmp(word, cur->name, wordlen)) { + if (ast_cli_completion_add(ast_strdup(cur->name))) { + ao2_ref(cur, -1); + break; + } } ao2_ref(cur, -1); } ao2_iterator_destroy(&i); - return c; + return NULL; } /*! \internal * \brief Complete the name of the configuration type the user is looking for */ -static char *complete_config_type(const char *module, const char *word, int pos, int state) +static char *complete_config_type(const char *module, const char *word) { - char *c = NULL; size_t wordlen = strlen(word); - int which = 0; - RAII_VAR(struct ast_xml_doc_item *, info, NULL, ao2_cleanup); + struct ast_xml_doc_item *info; struct ast_xml_doc_item *cur; - if (pos != 4) { - return NULL; - } - - if (!(info = ao2_find(xmldocs, module, OBJ_KEY))) { + info = ao2_find(xmldocs, module, OBJ_KEY); + if (!info) { return NULL; } cur = info; while ((cur = AST_LIST_NEXT(cur, next))) { - if (!strcasecmp(cur->type, "configObject") && !strncasecmp(word, cur->name, wordlen) && ++which > state) { - c = ast_strdup(cur->name); - break; + if (!strcasecmp(cur->type, "configObject") && !strncasecmp(word, cur->name, wordlen)) { + if (ast_cli_completion_add(ast_strdup(cur->name))) { + break; + } } } - return c; + ao2_ref(info, -1); + + return NULL; } /*! \internal * \brief Complete the name of the configuration option the user is looking for */ -static char *complete_config_option(const char *module, const char *option, const char *word, int pos, int state) +static char *complete_config_option(const char *module, const char *option, const char *word) { - char *c = NULL; size_t wordlen = strlen(word); - int which = 0; - RAII_VAR(struct ast_xml_doc_item *, info, NULL, ao2_cleanup); + struct ast_xml_doc_item *info; struct ast_xml_doc_item *cur; - if (pos != 5) { - return NULL; - } - - if (!(info = ao2_find(xmldocs, module, OBJ_KEY))) { + info = ao2_find(xmldocs, module, OBJ_KEY); + if (!info) { return NULL; } cur = info; while ((cur = AST_LIST_NEXT(cur, next))) { - if (!strcasecmp(cur->type, "configOption") && !strcasecmp(cur->ref, option) && !strncasecmp(word, cur->name, wordlen) && ++which > state) { - c = ast_strdup(cur->name); - break; + if (!strcasecmp(cur->type, "configOption") && !strcasecmp(cur->ref, option) && !strncasecmp(word, cur->name, wordlen)) { + if (ast_cli_completion_add(ast_strdup(cur->name))) { + break; + } } } - return c; + ao2_ref(info, -1); + + return NULL; } /* Define as 0 if we want to allow configurations to be registered without @@ -1340,10 +1331,14 @@ static char *cli_show_help(struct ast_cli_entry *e, int cmd, struct ast_cli_args return NULL; case CLI_GENERATE: switch(a->pos) { - case 3: return complete_config_module(a->word, a->pos, a->n); - case 4: return complete_config_type(a->argv[3], a->word, a->pos, a->n); - case 5: return complete_config_option(a->argv[3], a->argv[4], a->word, a->pos, a->n); - default: return NULL; + case 3: + return complete_config_module(a->word); + case 4: + return complete_config_type(a->argv[3], a->word); + case 5: + return complete_config_option(a->argv[3], a->argv[4], a->word); + default: + return NULL; } } diff --git a/main/dnsmgr.c b/main/dnsmgr.c index 0e5efd6da..c25b601b3 100644 --- a/main/dnsmgr.c +++ b/main/dnsmgr.c @@ -49,6 +49,7 @@ #include <regex.h> #include <signal.h> +#include "asterisk/module.h" #include "asterisk/dnsmgr.h" #include "asterisk/linkedlists.h" #include "asterisk/utils.h" @@ -406,7 +407,7 @@ static struct ast_cli_entry cli_reload = AST_CLI_DEFINE(handle_cli_reload, "Relo static struct ast_cli_entry cli_refresh = AST_CLI_DEFINE(handle_cli_refresh, "Performs an immediate refresh"); static struct ast_cli_entry cli_status = AST_CLI_DEFINE(handle_cli_status, "Display the DNS manager status"); -static void dnsmgr_shutdown(void) +static int unload_module(void) { ast_cli_unregister(&cli_reload); ast_cli_unregister(&cli_status); @@ -424,24 +425,24 @@ static void dnsmgr_shutdown(void) ast_mutex_unlock(&refresh_lock); ast_sched_context_destroy(sched); + + return 0; } -int dnsmgr_init(void) +static int load_module(void) { if (!(sched = ast_sched_context_create())) { ast_log(LOG_ERROR, "Unable to create schedule context.\n"); - return -1; + return AST_MODULE_LOAD_FAILURE; } ast_cli_register(&cli_reload); ast_cli_register(&cli_status); ast_cli_register(&cli_refresh); - ast_register_cleanup(dnsmgr_shutdown); - - return do_reload(1); + return do_reload(1) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } -int dnsmgr_reload(void) +static int reload_module(void) { return do_reload(0); } @@ -515,3 +516,11 @@ static int do_reload(int loading) return 0; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "DNS Manager", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/dsp.c b/main/dsp.c index 66d95adc2..ea653d857 100644 --- a/main/dsp.c +++ b/main/dsp.c @@ -57,6 +57,7 @@ #include <math.h> +#include "asterisk/module.h" #include "asterisk/frame.h" #include "asterisk/format_cache.h" #include "asterisk/channel.h" @@ -1331,10 +1332,11 @@ int ast_dsp_busydetect(struct ast_dsp *dsp) #ifndef BUSYDETECT_TONEONLY if ((hittone >= dsp->busycount - 1) && (hitsilence >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX) && - (avgsilence >= BUSY_MIN && avgsilence <= BUSY_MAX)) { + (avgsilence >= BUSY_MIN && avgsilence <= BUSY_MAX)) #else - if ((hittone >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX)) { + if ((hittone >= dsp->busycount - 1) && (avgtone >= BUSY_MIN && avgtone <= BUSY_MAX)) #endif + { #ifdef BUSYDETECT_COMPARE_TONE_AND_SILENCE if (avgtone > avgsilence) { if (avgtone - avgtone*BUSY_PERCENT/100 <= avgsilence) { @@ -2392,31 +2394,35 @@ AST_TEST_DEFINE(test_dsp_dtmf_detect) } #endif -#ifdef TEST_FRAMEWORK -static void test_dsp_shutdown(void) +static int unload_module(void) { AST_TEST_UNREGISTER(test_dsp_fax_detect); AST_TEST_UNREGISTER(test_dsp_dtmf_detect); + + return 0; } -#endif -int ast_dsp_init(void) +static int load_module(void) { if (_dsp_init(0)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } -#ifdef TEST_FRAMEWORK AST_TEST_REGISTER(test_dsp_fax_detect); AST_TEST_REGISTER(test_dsp_dtmf_detect); - ast_register_cleanup(test_dsp_shutdown); -#endif - - return 0; + return AST_MODULE_LOAD_SUCCESS; } -int ast_dsp_reload(void) +static int reload_module(void) { return _dsp_init(1); } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "DSP", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/enum.c b/main/enum.c index 5c217c43c..a44a60cbe 100644 --- a/main/enum.c +++ b/main/enum.c @@ -70,6 +70,7 @@ #include <ctype.h> #include <regex.h> +#include "asterisk/module.h" #include "asterisk/enum.h" #include "asterisk/dns.h" #include "asterisk/channel.h" @@ -1008,12 +1009,25 @@ static int private_enum_init(int reload) return 0; } -int ast_enum_init(void) +static int load_module(void) { - return private_enum_init(0); + return private_enum_init(0) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } -int ast_enum_reload(void) +static int unload_module(void) +{ + return 0; +} + +static int reload_module(void) { return private_enum_init(1); } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "ENUM Support", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/features.c b/main/features.c index 35039e0fa..3db6d397b 100644 --- a/main/features.c +++ b/main/features.c @@ -40,6 +40,7 @@ #include "asterisk.h" #include "asterisk/_private.h" +#include "features_config.h" #include <pthread.h> #include <signal.h> @@ -1145,29 +1146,32 @@ done: return 0; } -/*! - * \internal - * \brief Clean up resources on Asterisk shutdown - */ -static void features_shutdown(void) +static int unload_module(void) { - ast_features_config_shutdown(); + unload_features_config(); ast_manager_unregister("Bridge"); ast_unregister_application(app_bridge); + return 0; } -int ast_features_init(void) +static int load_module(void) { int res; - res = ast_features_config_init(); + res = load_features_config(); res |= ast_register_application2(app_bridge, bridge_exec, NULL, NULL, NULL); res |= ast_manager_register_xml_core("Bridge", EVENT_FLAG_CALL, action_bridge); - ast_register_cleanup(features_shutdown); - - return res; + return res ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Call Features", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_features_config, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/features_config.c b/main/features_config.c index 195fbaceb..f116e89d5 100644 --- a/main/features_config.c +++ b/main/features_config.c @@ -26,6 +26,8 @@ #include "asterisk/app.h" #include "asterisk/cli.h" +#include "features_config.h" + /*** DOCUMENTATION <configInfo name="features" language="en_US"> <synopsis>Features Configuration</synopsis> @@ -1971,7 +1973,7 @@ static struct ast_cli_entry cli_features_config[] = { AST_CLI_DEFINE(handle_feature_show, "Lists configured features"), }; -void ast_features_config_shutdown(void) +void unload_features_config(void) { ast_custom_function_unregister(&featuremap_function); ast_custom_function_unregister(&feature_function); @@ -1980,7 +1982,7 @@ void ast_features_config_shutdown(void) ao2_global_obj_release(globals); } -int ast_features_config_reload(void) +int reload_features_config(void) { /* Rearm the parking config options have moved warning. */ parking_warning = 0; @@ -1991,7 +1993,7 @@ int ast_features_config_reload(void) return 0; } -int ast_features_config_init(void) +int load_features_config(void) { int res; diff --git a/main/features_config.h b/main/features_config.h new file mode 100644 index 000000000..8e9e4acb3 --- /dev/null +++ b/main/features_config.h @@ -0,0 +1,28 @@ +/* +* Asterisk -- An open source telephony toolkit. +* +* Copyright (C) 2018, CFWare, LLC. +* +* Corey Farrell <git@cfware.com> +* +* 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. +*/ + +#ifndef FEATURES_CONFIG_H_ +#define FEATURES_CONFIG_H_ + +int load_features_config(void); + +int reload_features_config(void); + +void unload_features_config(void); + +#endif /* FEATURES_CONFIG_H_ */ diff --git a/main/http.c b/main/http.c index 30b2fe2c4..55d10290b 100644 --- a/main/http.c +++ b/main/http.c @@ -60,7 +60,7 @@ #include "asterisk/stringfields.h" #include "asterisk/ast_version.h" #include "asterisk/manager.h" -#include "asterisk/_private.h" +#include "asterisk/module.h" #include "asterisk/astobj2.h" #include "asterisk/netsock2.h" #include "asterisk/json.h" @@ -2264,7 +2264,7 @@ static char *handle_show_http(struct ast_cli_entry *e, int cmd, struct ast_cli_a return CLI_SUCCESS; } -int ast_http_reload(void) +static int reload_module(void) { return __ast_http_load(1); } @@ -2273,7 +2273,7 @@ static struct ast_cli_entry cli_http[] = { AST_CLI_DEFINE(handle_show_http, "Display HTTP server status"), }; -static void http_shutdown(void) +static int unload_module(void) { struct http_uri_redirect *redirect; ast_cli_unregister_multiple(cli_http, ARRAY_LEN(cli_http)); @@ -2295,14 +2295,23 @@ static void http_shutdown(void) ast_free(redirect); } AST_RWLIST_UNLOCK(&uri_redirects); + + return 0; } -int ast_http_init(void) +static int load_module(void) { ast_http_uri_link(&statusuri); ast_http_uri_link(&staticuri); ast_cli_register_multiple(cli_http, ARRAY_LEN(cli_http)); - ast_register_cleanup(http_shutdown); - return __ast_http_load(0); + return __ast_http_load(0) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Built-in HTTP Server", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/indications.c b/main/indications.c index 89710584b..9b0976809 100644 --- a/main/indications.c +++ b/main/indications.c @@ -1114,7 +1114,7 @@ static int ast_tone_zone_cmp(void *obj, void *arg, int flags) * \internal * \brief Clean up resources on Asterisk shutdown */ -static void indications_shutdown(void) +static int unload_module(void) { ast_cli_unregister_multiple(cli_indications, ARRAY_LEN(cli_indications)); if (default_tone_zone) { @@ -1125,29 +1125,38 @@ static void indications_shutdown(void) ao2_ref(ast_tone_zones, -1); ast_tone_zones = NULL; } + + return 0; } /*! \brief Load indications module */ -int ast_indications_init(void) +static int load_module(void) { ast_tone_zones = ao2_container_alloc(NUM_TONE_ZONE_BUCKETS, ast_tone_zone_hash, ast_tone_zone_cmp); if (!ast_tone_zones) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (load_indications(0)) { - return -1; + return AST_MODULE_LOAD_FAILURE; } ast_cli_register_multiple(cli_indications, ARRAY_LEN(cli_indications)); - ast_register_cleanup(indications_shutdown); - return 0; + return AST_MODULE_LOAD_SUCCESS; } /*! \brief Reload indications module */ -int ast_indications_reload(void) +static int reload_module(void) { return load_indications(1); } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Indication Tone Handling", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/loader.c b/main/loader.c index 08d9552ff..bc7896205 100644 --- a/main/loader.c +++ b/main/loader.c @@ -42,19 +42,12 @@ #include "asterisk/config.h" #include "asterisk/channel.h" #include "asterisk/term.h" -#include "asterisk/acl.h" #include "asterisk/manager.h" -#include "asterisk/cdr.h" -#include "asterisk/enum.h" -#include "asterisk/http.h" +#include "asterisk/io.h" #include "asterisk/lock.h" -#include "asterisk/features_config.h" -#include "asterisk/dsp.h" -#include "asterisk/udptl.h" #include "asterisk/vector.h" #include "asterisk/app.h" #include "asterisk/test.h" -#include "asterisk/sounds_index.h" #include "asterisk/cli.h" #include <dlfcn.h> @@ -513,10 +506,11 @@ void ast_module_register(const struct ast_module_info *info) struct ast_module *mod; if (!loader_ready) { - mod = ast_calloc(1, sizeof(*mod) + strlen(info->name) + 1); + mod = ast_std_calloc(1, sizeof(*mod) + strlen(info->name) + 1); if (!mod) { /* We haven't even reached main() yet, if we can't * allocate memory at this point just give up. */ + fprintf(stderr, "Allocation failure during startup.\n"); exit(2); } strcpy(mod->resource, info->name); /* safe */ @@ -580,7 +574,11 @@ static void module_destroy(struct ast_module *mod) AST_LIST_HEAD_DESTROY(&mod->users); ao2_cleanup(mod->ref_debug); - ast_free(mod); + if (mod->flags.builtin) { + ast_std_free(mod); + } else { + ast_free(mod); + } } void ast_module_unregister(const struct ast_module_info *info) @@ -690,33 +688,6 @@ void __ast_module_user_hangup_all(struct ast_module *mod) ast_update_use_count(); } -/*! \note - * In addition to modules, the reload command handles some extra keywords - * which are listed here together with the corresponding handlers. - * This table is also used by the command completion code. - */ -static struct reload_classes { - const char *name; - int (*reload_fn)(void); -} reload_classes[] = { /* list in alpha order, longest match first for cli completion */ - { "acl", ast_named_acl_reload }, - { "cdr", ast_cdr_engine_reload }, - { "cel", ast_cel_engine_reload }, - { "dnsmgr", dnsmgr_reload }, - { "dsp", ast_dsp_reload}, - { "extconfig", read_config_maps }, - { "enum", ast_enum_reload }, - { "features", ast_features_config_reload }, - { "http", ast_http_reload }, - { "indications", ast_indications_reload }, - { "logger", logger_reload }, - { "manager", reload_manager }, - { "plc", ast_plc_reload }, - { "sounds", ast_sounds_reindex }, - { "udptl", ast_udptl_reload }, - { NULL, NULL } -}; - static int printdigest(const unsigned char *d) { int x, pos; @@ -1160,16 +1131,6 @@ char *ast_module_helper(const char *line, const char *word, int pos, int state, return NULL; } - if (type == AST_MODULE_HELPER_RELOAD) { - int idx; - - for (idx = 0; reload_classes[idx].name; idx++) { - if (!strncasecmp(word, reload_classes[idx].name, wordlen) && ++which > state) { - return ast_strdup(reload_classes[idx].name); - } - } - } - AST_DLLIST_LOCK(&module_list); AST_DLLIST_TRAVERSE(&module_list, mod, entry) { if (!module_matches_helper_type(mod, type)) { @@ -1345,7 +1306,6 @@ enum ast_module_reload_result ast_module_reload(const char *name) { struct ast_module *cur; enum ast_module_reload_result res = AST_MODULE_RELOAD_NOT_FOUND; - int i; size_t name_baselen = name ? resource_name_baselen(name) : 0; /* If we aren't fully booted, we just pretend we reloaded but we queue this @@ -1380,22 +1340,6 @@ enum ast_module_reload_result ast_module_reload(const char *name) } } - /* Call "predefined" reload here first */ - for (i = 0; reload_classes[i].name; i++) { - if (!name || !strcasecmp(name, reload_classes[i].name)) { - if (reload_classes[i].reload_fn() == AST_MODULE_LOAD_SUCCESS) { - res = AST_MODULE_RELOAD_SUCCESS; - } - } - } - - if (name && res == AST_MODULE_RELOAD_SUCCESS) { - if (ast_opt_lock_confdir) { - ast_unlock_path(ast_config_AST_CONFIG_DIR); - } - goto module_reload_done; - } - AST_DLLIST_LOCK(&module_list); AST_DLLIST_TRAVERSE(&module_list, cur, entry) { const struct ast_module_info *info = cur->info; @@ -1516,6 +1460,10 @@ static enum ast_module_load_result start_resource(struct ast_module *mod) } mod->flags.running = 1; + if (mod->flags.builtin) { + /* Built-in modules cannot be unloaded. */ + ast_module_shutdown_ref(mod); + } ast_update_use_count(); break; @@ -1881,6 +1829,19 @@ int load_modules(unsigned int preload_only) ast_module_register(resource_being_loaded->info); } + if (!preload_only) { + struct ast_module *mod; + + /* Add all built-in modules to the load order. */ + AST_DLLIST_TRAVERSE(&module_list, mod, entry) { + if (!mod->flags.builtin) { + continue; + } + + add_to_load_order(mod->resource, &load_order, 0); + } + } + cfg = ast_config_load2(AST_MODULE_CONFIG, "" /* core, can't reload */, config_flags); if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) { ast_log(LOG_WARNING, "No '%s' found, no modules will be loaded.\n", AST_MODULE_CONFIG); diff --git a/main/logger.c b/main/logger.c index 6060b3c4d..46d61ed33 100644 --- a/main/logger.c +++ b/main/logger.c @@ -49,6 +49,7 @@ #include <fcntl.h> #include "asterisk/_private.h" +#include "asterisk/module.h" #include "asterisk/paths.h" /* use ast_config_AST_LOG_DIR */ #include "asterisk/logger.h" #include "asterisk/lock.h" @@ -1125,16 +1126,6 @@ static int reload_logger(int rotate, const char *altconf) return res; } -/*! \brief Reload the logger module without rotating log files (also used from loader.c during - a full Asterisk reload) */ -int logger_reload(void) -{ - if (reload_logger(0, NULL)) { - return RESULT_FAILURE; - } - return RESULT_SUCCESS; -} - static char *handle_logger_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { switch (cmd) { @@ -2369,3 +2360,27 @@ int ast_logger_get_queue_limit(void) { return logger_queue_limit; } + +static int reload_module(void) +{ + return reload_logger(0, NULL); +} + +static int unload_module(void) +{ + return 0; +} + +static int load_module(void) +{ + return AST_MODULE_LOAD_SUCCESS; +} + +/* Logger is initialized separate from the module loader, only reload_module does anything. */ +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Logger", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = 0, +); diff --git a/main/manager.c b/main/manager.c index b698702af..64b07d319 100644 --- a/main/manager.c +++ b/main/manager.c @@ -2710,6 +2710,8 @@ static char *handle_showmaneventq(struct ast_cli_entry *e, int cmd, struct ast_c return CLI_SUCCESS; } +static int reload_module(void); + /*! \brief CLI command manager reload */ static char *handle_manager_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { @@ -2726,7 +2728,7 @@ static char *handle_manager_reload(struct ast_cli_entry *e, int cmd, struct ast_ if (a->argc > 2) { return CLI_SHOWUSAGE; } - reload_manager(); + reload_module(); return CLI_SUCCESS; } @@ -8971,8 +8973,6 @@ static int __init_manager(int reload, int by_external_config) #endif int res; - ast_register_cleanup(manager_shutdown); - res = STASIS_MESSAGE_TYPE_INIT(ast_manager_get_generic_type); if (res != 0) { return -1; @@ -9455,12 +9455,19 @@ static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, __init_manager(1, 1); } -int init_manager(void) +static int unload_module(void) +{ + return 0; +} + +static int load_module(void) { - return __init_manager(0, 0); + ast_register_cleanup(manager_shutdown); + + return __init_manager(0, 0) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } -int reload_manager(void) +static int reload_module(void) { return __init_manager(1, 0); } @@ -9557,3 +9564,12 @@ ast_manager_event_blob_create( return ev; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Asterisk Manager Interface", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, + .requires = "http", +); diff --git a/main/named_acl.c b/main/named_acl.c index 3a4c45401..4f2069a75 100644 --- a/main/named_acl.c +++ b/main/named_acl.c @@ -27,6 +27,11 @@ * Olle E. Johansson <oej@edvina.net> */ +/* This maintains the original "module reload acl" CLI command instead + * of replacing it with "module reload named_acl". */ +#undef AST_MODULE +#define AST_MODULE "acl" + #include "asterisk.h" #include "asterisk/config.h" @@ -397,36 +402,6 @@ publish_failure: /*! * \internal - * \brief reload configuration for named ACLs - * - * \param fd file descriptor for CLI client - */ -int ast_named_acl_reload(void) -{ - enum aco_process_status status; - - status = aco_process_config(&cfg_info, 1); - - if (status == ACO_PROCESS_ERROR) { - ast_log(LOG_WARNING, "Could not reload ACL config\n"); - return 0; - } - - if (status == ACO_PROCESS_UNCHANGED) { - /* We don't actually log anything if the config was unchanged, - * but we don't need to send a config change event either. - */ - return 0; - } - - /* We need to push an ACL change event with no ACL name so that all subscribers update with all ACLs */ - publish_acl_change(""); - - return 0; -} - -/*! - * \internal * \brief secondary handler for the 'acl show <name>' command (with arg) * * \param fd file descriptor of the cli @@ -552,32 +527,64 @@ static struct ast_cli_entry cli_named_acl[] = { AST_CLI_DEFINE(handle_show_named_acl_cmd, "Show a named ACL or list all named ACLs"), }; -static void named_acl_cleanup(void) +static int reload_module(void) +{ + enum aco_process_status status; + + status = aco_process_config(&cfg_info, 1); + + if (status == ACO_PROCESS_ERROR) { + ast_log(LOG_WARNING, "Could not reload ACL config\n"); + return 0; + } + + if (status == ACO_PROCESS_UNCHANGED) { + /* We don't actually log anything if the config was unchanged, + * but we don't need to send a config change event either. + */ + return 0; + } + + /* We need to push an ACL change event with no ACL name so that all subscribers update with all ACLs */ + publish_acl_change(""); + + return 0; +} + +static int unload_module(void) { ast_cli_unregister_multiple(cli_named_acl, ARRAY_LEN(cli_named_acl)); STASIS_MESSAGE_TYPE_CLEANUP(ast_named_acl_change_type); aco_info_destroy(&cfg_info); ao2_global_obj_release(globals); + + return 0; } -int ast_named_acl_init() +static int load_module(void) { - ast_cli_register_multiple(cli_named_acl, ARRAY_LEN(cli_named_acl)); - - STASIS_MESSAGE_TYPE_INIT(ast_named_acl_change_type); - - ast_register_cleanup(named_acl_cleanup); - if (aco_info_init(&cfg_info)) { - return 0; + return AST_MODULE_LOAD_FAILURE; } + STASIS_MESSAGE_TYPE_INIT(ast_named_acl_change_type); + /* Register the per level options. */ aco_option_register(&cfg_info, "permit", ACO_EXACT, named_acl_types, NULL, OPT_ACL_T, 1, FLDSET(struct named_acl, ha)); aco_option_register(&cfg_info, "deny", ACO_EXACT, named_acl_types, NULL, OPT_ACL_T, 0, FLDSET(struct named_acl, ha)); aco_process_config(&cfg_info, 0); - return 0; + ast_cli_register_multiple(cli_named_acl, ARRAY_LEN(cli_named_acl)); + + return AST_MODULE_LOAD_SUCCESS; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Named ACL system", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/plc.c b/main/plc.c index 2a8279f46..847ce65b0 100644 --- a/main/plc.c +++ b/main/plc.c @@ -38,6 +38,8 @@ #include <math.h> +#include "asterisk/config.h" +#include "asterisk/module.h" #include "asterisk/plc.h" #if !defined(FALSE) @@ -246,3 +248,43 @@ plc_state_t *plc_init(plc_state_t *s) } /*- End of function --------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/ + +static int reload_module(void) +{ + struct ast_variable *var; + struct ast_flags config_flags = { 0 }; + struct ast_config *cfg = ast_config_load("codecs.conf", config_flags); + + if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) { + return 0; + } + + for (var = ast_variable_browse(cfg, "plc"); var; var = var->next) { + if (!strcasecmp(var->name, "genericplc")) { + ast_set2_flag(&ast_options, ast_true(var->value), AST_OPT_FLAG_GENERIC_PLC); + } + } + ast_config_destroy(cfg); + + return 0; +} + +static int load_module(void) +{ + reload_module(); + + return AST_MODULE_LOAD_SUCCESS; +} + +static int unload_module(void) +{ + return 0; +} + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "PLC", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/main/sounds.c b/main/sounds.c index c792c1bbd..08e29275e 100644 --- a/main/sounds.c +++ b/main/sounds.c @@ -34,7 +34,7 @@ #include "asterisk/sounds_index.h" #include "asterisk/file.h" #include "asterisk/cli.h" -#include "asterisk/_private.h" +#include "asterisk/module.h" #include "asterisk/stasis_message_router.h" #include "asterisk/stasis_system.h" @@ -111,7 +111,7 @@ static int update_index_cb(void *obj, void *arg, int flags) AST_MUTEX_DEFINE_STATIC(reload_lock); -int ast_sounds_reindex(void) +static int reload_module(void) { RAII_VAR(struct ast_str *, sounds_dir, NULL, ast_free); RAII_VAR(struct ao2_container *, languages, NULL, ao2_cleanup); @@ -273,13 +273,15 @@ static struct ast_cli_entry cli_sounds[] = { AST_CLI_DEFINE(handle_cli_sound_show, "Shows details about a specific sound"), }; -static void sounds_cleanup(void) +static int unload_module(void) { stasis_message_router_unsubscribe_and_join(sounds_system_router); sounds_system_router = NULL; ast_cli_unregister_multiple(cli_sounds, ARRAY_LEN(cli_sounds)); ao2_cleanup(sounds_index); sounds_index = NULL; + + return 0; } static void format_update_cb(void *data, struct stasis_subscription *sub, @@ -287,21 +289,21 @@ static void format_update_cb(void *data, struct stasis_subscription *sub, { /* Reindexing during shutdown is pointless. */ if (!ast_shutting_down()) { - ast_sounds_reindex(); + reload_module(); } } -int ast_sounds_index_init(void) +static int load_module(void) { int res = 0; - if (ast_sounds_reindex()) { - return -1; + if (reload_module()) { + return AST_MODULE_LOAD_FAILURE; } res |= ast_cli_register_multiple(cli_sounds, ARRAY_LEN(cli_sounds)); sounds_system_router = stasis_message_router_create(ast_system_topic()); if (!sounds_system_router) { - return -1; + return AST_MODULE_LOAD_FAILURE; } if (ast_format_register_type()) { @@ -320,15 +322,19 @@ int ast_sounds_index_init(void) NULL); } - if (res) { - return -1; - } - - ast_register_cleanup(sounds_cleanup); - return 0; + return res ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS; } struct ast_media_index *ast_sounds_get_index(void) { return ao2_bump(sounds_index); } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Sounds Index", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + /* Load after the format modules to reduce processing during startup. */ + .load_pri = AST_MODPRI_APP_DEPEND + 1, +); diff --git a/main/stringfields.c b/main/stringfields.c index 30aa8cddd..0a9e59903 100644 --- a/main/stringfields.c +++ b/main/stringfields.c @@ -179,11 +179,6 @@ int __ast_string_field_init(struct ast_string_field_mgr *mgr, struct ast_string_ } mgr->last_alloc = NULL; - /* v-- MALLOC_DEBUG information */ - mgr->owner_file = file; - mgr->owner_func = func; - mgr->owner_line = lineno; - /* ^-- MALLOC_DEBUG information */ if (AST_VECTOR_INIT(&mgr->string_fields, initial_vector_size)) { return -1; @@ -205,7 +200,8 @@ int __ast_string_field_init(struct ast_string_field_mgr *mgr, struct ast_string_ } ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr, - struct ast_string_field_pool **pool_head, size_t needed) + struct ast_string_field_pool **pool_head, size_t needed, + const char *file, int lineno, const char *func) { char *result = NULL; size_t space = (*pool_head)->size - (*pool_head)->used; @@ -222,8 +218,7 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr new_size *= 2; } - if (add_string_pool(mgr, pool_head, new_size, - mgr->owner_file, mgr->owner_line, mgr->owner_func)) { + if (add_string_pool(mgr, pool_head, new_size, file, lineno, func)) { return NULL; } } @@ -290,7 +285,8 @@ void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, void __ast_string_field_ptr_build_va(struct ast_string_field_mgr *mgr, struct ast_string_field_pool **pool_head, ast_string_field *ptr, - const char *format, va_list ap) + const char *format, va_list ap, + const char *file, int lineno, const char *func) { size_t needed; size_t available; @@ -342,7 +338,8 @@ void __ast_string_field_ptr_build_va(struct ast_string_field_mgr *mgr, (if it has one), or the space available in the pool (if it does not). allocate space for it, adding a new string pool if necessary. */ - if (!(target = (char *) __ast_string_field_alloc_space(mgr, pool_head, needed))) { + target = (char *) __ast_string_field_alloc_space(mgr, pool_head, needed, file, lineno, func); + if (!target) { return; } vsprintf(target, format, ap); @@ -369,13 +366,14 @@ void __ast_string_field_ptr_build_va(struct ast_string_field_mgr *mgr, } } -void __ast_string_field_ptr_build(struct ast_string_field_mgr *mgr, +void __ast_string_field_ptr_build(const char *file, int lineno, const char *func, + struct ast_string_field_mgr *mgr, struct ast_string_field_pool **pool_head, ast_string_field *ptr, const char *format, ...) { va_list ap; va_start(ap, format); - __ast_string_field_ptr_build_va(mgr, pool_head, ptr, format, ap); + __ast_string_field_ptr_build_va(mgr, pool_head, ptr, format, ap, file, lineno, func); va_end(ap); } @@ -419,11 +417,6 @@ void *__ast_calloc_with_stringfields(unsigned int num_structs, size_t struct_siz mgr->embedded_pool = pool; *pool_head = pool; pool->size = size_to_alloc - struct_size - sizeof(*pool); - /* v-- MALLOC_DEBUG information */ - mgr->owner_file = file; - mgr->owner_func = func; - mgr->owner_line = lineno; - /* ^-- MALLOC_DEBUG information */ return allocation; } @@ -446,7 +439,8 @@ int __ast_string_fields_cmp(struct ast_string_field_vector *left, } int __ast_string_fields_copy(struct ast_string_field_pool *copy_pool, - struct ast_string_field_mgr *copy_mgr, struct ast_string_field_mgr *orig_mgr) + struct ast_string_field_mgr *copy_mgr, struct ast_string_field_mgr *orig_mgr, + const char *file, int lineno, const char *func) { int i; struct ast_string_field_vector *dest = &(copy_mgr->string_fields); @@ -460,8 +454,8 @@ int __ast_string_fields_copy(struct ast_string_field_pool *copy_pool, } for (i = 0; i < AST_VECTOR_SIZE(dest); i++) { - if (ast_string_field_ptr_set_by_fields(copy_pool, *copy_mgr, AST_VECTOR_GET(dest, i), - *AST_VECTOR_GET(src, i))) { + if (__ast_string_field_ptr_set_by_fields(copy_pool, *copy_mgr, AST_VECTOR_GET(dest, i), + *AST_VECTOR_GET(src, i), file, lineno, func)) { return -1; } } diff --git a/main/taskprocessor.c b/main/taskprocessor.c index cf82efff2..91eb7d993 100644 --- a/main/taskprocessor.c +++ b/main/taskprocessor.c @@ -341,26 +341,27 @@ static void *tps_task_free(struct tps_task *task) static char *tps_taskprocessor_tab_complete(struct ast_cli_args *a) { int tklen; - int wordnum = 0; struct ast_taskprocessor *p; - char *name = NULL; struct ao2_iterator i; - if (a->pos != 3) + if (a->pos != 3) { return NULL; + } tklen = strlen(a->word); i = ao2_iterator_init(tps_singletons, 0); while ((p = ao2_iterator_next(&i))) { - if (!strncasecmp(a->word, p->name, tklen) && ++wordnum > a->n) { - name = ast_strdup(p->name); - ast_taskprocessor_unreference(p); - break; + if (!strncasecmp(a->word, p->name, tklen)) { + if (ast_cli_completion_add(ast_strdup(p->name))) { + ast_taskprocessor_unreference(p); + break; + } } ast_taskprocessor_unreference(p); } ao2_iterator_destroy(&i); - return name; + + return NULL; } /* ping task handling function */ diff --git a/main/translate.c b/main/translate.c index 226d0985d..396c5522e 100644 --- a/main/translate.c +++ b/main/translate.c @@ -900,9 +900,9 @@ const char *ast_translate_path_to_str(struct ast_trans_pvt *p, struct ast_str ** return ast_str_buffer(*str); } -static char *complete_trans_path_choice(const char *line, const char *word, int pos, int state) +static char *complete_trans_path_choice(const char *word) { - int i = 1, which = 0; + int i = 1; int wordlen = strlen(word); struct ast_codec *codec; @@ -912,13 +912,15 @@ static char *complete_trans_path_choice(const char *line, const char *word, int ao2_ref(codec, -1); continue; } - if (!strncasecmp(word, codec->name, wordlen) && ++which > state) { - char *res = ast_strdup(codec->name); - ao2_ref(codec, -1); - return res; + if (!strncasecmp(word, codec->name, wordlen)) { + if (ast_cli_completion_add(ast_strdup(codec->name))) { + ao2_ref(codec, -1); + break; + } } ao2_ref(codec, -1); } + return NULL; } @@ -1138,10 +1140,10 @@ static char *handle_cli_core_show_translation(struct ast_cli_entry *e, int cmd, return NULL; case CLI_GENERATE: if (a->pos == 3) { - return ast_cli_complete(a->word, option, a->n); + return ast_cli_complete(a->word, option, -1); } if (a->pos == 4 && !strcasecmp(a->argv[3], option[1])) { - return complete_trans_path_choice(a->line, a->word, a->pos, a->n); + return complete_trans_path_choice(a->word); } /* BUGBUG - add tab completion for sample rates */ return NULL; diff --git a/main/udptl.c b/main/udptl.c index 5a491e65c..f6cd3b90a 100644 --- a/main/udptl.c +++ b/main/udptl.c @@ -67,6 +67,7 @@ #include <signal.h> #include <fcntl.h> +#include "asterisk/module.h" #include "asterisk/udptl.h" #include "asterisk/frame.h" #include "asterisk/channel.h" @@ -1355,9 +1356,10 @@ static int udptl_pre_apply_config(void) { return 0; } -int ast_udptl_reload(void) +static int reload_module(void) { __ast_udptl_reload(1); + return 0; } @@ -1365,17 +1367,19 @@ int ast_udptl_reload(void) * \internal * \brief Clean up resources on Asterisk shutdown */ -static void udptl_shutdown(void) +static int unload_module(void) { ast_cli_unregister_multiple(cli_udptl, ARRAY_LEN(cli_udptl)); ao2_t_global_obj_release(globals, "Unref udptl global container in shutdown"); aco_info_destroy(&cfg_info); + + return 0; } -void ast_udptl_init(void) +static int load_module(void) { if (aco_info_init(&cfg_info)) { - return; + return AST_MODULE_LOAD_FAILURE; } aco_option_register(&cfg_info, "udptlstart", ACO_EXACT, general_options, __stringify(DEFAULT_UDPTLSTART), @@ -1407,5 +1411,13 @@ void ast_udptl_init(void) ast_cli_register_multiple(cli_udptl, ARRAY_LEN(cli_udptl)); - ast_register_cleanup(udptl_shutdown); + return AST_MODULE_LOAD_SUCCESS; } + +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "UDPTL", + .support_level = AST_MODULE_SUPPORT_CORE, + .load = load_module, + .unload = unload_module, + .reload = reload_module, + .load_pri = AST_MODPRI_CORE, +); diff --git a/res/res_ari.c b/res/res_ari.c index 5ffb5833f..354201bf3 100644 --- a/res/res_ari.c +++ b/res/res_ari.c @@ -1196,6 +1196,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ .unload = unload_module, .reload = reload_module, .optional_modules = "res_http_websocket", - .requires = "res_stasis", + .requires = "http,res_stasis", .load_pri = AST_MODPRI_APP_DEPEND, ); diff --git a/res/res_config_curl.c b/res/res_config_curl.c index 03f0338cc..03ff80c2e 100644 --- a/res/res_config_curl.c +++ b/res/res_config_curl.c @@ -650,5 +650,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Realtime Curl configu .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER, - .requires = "res_curl,func_curl", + .requires = "extconfig,res_curl,func_curl", ); diff --git a/res/res_config_ldap.c b/res/res_config_ldap.c index 15d9ec018..d73f42b11 100644 --- a/res/res_config_ldap.c +++ b/res/res_config_ldap.c @@ -1999,4 +1999,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "LDAP realtime interfa .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_REALTIME_DRIVER, + .requires = "extconfig", ); diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c index 5d6c2c60a..be920d673 100644 --- a/res/res_config_odbc.c +++ b/res/res_config_odbc.c @@ -1238,4 +1238,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Realtime ODBC configu .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER, + .requires = "extconfig,res_odbc", ); diff --git a/res/res_config_pgsql.c b/res/res_config_pgsql.c index c259b30c1..c8660fb3a 100644 --- a/res/res_config_pgsql.c +++ b/res/res_config_pgsql.c @@ -1720,4 +1720,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PostgreSQL RealTime C .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_REALTIME_DRIVER, + .requires = "extconfig", ); diff --git a/res/res_config_sqlite.c b/res/res_config_sqlite.c index af3b12449..323d2249b 100644 --- a/res/res_config_sqlite.c +++ b/res/res_config_sqlite.c @@ -1772,9 +1772,16 @@ static int load_module(void) return AST_MODULE_LOAD_SUCCESS; } +/* + * This module should require "cdr" to enforce startup/shutdown ordering but it + * loads at REALTIME_DRIVER priority which would cause "cdr" to load too early. + * + * ast_cdr_register / ast_cdr_unregister is safe for use while "cdr" is not running. + */ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Realtime SQLite configuration", .support_level = AST_MODULE_SUPPORT_DEPRECATED, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER, + .requires = "extconfig", ); diff --git a/res/res_config_sqlite3.c b/res/res_config_sqlite3.c index de2de1ce4..854034f38 100644 --- a/res/res_config_sqlite3.c +++ b/res/res_config_sqlite3.c @@ -1393,4 +1393,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "SQLite 3 realtime con .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_REALTIME_DRIVER, + .requires = "extconfig", ); diff --git a/res/res_http_post.c b/res/res_http_post.c index f36b772d4..bf404ced6 100644 --- a/res/res_http_post.c +++ b/res/res_http_post.c @@ -513,4 +513,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "HTTP POST support", .load = load_module, .unload = unload_module, .reload = reload, + .requires = "http", ); diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c index 223bb2dd8..9a32bf37c 100644 --- a/res/res_http_websocket.c +++ b/res/res_http_websocket.c @@ -1478,4 +1478,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DEPEND, + .requires = "http", ); diff --git a/res/res_odbc.c b/res/res_odbc.c index 4a5411e7e..3ee8cba74 100644 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -42,7 +42,6 @@ /*** MODULEINFO <depend>generic_odbc</depend> <depend>res_odbc_transaction</depend> - <depend>ltdl</depend> <support_level>core</support_level> ***/ diff --git a/res/res_phoneprov.c b/res/res_phoneprov.c index 585056b75..70e133328 100644 --- a/res/res_phoneprov.c +++ b/res/res_phoneprov.c @@ -1498,6 +1498,7 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DEPEND, + .requires = "http", ); /**** Public API for register/unregister, set defaults, and add extension. ****/ diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 9f6b5d115..935a5598e 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -5213,6 +5213,6 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_CHANNEL_DEPEND - 5, - .requires = "res_pjproject", + .requires = "dnsmgr,res_pjproject", .optional_modules = "res_statsd", ); diff --git a/res/res_pjsip_t38.c b/res/res_pjsip_t38.c index 249472ba9..333295fe6 100644 --- a/res/res_pjsip_t38.c +++ b/res/res_pjsip_t38.c @@ -1048,5 +1048,5 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PJSIP T.38 UDPTL Supp .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DRIVER, - .requires = "res_pjsip,res_pjsip_session", + .requires = "res_pjsip,res_pjsip_session,udptl", ); diff --git a/sounds/Makefile b/sounds/Makefile index 779d52a8e..606bbdcec 100644 --- a/sounds/Makefile +++ b/sounds/Makefile @@ -127,9 +127,9 @@ have_download: @if test "$(DOWNLOAD)" = ":" ; then \ echo "**************************************************"; \ echo "*** ***"; \ - echo "*** You must have either wget or fetch to be ***"; \ - echo "*** able to automatically download and install ***"; \ - echo "*** the requested sound packages. ***"; \ + echo "*** You must have either wget, curl, or fetch ***"; \ + echo "*** to be able to automatically download and ***"; \ + echo "*** install the requested sound packages. ***"; \ echo "*** ***"; \ echo "*** Please install one of these, or remove any ***"; \ echo "*** extra sound package selections in ***"; \ diff --git a/third-party/pjproject/configure.m4 b/third-party/pjproject/configure.m4 index c1edaf9aa..42482b2e5 100644 --- a/third-party/pjproject/configure.m4 +++ b/third-party/pjproject/configure.m4 @@ -16,7 +16,7 @@ AC_DEFUN([_PJPROJECT_CONFIGURE], AC_MSG_RESULT(configuring) if test "x${DOWNLOAD_TO_STDOUT}" = "x" ; then - AC_MSG_ERROR(A download utility (wget, curl or fetch) is required to download bundled pjproject) + AC_MSG_ERROR(A download utility (wget, curl, or fetch) is required to download bundled pjproject) fi if test "${BZIP2}" = ":" ; then AC_MSG_ERROR(bzip2 is required to extract the pjproject tar file) |