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

asterisk.c File Reference

#include <unistd.h>
#include <stdlib.h>
#include <asterisk/logger.h>
#include <asterisk/options.h>
#include <asterisk/cli.h>
#include <asterisk/channel.h>
#include <asterisk/ulaw.h>
#include <asterisk/alaw.h>
#include <asterisk/callerid.h>
#include <asterisk/module.h>
#include <asterisk/image.h>
#include <asterisk/tdd.h>
#include <asterisk/term.h>
#include <asterisk/manager.h>
#include <asterisk/pbx.h>
#include <asterisk/enum.h>
#include <asterisk/rtp.h>
#include <sys/resource.h>
#include <fcntl.h>
#include <stdio.h>
#include <signal.h>
#include <sched.h>
#include <asterisk/io.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include "editline/histedit.h"
#include "asterisk.h"
#include <asterisk/config.h>

Go to the source code of this file.

Data Structures

struct  ast_atexit
struct  console

Defines

#define AST_MAX_CONNECTS   128
#define NUM_MSGS   64
#define ASTERISK_PROMPT   "*CLI> "
#define ASTERISK_PROMPT2   "%s*CLI> "

Functions

int ast_register_atexit (void(*func)(void))
void ast_unregister_atexit (void(*func)(void))
void ast_console_puts (const char *string)
int main (int argc, char *argv[])

Variables

int option_verbose = 0
int option_debug = 0
int option_nofork = 0
int option_quiet = 0
int option_console = 0
int option_highpriority = 0
int option_remote = 0
int option_exec = 0
int option_initcrypto = 0
int option_nocolor
int option_dumpcore = 0
int option_overrideconfig = 0
int fully_booted = 0
time_t ast_startuptime
time_t ast_lastreloadtime
console consoles [AST_MAX_CONNECTS]
char defaultlanguage [MAX_LANGUAGE] = DEFAULT_LANGUAGE
char ast_config_AST_CONFIG_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_CONFIG_FILE [AST_CONFIG_MAX_PATH]
char ast_config_AST_MODULE_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_SPOOL_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_VAR_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_LOG_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_AGI_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_DB [AST_CONFIG_MAX_PATH]
char ast_config_AST_KEY_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_PID [AST_CONFIG_MAX_PATH]
char ast_config_AST_SOCKET [AST_CONFIG_MAX_PATH]
char ast_config_AST_RUN_DIR [AST_CONFIG_MAX_PATH]
char ast_config_AST_DATA_DIR [AST_CONFIG_MAX_PATH]


Define Documentation

#define AST_MAX_CONNECTS   128
 

Definition at line 49 of file asterisk.c.

#define ASTERISK_PROMPT   "*CLI> "
 

Definition at line 756 of file asterisk.c.

#define ASTERISK_PROMPT2   "%s*CLI> "
 

Definition at line 758 of file asterisk.c.

#define NUM_MSGS   64
 

Definition at line 50 of file asterisk.c.


Function Documentation

void ast_console_puts const char *  string  ) 
 

Definition at line 169 of file asterisk.c.

References string.

Referenced by ast_log().

00170 {
00171     fputs(string, stdout);
00172     fflush(stdout);
00173     ast_network_puts(string);
00174 }

int ast_register_atexit void(*  func)(void)  ) 
 

Definition at line 110 of file asterisk.c.

References ast_mutex_lock, ast_mutex_unlock, ast_unregister_atexit(), and malloc.

00111 {
00112    int res = -1;
00113    struct ast_atexit *ae;
00114    ast_unregister_atexit(func);
00115    ae = malloc(sizeof(struct ast_atexit));
00116    ast_mutex_lock(&atexitslock);
00117    if (ae) {
00118       memset(ae, 0, sizeof(struct ast_atexit));
00119       ae->next = atexits;
00120       ae->func = func;
00121       atexits = ae;
00122       res = 0;
00123    }
00124    ast_mutex_unlock(&atexitslock);
00125    return res;
00126 }

void ast_unregister_atexit void(*  func)(void)  ) 
 

