summaryrefslogtreecommitdiff
path: root/main/manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/manager.c')
-rw-r--r--main/manager.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/main/manager.c b/main/manager.c
index 84eb33d16..f7fa7b53d 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1082,6 +1082,7 @@ struct mansession_session {
int inlen; /*!< number of buffered bytes */
struct ao2_container *whitefilters; /*!< Manager event filters - white list */
struct ao2_container *blackfilters; /*!< Manager event filters - black list */
+ struct ast_variable *chanvars; /*!< Channel variables to set for originate */
int send_events; /*!< XXX what ? */
struct eventqent *last_ev; /*!< last event processed. */
int writetimeout; /*!< Timeout for ast_carefulwrite() */
@@ -1137,6 +1138,7 @@ struct ast_manager_user {
struct ao2_container *blackfilters; /*!< Manager event filters - black list */
struct ast_acl_list *acl; /*!< ACL setting */
char *a1_hash; /*!< precalculated A1 for Digest auth */
+ struct ast_variable *chanvars; /*!< Channel variables to set for originate */
AST_RWLIST_ENTRY(ast_manager_user) list;
};
@@ -1430,6 +1432,9 @@ static void session_destructor(void *obj)
if (eqe) {
ast_atomic_fetchadd_int(&eqe->usecount, -1);
}
+ if (session->chanvars) {
+ ast_variables_destroy(session->chanvars);
+ }
if (session->whitefilters) {
ao2_t_callback(session->whitefilters, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL, "unlink all white filters");
@@ -1643,6 +1648,7 @@ static char *handle_showmanager(struct ast_cli_entry *e, int cmd, struct ast_cli
char *ret = NULL;
struct ast_str *rauthority = ast_str_alloca(128);
struct ast_str *wauthority = ast_str_alloca(128);
+ struct ast_variable *v;
switch (cmd) {
case CLI_INIT:
@@ -1694,6 +1700,10 @@ static char *handle_showmanager(struct ast_cli_entry *e, int cmd, struct ast_cli
authority_to_str(user->readperm, &rauthority),
authority_to_str(user->writeperm, &wauthority),
(user->displayconnects ? "yes" : "no"));
+ ast_cli(a->fd, " Variables: \n");
+ for (v = user->chanvars ; v ; v = v->next) {
+ ast_cli(a->fd, " %s = %s\n", v->name, v->value);
+ }
AST_RWLIST_UNLOCK(&users);
@@ -2546,6 +2556,7 @@ static int authenticate(struct mansession *s, const struct message *m)
s->session->readperm = user->readperm;
s->session->writeperm = user->writeperm;
s->session->writetimeout = user->writetimeout;
+ s->session->chanvars = ast_variables_dup(user->chanvars);
filter_iter = ao2_iterator_init(user->whitefilters, 0);
while ((regex_filter = ao2_iterator_next(&filter_iter))) {
@@ -4210,7 +4221,7 @@ static int action_originate(struct mansession *s, const struct message *m)
const char *async = astman_get_header(m, "Async");
const char *id = astman_get_header(m, "ActionID");
const char *codecs = astman_get_header(m, "Codecs");
- struct ast_variable *vars;
+ struct ast_variable *vars = NULL;
char *tech, *data;
char *l = NULL, *n = NULL;
int pi = 0;
@@ -4308,6 +4319,21 @@ static int action_originate(struct mansession *s, const struct message *m)
/* Allocate requested channel variables */
vars = astman_get_variables(m);
+ if (s->session->chanvars) {
+ struct ast_variable *v, *old;
+ old = vars;
+ vars = NULL;
+
+ /* The variables in the AMI originate action are appended at the end of the list, to override any user variables that apply*/
+
+ vars = ast_variables_dup(s->session->chanvars);
+ if (old) {
+ for (v = vars; v->next; v = v->next );
+ if (v->next) {
+ v->next = old; /* Append originate variables at end of list */
+ }
+ }
+ }
if (ast_true(async)) {
struct fast_originate_helper *fast;
@@ -7425,6 +7451,7 @@ static int __init_manager(int reload, int by_external_config)
user->keep = 1;
oldacl = user->acl;
user->acl = NULL;
+ ast_variables_destroy(user->chanvars);
var = ast_variable_browse(cfg, cat);
for (; var; var = var->next) {
@@ -7450,6 +7477,22 @@ static int __init_manager(int reload, int by_external_config)
} else {
user->writetimeout = value;
}
+ } else if (!strcasecmp(var->name, "setvar")) {
+ struct ast_variable *tmpvar;
+ char varbuf[256];
+ char *varval;
+ char *varname;
+
+ ast_copy_string(varbuf, var->value, sizeof(varbuf));
+ varname = varbuf;
+
+ if ((varval = strchr(varname,'='))) {
+ *varval++ = '\0';
+ if ((tmpvar = ast_variable_new(varname, varval, ""))) {
+ tmpvar->next = user->chanvars;
+ user->chanvars = tmpvar;
+ }
+ }
} else if (!strcasecmp(var->name, "eventfilter")) {
const char *value = var->value;
manager_add_filter(value, user->whitefilters, user->blackfilters);
@@ -7496,6 +7539,7 @@ static int __init_manager(int reload, int by_external_config)
ao2_t_ref(user->whitefilters, -1, "decrement ref for white container, should be last one");
ao2_t_ref(user->blackfilters, -1, "decrement ref for black container, should be last one");
user->acl = ast_free_acl_list(user->acl);
+ ast_variables_destroy(user->chanvars);
ast_free(user);
}
AST_RWLIST_TRAVERSE_SAFE_END;