aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--funcs/Makefile2
-rw-r--r--funcs/func_callerid.c69
-rw-r--r--funcs/func_strings.c38
3 files changed, 83 insertions, 26 deletions
diff --git a/funcs/Makefile b/funcs/Makefile
index aa11c2059..1934be5ab 100644
--- a/funcs/Makefile
+++ b/funcs/Makefile
@@ -37,7 +37,7 @@ FUNCS+=$(STANDALONE_FUNCS:.o=.so)
FUNC_SOURCES=$(BUILTINS:.o=.c)
-FUNC_STRUCTS=$(shell grep 'struct ast_custom_function' $(FUNC_SOURCES) | awk '{print $$3};')
+FUNC_STRUCTS=$(shell grep 'struct ast_custom_function' $(FUNC_SOURCES) | awk '{print $$3};' | sort)
ifeq (${OSARCH},CYGWIN)
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c
index 264c404dd..fdaaf632d 100644
--- a/funcs/func_callerid.c
+++ b/funcs/func_callerid.c
@@ -42,32 +42,50 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
- if (!strncasecmp("all", data, 3)) {
- snprintf(buf, len, "\"%s\" <%s>", chan->cid.cid_name ? chan->cid.cid_name : "", chan->cid.cid_num ? chan->cid.cid_num : "");
- } else if (!strncasecmp("name", data, 4)) {
- if (chan->cid.cid_name) {
- ast_copy_string(buf, chan->cid.cid_name, len);
- }
- } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) {
- if (chan->cid.cid_num) {
- ast_copy_string(buf, chan->cid.cid_num, len);
- }
- } else if (!strncasecmp("ani", data, 3)) {
- if (chan->cid.cid_ani) {
- ast_copy_string(buf, chan->cid.cid_ani, len);
- }
- } else if (!strncasecmp("dnid", data, 4)) {
- if (chan->cid.cid_dnid) {
- ast_copy_string(buf, chan->cid.cid_dnid, len);
- }
- } else if (!strncasecmp("rdnis", data, 5)) {
- if (chan->cid.cid_rdnis) {
- ast_copy_string(buf, chan->cid.cid_rdnis, len);
+ char *opt = data;
+
+ if (strchr(opt, '|')) {
+ char name[80], num[80];
+
+ data = strsep(&opt, "|");
+ ast_callerid_split(opt, name, sizeof(name), num, sizeof(num));
+
+ if (!strncasecmp("all", data, 3)) {
+ snprintf(buf, len, "\"%s\" <%s>", name, num);
+ } else if (!strncasecmp("name", data, 4)) {
+ ast_copy_string(buf, name, len);
+ } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) {
+ ast_copy_string(buf, num, len);
+ } else {
+ ast_log(LOG_ERROR, "Unknown callerid data type.\n");
}
} else {
- ast_log(LOG_ERROR, "Unknown callerid data type.\n");
+ if (!strncasecmp("all", data, 3)) {
+ snprintf(buf, len, "\"%s\" <%s>", chan->cid.cid_name ? chan->cid.cid_name : "", chan->cid.cid_num ? chan->cid.cid_num : "");
+ } else if (!strncasecmp("name", data, 4)) {
+ if (chan->cid.cid_name) {
+ ast_copy_string(buf, chan->cid.cid_name, len);
+ }
+ } else if (!strncasecmp("num", data, 3) || !strncasecmp("number", data, 6)) {
+ if (chan->cid.cid_num) {
+ ast_copy_string(buf, chan->cid.cid_num, len);
+ }
+ } else if (!strncasecmp("ani", data, 3)) {
+ if (chan->cid.cid_ani) {
+ ast_copy_string(buf, chan->cid.cid_ani, len);
+ }
+ } else if (!strncasecmp("dnid", data, 4)) {
+ if (chan->cid.cid_dnid) {
+ ast_copy_string(buf, chan->cid.cid_dnid, len);
+ }
+ } else if (!strncasecmp("rdnis", data, 5)) {
+ if (chan->cid.cid_rdnis) {
+ ast_copy_string(buf, chan->cid.cid_rdnis, len);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Unknown callerid data type.\n");
+ }
}
-
return buf;
}
@@ -108,9 +126,10 @@ static
struct ast_custom_function callerid_function = {
.name = "CALLERID",
.synopsis = "Gets or sets Caller*ID data on the channel.",
- .syntax = "CALLERID(datatype)",
+ .syntax = "CALLERID(datatype[,<optional-CID>])",
.desc = "Gets or sets Caller*ID data on the channel. The allowable datatypes\n"
- "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n",
+ "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n"
+ "Uses channel callerid by default or optional callerid, if specified.\n",
.read = callerid_read,
.write = callerid_write,
};
diff --git a/funcs/func_strings.c b/funcs/func_strings.c
index 91564d9e4..b9c45014e 100644
--- a/funcs/func_strings.c
+++ b/funcs/func_strings.c
@@ -68,6 +68,44 @@ struct ast_custom_function fieldqty_function = {
.read = function_fieldqty,
};
+static char *builtin_function_filter(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
+{
+ char *allowed, *string, *outbuf=buf;
+
+ string = ast_strdupa(data);
+ if (!string) {
+ ast_log(LOG_ERROR, "Out of memory");
+ return "";
+ }
+
+ allowed = strsep(&string, "|");
+
+ if (!string) {
+ ast_log(LOG_ERROR, "Usage: FILTER(<allowed-chars>,<string>)\n");
+ return "";
+ }
+
+ for ( ; *string && (buf + len - 1 > outbuf); string++) {
+ if (strchr(allowed, *string)) {
+ *outbuf = *string;
+ outbuf++;
+ }
+ }
+ *outbuf = '\0';
+
+ return buf;
+}
+
+#ifndef BUILTIN_FUNC
+static
+#endif
+struct ast_custom_function filter_function = {
+ .name = "FILTER",
+ .synopsis = "Filter the string to include only the allowed characters",
+ .syntax = "FILTER(<allowed-chars>,<string>)",
+ .read = builtin_function_filter,
+};
+
static char *builtin_function_regex(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
char *arg, *earg = NULL, *tmp, errstr[256] = "";