Definition at line 128 of file asterisk.c.

References ast_mutex_lock, and ast_mutex_unlock.

Referenced by ast_register_atexit().

00129 {
00130    struct ast_atexit *ae, *prev = NULL;
00131    ast_mutex_lock(&atexitslock);
00132    ae = atexits;
00133    while(ae) {
00134       if (ae->func == func) {
00135          if (prev)
00136             prev->next = ae->next;
00137          else
00138             atexits = ae->next;
00139          break;
00140       }
00141       prev = ae;
00142       ae = ae->next;
00143    }
00144    ast_mutex_unlock(&atexitslock);
00145 }

int main int  argc,
char *  argv[]
 

Definition at line 1235 of file asterisk.c.

References __ast_mm_init(), ast_alaw_init(), ast_cli(), ast_cli_register(), ast_config_AST_CONFIG_FILE, ast_config_AST_PID, ast_config_AST_SOCKET, ast_enum_init(), ast_image_init(), ast_log(), ast_register_verbose(), ast_rtp_init(), ast_startuptime, ast_ulaw_init(), ast_verbose(), astdb_init(), callerid_init(), COLOR_BLACK, COLOR_BRWHITE, fully_booted, init_framer(), init_logger(), init_manager(), load_modules(), load_pbx(), LOG_ERROR, LOG_WARNING, option_console, option_debug, option_dumpcore, option_exec, option_highpriority, option_initcrypto, option_nocolor, option_nofork, option_overrideconfig, option_quiet, option_remote, option_verbose, tdd_init(), term_color(), term_end(), term_init(), and term_quit().

