#include <unistd.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <ctype.h>
#include "asterisk.h"
#include "asterisk/logger.h"
#include "asterisk/options.h"
#include "asterisk/cli.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/channel.h"
#include "asterisk/manager.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
#include "editline/readline/readline.h"
#include "asterisk/version.h"
Include dependency graph for cli.c:
Go to the source code of this file.
Defines | |
#define | CONCISE_FORMAT_STRING "%s:%s:%s:%d:%s:%s:%s:%s:%s:%d:%s:%s\n" |
#define | DAY (HOUR*24) |
#define | DEBUGCHAN_FLAG 0x80000000 |
#define | ESS(x) ((x == 1) ? "" : "s") |
#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 | 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 (char *text, char *word, int state, int lock) |
void | ast_cli (int fd, char *fmt,...) |
int | ast_cli_command (int fd, char *s) |
Interprets a command Interpret a command s, sending output to fd Returns 0 on succes, -1 on failure. | |
char ** | ast_cli_completion_matches (char *text, char *word) |
char * | ast_cli_generator (char *text, char *word, int state) |
Readline madness Useful for readline, that's about it Returns 0 on success, -1 on failure. | |
int | ast_cli_generatornummatches (char *text, char *word) |
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. | |
AST_MUTEX_DEFINE_STATIC (climodentrylock) | |
AST_MUTEX_DEFINE_STATIC (clilock) | |
static char * | complete_ch_3 (char *line, char *word, int pos, int state) |
static char * | complete_ch_4 (char *line, char *word, int pos, int state) |
static char * | complete_ch_helper (char *line, char *word, int pos, int state, int rpos) |
static char * | complete_fn (char *line, char *word, int pos, int state) |
static char * | complete_mod_2 (char *line, char *word, int pos, int state) |
static char * | complete_mod_4 (char *line, char *word, int pos, int state) |
static char * | complete_show_channels (char *line, char *word, int pos, int state) |
static char * | find_best (char *argv[]) |
static struct ast_cli_entry * | find_cli (char *cmds[], int exact) |
static char * | format_uptimestr (time_t timeval) |
static int | handle_chanlist (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_debugchan (int fd, int argc, char *argv[]) |
static int | handle_debuglevel (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_modlist (int fd, int argc, char *argv[]) |
static int | handle_nodebugchan (int fd, int argc, char *argv[]) |
static int | handle_reload (int fd, int argc, char *argv[]) |
static int | handle_set_debug (int fd, int argc, char *argv[]) |
static int | handle_set_verbose (int fd, int argc, char *argv[]) |
static int | handle_showchan (int fd, int argc, char *argv[]) |
static int | handle_showuptime (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_version (int fd, int argc, char *argv[]) |
static int | help_workhorse (int fd, char *match[]) |
static void | join (char *dest, size_t destsize, char *w[], int tws) |
static void | join2 (char *dest, size_t destsize, char *w[]) |
static int | modlist_modentry (const char *module, const char *description, int usecnt, const char *like) |
static char * | parse_args (char *s, int *argc, char *argv[], int max, int *trailingwhitespace) |
Variables | |
const char * | ast_build_date |
const char * | ast_build_hostname |
const char * | ast_build_kernel |
const char * | ast_build_machine |
const char * | ast_build_os |
const char * | ast_build_user |
static struct ast_cli_entry | builtins [] |
static char | chanlist_help [] |
static int | climodentryfd = -1 |
static char | commandcomplete_help [] |
static char | commandmatchesarray_help [] |
static char | commandnummatches_help [] |
static char | debugchan_help [] |
static char | debuglevel_help [] |
unsigned long | global_fin |
unsigned long | global_fout |
static char | help_help [] |
ast_cli_entry * | helpers = NULL |
static char | load_help [] |
static char | modlist_help [] |
static char | nodebugchan_help [] |
static char | reload_help [] |
static char | set_debug_help [] |
static char | set_verbose_help [] |
static char | showchan_help [] |
static char | softhangup_help [] |
static char | unload_help [] |
static char | uptime_help [] |
static char | version_help [] |
Definition in file cli.c.
|
Referenced by handle_chanlist(). |
|
Referenced by format_uptimestr(). |
|
Definition at line 659 of file cli.c. Referenced by handle_debugchan(), and handle_nodebugchan(). |
|
Referenced by format_uptimestr(). |
|
Referenced by group_show_channels(), and handle_chanlist(). |
|
Referenced by handle_chanlist(). |
|
Referenced by format_uptimestr(). |
|
Referenced by format_uptimestr(). |
|
Definition at line 243 of file cli.c. Referenced by modlist_modentry(). |
|
Definition at line 244 of file cli.c. Referenced by handle_modlist(). |
|
|
|
Referenced by handle_chanlist(). |
|
Referenced by handle_chanlist(). |
|
Referenced by format_uptimestr(). |
|
Referenced by format_uptimestr(). |
|
Definition at line 1266 of file cli.c. References AST_MAX_ARGS, ast_mutex_lock(), ast_mutex_unlock(), ast_strlen_zero(), ast_cli_entry::cmda, free, ast_cli_entry::generator, join(), ast_cli_entry::next, parse_args(), and strdup. Referenced by ast_cli_generator(), and handle_commandcomplete(). 01267 { 01268 char *argv[AST_MAX_ARGS]; 01269 struct ast_cli_entry *e, *e1, *e2; 01270 int x; 01271 int matchnum=0; 01272 char *dup, *res; 01273 char fullcmd1[80] = ""; 01274 char fullcmd2[80] = ""; 01275 char matchstr[80] = ""; 01276 char *fullcmd = NULL; 01277 int tws; 01278 01279 if ((dup = parse_args(text, &x, argv, sizeof(argv) / sizeof(argv[0]), &tws))) { 01280 join(matchstr, sizeof(matchstr), argv, tws); 01281 if (lock) 01282 ast_mutex_lock(&clilock); 01283 e1 = builtins; 01284 e2 = helpers; 01285 while(e1->cmda[0] || e2) { 01286 if (e2) 01287 join(fullcmd2, sizeof(fullcmd2), e2->cmda, tws); 01288 if (e1->cmda[0]) 01289 join(fullcmd1, sizeof(fullcmd1), e1->cmda, tws); 01290 if (!e1->cmda[0] || 01291 (e2 && (strcmp(fullcmd2, fullcmd1) < 0))) { 01292 /* Use e2 */ 01293 e = e2; 01294 fullcmd = fullcmd2; 01295 /* Increment by going to next */ 01296 e2 = e2->next; 01297 } else { 01298 /* Use e1 */ 01299 e = e1; 01300 fullcmd = fullcmd1; 01301 e1++; 01302 } 01303 if ((fullcmd[0] != '_') && !strncasecmp(matchstr, fullcmd, strlen(matchstr))) { 01304 /* We contain the first part of one or more commands */ 01305 /* Now, what we're supposed to return is the next word... */ 01306 if (!ast_strlen_zero(word) && x>0) { 01307 res = e->cmda[x-1]; 01308 } else { 01309 res = e->cmda[x]; 01310 } 01311 if (res) { 01312 matchnum++; 01313 if (matchnum > state) { 01314 if (lock) 01315 ast_mutex_unlock(&clilock); 01316 free(dup); 01317 return strdup(res); 01318 } 01319 } 01320 } 01321 if (e->generator && !strncasecmp(matchstr, fullcmd, strlen(fullcmd)) && 01322 (matchstr[strlen(fullcmd)] < 33)) { 01323 /* We have a command in its entirity within us -- theoretically only one 01324 command can have this occur */ 01325 fullcmd = e->generator(matchstr, word, (!ast_strlen_zero(word) ? (x - 1) : (x)), state); 01326 if (fullcmd) { 01327 if (lock) 01328 ast_mutex_unlock(&clilock); 01329 free(dup); 01330 return fullcmd; 01331 } 01332 } 01333 01334 } 01335 if (lock) 01336 ast_mutex_unlock(&clilock); 01337 free(dup); 01338 } 01339 return NULL; 01340 }
|
|
|
Interprets a command Interpret a command s, sending output to fd Returns 0 on succes, -1 on failure.
Definition at line 1347 of file cli.c. References ast_cli(), ast_log(), AST_MAX_ARGS, ast_mutex_lock(), ast_mutex_unlock(), find_best(), find_cli(), free, ast_cli_entry::handler, ast_cli_entry::inuse, LOG_WARNING, parse_args(), RESULT_SHOWUSAGE, and ast_cli_entry::usage. Referenced by action_command(), cli_activate(), consolehandler(), exit_completely(), and netconsole(). 01348 { 01349 char *argv[AST_MAX_ARGS]; 01350 struct ast_cli_entry *e; 01351 int x; 01352 char *dup; 01353 int tws; 01354 01355 if ((dup = parse_args(s, &x, argv, sizeof(argv) / sizeof(argv[0]), &tws))) { 01356 /* We need at least one entry, or ignore */ 01357 if (x > 0) { 01358 ast_mutex_lock(&clilock); 01359 e = find_cli(argv, 0); 01360 if (e) 01361 e->inuse++; 01362 ast_mutex_unlock(&clilock); 01363 if (e) { 01364 switch(e->handler(fd, x, argv)) { 01365 case RESULT_SHOWUSAGE: 01366 if (e->usage) 01367 ast_cli(fd, "%s", e->usage); 01368 else 01369 ast_cli(fd, "%s", "Invalid usage, but no usage information available.\n"); 01370 break; 01371 } 01372 } else 01373 ast_cli(fd, "No such command '%s' (type 'help' for help)\n", find_best(argv)); 01374 if (e) { 01375 ast_mutex_lock(&clilock); 01376 e->inuse--; 01377 ast_mutex_unlock(&clilock); 01378 } 01379 } 01380 free(dup); 01381 } else { 01382 ast_log(LOG_WARNING, "Out of memory\n"); 01383 return -1; 01384 } 01385 return 0; 01386 }
|
|
Definition at line 1227 of file cli.c. References ast_cli_generator(), malloc, and realloc. Referenced by cli_complete(), and handle_commandmatchesarray(). 01228 { 01229 char **match_list = NULL, *retstr, *prevstr; 01230 size_t match_list_len, max_equal, which, i; 01231 int matches = 0; 01232 01233 match_list_len = 1; 01234 while ((retstr = ast_cli_generator(text, word, matches)) != NULL) { 01235 if (matches + 1 >= match_list_len) { 01236 match_list_len <<= 1; 01237 match_list = realloc(match_list, match_list_len * sizeof(char *)); 01238 } 01239 match_list[++matches] = retstr; 01240 } 01241 01242 if (!match_list) 01243 return (char **) NULL; 01244 01245 which = 2; 01246 prevstr = match_list[1]; 01247 max_equal = strlen(prevstr); 01248 for (; which <= matches; which++) { 01249 for (i = 0; i < max_equal && toupper(prevstr[i]) == toupper(match_list[which][i]); i++) 01250 continue; 01251 max_equal = i; 01252 } 01253 01254 retstr = malloc(max_equal + 1); 01255 (void) strncpy(retstr, match_list[1], max_equal); 01256 retstr[max_equal] = '\0'; 01257 match_list[0] = retstr; 01258 01259 if (matches + 1 >= match_list_len) 01260 match_list = realloc(match_list, (match_list_len + 1) * sizeof(char *)); 01261 match_list[matches + 1] = (char *) NULL; 01262 01263 return (match_list); 01264 }
|
|
Readline madness Useful for readline, that's about it Returns 0 on success, -1 on failure.
Definition at line 1342 of file cli.c. References __ast_cli_generator(). Referenced by ast_cli_completion_matches(), and ast_cli_generatornummatches(). 01343 { 01344 return __ast_cli_generator(text, word, state, 1); 01345 }
|
|
Definition at line 1210 of file cli.c. References ast_cli_generator(), and free. Referenced by cli_complete(), and handle_commandnummatches(). 01211 { 01212 int matches = 0, i = 0; 01213 char *buf = NULL, *oldbuf = NULL; 01214 01215 while ( (buf = ast_cli_generator(text, word, i++)) ) { 01216 if (!oldbuf || strcmp(buf,oldbuf)) 01217 matches++; 01218 if (oldbuf) 01219 free(oldbuf); 01220 oldbuf = buf; 01221 } 01222 if (oldbuf) 01223 free(oldbuf); 01224 return matches; 01225 }
|
|
Registers a command or an array of commands.
Definition at line 1018 of file cli.c. References ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_cli_entry::cmda, find_cli(), join2(), LOG_WARNING, and ast_cli_entry::next. Referenced by ast_cdr_engine_init(), ast_channels_init(), ast_cli_register_multiple(), ast_file_init(), ast_image_init(), ast_register_translator(), ast_rtp_init(), astdb_init(), crypto_init(), dnsmgr_init(), do_reload(), iax_provision_init(), init_logger(), init_manager(), load_module(), register_config_cli(), and unload_module(). 01019 { 01020 struct ast_cli_entry *cur, *l=NULL; 01021 char fulle[80] ="", fulltst[80] =""; 01022 static int len; 01023 ast_mutex_lock(&clilock); 01024 join2(fulle, sizeof(fulle), e->cmda); 01025 if (find_cli(e->cmda, -1)) { 01026 ast_mutex_unlock(&clilock); 01027 ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n", fulle); 01028 return -1; 01029 } 01030 cur = helpers; 01031 while(cur) { 01032 join2(fulltst, sizeof(fulltst), cur->cmda); 01033 len = strlen(fulltst); 01034 if (strlen(fulle) < len) 01035 len = strlen(fulle); 01036 if (strncasecmp(fulle, fulltst, len) < 0) { 01037 if (l) { 01038 e->next = l->next; 01039 l->next = e; 01040 } else { 01041 e->next = helpers; 01042 helpers = e; 01043 } 01044 break; 01045 } 01046 l = cur; 01047 cur = cur->next; 01048 } 01049 if (!cur) { 01050 if (l) 01051 l->next = e; 01052 else 01053 helpers = e; 01054 e->next = NULL; 01055 } 01056 ast_mutex_unlock(&clilock); 01057 return 0; 01058 }
|
|
Register multiple commands.
Definition at line 1063 of file cli.c. References ast_cli_register(). Referenced by init_framer(), load_module(), load_pbx(), and main(). 01064 { 01065 int i; 01066 01067 for (i=0; i < len; i++) 01068 ast_cli_register(e + i); 01069 }
|
|
Unregisters a command or an array of commands.
Definition at line 992 of file cli.c. References ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_cli_entry::inuse, LOG_WARNING, and ast_cli_entry::next. Referenced by ast_cli_unregister_multiple(), do_reload(), iax_provision_unload(), and unload_module(). 00993 { 00994 struct ast_cli_entry *cur, *l=NULL; 00995 ast_mutex_lock(&clilock); 00996 cur = helpers; 00997 while(cur) { 00998 if (e == cur) { 00999 if (e->inuse) { 01000 ast_log(LOG_WARNING, "Can't remove command that is in use\n"); 01001 } else { 01002 /* Rewrite */ 01003 if (l) 01004 l->next = e->next; 01005 else 01006 helpers = e->next; 01007 e->next = NULL; 01008 break; 01009 } 01010 } 01011 l = cur; 01012 cur = cur->next; 01013 } 01014 ast_mutex_unlock(&clilock); 01015 return 0; 01016 }
|
|
Unregister multiple commands.
Definition at line 1071 of file cli.c. References ast_cli_unregister(). Referenced by __unload_module(), and unload_module(). 01072 { 01073 int i; 01074 01075 for (i=0; i < len; i++) 01076 ast_cli_unregister(e + i); 01077 }
|
|
|
|
|
|
Definition at line 837 of file cli.c. References complete_ch_helper(). 00838 { 00839 return complete_ch_helper(line, word, pos, state, 2); 00840 }
|
|
Definition at line 842 of file cli.c. References complete_ch_helper(). 00843 { 00844 return complete_ch_helper(line, word, pos, state, 3); 00845 }
|
|
Definition at line 816 of file cli.c. References ast_channel_walk_locked(), ast_mutex_unlock(), ast_channel::lock, ast_channel::name, and strdup. Referenced by complete_ch(), complete_ch_3(), and complete_ch_4(). 00817 { 00818 struct ast_channel *c = NULL; 00819 int which=0; 00820 char *ret = NULL; 00821 00822 if (pos != rpos) 00823 return NULL; 00824 while ( (c = ast_channel_walk_locked(c)) != NULL) { 00825 if (!strncasecmp(word, c->name, strlen(word))) { 00826 if (++which > state) { 00827 ret = strdup(c->name); 00828 ast_mutex_unlock(&c->lock); 00829 break; 00830 } 00831 } 00832 ast_mutex_unlock(&c->lock); 00833 } 00834 return ret; 00835 }
|
|
Definition at line 857 of file cli.c. References ast_config_AST_MODULE_DIR, and strdup. 00858 { 00859 char *c; 00860 char filename[256]; 00861 if (pos != 1) 00862 return NULL; 00863 if (word[0] == '/') 00864 ast_copy_string(filename, word, sizeof(filename)); 00865 else 00866 snprintf(filename, sizeof(filename), "%s/%s", (char *)ast_config_AST_MODULE_DIR, word); 00867 c = (char*)filename_completion_function(filename, state); 00868 if (c && word[0] != '/') 00869 c += (strlen((char*)ast_config_AST_MODULE_DIR) + 1); 00870 return c ? strdup(c) : c; 00871 }
|
|
Definition at line 847 of file cli.c. References ast_module_helper(). 00848 { 00849 return ast_module_helper(line, word, pos, state, 1, 1); 00850 }
|
|
Definition at line 852 of file cli.c. References ast_module_helper(). 00853 { 00854 return ast_module_helper(line, word, pos, state, 3, 0); 00855 }
|
|
Definition at line 800 of file cli.c. References match(), and strdup. 00801 { 00802 static char *choices[] = { "concise", "verbose" }; 00803 int match = 0; 00804 int x; 00805 if (pos != 2) 00806 return NULL; 00807 for (x=0;x<sizeof(choices) / sizeof(choices[0]);x++) { 00808 if (!strncasecmp(word, choices[x], strlen(word))) { 00809 match++; 00810 if (match > state) return strdup(choices[x]); 00811 } 00812 } 00813 return NULL; 00814 }
|
|
Definition at line 975 of file cli.c. References AST_MAX_CMD_LEN, find_cli(), and join(). Referenced by ast_cli_command(). 00976 { 00977 static char cmdline[80]; 00978 int x; 00979 /* See how close we get, then print the */ 00980 char *myargv[AST_MAX_CMD_LEN]; 00981 for (x=0;x<AST_MAX_CMD_LEN;x++) 00982 myargv[x]=NULL; 00983 for (x=0;argv[x];x++) { 00984 myargv[x] = argv[x]; 00985 if (!find_cli(myargv, -1)) 00986 break; 00987 } 00988 join(cmdline, sizeof(cmdline), myargv, 0); 00989 return cmdline; 00990 }
|
|
Definition at line 899 of file cli.c. References ast_cli_entry::cmda, match(), and ast_cli_entry::next. Referenced by ast_cli_command(), ast_cli_register(), find_best(), and handle_help(). 00900 { 00901 int x; 00902 int y; 00903 int match; 00904 struct ast_cli_entry *e=NULL; 00905 00906 for (e=helpers;e;e=e->next) { 00907 match = 1; 00908 for (y=0;match && cmds[y]; y++) { 00909 if (!e->cmda[y] && !exact) 00910 break; 00911 if (!e->cmda[y] || strcasecmp(e->cmda[y], cmds[y])) 00912 match = 0; 00913 } 00914 if ((exact > -1) && e->cmda[y]) 00915 match = 0; 00916 if (match) 00917 break; 00918 } 00919 if (e) 00920 return e; 00921 for (x=0;builtins[x].cmda[0];x++) { 00922 /* start optimistic */ 00923 match = 1; 00924 for (y=0;match && cmds[y]; y++) { 00925 /* If there are no more words in the candidate command, then we're 00926 there. */ 00927 if (!builtins[x].cmda[y] && !exact) 00928 break; 00929 /* If there are no more words in the command (and we're looking for 00930 an exact match) or there is a difference between the two words, 00931 then this is not a match */ 00932 if (!builtins[x].cmda[y] || strcasecmp(builtins[x].cmda[y], cmds[y])) 00933 match = 0; 00934 } 00935 /* If more words are needed to complete the command then this is not 00936 a candidate (unless we're looking for a really inexact answer */ 00937 if ((exact > -1) && builtins[x].cmda[y]) 00938 match = 0; 00939 if (match) 00940 return &builtins[x]; 00941 } 00942 return NULL; 00943 }
|
|
Definition at line 272 of file cli.c. References DAY, days, ESS, HOUR, MINUTE, offset, strdup, WEEK, and YEAR. Referenced by handle_showuptime(). 00273 { 00274 int years = 0, weeks = 0, days = 0, hours = 0, mins = 0, secs = 0; 00275 char timestr[256]=""; 00276 int bytes = 0; 00277 int maxbytes = 0; 00278 int offset = 0; 00279 #define SECOND (1) 00280 #define MINUTE (SECOND*60) 00281 #define HOUR (MINUTE*60) 00282 #define DAY (HOUR*24) 00283 #define WEEK (DAY*7) 00284 #define YEAR (DAY*365) 00285 #define ESS(x) ((x == 1) ? "" : "s") 00286 00287 maxbytes = sizeof(timestr); 00288 if (timeval < 0) 00289 return NULL; 00290 if (timeval > YEAR) { 00291 years = (timeval / YEAR); 00292 timeval -= (years * YEAR); 00293 if (years > 0) { 00294 snprintf(timestr + offset, maxbytes, "%d year%s, ", years, ESS(years)); 00295 bytes = strlen(timestr + offset); 00296 offset += bytes; 00297 maxbytes -= bytes; 00298 } 00299 } 00300 if (timeval > WEEK) { 00301 weeks = (timeval / WEEK); 00302 timeval -= (weeks * WEEK); 00303 if (weeks > 0) { 00304 snprintf(timestr + offset, maxbytes, "%d week%s, ", weeks, ESS(weeks)); 00305 bytes = strlen(timestr + offset); 00306 offset += bytes; 00307 maxbytes -= bytes; 00308 } 00309 } 00310 if (timeval > DAY) { 00311 days = (timeval / DAY); 00312 timeval -= (days * DAY); 00313 if (days > 0) { 00314 snprintf(timestr + offset, maxbytes, "%d day%s, ", days, ESS(days)); 00315 bytes = strlen(timestr + offset); 00316 offset += bytes; 00317 maxbytes -= bytes; 00318 } 00319 } 00320 if (timeval > HOUR) { 00321 hours = (timeval / HOUR); 00322 timeval -= (hours * HOUR); 00323 if (hours > 0) { 00324 snprintf(timestr + offset, maxbytes, "%d hour%s, ", hours, ESS(hours)); 00325 bytes = strlen(timestr + offset); 00326 offset += bytes; 00327 maxbytes -= bytes; 00328 } 00329 } 00330 if (timeval > MINUTE) { 00331 mins = (timeval / MINUTE); 00332 timeval -= (mins * MINUTE); 00333 if (mins > 0) { 00334 snprintf(timestr + offset, maxbytes, "%d minute%s, ", mins, ESS(mins)); 00335 bytes = strlen(timestr + offset); 00336 offset += bytes; 00337 maxbytes -= bytes; 00338 } 00339 } 00340 secs = timeval; 00341 00342 if (secs > 0) { 00343 snprintf(timestr + offset, maxbytes, "%d second%s", secs, ESS(secs)); 00344 } 00345 00346 return timestr ? strdup(timestr) : NULL; 00347 }
|
|
Definition at line 419 of file cli.c. References ast_active_calls(), ast_bridged_channel(), ast_channel_walk_locked(), ast_cli(), ast_mutex_unlock(), ast_state2str(), ast_strlen_zero(), CONCISE_FORMAT_STRING, FORMAT_STRING, FORMAT_STRING2, option_maxcalls, RESULT_SHOWUSAGE, RESULT_SUCCESS, VERBOSE_FORMAT_STRING, and VERBOSE_FORMAT_STRING2. 00420 { 00421 #define FORMAT_STRING "%-20.20s %-20.20s %-7.7s %-30.30s\n" 00422 #define FORMAT_STRING2 "%-20.20s %-20.20s %-7.7s %-30.30s\n" 00423 #define CONCISE_FORMAT_STRING "%s:%s:%s:%d:%s:%s:%s:%s:%s:%d:%s:%s\n" 00424 #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" 00425 #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" 00426 00427 struct ast_channel *c = NULL, *bc = NULL; 00428 char durbuf[10] = "-"; 00429 char locbuf[40]; 00430 char appdata[40]; 00431 int duration; 00432 int durh, durm, durs; 00433 int numchans = 0, concise = 0, verbose = 0; 00434 00435 concise = (argc == 3 && (!strcasecmp(argv[2],"concise"))); 00436 verbose = (argc == 3 && (!strcasecmp(argv[2],"verbose"))); 00437 00438 if (argc < 2 || argc > 3 || (argc == 3 && !concise && !verbose)) 00439 return RESULT_SHOWUSAGE; 00440 00441 if (!concise && !verbose) 00442 ast_cli(fd, FORMAT_STRING2, "Channel", "Location", "State", "Application(Data)"); 00443 else if (verbose) 00444 ast_cli(fd, VERBOSE_FORMAT_STRING2, "Channel", "Context", "Extension", "Priority", "State", "Application", "Data", 00445 "CallerID", "Duration", "Accountcode", "BridgedTo"); 00446 while ((c = ast_channel_walk_locked(c)) != NULL) { 00447 bc = ast_bridged_channel(c); 00448 if ((concise || verbose) && c->cdr && !ast_tvzero(c->cdr->start)) { 00449 duration = (int)(ast_tvdiff_ms(ast_tvnow(), c->cdr->start) / 1000); 00450 if (verbose) { 00451 durh = duration / 3600; 00452 durm = (duration % 3600) / 60; 00453 durs = duration % 60; 00454 snprintf(durbuf, sizeof(durbuf), "%02d:%02d:%02d", durh, durm, durs); 00455 } else { 00456 snprintf(durbuf, sizeof(durbuf), "%d", duration); 00457 } 00458 } else { 00459 durbuf[0] = '\0'; 00460 } 00461 if (concise) { 00462 ast_cli(fd, CONCISE_FORMAT_STRING, c->name, c->context, c->exten, c->priority, ast_state2str(c->_state), 00463 c->appl ? c->appl : "(None)", c->data ? ( !ast_strlen_zero(c->data) ? c->data : "" ): "", 00464 (c->cid.cid_num && !ast_strlen_zero(c->cid.cid_num)) ? c->cid.cid_num : "", 00465 (c->accountcode && !ast_strlen_zero(c->accountcode)) ? c->accountcode : "", c->amaflags, 00466 durbuf, bc ? bc->name : "(None)"); 00467 } else if (verbose) { 00468 ast_cli(fd, VERBOSE_FORMAT_STRING, c->name, c->context, c->exten, c->priority, ast_state2str(c->_state), 00469 c->appl ? c->appl : "(None)", c->data ? ( !ast_strlen_zero(c->data) ? c->data : "(Empty)" ): "(None)", 00470 (c->cid.cid_num && !ast_strlen_zero(c->cid.cid_num)) ? c->cid.cid_num : "", durbuf, 00471 (c->accountcode && !ast_strlen_zero(c->accountcode)) ? c->accountcode : "", bc ? bc->name : "(None)"); 00472 } else { 00473 if (!ast_strlen_zero(c->context) && !ast_strlen_zero(c->exten)) 00474 snprintf(locbuf, sizeof(locbuf), "%s@%s:%d", c->exten, c->context, c->priority); 00475 else 00476 strcpy(locbuf, "(None)"); 00477 if (c->appl) { 00478 snprintf(appdata, sizeof(appdata), "%s(%s)", c->appl, c->data ? c->data : ""); 00479 } else { 00480 strcpy(appdata, "(None)"); 00481 } 00482 ast_cli(fd, FORMAT_STRING, c->name, locbuf, ast_state2str(c->_state), appdata); 00483 } 00484 numchans++; 00485 ast_mutex_unlock(&c->lock); 00486 } 00487 if (!concise) { 00488 ast_cli(fd, "%d active channel%s\n", numchans, (numchans!=1) ? "s" : ""); 00489 if (option_maxcalls) 00490 ast_cli(fd, "%d of %d max active call%s (%5.2f%% of capacity)\n", ast_active_calls(), option_maxcalls, (ast_active_calls()!=1) ? "s" : "", ((float)ast_active_calls() / (float)option_maxcalls) * 100.0); 00491 else 00492 ast_cli(fd, "%d active call%s\n", ast_active_calls(), (ast_active_calls()!=1) ? "s" : ""); 00493 } 00494 return RESULT_SUCCESS; 00495 00496 #undef FORMAT_STRING 00497 #undef FORMAT_STRING2 00498 #undef CONCISE_FORMAT_STRING 00499 #undef VERBOSE_FORMAT_STRING 00500 #undef VERBOSE_FORMAT_STRING2 00501 }
|
|
Definition at line 620 of file cli.c. References __ast_cli_generator(), ast_cli(), free, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00621 { 00622 char *buf; 00623 #if 0 00624 printf("Search for %d args: '%s', '%s', '%s', '%s'\n", argc, argv[0], argv[1], argv[2], argv[3]); 00625 #endif 00626 if (argc != 5) 00627 return RESULT_SHOWUSAGE; 00628 buf = __ast_cli_generator(argv[2], argv[3], atoi(argv[4]), 0); 00629 #if 0 00630 printf("Search for '%s' %s %d got '%s'\n", argv[2], argv[3], atoi(argv[4]), buf); 00631 #endif 00632 if (buf) { 00633 ast_cli(fd, buf); 00634 free(buf); 00635 } else 00636 ast_cli(fd, "NULL\n"); 00637 return RESULT_SUCCESS; 00638 }
|
|
Definition at line 552 of file cli.c. References ast_cli(), AST_CLI_COMPLETE_EOF, ast_cli_completion_matches(), free, malloc, realloc, RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00553 { 00554 char *buf, *obuf; 00555 int buflen = 2048; 00556 int len = 0; 00557 char **matches; 00558 int x, matchlen; 00559 00560 if (argc != 4) 00561 return RESULT_SHOWUSAGE; 00562 buf = malloc(buflen); 00563 if (!buf) 00564 return RESULT_FAILURE; 00565 buf[len] = '\0'; 00566 matches = ast_cli_completion_matches(argv[2], argv[3]); 00567 if (matches) { 00568 for (x=0; matches[x]; x++) { 00569 #if 0 00570 printf("command matchesarray for '%s' %s got '%s'\n", argv[2], argv[3], matches[x]); 00571 #endif 00572 matchlen = strlen(matches[x]) + 1; 00573 if (len + matchlen >= buflen) { 00574 buflen += matchlen * 3; 00575 obuf = buf; 00576 buf = realloc(obuf, buflen); 00577 if (!buf) 00578 /* Out of memory... Just free old buffer and be done */ 00579 free(obuf); 00580 } 00581 if (buf) 00582 len += sprintf( buf + len, "%s ", matches[x]); 00583 free(matches[x]); 00584 matches[x] = NULL; 00585 } 00586 free(matches); 00587 } 00588 #if 0 00589 printf("array for '%s' %s got '%s'\n", argv[2], argv[3], buf); 00590 #endif 00591 00592 if (buf) { 00593 ast_cli(fd, "%s%s",buf, AST_CLI_COMPLETE_EOF); 00594 free(buf); 00595 } else 00596 ast_cli(fd, "NULL\n"); 00597 00598 return RESULT_SUCCESS; 00599 }
|
|
Definition at line 603 of file cli.c. References ast_cli(), ast_cli_generatornummatches(), RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00604 { 00605 int matches = 0; 00606 00607 if (argc != 4) 00608 return RESULT_SHOWUSAGE; 00609 00610 matches = ast_cli_generatornummatches(argv[2], argv[3]); 00611 00612 #if 0 00613 printf("Search for '%s' %s got '%d'\n", argv[2], argv[3], matches); 00614 #endif 00615 ast_cli(fd, "%d", matches); 00616 00617 return RESULT_SUCCESS; 00618 }
|
|
Definition at line 661 of file cli.c. References ast_channel_walk_locked(), ast_cli(), ast_get_channel_by_name_locked(), ast_mutex_unlock(), DEBUGCHAN_FLAG, ast_channel::fin, ast_channel::fout, global_fin, global_fout, ast_channel::lock, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00662 { 00663 struct ast_channel *c=NULL; 00664 int is_all; 00665 if (argc != 3) 00666 return RESULT_SHOWUSAGE; 00667 00668 is_all = !strcasecmp("all", argv[2]); 00669 if (is_all) { 00670 global_fin |= DEBUGCHAN_FLAG; 00671 global_fout |= DEBUGCHAN_FLAG; 00672 c = ast_channel_walk_locked(NULL); 00673 } else { 00674 c = ast_get_channel_by_name_locked(argv[2]); 00675 if (c == NULL) 00676 ast_cli(fd, "No such channel %s\n", argv[2]); 00677 } 00678 while(c) { 00679 if (!(c->fin & DEBUGCHAN_FLAG) || !(c->fout & DEBUGCHAN_FLAG)) { 00680 c->fin |= DEBUGCHAN_FLAG; 00681 c->fout |= DEBUGCHAN_FLAG; 00682 ast_cli(fd, "Debugging enabled on channel %s\n", c->name); 00683 } 00684 ast_mutex_unlock(&c->lock); 00685 if (!is_all) 00686 break; 00687 c = ast_channel_walk_locked(c); 00688 } 00689 ast_cli(fd, "Debugging on new channels is enabled\n"); 00690 return RESULT_SUCCESS; 00691 }
|
|
Definition at line 640 of file cli.c. References ast_cli(), debug_filename, option_debug, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00641 { 00642 int newlevel; 00643 char *filename = "<any>"; 00644 if ((argc < 3) || (argc > 4)) 00645 return RESULT_SHOWUSAGE; 00646 if (sscanf(argv[2], "%d", &newlevel) != 1) 00647 return RESULT_SHOWUSAGE; 00648 option_debug = newlevel; 00649 if (argc == 4) { 00650 filename = argv[3]; 00651 ast_copy_string(debug_filename, filename, sizeof(debug_filename)); 00652 } else { 00653 debug_filename[0] = '\0'; 00654 } 00655 ast_cli(fd, "Debugging level set to %d, file '%s'\n", newlevel, filename); 00656 return RESULT_SUCCESS; 00657 }
|
|
Definition at line 1121 of file cli.c. References ast_cli(), find_cli(), help_workhorse(), join(), RESULT_SHOWUSAGE, RESULT_SUCCESS, and ast_cli_entry::usage. 01121 { 01122 struct ast_cli_entry *e; 01123 char fullcmd[80]; 01124 if ((argc < 1)) 01125 return RESULT_SHOWUSAGE; 01126 if (argc > 1) { 01127 e = find_cli(argv + 1, 1); 01128 if (e) { 01129 if (e->usage) 01130 ast_cli(fd, "%s", e->usage); 01131 else { 01132 join(fullcmd, sizeof(fullcmd), argv+1, 0); 01133 ast_cli(fd, "No help text available for '%s'.\n", fullcmd); 01134 } 01135 } else { 01136 if (find_cli(argv + 1, -1)) { 01137 return help_workhorse(fd, argv + 1); 01138 } else { 01139 join(fullcmd, sizeof(fullcmd), argv+1, 0); 01140 ast_cli(fd, "No such command '%s'.\n", fullcmd); 01141 } 01142 } 01143 } else { 01144 return help_workhorse(fd, NULL); 01145 } 01146 return RESULT_SUCCESS; 01147 }
|
|
Definition at line 128 of file cli.c. References ast_cli(), ast_load_resource(), RESULT_FAILURE, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00129 { 00130 if (argc != 2) 00131 return RESULT_SHOWUSAGE; 00132 if (ast_load_resource(argv[1])) { 00133 ast_cli(fd, "Unable to load module %s\n", argv[1]); 00134 return RESULT_FAILURE; 00135 } 00136 return RESULT_SUCCESS; 00137 }
|
|
Definition at line 387 of file cli.c. References ast_cli(), ast_mutex_lock(), ast_mutex_unlock(), ast_update_module_list(), climodentryfd, MODLIST_FORMAT2, modlist_modentry(), RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00388 { 00389 char *like = ""; 00390 if (argc == 3) 00391 return RESULT_SHOWUSAGE; 00392 else if (argc >= 4) { 00393 if (strcmp(argv[2],"like")) 00394 return RESULT_SHOWUSAGE; 00395 like = argv[3]; 00396 } 00397 00398 ast_mutex_lock(&climodentrylock); 00399 climodentryfd = fd; 00400 ast_cli(fd, MODLIST_FORMAT2, "Module", "Description", "Use Count"); 00401 ast_cli(fd,"%d modules loaded\n", ast_update_module_list(modlist_modentry, like)); 00402 climodentryfd = -1; 00403 ast_mutex_unlock(&climodentrylock); 00404 return RESULT_SUCCESS; 00405 }
|
|
Definition at line 693 of file cli.c. References ast_channel_walk_locked(), ast_cli(), ast_get_channel_by_name_locked(), ast_mutex_unlock(), DEBUGCHAN_FLAG, ast_channel::fin, ast_channel::fout, global_fin, global_fout, ast_channel::lock, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00694 { 00695 struct ast_channel *c=NULL; 00696 int is_all; 00697 if (argc != 4) 00698 return RESULT_SHOWUSAGE; 00699 is_all = !strcasecmp("all", argv[3]); 00700 if (is_all) { 00701 global_fin &= ~DEBUGCHAN_FLAG; 00702 global_fout &= ~DEBUGCHAN_FLAG; 00703 c = ast_channel_walk_locked(NULL); 00704 } else { 00705 c = ast_get_channel_by_name_locked(argv[3]); 00706 if (c == NULL) 00707 ast_cli(fd, "No such channel %s\n", argv[3]); 00708 } 00709 while(c) { 00710 if ((c->fin & DEBUGCHAN_FLAG) || (c->fout & DEBUGCHAN_FLAG)) { 00711 c->fin &= ~DEBUGCHAN_FLAG; 00712 c->fout &= ~DEBUGCHAN_FLAG; 00713 ast_cli(fd, "Debugging disabled on channel %s\n", c->name); 00714 } 00715 ast_mutex_unlock(&c->lock); 00716 if (!is_all) 00717 break; 00718 c = ast_channel_walk_locked(c); 00719 } 00720 ast_cli(fd, "Debugging on new channels is disabled\n"); 00721 return RESULT_SUCCESS; 00722 }
|
|
Definition at line 139 of file cli.c. References ast_cli(), ast_module_reload(), RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00140 { 00141 int x; 00142 int res; 00143 if (argc < 1) 00144 return RESULT_SHOWUSAGE; 00145 if (argc > 1) { 00146 for (x=1;x<argc;x++) { 00147 res = ast_module_reload(argv[x]); 00148 switch(res) { 00149 case 0: 00150 ast_cli(fd, "No such module '%s'\n", argv[x]); 00151 break; 00152 case 1: 00153 ast_cli(fd, "Module '%s' does not support reload\n", argv[x]); 00154 break; 00155 } 00156 } 00157 } else 00158 ast_module_reload(NULL); 00159 return RESULT_SUCCESS; 00160 }
|
|
Definition at line 189 of file cli.c. References ast_cli(), option_debug, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00190 { 00191 int val = 0; 00192 int oldval = 0; 00193 /* Has a hidden 'at least' argument */ 00194 if ((argc != 3) && (argc != 4)) 00195 return RESULT_SHOWUSAGE; 00196 if ((argc == 4) && strcasecmp(argv[2], "atleast")) 00197 return RESULT_SHOWUSAGE; 00198 oldval = option_debug; 00199 if (argc == 3) 00200 option_debug = atoi(argv[2]); 00201 else { 00202 val = atoi(argv[3]); 00203 if (val > option_debug) 00204 option_debug = val; 00205 } 00206 if (oldval != option_debug && option_debug > 0) 00207 ast_cli(fd, "Core debug was %d and is now %d\n", oldval, option_debug); 00208 else if (oldval > 0 && option_debug > 0) 00209 ast_cli(fd, "Core debug is at least %d\n", option_debug); 00210 else if (oldval > 0 && option_debug == 0) 00211 ast_cli(fd, "Core debug is now OFF\n"); 00212 return RESULT_SUCCESS; 00213 }
|
|
Definition at line 162 of file cli.c. References ast_cli(), option_verbose, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00163 { 00164 int val = 0; 00165 int oldval = 0; 00166 00167 /* Has a hidden 'at least' argument */ 00168 if ((argc != 3) && (argc != 4)) 00169 return RESULT_SHOWUSAGE; 00170 if ((argc == 4) && strcasecmp(argv[2], "atleast")) 00171 return RESULT_SHOWUSAGE; 00172 oldval = option_verbose; 00173 if (argc == 3) 00174 option_verbose = atoi(argv[2]); 00175 else { 00176 val = atoi(argv[3]); 00177 if (val > option_verbose) 00178 option_verbose = val; 00179 } 00180 if (oldval != option_verbose && option_verbose > 0) 00181 ast_cli(fd, "Verbosity was %d and is now %d\n", oldval, option_verbose); 00182 else if (oldval > 0 && option_verbose > 0) 00183 ast_cli(fd, "Verbosity is at least %d\n", option_verbose); 00184 else if (oldval > 0 && option_verbose == 0) 00185 ast_cli(fd, "Verbosity is now OFF\n"); 00186 return RESULT_SUCCESS; 00187 }
|
|
Definition at line 726 of file cli.c. References ast_channel::_bridge, ast_channel::_state, ast_bridged_channel(), ast_cdr_serialize_variables(), ast_cli(), AST_FLAG_BLOCKING, ast_get_channel_by_name_locked(), ast_mutex_unlock(), ast_state2str(), ast_strlen_zero(), ast_test_flag, ast_channel::cdr, ast_channel::cid, ast_callerid::cid_dnid, ast_callerid::cid_name, ast_callerid::cid_num, ast_channel::fds, ast_channel::fin, ast_channel::fout, name, ast_channel::name, ast_channel::nativeformats, pbx_builtin_serialize_variables(), ast_channel::readformat, RESULT_SHOWUSAGE, RESULT_SUCCESS, ast_channel::rings, ast_cdr::start, ast_channel::type, ast_channel::uniqueid, ast_channel::whentohangup, and ast_channel::writeformat. 00727 { 00728 struct ast_channel *c=NULL; 00729 struct timeval now; 00730 char buf[2048]; 00731 char cdrtime[256]; 00732 long elapsed_seconds=0; 00733 int hour=0, min=0, sec=0; 00734 00735 if (argc != 3) 00736 return RESULT_SHOWUSAGE; 00737 now = ast_tvnow(); 00738 c = ast_get_channel_by_name_locked(argv[2]); 00739 if (!c) { 00740 ast_cli(fd, "%s is not a known channel\n", argv[2]); 00741 return RESULT_SUCCESS; 00742 } 00743 if(c->cdr) { 00744 elapsed_seconds = now.tv_sec - c->cdr->start.tv_sec; 00745 hour = elapsed_seconds / 3600; 00746 min = (elapsed_seconds % 3600) / 60; 00747 sec = elapsed_seconds % 60; 00748 snprintf(cdrtime, sizeof(cdrtime), "%dh%dm%ds", hour, min, sec); 00749 } else 00750 strcpy(cdrtime, "N/A"); 00751 ast_cli(fd, 00752 " -- General --\n" 00753 " Name: %s\n" 00754 " Type: %s\n" 00755 " UniqueID: %s\n" 00756 " Caller ID: %s\n" 00757 " Caller ID Name: %s\n" 00758 " DNID Digits: %s\n" 00759 " State: %s (%d)\n" 00760 " Rings: %d\n" 00761 " NativeFormat: %d\n" 00762 " WriteFormat: %d\n" 00763 " ReadFormat: %d\n" 00764 "1st File Descriptor: %d\n" 00765 " Frames in: %d%s\n" 00766 " Frames out: %d%s\n" 00767 " Time to Hangup: %ld\n" 00768 " Elapsed Time: %s\n" 00769 " Direct Bridge: %s\n" 00770 "Indirect Bridge: %s\n" 00771 " -- PBX --\n" 00772 " Context: %s\n" 00773 " Extension: %s\n" 00774 " Priority: %d\n" 00775 " Call Group: %d\n" 00776 " Pickup Group: %d\n" 00777 " Application: %s\n" 00778 " Data: %s\n" 00779 " Blocking in: %s\n", 00780 c->name, c->type, c->uniqueid, 00781 (c->cid.cid_num ? c->cid.cid_num : "(N/A)"), 00782 (c->cid.cid_name ? c->cid.cid_name : "(N/A)"), 00783 (c->cid.cid_dnid ? c->cid.cid_dnid : "(N/A)" ), ast_state2str(c->_state), c->_state, c->rings, c->nativeformats, c->writeformat, c->readformat, 00784 c->fds[0], c->fin & 0x7fffffff, (c->fin & 0x80000000) ? " (DEBUGGED)" : "", 00785 c->fout & 0x7fffffff, (c->fout & 0x80000000) ? " (DEBUGGED)" : "", (long)c->whentohangup, 00786 cdrtime, c->_bridge ? c->_bridge->name : "<none>", ast_bridged_channel(c) ? ast_bridged_channel(c)->name : "<none>", 00787 c->context, c->exten, c->priority, c->callgroup, c->pickupgroup, ( c->appl ? c->appl : "(N/A)" ), 00788 ( c-> data ? (!ast_strlen_zero(c->data) ? c->data : "(Empty)") : "(None)"), 00789 (ast_test_flag(c, AST_FLAG_BLOCKING) ? c->blockproc : "(Not Blocking)")); 00790 00791 if(pbx_builtin_serialize_variables(c,buf,sizeof(buf))) 00792 ast_cli(fd," Variables:\n%s\n",buf); 00793 if(c->cdr && ast_cdr_serialize_variables(c->cdr,buf, sizeof(buf), '=', '\n', 1)) 00794 ast_cli(fd," CDR Variables:\n%s\n",buf); 00795 00796 ast_mutex_unlock(&c->lock); 00797 return RESULT_SUCCESS; 00798 }
|
|
Definition at line 349 of file cli.c. References ast_cli(), ast_lastreloadtime, ast_startuptime, format_uptimestr(), free, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00350 { 00351 time_t curtime, tmptime; 00352 char *timestr; 00353 int printsec; 00354 00355 printsec = ((argc == 3) && (!strcasecmp(argv[2],"seconds"))); 00356 if ((argc != 2) && (!printsec)) 00357 return RESULT_SHOWUSAGE; 00358 00359 time(&curtime); 00360 if (ast_startuptime) { 00361 tmptime = curtime - ast_startuptime; 00362 if (printsec) { 00363 ast_cli(fd, "System uptime: %lu\n",(u_long)tmptime); 00364 } else { 00365 timestr = format_uptimestr(tmptime); 00366 if (timestr) { 00367 ast_cli(fd, "System uptime: %s\n", timestr); 00368 free(timestr); 00369 } 00370 } 00371 } 00372 if (ast_lastreloadtime) { 00373 tmptime = curtime - ast_lastreloadtime; 00374 if (printsec) { 00375 ast_cli(fd, "Last reload: %lu\n", (u_long) tmptime); 00376 } else { 00377 timestr = format_uptimestr(tmptime); 00378 if ((timestr) && (!printsec)) { 00379 ast_cli(fd, "Last reload: %s\n", timestr); 00380 free(timestr); 00381 } 00382 } 00383 } 00384 return RESULT_SUCCESS; 00385 }
|
|
Definition at line 535 of file cli.c. References ast_cli(), ast_get_channel_by_name_locked(), ast_mutex_unlock(), ast_softhangup(), AST_SOFTHANGUP_EXPLICIT, ast_channel::lock, ast_channel::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00536 { 00537 struct ast_channel *c=NULL; 00538 if (argc != 3) 00539 return RESULT_SHOWUSAGE; 00540 c = ast_get_channel_by_name_locked(argv[2]); 00541 if (c) { 00542 ast_cli(fd, "Requested Hangup on channel '%s'\n", c->name); 00543 ast_softhangup(c, AST_SOFTHANGUP_EXPLICIT); 00544 ast_mutex_unlock(&c->lock); 00545 } else 00546 ast_cli(fd, "%s is not a known channel\n", argv[2]); 00547 return RESULT_SUCCESS; 00548 }
|
|
Definition at line 215 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. 00216 { 00217 int x; 00218 int force=AST_FORCE_SOFT; 00219 if (argc < 2) 00220 return RESULT_SHOWUSAGE; 00221 for (x=1;x<argc;x++) { 00222 if (argv[x][0] == '-') { 00223 switch(argv[x][1]) { 00224 case 'f': 00225 force = AST_FORCE_FIRM; 00226 break; 00227 case 'h': 00228 force = AST_FORCE_HARD; 00229 break; 00230 default: 00231 return RESULT_SHOWUSAGE; 00232 } 00233 } else if (x != argc - 1) 00234 return RESULT_SHOWUSAGE; 00235 else if (ast_unload_resource(argv[x], force)) { 00236 ast_cli(fd, "Unable to unload resource %s\n", argv[x]); 00237 return RESULT_FAILURE; 00238 } 00239 } 00240 return RESULT_SUCCESS; 00241 }
|
|
Definition at line 409 of file cli.c. References ast_build_date, ast_build_hostname, ast_build_machine, ast_build_os, ast_build_user, ast_cli(), ASTERISK_VERSION, RESULT_SHOWUSAGE, and RESULT_SUCCESS. 00410 { 00411 if (argc != 2) 00412 return RESULT_SHOWUSAGE; 00413 ast_cli(fd, "Asterisk %s built by %s @ %s on a %s running %s on %s\n", 00414 ASTERISK_VERSION, ast_build_user, ast_build_hostname, 00415 ast_build_machine, ast_build_os, ast_build_date); 00416 return RESULT_SUCCESS; 00417 }
|
|
Definition at line 1079 of file cli.c. References ast_cli(), ast_cli_entry::cmda, join(), ast_cli_entry::next, and ast_cli_entry::summary. Referenced by handle_help(), and handle_showagi(). 01080 { 01081 char fullcmd1[80] = ""; 01082 char fullcmd2[80] = ""; 01083 char matchstr[80]; 01084 char *fullcmd = NULL; 01085 struct ast_cli_entry *e, *e1, *e2; 01086 e1 = builtins; 01087 e2 = helpers; 01088 if (match) 01089 join(matchstr, sizeof(matchstr), match, 0); 01090 while(e1->cmda[0] || e2) { 01091 if (e2) 01092 join(fullcmd2, sizeof(fullcmd2), e2->cmda, 0); 01093 if (e1->cmda[0]) 01094 join(fullcmd1, sizeof(fullcmd1), e1->cmda, 0); 01095 if (!e1->cmda[0] || 01096 (e2 && (strcmp(fullcmd2, fullcmd1) < 0))) { 01097 /* Use e2 */ 01098 e = e2; 01099 fullcmd = fullcmd2; 01100 /* Increment by going to next */ 01101 e2 = e2->next; 01102 } else { 01103 /* Use e1 */ 01104 e = e1; 01105 fullcmd = fullcmd1; 01106 e1++; 01107 } 01108 /* Hide commands that start with '_' */ 01109 if (fullcmd[0] == '_') 01110 continue; 01111 if (match) { 01112 if (strncasecmp(matchstr, fullcmd, strlen(matchstr))) { 01113 continue; 01114 } 01115 } 01116 ast_cli(fd, "%25.25s %s\n", fullcmd, e->summary); 01117 } 01118 return 0; 01119 }
|
|
Definition at line 945 of file cli.c. References ast_strlen_zero(). Referenced by __ast_cli_generator(), find_best(), handle_dumpagihtml(), handle_help(), handle_showagi(), and help_workhorse(). 00946 { 00947 int x; 00948 /* Join words into a string */ 00949 if (!dest || destsize < 1) { 00950 return; 00951 } 00952 dest[0] = '\0'; 00953 for (x=0;w[x];x++) { 00954 if (x) 00955 strncat(dest, " ", destsize - strlen(dest) - 1); 00956 strncat(dest, w[x], destsize - strlen(dest) - 1); 00957 } 00958 if (tws && !ast_strlen_zero(dest)) 00959 strncat(dest, " ", destsize - strlen(dest) - 1); 00960 }
|
|
Definition at line 962 of file cli.c. Referenced by ast_cli_register(). 00963 { 00964 int x; 00965 /* Join words into a string */ 00966 if (!dest || destsize < 1) { 00967 return; 00968 } 00969 dest[0] = '\0'; 00970 for (x=0;w[x];x++) { 00971 strncat(dest, w[x], destsize - strlen(dest) - 1); 00972 } 00973 }
|
|
Definition at line 249 of file cli.c. References ast_cli(), climodentryfd, MODLIST_FORMAT, and strcasestr(). Referenced by handle_modlist(). 00250 { 00251 /* Comparing the like with the module */ 00252 if (strcasestr(module, like) ) { 00253 ast_cli(climodentryfd, MODLIST_FORMAT, module, description, usecnt); 00254 return 1; 00255 } 00256 return 0; 00257 }
|
|
Definition at line 1149 of file cli.c. References ast_log(), LOG_WARNING, and strdup. Referenced by __ast_cli_generator(), agi_handle_command(), and ast_cli_command(). 01150 { 01151 char *dup, *cur; 01152 int x = 0; 01153 int quoted = 0; 01154 int escaped = 0; 01155 int whitespace = 1; 01156 01157 *trailingwhitespace = 0; 01158 if (!(dup = strdup(s))) 01159 return NULL; 01160 01161 cur = dup; 01162 while (*s) { 01163 if ((*s == '"') && !escaped) { 01164 quoted = !quoted; 01165 if (quoted & whitespace) { 01166 /* If we're starting a quoted string, coming off white space, start a new argument */ 01167 if (x >= (max - 1)) { 01168 ast_log(LOG_WARNING, "Too many arguments, truncating\n"); 01169 break; 01170 } 01171 argv[x++] = cur; 01172 whitespace = 0; 01173 } 01174 escaped = 0; 01175 } else if (((*s == ' ') || (*s == '\t')) && !(quoted || escaped)) { 01176 /* If we are not already in whitespace, and not in a quoted string or 01177 processing an escape sequence, and just entered whitespace, then 01178 finalize the previous argument and remember that we are in whitespace 01179 */ 01180 if (!whitespace) { 01181 *(cur++) = '\0'; 01182 whitespace = 1; 01183 } 01184 } else if ((*s == '\\') && !escaped) { 01185 escaped = 1; 01186 } else { 01187 if (whitespace) { 01188 /* If we are coming out of whitespace, start a new argument */ 01189 if (x >= (max - 1)) { 01190 ast_log(LOG_WARNING, "Too many arguments, truncating\n"); 01191 break; 01192 } 01193 argv[x++] = cur; 01194 whitespace = 0; 01195 } 01196 *(cur++) = *s; 01197 escaped = 0; 01198 } 01199 s++; 01200 } 01201 /* Null terminate */ 01202 *(cur++) = '\0'; 01203 argv[x] = NULL; 01204 *argc = x; 01205 *trailingwhitespace = whitespace; 01206 return dup; 01207 }
|
|
Definition at line 31 of file buildinfo.c. Referenced by handle_version(). |
|
Definition at line 27 of file buildinfo.c. Referenced by handle_version(). |
|
Definition at line 28 of file buildinfo.c. |
|
Definition at line 29 of file buildinfo.c. Referenced by handle_version(). |
|
Definition at line 30 of file buildinfo.c. Referenced by handle_version(). |
|
Definition at line 32 of file buildinfo.c. Referenced by handle_version(). |
|
Definition at line 875 of file cli.c. Referenced by load_module(), load_pbx(), and unload_module(). |
|
|
|
Definition at line 247 of file cli.c. Referenced by handle_modlist(), and modlist_modentry(). |
|
Initial value: "Usage: _command complete \"<line>\" text state\n" " This function is used internally to help with command completion and should.\n" " never be called by the user directly.\n" |
|
Initial value: "Usage: _command matchesarray \"<line>\" text \n" " This function is used internally to help with command completion and should.\n" " never be called by the user directly.\n" |
|
Initial value: "Usage: _command nummatches \"<line>\" text \n" " This function is used internally to help with command completion and should.\n" " never be called by the user directly.\n" |
|
Initial value: "Usage: debug channel <channel>\n" " Enables debugging on a specific channel.\n" |
|
Initial value: "Usage: debug level <level> [filename]\n" " Set debug to specified level (0 to disable). If filename\n" "is specified, debugging will be limited to just that file.\n" |
|
Definition at line 100 of file channel.c. Referenced by ast_channel_alloc(), handle_debugchan(), and handle_nodebugchan(). |
|
Definition at line 100 of file channel.c. Referenced by ast_channel_alloc(), handle_debugchan(), and handle_nodebugchan(). |
|
Initial value: "Usage: help [topic]\n" " When called with a topic as an argument, displays usage\n" " information on the given command. If called without a\n" " topic, it provides a list of commands.\n" |
|
|
|
Initial value: "Usage: load <module name>\n" " Loads the specified module into Asterisk.\n" |
|
Initial value: "Usage: show modules [like keyword]\n" " Shows Asterisk modules currently in use, and usage statistics.\n" |
|
Initial value: "Usage: no debug channel <channel>\n" " Disables debugging on a specific channel.\n" |
|
Initial value: "Usage: reload [module ...]\n" " Reloads configuration files for all listed modules which support\n" " reloading, or for all supported modules if none are listed.\n" |
|
Initial value: "Usage: set debug <level>\n" " Sets level of core debug messages to be displayed. 0 means\n" " no messages should be displayed. Equivalent to -d[d[d...]]\n" " on startup.\n" |
|
Initial value: "Usage: set verbose <level>\n" " Sets level of verbose messages to be displayed. 0 means\n" " no messages should be displayed. Equivalent to -v[v[v...]]\n" " on startup\n" |
|
Initial value: "Usage: show channel <channel>\n" " Shows lots of information about the specified channel.\n" |
|
Initial value: "Usage: soft hangup <channel>\n" " Request that a channel be hung up. The hangup takes effect\n" " the next time the driver reads or writes from the channel\n" |
|
|
|
Initial value: "Usage: show uptime [seconds]\n" " Shows Asterisk uptime information.\n" " The seconds word returns the uptime in seconds only.\n" |
|
Initial value: "Usage: show version\n" " Shows Asterisk version information.\n" |