summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/asterisk.c21
-rw-r--r--main/channel.c78
-rw-r--r--main/json.c13
-rw-r--r--main/stasis_channels.c5
4 files changed, 97 insertions, 20 deletions
diff --git a/main/asterisk.c b/main/asterisk.c
index be6c7cc32..4a6567f73 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -2691,7 +2691,11 @@ static void send_rasterisk_connect_commands(void)
}
}
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+static int ast_el_read_char(EditLine *editline, wchar_t *cp)
+#else
static int ast_el_read_char(EditLine *editline, char *cp)
+#endif
{
int num_read = 0;
int lastpos = 0;
@@ -2721,10 +2725,16 @@ static int ast_el_read_char(EditLine *editline, char *cp)
}
if (!ast_opt_exec && fds[1].revents) {
- num_read = read(STDIN_FILENO, cp, 1);
+ char c = '\0';
+ num_read = read(STDIN_FILENO, &c, 1);
if (num_read < 1) {
break;
} else {
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+ *cp = btowc(c);
+#else
+ *cp = c;
+#endif
return (num_read);
}
}
@@ -2768,7 +2778,11 @@ static int ast_el_read_char(EditLine *editline, char *cp)
console_print(buf);
if ((res < EL_BUF_SIZE - 1) && ((buf[res-1] == '\n') || (res >= 2 && buf[res-2] == '\n'))) {
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+ *cp = btowc(CC_REFRESH);
+#else
*cp = CC_REFRESH;
+#endif
return(1);
} else {
lastpos = 1;
@@ -2776,7 +2790,12 @@ static int ast_el_read_char(EditLine *editline, char *cp)
}
}
+#ifdef HAVE_LIBEDIT_IS_UNICODE
+ *cp = btowc('\0');
+#else
*cp = '\0';
+#endif
+
return (0);
}
diff --git a/main/channel.c b/main/channel.c
index cdb6569c3..bdf918fab 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -7756,35 +7756,48 @@ struct manager_channel_variable {
char name[];
};
-static AST_RWLIST_HEAD_STATIC(channelvars, manager_channel_variable);
+AST_RWLIST_HEAD(external_vars, manager_channel_variable);
-static void free_channelvars(void)
+static struct external_vars ami_vars;
+static struct external_vars ari_vars;
+
+static void free_external_channelvars(struct external_vars *channelvars)
{
struct manager_channel_variable *var;
- AST_RWLIST_WRLOCK(&channelvars);
- while ((var = AST_RWLIST_REMOVE_HEAD(&channelvars, entry))) {
+ AST_RWLIST_WRLOCK(channelvars);
+ while ((var = AST_RWLIST_REMOVE_HEAD(channelvars, entry))) {
ast_free(var);
}
- AST_RWLIST_UNLOCK(&channelvars);
+ AST_RWLIST_UNLOCK(channelvars);
}
-int ast_channel_has_manager_vars(void)
+static int channel_has_external_vars(struct external_vars *channelvars)
{
int vars_present;
- AST_RWLIST_RDLOCK(&channelvars);
- vars_present = !AST_LIST_EMPTY(&channelvars);
- AST_RWLIST_UNLOCK(&channelvars);
+ AST_RWLIST_RDLOCK(channelvars);
+ vars_present = !AST_LIST_EMPTY(channelvars);
+ AST_RWLIST_UNLOCK(channelvars);
return vars_present;
}
-void ast_channel_set_manager_vars(size_t varc, char **vars)
+int ast_channel_has_manager_vars(void)
+{
+ return channel_has_external_vars(&ami_vars);
+}
+
+int ast_channel_has_ari_vars(void)
+{
+ return channel_has_external_vars(&ari_vars);
+}
+
+static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
{
size_t i;
- free_channelvars();
- AST_RWLIST_WRLOCK(&channelvars);
+ free_external_channelvars(channelvars);
+ AST_RWLIST_WRLOCK(channelvars);
for (i = 0; i < varc; ++i) {
const char *var = vars[i];
struct manager_channel_variable *mcv;
@@ -7795,9 +7808,20 @@ void ast_channel_set_manager_vars(size_t varc, char **vars)
if (strchr(var, '(')) {
mcv->isfunc = 1;
}
- AST_RWLIST_INSERT_TAIL(&channelvars, mcv, entry);
+ AST_RWLIST_INSERT_TAIL(channelvars, mcv, entry);
}
- AST_RWLIST_UNLOCK(&channelvars);
+ AST_RWLIST_UNLOCK(channelvars);
+
+}
+
+void ast_channel_set_manager_vars(size_t varc, char **vars)
+{
+ channel_set_external_vars(&ami_vars, varc, vars);
+}
+
+void ast_channel_set_ari_vars(size_t varc, char **vars)
+{
+ channel_set_external_vars(&ari_vars, varc, vars);
}
/*!
@@ -7839,14 +7863,15 @@ struct varshead *ast_channel_get_vars(struct ast_channel *chan)
return ret;
}
-struct varshead *ast_channel_get_manager_vars(struct ast_channel *chan)
+static struct varshead *channel_get_external_vars(struct external_vars *channelvars,
+ struct ast_channel *chan)
{
RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
RAII_VAR(struct ast_str *, tmp, NULL, ast_free);
struct manager_channel_variable *mcv;
- SCOPED_LOCK(lock, &channelvars, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK);
+ SCOPED_LOCK(lock, channelvars, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK);
- if (AST_LIST_EMPTY(&channelvars)) {
+ if (AST_LIST_EMPTY(channelvars)) {
return NULL;
}
@@ -7857,7 +7882,7 @@ struct varshead *ast_channel_get_manager_vars(struct ast_channel *chan)
return NULL;
}
- AST_LIST_TRAVERSE(&channelvars, mcv, entry) {
+ AST_LIST_TRAVERSE(channelvars, mcv, entry) {
const char *val = NULL;
struct ast_var_t *var;
@@ -7882,11 +7907,23 @@ struct varshead *ast_channel_get_manager_vars(struct ast_channel *chan)
ao2_ref(ret, +1);
return ret;
+
+}
+
+struct varshead *ast_channel_get_manager_vars(struct ast_channel *chan)
+{
+ return channel_get_external_vars(&ami_vars, chan);
+}
+
+struct varshead *ast_channel_get_ari_vars(struct ast_channel *chan)
+{
+ return channel_get_external_vars(&ari_vars, chan);
}
static void channels_shutdown(void)
{
- free_channelvars();
+ free_external_channelvars(&ami_vars);
+ free_external_channelvars(&ari_vars);
ast_data_unregister(NULL);
ast_cli_unregister_multiple(cli_channel, ARRAY_LEN(cli_channel));
@@ -7919,6 +7956,9 @@ int ast_channels_init(void)
ast_register_cleanup(channels_shutdown);
+ AST_RWLIST_HEAD_INIT(&ami_vars);
+ AST_RWLIST_HEAD_INIT(&ari_vars);
+
return 0;
}
diff --git a/main/json.c b/main/json.c
index 7b5cfbe7e..a28dbb2e2 100644
--- a/main/json.c
+++ b/main/json.c
@@ -1048,3 +1048,16 @@ enum ast_json_to_ast_vars_code ast_json_to_ast_variables(struct ast_json *json_v
return AST_JSON_TO_AST_VARS_CODE_SUCCESS;
}
+
+struct ast_json *ast_json_channel_vars(struct varshead *channelvars)
+{
+ struct ast_json *ret;
+ struct ast_var_t *var;
+
+ ret = ast_json_object_create();
+ AST_LIST_TRAVERSE(channelvars, var, entries) {
+ ast_json_object_set(ret, var->name, ast_json_string_create(var->value));
+ }
+
+ return ret;
+}
diff --git a/main/stasis_channels.c b/main/stasis_channels.c
index 91f209290..4897af89e 100644
--- a/main/stasis_channels.c
+++ b/main/stasis_channels.c
@@ -270,6 +270,7 @@ struct ast_channel_snapshot *ast_channel_snapshot_create(struct ast_channel *cha
ast_set_flag(&snapshot->softhangup_flags, ast_channel_softhangup_internal_flag(chan));
snapshot->manager_vars = ast_channel_get_manager_vars(chan);
+ snapshot->ari_vars = ast_channel_get_ari_vars(chan);
snapshot->tech_properties = ast_channel_tech(chan)->properties;
return snapshot;
@@ -918,6 +919,10 @@ struct ast_json *ast_channel_snapshot_to_json(
"creationtime", ast_json_timeval(snapshot->creationtime, NULL),
"language", snapshot->language);
+ if (snapshot->ari_vars && !AST_LIST_EMPTY(snapshot->ari_vars)) {
+ ast_json_object_set(json_chan, "channelvars", ast_json_channel_vars(snapshot->ari_vars));
+ }
+
return ast_json_ref(json_chan);
}