Asterisk - The Open Source Telephony Project GIT-master-0a46be9
Data Structures | Macros | Enumerations | Functions
cli.h File Reference

Standard Command Line Interface. More...

#include "asterisk/linkedlists.h"
#include "asterisk/strings.h"
Include dependency graph for cli.h:

Go to the source code of this file.

Data Structures

struct  ast_cli_args
 
struct  ast_cli_entry
 descriptor for a cli entry. More...
 

Macros

#define ast_cli_command(fd, s)   ast_cli_command_full(CLI_NO_PERMS, CLI_NO_PERMS, fd, s)
 
#define ast_cli_command_multiple(fd, size, s)   ast_cli_command_multiple_full(CLI_NO_PERMS, CLI_NO_PERMS, fd, size, s)
 
#define AST_CLI_COMPLETE_EOF   "_EOF_"
 
#define AST_CLI_DEFINE(fn, txt, ...)   { .handler = fn, .summary = txt, ## __VA_ARGS__ }
 
#define AST_CLI_ONOFF(x)   (x) ? "On" : "Off"
 return On or Off depending on the argument. This is used in many places in CLI command, having a function to generate this helps maintaining a consistent output (and possibly emitting the output in other languages, at some point). More...
 
#define ast_cli_register(e)   __ast_cli_register(e, AST_MODULE_SELF)
 Registers a command or an array of commands. More...
 
#define ast_cli_register_multiple(e, len)    __ast_cli_register_multiple(e, len, AST_MODULE_SELF)
 Register multiple commands. More...
 
#define AST_CLI_YESNO(x)   AST_YESNO(x)
 Return Yes or No depending on the argument. More...
 
#define AST_MAX_ARGS   64
 
#define AST_MAX_CMD_LEN   16
 
#define CLI_FAILURE   (char *)RESULT_FAILURE
 
#define CLI_NO_PERMS   -1
 
#define CLI_SHOWUSAGE   (char *)RESULT_SHOWUSAGE
 
#define CLI_SUCCESS   (char *)RESULT_SUCCESS
 
#define ESS(x)   ((x) == 1 ? "" : "s")
 
#define RESULT_FAILURE   2
 
#define RESULT_SHOWUSAGE   1
 
#define RESULT_SUCCESS   0
 

Enumerations

enum  ast_cli_command { CLI_INIT = -2 , CLI_GENERATE = -3 , CLI_HANDLER = -4 }
 calling arguments for new-style handlers. More...
 

Functions

int __ast_cli_register (struct ast_cli_entry *e, struct ast_module *mod)
 
int __ast_cli_register_multiple (struct ast_cli_entry *e, int len, struct ast_module *mod)
 
void ast_cli (int fd, const char *fmt,...)
 
int ast_cli_allow_at_shutdown (struct ast_cli_entry *e)
 Allow a CLI command to be executed while Asterisk is shutting down. More...
 
int ast_cli_command_full (int uid, int gid, int fd, const char *s)
 Interprets a command Interpret a command s, sending output to fd if uid:gid has permissions to run this command. uid = CLI_NO_PERMS to avoid checking user permissions gid = CLI_NO_PERMS to avoid checking group permissions. More...
 
int ast_cli_command_multiple_full (int uid, int gid, int fd, size_t size, const char *s)
 Executes multiple CLI commands Interpret strings separated by NULL and execute each one, sending output to fd if uid has permissions, uid = CLI_NO_PERMS to avoid checking users permissions. gid = CLI_NO_PERMS to avoid checking group permissions. More...
 
char * ast_cli_complete (const char *word, const char *const choices[], int pos)
 
int ast_cli_completion_add (char *value)
 Add a result to a request for completion options. More...
 
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. More...
 
struct ast_vector_stringast_cli_completion_vector (const char *text, const char *word)
 Generates a vector of strings for CLI completion. More...
 
char * ast_cli_generator (const char *, const char *, int)
 Readline madness Useful for readline, that's about it. More...
 
void ast_cli_print_timestr_fromseconds (int fd, int seconds, const char *prefix)
 Print on cli a duration in seconds in format s year(s), s week(s), s day(s), s hour(s), s second(s) More...
 
int ast_cli_unregister (struct ast_cli_entry *e)
 Unregisters a command or an array of commands. More...
 
int ast_cli_unregister_multiple (struct ast_cli_entry *e, int len)
 Unregister multiple commands. More...
 
char * ast_complete_channels (const char *line, const char *word, int pos, int state, int rpos)
 Command completion for the list of active channels. More...
 

Detailed Description

Standard Command Line Interface.

Definition in file cli.h.

Macro Definition Documentation

◆ ast_cli_command

#define ast_cli_command (   fd,
 
)    ast_cli_command_full(CLI_NO_PERMS, CLI_NO_PERMS, fd, s)

Definition at line 232 of file cli.h.

◆ ast_cli_command_multiple

#define ast_cli_command_multiple (   fd,
  size,
 
)    ast_cli_command_multiple_full(CLI_NO_PERMS, CLI_NO_PERMS, fd, size, s)

Definition at line 248 of file cli.h.

◆ AST_CLI_COMPLETE_EOF

#define AST_CLI_COMPLETE_EOF   "_EOF_"

Definition at line 52 of file cli.h.

◆ AST_CLI_DEFINE

#define AST_CLI_DEFINE (   fn,
  txt,
  ... 
)    { .handler = fn, .summary = txt, ## __VA_ARGS__ }
Examples
app_skel.c.

Definition at line 197 of file cli.h.

◆ AST_CLI_ONOFF

#define AST_CLI_ONOFF (   x)    (x) ? "On" : "Off"

return On or Off depending on the argument. This is used in many places in CLI command, having a function to generate this helps maintaining a consistent output (and possibly emitting the output in other languages, at some point).

Definition at line 78 of file cli.h.

◆ ast_cli_register

#define ast_cli_register (   e)    __ast_cli_register(e, AST_MODULE_SELF)

Registers a command or an array of commands.

Parameters
ewhich cli entry to register. Register your own command
Return values
0on success
-1on failure

Definition at line 256 of file cli.h.

◆ ast_cli_register_multiple

#define ast_cli_register_multiple (   e,
  len 
)     __ast_cli_register_multiple(e, len, AST_MODULE_SELF)

Register multiple commands.

Parameters
epointer to first cli entry to register
lennumber of entries to register
Examples
app_skel.c.

Definition at line 265 of file cli.h.

