]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 330705 via svnmerge from
authorKinsey Moore <kmoore@digium.com>
Wed, 3 Aug 2011 13:39:06 +0000 (13:39 +0000)
committerKinsey Moore <kmoore@digium.com>
Wed, 3 Aug 2011 13:39:06 +0000 (13:39 +0000)
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/branches/10@330706 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_analog.c

index b80b1b1e8570cf65443cb19cabd5def970d91e36..81a9ce06c3f10e315e1da79fd5648f433c52f4af 100644 (file)
@@ -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);
index 5489f042042eeb4c2ccaa4f9f559d41d22ac5f90..4789f964c2f3e0dab0eb9549dad24c06be3b0746 100644 (file)
@@ -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>",