From e2fc623d88f148b4cfb19c90ae5adef52533b331 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Wed, 20 Aug 2008 19:35:59 +0000 Subject: [PATCH] Backport support for Zaptel/DAHDI channel-level alarms from trunk/1.6, because not doing so just makes it difficult for people with channels that are in alarm when Asterisk starts up to get them going once the alarm is cleared (closes issue #12160) Reported by: tzafrir Patches: asterisk-chanalarms_14.patch uploaded by tzafrir (license 46) Tested by: tzafrir git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@139145 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_dahdi.c | 25 ++++++- configure | 114 ++++++++++++++++++++++++++++++- configure.ac | 9 +++ include/asterisk/autoconfig.h.in | 3 + 4 files changed, 147 insertions(+), 4 deletions(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 07b6e9ef90..125a971e19 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -3666,14 +3666,33 @@ static int get_alarms(struct dahdi_pvt *p) { int res; struct dahdi_spaninfo zi; +#if defined(HAVE_DAHDI) || defined(HAVE_ZAPTEL_CHANALARMS) + /* + * The conditional compilation is needed only in asterisk-1.4 for + * backward compatibility with old zaptel drivers that don't have + * a DAHDI_PARAMS.chan_alarms field. + */ + struct dahdi_params params; +#endif + memset(&zi, 0, sizeof(zi)); zi.spanno = p->span; - res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_SPANSTAT, &zi); - if (res < 0) { + + /* First check for span alarms */ + if((res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_SPANSTAT, &zi)) < 0) { ast_log(LOG_WARNING, "Unable to determine alarm on channel %d: %s\n", p->channel, strerror(errno)); return 0; } - return zi.alarms; + if (zi.alarms != DAHDI_ALARM_NONE) + return zi.alarms; +#if defined(HAVE_DAHDI) || defined(HAVE_ZAPTEL_CHANALARMS) + /* No alarms on the span. Check for channel alarms. */ + if ((res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_GET_PARAMS, ¶ms)) >= 0) + return params.chan_alarms; + /* ioctl failed */ + ast_log(LOG_WARNING, "Unable to determine alarm on channel %d\n", p->channel); +#endif + return DAHDI_ALARM_NONE; } static void dahdi_handle_dtmfup(struct ast_channel *ast, int index, struct ast_frame **dest) diff --git a/configure b/configure index d9bf7ac8fa..d1552c2b45 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac Revision: 136999 . +# From configure.ac Revision: 137677 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for asterisk 1.4. # @@ -30475,6 +30475,118 @@ cat >>confdefs.h <<\_ACEOF #define HAVE_ZAPTEL 1 _ACEOF + saved_cppflags="${CPPFLAGS}" + CPPFLAGS="${CPPFLAGS} ${ZAPTEL_INCLUDE}" + { echo "$as_me:$LINENO: checking for ZT_PARAMS.chan_alarms" >&5 +echo $ECHO_N "checking for ZT_PARAMS.chan_alarms... $ECHO_C" >&6; } +if test "${ac_cv_member_ZT_PARAMS_chan_alarms+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static ZT_PARAMS ac_aggr; +if (ac_aggr.chan_alarms) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_ZT_PARAMS_chan_alarms=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static ZT_PARAMS ac_aggr; +if (sizeof ac_aggr.chan_alarms) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member_ZT_PARAMS_chan_alarms=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member_ZT_PARAMS_chan_alarms=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_member_ZT_PARAMS_chan_alarms" >&5 +echo "${ECHO_T}$ac_cv_member_ZT_PARAMS_chan_alarms" >&6; } + + CPPFLAGS="${saved_cppflags}" + if test "${ac_cv_member_ZT_PARAMS_chan_alarms}" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ZAPTEL_CHANALARMS 1 +_ACEOF + + else + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ZAPTEL_CHANALARMS 0 +_ACEOF + + fi elif test -n "${ZAPTEL_MANDATORY}"; then { echo "$as_me:$LINENO: ***" >&5 diff --git a/configure.ac b/configure.ac index e7f91a3d98..6bc07331b5 100644 --- a/configure.ac +++ b/configure.ac @@ -1458,6 +1458,15 @@ if test "${USE_ZAPTEL}" != "no" && test "x${PBX_DAHDI}" != "x1"; then fi PBX_ZAPTEL=1 AC_DEFINE([HAVE_ZAPTEL], 1, [Define if your system has the Zaptel headers.]) + saved_cppflags="${CPPFLAGS}" + CPPFLAGS="${CPPFLAGS} ${ZAPTEL_INCLUDE}" + AC_CHECK_MEMBER([ZT_PARAMS.chan_alarms],,,[#include ]) + CPPFLAGS="${saved_cppflags}" + if test "${ac_cv_member_ZT_PARAMS_chan_alarms}" = "yes"; then + AC_DEFINE([HAVE_ZAPTEL_CHANALARMS], 1, [Define if your Zaptel drivers have chan_alarms.]) + else + AC_DEFINE([HAVE_ZAPTEL_CHANALARMS], 0, [Define if your Zaptel drivers have chan_alarms.]) + fi elif test -n "${ZAPTEL_MANDATORY}"; then AC_MSG_NOTICE([***]) diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index d662bc79f6..4b41b921f0 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -546,6 +546,9 @@ /* Define if your system has the Zaptel headers. */ #undef HAVE_ZAPTEL +/* Define if your Zaptel drivers have chan_alarms. */ +#undef HAVE_ZAPTEL_CHANALARMS + /* Define to indicate the ${ZLIB_DESCRIP} library */ #undef HAVE_ZLIB