◆ AST_CLI_YESNO

#define AST_CLI_YESNO (   x)    AST_YESNO(x)

Return Yes or No depending on the argument.

Note that this should probably still be used for CLI commands instead of AST_YESNO(), in the off chance we someday want to translate the CLI.

Parameters
xBoolean value
Returns
"Yes" if x is true (non-zero)
"No" if x is false (zero)
Examples
app_skel.c.

Definition at line 71 of file cli.h.

◆ AST_MAX_ARGS

#define AST_MAX_ARGS   64

Definition at line 50 of file cli.h.

◆ AST_MAX_CMD_LEN

#define AST_MAX_CMD_LEN   16

Definition at line 48 of file cli.h.

◆ CLI_FAILURE

#define CLI_FAILURE   (char *)RESULT_FAILURE

Definition at line 46 of file cli.h.

◆ CLI_NO_PERMS

#define CLI_NO_PERMS   -1

Definition at line 38 of file cli.h.

◆ CLI_SHOWUSAGE

#define CLI_SHOWUSAGE   (char *)RESULT_SHOWUSAGE

Definition at line 45 of file cli.h.

◆ CLI_SUCCESS

#define CLI_SUCCESS   (char *)RESULT_SUCCESS
Examples
app_skel.c.

Definition at line 44 of file cli.h.

◆ ESS

#define ESS (   x)    ((x) == 1 ? "" : "s")

In many cases we need to print singular or plural words depending on a count. This macro helps us e.g. printf("we have %d object%s", n, ESS(n));

Definition at line 59 of file cli.h.

◆ RESULT_FAILURE

#define RESULT_FAILURE   2

Definition at line 42 of file cli.h.

◆ RESULT_SHOWUSAGE

#define RESULT_SHOWUSAGE   1

Definition at line 41 of file cli.h.

◆ RESULT_SUCCESS

#define RESULT_SUCCESS   0

Definition at line 40 of file cli.h.

Enumeration Type Documentation

◆ ast_cli_command

calling arguments for new-style handlers.

Enumerator
CLI_INIT 
CLI_GENERATE 
CLI_HANDLER 

Definition at line 151 of file cli.h.

151 {
152 CLI_INIT = -2, /* return the usage string */
153 CLI_GENERATE = -3, /* behave as 'generator', remap argv to struct ast_cli_args */
154 CLI_HANDLER = -4, /* run the normal handler */
155};
@ CLI_HANDLER
Definition: cli.h:154
@ CLI_INIT
Definition: cli.h:152
@ CLI_GENERATE
Definition: cli.h:153

Function Documentation

◆ __ast_cli_register()

int __ast_cli_register ( struct ast_cli_entry e,
struct ast_module mod 
)

Definition at line 2431 of file main/cli.c.

