summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
Diffstat (limited to 'res')
-rw-r--r--res/res_agi.c56
-rw-r--r--res/res_clioriginate.c5
-rw-r--r--res/res_monitor.c67
-rw-r--r--res/snmp/agent.c61
4 files changed, 134 insertions, 55 deletions
diff --git a/res/res_agi.c b/res/res_agi.c
index efd8549b3..24dd5d0bb 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -543,20 +543,27 @@ static char *handle_cli_agi_add_cmd(struct ast_cli_entry *e, int cmd, struct ast
return NULL;
}
- if (a->argc < 4)
+ if (a->argc < 4) {
return CLI_SHOWUSAGE;
- chan = ast_get_channel_by_name_locked(a->argv[2]);
- if (!chan) {
+ }
+
+ if (!(chan = ast_channel_get_by_name(a->argv[2]))) {
ast_log(LOG_WARNING, "Channel %s does not exists or cannot lock it\n", a->argv[2]);
return CLI_FAILURE;
}
+
if (add_agi_cmd(chan, a->argv[3], (a->argc > 4 ? a->argv[4] : ""))) {
ast_log(LOG_WARNING, "failed to add AGI command to queue of channel %s\n", chan->name);
ast_channel_unlock(chan);
+ chan = ast_channel_unref(chan);
return CLI_FAILURE;
}
+
ast_log(LOG_DEBUG, "Added AGI command to channel %s queue\n", chan->name);
+
ast_channel_unlock(chan);
+ chan = ast_channel_unref(chan);
+
return CLI_SUCCESS;
}
@@ -578,24 +585,33 @@ static int action_add_agi_cmd(struct mansession *s, const struct message *m)
const char *cmdid = astman_get_header(m, "CommandID");
struct ast_channel *chan;
char buf[256];
+
if (ast_strlen_zero(channel) || ast_strlen_zero(cmdbuff)) {
astman_send_error(s, m, "Both, Channel and Command are *required*");
return 0;
}
- chan = ast_get_channel_by_name_locked(channel);
- if (!chan) {
+
+ if (!(chan = ast_channel_get_by_name(channel))) {
snprintf(buf, sizeof(buf), "Channel %s does not exists or cannot get its lock", channel);
astman_send_error(s, m, buf);
return 0;
}
+
+ ast_channel_lock(chan);
+
if (add_agi_cmd(chan, cmdbuff, cmdid)) {
snprintf(buf, sizeof(buf), "Failed to add AGI command to channel %s queue", chan->name);
astman_send_error(s, m, buf);
ast_channel_unlock(chan);
+ chan = ast_channel_unref(chan);
return 0;
}
- astman_send_ack(s, m, "Added AGI command to queue");
+
ast_channel_unlock(chan);
+ chan = ast_channel_unref(chan);
+
+ astman_send_ack(s, m, "Added AGI command to queue");
+
return 0;
}
@@ -1679,12 +1695,11 @@ static int handle_hangup(struct ast_channel *chan, AGI *agi, int argc, char **ar
return RESULT_SUCCESS;
} else if (argc == 2) {
/* one argument: look for info on the specified channel */
- c = ast_get_channel_by_name_locked(argv[1]);
- if (c) {
+ if ((c = ast_channel_get_by_name(argv[1]))) {
/* we have a matching channel */
- ast_softhangup(c,AST_SOFTHANGUP_EXPLICIT);
+ ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT);
+ c = ast_channel_unref(c);
ast_agi_send(agi->fd, chan, "200 result=1\n");
- ast_channel_unlock(c);
return RESULT_SUCCESS;
}
/* if we get this far no channel name matched the argument given */
@@ -1766,10 +1781,9 @@ static int handle_channelstatus(struct ast_channel *chan, AGI *agi, int argc, ch
return RESULT_SUCCESS;
} else if (argc == 3) {
/* one argument: look for info on the specified channel */
- c = ast_get_channel_by_name_locked(argv[2]);
- if (c) {
+ if ((c = ast_channel_get_by_name(argv[2]))) {
ast_agi_send(agi->fd, chan, "200 result=%d\n", c->_state);
- ast_channel_unlock(c);
+ c = ast_channel_unref(c);
return RESULT_SUCCESS;
}
/* if we get this far no channel name matched the argument given */
@@ -1817,21 +1831,27 @@ static int handle_getvariablefull(struct ast_channel *chan, AGI *agi, int argc,
char tmp[4096];
struct ast_channel *chan2=NULL;
- if ((argc != 4) && (argc != 5))
+ if (argc != 4 && argc != 5) {
return RESULT_SHOWUSAGE;
+ }
+
if (argc == 5) {
- chan2 = ast_get_channel_by_name_locked(argv[4]);
+ chan2 = ast_channel_get_by_name(argv[4]);
} else {
- chan2 = chan;
+ chan2 = ast_channel_ref(chan);
}
+
if (chan2) {
pbx_substitute_variables_helper(chan2, argv[3], tmp, sizeof(tmp) - 1);
ast_agi_send(agi->fd, chan, "200 result=1 (%s)\n", tmp);
} else {
ast_agi_send(agi->fd, chan, "200 result=0\n");
}
- if (chan2 && (chan2 != chan))
- ast_channel_unlock(chan2);
+
+ if (chan2) {
+ chan2 = ast_channel_unref(chan2);
+ }
+
return RESULT_SUCCESS;
}
diff --git a/res/res_clioriginate.c b/res/res_clioriginate.c
index 4ed08a44e..beb2522f4 100644
--- a/res/res_clioriginate.c
+++ b/res/res_clioriginate.c
@@ -201,15 +201,14 @@ static char *handle_redirect(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
name = a->argv[2];
dest = a->argv[3];
- chan = ast_get_channel_by_name_locked(name);
- if (!chan) {
+ if (!(chan = ast_channel_get_by_name(name))) {
ast_cli(a->fd, "Channel '%s' not found\n", name);
return CLI_FAILURE;
}
res = ast_async_parseable_goto(chan, dest);
- ast_channel_unlock(chan);
+ chan = ast_channel_unref(chan);
if (!res) {
ast_cli(a->fd, "Channel '%s' successfully redirected to %s\n", name, dest);
diff --git a/res/res_monitor.c b/res/res_monitor.c
index 6bd96fbca..dde35a9be 100644
--- a/res/res_monitor.c
+++ b/res/res_monitor.c
@@ -579,34 +579,41 @@ static int start_monitor_action(struct mansession *s, const struct message *m)
astman_send_error(s, m, "No channel specified");
return 0;
}
- c = ast_get_channel_by_name_locked(name);
- if (!c) {
+
+ if (!(c = ast_channel_get_by_name(name))) {
astman_send_error(s, m, "No such channel");
return 0;
}
if (ast_strlen_zero(fname)) {
- /* No filename base specified, default to channel name as per CLI */
+ /* No filename base specified, default to channel name as per CLI */
+ ast_channel_lock(c);
fname = ast_strdupa(c->name);
+ ast_channel_unlock(c);
/* Channels have the format technology/channel_name - have to replace that / */
- if ((d = strchr(fname, '/')))
+ if ((d = strchr(fname, '/'))) {
*d = '-';
+ }
}
if (ast_monitor_start(c, format, fname, 1, X_REC_IN | X_REC_OUT)) {
if (ast_monitor_change_fname(c, fname, 1)) {
astman_send_error(s, m, "Could not start monitoring channel");
- ast_channel_unlock(c);
+ c = ast_channel_unref(c);
return 0;
}
}
if (ast_true(mix)) {
+ ast_channel_lock(c);
ast_monitor_setjoinfiles(c, 1);
+ ast_channel_unlock(c);
}
- ast_channel_unlock(c);
+ c = ast_channel_unref(c);
+
astman_send_ack(s, m, "Started monitoring channel");
+
return 0;
}
@@ -621,22 +628,28 @@ static int stop_monitor_action(struct mansession *s, const struct message *m)
struct ast_channel *c = NULL;
const char *name = astman_get_header(m, "Channel");
int res;
+
if (ast_strlen_zero(name)) {
astman_send_error(s, m, "No channel specified");
return 0;
}
- c = ast_get_channel_by_name_locked(name);
- if (!c) {
+
+ if (!(c = ast_channel_get_by_name(name))) {
astman_send_error(s, m, "No such channel");
return 0;
}
+
res = ast_monitor_stop(c, 1);
- ast_channel_unlock(c);
+
+ c = ast_channel_unref(c);
+
if (res) {
astman_send_error(s, m, "Could not stop monitoring channel");
return 0;
}
+
astman_send_ack(s, m, "Stopped monitoring channel");
+
return 0;
}
@@ -654,26 +667,32 @@ static int change_monitor_action(struct mansession *s, const struct message *m)
struct ast_channel *c = NULL;
const char *name = astman_get_header(m, "Channel");
const char *fname = astman_get_header(m, "File");
+
if (ast_strlen_zero(name)) {
astman_send_error(s, m, "No channel specified");
return 0;
}
+
if (ast_strlen_zero(fname)) {
astman_send_error(s, m, "No filename specified");
return 0;
}
- c = ast_get_channel_by_name_locked(name);
- if (!c) {
+
+ if (!(c = ast_channel_get_by_name(name))) {
astman_send_error(s, m, "No such channel");
return 0;
}
+
if (ast_monitor_change_fname(c, fname, 1)) {
+ c = ast_channel_unref(c);
astman_send_error(s, m, "Could not change monitored filename of channel");
- ast_channel_unlock(c);
return 0;
}
- ast_channel_unlock(c);
+
+ c = ast_channel_unref(c);
+
astman_send_ack(s, m, "Changed monitor filename");
+
return 0;
}
@@ -688,31 +707,33 @@ enum MONITOR_PAUSING_ACTION
MONITOR_ACTION_PAUSE,
MONITOR_ACTION_UNPAUSE
};
-
+
static int do_pause_or_unpause(struct mansession *s, const struct message *m, int action)
{
struct ast_channel *c = NULL;
const char *name = astman_get_header(m, "Channel");
-
+
if (ast_strlen_zero(name)) {
astman_send_error(s, m, "No channel specified");
return -1;
}
-
- c = ast_get_channel_by_name_locked(name);
- if (!c) {
+
+ if (!(c = ast_channel_get_by_name(name))) {
astman_send_error(s, m, "No such channel");
return -1;
}
- if (action == MONITOR_ACTION_PAUSE)
+ if (action == MONITOR_ACTION_PAUSE) {
ast_monitor_pause(c);
- else
+ } else {
ast_monitor_unpause(c);
-
- ast_channel_unlock(c);
+ }
+
+ c = ast_channel_unref(c);
+
astman_send_ack(s, m, (action == MONITOR_ACTION_PAUSE ? "Paused monitoring of the channel" : "Unpaused monitoring of the channel"));
- return 0;
+
+ return 0;
}
static char pause_monitor_action_help[] =
diff --git a/res/snmp/agent.c b/res/snmp/agent.c
index f7e08220d..5a13142d2 100644
--- a/res/snmp/agent.c
+++ b/res/snmp/agent.c
@@ -236,19 +236,32 @@ static u_char *ast_var_channels_table(struct variable *vp, oid *name, size_t *le
u_char *ret = NULL;
int i, bit;
struct ast_str *out = ast_str_alloca(2048);
+ struct ast_channel_iterator *iter;
if (header_simple_table(vp, name, length, exact, var_len, write_method, ast_active_channels()))
return NULL;
i = name[*length - 1] - 1;
- for (chan = ast_channel_walk_locked(NULL);
- chan && i;
- chan = ast_channel_walk_locked(chan), i--)
- ast_channel_unlock(chan);
- if (chan == NULL)
+
+ if (!(iter = ast_channel_iterator_all_new(0))) {
return NULL;
+ }
+
+ while ((chan = ast_channel_iterator_next(iter)) && i) {
+ ast_channel_unref(chan);
+ i--;
+ }
+
+ iter = ast_channel_iterator_destroy(iter);
+
+ if (chan == NULL) {
+ return NULL;
+ }
+
*var_len = sizeof(long_ret);
+ ast_channel_lock(chan);
+
switch (vp->magic) {
case ASTCHANINDEX:
long_ret = name[*length - 1];
@@ -503,7 +516,10 @@ static u_char *ast_var_channels_table(struct variable *vp, oid *name, size_t *le
default:
break;
}
+
ast_channel_unlock(chan);
+ chan = ast_channel_unref(chan);
+
return ret;
}
@@ -567,13 +583,26 @@ static u_char *ast_var_channel_types_table(struct variable *vp, oid *name, size_
long_ret = tech->transfer ? 1 : 2;
return (u_char *)&long_ret;
case ASTCHANTYPECHANNELS:
+ {
+ struct ast_channel_iterator *iter;
+
long_ret = 0;
- for (chan = ast_channel_walk_locked(NULL); chan; chan = ast_channel_walk_locked(chan)) {
- if (chan->tech == tech)
+
+ if (!(iter = ast_channel_iterator_all_new(0))) {
+ return NULL;
+ }
+
+ while ((chan = ast_channel_iterator_next(iter))) {
+ if (chan->tech == tech) {
long_ret++;
- ast_channel_unlock(chan);
+ }
+ chan = ast_channel_unref(chan);
}
+
+ ast_channel_iterator_destroy(iter);
+
return (u_char *)&long_ret;
+ }
default:
break;
}
@@ -585,15 +614,25 @@ static u_char *ast_var_channel_bridge(struct variable *vp, oid *name, size_t *le
{
static unsigned long long_ret;
struct ast_channel *chan = NULL;
+ struct ast_channel_iterator *iter;
long_ret = 0;
- if (header_generic(vp, name, length, exact, var_len, write_method))
+
+ if (header_generic(vp, name, length, exact, var_len, write_method)) {
return NULL;
+ }
- while ((chan = ast_channel_walk_locked(chan))) {
- if (ast_bridged_channel(chan))
+ if (!(iter = ast_channel_iterator_all_new(0))) {
+ return NULL;
+ }
+
+ while ((chan = ast_channel_iterator_next(iter))) {
+ ast_channel_lock(chan);
+ if (ast_bridged_channel(chan)) {
long_ret++;
+ }
ast_channel_unlock(chan);
+ chan = ast_channel_unref(chan);
}
*var_len = sizeof(long_ret);