01236 {
01237    int c;
01238    char filename[80] = "";
01239    char hostname[256];
01240    char tmp[80];
01241    char * xarg = NULL;
01242    int x;
01243    FILE *f;
01244    sigset_t sigs;
01245    int num;
01246    char *buf;
01247 
01248    /* Remember original args for restart */
01249    if (argc > sizeof(_argv) / sizeof(_argv[0]) - 1) {
01250       fprintf(stderr, "Truncating argument size to %d\n", sizeof(_argv) / sizeof(_argv[0]) - 1);
01251       argc = sizeof(_argv) / sizeof(_argv[0]) - 1;
01252    }
01253    for (x=0;x<argc;x++)
01254       _argv[x] = argv[x];
01255    _argv[x] = NULL;
01256 
01257    if (gethostname(hostname, sizeof(hostname)))
01258       strncpy(hostname, "<Unknown>", sizeof(hostname)-1);
01259    mainpid = getpid();
01260    ast_ulaw_init();
01261    ast_alaw_init();
01262    callerid_init();
01263    tdd_init();
01264    if (getenv("HOME")) 
01265       snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
01266    /* Check for options */
01267    while((c=getopt(argc, argv, "hfdvqprgcinx:C:")) != -1) {
01268       switch(c) {
01269       case 'd':
01270          option_debug++;
01271          option_nofork++;
01272          break;
01273       case 'c':
01274          option_console++;
01275          option_nofork++;
01276          break;
01277       case 'f':
01278          option_nofork++;
01279          break;
01280       case 'n':
01281          option_nocolor++;
01282          break;
01283       case 'r':
01284          option_remote++;
01285          option_nofork++;
01286          break;
01287       case 'p':
01288          option_highpriority++;
01289          break;
01290       case 'v':
01291          option_verbose++;
01292          option_nofork++;
01293          break;
01294       case 'q':
01295          option_quiet++;
01296          break;
01297       case 'x':
01298          option_exec++;
01299          xarg = optarg;
01300          break;
01301       case 'C':
01302          strncpy((char *)ast_config_AST_CONFIG_FILE,optarg,sizeof(ast_config_AST_CONFIG_FILE));
01303          option_overrideconfig++;
01304          break;
01305       case 'i':
01306          option_initcrypto++;
01307          break;
01308       case'g':
01309          option_dumpcore++;
01310          break;
01311       case 'h':
01312          show_cli_help();
01313          exit(0);
01314       case '?':
01315          exit(1);
01316       }
01317    }
01318 
01319    if (option_dumpcore) {
01320       struct rlimit l;
01321       memset(&l, 0, sizeof(l));
01322       l.rlim_cur = RLIM_INFINITY;
01323       l.rlim_max = RLIM_INFINITY;
01324       if (setrlimit(RLIMIT_CORE, &l)) {
01325          ast_log(LOG_WARNING, "Unable to disable core size resource limit: %s\n", strerror(errno));
01326       }
01327    }
01328 
01329    term_init();
01330    printf(term_end());
01331    fflush(stdout);
01332    if (option_console && !option_verbose) 
01333       ast_verbose("[ Reading Master Configuration ]");
01334    ast_readconfig();
01335 
01336    if (option_console) {
01337                 if (el_hist == NULL || el == NULL)
01338                         ast_el_initialize();
01339 
01340                 if (strlen(filename))
01341                         ast_el_read_history(filename);
01342    }
01343 
01344    if (ast_tryconnect()) {
01345       /* One is already running */
01346       if (option_remote) {
01347          if (option_exec) {
01348             ast_remotecontrol(xarg);
01349             quit_handler(0, 0, 0, 0);
01350             exit(0);
01351          }
01352          printf(term_quit());
01353          ast_register_verbose(console_verboser);
01354          ast_verbose( "Asterisk " ASTERISK_VERSION ", Copyright (C) 1999-2004 Digium.\n");
01355          ast_verbose( "Written by Mark Spencer <markster@digium.com>\n");
01356          ast_verbose( "=========================================================================\n");
01357          ast_remotecontrol(NULL);
01358          quit_handler(0, 0, 0, 0);
01359          exit(0);
01360       } else {
01361          ast_log(LOG_ERROR, "Asterisk already running on %s.  Use 'asterisk -r' to connect.\n", (char *)ast_config_AST_SOCKET);
01362          printf(term_quit());
01363          exit(1);
01364       }
01365    } else if (option_remote || option_exec) {
01366       ast_log(LOG_ERROR, "Unable to connect to remote asterisk\n");
01367       printf(term_quit());
01368       exit(1);
01369    }
01370    /* Blindly write pid file since we couldn't connect */
01371    unlink((char *)ast_config_AST_PID);
01372    f = fopen((char *)ast_config_AST_PID, "w");
01373    if (f) {
01374       fprintf(f, "%d\n", getpid());
01375       fclose(f);
01376    } else
01377       ast_log(LOG_WARNING, "Unable to open pid file '%s': %s\n", (char *)ast_config_AST_PID, strerror(errno));
01378 
01379    if (!option_verbose && !option_debug && !option_nofork && !option_console) {
01380       daemon(0,0);
01381       /* Blindly re-write pid file since we are forking */
01382       unlink((char *)ast_config_AST_PID);
01383       f = fopen((char *)ast_config_AST_PID, "w");
01384       if (f) {
01385          fprintf(f, "%d\n", getpid());
01386          fclose(f);
01387       } else
01388          ast_log(LOG_WARNING, "Unable to open pid file '%s': %s\n", (char *)ast_config_AST_PID, strerror(errno));
01389    }
01390 
01391    ast_makesocket();
01392    sigemptyset(&sigs);
01393    sigaddset(&sigs, SIGHUP);
01394    sigaddset(&sigs, SIGTERM);
01395    sigaddset(&sigs, SIGINT);
01396    sigaddset(&sigs, SIGPIPE);
01397    sigaddset(&sigs, SIGWINCH);
01398    pthread_sigmask(SIG_BLOCK, &sigs, NULL);
01399    if (option_console || option_verbose || option_remote)
01400       ast_register_verbose(console_verboser);
01401    /* Print a welcome message if desired */
01402    if (option_verbose || option_console) {
01403       ast_verbose( "Asterisk " ASTERISK_VERSION ", Copyright (C) 1999-2001 Linux Support Services, Inc.\n");
01404       ast_verbose( "Written by Mark Spencer <markster@linux-support.net>\n");
01405       ast_verbose( "=========================================================================\n");
01406    }
01407    if (option_console && !option_verbose) 
01408       ast_verbose("[ Booting...");
01409 
01410    signal(SIGURG, urg_handler);
01411    signal(SIGINT, __quit_handler);
01412    signal(SIGTERM, __quit_handler);
01413    signal(SIGHUP, hup_handler);
01414    signal(SIGCHLD, child_handler);
01415    signal(SIGPIPE, SIG_IGN);
01416 
01417    if (set_priority(option_highpriority)) {
01418       printf(term_quit());
01419       exit(1);
01420    }
01421    if (init_logger()) {
01422       printf(term_quit());
01423       exit(1);
01424    }
01425    if (init_manager()) {
01426       printf(term_quit());
01427       exit(1);
01428    }
01429    ast_rtp_init();
01430    if (ast_image_init()) {
01431       printf(term_quit());
01432       exit(1);
01433    }
01434    if (load_pbx()) {
01435       printf(term_quit());
01436       exit(1);
01437    }
01438    if (load_modules()) {
01439       printf(term_quit());
01440       exit(1);
01441    }
01442    if (init_framer()) {
01443       printf(term_quit());
01444       exit(1);
01445    }
01446    if (astdb_init()) {
01447       printf(term_quit());
01448       exit(1);
01449    }
01450    if (ast_enum_init()) {
01451       printf(term_quit());
01452       exit(1);
01453    }
01454    /* We might have the option of showing a console, but for now just
01455       do nothing... */
01456    if (option_console && !option_verbose)
01457       ast_verbose(" ]\n");
01458    if (option_verbose || option_console)
01459       ast_verbose(term_color(tmp, "Asterisk Ready.\n", COLOR_BRWHITE, COLOR_BLACK, sizeof(tmp)));
01460    fully_booted = 1;
01461    pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
01462 #ifdef __AST_DEBUG_MALLOC
01463    __ast_mm_init();
01464 #endif   
01465    time(&ast_startuptime);
01466    ast_cli_register(&astshutdownnow);
01467    ast_cli_register(&astshutdowngracefully);
01468    ast_cli_register(&astrestartnow);
01469    ast_cli_register(&astrestartgracefully);
01470    ast_cli_register(&astrestartwhenconvenient);
01471    ast_cli_register(&astshutdownwhenconvenient);
01472    ast_cli_register(&aborthalt);
01473    ast_cli_register(&astbang);
01474    if (option_console) {
01475       /* Console stuff now... */
01476       /* Register our quit function */
01477       char title[256];
01478       set_icon("Asterisk");
01479       snprintf(title, sizeof(title), "Asterisk Console on '%s' (pid %d)", hostname, mainpid);
01480       set_title(title);
01481        ast_cli_register(&quit);
01482        ast_cli_register(&astexit);
01483       consolethread = pthread_self();
01484 
01485       for (;;) {
01486          buf = (char *)el_gets(el, &num);
01487          if (buf) {
01488             if (buf[strlen(buf)-1] == '\n')
01489                buf[strlen(buf)-1] = '\0';
01490 
01491             consolehandler((char *)buf);
01492          } else {
01493             if (option_remote)
01494                ast_cli(STDOUT_FILENO, "\nUse EXIT or QUIT to exit the asterisk console\n");
01495             else
01496                ast_cli(STDOUT_FILENO, "\nUse STOP NOW to shutdown Asterisk\n");
01497          }
01498       }
01499 
01500    } else {
01501       /* Do nothing */
01502       ast_select(0,NULL,NULL,NULL,NULL);
01503    }
01504    return 0;
01505 }