2432{
2433 struct ast_cli_entry *cur;
2434 int i, lf, ret = -1;
2435
2436 struct ast_cli_args a; /* fake argument */
2437 char **dst = (char **)e->cmda; /* need to cast as the entry is readonly */
2438 char *s;
2439
2441
2442 if (cli_is_registered(e)) {
2443 ast_log(LOG_WARNING, "Command '%s' already registered (the same ast_cli_entry)\n",
2444 S_OR(e->_full_cmd, e->command));
2445 ret = 0; /* report success */
2446 goto done;
2447 }
2448
2449 memset(&a, '\0', sizeof(a));
2450
2451 e->module = module;
2452 /* No module reference needed here, the module called us. */
2453 e->handler(e, CLI_INIT, &a);
2454
2455 /* XXX check that usage and command are filled up */
2456 s = ast_skip_blanks(e->command);
2457 s = e->command = ast_strdup(s);
2458 for (i=0; !ast_strlen_zero(s) && i < AST_MAX_CMD_LEN-1; i++) {
2459 *dst++ = s; /* store string */
2460 s = ast_skip_nonblanks(s);
2461 if (*s == '\0') /* we are done */
2462 break;
2463 *s++ = '\0';
2464 s = ast_skip_blanks(s);
2465 }
2466 *dst++ = NULL;
2467
2468 if (find_cli(e->cmda, 1)) {
2469 ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n",
2470 S_OR(e->_full_cmd, e->command));
2471 goto done;
2472 }
2473 if (set_full_cmd(e)) {
2474 ast_log(LOG_WARNING, "Error registering CLI Command '%s'\n",
2475 S_OR(e->_full_cmd, e->command));
2476 goto done;
2477 }
2478
2479 lf = e->cmdlen;
2481 int len = cur->cmdlen;
2482 if (lf < len)
2483 len = lf;
2484 if (strncasecmp(e->_full_cmd, cur->_full_cmd, len) < 0) {
2486 break;
2487 }
2488 }
2490
2491 if (!cur)
2493 ret = 0; /* success */
2494
2495done:
2497 if (ret) {
2498 ast_free(e->command);
2499 e->command = NULL;
2500 }
2501
2502 return ret;
2503}
#define ast_free(a)
Definition: astmm.h:180
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_log
Definition: astobj2.c:42
#define AST_MAX_CMD_LEN
Definition: cli.h:48
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define LOG_WARNING
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:545
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:617
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:741
#define AST_RWLIST_INSERT_BEFORE_CURRENT
Definition: linkedlists.h:610
static struct ast_cli_entry * find_cli(const char *const cmds[], int match_type)
Definition: main/cli.c:2327
static int set_full_cmd(struct ast_cli_entry *e)
Definition: main/cli.c:2046
static int cli_is_registered(struct ast_cli_entry *e)
Definition: main/cli.c:2389
#define NULL
Definition: resample.c:96
char * ast_skip_nonblanks(const char *str)
Gets a pointer to first whitespace character in a string.
Definition: strings.h:204
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:161
descriptor for a cli entry.
Definition: cli.h:171
char *(* handler)(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: cli.h:187
int cmdlen
Definition: cli.h:182
struct ast_module * module
Definition: cli.h:180
char * _full_cmd
Definition: cli.h:181
const char *const cmda[AST_MAX_CMD_LEN]
Definition: cli.h:172
char * command
Definition: cli.h:186
int done
Definition: test_amihooks.c:48
static struct test_val a

References ast_cli_entry::_full_cmd, a, ast_free, ast_log, AST_MAX_CMD_LEN, AST_RWLIST_INSERT_BEFORE_CURRENT, AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_skip_blanks(), ast_skip_nonblanks(), ast_strdup, ast_strlen_zero(), CLI_INIT, cli_is_registered(), ast_cli_entry::cmda, ast_cli_entry::cmdlen, ast_cli_entry::command, done, find_cli(), ast_cli_entry::handler, len(), LOG_WARNING, ast_cli_entry::module, NULL, S_OR, and set_full_cmd().

Referenced by __ast_cli_register_multiple().

◆ __ast_cli_register_multiple()

int __ast_cli_register_multiple ( struct ast_cli_entry e,
int  len,
struct ast_module mod 
)

Definition at line 2508 of file main/cli.c.

2509{
2510 int i, res = 0;
2511
2512 for (i = 0; i < len; i++) {
2513 res |= __ast_cli_register(e + i, module);
2514 }
2515
2516 return res;
2517}
int __ast_cli_register(struct ast_cli_entry *e, struct ast_module *module)
Definition: main/cli.c:2431

References __ast_cli_register(), and len().

◆ ast_cli()

void ast_cli ( int  fd,
const char *  fmt,
  ... 
)
Examples
app_skel.c.

Definition at line 6 of file clicompat.c.

7{
8}

References ast_carefulwrite(), ast_cli_buf, AST_CLI_INITLEN, AST_DYNSTR_BUILD_FAILED, ast_str_buffer(), ast_str_set_va(), ast_str_strlen(), ast_str_thread_get(), and buf.

Referenced by __iax2_show_peers(), __say_cli_init(), _iax2_show_peers_one(), _stun_show_status(), aeap_cli_show(), agent_handle_logoff_cmd(), agent_handle_show_specific(), agent_show_requested(), alias_show(), aoc_cli_debug_enable(), ari_mkpasswd(), ari_set_debug(), ari_show(), ari_show_app(), ari_show_apps(), ari_show_owc(), ari_show_owcs(), ari_show_sessions(), ari_show_user(), ari_show_users(), ari_shut_session(), ari_shut_sessions(), ari_start_owc(), ast_acl_output(), ast_cli_command_full(), ast_cli_netstats(), ast_console_toggle_mute(), ast_ha_output(), ast_pbx_hangup_handler_headers(), ast_pbx_hangup_handler_show(), ast_sip_cli_traverse_objects(), bridge_show_specific_print_channel(), cc_cli_output_status(), cc_cli_print_monitor_stats(), channel_set_debug(), cli_console_active(), cli_console_answer(), cli_console_autoanswer(), cli_console_dial(), cli_console_flash(), cli_console_hangup(), cli_console_mute(), cli_console_sendtext(), cli_display_named_acl(), cli_display_named_acl_list(), cli_display_parking_global(), cli_display_parking_lot(), cli_display_parking_lot_list(), cli_eprofile_show_all(), cli_fax_set_debug(), cli_fax_show_capabilities(), cli_fax_show_session(), cli_fax_show_sessions(), cli_fax_show_settings(), cli_fax_show_stats(), cli_fax_show_version(), cli_list_available(), cli_list_devices(), cli_list_subscriptions_detail(), cli_list_subscriptions_inout(), cli_match_char_tree(), cli_mute_unmute_helper(), cli_notify(), cli_odbc_read(), cli_odbc_write(), cli_profile_show_all(), cli_qualify(), cli_realtime_destroy(), cli_realtime_load(), cli_realtime_store(), cli_realtime_update(), cli_realtime_update2(), cli_register(), cli_reload_qualify_aor(), cli_reload_qualify_endpoint(), cli_show_channel(), cli_show_channels(), cli_show_endpoint_identifiers(), cli_show_module_options(), cli_show_module_type(), cli_show_module_types(), cli_show_modules(), cli_show_monitors(), cli_show_qualify_aor(), cli_show_qualify_endpoint(), cli_show_settings(), cli_show_subscription_common(), cli_show_subscriptions_detail(), cli_show_subscriptions_inout(), cli_show_tasks(), cli_subsystem_alert_report(), cli_tn_show_all(), cli_tps_ping(), cli_tps_report(), cli_tps_reset_stats(), cli_tps_reset_stats_all(), cli_unregister(), cli_verify_cert(), client_config_show_all(), config_object_cli_show(), corosync_show_config(), corosync_show_members(), crypto_show_cli_store(), dahdi_create_channels(), dahdi_destroy_channels(), dahdi_set_dnd(), dahdi_set_hwgain(), dahdi_set_mwi(), dahdi_set_swgain(), dahdi_show_channel(), dahdi_show_channels(), dahdi_show_status(), dahdi_show_version(), display_entry_list(), display_parked_call(), display_parking_lot(), display_results(), display_single_entry(), do_print(), dump_str_and_free(), dundi_do_lookup(), dundi_do_precache(), dundi_do_query(), dundi_flush(), dundi_set_debug(), dundi_show_cache(), dundi_show_entityid(), dundi_show_hints(), dundi_show_mappings(), dundi_show_peer(), dundi_show_peers(), dundi_show_precache(), dundi_show_requests(), dundi_show_trans(), dundi_store_history(), firmware_show_callback(), forward_message_from_mailbox(), gen_events(), geoloc_config_cli_reload(), geoloc_config_list_locations(), geoloc_config_list_profiles(), geoloc_config_show_profiles(), group_show_channels(), handle_bridge_kick_channel(), handle_bridge_show_all(), handle_bridge_show_specific(), handle_bridge_technology_show(), handle_bridge_technology_suspend(), handle_cdr_pgsql_status(), handle_chanlist(), handle_cli_agi_add_cmd(), handle_cli_agi_debug(), handle_cli_agi_dump_html(), handle_cli_agi_show(), handle_cli_check_permissions(), handle_cli_confbridge_kick(), handle_cli_confbridge_list(), handle_cli_confbridge_list_item(), handle_cli_confbridge_lock(), handle_cli_confbridge_show_bridge_profile(), handle_cli_confbridge_show_bridge_profiles(), handle_cli_confbridge_show_menu(), handle_cli_confbridge_show_menus(), handle_cli_confbridge_show_user_profile(), handle_cli_confbridge_show_user_profiles(), handle_cli_confbridge_start_record(), handle_cli_confbridge_stop_record(), handle_cli_confbridge_unlock(), handle_cli_config_list(), handle_cli_core_show_channeltype(), handle_cli_core_show_channeltypes(), handle_cli_core_show_config_mappings(), handle_cli_core_show_file_formats(), handle_cli_core_show_translation(), handle_cli_database_del(), handle_cli_database_deltree(), handle_cli_database_get(), handle_cli_database_put(), handle_cli_database_show(), handle_cli_database_showkey(), handle_cli_debug(), handle_cli_devstate_change(), handle_cli_devstate_list(), handle_cli_dialplan_add_extension(), handle_cli_dialplan_add_ignorepat(), handle_cli_dialplan_add_include(), handle_cli_dialplan_reload(), handle_cli_dialplan_remove_context(), handle_cli_dialplan_remove_extension(), handle_cli_dialplan_remove_ignorepat(), handle_cli_dialplan_remove_include(), handle_cli_dialplan_save(), handle_cli_dynamic_level_test(), handle_cli_file_convert(), handle_cli_iax2_provision(), handle_cli_iax2_prune_realtime(), handle_cli_iax2_set_debug(), handle_cli_iax2_set_debug_jb(), handle_cli_iax2_set_debug_trunk(), handle_cli_iax2_set_mtu(), handle_cli_iax2_show_cache(), handle_cli_iax2_show_callno_limits(), handle_cli_iax2_show_channels(), handle_cli_iax2_show_firmware(), handle_cli_iax2_show_netstats(), handle_cli_iax2_show_peer(), handle_cli_iax2_show_registry(), handle_cli_iax2_show_stats(), handle_cli_iax2_show_threads(), handle_cli_iax2_show_users(), handle_cli_iax2_unregister(), handle_cli_indication_show(), handle_cli_keys_show(), handle_cli_locks_show(), handle_cli_malloc_trim(), handle_cli_mixmonitor(), handle_cli_mobile_cusd(), handle_cli_mobile_rfcomm(), handle_cli_mobile_search(), handle_cli_mobile_show_devices(), handle_cli_moh_show_classes(), handle_cli_moh_show_files(), handle_cli_moh_unregister_class(), handle_cli_odbc_show(), handle_cli_ooh323_set_debug(), handle_cli_ooh323_show_config(), handle_cli_ooh323_show_gk(), handle_cli_ooh323_show_peer(), handle_cli_ooh323_show_peers(), handle_cli_ooh323_show_user(), handle_cli_ooh323_show_users(), handle_cli_performance_test(), handle_cli_presencestate_change(), handle_cli_presencestate_list(), handle_cli_queue_test(), handle_cli_realtime_mysql_cache(), handle_cli_realtime_mysql_status(), handle_cli_realtime_pgsql_cache(), handle_cli_realtime_pgsql_status(), handle_cli_recalc(), handle_cli_refresh(), handle_cli_rtcp_set_debug(), handle_cli_rtcp_set_stats(), handle_cli_rtp_set_debug(), handle_cli_rtp_settings(), handle_cli_sched_bench(), handle_cli_show_config(), handle_cli_show_permissions(), handle_cli_sound_show(), handle_cli_sounds_show(), handle_cli_status(), handle_cli_stun_set_debug(), handle_cli_submit(), handle_cli_test_locales(), handle_cli_transcoder_show(), handle_cli_udptl_set_debug(), handle_cli_ulimit(), handle_cli_wait_fullybooted(), handle_commandmatchesarray(), handle_core_set_debug_channel(), handle_core_show_image_formats(), handle_dahdi_show_cadences(), handle_debug_dialplan(), handle_debug_or_trace(), handle_dump_frames(), handle_eval_function(), handle_exec(), handle_export_primitives(), handle_feature_show(), handle_gml_show(), handle_help(), handle_kickmanconn(), handle_load(), handle_logger_add_channel(), handle_logger_chanloggroup_filter(), handle_logger_filter_reset(), handle_logger_filter_show(), handle_logger_reload(), handle_logger_remove_channel(), handle_logger_rotate(), handle_logger_set_level(), handle_logger_show_channels(), handle_logger_show_levels(), handle_manager_show_event(), handle_manager_show_events(), handle_manager_show_settings(), handle_mandebug(), handle_minivm_list_templates(), handle_minivm_reload(), handle_minivm_show_settings(), handle_minivm_show_stats(), handle_minivm_show_users(), handle_minivm_show_zones(), handle_modlist(), handle_pjproject_set_log_level(), handle_pjproject_show_buildopts(), handle_pjproject_show_log_level(), handle_pjproject_show_log_mappings(), handle_pjsip_show_version(), handle_queue_add_member(), handle_queue_change_priority_caller(), handle_queue_pause_member(), handle_queue_remove_member(), handle_queue_rule_show(), handle_queue_set_member_penalty(), handle_queue_set_member_ringinuse(), handle_redirect(), handle_refresh(), handle_reload(), handle_remb_set(), handle_restart_when_convenient(), handle_set_chanvar(), handle_set_extenpatternmatchnew(), handle_set_global(), handle_show_application(), handle_show_applications(), handle_show_calendar(), handle_show_calendars(), handle_show_calendars_types(), handle_show_chanvar(), handle_show_dialplan(), handle_show_function(), handle_show_functions(), handle_show_globals(), handle_show_hangup_channel(), handle_show_hint(), handle_show_hints(), handle_show_http(), handle_show_parking_lot_cmd(), handle_show_profile(), handle_show_routes(), handle_show_settings(), handle_show_switches(), handle_show_sysinfo(), handle_show_threads(), handle_show_translation_path(), handle_show_translation_table(), handle_showcalls(), handle_showchan(), handle_showmanager(), handle_showmanagers(), handle_showmancmd(), handle_showmancmds(), handle_showmanconn(), handle_showmaneventq(), handle_skel_show_config(), handle_skel_show_games(), handle_skel_show_levels(), handle_softhangup(), handle_stop_when_convenient(), handle_unload(), handle_unset_extenpatternmatchnew(), handle_version(), handle_voicemail_reload(), handle_voicemail_show_aliases(), handle_voicemail_show_users(), handle_voicemail_show_zones(), help1(), help_workhorse(), iax_show_provisioning(), locals_show(), log_forwarder(), media_cache_handle_create_item(), media_cache_handle_delete_item(), media_cache_handle_refresh_item(), media_cache_handle_show_all(), media_cache_handle_show_item(), media_cache_prnt_summary(), meetme_show_cmd(), modlist_modentry(), move_message_from_mailbox(), orig_app(), orig_exten(), output_tests(), pjsip_disable_logger(), pjsip_enable_logger_all(), pjsip_enable_logger_host(), pjsip_enable_logger_method(), pjsip_set_history(), pjsip_set_logger_pcap(), pjsip_set_logger_verbose(), pjsip_show_history(), print_acl(), print_app_docs(), print_applicationmap(), print_event_instance(), print_featuregroup(), print_featuregroups(), print_file(), print_stats_cb(), print_uptimestr(), prometheus_show_metrics(), prometheus_show_status(), remove_message_from_mailbox(), route_list_cb(), rtcp_do_debug_ip(), rtp_do_debug_ip(), show_codec(), show_codecs(), show_debug_helper(), show_dialplan_helper(), show_dialplan_helper_extension_output(), show_license(), show_mailbox_details(), show_mailbox_snapshot(), show_messages_for_mailbox(), show_owc_cb(), show_sessions_cb(), show_sound_info_cb(), show_sounds_cb(), show_users_cb(), show_users_realtime(), show_warranty(), sla_show_stations(), sla_show_trunks(), sorcery_memory_cache_cli_thrash(), sorcery_memory_cache_dump(), sorcery_memory_cache_expire(), sorcery_memory_cache_populate(), sorcery_memory_cache_print_object(), sorcery_memory_cache_show(), sorcery_memory_cache_stale(), spandsp_fax_cli_show_capabilities(), spandsp_fax_cli_show_session(), spandsp_fax_cli_show_stats(), stasis_app_to_cli(), stasis_show_topic(), stasis_show_topics(), status_debug_verbose(), timing_test(), tps_report_taskprocessor_list_helper(), unistim_do_debug(), unistim_show_devices(), unistim_show_info(), unistim_sp(), xmpp_cli_create_collection(), xmpp_cli_create_leafnode(), xmpp_cli_delete_pubsub_node(), xmpp_cli_list_pubsub_nodes(), xmpp_cli_purge_pubsub_nodes(), xmpp_do_set_debug(), xmpp_show_buddies(), and xmpp_show_clients().

◆ ast_cli_allow_at_shutdown()

int ast_cli_allow_at_shutdown ( struct ast_cli_entry e)

Allow a CLI command to be executed while Asterisk is shutting down.

CLI commands by defeault are disabled when Asterisk is shutting down. This is to ensure the safety of the shutdown since CLI commands may attempt to access resources that have been freed as a result of the shutdown.

If a CLI command should be allowed at shutdown, then the best way to enable this is to call ast_cli_allow_at_shutdown during the CLI_INIT state of the CLI handler.

Definition at line 3037 of file main/cli.c.

3038{
3039 int res;
3040
3044
3045 return res;
3046}
#define ast_rwlock_wrlock(a)
Definition: lock.h:243
#define ast_rwlock_unlock(a)
Definition: lock.h:241
static ast_rwlock_t shutdown_commands_lock
Definition: main/cli.c:112
static struct @337 shutdown_commands
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:267

References ast_rwlock_unlock, ast_rwlock_wrlock, AST_VECTOR_APPEND, shutdown_commands, and shutdown_commands_lock.

Referenced by handle_abort_shutdown(), handle_restart_gracefully(), handle_restart_now(), handle_restart_when_convenient(), handle_stop_gracefully(), handle_stop_now(), and handle_stop_when_convenient().

◆ ast_cli_command_full()

int ast_cli_command_full ( int  uid,
int  gid,
int  fd,
const char *  s 
)

Interprets a command Interpret a command s, sending output to fd if uid:gid has permissions to run this command. uid = CLI_NO_PERMS to avoid checking user permissions gid = CLI_NO_PERMS to avoid checking group permissions.

Parameters
uidUser ID that is trying to run the command.
gidGroup ID that is trying to run the command.
fdpipe
sincoming string
Return values
0on success
-1on failure

Definition at line 2950 of file main/cli.c.

2951{
2952 const char *args[AST_MAX_ARGS + 1];
2953 struct ast_cli_entry *e = NULL;
2954 int x;
2955 char *duplicate = parse_args(s, &x, args + 1, AST_MAX_ARGS, NULL);
2956 char tmp[AST_MAX_ARGS + 1];
2957 char *retval = CLI_FAILURE;
2958 struct ast_cli_args a = {
2959 .fd = fd, .argc = x, .argv = args+1 };
2960
2961 if (duplicate == NULL)
2962 return RESULT_FAILURE;
2963
2964 if (x < 1) /* We need at least one entry, otherwise ignore */
2965 goto done;
2966
2968 e = find_cli(args + 1, 0);
2969 if (e)
2972 if (e == NULL) {
2973 ast_cli(fd, "No such command '%s' (type 'core show help %s' for other possible commands)\n", s, find_best(args + 1));
2974 goto done;
2975 }
2976
2978 ast_cli(fd, "Command '%s' cannot be run during shutdown\n", s);
2979 goto done;
2980 }
2981
2982 ast_join(tmp, sizeof(tmp), args + 1);
2983 /* Check if the user has rights to run this command. */
2984 if (!cli_has_permissions(uid, gid, tmp)) {
2985 ast_cli(fd, "You don't have permissions to run '%s' command\n", tmp);
2986 goto done;
2987 }
2988
2989 /*
2990 * Within the handler, argv[-1] contains a pointer to the ast_cli_entry.
2991 * Remember that the array returned by parse_args is NULL-terminated.
2992 */
2993 args[0] = (char *)e;
2994
2995 /* If the command is in a module it must be running. */
2996 if (!e->module || ast_module_running_ref(e->module)) {
2997 retval = e->handler(e, CLI_HANDLER, &a);
2999 }
3000
3001 if (retval == CLI_SHOWUSAGE) {
3002 ast_cli(fd, "%s", S_OR(e->usage, "Invalid usage, but no usage information available.\n"));
3003 } else if (retval == CLI_FAILURE) {
3004 ast_cli(fd, "Command '%s' failed.\n", s);
3005 }
3006
3007done:
3008 if (e) {
3010 }
3011 ast_free(duplicate);
3012 return retval == CLI_SUCCESS ? RESULT_SUCCESS : RESULT_FAILURE;
3013}
int ast_shutting_down(void)
Definition: asterisk.c:1888
#define CLI_SHOWUSAGE
Definition: cli.h:45
#define CLI_SUCCESS
Definition: cli.h:44
#define AST_MAX_ARGS
Definition: cli.h:50
#define RESULT_SUCCESS
Definition: cli.h:40
#define CLI_FAILURE
Definition: cli.h:46
#define RESULT_FAILURE
Definition: cli.h:42
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:78
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition: lock.h:764
static char * find_best(const char *argv[])
Definition: main/cli.c:2371
void ast_cli(int fd, const char *fmt,...)
Definition: main/cli.c:118
static int allowed_on_shutdown(struct ast_cli_entry *e)
Definition: main/cli.c:2933
static int cli_has_permissions(int uid, int gid, const char *command)
Definition: main/cli.c:183
static char * parse_args(const char *s, int *argc, const char *argv[], int max, int *trailingwhitespace)
Definition: main/cli.c:2609
#define ast_module_unref(mod)
Release a reference to the module.
Definition: module.h:483
#define ast_module_running_ref(mod)
Hold a reference to the module if it is running.
Definition: module.h:469
#define ast_join(s, len, w)
Join an array of strings into a single string.
Definition: strings.h:520
const int fd
Definition: cli.h:159
int inuse
Definition: cli.h:179
const char * usage
Definition: cli.h:177
const char * args

