Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

cli.c File Reference

#include <unistd.h>
#include <stdlib.h>
#include <asterisk/logger.h>
#include <asterisk/options.h>
#include <asterisk/cli.h>
#include <asterisk/module.h>
#include <asterisk/channel.h>
#include <asterisk/channel_pvt.h>
#include <sys/signal.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <pthread.h>
#include "readline/readline.h"
#include "asterisk.h"
#include "build.h"
#include "astconf.h"

Go to the source code of this file.

Defines

#define VERSION_INFO
#define MODLIST_FORMAT   "%-20s %-40.40s %-10d\n"
#define MODLIST_FORMAT2   "%-20s %-40.40s %-10s\n"
#define SECOND   (1)
#define MIN   (SECOND*60)
#define HOUR   (MIN*60)
#define DAY   (HOUR*24)
#define WEEK   (DAY*7)
#define YEAR   (DAY*365)
#define FORMAT_STRING   "%15s (%-10s %-12s %-4d) %7s %-12s %-15s\n"
#define FORMAT_STRING2   "%15s (%-10s %-12s %-4s) %7s %-12s %-15s\n"

Functions

void ast_cli (int fd, char *fmt,...)
int ast_cli_unregister (struct ast_cli_entry *e)
 Unregisters a command.

int ast_cli_register (struct ast_cli_entry *e)
 Registers a command.

int ast_cli_generatornummatches (char *text, char *word)
char ** ast_cli_completion_matches (char *text, char *word)
char * ast_cli_generator (char *text, char *word, int state)
 Readline madness.

int ast_cli_command (int fd, char *s)
 Interprets a command.


Variables

ast_mutex_t clilock = AST_MUTEX_INITIALIZER
ast_cli_entryhelpers = NULL


Define Documentation

#define DAY   (HOUR*24)
 

#define FORMAT_STRING   "%15s (%-10s %-12s %-4d) %7s %-12s %-15s\n"
 

#define FORMAT_STRING2   "%15s (%-10s %-12s %-4s) %7s %-12s %-15s\n"
 

#define HOUR   (MIN*60)
 

#define MIN   (SECOND*60)
 

#define MODLIST_FORMAT   "%-20s %-40.40s %-10d\n"
 

Definition at line 155 of file cli.c.

#define MODLIST_FORMAT2   "%-20s %-40.40s %-10s\n"
 

Definition at line 156 of file cli.c.

#define SECOND   (1)
 

#define VERSION_INFO
 

Value:

"Asterisk " ASTERISK_VERSION " built by " BUILD_USER "@" BUILD_HOSTNAME \
   " on a " BUILD_MACHINE " running " BUILD_OS

Definition at line 34 of file cli.c.

#define WEEK   (DAY*7)
 

#define YEAR   (DAY*365)
 


Function Documentation

void ast_cli int  fd,
char *  fmt,
... 
 

Definition at line 37 of file cli.c.

Referenced by ast_cli_command(), astman_send_error(), astman_send_response(), main(), and manager_event().

00038 {
00039    char stuff[4096];
00040    va_list ap;
00041    va_start(ap, fmt);
00042    vsnprintf(stuff, sizeof(stuff), fmt, ap);
00043    va_end(ap);
00044    write(fd, stuff, strlen(stuff));
00045 }

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

Definition at line 990 of file cli.c.

References ast_cli(), ast_log(), AST_MAX_ARGS, ast_mutex_lock, ast_mutex_unlock, clilock, free, LOG_WARNING, and RESULT_SHOWUSAGE.

00991 {
00992    char *argv[AST_MAX_ARGS];
00993    struct ast_cli_entry *e;
00994    int x;
00995    char *dup;
00996    x = AST_MAX_ARGS;
00997    if ((dup = parse_args(s, &x, argv))) {
00998       /* We need at least one entry, or ignore */
00999       if (x > 0) {
01000          ast_mutex_lock(&clilock);
01001          e = find_cli(argv, 0);
01002          if (e)
01003             e->inuse++;
01004          ast_mutex_unlock(&clilock);
01005          if (e) {
01006             switch(e->handler(fd, x, argv)) {
01007             case RESULT_SHOWUSAGE:
01008                ast_cli(fd, e->usage);
01009                break;
01010             }
01011          } else 
01012             ast_cli(fd, "No such command '%s' (type 'help' for help)\n", find_best(argv));
01013          if (e) {
01014             ast_mutex_lock(&clilock);
01015             e->inuse--;
01016             ast_mutex_unlock(&clilock);
01017          }
01018       }
01019       free(dup);
01020    } else {
01021       ast_log(LOG_WARNING, "Out of memory\n");  
01022       return -1;
01023    }
01024    return 0;
01025 }

char** ast_cli_completion_matches char *  text,
char *  word
 

Definition at line 875 of file cli.c.

References ast_cli_generator(), malloc, and realloc.

