diff options
author | Leif Madsen <leif@leifmadsen.com> | 2010-05-19 15:12:18 +0000 |
---|---|---|
committer | Leif Madsen <leif@leifmadsen.com> | 2010-05-19 15:12:18 +0000 |
commit | a8a1961be703188e82845054691d433456b0ebcd (patch) | |
tree | 82eac304ccc9393fd74b922cfc7e74fd34a644b9 /main | |
parent | 51e7ee235b0d75964bb221d3a246ccc2422a6cb4 (diff) |
Add ability to hangup all channels from the CLI.
Added the keyword 'all' to the 'channel hangup request' CLI command
so that you can request all channels to be hungup without having to
restart Asterisk.
(closes issue #16009)
Reported by: moy
Patches:
hangup-all-rev-221688.patch uploaded by moy (license 222)
Tested by: moy, russell
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@264117 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r-- | main/cli.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/main/cli.c b/main/cli.c index acb1f6b15..841082d1a 100644 --- a/main/cli.c +++ b/main/cli.c @@ -936,9 +936,11 @@ static char *handle_softhangup(struct ast_cli_entry *e, int cmd, struct ast_cli_ case CLI_INIT: e->command = "channel request hangup"; e->usage = - "Usage: channel request hangup <channel>\n" + "Usage: channel request hangup <channel>|<all>\n" " Request that a channel be hung up. The hangup takes effect\n" - " the next time the driver reads or writes from the channel\n"; + " the next time the driver reads or writes from the channel.\n" + " If 'all' is specified instead of a channel name, all channels\n" + " will see the hangup request.\n"; return NULL; case CLI_GENERATE: return ast_complete_channels(a->line, a->word, a->pos, a->n, e->args); @@ -948,7 +950,19 @@ static char *handle_softhangup(struct ast_cli_entry *e, int cmd, struct ast_cli_ return CLI_SHOWUSAGE; } - if ((c = ast_channel_get_by_name(a->argv[3]))) { + if (!strcasecmp(a->argv[3], "all")) { + struct ast_channel_iterator *iter = NULL; + if (!(iter = ast_channel_iterator_all_new(0))) { + return CLI_FAILURE; + } + for (; iter && (c = ast_channel_iterator_next(iter)); ast_channel_unref(c)) { + ast_channel_lock(c); + ast_cli(a->fd, "Requested Hangup on channel '%s'\n", c->name); + ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT); + ast_channel_unlock(c); + } + ast_channel_iterator_destroy(iter); + } else if ((c = ast_channel_get_by_name(a->argv[3]))) { ast_channel_lock(c); ast_cli(a->fd, "Requested Hangup on channel '%s'\n", c->name); ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT); |