References a, allowed_on_shutdown(), args, ast_atomic_fetchadd_int(), ast_cli(), ast_free, ast_join, AST_MAX_ARGS, ast_module_running_ref, ast_module_unref, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_shutting_down(), CLI_FAILURE, CLI_HANDLER, cli_has_permissions(), CLI_SHOWUSAGE, CLI_SUCCESS, done, ast_cli_args::fd, find_best(), find_cli(), ast_cli_entry::handler, ast_cli_entry::inuse, ast_cli_entry::module, NULL, parse_args(), RESULT_FAILURE, RESULT_SUCCESS, S_OR, and ast_cli_entry::usage.

Referenced by ast_cli_command_multiple_full().

◆ ast_cli_command_multiple_full()

int ast_cli_command_multiple_full ( int  uid,
int  gid,
int  fd,
size_t  size,
const char *  s 
)

Executes multiple CLI commands Interpret strings separated by NULL and execute each one, sending output to fd if uid has permissions, uid = CLI_NO_PERMS to avoid checking users permissions. gid = CLI_NO_PERMS to avoid checking group permissions.

Parameters
uidUser ID that is trying to run the command.
gidGroup ID that is trying to run the command.
fdpipe
sizeis the total size of the string
sincoming string
Returns
number of commands executed

Definition at line 3015 of file main/cli.c.

