diff --git a/CHANGES b/CHANGES index 238f250912d14dac4e6f37e9168e0b6bb3b569ab..ddb3eb7da0944118928565f7bca9bb19308a3d95 100644 --- a/CHANGES +++ b/CHANGES @@ -455,6 +455,8 @@ CLI Changes files it was built from. * New 'manager show settings' command showing the current settings loaded from manager.conf. + * Added 'all' keyword to the CLI command "channel request hangup" so that you can send + the channel hangup request to all channels. ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 1.6.1 to Asterisk 1.6.2 ------------- diff --git a/main/cli.c b/main/cli.c index acb1f6b15a54cc6e14ffa0190cdc48863dc6bba7..841082d1adad13763bba60332f444fd69acd94cc 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);