00876 {
00877    char **match_list = NULL, *retstr, *prevstr;
00878    size_t match_list_len, max_equal, which, i;
00879    int matches = 0;
00880 
00881    match_list_len = 1;
00882    while ((retstr = ast_cli_generator(text, word, matches)) != NULL) {
00883       if (matches + 1 >= match_list_len) {
00884          match_list_len <<= 1;
00885          match_list = realloc(match_list, match_list_len * sizeof(char *));
00886       }
00887       match_list[++matches] = retstr;
00888    }
00889 
00890    if (!match_list)
00891       return (char **) NULL;
00892 
00893    which = 2;
00894    prevstr = match_list[1];
00895    max_equal = strlen(prevstr);
00896    for (; which <= matches; which++) {
00897       for (i = 0; i < max_equal && prevstr[i] == match_list[which][i]; i++)
00898          continue;
00899       max_equal = i;
00900    }
00901 
00902    retstr = malloc(max_equal + 1);
00903    (void) strncpy(retstr, match_list[1], max_equal);
00904    retstr[max_equal] = '\0';
00905    match_list[0] = retstr;
00906 
00907    if (matches + 1 >= match_list_len)
00908       match_list = realloc(match_list, (match_list_len + 1) * sizeof(char *));
00909    match_list[matches + 1] = (char *) NULL;
00910 
00911    return (match_list);
00912 }

char* ast_cli_generator char *  text,
char *  word,
int  state
 

Readline madness.

Definition at line 985 of file cli.c.

Referenced by ast_cli_completion_matches(), and ast_cli_generatornummatches().

00986 {
00987    return __ast_cli_generator(text, word, state, 1);
00988 }

int ast_cli_generatornummatches char *  text,
char *  word
 

Definition at line 858 of file cli.c.

References ast_cli_generator().

00859 {
00860    int matches = 0, i = 0;
00861    char *buf, *oldbuf = NULL;
00862 
00863 
00864    while ( (buf = ast_cli_generator(text, word, i)) ) {
00865       if (++i > 1 && strcmp(buf,oldbuf) == 0)  {
00866             continue;
00867       }
00868       oldbuf = buf;
00869       matches++;
00870    }
00871 
00872    return matches;
00873 }

int ast_cli_register struct ast_cli_entry e  ) 
 

Registers a command.

Parameters:
fd File descriptor that I/O is done to
s string given at prompt Register your own command Returns 0 on success, -1 on failure

Definition at line 681 of file cli.c.

References ast_log(), ast_mutex_lock, ast_mutex_unlock, clilock, ast_cli_entry::cmda, helpers, LOG_WARNING, and ast_cli_entry::next.

Referenced by ast_image_init(), ast_register_translator(), astdb_init(), init_framer(), init_manager(), load_pbx(), and main().

00682 {
00683    struct ast_cli_entry *cur, *l=NULL;
00684    char fulle[80] ="", fulltst[80] ="";
00685    static int len;
00686    ast_mutex_lock(&clilock);
00687    join2(fulle, sizeof(fulle), e->cmda);
00688    if (find_cli(e->cmda, -1)) {
00689       ast_mutex_unlock(&clilock);
00690       ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n", fulle);
00691       return -1;
00692    }
00693    cur = helpers;
00694    while(cur) {
00695       join2(fulltst, sizeof(fulltst), cur->cmda);
00696       len = strlen(fulltst);
00697       if (strlen(fulle) < len)
00698          len = strlen(fulle);
00699       if (strncasecmp(fulle, fulltst, len) < 0) {
00700          if (l) {
00701             e->next = l->next;
00702             l->next = e;
00703          } else {
00704             e->next = helpers;
00705             helpers = e;
00706          }
00707          break;
00708       }
00709       l = cur;
00710       cur = cur->next;
00711    }
00712    if (!cur) {
00713       if (l)
00714          l->next = e;
00715       else
00716          helpers = e;
00717       e->next = NULL;
00718    }
00719    ast_mutex_unlock(&clilock);
00720    return 0;
00721 }

int ast_cli_unregister struct ast_cli_entry e  ) 
 

Unregisters a command.

Parameters:
e which cli entry to unregister Unregister your own command. You must pass a completed ast_cli_entry structur Returns 0 on success, -1 on failure

Definition at line 655 of file cli.c.

References ast_log(), ast_mutex_lock, ast_mutex_unlock, clilock, helpers, ast_cli_entry::inuse, LOG_WARNING, and ast_cli_entry::next.

00656 {
00657    struct ast_cli_entry *cur, *l=NULL;
00658    ast_mutex_lock(&clilock);
00659    cur = helpers;
00660    while(cur) {
00661       if (e == cur) {
00662          if (e->inuse) {
00663             ast_log(LOG_WARNING, "Can't remove command that is in use\n");
00664          } else {
00665             /* Rewrite */
00666             if (l)
00667                l->next = e->next;
00668             else
00669                helpers = e->next;
00670             e->next = NULL;
00671             break;
00672          }
00673       }
00674       l = cur;
00675       cur = cur->next;
00676    }
00677    ast_mutex_unlock(&clilock);
00678    return 0;
00679 }


Variable Documentation

ast_mutex_t clilock = AST_MUTEX_INITIALIZER
 

Definition at line 47 of file cli.c.

Referenced by ast_cli_command(), ast_cli_register(), and ast_cli_unregister().

struct ast_cli_entry* helpers = NULL
 

Definition at line 50 of file cli.c.

Referenced by ast_cli_register(), and ast_cli_unregister().


Generated on Fri Oct 31 07:05:11 2003 for Asterisk by doxygen 1.3.4