3016{
3017 char cmd[512];
3018 int x, y = 0, count = 0;
3019
3020 for (x = 0; x < size; x++) {
3021 cmd[y] = s[x];
3022 y++;
3023 if (s[x] == '\0') {
3024 ast_cli_command_full(uid, gid, fd, cmd);
3025 y = 0;
3026 count++;
3027 }
3028 }
3029 return count;
3030}
int ast_cli_command_full(int uid, int gid, int fd, const char *s)
Interprets a command Interpret a command s, sending output to fd if uid:gid has permissions to run th...
Definition: main/cli.c:2950

References ast_cli_command_full(), and ast_cli_args::fd.

Referenced by netconsole().

◆ ast_cli_complete()

char * ast_cli_complete ( const char *  word,
const 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 const char * const choices[] = { "one", "two", "three", NULL };
if (pos == 2)
return ast_cli_complete(word, choices, n);
else
return NULL;
}
char * ast_cli_complete(const char *word, const char *const choices[], int pos)
Definition: main/cli.c:1823
short word

Definition at line 1823 of file main/cli.c.

1824{
1825 int i, which = 0, len;
1826 len = ast_strlen_zero(word) ? 0 : strlen(word);
1827
1828 for (i = 0; choices[i]; i++) {
1829 if ((!len || !strncasecmp(word, choices[i], len)) && ++which > state) {
1830 if (state != -1) {
1831 return ast_strdup(choices[i]);
1832 }
1833
1834 if (ast_cli_completion_add(ast_strdup(choices[i]))) {
1835 return NULL;
1836 }
1837 }
1838 }
1839 return NULL;
1840}
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition: main/cli.c:2737

