#include "asterisk.h"
#include <unistd.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <ctype.h>
#include <regex.h>
#include "asterisk/logger.h"
#include "asterisk/options.h"
#include "asterisk/cli.h"
#include "asterisk/linkedlists.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/channel.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/lock.h"
#include "editline/readline/readline.h"
#include "asterisk/threadstorage.h"
Go to the source code of this file.
Data Structures | |
struct | cli_iterator |
struct | helpers |
Defines | |
#define | AST_CLI_INITLEN 256 |
Initial buffer size for resulting strings in ast_cli(). | |
#define | CONCISE_FORMAT_STRING "%s!%s!%s!%d!%s!%s!%s!%s!%s!%d!%s!%s\n" |
#define | DAY (HOUR*24) |
#define | ESS(x) ((x == 1) ? "" : "s") |
#define | FORMAT_STRING "%-25s %-20s %-20s\n" |
#define | FORMAT_STRING "%-20.20s %-20.20s %-7.7s %-30.30s\n" |
#define | FORMAT_STRING2 "%-20.20s %-20.20s %-7.7s %-30.30s\n" |
#define | HOUR (MINUTE*60) |
#define | MINUTE (SECOND*60) |
#define | MODLIST_FORMAT "%-30s %-40.40s %-10d\n" |
#define | MODLIST_FORMAT2 "%-30s %-40.40s %-10s\n" |
#define | NEEDCOMMA(x) ((x)? ",": "") |
#define | SECOND (1) |
#define | VERBOSE_FORMAT_STRING "%-20.20s %-20.20s %-16.16s %4d %-7.7s %-12.12s %-25.25s %-15.15s %8.8s %-11.11s %-20.20s\n" |
#define | VERBOSE_FORMAT_STRING2 "%-20.20s %-20.20s %-16.16s %-4.4s %-7.7s %-12.12s %-25.25s %-15.15s %8.8s %-11.11s %-20.20s\n" |
#define | WEEK (DAY*7) |
#define | YEAR (DAY*365) |
Functions | |
static char * | __ast_cli_generator (const char *text, const char *word, int state, int lock) |
static int | __ast_cli_register (struct ast_cli_entry *e, struct ast_cli_entry *ed) |
static int | __ast_cli_unregister (struct ast_cli_entry *e, struct ast_cli_entry *ed) |
void | ast_builtins_init (void) |
initialize the _full_cmd string in * each of the builtins. | |
void | ast_cli (int fd, char *fmt,...) |
static void | ast_cli_buf_init (void) |
int | ast_cli_command (int fd, const char *s) |
Interprets a command Interpret a command s, sending output to fd Returns 0 on succes, -1 on failure. | |
int | ast_cli_command_multiple (int fd, size_t size, const char *s) |
Executes multiple CLI commands Interpret strings separated by '' and execute each one, sending output to fd. | |
char * | ast_cli_complete (const char *word, char *const choices[], int state) |
Helper function to generate cli entries from a NULL-terminated array. Returns the n-th matching entry from the array, or NULL if not found. Can be used to implement generate() for static entries as below (in this example we complete the word in position 2):. | |
char ** | ast_cli_completion_matches (const char *text, const char *word) |
Generates a NULL-terminated array of strings that 1) begin with the string in the second parameter, and 2) are valid in a command after the string in the first parameter. | |
char * | ast_cli_generator (const char *text, const char *word, int state) |
Readline madness Useful for readline, that's about it Returns 0 on success, -1 on failure. | |
int | ast_cli_generatornummatches (const char *text, const char *word) |
Return the number of unique matches for the generator. | |
int | ast_cli_register (struct ast_cli_entry *e) |
Registers a command or an array of commands. | |
void | ast_cli_register_multiple (struct ast_cli_entry *e, int len) |
Register multiple commands. | |
int | ast_cli_unregister (struct ast_cli_entry *e) |
Unregisters a command or an array of commands. | |
void | ast_cli_unregister_multiple (struct ast_cli_entry *e, int len) |
Unregister multiple commands. | |
char * | ast_complete_channels (const char *line, const char *word, int pos, int state, int rpos) |
Command completion for the list of active channels. | |
static struct ast_cli_entry * | cli_next (struct cli_iterator *i) |
static char * | complete_ch_3 (const char *line, const char *word, int pos, int state) |
static char * | complete_ch_4 (const char *line, const char *word, int pos, int state) |
static char * | complete_ch_5 (const char *line, const char *word, int pos, int state) |
static char * | complete_fn_2 (const char *line, const char *word, int pos, int state) |
static char * | complete_fn_3 (const char *line, const char *word, int pos, int state) |
static char * | complete_help (const char *text, const char *word, int pos, int state) |
static char * | complete_mod_2 (const char *line, const char *word, int pos, int state) |
static char * | complete_mod_3 (const char *line, const char *word, int pos, int state) |
static char * | complete_mod_3_nr (const char *line, const char *word, int pos, int state) |
static char * | complete_mod_4 (const char *line, const char *word, int pos, int state) |
static char * | complete_show_channels (const char *line, const char *word, int pos, int state) |
static char * | complete_show_channels_deprecated (const char *line, const char *word, int pos, int state) |
static char * | find_best (char *argv[]) |
static struct ast_cli_entry * | find_cli (char *const cmds[], int match_type) |
locate a cli command in the 'helpers' list (which must be locked). exact has 3 values: 0 returns if the search key is equal or longer than the entry. -1 true if the mismatch is on the last word XXX not true! 1 true only on complete, exact match. | |
static int | group_show_channels (int fd, int argc, char *argv[]) |
static int | handle_chanlist (int fd, int argc, char *argv[]) |
static int | handle_chanlist_deprecated (int fd, int argc, char *argv[]) |
static int | handle_commandcomplete (int fd, int argc, char *argv[]) |
static int | handle_commandmatchesarray (int fd, int argc, char *argv[]) |
static int | handle_commandnummatches (int fd, int argc, char *argv[]) |
static int | handle_core_set_debug_channel (int fd, int argc, char *argv[]) |
static int | handle_debugchan_deprecated (int fd, int argc, char *argv[]) |
static int | handle_debuglevel_deprecated (int fd, int argc, char *argv[]) |
static int | handle_help (int fd, int argc, char *argv[]) |
static int | handle_load (int fd, int argc, char *argv[]) |
static int | handle_load_deprecated (int fd, int argc, char *argv[]) |
static int | handle_logger_mute (int fd, int argc, char *argv[]) |
static int | handle_modlist (int fd, int argc, char *argv[]) |
static int | handle_nodebug (int fd, int argc, char *argv[]) |
static int | handle_nodebugchan_deprecated (int fd, int argc, char *argv[]) |
static int | handle_reload (int fd, int argc, char *argv[]) |
static int | handle_reload_deprecated (int fd, int argc, char *argv[]) |
static int | handle_set_debug (int fd, int argc, char *argv[]) |
static int | handle_set_debug_deprecated (int fd, int argc, char *argv[]) |
static int | handle_set_verbose_deprecated (int fd, int argc, char *argv[]) |
static int | handle_showchan (int fd, int argc, char *argv[]) |
static int | handle_showchan_deprecated (int fd, int argc, char *argv[]) |
static int | handle_showuptime (int fd, int argc, char *argv[]) |
static int | handle_showuptime_deprecated (int fd, int argc, char *argv[]) |
static int | handle_softhangup (int fd, int argc, char *argv[]) |
static int | handle_unload (int fd, int argc, char *argv[]) |
static int | handle_unload_deprecated (int fd, int argc, char *argv[]) |
static int | handle_verbose (int fd, int argc, char *argv[]) |
static int | help1 (int fd, char *match[], int locked) |
helper for help_workhorse and final part of handle_help if locked = 0 it's just help_workhorse, otherwise assume the list is already locked. | |
static int | help_workhorse (int fd, char *match[]) |
static int | modlist_modentry (const char *module, const char *description, int usecnt, const char *like) |
static char * | parse_args (const char *s, int *argc, char *argv[], int max, int *trailingwhitespace) |
static void | print_uptimestr (int fd, time_t timeval, const char *prefix, int printsec) |
Variables | |
static struct ast_threadstorage | ast_cli_buf = { .once = PTHREAD_ONCE_INIT, .key_init = ast_cli_buf_init , } |
static struct ast_cli_entry | builtins [] |
static char | chanlist_help [] |
static struct ast_cli_entry | cli_cli [] |
static struct ast_cli_entry | cli_debug_channel_deprecated |
static struct ast_cli_entry | cli_debug_level_deprecated |
static struct ast_cli_entry | cli_module_load_deprecated |
static struct ast_cli_entry | cli_module_reload_deprecated |
static struct ast_cli_entry | cli_module_unload_deprecated |
static struct ast_cli_entry | cli_set_debug_deprecated |
static struct ast_cli_entry | cli_set_verbose_deprecated |
static struct ast_cli_entry | cli_show_channel_deprecated |
static struct ast_cli_entry | cli_show_channels_deprecated |
static struct ast_cli_entry | cli_show_modules_deprecated |
static struct ast_cli_entry | cli_show_modules_like_deprecated |
static struct ast_cli_entry | cli_show_uptime_deprecated |
static int | climodentryfd = -1 |
static ast_mutex_t | climodentrylock = { PTHREAD_MUTEX_INITIALIZER , 1, { NULL }, { 0 }, 0, { NULL }, { 0 }, PTHREAD_MUTEX_INITIALIZER } |
static char | commandcomplete_help [] |
static char | commandmatchesarray_help [] |
static char | commandnummatches_help [] |
static char | debug_help [] |
static char | debugchan_help [] |
unsigned long | global_fin |
unsigned long | global_fout |
static char | group_show_channels_help [] |
static char | help_help [] |
static char | load_help [] |
static char | logger_mute_help [] |
static char | modlist_help [] |
static char | nodebug_help [] |
static char | reload_help [] |
static char | showchan_help [] |
static char | softhangup_help [] |
static char | unload_help [] |
static char | uptime_help [] |
static char | verbose_help [] |
Definition in file cli.c.
#define AST_CLI_INITLEN 256 |
#define CONCISE_FORMAT_STRING "%s!%s!%s!%d!%s!%s!%s!%s!%s!%d!%s!%s\n" |
Definition at line 601 of file cli.c.
Referenced by handle_chanlist(), and handle_chanlist_deprecated().
#define DAY (HOUR*24) |
Referenced by print_uptimestr().
#define ESS | ( | x | ) | ((x == 1) ? "" : "s") |
Referenced by handle_chanlist(), handle_chanlist_deprecated(), and print_uptimestr().
#define FORMAT_STRING "%-20.20s %-20.20s %-7.7s %-30.30s\n" |
Definition at line 599 of file cli.c.
Referenced by group_show_channels(), handle_chanlist(), and handle_chanlist_deprecated().
#define FORMAT_STRING2 "%-20.20s %-20.20s %-7.7s %-30.30s\n" |
Definition at line 600 of file cli.c.
Referenced by handle_chanlist(), and handle_chanlist_deprecated().
#define HOUR (MINUTE*60) |
Referenced by print_uptimestr().
#define MINUTE (SECOND*60) |
Referenced by print_uptimestr().
#define MODLIST_FORMAT "%-30s %-40.40s %-10d\n" |
#define MODLIST_FORMAT2 "%-30s %-40.40s %-10s\n" |
#define NEEDCOMMA | ( | x | ) | ((x)? ",": "") |
Referenced by print_uptimestr().
#define SECOND (1) |
#define VERBOSE_FORMAT_STRING "%-20.20s %-20.20s %-16.16s %4d %-7.7s %-12.12s %-25.25s %-15.15s %8.8s %-11.11s %-20.20s\n" |
Definition at line 602 of file cli.c.
Referenced by handle_chanlist(), and handle_chanlist_deprecated().
#define VERBOSE_FORMAT_STRING2 "%-20.20s %-20.20s %-16.16s %-4.4s %-7.7s %-12.12s %-25.25s %-15.15s %8.8s %-11.11s %-20.20s\n" |
Definition at line 603 of file cli.c.
Referenced by handle_chanlist(), and handle_chanlist_deprecated().
#define WEEK (DAY*7) |
Referenced by print_uptimestr().
#define YEAR (DAY*365) |
Referenced by print_uptimestr().
static char * __ast_cli_generator | ( | const char * | text, | |
const char * | word, | |||
int | state, | |||
int | lock | |||
) | [static] |
Definition at line 1925 of file cli.c.
References ast_cli_entry::_full_cmd, ast_join(), AST_LIST_LOCK, AST_LIST_UNLOCK, AST_MAX_ARGS, ast_strlen_zero(), cli_next(), ast_cli_entry::cmda, free, ast_cli_entry::generator, parse_args(), and strdup.
Referenced by ast_cli_generator(), complete_help(), and handle_commandcomplete().
01926 { 01927 char *argv[AST_MAX_ARGS]; 01928 struct ast_cli_entry *e; 01929 struct cli_iterator i = { NULL, NULL }; 01930 int x = 0, argindex, matchlen; 01931 int matchnum=0; 01932 char *ret = NULL; 01933 char matchstr[80] = ""; 01934 int tws = 0; 01935 char *dup = parse_args(text, &x, argv, sizeof(argv) / sizeof(argv[0]), &tws); 01936 01937 if (!dup) /* error */ 01938 return NULL; 01939 argindex = (!ast_strlen_zero(word) && x>0) ? x-1 : x; 01940 /* rebuild the command, ignore tws */ 01941 ast_join(matchstr, sizeof(matchstr)-1, argv); 01942 matchlen = strlen(matchstr); 01943 if (tws) { 01944 strcat(matchstr, " "); /* XXX */ 01945 if (matchlen) 01946 matchlen++; 01947 } 01948 if (lock) 01949 AST_LIST_LOCK(&helpers); 01950 while( !ret && (e = cli_next(&i)) ) { 01951 int lc = strlen(e->_full_cmd); 01952 if (e->_full_cmd[0] != '_' && lc > 0 && matchlen <= lc && 01953 !strncasecmp(matchstr, e->_full_cmd, matchlen)) { 01954 /* Found initial part, return a copy of the next word... */ 01955 if (e->cmda[argindex] && ++matchnum > state) 01956 ret = strdup(e->cmda[argindex]); /* we need a malloced string */ 01957 } else if (e->generator && !strncasecmp(matchstr, e->_full_cmd, lc) && matchstr[lc] < 33) { 01958 /* We have a command in its entirity within us -- theoretically only one 01959 command can have this occur */ 01960 ret = e->generator(matchstr, word, argindex, state); 01961 } 01962 } 01963 if (lock) 01964 AST_LIST_UNLOCK(&helpers); 01965 free(dup); 01966 return ret; 01967 }
static int __ast_cli_register | ( | struct ast_cli_entry * | e, | |
struct ast_cli_entry * | ed | |||
) | [static] |
Definition at line 1638 of file cli.c.
References ast_cli_entry::_deprecated_by, ast_cli_entry::_full_cmd, ast_join(), AST_LIST_INSERT_BEFORE_CURRENT, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_LIST_UNLOCK, ast_log(), ast_strdup, ast_cli_entry::cmda, ast_cli_entry::deprecate_cmd, ast_cli_entry::deprecated, find_cli(), len(), ast_cli_entry::list, LOG_WARNING, S_OR, ast_cli_entry::summary, and ast_cli_entry::usage.
Referenced by ast_cli_register().
01639 { 01640 struct ast_cli_entry *cur; 01641 char fulle[80] =""; 01642 int lf, ret = -1; 01643 01644 ast_join(fulle, sizeof(fulle), e->cmda); 01645 AST_LIST_LOCK(&helpers); 01646 01647 if (find_cli(e->cmda, 1)) { 01648 ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n", fulle); 01649 goto done; 01650 } 01651 e->_full_cmd = ast_strdup(fulle); 01652 if (!e->_full_cmd) 01653 goto done; 01654 01655 if (ed) { 01656 e->deprecated = 1; 01657 e->summary = ed->summary; 01658 e->usage = ed->usage; 01659 /* XXX If command A deprecates command B, and command B deprecates command C... 01660 Do we want to show command A or command B when telling the user to use new syntax? 01661 This currently would show command A. 01662 To show command B, you just need to always use ed->_full_cmd. 01663 */ 01664 e->_deprecated_by = S_OR(ed->_deprecated_by, ed->_full_cmd); 01665 } else { 01666 e->deprecated = 0; 01667 } 01668 01669 lf = strlen(fulle); 01670 AST_LIST_TRAVERSE_SAFE_BEGIN(&helpers, cur, list) { 01671 int len = strlen(cur->_full_cmd); 01672 if (lf < len) 01673 len = lf; 01674 if (strncasecmp(fulle, cur->_full_cmd, len) < 0) { 01675 AST_LIST_INSERT_BEFORE_CURRENT(&helpers, e, list); 01676 break; 01677 } 01678 } 01679 AST_LIST_TRAVERSE_SAFE_END; 01680 01681 if (!cur) 01682 AST_LIST_INSERT_TAIL(&helpers, e, list); 01683 ret = 0; /* success */ 01684 01685 done: 01686 AST_LIST_UNLOCK(&helpers); 01687 01688 if (e->deprecate_cmd) { 01689 /* This command deprecates another command. Register that one also. */ 01690 __ast_cli_register(e->deprecate_cmd, e); 01691 } 01692 01693 return ret; 01694 }
static int __ast_cli_unregister | ( | struct ast_cli_entry * | e, | |
struct ast_cli_entry * | ed | |||
) | [static] |
Definition at line 1622 of file cli.c.
References ast_cli_entry::_full_cmd, AST_LIST_LOCK, AST_LIST_REMOVE, AST_LIST_UNLOCK, ast_log(), ast_cli_entry::deprecate_cmd, free, ast_cli_entry::inuse, and LOG_WARNING.
Referenced by ast_cli_unregister().
01623 { 01624 if (e->deprecate_cmd) { 01625 __ast_cli_unregister(e->deprecate_cmd, e); 01626 } 01627 if (e->inuse) { 01628 ast_log(LOG_WARNING, "Can't remove command that is in use\n"); 01629 } else { 01630 AST_LIST_LOCK(&helpers); 01631 AST_LIST_REMOVE(&helpers, e, list); 01632 AST_LIST_UNLOCK(&helpers); 01633 free(e->_full_cmd); 01634 } 01635 return 0; 01636 }
void ast_builtins_init | ( | void | ) |
initialize the _full_cmd string in * each of the builtins.
Provided by cli.c
Definition at line 1506 of file cli.c.
References ast_cli_entry::_full_cmd, ast_cli_register_multiple(), ast_join(), ast_log(), builtins, cli_cli, ast_cli_entry::cmda, LOG_WARNING, and strdup.
Referenced by main().
01507 { 01508 struct ast_cli_entry *e; 01509 01510 for (e = builtins; e->cmda[0] != NULL; e++) { 01511 char buf[80]; 01512 ast_join(buf, sizeof(buf), e->cmda); 01513 e->_full_cmd = strdup(buf); 01514 if (!e->_full_cmd) 01515 ast_log(LOG_WARNING, "-- cannot allocate <%s>\n", buf); 01516 } 01517 01518 ast_cli_register_multiple(cli_cli, sizeof(cli_cli) / sizeof(struct ast_cli_entry)); 01519 }
void ast_cli | ( | int | fd, | |
char * | fmt, | |||
... | ||||
) |
Definition at line 59 of file cli.c.
References ast_carefulwrite(), ast_cli_buf, AST_CLI_INITLEN, ast_dynamic_str_thread_get(), ast_dynamic_str_thread_set_va, AST_DYNSTR_BUILD_FAILED, and ast_dynamic_str::str.
Referenced by __iax2_show_peers(), __queues_show(), __say_init(), __sip_show_channels(), _sip_show_peer(), _sip_show_peers(), agent_logoff_cmd(), agents_show(), agents_show_online(), agi_do_debug(), agi_no_debug(), agi_no_debug_deprecated(), aji_do_debug(), aji_do_reload(), aji_no_debug(), aji_show_clients(), aji_test(), ast_cli_command(), ast_cli_netstats(), ast_console_toggle_mute(), ast_httpd_helper_thread(), cli_audio_convert(), cli_audio_convert_deprecated(), cli_files_show(), cli_queue_member_count(), cli_realtime_load(), cli_realtime_update(), config_command(), console_active(), console_active_deprecated(), console_answer(), console_answer_deprecated(), console_autoanswer(), console_autoanswer_deprecated(), console_dial(), console_dial_deprecated(), console_flash(), console_flash_deprecated(), console_hangup(), console_hangup_deprecated(), console_sendtext(), console_sendtext_deprecated(), console_transfer(), console_transfer_deprecated(), dahdi_show_channel(), dahdi_show_channels(), dahdi_show_status(), database_del(), database_deltree(), database_get(), database_put(), database_show(), database_showkey(), do_boost(), dundi_do_debug(), dundi_do_lookup(), dundi_do_precache(), dundi_do_query(), dundi_do_store_history(), dundi_flush(), dundi_no_debug(), dundi_no_store_history(), dundi_show_entityid(), dundi_show_mappings(), dundi_show_peer(), dundi_show_peers(), dundi_show_precache(), dundi_show_requests(), dundi_show_trans(), features_show(), group_show_channels(), gtalk_show_channels(), h323_do_debug(), h323_do_trace(), h323_no_debug(), h323_no_trace(), handle_agidumphtml(), handle_chanlist(), handle_chanlist_deprecated(), handle_cli_refresh(), handle_cli_status(), handle_cli_submit(), handle_commandcomplete(), handle_commandmatchesarray(), handle_commandnummatches(), handle_context_add_extension(), handle_context_add_extension_deprecated(), handle_context_add_ignorepat(), handle_context_add_ignorepat_deprecated(), handle_context_add_include(), handle_context_add_include_deprecated(), handle_context_dont_include_deprecated(), handle_context_remove_extension(), handle_context_remove_extension_deprecated(), handle_context_remove_ignorepat(), handle_context_remove_ignorepat_deprecated(), handle_context_remove_include(), handle_core_set_debug_channel(), handle_dahdi_show_cadences(), handle_debugchan_deprecated(), handle_debuglevel_deprecated(), handle_help(), handle_load(), handle_load_deprecated(), handle_logger_reload(), handle_logger_rotate(), handle_logger_show_channels(), handle_modlist(), handle_nodebug(), handle_nodebugchan_deprecated(), handle_parkedcalls(), handle_pri_debug(), handle_pri_no_debug(), handle_pri_really_debug(), handle_pri_set_debug_file(), handle_pri_show_debug(), handle_pri_show_span(), handle_pri_show_spans(), handle_pri_version(), handle_queue_add_member(), handle_queue_remove_member(), handle_reload(), handle_reload_deprecated(), handle_reload_extensions(), handle_restart_when_convenient(), handle_save_dialplan(), handle_set_debug(), handle_set_debug_deprecated(), handle_set_global(), handle_set_global_deprecated(), handle_set_verbose_deprecated(), handle_show_application(), handle_show_application_deprecated(), handle_show_applications(), handle_show_applications_deprecated(), handle_show_dialplan(), handle_show_function(), handle_show_function_deprecated(), handle_show_functions(), handle_show_functions_deprecated(), handle_show_globals(), handle_show_hints(), handle_show_http(), handle_show_indications(), handle_show_locks(), handle_show_settings(), handle_show_switches(), handle_show_threads(), handle_show_version_files(), handle_show_version_files_deprecated(), handle_showagi(), handle_showchan(), handle_showchan_deprecated(), handle_showfeatures(), handle_showmanager(), handle_showmanagers(), handle_showmancmd(), handle_showmancmds(), handle_showmanconn(), handle_showmaneventq(), handle_shutdown_when_convenient(), handle_softhangup(), handle_unload(), handle_unload_deprecated(), handle_verbose(), handle_version(), handle_version_deprecated(), handle_voicemail_show_users(), handle_voicemail_show_zones(), help1(), help_workhorse(), iax2_do_debug(), iax2_do_jb_debug(), iax2_do_trunk_debug(), iax2_no_debug(), iax2_no_jb_debug(), iax2_no_trunk_debug(), iax2_prov_cmd(), iax2_prune_realtime(), iax2_show_cache(), iax2_show_callnumber_usage(), iax2_show_channels(), iax2_show_firmware(), iax2_show_netstats(), iax2_show_peer(), iax2_show_registry(), iax2_show_stats(), iax2_show_threads(), iax2_show_users(), iax_show_provisioning(), locals_show(), meetme_cmd(), mgcp_audit_endpoint(), mgcp_do_debug(), mgcp_no_debug(), mgcp_show_endpoints(), misdn_reload(), misdn_send_cd(), misdn_send_digit(), misdn_send_display(), misdn_set_debug(), misdn_show_cls(), misdn_show_config(), misdn_show_port(), misdn_show_ports_stats(), misdn_show_stacks(), misdn_toggle_echocancel(), mixmonitor_cli(), modlist_modentry(), moh_classes_show(), odbc_show_command(), orig_app(), orig_exten(), osp_show(), print_bc_info(), print_codec_to_cli(), print_group(), print_uptimestr(), realtime_pgsql_status(), rpt_do_debug(), rpt_do_dump(), rpt_do_fun(), rpt_do_lstats(), rpt_do_nodes(), rpt_do_stats(), rtcp_do_debug(), rtcp_do_debug_deprecated(), rtcp_do_debug_ip(), rtcp_do_debug_ip_deprecated(), rtcp_do_stats(), rtcp_do_stats_deprecated(), rtcp_no_debug(), rtcp_no_debug_deprecated(), rtcp_no_stats(), rtcp_no_stats_deprecated(), rtp_do_debug(), rtp_do_debug_ip(), rtp_no_debug(), show_channeltype(), show_channeltype_deprecated(), show_channeltypes(), show_codec_n(), show_codec_n_deprecated(), show_codecs(), show_codecs_deprecated(), show_config_description(), show_dialplan_helper(), show_file_formats(), show_file_formats_deprecated(), show_image_formats(), show_image_formats_deprecated(), show_keys(), show_license(), show_translation(), show_translation_deprecated(), show_warranty(), sip_do_debug(), sip_do_debug_deprecated(), sip_do_debug_ip(), sip_do_debug_peer(), sip_do_history(), sip_no_debug(), sip_no_debug_deprecated(), sip_no_history(), sip_notify(), sip_prune_realtime(), sip_show_channel(), sip_show_domains(), sip_show_history(), sip_show_inuse(), sip_show_objects(), sip_show_registry(), sip_show_settings(), sip_show_user(), sip_show_users(), skinny_do_debug(), skinny_no_debug(), skinny_show_devices(), skinny_show_lines(), sla_show_stations(), sla_show_trunks(), stun_do_debug(), stun_no_debug(), transcoder_show(), udptl_do_debug(), udptl_do_debug_ip(), and udptl_nodebug().
00060 { 00061 int res; 00062 struct ast_dynamic_str *buf; 00063 va_list ap; 00064 00065 if (!(buf = ast_dynamic_str_thread_get(&ast_cli_buf, AST_CLI_INITLEN))) 00066 return; 00067 00068 va_start(ap, fmt); 00069 res = ast_dynamic_str_thread_set_va(&buf, 0, &ast_cli_buf, fmt, ap); 00070 va_end(ap); 00071 00072 if (res != AST_DYNSTR_BUILD_FAILED) 00073 ast_carefulwrite(fd, buf->str, strlen(buf->str), 100); 00074 }
int ast_cli_command | ( | int | fd, | |
const char * | s | |||
) |
Interprets a command Interpret a command s, sending output to fd Returns 0 on succes, -1 on failure.
Definition at line 1974 of file cli.c.
References ast_cli_entry::_deprecated_by, ast_cli_entry::_full_cmd, ast_atomic_fetchadd_int(), ast_cli(), AST_LIST_LOCK, AST_LIST_UNLOCK, AST_MAX_ARGS, ast_cli_entry::deprecated, find_best(), find_cli(), free, ast_cli_entry::handler, ast_cli_entry::inuse, parse_args(), RESULT_SHOWUSAGE, and ast_cli_entry::usage.
Referenced by action_command(), ast_cli_command_multiple(), cli_activate(), consolehandler(), and exit_completely().
01975 { 01976 char *argv[AST_MAX_ARGS]; 01977 struct ast_cli_entry *e; 01978 int x; 01979 char *dup; 01980 int tws; 01981 01982 if (!(dup = parse_args(s, &x, argv, sizeof(argv) / sizeof(argv[0]), &tws))) 01983 return -1; 01984 01985 /* We need at least one entry, or ignore */ 01986 if (x > 0) { 01987 AST_LIST_LOCK(&helpers); 01988 e = find_cli(argv, 0); 01989 if (e) 01990 e->inuse++; 01991 AST_LIST_UNLOCK(&helpers); 01992 if (e) { 01993 switch(e->handler(fd, x, argv)) { 01994 case RESULT_SHOWUSAGE: 01995 if (e->usage) 01996 ast_cli(fd, "%s", e->usage); 01997 else 01998 ast_cli(fd, "Invalid usage, but no usage information available.\n"); 01999 AST_LIST_LOCK(&helpers); 02000 if (e->deprecated) 02001 ast_cli(fd, "The '%s' command is deprecated and will be removed in a future release. Please use '%s' instead.\n", e->_full_cmd, e->_deprecated_by); 02002 AST_LIST_UNLOCK(&helpers); 02003 break; 02004 default: 02005 AST_LIST_LOCK(&helpers); 02006 if (e->deprecated == 1) { 02007 ast_cli(fd, "The '%s' command is deprecated and will be removed in a future release. Please use '%s' instead.\n", e->_full_cmd, e->_deprecated_by); 02008 e->deprecated = 2; 02009 } 02010 AST_LIST_UNLOCK(&helpers); 02011 break; 02012 } 02013 } else 02014 ast_cli(fd, "No such command '%s' (type 'help %s' for other possible commands)\n", s, find_best(argv)); 02015 if (e) 02016 ast_atomic_fetchadd_int(&e->inuse, -1); 02017 } 02018 free(dup); 02019 02020 return 0; 02021 }
int ast_cli_command_multiple | ( | int | fd, | |
size_t | size, | |||
const char * | s | |||
) |
Executes multiple CLI commands Interpret strings separated by '' and execute each one, sending output to fd.
size | is the total size of the string |
number | of commands executed |
Definition at line 2023 of file cli.c.
References ast_cli_command().
Referenced by netconsole().
02024 { 02025 char cmd[512]; 02026 int x, y = 0, count = 0; 02027 02028 for (x = 0; x < size; x++) { 02029 cmd[y] = s[x]; 02030 y++; 02031 if (s[x] == '\0') { 02032 ast_cli_command(fd, cmd); 02033 y = 0; 02034 count++; 02035 } 02036 } 02037 return count; 02038 }
char* ast_cli_complete | ( | const char * | word, | |
char *const | choices[], | |||
int | pos | |||
) |
Helper function to generate cli entries from a NULL-terminated array. Returns the n-th matching entry from the array, or NULL if not found. Can be used to implement generate() for static entries as below (in this example we complete the word in position 2):.
char *my_generate(const char *line, const char *word, int pos, int n) { static char *choices = { "one", "two", "three", NULL }; if (pos == 2) return ast_cli_complete(word, choices, n); else return NULL; }
Definition at line 1167 of file cli.c.
References ast_strdup, ast_strlen_zero(), and len().
Referenced by autoanswer_complete(), autoanswer_complete_deprecated(), complete_meetmecmd(), complete_orig(), complete_show_applications(), complete_show_applications_deprecated(), complete_show_channels(), and complete_show_channels_deprecated().
01168 { 01169 int i, which = 0, len; 01170 len = ast_strlen_zero(word) ? 0 : strlen(word); 01171 01172 for (i = 0; choices[i]; i++) { 01173 if ((!len || !strncasecmp(word, choices[i], len)) && ++which > state) 01174 return ast_strdup(choices[i]); 01175 } 01176 return NULL; 01177 }
char** ast_cli_completion_matches | ( | const char * | , | |
const char * | ||||
) |
Generates a NULL-terminated array of strings that 1) begin with the string in the second parameter, and 2) are valid in a command after the string in the first parameter.
The first entry (offset 0) of the result is the longest common substring in the results, useful to extend the string that has been completed. Subsequent entries are all possible values, followe by a NULL. All strings and the array itself are malloc'ed and must be freed by the caller.
Definition at line 1878 of file cli.c.
References ast_cli_generator(), ast_copy_string(), ast_malloc, and ast_realloc.
Referenced by cli_complete(), and handle_commandmatchesarray().
01879 { 01880 char **match_list = NULL, *retstr, *prevstr; 01881 size_t match_list_len, max_equal, which, i; 01882 int matches = 0; 01883 01884 /* leave entry 0 free for the longest common substring */ 01885 match_list_len = 1; 01886 while ((retstr = ast_cli_generator(text, word, matches)) != NULL) { 01887 if (matches + 1 >= match_list_len) { 01888 match_list_len <<= 1; 01889 if (!(match_list = ast_realloc(match_list, match_list_len * sizeof(*match_list)))) 01890 return NULL; 01891 } 01892 match_list[++matches] = retstr; 01893 } 01894 01895 if (!match_list) 01896 return match_list; /* NULL */ 01897 01898 /* Find the longest substring that is common to all results 01899 * (it is a candidate for completion), and store a copy in entry 0. 01900 */ 01901 prevstr = match_list[1]; 01902 max_equal = strlen(prevstr); 01903 for (which = 2; which <= matches; which++) { 01904 for (i = 0; i < max_equal && toupper(prevstr[i]) == toupper(match_list[which][i]); i++) 01905 continue; 01906 max_equal = i; 01907 } 01908 01909 if (!(retstr = ast_malloc(max_equal + 1))) 01910 return NULL; 01911 01912 ast_copy_string(retstr, match_list[1], max_equal + 1); 01913 match_list[0] = retstr; 01914 01915 /* ensure that the array is NULL terminated */ 01916 if (matches + 1 >= match_list_len) { 01917 if (!(match_list = ast_realloc(match_list, (match_list_len + 1) * sizeof(*match_list)))) 01918 return NULL; 01919 } 01920 match_list[matches + 1] = NULL; 01921 01922 return match_list; 01923 }
char* ast_cli_generator | ( | const char * | text, | |
const char * | word, | |||
int | state | |||
) |
Readline madness Useful for readline, that's about it Returns 0 on success, -1 on failure.
Definition at line 1969 of file cli.c.
References __ast_cli_generator().
Referenced by ast_cli_completion_matches(), and ast_cli_generatornummatches().
01970 { 01971 return __ast_cli_generator(text, word, state, 1); 01972 }
int ast_cli_generatornummatches | ( | const char * | text, | |
const char * | word | |||
) |
Return the number of unique matches for the generator.
Definition at line 1861 of file cli.c.
References ast_cli_generator(), and free.
Referenced by handle_commandnummatches().
01862 { 01863 int matches = 0, i = 0; 01864 char *buf = NULL, *oldbuf = NULL; 01865 01866 while ((buf = ast_cli_generator(text, word, i++))) { 01867 if (!oldbuf || strcmp(buf,oldbuf)) 01868 matches++; 01869 if (oldbuf) 01870 free(oldbuf); 01871 oldbuf = buf; 01872 } 01873 if (oldbuf) 01874 free(oldbuf); 01875 return matches; 01876 }
int ast_cli_register | ( | struct ast_cli_entry * | e | ) |
Registers a command or an array of commands.
e | which cli entry to register Register your own command Returns 0 on success, -1 on failure |
Definition at line 1703 of file cli.c.
References __ast_cli_register().
Referenced by ast_cdr_engine_init(), ast_cli_register_multiple(), dnsmgr_init(), do_reload(), and load_module().
01704 { 01705 return __ast_cli_register(e, NULL); 01706 }
void ast_cli_register_multiple | ( | struct ast_cli_entry * | e, | |
int | len | |||
) |
Register multiple commands.
e | pointer to first cli entry to register | |
len | number of entries to register |
Definition at line 1711 of file cli.c.
References ast_cli_register().
Referenced by __ast_register_translator(), ast_builtins_init(), ast_channels_init(), ast_file_init(), ast_http_init(), ast_image_init(), ast_rtp_init(), ast_udptl_init(), ast_utils_init(), astdb_init(), astobj2_init(), crypto_init(), iax_provision_init(), init_framer(), init_logger(), init_manager(), load_module(), load_pbx(), main(), and register_config_cli().
01712 { 01713 int i; 01714 01715 for (i = 0; i < len; i++) 01716 ast_cli_register(e + i); 01717 }
int ast_cli_unregister | ( | struct ast_cli_entry * | e | ) |
Unregisters a command or an array of commands.
e | which cli entry to unregister Unregister your own command. You must pass a completed ast_cli_entry structure Returns 0. |
Definition at line 1697 of file cli.c.
References __ast_cli_unregister().
Referenced by ast_cli_unregister_multiple(), do_reload(), load_module(), and unload_module().
01698 { 01699 return __ast_cli_unregister(e, NULL); 01700 }
void ast_cli_unregister_multiple | ( | struct ast_cli_entry * | e, | |
int | len | |||
) |
Unregister multiple commands.
e | pointer to first cli entry to unregister | |
len | number of entries to unregister |
Definition at line 1719 of file cli.c.
References ast_cli_unregister().
Referenced by __unload_module(), iax_provision_unload(), load_module(), and unload_module().
01720 { 01721 int i; 01722 01723 for (i = 0; i < len; i++) 01724 ast_cli_unregister(e + i); 01725 }
char* ast_complete_channels | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state, | |||
int | rpos | |||
) |
Command completion for the list of active channels.
This can be called from a CLI command completion function that wants to complete from the list of active channels. 'rpos' is the required position in the command. This function will return NULL immediately if 'rpos' is not the same as the current position, 'pos'.
Definition at line 1193 of file cli.c.
References ast_channel_unlock, ast_channel_walk_locked(), ast_strdup, and ast_channel::name.
Referenced by complete_ch_3(), complete_ch_4(), complete_ch_5(), and complete_mixmonitor_cli().
01194 { 01195 struct ast_channel *c = NULL; 01196 int which = 0; 01197 int wordlen; 01198 char notfound = '\0'; 01199 char *ret = ¬found; /* so NULL can break the loop */ 01200 01201 if (pos != rpos) 01202 return NULL; 01203 01204 wordlen = strlen(word); 01205 01206 while (ret == ¬found && (c = ast_channel_walk_locked(c))) { 01207 if (!strncasecmp(word, c->name, wordlen) && ++which > state) 01208 ret = ast_strdup(c->name); 01209 ast_channel_unlock(c); 01210 } 01211 return ret == ¬found ? NULL : ret; 01212 }
static struct ast_cli_entry* cli_next | ( | struct cli_iterator * | i | ) | [static] |
Definition at line 1535 of file cli.c.
References ast_cli_entry::_full_cmd, AST_LIST_FIRST, AST_LIST_NEXT, builtins, cli_iterator::builtins, ast_cli_entry::cmda, cli_iterator::helpers, and ast_cli_entry::list.
Referenced by __ast_cli_generator(), find_cli(), and help1().
01536 { 01537 struct ast_cli_entry *e; 01538 01539 if (i->builtins == NULL && i->helpers == NULL) { 01540 /* initialize */ 01541 i->builtins = builtins; 01542 i->helpers = AST_LIST_FIRST(&helpers); 01543 } 01544 e = i->builtins; /* temporary */ 01545 if (!e->cmda[0] || (i->helpers && 01546 strcmp(i->helpers->_full_cmd, e->_full_cmd) < 0)) { 01547 /* Use helpers */ 01548 e = i->helpers; 01549 if (e) 01550 i->helpers = AST_LIST_NEXT(e, list); 01551 } else { /* use builtin. e is already set */ 01552 (i->builtins)++; /* move to next */ 01553 } 01554 return e; 01555 }
static char* complete_ch_3 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1214 of file cli.c.
References ast_complete_channels().
01215 { 01216 return ast_complete_channels(line, word, pos, state, 2); 01217 }
static char* complete_ch_4 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1219 of file cli.c.
References ast_complete_channels().
01220 { 01221 return ast_complete_channels(line, word, pos, state, 3); 01222 }
static char* complete_ch_5 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1224 of file cli.c.
References ast_complete_channels().
01225 { 01226 return ast_complete_channels(line, word, pos, state, 4); 01227 }
static char* complete_fn_2 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1249 of file cli.c.
References ast_config_AST_MODULE_DIR, ast_copy_string(), free, and strdup.
01250 { 01251 char *c, *d; 01252 char filename[PATH_MAX]; 01253 01254 if (pos != 1) 01255 return NULL; 01256 01257 if (word[0] == '/') 01258 ast_copy_string(filename, word, sizeof(filename)); 01259 else 01260 snprintf(filename, sizeof(filename), "%s/%s", ast_config_AST_MODULE_DIR, word); 01261 01262 c = d = filename_completion_function(filename, state); 01263 01264 if (c && word[0] != '/') 01265 c += (strlen(ast_config_AST_MODULE_DIR) + 1); 01266 if (c) 01267 c = strdup(c); 01268 free(d); 01269 01270 return c; 01271 }
static char* complete_fn_3 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1273 of file cli.c.
References ast_config_AST_MODULE_DIR, ast_copy_string(), free, and strdup.
01274 { 01275 char *c, *d; 01276 char filename[PATH_MAX]; 01277 01278 if (pos != 2) 01279 return NULL; 01280 01281 if (word[0] == '/') 01282 ast_copy_string(filename, word, sizeof(filename)); 01283 else 01284 snprintf(filename, sizeof(filename), "%s/%s", ast_config_AST_MODULE_DIR, word); 01285 01286 c = d = filename_completion_function(filename, state); 01287 01288 if (c && word[0] != '/') 01289 c += (strlen(ast_config_AST_MODULE_DIR) + 1); 01290 if (c) 01291 c = strdup(c); 01292 01293 free(d); 01294 01295 return c; 01296 }
static char* complete_help | ( | const char * | text, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1341 of file cli.c.
References __ast_cli_generator().
01342 { 01343 /* skip first 4 or 5 chars, "help "*/ 01344 int l = strlen(text); 01345 01346 if (l > 5) 01347 l = 5; 01348 text += l; 01349 /* XXX watch out, should stop to the non-generator parts */ 01350 return __ast_cli_generator(text, word, state, 0); 01351 }
static char* complete_mod_2 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1229 of file cli.c.
References ast_module_helper().
01230 { 01231 return ast_module_helper(line, word, pos, state, 1, 1); 01232 }
static char* complete_mod_3 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1239 of file cli.c.
References ast_module_helper().
01240 { 01241 return ast_module_helper(line, word, pos, state, 2, 1); 01242 }
static char* complete_mod_3_nr | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1234 of file cli.c.
References ast_module_helper().
01235 { 01236 return ast_module_helper(line, word, pos, state, 2, 0); 01237 }
static char* complete_mod_4 | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1244 of file cli.c.
References ast_module_helper().
01245 { 01246 return ast_module_helper(line, word, pos, state, 3, 0); 01247 }
static char* complete_show_channels | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1186 of file cli.c.
References ast_cli_complete().
01187 { 01188 static char *choices[] = { "concise", "verbose", NULL }; 01189 01190 return (pos != 3) ? NULL : ast_cli_complete(word, choices, state); 01191 }
static char* complete_show_channels_deprecated | ( | const char * | line, | |
const char * | word, | |||
int | pos, | |||
int | state | |||
) | [static] |
Definition at line 1179 of file cli.c.
References ast_cli_complete().
01180 { 01181 static char *choices[] = { "concise", "verbose", NULL }; 01182 01183 return (pos != 2) ? NULL : ast_cli_complete(word, choices, state); 01184 }
static char* find_best | ( | char * | argv[] | ) | [static] |
Definition at line 1603 of file cli.c.
References ast_join(), AST_LIST_LOCK, AST_LIST_UNLOCK, AST_MAX_CMD_LEN, and find_cli().
Referenced by ast_cli_command(), ring_one(), and store_next().
01604 { 01605 static char cmdline[80]; 01606 int x; 01607 /* See how close we get, then print the candidate */ 01608 char *myargv[AST_MAX_CMD_LEN]; 01609 for (x=0;x<AST_MAX_CMD_LEN;x++) 01610 myargv[x]=NULL; 01611 AST_LIST_LOCK(&helpers); 01612 for (x=0;argv[x];x++) { 01613 myargv[x] = argv[x]; 01614 if (!find_cli(myargv, -1)) 01615 break; 01616 } 01617 AST_LIST_UNLOCK(&helpers); 01618 ast_join(cmdline, sizeof(cmdline), myargv); 01619 return cmdline; 01620 }
static struct ast_cli_entry* find_cli | ( | char *const | cmds[], | |
int | match_type | |||
) | [static] |
locate a cli command in the 'helpers' list (which must be locked). exact has 3 values: 0 returns if the search key is equal or longer than the entry. -1 true if the mismatch is on the last word XXX not true! 1 true only on complete, exact match.
Definition at line 1564 of file cli.c.
References cli_next().
Referenced by __ast_cli_register(), ast_cli_command(), find_best(), and handle_help().
01565 { 01566 int matchlen = -1; /* length of longest match so far */ 01567 struct ast_cli_entry *cand = NULL, *e=NULL; 01568 struct cli_iterator i = { NULL, NULL}; 01569 01570 while( (e = cli_next(&i)) ) { 01571 int y; 01572 for (y = 0 ; cmds[y] && e->cmda[y]; y++) { 01573 if (strcasecmp(e->cmda[y], cmds[y])) 01574 break; 01575 } 01576 if (e->cmda[y] == NULL) { /* no more words in candidate */ 01577 if (cmds[y] == NULL) /* this is an exact match, cannot do better */ 01578 break; 01579 /* here the search key is longer than the candidate */ 01580 if (match_type != 0) /* but we look for almost exact match... */ 01581 continue; /* so we skip this one. */ 01582 /* otherwise we like it (case 0) */ 01583 } else { /* still words in candidate */ 01584 if (cmds[y] == NULL) /* search key is shorter, not good */ 01585 continue; 01586 /* if we get here, both words exist but there is a mismatch */ 01587 if (match_type == 0) /* not the one we look for */ 01588 continue; 01589 if (match_type == 1) /* not the one we look for */ 01590 continue; 01591 if (cmds[y+1] != NULL || e->cmda[y+1] != NULL) /* not the one we look for */ 01592 continue; 01593 /* we are in case match_type == -1 and mismatch on last word */ 01594 } 01595 if (y > matchlen) { /* remember the candidate */ 01596 matchlen = y; 01597 cand = e; 01598 } 01599 } 01600 return e ? e : cand; 01601 }
static int group_show_channels | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1298 of file cli.c.
References ast_app_group_list_head(), ast_app_group_list_lock(), ast_app_group_list_unlock(), ast_cli(), AST_LIST_NEXT, ast_strlen_zero(), ast_group_info::category, ast_group_info::chan, FORMAT_STRING, ast_group_info::group, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01299 { 01300 #define FORMAT_STRING "%-25s %-20s %-20s\n" 01301 01302 struct ast_group_info *gi = NULL; 01303 int numchans = 0; 01304 regex_t regexbuf; 01305 int havepattern = 0; 01306 01307 if (argc < 3 || argc > 4) 01308 return RESULT_SHOWUSAGE; 01309 01310 if (argc == 4) { 01311 if (regcomp(®exbuf, argv[3], REG_EXTENDED | REG_NOSUB)) 01312 return RESULT_SHOWUSAGE; 01313 havepattern = 1; 01314 } 01315 01316 ast_cli(fd, FORMAT_STRING, "Channel", "Group", "Category"); 01317 01318 ast_app_group_list_lock(); 01319 01320 gi = ast_app_group_list_head(); 01321 while (gi) { 01322 if (!havepattern || !regexec(®exbuf, gi->group, 0, NULL, 0)) { 01323 ast_cli(fd, FORMAT_STRING, gi->chan->name, gi->group, (ast_strlen_zero(gi->category) ? "(default)" : gi->category)); 01324 numchans++; 01325 } 01326 gi = AST_LIST_NEXT(gi, list); 01327 } 01328 01329 ast_app_group_list_unlock(); 01330 01331 if (havepattern) 01332 regfree(®exbuf); 01333 01334 ast_cli(fd, "%d active channel%s\n", numchans, (numchans != 1) ? "s" : ""); 01335 return RESULT_SUCCESS; 01336 #undef FORMAT_STRING 01337 }
static int handle_chanlist | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 685 of file cli.c.
References ast_channel::_state, ast_channel::accountcode, ast_channel::amaflags, ast_channel::appl, ast_active_calls(), ast_bridged_channel(), ast_channel_unlock, ast_channel_walk_locked(), ast_cli(), ast_state2str(), ast_strlen_zero(), ast_tvdiff_ms(), ast_tvnow(), ast_tvzero(), ast_channel::cdr, ast_channel::cid, ast_callerid::cid_num, CONCISE_FORMAT_STRING, ast_channel::context, ast_channel::data, ESS, ast_channel::exten, FORMAT_STRING, FORMAT_STRING2, ast_channel::name, option_maxcalls, ast_channel::priority, RESULT_SHOWUSAGE, RESULT_SUCCESS, S_OR, ast_cdr::start, VERBOSE_FORMAT_STRING, and VERBOSE_FORMAT_STRING2.
00686 { 00687 struct ast_channel *c = NULL; 00688 char durbuf[10] = "-"; 00689 char locbuf[40]; 00690 char appdata[40]; 00691 int duration; 00692 int durh, durm, durs; 00693 int numchans = 0, concise = 0, verbose = 0; 00694 00695 concise = (argc == 4 && (!strcasecmp(argv[3],"concise"))); 00696 verbose = (argc == 4 && (!strcasecmp(argv[3],"verbose"))); 00697 00698 if (argc < 3 || argc > 4 || (argc == 4 && !concise && !verbose)) 00699 return RESULT_SHOWUSAGE; 00700 00701 if (!concise && !verbose) 00702 ast_cli(fd, FORMAT_STRING2, "Channel", "Location", "State", "Application(Data)"); 00703 else if (verbose) 00704 ast_cli(fd, VERBOSE_FORMAT_STRING2, "Channel", "Context", "Extension", "Priority", "State", "Application", "Data", 00705 "CallerID", "Duration", "Accountcode", "BridgedTo"); 00706 00707 while ((c = ast_channel_walk_locked(c)) != NULL) { 00708 struct ast_channel *bc = ast_bridged_channel(c); 00709 if ((concise || verbose) && c->cdr && !ast_tvzero(c->cdr->start)) { 00710 duration = (int)(ast_tvdiff_ms(ast_tvnow(), c->cdr->start) / 1000); 00711 if (verbose) { 00712 durh = duration / 3600; 00713 durm = (duration % 3600) / 60; 00714 durs = duration % 60; 00715 snprintf(durbuf, sizeof(durbuf), "%02d:%02d:%02d", durh, durm, durs); 00716 } else { 00717 snprintf(durbuf, sizeof(durbuf), "%d", duration); 00718 } 00719 } else { 00720 durbuf[0] = '\0'; 00721 } 00722 if (concise) { 00723 ast_cli(fd, CONCISE_FORMAT_STRING, c->name, c->context, c->exten, c->priority, ast_state2str(c->_state), 00724 c->appl ? c->appl : "(None)", 00725 S_OR(c->data, ""), /* XXX different from verbose ? */ 00726 S_OR(c->cid.cid_num, ""), 00727 S_OR(c->accountcode, ""), 00728 c->amaflags, 00729 durbuf, 00730 bc ? bc->name : "(None)"); 00731 } else if (verbose) { 00732 ast_cli(fd, VERBOSE_FORMAT_STRING, c->name, c->context, c->exten, c->priority, ast_state2str(c->_state), 00733 c->appl ? c->appl : "(None)", 00734 c->data ? S_OR(c->data, "(Empty)" ): "(None)", 00735 S_OR(c->cid.cid_num, ""), 00736 durbuf, 00737 S_OR(c->accountcode, ""), 00738 bc ? bc->name : "(None)"); 00739 } else { 00740 if (!ast_strlen_zero(c->context) && !ast_strlen_zero(c->exten)) 00741 snprintf(locbuf, sizeof(locbuf), "%s@%s:%d", c->exten, c->context, c->priority); 00742 else 00743 strcpy(locbuf, "(None)"); 00744 if (c->appl) 00745 snprintf(appdata, sizeof(appdata), "%s(%s)", c->appl, c->data ? c->data : ""); 00746 else 00747 strcpy(appdata, "(None)"); 00748 ast_cli(fd, FORMAT_STRING, c->name, locbuf, ast_state2str(c->_state), appdata); 00749 } 00750 numchans++; 00751 ast_channel_unlock(c); 00752 } 00753 if (!concise) { 00754 ast_cli(fd, "%d active channel%s\n", numchans, ESS(numchans)); 00755 if (option_maxcalls) 00756 ast_cli(fd, "%d of %d max active call%s (%5.2f%% of capacity)\n", 00757 ast_active_calls(), option_maxcalls, ESS(ast_active_calls()), 00758 ((double)ast_active_calls() / (double)option_maxcalls) * 100.0); 00759 else 00760 ast_cli(fd, "%d active call%s\n", ast_active_calls(), ESS(ast_active_calls())); 00761 } 00762 return RESULT_SUCCESS; 00763 }
static int handle_chanlist_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 605 of file cli.c.
References ast_channel::_state, ast_channel::accountcode, ast_channel::amaflags, ast_channel::appl, ast_active_calls(), ast_bridged_channel(), ast_channel_unlock, ast_channel_walk_locked(), ast_cli(), ast_state2str(), ast_strlen_zero(), ast_tvdiff_ms(), ast_tvnow(), ast_tvzero(), ast_channel::cdr, ast_channel::cid, ast_callerid::cid_num, CONCISE_FORMAT_STRING, ast_channel::context, ast_channel::data, ESS, ast_channel::exten, FORMAT_STRING, FORMAT_STRING2, ast_channel::name, option_maxcalls, ast_channel::priority, RESULT_SHOWUSAGE, RESULT_SUCCESS, S_OR, ast_cdr::start, VERBOSE_FORMAT_STRING, and VERBOSE_FORMAT_STRING2.
00606 { 00607 struct ast_channel *c = NULL; 00608 char durbuf[10] = "-"; 00609 char locbuf[40]; 00610 char appdata[40]; 00611 int duration; 00612 int durh, durm, durs; 00613 int numchans = 0, concise = 0, verbose = 0; 00614 00615 concise = (argc == 3 && (!strcasecmp(argv[2],"concise"))); 00616 verbose = (argc == 3 && (!strcasecmp(argv[2],"verbose"))); 00617 00618 if (argc < 2 || argc > 3 || (argc == 3 && !concise && !verbose)) 00619 return RESULT_SHOWUSAGE; 00620 00621 if (!concise && !verbose) 00622 ast_cli(fd, FORMAT_STRING2, "Channel", "Location", "State", "Application(Data)"); 00623 else if (verbose) 00624 ast_cli(fd, VERBOSE_FORMAT_STRING2, "Channel", "Context", "Extension", "Priority", "State", "Application", "Data", 00625 "CallerID", "Duration", "Accountcode", "BridgedTo"); 00626 00627 while ((c = ast_channel_walk_locked(c)) != NULL) { 00628 struct ast_channel *bc = ast_bridged_channel(c); 00629 if ((concise || verbose) && c->cdr && !ast_tvzero(c->cdr->start)) { 00630 duration = (int)(ast_tvdiff_ms(ast_tvnow(), c->cdr->start) / 1000); 00631 if (verbose) { 00632 durh = duration / 3600; 00633 durm = (duration % 3600) / 60; 00634 durs = duration % 60; 00635 snprintf(durbuf, sizeof(durbuf), "%02d:%02d:%02d", durh, durm, durs); 00636 } else { 00637 snprintf(durbuf, sizeof(durbuf), "%d", duration); 00638 } 00639 } else { 00640 durbuf[0] = '\0'; 00641 } 00642 if (concise) { 00643 ast_cli(fd, CONCISE_FORMAT_STRING, c->name, c->context, c->exten, c->priority, ast_state2str(c->_state), 00644 c->appl ? c->appl : "(None)", 00645 S_OR(c->data, ""), /* XXX different from verbose ? */ 00646 S_OR(c->cid.cid_num, ""), 00647 S_OR(c->accountcode, ""), 00648 c->amaflags, 00649 durbuf, 00650 bc ? bc->name : "(None)"); 00651 } else if (verbose) { 00652 ast_cli(fd, VERBOSE_FORMAT_STRING, c->name, c->context, c->exten, c->priority, ast_state2str(c->_state), 00653 c->appl ? c->appl : "(None)", 00654 c->data ? S_OR(c->data, "(Empty)" ): "(None)", 00655 S_OR(c->cid.cid_num, ""), 00656 durbuf, 00657 S_OR(c->accountcode, ""), 00658 bc ? bc->name : "(None)"); 00659 } else { 00660 if (!ast_strlen_zero(c->context) && !ast_strlen_zero(c->exten)) 00661 snprintf(locbuf, sizeof(locbuf), "%s@%s:%d", c->exten, c->context, c->priority); 00662 else 00663 strcpy(locbuf, "(None)"); 00664 if (c->appl) 00665 snprintf(appdata, sizeof(appdata), "%s(%s)", c->appl, c->data ? c->data : ""); 00666 else 00667 strcpy(appdata, "(None)"); 00668 ast_cli(fd, FORMAT_STRING, c->name, locbuf, ast_state2str(c->_state), appdata); 00669 } 00670 numchans++; 00671 ast_channel_unlock(c); 00672 } 00673 if (!concise) { 00674 ast_cli(fd, "%d active channel%s\n", numchans, ESS(numchans)); 00675 if (option_maxcalls) 00676 ast_cli(fd, "%d of %d max active call%s (%5.2f%% of capacity)\n", 00677 ast_active_calls(), option_maxcalls, ESS(ast_active_calls()), 00678 ((double)ast_active_calls() / (double)option_maxcalls) * 100.0); 00679 else 00680 ast_cli(fd, "%d active call%s\n", ast_active_calls(), ESS(ast_active_calls())); 00681 } 00682 return RESULT_SUCCESS; 00683 }
static int handle_commandcomplete | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 868 of file cli.c.
References __ast_cli_generator(), ast_cli(), free, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00869 { 00870 char *buf; 00871 00872 if (argc != 5) 00873 return RESULT_SHOWUSAGE; 00874 buf = __ast_cli_generator(argv[2], argv[3], atoi(argv[4]), 0); 00875 if (buf) { 00876 ast_cli(fd, "%s", buf); 00877 free(buf); 00878 } else 00879 ast_cli(fd, "NULL\n"); 00880 return RESULT_SUCCESS; 00881 }
static int handle_commandmatchesarray | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 811 of file cli.c.
References ast_cli(), AST_CLI_COMPLETE_EOF, ast_cli_completion_matches(), ast_malloc, ast_realloc, free, len(), RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00812 { 00813 char *buf, *obuf; 00814 int buflen = 2048; 00815 int len = 0; 00816 char **matches; 00817 int x, matchlen; 00818 00819 if (argc != 4) 00820 return RESULT_SHOWUSAGE; 00821 if (!(buf = ast_malloc(buflen))) 00822 return RESULT_FAILURE; 00823 buf[len] = '\0'; 00824 matches = ast_cli_completion_matches(argv[2], argv[3]); 00825 if (matches) { 00826 for (x=0; matches[x]; x++) { 00827 matchlen = strlen(matches[x]) + 1; 00828 if (len + matchlen >= buflen) { 00829 buflen += matchlen * 3; 00830 obuf = buf; 00831 if (!(buf = ast_realloc(obuf, buflen))) 00832 /* Memory allocation failure... Just free old buffer and be done */ 00833 free(obuf); 00834 } 00835 if (buf) 00836 len += sprintf( buf + len, "%s ", matches[x]); 00837 free(matches[x]); 00838 matches[x] = NULL; 00839 } 00840 free(matches); 00841 } 00842 00843 if (buf) { 00844 ast_cli(fd, "%s%s",buf, AST_CLI_COMPLETE_EOF); 00845 free(buf); 00846 } else 00847 ast_cli(fd, "NULL\n"); 00848 00849 return RESULT_SUCCESS; 00850 }
static int handle_commandnummatches | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 854 of file cli.c.
References ast_cli(), ast_cli_generatornummatches(), RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00855 { 00856 int matches = 0; 00857 00858 if (argc != 4) 00859 return RESULT_SHOWUSAGE; 00860 00861 matches = ast_cli_generatornummatches(argv[2], argv[3]); 00862 00863 ast_cli(fd, "%d", matches); 00864 00865 return RESULT_SUCCESS; 00866 }
static int handle_core_set_debug_channel | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 917 of file cli.c.
References ast_channel_unlock, ast_channel_walk_locked(), ast_cli(), ast_get_channel_by_name_locked(), DEBUGCHAN_FLAG, ast_channel::fin, ast_channel::fout, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00918 { 00919 struct ast_channel *c = NULL; 00920 int is_all, is_off = 0; 00921 00922 /* 'core set debug channel {all|chan_id}' */ 00923 if (argc == 6 && strcmp(argv[5], "off") == 0) 00924 is_off = 1; 00925 else if (argc != 5) 00926 return RESULT_SHOWUSAGE; 00927 00928 is_all = !strcasecmp("all", argv[4]); 00929 if (is_all) { 00930 if (is_off) { 00931 global_fin &= ~DEBUGCHAN_FLAG; 00932 global_fout &= ~DEBUGCHAN_FLAG; 00933 } else { 00934 global_fin |= DEBUGCHAN_FLAG; 00935 global_fout |= DEBUGCHAN_FLAG; 00936 } 00937 c = ast_channel_walk_locked(NULL); 00938 } else { 00939 c = ast_get_channel_by_name_locked(argv[4]); 00940 if (c == NULL) 00941 ast_cli(fd, "No such channel %s\n", argv[4]); 00942 } 00943 while (c) { 00944 if (!(c->fin & DEBUGCHAN_FLAG) || !(c->fout & DEBUGCHAN_FLAG)) { 00945 if (is_off) { 00946 c->fin &= ~DEBUGCHAN_FLAG; 00947 c->fout &= ~DEBUGCHAN_FLAG; 00948 } else { 00949 c->fin |= DEBUGCHAN_FLAG; 00950 c->fout |= DEBUGCHAN_FLAG; 00951 } 00952 ast_cli(fd, "Debugging %s on channel %s\n", is_off ? "disabled" : "enabled", c->name); 00953 } 00954 ast_channel_unlock(c); 00955 if (!is_all) 00956 break; 00957 c = ast_channel_walk_locked(c); 00958 } 00959 ast_cli(fd, "Debugging on new channels is %s\n", is_off ? "disabled" : "enabled"); 00960 return RESULT_SUCCESS; 00961 }
static int handle_debugchan_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 883 of file cli.c.
References ast_channel_unlock, ast_channel_walk_locked(), ast_cli(), ast_get_channel_by_name_locked(), DEBUGCHAN_FLAG, ast_channel::fin, ast_channel::fout, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00884 { 00885 struct ast_channel *c=NULL; 00886 int is_all; 00887 00888 /* 'debug channel {all|chan_id}' */ 00889 if (argc != 3) 00890 return RESULT_SHOWUSAGE; 00891 00892 is_all = !strcasecmp("all", argv[2]); 00893 if (is_all) { 00894 global_fin |= DEBUGCHAN_FLAG; 00895 global_fout |= DEBUGCHAN_FLAG; 00896 c = ast_channel_walk_locked(NULL); 00897 } else { 00898 c = ast_get_channel_by_name_locked(argv[2]); 00899 if (c == NULL) 00900 ast_cli(fd, "No such channel %s\n", argv[2]); 00901 } 00902 while (c) { 00903 if (!(c->fin & DEBUGCHAN_FLAG) || !(c->fout & DEBUGCHAN_FLAG)) { 00904 c->fin |= DEBUGCHAN_FLAG; 00905 c->fout |= DEBUGCHAN_FLAG; 00906 ast_cli(fd, "Debugging enabled on channel %s\n", c->name); 00907 } 00908 ast_channel_unlock(c); 00909 if (!is_all) 00910 break; 00911 c = ast_channel_walk_locked(c); 00912 } 00913 ast_cli(fd, "Debugging on new channels is enabled\n"); 00914 return RESULT_SUCCESS; 00915 }
static int handle_debuglevel_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 384 of file cli.c.
References ast_cli(), ast_copy_string(), debug_filename, option_debug, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00385 { 00386 int newlevel; 00387 char *filename = "<any>"; 00388 if ((argc < 3) || (argc > 4)) 00389 return RESULT_SHOWUSAGE; 00390 if (sscanf(argv[2], "%30d", &newlevel) != 1) 00391 return RESULT_SHOWUSAGE; 00392 option_debug = newlevel; 00393 if (argc == 4) { 00394 filename = argv[3]; 00395 ast_copy_string(debug_filename, filename, sizeof(debug_filename)); 00396 } else { 00397 debug_filename[0] = '\0'; 00398 } 00399 ast_cli(fd, "Debugging level set to %d, file '%s'\n", newlevel, filename); 00400 return RESULT_SUCCESS; 00401 }
static int handle_help | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1770 of file cli.c.
References ast_cli(), ast_join(), AST_LIST_LOCK, AST_LIST_UNLOCK, find_cli(), help1(), help_workhorse(), RESULT_SHOWUSAGE, RESULT_SUCCESS, and ast_cli_entry::usage.
01771 { 01772 char fullcmd[80]; 01773 struct ast_cli_entry *e; 01774 int res = RESULT_SUCCESS; 01775 01776 if (argc < 1) 01777 return RESULT_SHOWUSAGE; 01778 if (argc == 1) 01779 return help_workhorse(fd, NULL); 01780 01781 AST_LIST_LOCK(&helpers); 01782 e = find_cli(argv + 1, 1); /* try exact match first */ 01783 if (!e) { 01784 res = help1(fd, argv + 1, 1 /* locked */); 01785 AST_LIST_UNLOCK(&helpers); 01786 return res; 01787 } 01788 if (e->usage) 01789 ast_cli(fd, "%s", e->usage); 01790 else { 01791 ast_join(fullcmd, sizeof(fullcmd), argv+1); 01792 ast_cli(fd, "No help text available for '%s'.\n", fullcmd); 01793 } 01794 AST_LIST_UNLOCK(&helpers); 01795 return res; 01796 }
static int handle_load | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 152 of file cli.c.
References ast_cli(), ast_load_resource(), RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00153 { 00154 if (argc != 3) 00155 return RESULT_SHOWUSAGE; 00156 if (ast_load_resource(argv[2])) { 00157 ast_cli(fd, "Unable to load module %s\n", argv[2]); 00158 return RESULT_FAILURE; 00159 } 00160 return RESULT_SUCCESS; 00161 }
static int handle_load_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 141 of file cli.c.
References ast_cli(), ast_load_resource(), RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00142 { 00143 if (argc != 2) 00144 return RESULT_SHOWUSAGE; 00145 if (ast_load_resource(argv[1])) { 00146 ast_cli(fd, "Unable to load module %s\n", argv[1]); 00147 return RESULT_FAILURE; 00148 } 00149 return RESULT_SUCCESS; 00150 }
static int handle_logger_mute | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 403 of file cli.c.
References ast_console_toggle_mute(), RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00404 { 00405 if (argc < 2 || argc > 3) 00406 return RESULT_SHOWUSAGE; 00407 if (argc == 3 && !strcasecmp(argv[2], "silent")) 00408 ast_console_toggle_mute(fd, 1); 00409 else 00410 ast_console_toggle_mute(fd, 0); 00411 return RESULT_SUCCESS; 00412 }
static int handle_modlist | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 577 of file cli.c.
References ast_cli(), ast_mutex_lock, ast_mutex_unlock, ast_update_module_list(), climodentrylock, MODLIST_FORMAT2, modlist_modentry(), RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00578 { 00579 char *like = ""; 00580 if (argc == 3) 00581 return RESULT_SHOWUSAGE; 00582 else if (argc >= 4) { 00583 if (strcmp(argv[2],"like")) 00584 return RESULT_SHOWUSAGE; 00585 like = argv[3]; 00586 } 00587 00588 ast_mutex_lock(&climodentrylock); 00589 climodentryfd = fd; /* global, protected by climodentrylock */ 00590 ast_cli(fd, MODLIST_FORMAT2, "Module", "Description", "Use Count"); 00591 ast_cli(fd,"%d modules loaded\n", ast_update_module_list(modlist_modentry, like)); 00592 climodentryfd = -1; 00593 ast_mutex_unlock(&climodentrylock); 00594 return RESULT_SUCCESS; 00595 }
static int handle_nodebug | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 370 of file cli.c.
References ast_cli(), debug_filename, option_debug, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00371 { 00372 int oldval = option_debug; 00373 if (argc != 4) 00374 return RESULT_SHOWUSAGE; 00375 00376 option_debug = 0; 00377 debug_filename[0] = '\0'; 00378 00379 if (oldval > 0) 00380 ast_cli(fd, "Core debug is now OFF\n"); 00381 return RESULT_SUCCESS; 00382 }
static int handle_nodebugchan_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 963 of file cli.c.
References ast_channel_unlock, ast_channel_walk_locked(), ast_cli(), ast_get_channel_by_name_locked(), DEBUGCHAN_FLAG, ast_channel::fin, ast_channel::fout, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00964 { 00965 struct ast_channel *c=NULL; 00966 int is_all; 00967 /* 'no debug channel {all|chan_id}' */ 00968 if (argc != 4) 00969 return RESULT_SHOWUSAGE; 00970 is_all = !strcasecmp("all", argv[3]); 00971 if (is_all) { 00972 global_fin &= ~DEBUGCHAN_FLAG; 00973 global_fout &= ~DEBUGCHAN_FLAG; 00974 c = ast_channel_walk_locked(NULL); 00975 } else { 00976 c = ast_get_channel_by_name_locked(argv[3]); 00977 if (c == NULL) 00978 ast_cli(fd, "No such channel %s\n", argv[3]); 00979 } 00980 while(c) { 00981 if ((c->fin & DEBUGCHAN_FLAG) || (c->fout & DEBUGCHAN_FLAG)) { 00982 c->fin &= ~DEBUGCHAN_FLAG; 00983 c->fout &= ~DEBUGCHAN_FLAG; 00984 ast_cli(fd, "Debugging disabled on channel %s\n", c->name); 00985 } 00986 ast_channel_unlock(c); 00987 if (!is_all) 00988 break; 00989 c = ast_channel_walk_locked(c); 00990 } 00991 ast_cli(fd, "Debugging on new channels is disabled\n"); 00992 return RESULT_SUCCESS; 00993 }
static int handle_reload | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 186 of file cli.c.
References ast_cli(), ast_module_reload(), RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00187 { 00188 int x; 00189 int res; 00190 if (argc < 2) 00191 return RESULT_SHOWUSAGE; 00192 if (argc > 2) { 00193 for (x = 2; x < argc; x++) { 00194 res = ast_module_reload(argv[x]); 00195 switch(res) { 00196 case 0: 00197 ast_cli(fd, "No such module '%s'\n", argv[x]); 00198 break; 00199 case 1: 00200 ast_cli(fd, "Module '%s' does not support reload\n", argv[x]); 00201 break; 00202 } 00203 } 00204 } else 00205 ast_module_reload(NULL); 00206 return RESULT_SUCCESS; 00207 }
static int handle_reload_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 163 of file cli.c.
References ast_cli(), ast_module_reload(), RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00164 { 00165 int x; 00166 int res; 00167 if (argc < 1) 00168 return RESULT_SHOWUSAGE; 00169 if (argc > 1) { 00170 for (x = 1; x < argc; x++) { 00171 res = ast_module_reload(argv[x]); 00172 switch(res) { 00173 case 0: 00174 ast_cli(fd, "No such module '%s'\n", argv[x]); 00175 break; 00176 case 1: 00177 ast_cli(fd, "Module '%s' does not support reload\n", argv[x]); 00178 break; 00179 } 00180 } 00181 } else 00182 ast_module_reload(NULL); 00183 return RESULT_SUCCESS; 00184 }
static int handle_set_debug | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 300 of file cli.c.
References ast_cli(), ast_copy_string(), debug_filename, option_debug, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00301 { 00302 int oldval = option_debug; 00303 int newlevel; 00304 int atleast = 0; 00305 char *filename = '\0'; 00306 00307 /* 'core set debug <level>' 00308 * 'core set debug <level> <fn>' 00309 * 'core set debug atleast <level>' 00310 * 'core set debug atleast <level> <fn>' 00311 */ 00312 if ((argc < 4) || (argc > 6)) 00313 return RESULT_SHOWUSAGE; 00314 00315 if (!strcasecmp(argv[3], "atleast")) 00316 atleast = 1; 00317 00318 if (!atleast) { 00319 if (argc > 5) 00320 return RESULT_SHOWUSAGE; 00321 00322 if (sscanf(argv[3], "%30d", &newlevel) != 1) 00323 return RESULT_SHOWUSAGE; 00324 00325 if (argc == 4) { 00326 debug_filename[0] = '\0'; 00327 } else { 00328 filename = argv[4]; 00329 ast_copy_string(debug_filename, filename, sizeof(debug_filename)); 00330 } 00331 00332 option_debug = newlevel; 00333 } else { 00334 if (argc < 5 || argc > 6) 00335 return RESULT_SHOWUSAGE; 00336 00337 if (sscanf(argv[4], "%30d", &newlevel) != 1) 00338 return RESULT_SHOWUSAGE; 00339 00340 if (argc == 5) { 00341 debug_filename[0] = '\0'; 00342 } else { 00343 filename = argv[5]; 00344 ast_copy_string(debug_filename, filename, sizeof(debug_filename)); 00345 } 00346 00347 if (newlevel > option_debug) 00348 option_debug = newlevel; 00349 } 00350 00351 if (oldval > 0 && option_debug == 0) 00352 ast_cli(fd, "Core debug is now OFF\n"); 00353 else if (option_debug > 0) { 00354 if (filename) { 00355 if (oldval == option_debug) 00356 ast_cli(fd, "Core debug is at least %d, file '%s'\n", option_debug, filename); 00357 else 00358 ast_cli(fd, "Core debug was %d and is now %d, file '%s'\n", oldval, option_debug, filename); 00359 } else { 00360 if (oldval == option_debug) 00361 ast_cli(fd, "Core debug is at least %d\n", option_debug); 00362 else 00363 ast_cli(fd, "Core debug was %d and is now %d\n", oldval, option_debug); 00364 } 00365 } 00366 00367 return RESULT_SUCCESS; 00368 }
static int handle_set_debug_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 273 of file cli.c.
References ast_cli(), option_debug, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00274 { 00275 int val = 0; 00276 int oldval = option_debug; 00277 00278 /* "set debug [atleast] N" */ 00279 if (argc == 3) 00280 option_debug = atoi(argv[2]); 00281 else if (argc == 4) { 00282 if (strcasecmp(argv[2], "atleast")) 00283 return RESULT_SHOWUSAGE; 00284 val = atoi(argv[3]); 00285 if (val > option_debug) 00286 option_debug = val; 00287 } else 00288 return RESULT_SHOWUSAGE; 00289 00290 if (oldval != option_debug && option_debug > 0) 00291 ast_cli(fd, "Core debug was %d and is now %d\n", oldval, option_debug); 00292 else if (oldval > 0 && option_debug > 0) 00293 ast_cli(fd, "Core debug is at least %d\n", option_debug); 00294 else if (oldval > 0 && option_debug == 0) 00295 ast_cli(fd, "Core debug is now OFF\n"); 00296 00297 return RESULT_SUCCESS; 00298 }
static int handle_set_verbose_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 209 of file cli.c.
References ast_cli(), option_verbose, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00210 { 00211 int val = 0; 00212 int oldval = option_verbose; 00213 00214 /* "set verbose [atleast] N" */ 00215 if (argc == 3) 00216 option_verbose = atoi(argv[2]); 00217 else if (argc == 4) { 00218 if (strcasecmp(argv[2], "atleast")) 00219 return RESULT_SHOWUSAGE; 00220 val = atoi(argv[3]); 00221 if (val > option_verbose) 00222 option_verbose = val; 00223 } else 00224 return RESULT_SHOWUSAGE; 00225 00226 if (oldval != option_verbose && option_verbose > 0) 00227 ast_cli(fd, "Verbosity was %d and is now %d\n", oldval, option_verbose); 00228 else if (oldval > 0 && option_verbose > 0) 00229 ast_cli(fd, "Verbosity is at least %d\n", option_verbose); 00230 else if (oldval > 0 && option_verbose == 0) 00231 ast_cli(fd, "Verbosity is now OFF\n"); 00232 00233 return RESULT_SUCCESS; 00234 }
static int handle_showchan | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1079 of file cli.c.
References ast_channel::_bridge, ast_channel::_state, ast_bridged_channel(), ast_cdr_serialize_variables(), ast_channel_unlock, ast_cli(), AST_FLAG_BLOCKING, ast_get_channel_by_name_locked(), ast_getformatname_multiple(), ast_state2str(), ast_test_flag, ast_tvnow(), ast_channel::cdr, ast_channel::cid, ast_callerid::cid_dnid, ast_callerid::cid_name, ast_callerid::cid_num, DEBUGCHAN_FLAG, ast_channel::fds, ast_channel::fin, ast_channel::fout, name, ast_channel::name, ast_channel::nativeformats, pbx_builtin_serialize_variables(), ast_channel::readformat, ast_channel::readtrans, RESULT_SHOWUSAGE, RESULT_SUCCESS, ast_channel::rings, S_OR, ast_cdr::start, ast_channel::tech, ast_channel_tech::type, ast_channel::uniqueid, ast_channel::whentohangup, ast_channel::writeformat, and ast_channel::writetrans.
01080 { 01081 struct ast_channel *c=NULL; 01082 struct timeval now; 01083 char buf[2048]; 01084 char cdrtime[256]; 01085 char nf[256], wf[256], rf[256]; 01086 long elapsed_seconds=0; 01087 int hour=0, min=0, sec=0; 01088 01089 if (argc != 4) 01090 return RESULT_SHOWUSAGE; 01091 now = ast_tvnow(); 01092 c = ast_get_channel_by_name_locked(argv[3]); 01093 if (!c) { 01094 ast_cli(fd, "%s is not a known channel\n", argv[3]); 01095 return RESULT_SUCCESS; 01096 } 01097 if(c->cdr) { 01098 elapsed_seconds = now.tv_sec - c->cdr->start.tv_sec; 01099 hour = elapsed_seconds / 3600; 01100 min = (elapsed_seconds % 3600) / 60; 01101 sec = elapsed_seconds % 60; 01102 snprintf(cdrtime, sizeof(cdrtime), "%dh%dm%ds", hour, min, sec); 01103 } else 01104 strcpy(cdrtime, "N/A"); 01105 ast_cli(fd, 01106 " -- General --\n" 01107 " Name: %s\n" 01108 " Type: %s\n" 01109 " UniqueID: %s\n" 01110 " Caller ID: %s\n" 01111 " Caller ID Name: %s\n" 01112 " DNID Digits: %s\n" 01113 " State: %s (%d)\n" 01114 " Rings: %d\n" 01115 " NativeFormats: %s\n" 01116 " WriteFormat: %s\n" 01117 " ReadFormat: %s\n" 01118 " WriteTranscode: %s\n" 01119 " ReadTranscode: %s\n" 01120 "1st File Descriptor: %d\n" 01121 " Frames in: %d%s\n" 01122 " Frames out: %d%s\n" 01123 " Time to Hangup: %ld\n" 01124 " Elapsed Time: %s\n" 01125 " Direct Bridge: %s\n" 01126 "Indirect Bridge: %s\n" 01127 " -- PBX --\n" 01128 " Context: %s\n" 01129 " Extension: %s\n" 01130 " Priority: %d\n" 01131 " Call Group: %llu\n" 01132 " Pickup Group: %llu\n" 01133 " Application: %s\n" 01134 " Data: %s\n" 01135 " Blocking in: %s\n", 01136 c->name, c->tech->type, c->uniqueid, 01137 S_OR(c->cid.cid_num, "(N/A)"), 01138 S_OR(c->cid.cid_name, "(N/A)"), 01139 S_OR(c->cid.cid_dnid, "(N/A)"), ast_state2str(c->_state), c->_state, c->rings, 01140 ast_getformatname_multiple(nf, sizeof(nf), c->nativeformats), 01141 ast_getformatname_multiple(wf, sizeof(wf), c->writeformat), 01142 ast_getformatname_multiple(rf, sizeof(rf), c->readformat), 01143 c->writetrans ? "Yes" : "No", 01144 c->readtrans ? "Yes" : "No", 01145 c->fds[0], 01146 c->fin & ~DEBUGCHAN_FLAG, (c->fin & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "", 01147 c->fout & ~DEBUGCHAN_FLAG, (c->fout & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "", 01148 (long)c->whentohangup, 01149 cdrtime, c->_bridge ? c->_bridge->name : "<none>", ast_bridged_channel(c) ? ast_bridged_channel(c)->name : "<none>", 01150 c->context, c->exten, c->priority, c->callgroup, c->pickupgroup, ( c->appl ? c->appl : "(N/A)" ), 01151 ( c-> data ? S_OR(c->data, "(Empty)") : "(None)"), 01152 (ast_test_flag(c, AST_FLAG_BLOCKING) ? c->blockproc : "(Not Blocking)")); 01153 01154 if(pbx_builtin_serialize_variables(c,buf,sizeof(buf))) 01155 ast_cli(fd," Variables:\n%s\n",buf); 01156 if(c->cdr && ast_cdr_serialize_variables(c->cdr,buf, sizeof(buf), '=', '\n', 1)) 01157 ast_cli(fd," CDR Variables:\n%s\n",buf); 01158 01159 ast_channel_unlock(c); 01160 return RESULT_SUCCESS; 01161 }
static int handle_showchan_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 995 of file cli.c.
References ast_channel::_bridge, ast_channel::_state, ast_bridged_channel(), ast_cdr_serialize_variables(), ast_channel_unlock, ast_cli(), AST_FLAG_BLOCKING, ast_get_channel_by_name_locked(), ast_getformatname_multiple(), ast_state2str(), ast_test_flag, ast_tvnow(), ast_channel::cdr, ast_channel::cid, ast_callerid::cid_dnid, ast_callerid::cid_name, ast_callerid::cid_num, DEBUGCHAN_FLAG, ast_channel::fds, ast_channel::fin, ast_channel::fout, name, ast_channel::name, ast_channel::nativeformats, pbx_builtin_serialize_variables(), ast_channel::readformat, ast_channel::readtrans, RESULT_SHOWUSAGE, RESULT_SUCCESS, ast_channel::rings, S_OR, ast_cdr::start, ast_channel::tech, ast_channel_tech::type, ast_channel::uniqueid, ast_channel::whentohangup, ast_channel::writeformat, and ast_channel::writetrans.
00996 { 00997 struct ast_channel *c=NULL; 00998 struct timeval now; 00999 char buf[2048]; 01000 char cdrtime[256]; 01001 char nf[256], wf[256], rf[256]; 01002 long elapsed_seconds=0; 01003 int hour=0, min=0, sec=0; 01004 01005 if (argc != 3) 01006 return RESULT_SHOWUSAGE; 01007 now = ast_tvnow(); 01008 c = ast_get_channel_by_name_locked(argv[2]); 01009 if (!c) { 01010 ast_cli(fd, "%s is not a known channel\n", argv[2]); 01011 return RESULT_SUCCESS; 01012 } 01013 if(c->cdr) { 01014 elapsed_seconds = now.tv_sec - c->cdr->start.tv_sec; 01015 hour = elapsed_seconds / 3600; 01016 min = (elapsed_seconds % 3600) / 60; 01017 sec = elapsed_seconds % 60; 01018 snprintf(cdrtime, sizeof(cdrtime), "%dh%dm%ds", hour, min, sec); 01019 } else 01020 strcpy(cdrtime, "N/A"); 01021 ast_cli(fd, 01022 " -- General --\n" 01023 " Name: %s\n" 01024 " Type: %s\n" 01025 " UniqueID: %s\n" 01026 " Caller ID: %s\n" 01027 " Caller ID Name: %s\n" 01028 " DNID Digits: %s\n" 01029 " State: %s (%d)\n" 01030 " Rings: %d\n" 01031 " NativeFormats: %s\n" 01032 " WriteFormat: %s\n" 01033 " ReadFormat: %s\n" 01034 " WriteTranscode: %s\n" 01035 " ReadTranscode: %s\n" 01036 "1st File Descriptor: %d\n" 01037 " Frames in: %d%s\n" 01038 " Frames out: %d%s\n" 01039 " Time to Hangup: %ld\n" 01040 " Elapsed Time: %s\n" 01041 " Direct Bridge: %s\n" 01042 "Indirect Bridge: %s\n" 01043 " -- PBX --\n" 01044 " Context: %s\n" 01045 " Extension: %s\n" 01046 " Priority: %d\n" 01047 " Call Group: %llu\n" 01048 " Pickup Group: %llu\n" 01049 " Application: %s\n" 01050 " Data: %s\n" 01051 " Blocking in: %s\n", 01052 c->name, c->tech->type, c->uniqueid, 01053 S_OR(c->cid.cid_num, "(N/A)"), 01054 S_OR(c->cid.cid_name, "(N/A)"), 01055 S_OR(c->cid.cid_dnid, "(N/A)"), ast_state2str(c->_state), c->_state, c->rings, 01056 ast_getformatname_multiple(nf, sizeof(nf), c->nativeformats), 01057 ast_getformatname_multiple(wf, sizeof(wf), c->writeformat), 01058 ast_getformatname_multiple(rf, sizeof(rf), c->readformat), 01059 c->writetrans ? "Yes" : "No", 01060 c->readtrans ? "Yes" : "No", 01061 c->fds[0], 01062 c->fin & ~DEBUGCHAN_FLAG, (c->fin & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "", 01063 c->fout & ~DEBUGCHAN_FLAG, (c->fout & DEBUGCHAN_FLAG) ? " (DEBUGGED)" : "", 01064 (long)c->whentohangup, 01065 cdrtime, c->_bridge ? c->_bridge->name : "<none>", ast_bridged_channel(c) ? ast_bridged_channel(c)->name : "<none>", 01066 c->context, c->exten, c->priority, c->callgroup, c->pickupgroup, ( c->appl ? c->appl : "(N/A)" ), 01067 ( c-> data ? S_OR(c->data, "(Empty)") : "(None)"), 01068 (ast_test_flag(c, AST_FLAG_BLOCKING) ? c->blockproc : "(Not Blocking)")); 01069 01070 if(pbx_builtin_serialize_variables(c,buf,sizeof(buf))) 01071 ast_cli(fd," Variables:\n%s\n",buf); 01072 if(c->cdr && ast_cdr_serialize_variables(c->cdr,buf, sizeof(buf), '=', '\n', 1)) 01073 ast_cli(fd," CDR Variables:\n%s\n",buf); 01074 01075 ast_channel_unlock(c); 01076 return RESULT_SUCCESS; 01077 }
static int handle_showuptime | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 562 of file cli.c.
References ast_lastreloadtime, ast_startuptime, print_uptimestr(), RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00563 { 00564 /* 'core show uptime [seconds]' */ 00565 time_t curtime = time(NULL); 00566 int printsec = (argc == 4 && !strcasecmp(argv[3],"seconds")); 00567 00568 if (argc != 3 && !printsec) 00569 return RESULT_SHOWUSAGE; 00570 if (ast_startuptime) 00571 print_uptimestr(fd, curtime - ast_startuptime, "System uptime", printsec); 00572 if (ast_lastreloadtime) 00573 print_uptimestr(fd, curtime - ast_lastreloadtime, "Last reload", printsec); 00574 return RESULT_SUCCESS; 00575 }
static int handle_showuptime_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 547 of file cli.c.
References ast_lastreloadtime, ast_startuptime, print_uptimestr(), RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00548 { 00549 /* 'show uptime [seconds]' */ 00550 time_t curtime = time(NULL); 00551 int printsec = (argc == 3 && !strcasecmp(argv[2],"seconds")); 00552 00553 if (argc != 2 && !printsec) 00554 return RESULT_SHOWUSAGE; 00555 if (ast_startuptime) 00556 print_uptimestr(fd, curtime - ast_startuptime, "System uptime", printsec); 00557 if (ast_lastreloadtime) 00558 print_uptimestr(fd, curtime - ast_lastreloadtime, "Last reload", printsec); 00559 return RESULT_SUCCESS; 00560 }
static int handle_softhangup | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 794 of file cli.c.
References ast_channel_unlock, ast_cli(), ast_get_channel_by_name_locked(), ast_softhangup(), AST_SOFTHANGUP_EXPLICIT, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00795 { 00796 struct ast_channel *c=NULL; 00797 if (argc != 3) 00798 return RESULT_SHOWUSAGE; 00799 c = ast_get_channel_by_name_locked(argv[2]); 00800 if (c) { 00801 ast_cli(fd, "Requested Hangup on channel '%s'\n", c->name); 00802 ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT); 00803 ast_channel_unlock(c); 00804 } else 00805 ast_cli(fd, "%s is not a known channel\n", argv[2]); 00806 return RESULT_SUCCESS; 00807 }
static int handle_unload | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 442 of file cli.c.
References ast_cli(), AST_FORCE_FIRM, AST_FORCE_HARD, AST_FORCE_SOFT, ast_unload_resource(), RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00443 { 00444 int x; 00445 int force = AST_FORCE_SOFT; 00446 if (argc < 3) 00447 return RESULT_SHOWUSAGE; 00448 for (x = 2; x < argc; x++) { 00449 if (argv[x][0] == '-') { 00450 switch(argv[x][1]) { 00451 case 'f': 00452 force = AST_FORCE_FIRM; 00453 break; 00454 case 'h': 00455 force = AST_FORCE_HARD; 00456 break; 00457 default: 00458 return RESULT_SHOWUSAGE; 00459 } 00460 } else if (x != argc - 1) 00461 return RESULT_SHOWUSAGE; 00462 else if (ast_unload_resource(argv[x], force)) { 00463 ast_cli(fd, "Unable to unload resource %s\n", argv[x]); 00464 return RESULT_FAILURE; 00465 } 00466 } 00467 return RESULT_SUCCESS; 00468 }
static int handle_unload_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 414 of file cli.c.
References ast_cli(), AST_FORCE_FIRM, AST_FORCE_HARD, AST_FORCE_SOFT, ast_unload_resource(), RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00415 { 00416 int x; 00417 int force = AST_FORCE_SOFT; 00418 if (argc < 2) 00419 return RESULT_SHOWUSAGE; 00420 for (x = 1; x < argc; x++) { 00421 if (argv[x][0] == '-') { 00422 switch(argv[x][1]) { 00423 case 'f': 00424 force = AST_FORCE_FIRM; 00425 break; 00426 case 'h': 00427 force = AST_FORCE_HARD; 00428 break; 00429 default: 00430 return RESULT_SHOWUSAGE; 00431 } 00432 } else if (x != argc - 1) 00433 return RESULT_SHOWUSAGE; 00434 else if (ast_unload_resource(argv[x], force)) { 00435 ast_cli(fd, "Unable to unload resource %s\n", argv[x]); 00436 return RESULT_FAILURE; 00437 } 00438 } 00439 return RESULT_SUCCESS; 00440 }
static int handle_verbose | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 236 of file cli.c.
References ast_cli(), option_verbose, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
00237 { 00238 int oldval = option_verbose; 00239 int newlevel; 00240 int atleast = 0; 00241 00242 if ((argc < 4) || (argc > 5)) 00243 return RESULT_SHOWUSAGE; 00244 00245 if (!strcasecmp(argv[3], "atleast")) 00246 atleast = 1; 00247 00248 if (!atleast) { 00249 if (argc > 4) 00250 return RESULT_SHOWUSAGE; 00251 00252 option_verbose = atoi(argv[3]); 00253 } else { 00254 if (argc < 5) 00255 return RESULT_SHOWUSAGE; 00256 00257 newlevel = atoi(argv[4]); 00258 if (newlevel > option_verbose) 00259 option_verbose = newlevel; 00260 } 00261 if (oldval > 0 && option_verbose == 0) 00262 ast_cli(fd, "Verbosity is now OFF\n"); 00263 else if (option_verbose > 0) { 00264 if (oldval == option_verbose) 00265 ast_cli(fd, "Verbosity is at least %d\n", option_verbose); 00266 else 00267 ast_cli(fd, "Verbosity was %d and is now %d\n", oldval, option_verbose); 00268 } 00269 00270 return RESULT_SUCCESS; 00271 }
static int help1 | ( | int | fd, | |
char * | match[], | |||
int | locked | |||
) | [static] |
helper for help_workhorse and final part of handle_help if locked = 0 it's just help_workhorse, otherwise assume the list is already locked.
Definition at line 1732 of file cli.c.
References ast_cli_entry::_full_cmd, ast_cli(), ast_join(), AST_LIST_LOCK, AST_LIST_UNLOCK, cli_next(), ast_cli_entry::deprecated, len(), RESULT_SUCCESS, S_OR, and ast_cli_entry::summary.
Referenced by handle_help(), and help_workhorse().
01733 { 01734 char matchstr[80] = ""; 01735 struct ast_cli_entry *e; 01736 int len = 0; 01737 int found = 0; 01738 struct cli_iterator i = { NULL, NULL}; 01739 01740 if (match) { 01741 ast_join(matchstr, sizeof(matchstr), match); 01742 len = strlen(matchstr); 01743 } 01744 if (!locked) 01745 AST_LIST_LOCK(&helpers); 01746 while ( (e = cli_next(&i)) ) { 01747 /* Hide commands that start with '_' */ 01748 if (e->_full_cmd[0] == '_') 01749 continue; 01750 /* Hide commands that are marked as deprecated. */ 01751 if (e->deprecated) 01752 continue; 01753 if (match && strncasecmp(matchstr, e->_full_cmd, len)) 01754 continue; 01755 ast_cli(fd, "%25.25s %s\n", e->_full_cmd, S_OR(e->summary, "")); 01756 found++; 01757 } 01758 if (!locked) 01759 AST_LIST_UNLOCK(&helpers); 01760 if (!found && matchstr[0]) 01761 ast_cli(fd, "No such command '%s'.\n", matchstr); 01762 return RESULT_SUCCESS; 01763 }
static int help_workhorse | ( | int | fd, | |
char * | match[] | |||
) | [static] |
Definition at line 1765 of file cli.c.
References help1().
Referenced by handle_help(), and handle_showagi().
static int modlist_modentry | ( | const char * | module, | |
const char * | description, | |||
int | usecnt, | |||
const char * | like | |||
) | [static] |
Definition at line 476 of file cli.c.
References ast_cli(), and MODLIST_FORMAT.
Referenced by handle_modlist().
00477 { 00478 /* Comparing the like with the module */ 00479 if (strcasestr(module, like) ) { 00480 ast_cli(climodentryfd, MODLIST_FORMAT, module, description, usecnt); 00481 return 1; 00482 } 00483 return 0; 00484 }
static char* parse_args | ( | const char * | s, | |
int * | argc, | |||
char * | argv[], | |||
int | max, | |||
int * | trailingwhitespace | |||
) | [static] |
Definition at line 1798 of file cli.c.
References ast_log(), ast_strdup, and LOG_WARNING.
Referenced by __ast_cli_generator(), agi_handle_command(), and ast_cli_command().
01799 { 01800 char *dup, *cur; 01801 int x = 0; 01802 int quoted = 0; 01803 int escaped = 0; 01804 int whitespace = 1; 01805 01806 *trailingwhitespace = 0; 01807 if (s == NULL) /* invalid, though! */ 01808 return NULL; 01809 /* make a copy to store the parsed string */ 01810 if (!(dup = ast_strdup(s))) 01811 return NULL; 01812 01813 cur = dup; 01814 /* scan the original string copying into cur when needed */ 01815 for (; *s ; s++) { 01816 if (x >= max - 1) { 01817 ast_log(LOG_WARNING, "Too many arguments, truncating at %s\n", s); 01818 break; 01819 } 01820 if (*s == '"' && !escaped) { 01821 quoted = !quoted; 01822 if (quoted && whitespace) { 01823 /* start a quoted string from previous whitespace: new argument */ 01824 argv[x++] = cur; 01825 whitespace = 0; 01826 } 01827 } else if ((*s == ' ' || *s == '\t') && !(quoted || escaped)) { 01828 /* If we are not already in whitespace, and not in a quoted string or 01829 processing an escape sequence, and just entered whitespace, then 01830 finalize the previous argument and remember that we are in whitespace 01831 */ 01832 if (!whitespace) { 01833 *cur++ = '\0'; 01834 whitespace = 1; 01835 } 01836 } else if (*s == '\\' && !escaped) { 01837 escaped = 1; 01838 } else { 01839 if (whitespace) { 01840 /* we leave whitespace, and are not quoted. So it's a new argument */ 01841 argv[x++] = cur; 01842 whitespace = 0; 01843 } 01844 *cur++ = *s; 01845 escaped = 0; 01846 } 01847 } 01848 /* Null terminate */ 01849 *cur++ = '\0'; 01850 /* XXX put a NULL in the last argument, because some functions that take 01851 * the array may want a null-terminated array. 01852 * argc still reflects the number of non-NULL entries. 01853 */ 01854 argv[x] = NULL; 01855 *argc = x; 01856 *trailingwhitespace = whitespace; 01857 return dup; 01858 }
static void print_uptimestr | ( | int | fd, | |
time_t | timeval, | |||
const char * | prefix, | |||
int | printsec | |||
) | [static] |
Definition at line 495 of file cli.c.
References ast_build_string(), ast_cli(), DAY, ESS, HOUR, MINUTE, NEEDCOMMA, s, WEEK, and YEAR.
Referenced by handle_showuptime(), and handle_showuptime_deprecated().
00496 { 00497 int x; /* the main part - years, weeks, etc. */ 00498 char timestr[256]="", *s = timestr; 00499 size_t maxbytes = sizeof(timestr); 00500 00501 #define SECOND (1) 00502 #define MINUTE (SECOND*60) 00503 #define HOUR (MINUTE*60) 00504 #define DAY (HOUR*24) 00505 #define WEEK (DAY*7) 00506 #define YEAR (DAY*365) 00507 #define ESS(x) ((x == 1) ? "" : "s") /* plural suffix */ 00508 #define NEEDCOMMA(x) ((x)? ",": "") /* define if we need a comma */ 00509 if (timeval < 0) /* invalid, nothing to show */ 00510 return; 00511 if (printsec) { /* plain seconds output */ 00512 ast_build_string(&s, &maxbytes, "%lu", (u_long)timeval); 00513 timeval = 0; /* bypass the other cases */ 00514 } 00515 if (timeval > YEAR) { 00516 x = (timeval / YEAR); 00517 timeval -= (x * YEAR); 00518 ast_build_string(&s, &maxbytes, "%d year%s%s ", x, ESS(x),NEEDCOMMA(timeval)); 00519 } 00520 if (timeval > WEEK) { 00521 x = (timeval / WEEK); 00522 timeval -= (x * WEEK); 00523 ast_build_string(&s, &maxbytes, "%d week%s%s ", x, ESS(x),NEEDCOMMA(timeval)); 00524 } 00525 if (timeval > DAY) { 00526 x = (timeval / DAY); 00527 timeval -= (x * DAY); 00528 ast_build_string(&s, &maxbytes, "%d day%s%s ", x, ESS(x),NEEDCOMMA(timeval)); 00529 } 00530 if (timeval > HOUR) { 00531 x = (timeval / HOUR); 00532 timeval -= (x * HOUR); 00533 ast_build_string(&s, &maxbytes, "%d hour%s%s ", x, ESS(x),NEEDCOMMA(timeval)); 00534 } 00535 if (timeval > MINUTE) { 00536 x = (timeval / MINUTE); 00537 timeval -= (x * MINUTE); 00538 ast_build_string(&s, &maxbytes, "%d minute%s%s ", x, ESS(x),NEEDCOMMA(timeval)); 00539 } 00540 x = timeval; 00541 if (x > 0) 00542 ast_build_string(&s, &maxbytes, "%d second%s ", x, ESS(x)); 00543 if (timestr[0] != '\0') 00544 ast_cli(fd, "%s: %s\n", prefix, timestr); 00545 }
struct ast_threadstorage ast_cli_buf = { .once = PTHREAD_ONCE_INIT, .key_init = ast_cli_buf_init , } [static] |
struct ast_cli_entry builtins[] [static] |
Definition at line 1357 of file cli.c.
Referenced by ast_builtins_init(), cli_next(), and load_pbx().
char chanlist_help[] [static] |
struct ast_cli_entry cli_cli[] [static] |
struct ast_cli_entry cli_debug_channel_deprecated [static] |
Initial value:
{ { "debug", "channel", NULL }, handle_debugchan_deprecated, NULL, NULL, complete_ch_3 }
struct ast_cli_entry cli_debug_level_deprecated [static] |
Initial value:
{ { "debug", "level", NULL }, handle_debuglevel_deprecated, NULL, NULL }
struct ast_cli_entry cli_module_load_deprecated [static] |
Initial value:
{ { "load", NULL }, handle_load_deprecated, NULL, NULL, complete_fn_2 }
struct ast_cli_entry cli_module_reload_deprecated [static] |
Initial value:
{ { "reload", NULL }, handle_reload_deprecated, NULL, NULL, complete_mod_2 }
struct ast_cli_entry cli_module_unload_deprecated [static] |
Initial value:
{ { "unload", NULL }, handle_unload_deprecated, NULL, NULL, complete_mod_2 }
struct ast_cli_entry cli_set_debug_deprecated [static] |
Initial value:
{ { "set", "debug", NULL }, handle_set_debug_deprecated, NULL, NULL, NULL, &cli_debug_level_deprecated }
struct ast_cli_entry cli_set_verbose_deprecated [static] |
Initial value:
{ { "set", "verbose", NULL }, handle_set_verbose_deprecated, NULL, NULL }
struct ast_cli_entry cli_show_channel_deprecated [static] |
Initial value:
{ { "show", "channel", NULL }, handle_showchan_deprecated, NULL, NULL, complete_ch_3 }
struct ast_cli_entry cli_show_channels_deprecated [static] |
Initial value:
{ { "show", "channels", NULL }, handle_chanlist_deprecated, NULL, NULL, complete_show_channels_deprecated }
struct ast_cli_entry cli_show_modules_deprecated [static] |
Initial value:
{ { "show", "modules", NULL }, handle_modlist, NULL, NULL }
struct ast_cli_entry cli_show_modules_like_deprecated [static] |
Initial value:
{ { "show", "modules", "like", NULL }, handle_modlist, NULL, NULL, complete_mod_4 }
struct ast_cli_entry cli_show_uptime_deprecated [static] |
Initial value:
{ { "show", "uptime", NULL }, handle_showuptime_deprecated, "Show uptime information", NULL }
int climodentryfd = -1 [static] |
ast_mutex_t climodentrylock = { PTHREAD_MUTEX_INITIALIZER , 1, { NULL }, { 0 }, 0, { NULL }, { 0 }, PTHREAD_MUTEX_INITIALIZER } [static] |
char commandcomplete_help[] [static] |
char commandmatchesarray_help[] [static] |
char commandnummatches_help[] [static] |
char debug_help[] [static] |
char debugchan_help[] [static] |
unsigned long global_fin |
unsigned long global_fout |
char group_show_channels_help[] [static] |
char help_help[] [static] |
char load_help[] [static] |
char logger_mute_help[] [static] |
char modlist_help[] [static] |
char nodebug_help[] [static] |
char reload_help[] [static] |
char showchan_help[] [static] |
char softhangup_help[] [static] |
char unload_help[] [static] |
char uptime_help[] [static] |
char verbose_help[] [static] |