diff options
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_console.c | 101 |
1 files changed, 82 insertions, 19 deletions
diff --git a/channels/chan_console.c b/channels/chan_console.c index 59bdcac26..cd6170e98 100644 --- a/channels/chan_console.c +++ b/channels/chan_console.c @@ -41,8 +41,6 @@ * in at least one of the other console channel drivers that are not yet * implemented here are: * - * - Multiple device support - * - with "active" CLI command * - Set Auto-answer from the dialplan * - transfer CLI command * - boost CLI command and .conf option @@ -1129,6 +1127,87 @@ static char *cli_console_sendtext(struct ast_cli_entry *e, int cmd, struct ast_c return CLI_SUCCESS; } +static void set_active(struct console_pvt *pvt, const char *value) +{ + if (pvt == &globals) { + ast_log(LOG_ERROR, "active is only valid as a per-device setting\n"); + return; + } + + if (!ast_true(value)) + return; + + ast_rwlock_wrlock(&active_lock); + if (active_pvt) + unref_pvt(active_pvt); + active_pvt = ref_pvt(pvt); + ast_rwlock_unlock(&active_lock); +} + +static char *cli_console_active(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + struct console_pvt *pvt; + + switch (cmd) { + case CLI_INIT: + e->command = "console active"; + e->usage = + "Usage: console active [device]\n" + " If no device is specified. The active console device will be shown.\n" + "Otherwise, the specified device will become the console device active for\n" + "the Asterisk CLI.\n"; + return NULL; + case CLI_GENERATE: + if (a->pos == e->args) { + struct ao2_iterator i; + int x = 0; + char *res = NULL; + i = ao2_iterator_init(pvts, 0); + while ((pvt = ao2_iterator_next(&i))) { + if (++x > a->n && !strncasecmp(pvt->name, a->word, strlen(a->word))) + res = ast_strdup(pvt->name); + unref_pvt(pvt); + if (res) + return res; + } + } + return NULL; + } + + if (a->argc < e->args) + return CLI_SHOWUSAGE; + + if (a->argc == e->args) { + pvt = get_active_pvt(); + + if (!pvt) + ast_cli(a->fd, "No device is currently set as the active console device.\n"); + else { + console_pvt_lock(pvt); + ast_cli(a->fd, "The active console device is '%s'.\n", pvt->name); + console_pvt_unlock(pvt); + pvt = unref_pvt(pvt); + } + + return CLI_SUCCESS; + } + + if (!(pvt = find_pvt(a->argv[e->args]))) { + ast_cli(a->fd, "Could not find a device called '%s'.\n", a->argv[e->args]); + return CLI_FAILURE; + } + + set_active(pvt, "yes"); + + console_pvt_lock(pvt); + ast_cli(a->fd, "The active console device has been set to '%s'\n", pvt->name); + console_pvt_unlock(pvt); + + unref_pvt(pvt); + + return CLI_SUCCESS; +} + static struct ast_cli_entry cli_console[] = { AST_CLI_DEFINE(cli_console_dial, "Dial an extension from the console"), AST_CLI_DEFINE(cli_console_hangup, "Hangup a call on the console"), @@ -1139,6 +1218,7 @@ static struct ast_cli_entry cli_console[] = { AST_CLI_DEFINE(cli_console_autoanswer, "Turn autoanswer on or off"), AST_CLI_DEFINE(cli_list_available, "List available devices"), AST_CLI_DEFINE(cli_list_devices, "List configured devices"), + AST_CLI_DEFINE(cli_console_active, "View or Set the active console device"), }; /*! @@ -1187,23 +1267,6 @@ static void store_callerid(struct console_pvt *pvt, const char *value) ast_string_field_set(pvt, cid_num, cid_num); } -static void set_active(struct console_pvt *pvt, const char *value) -{ - if (pvt == &globals) { - ast_log(LOG_ERROR, "active is only valid as a per-device setting\n"); - return; - } - - if (!ast_true(value)) - return; - - ast_rwlock_wrlock(&active_lock); - if (active_pvt) - unref_pvt(active_pvt); - active_pvt = ref_pvt(pvt); - ast_rwlock_unlock(&active_lock); -} - /*! * \brief Store a configuration parameter in a pvt struct * |