References ast_cli_completion_add(), ast_strdup, ast_strlen_zero(), len(), and NULL.

Referenced by cli_odbc_read(), cli_odbc_write(), handle_bridge_kick_channel(), handle_cli_core_show_translation(), handle_cli_devstate_change(), handle_cli_iax2_prune_realtime(), handle_cli_presencestate_change(), handle_core_set_debug_channel(), handle_orig(), handle_refresh(), handle_showcalls(), handle_softhangup(), pjsip_set_logger(), and sorcery_memory_cache_stale().

◆ ast_cli_completion_add()

int ast_cli_completion_add ( char *  value)

Add a result to a request for completion options.

Parameters
valueA completion option text.
Return values
0Success
-1Failure

This is an alternative to returning individual values from CLI_GENERATE. Instead of repeatedly being asked for the next match and having to start over, you can call this function repeatedly from your own stateful loop. When all matches have been added you can return NULL from the CLI_GENERATE function.

Note
This function always eventually results in calling ast_free on value.

Definition at line 2737 of file main/cli.c.

2738{
2739 return cli_completion_vector_add(ast_threadstorage_get_ptr(&completion_storage), value);
2740}
static int cli_completion_vector_add(struct ast_vector_string *vec, char *value)
Definition: main/cli.c:2716
int value
Definition: syslog.c:37
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.

References ast_threadstorage_get_ptr(), cli_completion_vector_add(), and value.

Referenced by aeap_tab_complete_name(), ari_set_debug(), ast_cli_complete(), ast_complete_applications(), ast_complete_channels(), category_complete(), cli_complete_endpoint(), cli_complete_show(), cli_complete_uri(), complete_app(), complete_bridge_live_search(), complete_bridge_participant(), complete_bridge_technology(), complete_channeltypes(), complete_config_module(), complete_config_option(), complete_config_type(), complete_core_id(), complete_country(), complete_indications(), complete_session(), complete_show_sorcery_object(), complete_sorcery_object(), complete_trans_path_choice(), config_object_tab_complete_name(), handle_cli_config_reload(), handle_cli_sound_show(), handle_debug_category(), handle_manager_show_event(), handle_show_named_acl_cmd(), handle_showmanager(), handle_showmancmd(), module_load_helper_on_file(), topic_complete_name(), and tps_taskprocessor_tab_complete().

◆ ast_cli_completion_matches()

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.

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, followed by a NULL. All strings and the array itself are malloc'ed and must be freed by the caller.

Warning
This function cannot be called recursively so it will always fail if called from a CLI_GENERATE callback.

Definition at line 2681 of file main/cli.c.

