|
|
@ -181,17 +181,26 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch
|
|
|
|
else if (!strcasecmp(v->name, "appdata")) {
|
|
|
|
else if (!strcasecmp(v->name, "appdata")) {
|
|
|
|
if (!compat16) {
|
|
|
|
if (!compat16) {
|
|
|
|
char *ptr;
|
|
|
|
char *ptr;
|
|
|
|
|
|
|
|
int in = 0;
|
|
|
|
tmp = alloca(strlen(v->value) * 2 + 1);
|
|
|
|
tmp = alloca(strlen(v->value) * 2 + 1);
|
|
|
|
for (ptr = tmp; *v->value; v->value++) {
|
|
|
|
for (ptr = tmp; *v->value; v->value++) {
|
|
|
|
if (*v->value == ',') {
|
|
|
|
if (*v->value == ',') {
|
|
|
|
*ptr++ = '\\';
|
|
|
|
*ptr++ = '\\';
|
|
|
|
*ptr++ = ',';
|
|
|
|
*ptr++ = ',';
|
|
|
|
} else if (*v->value == '|') {
|
|
|
|
} else if (*v->value == '|' && !in) {
|
|
|
|
*ptr++ = ',';
|
|
|
|
*ptr++ = ',';
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
*ptr++ = *v->value;
|
|
|
|
*ptr++ = *v->value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Don't escape '|', meaning 'or', inside expressions ($[ ]) */
|
|
|
|
|
|
|
|
if (v->value[0] == '[' && v->value[-1] == '$') {
|
|
|
|
|
|
|
|
in++;
|
|
|
|
|
|
|
|
} else if (v->value[0] == ']' && in) {
|
|
|
|
|
|
|
|
in--;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*ptr = '\0';
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
tmp = ast_strdupa(v->value);
|
|
|
|
tmp = ast_strdupa(v->value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|