From 4f14c385ae2b9905a8d42f3caf555bf361595022 Mon Sep 17 00:00:00 2001 From: MelwareDE Date: Fri, 12 May 2006 16:43:30 +0000 Subject: [PATCH] - added first step to compat with newer versions of asterisk --- chan_capi.c | 147 ++++++++++++++++++++++++++++------------------- chan_capi.h | 23 +------- create_config.sh | 8 +++ openpbx.ctrl | 1 + 4 files changed, 98 insertions(+), 81 deletions(-) diff --git a/chan_capi.c b/chan_capi.c index 79fe4ed..d91e640 100644 --- a/chan_capi.c +++ b/chan_capi.c @@ -162,7 +162,7 @@ AST_MUTEX_DEFINE_STATIC(usecnt_lock); AST_MUTEX_DEFINE_STATIC(iflock); AST_MUTEX_DEFINE_STATIC(contrlock); AST_MUTEX_DEFINE_STATIC(capi_put_lock); -AST_MUTEX_DEFINE_EXPORTED(verbose_lock); +AST_MUTEX_DEFINE_STATIC(verbose_lock); static int capi_capability = AST_FORMAT_ALAW; @@ -182,10 +182,14 @@ static char capi_international_prefix[AST_MAX_EXTENSION]; static char default_language[MAX_LANGUAGE] = ""; -int capidebug = 0; +static int capidebug = 0; /* local prototypes */ +#ifdef CC_AST_HAS_INDICATE_DATA +static int capi_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen); +#else static int capi_indicate(struct ast_channel *c, int condition); +#endif /* external prototypes */ extern char *capi_info_string(unsigned int info); @@ -197,6 +201,27 @@ extern char *capi_info_string(unsigned int info); return; \ } +/* + * helper for _verbose with different verbose settings + */ +void cc_verbose(int o_v, int c_d, char *text, ...) +{ + unsigned char line[4096]; + va_list ap; + + va_start(ap, text); + vsnprintf(line, sizeof(line), text, ap); + va_end(ap); + + if ((o_v == 0) || (option_verbose > o_v)) { + if ((!c_d) || ((c_d) && (capidebug))) { + cc_mutex_lock(&verbose_lock); + cc_pbx_verbose(line); + cc_mutex_unlock(&verbose_lock); + } + } +} + /* * B protocol settings */ @@ -4164,7 +4189,11 @@ static int capicommand_exec(struct ast_channel *chan, void *data) /* * we don't support own indications */ +#ifdef CC_AST_HAS_INDICATE_DATA +static int capi_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen) +#else static int capi_indicate(struct ast_channel *c, int condition) +#endif { struct capi_pvt *i = CC_CHANNEL_PVT(c); _cmsg CMSG; @@ -5192,6 +5221,63 @@ static int capi_eval_config(struct ast_config *cfg) return 0; } +/* + * unload the module + */ +int unload_module() +{ + struct capi_pvt *i, *itmp; + int controller; + + ast_unregister_application(commandapp); + + ast_cli_unregister(&cli_info); + ast_cli_unregister(&cli_show_channels); + ast_cli_unregister(&cli_debug); + ast_cli_unregister(&cli_no_debug); + + if (monitor_thread != (pthread_t)(0-1)) { + pthread_cancel(monitor_thread); + pthread_kill(monitor_thread, SIGURG); + pthread_join(monitor_thread, NULL); + } + + cc_mutex_lock(&iflock); + + if (capi_ApplID != CAPI_APPLID_UNUSED) { + if (capi20_release(capi_ApplID) != 0) + cc_log(LOG_WARNING,"Unable to unregister from CAPI!\n"); + } + + for (controller = 1; controller <= capi_num_controllers; controller++) { + if (capi_used_controllers & (1 << controller)) { + if (capi_controllers[controller]) + free(capi_controllers[controller]); + } + } + + i = iflist; + while (i) { + if (i->owner) + cc_log(LOG_WARNING, "On unload, interface still has owner.\n"); + if (i->smoother) + ast_smoother_free(i->smoother); + itmp = i; + i = i->next; + free(itmp); + } + + cc_mutex_unlock(&iflock); + +#ifdef CC_AST_HAVE_TECH_PVT + ast_channel_unregister(&capi_tech); +#else + ast_channel_unregister(channeltype); +#endif + + return 0; +} + /* * main: load the module */ @@ -5261,63 +5347,6 @@ int load_module(void) return 0; } -/* - * unload the module - */ -int unload_module() -{ - struct capi_pvt *i, *itmp; - int controller; - - ast_unregister_application(commandapp); - - ast_cli_unregister(&cli_info); - ast_cli_unregister(&cli_show_channels); - ast_cli_unregister(&cli_debug); - ast_cli_unregister(&cli_no_debug); - - if (monitor_thread != (pthread_t)(0-1)) { - pthread_cancel(monitor_thread); - pthread_kill(monitor_thread, SIGURG); - pthread_join(monitor_thread, NULL); - } - - cc_mutex_lock(&iflock); - - if (capi_ApplID != CAPI_APPLID_UNUSED) { - if (capi20_release(capi_ApplID) != 0) - cc_log(LOG_WARNING,"Unable to unregister from CAPI!\n"); - } - - for (controller = 1; controller <= capi_num_controllers; controller++) { - if (capi_used_controllers & (1 << controller)) { - if (capi_controllers[controller]) - free(capi_controllers[controller]); - } - } - - i = iflist; - while (i) { - if (i->owner) - cc_log(LOG_WARNING, "On unload, interface still has owner.\n"); - if (i->smoother) - ast_smoother_free(i->smoother); - itmp = i; - i = i->next; - free(itmp); - } - - cc_mutex_unlock(&iflock); - -#ifdef CC_AST_HAVE_TECH_PVT - ast_channel_unregister(&capi_tech); -#else - ast_channel_unregister(channeltype); -#endif - - return 0; -} - int usecount() { int res; diff --git a/chan_capi.h b/chan_capi.h index 88f469c..78ac789 100644 --- a/chan_capi.h +++ b/chan_capi.h @@ -82,21 +82,6 @@ static inline unsigned int read_capi_dword(void *m) #endif #endif -/* - * helper for _verbose with different verbose settings - */ -#define cc_verbose(o_v, c_d, text...) \ - do { \ - if ((o_v == 0) || (option_verbose > o_v)) { \ - if ((!c_d) || ((c_d) && (capidebug))) { \ - cc_mutex_lock(&verbose_lock); \ - cc_pbx_verbose(text); \ - cc_mutex_unlock(&verbose_lock); \ - } \ - } \ - } while(0) - - #ifdef PBX_IS_OPBX #define CC_CHANNEL_PVT(c) (c)->tech_pvt #else @@ -105,11 +90,6 @@ static inline unsigned int read_capi_dword(void *m) static cc_mutex_t mutex = AST_MUTEX_INITIALIZER #endif -#ifndef AST_MUTEX_DEFINE_EXPORTED -#define AST_MUTEX_DEFINE_EXPORTED(mutex) \ - cc_mutex_t mutex = AST_MUTEX_INITIALIZER -#endif - /* * definitions for compatibility with older versions of ast* */ @@ -138,10 +118,9 @@ static inline unsigned int read_capi_dword(void *m) * prototypes */ extern unsigned capi_ApplID; -extern cc_mutex_t verbose_lock; -extern int capidebug; extern MESSAGE_EXCHANGE_ERROR _capi_put_cmsg(_cmsg *CMSG); extern _cword get_capi_MessageNumber(void); +extern void cc_verbose(int o_v, int c_d, char *text, ...); /* * B protocol settings diff --git a/create_config.sh b/create_config.sh index e4b36be..aa52616 100755 --- a/create_config.sh +++ b/create_config.sh @@ -146,6 +146,14 @@ else echo " * no stringfield in ast_channel" fi +if grep -q "const indicate.*datalen" $INCLUDEDIR/channel.h; then + echo "#define CC_AST_HAS_INDICATE_DATA" >>$CONFIGFILE + echo " * found 'indicate' with data" +else + echo "#undef CC_AST_HAS_INDICATE_DATA" >>$CONFIGFILE + echo " * no data on 'indicate'" +fi + echo "" >>$CONFIGFILE echo "#endif /* CHAN_CAPI_CONFIG_H */" >>$CONFIGFILE echo "" >>$CONFIGFILE diff --git a/openpbx.ctrl b/openpbx.ctrl index ba76f4c..ee06e4a 100644 --- a/openpbx.ctrl +++ b/openpbx.ctrl @@ -15,6 +15,7 @@ #undef CC_AST_NO_DEVICESTATE #undef CC_AST_NO_STRINGS #define CC_AST_GROUP_T +#undef CC_AST_HAS_INDICATE_DATA #define ast_channel opbx_channel #define ast_frame opbx_frame