diff options
Diffstat (limited to 'res')
-rw-r--r-- | res/res_agi.c | 56 | ||||
-rw-r--r-- | res/res_clioriginate.c | 5 | ||||
-rw-r--r-- | res/res_monitor.c | 67 | ||||
-rw-r--r-- | res/snmp/agent.c | 61 |
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); |