2682{
2684 char **match_list;
2685
2686 if (!vec) {
2687 return NULL;
2688 }
2689
2690 if (AST_VECTOR_APPEND(vec, NULL)) {
2691 /* We failed to NULL terminate the elements */
2694
2695 return NULL;
2696 }
2697
2698 match_list = AST_VECTOR_STEAL_ELEMENTS(vec);
2700
2701 return match_list;
2702}
char * text
Definition: app_queue.c:1765
struct ast_vector_string * ast_cli_completion_vector(const char *text, const char *word)
Generates a vector of strings for CLI completion.
Definition: main/cli.c:2742
String vector definitions.
Definition: vector.h:55
#define AST_VECTOR_STEAL_ELEMENTS(vec)
Steal the elements from a vector and reinitialize.
Definition: vector.h:151
#define AST_VECTOR_PTR_FREE(vec)
Deallocates this vector pointer.
Definition: vector.h:200
#define AST_VECTOR_CALLBACK_VOID(vec, callback,...)
Execute a callback on every element in a vector disregarding callback return.
Definition: vector.h:873

References ast_cli_completion_vector(), ast_free, AST_VECTOR_APPEND, AST_VECTOR_CALLBACK_VOID, AST_VECTOR_PTR_FREE, AST_VECTOR_STEAL_ELEMENTS, NULL, and text.

Referenced by handle_commandmatchesarray().

◆ ast_cli_completion_vector()

struct ast_vector_string * ast_cli_completion_vector ( const char *  text,
const char *  word 
)

Generates a vector of strings for CLI completion.

Parameters
textComplete input being matched.
wordCurrent word being matched

The results contain strings that both: 1) Begin with the string in word. 2) Are valid in a command after the string in text.

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.

Note
All strings and the vector itself are malloc'ed and must be freed by the caller.
The vector is sorted and does not contain any duplicates.
Warning
This function cannot be called recursively so it will always fail if called from a CLI_GENERATE callback.

Definition at line 2742 of file main/cli.c.

2743{
2744 char *retstr, *prevstr;
2745 size_t max_equal;
2746 size_t which = 0;
2747 struct ast_vector_string *vec = ast_calloc(1, sizeof(*vec));
2748
2749 /* Recursion into this function is a coding error. */
2750 ast_assert(!ast_threadstorage_get_ptr(&completion_storage));
2751
2752 if (!vec) {
2753 return NULL;
2754 }
2755
2756 if (ast_threadstorage_set_ptr(&completion_storage, vec)) {
2757 ast_log(LOG_ERROR, "Failed to initialize threadstorage for completion.\n");
2758 ast_free(vec);
2759
2760 return NULL;
2761 }
2762
2763 while ((retstr = ast_cli_generator(text, word, which)) != NULL) {
2764 if (cli_completion_vector_add(vec, retstr)) {
2765 ast_threadstorage_set_ptr(&completion_storage, NULL);
2766
2767 goto vector_cleanup;
2768 }
2769
2770 ++which;
2771 }
2772
2773 ast_threadstorage_set_ptr(&completion_storage, NULL);
2774
2775 if (!AST_VECTOR_SIZE(vec)) {
2777
2778 return NULL;
2779 }
2780
2781 prevstr = AST_VECTOR_GET(vec, 0);
2782 max_equal = strlen(prevstr);
2783 which = 1;
2784
2785 /* Find the longest substring that is common to all results
2786 * (it is a candidate for completion), and store a copy in entry 0.
2787 */
2788 while (which < AST_VECTOR_SIZE(vec)) {
2789 size_t i = 0;
2790
2791 retstr = AST_VECTOR_GET(vec, which);
2792 /* Check for and remove duplicate strings. */
2793 if (!strcasecmp(prevstr, retstr)) {
2794 AST_VECTOR_REMOVE(vec, which, 1);
2795 ast_free(retstr);
2796
2797 continue;
2798 }
2799
2800 while (i < max_equal && toupper(prevstr[i]) == toupper(retstr[i])) {
2801 i++;
2802 }
2803
2804 max_equal = i;
2805 prevstr = retstr;
2806 ++which;
2807 }
2808
2809 /* Insert longest match to position 0. */
2810 retstr = ast_strndup(AST_VECTOR_GET(vec, 0), max_equal);
2811 if (!retstr || AST_VECTOR_INSERT_AT(vec, 0, retstr)) {
2812 ast_free(retstr);
2813
2814 goto vector_cleanup;
2815 }
2816
2817 return vec;
2818
2819vector_cleanup:
2822
2823 return NULL;
2824}
#define ast_strndup(str, len)
A wrapper for strndup()
Definition: astmm.h:256
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define LOG_ERROR
char * ast_cli_generator(const char *text, const char *word, int state)
Readline madness Useful for readline, that's about it.
Definition: main/cli.c:2928
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.
#define ast_assert(a)
Definition: utils.h:776
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:620
#define AST_VECTOR_INSERT_AT(vec, idx, elem)
Insert an element at a specific position in a vector, growing the vector if needed.
Definition: vector.h:349
#define AST_VECTOR_REMOVE(vec, idx, preserve_ordered)
Remove an element from a vector by index.
Definition: vector.h:423
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:691

References ast_assert, ast_calloc, ast_cli_generator(), ast_free, ast_log, ast_strndup, ast_threadstorage_get_ptr(), ast_threadstorage_set_ptr(), AST_VECTOR_CALLBACK_VOID, AST_VECTOR_GET, AST_VECTOR_INSERT_AT, AST_VECTOR_PTR_FREE, AST_VECTOR_REMOVE, AST_VECTOR_SIZE, cli_completion_vector_add(), LOG_ERROR, NULL, and text.

Referenced by ast_cli_completion_matches(), AST_TEST_DEFINE(), and cli_complete().

◆ ast_cli_generator()

char * ast_cli_generator ( const char *  text,
const char *  word,
int  state 
)

Readline madness Useful for readline, that's about it.

Return values
0on success
-1on failure

Only call this function to proxy the CLI generator to another.

Definition at line 2928 of file main/cli.c.

2929{
2930 return __ast_cli_generator(text, word, state, 1);
2931}
static char * __ast_cli_generator(const char *text, const char *word, int state, int lock)
Definition: main/cli.c:2840

References __ast_cli_generator(), and text.

Referenced by ast_cli_completion_vector(), cli_alias_passthrough(), and handle_cli_check_permissions().

