mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-17 07:18:15 +00:00
Merged revisions 245945 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r245945 | tilghman | 2010-02-10 08:06:12 -0600 (Wed, 10 Feb 2010) | 9 lines Merged revisions 245944 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r245944 | tilghman | 2010-02-10 07:37:13 -0600 (Wed, 10 Feb 2010) | 2 lines Include examples of FILTER usage in extension patterns where a "." may be a risk. ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@245947 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -316,7 +316,7 @@ exten => _91700XXXXXXX,1,Dial(IAX2/${GLOBAL(IAXINFO)}@iaxtel.com/${EXTEN:1}@iaxt
|
|||||||
; International long distance through trunk
|
; International long distance through trunk
|
||||||
;
|
;
|
||||||
exten => _9011.,1,Macro(dundi-e164,${EXTEN:4})
|
exten => _9011.,1,Macro(dundi-e164,${EXTEN:4})
|
||||||
exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}})
|
exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${FILTER(0-9,${EXTEN:${GLOBAL(TRUNKMSD)}})})
|
||||||
|
|
||||||
[trunkld]
|
[trunkld]
|
||||||
;
|
;
|
||||||
@@ -624,7 +624,7 @@ include => demo
|
|||||||
; An extension like the one below can be used for FWD, Nikotel, sipgate etc.
|
; An extension like the one below can be used for FWD, Nikotel, sipgate etc.
|
||||||
; Note that you must have a [sipprovider] section in sip.conf
|
; Note that you must have a [sipprovider] section in sip.conf
|
||||||
;
|
;
|
||||||
;exten => _41X.,1,Dial(SIP/${EXTEN:2}@sipprovider,,r)
|
;exten => _41X.,1,Dial(SIP/${FILTER(0-9,${EXTEN:2})}@sipprovider,,r)
|
||||||
|
|
||||||
; Real extensions would go here. Generally you want real extensions to be
|
; Real extensions would go here. Generally you want real extensions to be
|
||||||
; 4 or 5 digits long (although there is no such requirement) and start with a
|
; 4 or 5 digits long (although there is no such requirement) and start with a
|
||||||
|
|||||||
@@ -90,8 +90,9 @@ static int filter(struct ast_channel *chan, const char *cmd, char *parse, char *
|
|||||||
char *outbuf = buf, ac;
|
char *outbuf = buf, ac;
|
||||||
char allowed[256] = "";
|
char allowed[256] = "";
|
||||||
size_t allowedlen = 0;
|
size_t allowedlen = 0;
|
||||||
|
int32_t bitfield[8] = { 0, }; /* 256 bits */
|
||||||
|
|
||||||
AST_STANDARD_APP_ARGS(args, parse);
|
AST_STANDARD_RAW_ARGS(args, parse);
|
||||||
|
|
||||||
if (!args.string) {
|
if (!args.string) {
|
||||||
ast_log(LOG_ERROR, "Usage: FILTER(<allowed-chars>,<string>)\n");
|
ast_log(LOG_ERROR, "Usage: FILTER(<allowed-chars>,<string>)\n");
|
||||||
@@ -116,16 +117,23 @@ static int filter(struct ast_channel *chan, const char *cmd, char *parse, char *
|
|||||||
* Looks a little strange, until you realize that we can overflow
|
* Looks a little strange, until you realize that we can overflow
|
||||||
* the size of a char.
|
* the size of a char.
|
||||||
*/
|
*/
|
||||||
for (ac = c1; ac != c2 && allowedlen < sizeof(allowed) - 1; ac++)
|
for (ac = c1; ac != c2; ac++) {
|
||||||
allowed[allowedlen++] = ac;
|
bitfield[ac / 32] |= 1 << (ac % 32);
|
||||||
allowed[allowedlen++] = ac;
|
}
|
||||||
|
|
||||||
ast_debug(4, "c1=%d, c2=%d\n", c1, c2);
|
ast_debug(4, "c1=%d, c2=%d\n", c1, c2);
|
||||||
|
|
||||||
/* Decrement before the loop increment */
|
/* Decrement before the loop increment */
|
||||||
(args.allowed)--;
|
(args.allowed)--;
|
||||||
} else
|
} else {
|
||||||
allowed[allowedlen++] = c1;
|
bitfield[c1 / 32] |= 1 << (c1 % 32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ac = 1; ac != 0; ac++) {
|
||||||
|
if (bitfield[ac / 32] & (1 << (ac % 32))) {
|
||||||
|
allowed[allowedlen++] = ac;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_debug(1, "Allowed: %s\n", allowed);
|
ast_debug(1, "Allowed: %s\n", allowed);
|
||||||
|
|||||||
Reference in New Issue
Block a user