Variable Documentation

char ast_config_AST_AGI_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 102 of file asterisk.c.

char ast_config_AST_CONFIG_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 96 of file asterisk.c.

char ast_config_AST_CONFIG_FILE[AST_CONFIG_MAX_PATH]
 

Definition at line 97 of file asterisk.c.

Referenced by main().

char ast_config_AST_DATA_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 108 of file asterisk.c.

char ast_config_AST_DB[AST_CONFIG_MAX_PATH]
 

Definition at line 103 of file asterisk.c.

char ast_config_AST_KEY_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 104 of file asterisk.c.

char ast_config_AST_LOG_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 101 of file asterisk.c.

Referenced by init_logger(), and reload_logger().

char ast_config_AST_MODULE_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 98 of file asterisk.c.

Referenced by ast_load_resource(), and load_modules().

char ast_config_AST_PID[AST_CONFIG_MAX_PATH]
 

Definition at line 105 of file asterisk.c.

Referenced by main().

char ast_config_AST_RUN_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 107 of file asterisk.c.

char ast_config_AST_SOCKET[AST_CONFIG_MAX_PATH]
 

Definition at line 106 of file asterisk.c.

Referenced by main().

char ast_config_AST_SPOOL_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 99 of file asterisk.c.

Referenced by ast_app_has_voicemail(), and ast_app_messagecount().