◆ ast_cli_print_timestr_fromseconds()

void ast_cli_print_timestr_fromseconds ( int  fd,
int  seconds,
const char *  prefix 
)

Print on cli a duration in seconds in format s year(s), s week(s), s day(s), s hour(s), s second(s)

Since
13.8
Parameters
fdfd to print by ast_cli
secondsThe time (in seconds) to print
prefixA Prefix string to add before of duration formatted

Definition at line 3032 of file main/cli.c.

3033{
3034 print_uptimestr(fd, ast_tv(seconds, 0), prefix, 0);
3035}
static char prefix[MAX_PREFIX]
Definition: http.c:144
static void print_uptimestr(int fd, struct timeval timeval, const char *prefix, int printsec)
Definition: main/cli.c:913
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Definition: time.h:235

References ast_tv(), ast_cli_args::fd, prefix, and print_uptimestr().

Referenced by handle_cdr_pgsql_status(), handle_cli_realtime_pgsql_status(), and realtime_ldap_status().

◆ ast_cli_unregister()

int ast_cli_unregister ( struct ast_cli_entry e)

Unregisters a command or an array of commands.

Parameters
ewhich cli entry to unregister Unregister your own command. You must pass a completed ast_cli_entry structure
Returns
0

Definition at line 2408 of file main/cli.c.

2409{
2410 if (e->inuse) {
2411 ast_log(LOG_WARNING, "Can't remove command that is in use\n");
2412 } else {
2414 AST_RWLIST_REMOVE(&helpers, e, list);
2417 ast_free(e->_full_cmd);
2418 e->_full_cmd = NULL;
2419 if (e->handler) {
2420 /* this is a new-style entry. Reset fields and free memory. */
2421 char *cmda = (char *) e->cmda;
2422 memset(cmda, '\0', sizeof(e->cmda));
2423 ast_free(e->command);
2424 e->command = NULL;
2425 e->usage = NULL;
2426 }
2427 }
2428 return 0;
2429}
#define AST_RWLIST_REMOVE
Definition: linkedlists.h:885
static void remove_shutdown_command(struct ast_cli_entry *e)
Definition: main/cli.c:2401

References ast_cli_entry::_full_cmd, ast_free, ast_log, AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_cli_entry::cmda, ast_cli_entry::command, ast_cli_entry::handler, ast_cli_entry::inuse, ast_cli_entry::list, LOG_WARNING, NULL, remove_shutdown_command(), and ast_cli_entry::usage.

Referenced by aco_deinit(), alias_unregister_cb(), ast_cli_unregister_multiple(), unload_module(), and xmldoc_unload_documentation().

◆ ast_cli_unregister_multiple()

int ast_cli_unregister_multiple ( struct ast_cli_entry e,
int  len 
)

Unregister multiple commands.

Parameters
epointer to first cli entry to unregister
lennumber of entries to unregister
Examples
app_skel.c.

Definition at line 30 of file clicompat.c.

31{
32 return 0;
33}

References ast_cli_unregister(), and len().

Referenced by __unload_module(), aoc_shutdown(), ari_cli_unregister(), as_config_unload(), ast_res_pjsip_cleanup_options_handling(), ast_res_pjsip_destroy_configuration(), ast_sip_destroy_cli(), ast_sip_destroy_distributor(), ast_sip_destroy_scheduler(), ast_sip_destroy_sorcery_auth(), ast_sip_destroy_sorcery_location(), ast_sip_destroy_sorcery_transport(), ast_sip_destroy_transport_events(), astdb_atexit(), astobj2_cleanup(), bridge_cleanup(), cdr_engine_shutdown(), channels_shutdown(), cli_channels_shutdown(), cli_shutdown(), cli_unload_cb(), close_logger(), codec_shutdown(), common_config_unload(), conf_destroy_config(), config_shutdown(), file_shutdown(), geoloc_config_unload(), geoloc_gml_unload(), iax_provision_unload(), image_shutdown(), load_module(), local_shutdown(), main_atexit(), manager_shutdown(), media_cache_shutdown(), pjsip_channel_cli_unregister(), profile_unload(), sorcery_cleanup(), stasis_cleanup(), stun_shutdown(), timing_shutdown(), tn_config_unload(), tps_shutdown(), translate_shutdown(), unload_features_config(), unload_module(), unload_parking_ui(), unload_pbx(), unload_pbx_app(), unload_pbx_functions_cli(), unload_pbx_hangup_handler(), unload_pbx_switch(), unload_pbx_variables(), utils_shutdown(), and vs_config_unload().

◆ ast_complete_channels()

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 1842 of file main/cli.c.

1843{
1844 int wordlen = strlen(word), which = 0;
1845 struct ao2_container *cached_channels;
1846 char *ret = NULL;
1847 struct ao2_iterator iter;
1848 struct ast_channel_snapshot *snapshot;
1849
1850 if (pos != rpos) {
1851 return NULL;
1852 }
1853
1854 cached_channels = ast_channel_cache_all();
1855
1856 iter = ao2_iterator_init(cached_channels, 0);
1857 for (; (snapshot = ao2_iterator_next(&iter)); ao2_ref(snapshot, -1)) {
1858 if (!strncasecmp(word, snapshot->base->name, wordlen) && (++which > state)) {
1859 if (state != -1) {
1860 ret = ast_strdup(snapshot->base->name);
1861 ao2_ref(snapshot, -1);
1862 break;
1863 }
1864
1865 if (ast_cli_completion_add(ast_strdup(snapshot->base->name))) {
1866 ao2_ref(snapshot, -1);
1867 break;
1868 }
1869 }
1870 }
1871 ao2_iterator_destroy(&iter);
1872 ao2_ref(cached_channels, -1);
1873
1874 return ret;
1875}
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
enum cc_state state
Definition: ccss.c:399
struct ao2_container * ast_channel_cache_all(void)
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821
const ast_string_field name
Structure representing a snapshot of channel state.
struct ast_channel_snapshot_base * base

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_channel_cache_all(), ast_cli_completion_add(), ast_strdup, ast_channel_snapshot::base, ast_channel_snapshot_base::name, NULL, and state.

Referenced by cli_complete_notify(), handle_cli_agi_add_cmd(), handle_cli_mixmonitor(), handle_core_set_debug_channel(), handle_dump_frames(), handle_redirect(), handle_remb_set(), handle_set_chanvar(), handle_show_chanvar(), handle_show_hangup_channel(), handle_showchan(), and handle_softhangup().