static int loopback_matchmore(struct cw_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data) { LOOPBACK_COMMON; res = cw_matchmore_extension(chan, newcontext, newexten, newpriority, callerid); if (newpattern) { switch (cw_extension_pattern_match(exten, newpattern)) { case EXTENSION_MATCH_EXACT: case EXTENSION_MATCH_STRETCHABLE: case EXTENSION_MATCH_POSSIBLE: break; default: res = 0; break; } } return res; }
int misdn_cfg_is_msn_valid (int port, char* msn) { int re = 0; struct msn_list *iter; if (!misdn_cfg_is_port_valid(port)) { cw_log(LOG_WARNING, "Invalid call to misdn_cfg_is_msn_valid! Port number %d is not valid.\n", port); return 0; } misdn_cfg_lock(); if (port_cfg[port][map[MISDN_CFG_MSNS]].ml) iter = port_cfg[port][map[MISDN_CFG_MSNS]].ml; else iter = port_cfg[0][map[MISDN_CFG_MSNS]].ml; for ( ; iter; iter = iter->next) { if (*(iter->msn) == '*') { re = 1; } else { switch (cw_extension_pattern_match(msn, iter->msn)) { case EXTENSION_MATCH_EXACT: case EXTENSION_MATCH_STRETCHABLE: case EXTENSION_MATCH_POSSIBLE: re = 1; break; } } if (re) break; } misdn_cfg_unlock(); return re; }
static struct cw_exten *find_matching_priority(struct cw_context *c, const char *exten, int priority, const char *callerid) { struct cw_exten *e; struct cw_include *i; struct cw_context *c2; struct cw_exten *p; int hit; for (e = cw_walk_context_extensions(c, NULL); e; e = cw_walk_context_extensions(c, e)) { switch (cw_extension_pattern_match(exten, cw_get_extension_name(e))) { case EXTENSION_MATCH_EXACT: case EXTENSION_MATCH_STRETCHABLE: case EXTENSION_MATCH_POSSIBLE: if (cw_get_extension_matchcid(e)) { switch (cw_extension_pattern_match(callerid, cw_get_extension_cidmatch(e))) { case EXTENSION_MATCH_EXACT: case EXTENSION_MATCH_STRETCHABLE: case EXTENSION_MATCH_POSSIBLE: hit = 1; break; default: hit = 0; break; } } else { hit = 1; } if (hit) { /* This is the matching extension we want */ for (p = cw_walk_extension_priorities(e, NULL); p; p = cw_walk_extension_priorities(e, p)) { if (priority != cw_get_extension_priority(p)) continue; return p; } } break; } } /* No match; run through includes */ for (i = cw_walk_context_includes(c, NULL); i; i = cw_walk_context_includes(c, i)) { for (c2 = cw_walk_contexts(NULL); c2; c2 = cw_walk_contexts(c2)) { if (!strcmp(cw_get_context_name(c2), cw_get_include_name(i))) { if ((e = find_matching_priority(c2, exten, priority, callerid))) return e; } } } return NULL; }