From db3d1134142f6339746bd17dad551b1ea349f4c7 Mon Sep 17 00:00:00 2001 From: Kinsey Moore <kmoore@digium.com> Date: Wed, 3 Aug 2011 13:40:22 +0000 Subject: [PATCH] Merged revisions 330706 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/10 ................ r330706 | kmoore | 2011-08-03 08:39:06 -0500 (Wed, 03 Aug 2011) | 17 lines Merged revisions 330705 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r330705 | kmoore | 2011-08-03 08:38:17 -0500 (Wed, 03 Aug 2011) | 10 lines Call pickup broken for DAHDI channels when beginning with # The call pickup feature did not work on DAHDI devices for anything other than feature codes beginning with * since all feature codes in chan_dahdi were originally hard-coded to begin with *. This patch is also applied to chan_dahdi.c to fix this bug with radio modes. (closes issue AST-621) Review: https://reviewboard.asterisk.org/r/1336/ ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@330707 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_dahdi.c | 29 ++++++++++++++++++++++++++++- channels/sig_analog.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index b80b1b1e85..81a9ce06c3 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -9772,6 +9772,33 @@ static int dahdi_dnd(struct dahdi_pvt *dahdichan, int flag) return 0; } +static int canmatch_featurecode(const char *exten) +{ + int extlen = strlen(exten); + const char *pickup_ext; + if (!extlen) { + return 1; + } + pickup_ext = ast_pickup_ext(); + if (extlen < strlen(pickup_ext) && !strncmp(pickup_ext, exten, extlen)) { + return 1; + } + /* hardcoded features are *60, *67, *69, *70, *72, *73, *78, *79, *82, *0 */ + if (exten[0] == '*' && extlen < 3) { + if (extlen == 1) { + return 1; + } + /* "*0" should be processed before it gets here */ + switch (exten[1]) { + case '6': + case '7': + case '8': + return 1; + } + } + return 0; +} + static void *analog_ss_thread(void *data) { struct ast_channel *chan = data; @@ -10316,7 +10343,7 @@ static void *analog_ss_thread(void *data) } } else if (!ast_canmatch_extension(chan, chan->context, exten, 1, S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL)) - && ((exten[0] != '*') || (strlen(exten) > 2))) { + && !canmatch_featurecode(exten)) { ast_debug(1, "Can't match %s from '%s' in context %s\n", exten, S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, "<Unknown Caller>"), chan->context); diff --git a/channels/sig_analog.c b/channels/sig_analog.c index 5489f04204..4789f964c2 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -1702,6 +1702,33 @@ static int analog_get_sub_fd(struct analog_pvt *p, enum analog_sub sub) #define ANALOG_NEED_MFDETECT(p) (((p)->sig == ANALOG_SIG_FEATDMF) || ((p)->sig == ANALOG_SIG_FEATDMF_TA) || ((p)->sig == ANALOG_SIG_E911) || ((p)->sig == ANALOG_SIG_FGC_CAMA) || ((p)->sig == ANALOG_SIG_FGC_CAMAMF) || ((p)->sig == ANALOG_SIG_FEATB)) +static int analog_canmatch_featurecode(const char *exten) +{ + int extlen = strlen(exten); + const char *pickup_ext; + if (!extlen) { + return 1; + } + pickup_ext = ast_pickup_ext(); + if (extlen < strlen(pickup_ext) && !strncmp(pickup_ext, exten, extlen)) { + return 1; + } + /* hardcoded features are *60, *67, *69, *70, *72, *73, *78, *79, *82, *0 */ + if (exten[0] == '*' && extlen < 3) { + if (extlen == 1) { + return 1; + } + /* "*0" should be processed before it gets here */ + switch (exten[1]) { + case '6': + case '7': + case '8': + return 1; + } + } + return 0; +} + static void *__analog_ss_thread(void *data) { struct analog_pvt *p = data; @@ -2296,7 +2323,7 @@ static void *__analog_ss_thread(void *data) } } else if (!ast_canmatch_extension(chan, chan->context, exten, 1, chan->caller.id.number.valid ? chan->caller.id.number.str : NULL) - && ((exten[0] != '*') || (strlen(exten) > 2))) { + && !analog_canmatch_featurecode(exten)) { ast_debug(1, "Can't match %s from '%s' in context %s\n", exten, chan->caller.id.number.valid && chan->caller.id.number.str ? chan->caller.id.number.str : "<Unknown Caller>", -- GitLab