char ast_config_AST_VAR_DIR[AST_CONFIG_MAX_PATH]
 

Definition at line 100 of file asterisk.c.

time_t ast_lastreloadtime
 

Definition at line 82 of file asterisk.c.

Referenced by ast_module_reload().

time_t ast_startuptime
 

Definition at line 81 of file asterisk.c.

Referenced by main().

struct console consoles[AST_MAX_CONNECTS]
 

Definition at line 88 of file asterisk.c.

char defaultlanguage[MAX_LANGUAGE] = DEFAULT_LANGUAGE
 

Definition at line 90 of file asterisk.c.

Referenced by ast_channel_alloc().

int fully_booted = 0
 

Definition at line 64 of file asterisk.c.

Referenced by ast_load_resource(), and main().

int option_console = 0
 

Definition at line 56 of file asterisk.c.

Referenced by ast_load_resource(), main(), and term_init().

int option_debug = 0
 

Definition at line 53 of file asterisk.c.

Referenced by ast_channel_register_ex(), ast_channel_unregister(), ast_hangup(), ast_log(), ast_pbx_run(), ast_rtcp_read(), ast_save(), ast_set_read_format(), ast_set_write_format(), ast_softhangup_nolock(), load_modules(), and main().

int option_dumpcore = 0
 

Definition at line 62 of file asterisk.c.

Referenced by main().

int option_exec = 0
 

Definition at line 59 of file asterisk.c.

Referenced by main().

int option_highpriority = 0
 

Definition at line 57 of file asterisk.c.

Referenced by main().

int option_initcrypto = 0
 

Definition at line 60 of file asterisk.c.

Referenced by main().

int option_nocolor
 

Definition at line 61 of file asterisk.c.

Referenced by main(), and term_init().

int option_nofork = 0
 

Definition at line 54 of file asterisk.c.

Referenced by main(), and term_init().

int option_overrideconfig = 0
 

Definition at line 63 of file asterisk.c.

Referenced by main().

int option_quiet = 0
 

Definition at line 55 of file asterisk.c.

Referenced by load_modules(), and main().

int option_remote = 0
 

Definition at line 58 of file asterisk.c.

Referenced by main().

int option_verbose = 0
 

Definition at line 52 of file asterisk.c.

Referenced by ast_channel_bridge(), ast_channel_register_ex(), ast_channel_unregister(), ast_format_register(), ast_format_unregister(), ast_image_register(), ast_image_unregister(), ast_load_resource(), ast_log(), ast_manager_register(), ast_manager_unregister(), ast_module_reload(), ast_pbx_outgoing_exten(), ast_pbx_run(), ast_register_application(), ast_register_indication_country(), ast_register_translator(), ast_rtp_reload(), ast_save(), ast_set_indication_country(), ast_streamfile(), ast_unregister_indication_country(), init_logger(), init_manager(), load_modules(), main(), pbx_builtin_setvar_helper(), and reload_logger().


Generated on Fri Feb 27 12:19:45 2004 for Asterisk by doxygen 1.3.5