#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdio.h>
#include <signal.h>
#include <sched.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <sys/resource.h>
#include <grp.h>
#include <pwd.h>
#include <sys/stat.h>
#include <regex.h>
#include "asterisk.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/cdr.h"
#include "asterisk/pbx.h"
#include "asterisk/enum.h"
#include "asterisk/rtp.h"
#include "asterisk/app.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/file.h"
#include "asterisk/io.h"
#include "editline/histedit.h"
#include "asterisk/config.h"
#include "asterisk/version.h"
#include "asterisk/linkedlists.h"
#include "asterisk/devicestate.h"
#include "asterisk/compat.h"
#include "asterisk/doxyref.h"
#include "defaults.h"
Go to the source code of this file.
Data Structures | |
| struct | ast_atexit |
| struct | console |
| struct | file_version |
Defines | |
| #define | AF_LOCAL AF_UNIX |
| #define | AST_MAX_CONNECTS 128 |
| #define | ASTERISK_PROMPT "*CLI> " |
| #define | ASTERISK_PROMPT2 "%s*CLI> " |
| #define | FORMAT "%-25.25s %-40.40s\n" |
| #define | NUM_MSGS 64 |
| #define | PF_LOCAL PF_UNIX |
| #define | WELCOME_MESSAGE |
| Welcome message when starting a CLI interface. | |
Functions | |
| void | __quit_handler (int num) |
| int | ast_all_zeros (char *s) |
| int | ast_cli_display_match_list (char **matches, int len, int max) |
| void | ast_console_puts (const char *string) |
| int | ast_el_add_history (char *) |
| int | ast_el_initialize (void) |
| int | ast_el_read_char (EditLine *el, char *cp) |
| int | ast_el_read_history (char *) |
| int | ast_el_sort_compare (const void *i1, const void *i2) |
| char ** | ast_el_strtoarr (char *buf) |
| int | ast_el_write_history (char *) |
| AST_LIST_HEAD_STATIC (file_versions, file_version) | |
| int | ast_makesocket (void) |
| AST_MUTEX_DEFINE_STATIC (safe_system_lock) | |
| AST_MUTEX_DEFINE_STATIC (atexitslock) | |
| void | ast_network_puts (const char *string) |
| void | ast_readconfig (void) |
| int | ast_register_atexit (void(*func)(void)) |
| Register a function to be executed before Asterisk exits. | |
| void | ast_register_file_version (const char *file, const char *version) |
| Register the version of a source code file with the core. | |
| void | ast_remotecontrol (char *data) |
| void | ast_run_atexits (void) |
| int | ast_safe_system (const char *s) |
| int | ast_set_priority (int pri) |
| int | ast_tryconnect (void) |
| void | ast_unregister_atexit (void(*func)(void)) |
| Unregister a function registered with ast_register_atexit(). | |
| void | ast_unregister_file_version (const char *file) |
| Unregister a source code file from the core. | |
| void | child_handler (int sig) |
| char * | cli_complete (EditLine *el, int ch) |
| char * | cli_prompt (EditLine *el) |
| char * | complete_show_version_files (char *line, char *word, int pos, int state) |
| void | console_verboser (const char *s, int pos, int replace, int complete) |
| void | consolehandler (char *s) |
| int | fdprint (int fd, const char *s) |
| const char * | fix_header (char *outbuf, int maxout, const char *s, char *cmp) |
| int | handle_abort_halt (int fd, int argc, char *argv[]) |
| int | handle_bang (int fd, int argc, char *argv[]) |
| int | handle_restart_gracefully (int fd, int argc, char *argv[]) |
| int | handle_restart_now (int fd, int argc, char *argv[]) |
| int | handle_restart_when_convenient (int fd, int argc, char *argv[]) |
| int | handle_show_version_files (int fd, int argc, char *argv[]) |
| int | handle_shutdown_gracefully (int fd, int argc, char *argv[]) |
| int | handle_shutdown_now (int fd, int argc, char *argv[]) |
| int | handle_shutdown_when_convenient (int fd, int argc, char *argv[]) |
| void | hup_handler (int num) |
| void * | listener (void *unused) |
| int | main (int argc, char *argv[]) |
| void * | netconsole (void *vconsole) |
| void | network_verboser (const char *s, int pos, int replace, int complete) |
| void | null_sig_handler (int signal) |
| void | quit_handler (int num, int nice, int safeshutdown, int restart) |
| int | remoteconsolehandler (char *s) |
| void | set_icon (char *text) |
| void | set_title (char *text) |
| int | show_cli_help (void) |
| int | show_license (int fd, int argc, char *argv[]) |
| int | show_version (void) |
| int | show_warranty (int fd, int argc, char *argv[]) |
| void | urg_handler (int num) |
Variables | |
| char * | _argv [256] |
| char | abort_halt_help [] |
| char | ast_config_AST_AGI_DIR [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_CONFIG_DIR [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_CONFIG_FILE [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_CTL [AST_CONFIG_MAX_PATH] = "asterisk.ctl" |
| char | ast_config_AST_CTL_GROUP [AST_CONFIG_MAX_PATH] = "\0" |
| char | ast_config_AST_CTL_OWNER [AST_CONFIG_MAX_PATH] = "\0" |
| char | ast_config_AST_CTL_PERMISSIONS [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_LOG_DIR [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_MODULE_DIR [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_MONITOR_DIR [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_PID [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_RUN_DIR [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_RUN_GROUP [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_RUN_USER [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_SOCKET [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_SPOOL_DIR [AST_CONFIG_MAX_PATH] |
| char | ast_config_AST_VAR_DIR [AST_CONFIG_MAX_PATH] |
| int | ast_consock = -1 |
| time_t | ast_lastreloadtime |
| int | ast_mainpid |
| int | ast_socket = -1 |
| time_t | ast_startuptime |
| ast_atexit * | atexits |
| char | bang_help [] |
| console | consoles [AST_MAX_CONNECTS] |
| pthread_t | consolethread = AST_PTHREADT_NULL |
| ast_cli_entry | core_cli [] |
| char | debug_filename [AST_FILENAME_MAX] = "" |
| char | defaultlanguage [MAX_LANGUAGE] = DEFAULT_LANGUAGE |
| EditLine * | el = NULL |
| History * | el_hist = NULL |
| int | fully_booted = 0 |
| const char * | license_lines [] |
| pthread_t | lthread |
| int | option_cache_record_files = 0 |
| int | option_console = 0 |
| int | option_debug = 0 |
| int | option_dontwarn = 0 |
| int | option_dumpcore = 0 |
| int | option_exec = 0 |
| int | option_exec_includes = 0 |
| int | option_highpriority = 0 |
| int | option_initcrypto = 0 |
| int | option_maxcalls = 0 |
| double | option_maxload = 0.0 |
| int | option_nocolor |
| int | option_nofork = 0 |
| int | option_overrideconfig = 0 |
| int | option_priority_jumping = 1 |
| int | option_quiet = 0 |
| int | option_reconnect = 0 |
| int | option_remote = 0 |
| int | option_timestamp = 0 |
| int | option_transcode_slin = 1 |
| int | option_transmit_silence_during_record = 0 |
| int | option_verbose = 0 |
| char | record_cache_dir [AST_CACHE_DIR_LEN] = AST_TMP_DIR |
| char * | remotehostname |
| char | restart_gracefully_help [] |
| char | restart_now_help [] |
| char | restart_when_convenient_help [] |
| int | restartnow = 0 |
| unsigned int | safe_system_level = 0 |
| void * | safe_system_prev_handler |
| char | show_license_help [] |
| char | show_version_files_help [] |
| char | show_warranty_help [] |
| char | shutdown_gracefully_help [] |
| char | shutdown_now_help [] |
| char | shutdown_when_convenient_help [] |
| int | shuttingdown = 0 |
| const char * | warranty_lines [] |
Definition in file asterisk.c.
|
|
Definition at line 129 of file asterisk.c. Referenced by listener(), and NBScat_exec(). |
|
|
Definition at line 133 of file asterisk.c. |
|
|
Definition at line 1221 of file asterisk.c. Referenced by cli_prompt(). |
|
|
Definition at line 1223 of file asterisk.c. Referenced by cli_prompt(). |
|
|
|
Definition at line 134 of file asterisk.c. |
|
|
Definition at line 130 of file asterisk.c. Referenced by ast_makesocket(), and ast_tryconnect(). |
|
|
Welcome message when starting a CLI interface.
Definition at line 137 of file asterisk.c. |
|
|
Definition at line 943 of file asterisk.c. References quit_handler(). Referenced by main(). 00944 {
00945 quit_handler(num, 0, 1, 0);
00946 }
|
|
|
Definition at line 984 of file asterisk.c. References s. Referenced by ast_el_read_history(), consolehandler(), and remoteconsolehandler(). 00985 {
00986 while(*s) {
00987 if (*s > 32)
00988 return 0;
00989 s++;
00990 }
00991 return 1;
00992 }
|
|
||||||||||||||||
|
Definition at line 1516 of file asterisk.c. References ast_el_sort_compare(), ast_get_termcols(), and free. Referenced by cli_complete(). 01517 {
01518 int i, idx, limit, count;
01519 int screenwidth = 0;
01520 int numoutput = 0, numoutputline = 0;
01521
01522 screenwidth = ast_get_termcols(STDOUT_FILENO);
01523
01524 /* find out how many entries can be put on one line, with two spaces between strings */
01525 limit = screenwidth / (max + 2);
01526 if (limit == 0)
01527 limit = 1;
01528
01529 /* how many lines of output */
01530 count = len / limit;
01531 if (count * limit < len)
01532 count++;
01533
01534 idx = 1;
01535
01536 qsort(&matches[0], (size_t)(len + 1), sizeof(char *), ast_el_sort_compare);
01537
01538 for (; count > 0; count--) {
01539 numoutputline = 0;
01540 for (i=0; i < limit && matches[idx]; i++, idx++) {
01541
01542 /* Don't print dupes */
01543 if ( (matches[idx+1] != NULL && strcmp(matches[idx], matches[idx+1]) == 0 ) ) {
01544 i--;
01545 free(matches[idx]);
01546 matches[idx] = NULL;
01547 continue;
01548 }
01549
01550 numoutput++;
01551 numoutputline++;
01552 fprintf(stdout, "%-*s ", max, matches[idx]);
01553 free(matches[idx]);
01554 matches[idx] = NULL;
01555 }
01556 if (numoutputline > 0)
01557 fprintf(stdout, "\n");
01558 }
01559
01560 return numoutput;
01561 }
|
|
|
write the string to the console, and all attached console clients Definition at line 493 of file asterisk.c. References ast_network_puts(). Referenced by ast_log(), chan_misdn_log(), and chan_misdn_trace_call(). 00494 {
00495 fputs(string, stdout);
00496 fflush(stdout);
00497 ast_network_puts(string);
00498 }
|
|
|
Definition at line 1707 of file asterisk.c. References ast_el_initialize(), el, and el_hist. Referenced by ast_el_read_history(), consolehandler(), and remoteconsolehandler(). 01708 {
01709 HistEvent ev;
01710
01711 if (el_hist == NULL || el == NULL)
01712 ast_el_initialize();
01713 if (strlen(buf) > 256)
01714 return 0;
01715 return (history(el_hist, &ev, H_ENTER, buf));
01716 }
|
|
|
Definition at line 1672 of file asterisk.c. References cli_complete(), cli_prompt(), el, and el_hist. Referenced by ast_el_add_history(), ast_el_read_history(), ast_el_write_history(), ast_remotecontrol(), and main(). 01673 {
01674 HistEvent ev;
01675 char *editor = getenv("AST_EDITOR");
01676
01677 if (el != NULL)
01678 el_end(el);
01679 if (el_hist != NULL)
01680 history_end(el_hist);
01681
01682 el = el_init("asterisk", stdin, stdout, stderr);
01683 el_set(el, EL_PROMPT, cli_prompt);
01684
01685 el_set(el, EL_EDITMODE, 1);
01686 el_set(el, EL_EDITOR, editor ? editor : "emacs");
01687 el_hist = history_init();
01688 if (!el || !el_hist)
01689 return -1;
01690
01691 /* setup history with 100 entries */
01692 history(el_hist, &ev, H_SETSIZE, 100);
01693
01694 el_set(el, EL_HIST, history, el_hist);
01695
01696 el_set(el, EL_ADDFN, "ed-complete", "Complete argument", cli_complete);
01697 /* Bind <tab> to command completion */
01698 el_set(el, EL_BIND, "^I", "ed-complete", NULL);
01699 /* Bind ? to command completion */
01700 el_set(el, EL_BIND, "?", "ed-complete", NULL);
01701 /* Bind ^D to redisplay */
01702 el_set(el, EL_BIND, "^D", "ed-redisplay", NULL);
01703
01704 return 0;
01705 }
|
|
||||||||||||
|
Definition at line 1252 of file asterisk.c. References ast_consock, ast_log(), ast_tryconnect(), pollfd::events, pollfd::fd, LOG_ERROR, option_exec, poll(), quit_handler(), pollfd::revents, and term_quit(). Referenced by ast_remotecontrol(). 01253 {
01254 int num_read=0;
01255 int lastpos=0;
01256 struct pollfd fds[2];
01257 int res;
01258 int max;
01259 char buf[512];
01260
01261 for (;;) {
01262 max = 1;
01263 fds[0].fd = ast_consock;
01264 fds[0].events = POLLIN;
01265 if (!option_exec) {
01266 fds[1].fd = STDIN_FILENO;
01267 fds[1].events = POLLIN;
01268 max++;
01269 }
01270 res = poll(fds, max, -1);
01271 if (res < 0) {
01272 if (errno == EINTR)
01273 continue;
01274 ast_log(LOG_ERROR, "poll failed: %s\n", strerror(errno));
01275 break;
01276 }
01277
01278 if (!option_exec && fds[1].revents) {
01279 num_read = read(STDIN_FILENO, cp, 1);
01280 if (num_read < 1) {
01281 break;
01282 } else
01283 return (num_read);
01284 }
01285 if (fds[0].revents) {
01286 res = read(ast_consock, buf, sizeof(buf) - 1);
01287 /* if the remote side disappears exit */
01288 if (res < 1) {
01289 fprintf(stderr, "\nDisconnected from Asterisk server\n");
01290 if (!option_reconnect) {
01291 quit_handler(0, 0, 0, 0);
01292 } else {
01293 int tries;
01294 int reconnects_per_second = 20;
01295 fprintf(stderr, "Attempting to reconnect for 30 seconds\n");
01296 for (tries=0;tries<30 * reconnects_per_second;tries++) {
01297 if (ast_tryconnect()) {
01298 fprintf(stderr, "Reconnect succeeded after %.3f seconds\n", 1.0 / reconnects_per_second * tries);
01299 printf(term_quit());
01300 WELCOME_MESSAGE;
01301 break;
01302 } else {
01303 usleep(1000000 / reconnects_per_second);
01304 }
01305 }
01306 if (tries >= 30 * reconnects_per_second) {
01307 fprintf(stderr, "Failed to reconnect for 30 seconds. Quitting.\n");
01308 quit_handler(0, 0, 0, 0);
01309 }
01310 }
01311 }
01312
01313 buf[res] = '\0';
01314
01315 if (!option_exec && !lastpos)
01316 write(STDOUT_FILENO, "\r", 1);
01317 write(STDOUT_FILENO, buf, res);
01318 if ((buf[res-1] == '\n') || (buf[res-2] == '\n')) {
01319 *cp = CC_REFRESH;
01320 return(1);
01321 } else {
01322 lastpos = 1;
01323 }
01324 }
01325 }
01326
01327 *cp = '\0';
01328 return (0);
01329 }
|
|
|
Definition at line 1728 of file asterisk.c. References ast_all_zeros(), ast_el_add_history(), ast_el_initialize(), el, and el_hist. Referenced by ast_remotecontrol(), and main(). 01729 {
01730 char buf[256];
01731 FILE *f;
01732 int ret = -1;
01733
01734 if (el_hist == NULL || el == NULL)
01735 ast_el_initialize();
01736
01737 if ((f = fopen(filename, "r")) == NULL)
01738 return ret;
01739
01740 while (!feof(f)) {
01741 fgets(buf, sizeof(buf), f);
01742 if (!strcmp(buf, "_HiStOrY_V2_\n"))
01743 continue;
01744 if (ast_all_zeros(buf))
01745 continue;
01746 if ((ret = ast_el_add_history(buf)) == -1)
01747 break;
01748 }
01749 fclose(f);
01750
01751 return ret;
01752 }
|
|
||||||||||||
|
Definition at line 1506 of file asterisk.c. Referenced by ast_cli_display_match_list(). 01507 {
01508 char *s1, *s2;
01509
01510 s1 = ((char **)i1)[0];
01511 s2 = ((char **)i2)[0];
01512
01513 return strcasecmp(s1, s2);
01514 }
|
|
|
Definition at line 1476 of file asterisk.c. References AST_CLI_COMPLETE_EOF, realloc, strdup, and strsep(). Referenced by cli_complete(). 01477 {
01478 char **match_list = NULL, *retstr;
01479 size_t match_list_len;
01480 int matches = 0;
01481
01482 match_list_len = 1;
01483 while ( (retstr = strsep(&buf, " ")) != NULL) {
01484
01485 if (!strcmp(retstr, AST_CLI_COMPLETE_EOF))
01486 break;
01487 if (matches + 1 >= match_list_len) {
01488 match_list_len <<= 1;
01489 match_list = realloc(match_list, match_list_len * sizeof(char *));
01490 }
01491
01492 match_list[matches++] = strdup(retstr);
01493 }
01494
01495 if (!match_list)
01496 return (char **) NULL;
01497
01498 if (matches>= match_list_len)
01499 match_list = realloc(match_list, (match_list_len + 1) * sizeof(char *));
01500
01501 match_list[matches] = (char *) NULL;
01502
01503 return match_list;
01504 }
|
|
|
Definition at line 1718 of file asterisk.c. References ast_el_initialize(), el, and el_hist. Referenced by quit_handler(). 01719 {
01720 HistEvent ev;
01721
01722 if (el_hist == NULL || el == NULL)
01723 ast_el_initialize();
01724
01725 return (history(el_hist, &ev, H_SAVE, filename));
01726 }
|
|
||||||||||||
|
|
|
|
Definition at line 638 of file asterisk.c. References ast_config_AST_CTL_GROUP, ast_config_AST_CTL_OWNER, ast_config_AST_CTL_PERMISSIONS, ast_config_AST_SOCKET, ast_log(), ast_pthread_create, ast_register_verbose(), ast_socket, ast_strlen_zero(), consoles, console::fd, listener(), LOG_WARNING, lthread, network_verboser(), and PF_LOCAL. Referenced by main(). 00639 {
00640 struct sockaddr_un sunaddr;
00641 int res;
00642 int x;
00643 uid_t uid = -1;
00644 gid_t gid = -1;
00645
00646 for (x = 0; x < AST_MAX_CONNECTS; x++)
00647 consoles[x].fd = -1;
00648 unlink(ast_config_AST_SOCKET);
00649 ast_socket = socket(PF_LOCAL, SOCK_STREAM, 0);
00650 if (ast_socket < 0) {
00651 ast_log(LOG_WARNING, "Unable to create control socket: %s\n", strerror(errno));
00652 return -1;
00653 }
00654 memset(&sunaddr, 0, sizeof(sunaddr));
00655 sunaddr.sun_family = AF_LOCAL;
00656 ast_copy_string(sunaddr.sun_path, ast_config_AST_SOCKET, sizeof(sunaddr.sun_path));
00657 res = bind(ast_socket, (struct sockaddr *)&sunaddr, sizeof(sunaddr));
00658 if (res) {
00659 ast_log(LOG_WARNING, "Unable to bind socket to %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
00660 close(ast_socket);
00661 ast_socket = -1;
00662 return -1;
00663 }
00664 res = listen(ast_socket, 2);
00665 if (res < 0) {
00666 ast_log(LOG_WARNING, "Unable to listen on socket %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
00667 close(ast_socket);
00668 ast_socket = -1;
00669 return -1;
00670 }
00671 ast_register_verbose(network_verboser);
00672 ast_pthread_create(<hread, NULL, listener, NULL);
00673
00674 if (!ast_strlen_zero(ast_config_AST_CTL_OWNER)) {
00675 struct passwd *pw;
00676 if ((pw = getpwnam(ast_config_AST_CTL_OWNER)) == NULL) {
00677 ast_log(LOG_WARNING, "Unable to find uid of user %s\n", ast_config_AST_CTL_OWNER);
00678 } else {
00679 uid = pw->pw_uid;
00680 }
00681 }
00682
00683 if (!ast_strlen_zero(ast_config_AST_CTL_GROUP)) {
00684 struct group *grp;
00685 if ((grp = getgrnam(ast_config_AST_CTL_GROUP)) == NULL) {
00686 ast_log(LOG_WARNING, "Unable to find gid of group %s\n", ast_config_AST_CTL_GROUP);
00687 } else {
00688 gid = grp->gr_gid;
00689 }
00690 }
00691
00692 if (chown(ast_config_AST_SOCKET, uid, gid) < 0)
00693 ast_log(LOG_WARNING, "Unable to change ownership of %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
00694
00695 if (!ast_strlen_zero(ast_config_AST_CTL_PERMISSIONS)) {
00696 int p1;
00697 mode_t p;
00698 sscanf(ast_config_AST_CTL_PERMISSIONS, "%o", &p1);
00699 p = p1;
00700 if ((chmod(ast_config_AST_SOCKET, p)) < 0)
00701 ast_log(LOG_WARNING, "Unable to change file permissions of %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
00702 }
00703
00704 return 0;
00705 }
|
|
|
|
|
|
|
|
|
write the string to all attached console clients Definition at line 480 of file asterisk.c. References consoles, console::fd, and fdprint(). Referenced by ast_console_puts(), and network_verboser(). 00481 {
00482 int x;
00483 for (x=0;x<AST_MAX_CONNECTS; x++) {
00484 if (consoles[x].fd > -1)
00485 fdprint(consoles[x].p[1], string);
00486 }
00487 }
|
|
|
Definition at line 1862 of file asterisk.c. References AST_AGI_DIR, AST_CACHE_DIR_LEN, ast_config_AST_AGI_DIR, ast_config_AST_CONFIG_DIR, ast_config_AST_CONFIG_FILE, ast_config_AST_CTL, ast_config_AST_CTL_GROUP, ast_config_AST_CTL_OWNER, ast_config_AST_CTL_PERMISSIONS, ast_config_AST_DB, ast_config_AST_KEY_DIR, ast_config_AST_LOG_DIR, ast_config_AST_MODULE_DIR, ast_config_AST_MONITOR_DIR, ast_config_AST_PID, ast_config_AST_RUN_DIR, ast_config_AST_RUN_GROUP, ast_config_AST_RUN_USER, ast_config_AST_SOCKET, ast_config_AST_SPOOL_DIR, ast_config_AST_VAR_DIR, ast_config_destroy(), AST_CONFIG_DIR, ast_config_load(), AST_DB, AST_KEY_DIR, ast_log(), AST_LOG_DIR, AST_MODULE_DIR, AST_PID, AST_RUN_DIR, AST_SOCKET, AST_SPOOL_DIR, ast_true(), AST_VAR_DIR, ast_variable_browse(), cfg, getloadavg(), LOG_ERROR, LOG_WARNING, ast_variable::name, ast_variable::next, option_cache_record_files, option_console, option_debug, option_dontwarn, option_dumpcore, option_exec_includes, option_highpriority, option_initcrypto, option_maxcalls, option_maxload, option_nocolor, option_nofork, option_overrideconfig, option_quiet, option_timestamp, option_transcode_slin, option_transmit_silence_during_record, option_verbose, record_cache_dir, and ast_variable::value. Referenced by main(). 01862 {
01863 struct ast_config *cfg;
01864 struct ast_variable *v;
01865 char *config = AST_CONFIG_FILE;
01866
01867 if (option_overrideconfig == 1) {
01868 cfg = ast_config_load(ast_config_AST_CONFIG_FILE);
01869 if (!cfg)
01870 ast_log(LOG_WARNING, "Unable to open specified master config file '%s', using built-in defaults\n", ast_config_AST_CONFIG_FILE);
01871 } else {
01872 cfg = ast_config_load(config);
01873 }
01874
01875 /* init with buildtime config */
01876 ast_copy_string(ast_config_AST_CONFIG_DIR, AST_CONFIG_DIR, sizeof(ast_config_AST_CONFIG_DIR));
01877 ast_copy_string(ast_config_AST_SPOOL_DIR, AST_SPOOL_DIR, sizeof(ast_config_AST_SPOOL_DIR));
01878 ast_copy_string(ast_config_AST_MODULE_DIR, AST_MODULE_DIR, sizeof(ast_config_AST_VAR_DIR));
01879 snprintf(ast_config_AST_MONITOR_DIR, sizeof(ast_config_AST_MONITOR_DIR) - 1, "%s/monitor", ast_config_AST_SPOOL_DIR);
01880 ast_copy_string(ast_config_AST_VAR_DIR, AST_VAR_DIR, sizeof(ast_config_AST_VAR_DIR));
01881 ast_copy_string(ast_config_AST_LOG_DIR, AST_LOG_DIR, sizeof(ast_config_AST_LOG_DIR));
01882 ast_copy_string(ast_config_AST_AGI_DIR, AST_AGI_DIR, sizeof(ast_config_AST_AGI_DIR));
01883 ast_copy_string(ast_config_AST_DB, AST_DB, sizeof(ast_config_AST_DB));
01884 ast_copy_string(ast_config_AST_KEY_DIR, AST_KEY_DIR, sizeof(ast_config_AST_KEY_DIR));
01885 ast_copy_string(ast_config_AST_PID, AST_PID, sizeof(ast_config_AST_PID));
01886 ast_copy_string(ast_config_AST_SOCKET, AST_SOCKET, sizeof(ast_config_AST_SOCKET));
01887 ast_copy_string(ast_config_AST_RUN_DIR, AST_RUN_DIR, sizeof(ast_config_AST_RUN_DIR));
01888
01889 /* no asterisk.conf? no problem, use buildtime config! */
01890 if (!cfg) {
01891 return;
01892 }
01893 v = ast_variable_browse(cfg, "files");
01894 while (v) {
01895 if (!strcasecmp(v->name, "astctlpermissions")) {
01896 ast_copy_string(ast_config_AST_CTL_PERMISSIONS, v->value, sizeof(ast_config_AST_CTL_PERMISSIONS));
01897 } else if (!strcasecmp(v->name, "astctlowner")) {
01898 ast_copy_string(ast_config_AST_CTL_OWNER, v->value, sizeof(ast_config_AST_CTL_OWNER));
01899 } else if (!strcasecmp(v->name, "astctlgroup")) {
01900 ast_copy_string(ast_config_AST_CTL_GROUP, v->value, sizeof(ast_config_AST_CTL_GROUP));
01901 } else if (!strcasecmp(v->name, "astctl")) {
01902 ast_copy_string(ast_config_AST_CTL, v->value, sizeof(ast_config_AST_CTL));
01903 }
01904 v = v->next;
01905 }
01906 v = ast_variable_browse(cfg, "directories");
01907 while(v) {
01908 if (!strcasecmp(v->name, "astetcdir")) {
01909 ast_copy_string(ast_config_AST_CONFIG_DIR, v->value, sizeof(ast_config_AST_CONFIG_DIR));
01910 } else if (!strcasecmp(v->name, "astspooldir")) {
01911 ast_copy_string(ast_config_AST_SPOOL_DIR, v->value, sizeof(ast_config_AST_SPOOL_DIR));
01912 snprintf(ast_config_AST_MONITOR_DIR, sizeof(ast_config_AST_MONITOR_DIR) - 1, "%s/monitor", v->value);
01913 } else if (!strcasecmp(v->name, "astvarlibdir")) {
01914 ast_copy_string(ast_config_AST_VAR_DIR, v->value, sizeof(ast_config_AST_VAR_DIR));
01915 snprintf(ast_config_AST_DB, sizeof(ast_config_AST_DB), "%s/astdb", v->value);
01916 snprintf(ast_config_AST_KEY_DIR, sizeof(ast_config_AST_KEY_DIR), "%s/keys", v->value);
01917 } else if (!strcasecmp(v->name, "astlogdir")) {
01918 ast_copy_string(ast_config_AST_LOG_DIR, v->value, sizeof(ast_config_AST_LOG_DIR));
01919 } else if (!strcasecmp(v->name, "astagidir")) {
01920 ast_copy_string(ast_config_AST_AGI_DIR, v->value, sizeof(ast_config_AST_AGI_DIR));
01921 } else if (!strcasecmp(v->name, "astrundir")) {
01922 snprintf(ast_config_AST_PID, sizeof(ast_config_AST_PID), "%s/%s", v->value, "asterisk.pid");
01923 snprintf(ast_config_AST_SOCKET, sizeof(ast_config_AST_SOCKET), "%s/%s", v->value, ast_config_AST_CTL);
01924 ast_copy_string(ast_config_AST_RUN_DIR, v->value, sizeof(ast_config_AST_RUN_DIR));
01925 } else if (!strcasecmp(v->name, "astmoddir")) {
01926 ast_copy_string(ast_config_AST_MODULE_DIR, v->value, sizeof(ast_config_AST_MODULE_DIR));
01927 }
01928 v = v->next;
01929 }
01930 v = ast_variable_browse(cfg, "options");
01931 while(v) {
01932 /* verbose level (-v at startup) */
01933 if (!strcasecmp(v->name, "verbose")) {
01934 option_verbose = atoi(v->value);
01935 /* whether or not to force timestamping. (-T at startup) */
01936 } else if (!strcasecmp(v->name, "timestamp")) {
01937 option_timestamp = ast_true(v->value);
01938 /* whether or not to support #exec in config files */
01939 } else if (!strcasecmp(v->name, "execincludes")) {
01940 option_exec_includes = ast_true(v->value);
01941 /* debug level (-d at startup) */
01942 } else if (!strcasecmp(v->name, "debug")) {
01943 option_debug = 0;
01944 if (sscanf(v->value, "%d", &option_debug) != 1) {
01945 option_debug = ast_true(v->value);
01946 }
01947 /* Disable forking (-f at startup) */
01948 } else if (!strcasecmp(v->name, "nofork")) {
01949 option_nofork = ast_true(v->value);
01950 /* Run quietly (-q at startup ) */
01951 } else if (!strcasecmp(v->name, "quiet")) {
01952 option_quiet = ast_true(v->value);
01953 /* Run as console (-c at startup, implies nofork) */
01954 } else if (!strcasecmp(v->name, "console")) {
01955 option_console = ast_true(v->value);
01956 /* Run with highg priority if the O/S permits (-p at startup) */
01957 } else if (!strcasecmp(v->name, "highpriority")) {
01958 option_highpriority = ast_true(v->value);
01959 /* Initialize RSA auth keys (IAX2) (-i at startup) */
01960 } else if (!strcasecmp(v->name, "initcrypto")) {
01961 option_initcrypto = ast_true(v->value);
01962 /* Disable ANSI colors for console (-c at startup) */
01963 } else if (!strcasecmp(v->name, "nocolor")) {
01964 option_nocolor = ast_true(v->value);
01965 /* Disable some usage warnings for picky people :p */
01966 } else if (!strcasecmp(v->name, "dontwarn")) {
01967 option_dontwarn = ast_true(v->value);
01968 /* Dump core in case of crash (-g) */
01969 } else if (!strcasecmp(v->name, "dumpcore")) {
01970 option_dumpcore = ast_true(v->value);
01971 /* Cache recorded sound files to another directory during recording */
01972 } else if (!strcasecmp(v->name, "cache_record_files")) {
01973 option_cache_record_files = ast_true(v->value);
01974 /* Specify cache directory */
01975 } else if (!strcasecmp(v->name, "record_cache_dir")) {
01976 ast_copy_string(record_cache_dir, v->value, AST_CACHE_DIR_LEN);
01977 /* Build transcode paths via SLINEAR, instead of directly */
01978 } else if (!strcasecmp(v->name, "transcode_via_sln")) {
01979 option_transcode_slin = ast_true(v->value);
01980 /* Transmit SLINEAR silence while a channel is being recorded */
01981 } else if (!strcasecmp(v->name, "transmit_silence_during_record")) {
01982 option_transmit_silence_during_record = ast_true(v->value);
01983 } else if (!strcasecmp(v->name, "maxcalls")) {
01984 if ((sscanf(v->value, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0)) {
01985 option_maxcalls = 0;
01986 }
01987 } else if (!strcasecmp(v->name, "maxload")) {
01988 double test[1];
01989
01990 if (getloadavg(test, 1) == -1) {
01991 ast_log(LOG_ERROR, "Cannot obtain load average on this system. 'maxload' option disabled.\n");
01992 option_maxload = 0.0;
01993 } else if ((sscanf(v->value, "%lf", &option_maxload) != 1) || (option_maxload < 0.0)) {
01994 option_maxload = 0.0;
01995 }
01996 /* What user to run as */
01997 } else if (!strcasecmp(v->name, "runuser")) {
01998 ast_copy_string(ast_config_AST_RUN_USER, v->value, sizeof(ast_config_AST_RUN_USER));
01999 /* What group to run as */
02000 } else if (!strcasecmp(v->name, "rungroup")) {
02001 ast_copy_string(ast_config_AST_RUN_GROUP, v->value, sizeof(ast_config_AST_RUN_GROUP));
02002 }
02003 v = v->next;
02004 }
02005 ast_config_destroy(cfg);
02006 }
|
|
|
Register a function to be executed before Asterisk exits.
Definition at line 370 of file asterisk.c. References ast_mutex_lock(), ast_mutex_unlock(), ast_unregister_atexit(), atexits, ast_atexit::func, malloc, and ast_atexit::next. Referenced by do_reload(), and load_module(). 00371 {
00372 int res = -1;
00373 struct ast_atexit *ae;
00374 ast_unregister_atexit(func);
00375 ae = malloc(sizeof(struct ast_atexit));
00376 ast_mutex_lock(&atexitslock);
00377 if (ae) {
00378 memset(ae, 0, sizeof(struct ast_atexit));
00379 ae->next = atexits;
00380 ae->func = func;
00381 atexits = ae;
00382 res = 0;
00383 }
00384 ast_mutex_unlock(&atexitslock);
00385 return res;
00386 }
|
|
||||||||||||
|
Register the version of a source code file with the core.
Definition at line 246 of file asterisk.c. References AST_LIST_INSERT_HEAD, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_strdupa, ast_strip_quoted(), and calloc. 00247 {
00248 struct file_version *new;
00249 char *work;
00250 size_t version_length;
00251
00252 work = ast_strdupa(version);
00253 work = ast_strip(ast_strip_quoted(work, "$", "$"));
00254 version_length = strlen(work) + 1;
00255
00256 new = calloc(1, sizeof(*new) + version_length);
00257 if (!new)
00258 return;
00259
00260 new->file = file;
00261 new->version = (char *) new + sizeof(*new);
00262 memcpy(new->version, work, version_length);
00263 AST_LIST_LOCK(&file_versions);
00264 AST_LIST_INSERT_HEAD(&file_versions, new, list);
00265 AST_LIST_UNLOCK(&file_versions);
00266 }
|
|
|
Definition at line 1754 of file asterisk.c. References ast_consock, ast_el_initialize(), ast_el_read_char(), ast_el_read_history(), ast_log(), ast_strlen_zero(), ast_verbose(), el, el_hist, pollfd::events, pollfd::fd, fdprint(), LOG_WARNING, option_debug, option_exec, option_verbose, poll(), remoteconsolehandler(), remotehostname, pollfd::revents, and strsep(). Referenced by main(). 01755 {
01756 char buf[80];
01757 int res;
01758 char filename[80] = "";
01759 char *hostname;
01760 char *cpid;
01761 char *version;
01762 int pid;
01763 char tmp[80];
01764 char *stringp=NULL;
01765
01766 char *ebuf;
01767 int num = 0;
01768
01769 read(ast_consock, buf, sizeof(buf));
01770 if (data)
01771 write(ast_consock, data, strlen(data) + 1);
01772 stringp=buf;
01773 hostname = strsep(&stringp, "/");
01774 cpid = strsep(&stringp, "/");
01775 version = strsep(&stringp, "\n");
01776 if (!version)
01777 version = "<Version Unknown>";
01778 stringp=hostname;
01779 strsep(&stringp, ".");
01780 if (cpid)
01781 pid = atoi(cpid);
01782 else
01783 pid = -1;
01784 snprintf(tmp, sizeof(tmp), "set verbose atleast %d", option_verbose);
01785 fdprint(ast_consock, tmp);
01786 snprintf(tmp, sizeof(tmp), "set debug atleast %d", option_debug);
01787 fdprint(ast_consock, tmp);
01788 ast_verbose("Connected to Asterisk %s currently running on %s (pid = %d)\n", version, hostname, pid);
01789 remotehostname = hostname;
01790 if (getenv("HOME"))
01791 snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
01792 if (el_hist == NULL || el == NULL)
01793 ast_el_initialize();
01794
01795 el_set(el, EL_GETCFN, ast_el_read_char);
01796
01797 if (!ast_strlen_zero(filename))
01798 ast_el_read_history(filename);
01799
01800 if (option_exec && data) { /* hack to print output then exit if asterisk -rx is used */
01801 char tempchar;
01802 struct pollfd fds[0];
01803 fds[0].fd = ast_consock;
01804 fds[0].events = POLLIN;
01805 fds[0].revents = 0;
01806 while(poll(fds, 1, 100) > 0) {
01807 ast_el_read_char(el, &tempchar);
01808 }
01809 return;
01810 }
01811 for(;;) {
01812 ebuf = (char *)el_gets(el, &num);
01813
01814 if (!ast_strlen_zero(ebuf)) {
01815 if (ebuf[strlen(ebuf)-1] == '\n')
01816 ebuf[strlen(ebuf)-1] = '\0';
01817 if (!remoteconsolehandler(ebuf)) {
01818 res = write(ast_consock, ebuf, strlen(ebuf) + 1);
01819 if (res < 1) {
01820 ast_log(LOG_WARNING, "Unable to write: %s\n", strerror(errno));
01821 break;
01822 }
01823 }
01824 }
01825 }
01826 printf("\nDisconnected from Asterisk server\n");
01827 }
|
|
|
Definition at line 824 of file asterisk.c. References ast_mutex_lock(), ast_mutex_unlock(), ast_atexit::func, and ast_atexit::next. Referenced by quit_handler(). 00825 {
00826 struct ast_atexit *ae;
00827 ast_mutex_lock(&atexitslock);
00828 ae = atexits;
00829 while(ae) {
00830 if (ae->func)
00831 ae->func();
00832 ae = ae->next;
00833 }
00834 ast_mutex_unlock(&atexitslock);
00835 }
|
|
|
Safely spawn an external program while closing file descriptors
Definition at line 422 of file asterisk.c. References ast_log(), ast_mutex_lock(), ast_mutex_unlock(), LOG_WARNING, null_sig_handler(), s, safe_system_level, and safe_system_prev_handler. Referenced by alarmreceiver_exec(), ast_closestream(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), consolehandler(), forward_message(), mixmonitor_thread(), process_text_line(), remoteconsolehandler(), run_externnotify(), sendmail(), sendpage(), system_exec_helper(), and vm_change_password_shell(). 00423 {
00424 pid_t pid;
00425 int x;
00426 int res;
00427 struct rusage rusage;
00428 int status;
00429 unsigned int level;
00430
00431 /* keep track of how many ast_safe_system() functions
00432 are running at this moment
00433 */
00434 ast_mutex_lock(&safe_system_lock);
00435 level = safe_system_level++;
00436
00437 /* only replace the handler if it has not already been done */
00438 if (level == 0)
00439 safe_system_prev_handler = signal(SIGCHLD, null_sig_handler);
00440
00441 ast_mutex_unlock(&safe_system_lock);
00442
00443 pid = fork();
00444
00445 if (pid == 0) {
00446 /* Close file descriptors and launch system command */
00447 for (x = STDERR_FILENO + 1; x < 4096; x++)
00448 close(x);
00449 execl("/bin/sh", "/bin/sh", "-c", s, NULL);
00450 exit(1);
00451 } else if (pid > 0) {
00452 for(;;) {
00453 res = wait4(pid, &status, 0, &rusage);
00454 if (res > -1) {
00455 res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
00456 break;
00457 } else if (errno != EINTR)
00458 break;
00459 }
00460 } else {
00461 ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(errno));
00462 res = -1;
00463 }
00464
00465 ast_mutex_lock(&safe_system_lock);
00466 level = --safe_system_level;
00467
00468 /* only restore the handler if we are the last one */
00469 if (level == 0)
00470 signal(SIGCHLD, safe_system_prev_handler);
00471
00472 ast_mutex_unlock(&safe_system_lock);
00473
00474 return res;
00475 }
|
|
|
We set ourselves to a high priority, that we might pre-empt everything else. If your PBX has heavy activity on it, this is a good thing. Definition at line 786 of file asterisk.c. References ast_log(), ast_verbose(), and LOG_WARNING. Referenced by launch_script(), and main(). 00787 {
00788 struct sched_param sched;
00789 memset(&sched, 0, sizeof(sched));
00790 #ifdef __linux__
00791 if (pri) {
00792 sched.sched_priority = 10;
00793 if (sched_setscheduler(0, SCHED_RR, &sched)) {
00794 ast_log(LOG_WARNING, "Unable to set high priority\n");
00795 return -1;
00796 } else
00797 if (option_verbose)
00798 ast_verbose("Set to realtime thread\n");
00799 } else {
00800 sched.sched_priority = 0;
00801 if (sched_setscheduler(0, SCHED_OTHER, &sched)) {
00802 ast_log(LOG_WARNING, "Unable to set normal priority\n");
00803 return -1;
00804 }
00805 }
00806 #else
00807 if (pri) {
00808 if (setpriority(PRIO_PROCESS, 0, -10) == -1) {
00809 ast_log(LOG_WARNING, "Unable to set high priority\n");
00810 return -1;
00811 } else
00812 if (option_verbose)
00813 ast_verbose("Set to high priority\n");
00814 } else {
00815 if (setpriority(PRIO_PROCESS, 0, 0) == -1) {
00816 ast_log(LOG_WARNING, "Unable to set normal priority\n");
00817 return -1;
00818 }
00819 }
00820 #endif
00821 return 0;
00822 }
|
|
|
Definition at line 707 of file asterisk.c. References ast_config_AST_SOCKET, ast_consock, ast_log(), LOG_WARNING, and PF_LOCAL. Referenced by ast_el_read_char(), and main(). 00708 {
00709 struct sockaddr_un sunaddr;
00710 int res;
00711 ast_consock = socket(PF_LOCAL, SOCK_STREAM, 0);
00712 if (ast_consock < 0) {
00713 ast_log(LOG_WARNING, "Unable to create socket: %s\n", strerror(errno));
00714 return 0;
00715 }
00716 memset(&sunaddr, 0, sizeof(sunaddr));
00717 sunaddr.sun_family = AF_LOCAL;
00718 ast_copy_string(sunaddr.sun_path, (char *)ast_config_AST_SOCKET, sizeof(sunaddr.sun_path));
00719 res = connect(ast_consock, (struct sockaddr *)&sunaddr, sizeof(sunaddr));
00720 if (res) {
00721 close(ast_consock);
00722 ast_consock = -1;
00723 return 0;
00724 } else
00725 return 1;
00726 }
|
|
|
Unregister a function registered with ast_register_atexit().
Definition at line 388 of file asterisk.c. References ast_mutex_lock(), ast_mutex_unlock(), atexits, ast_atexit::func, and ast_atexit::next. Referenced by ast_register_atexit(), and do_reload(). 00389 {
00390 struct ast_atexit *ae, *prev = NULL;
00391 ast_mutex_lock(&atexitslock);
00392 ae = atexits;
00393 while(ae) {
00394 if (ae->func == func) {
00395 if (prev)
00396 prev->next = ae->next;
00397 else
00398 atexits = ae->next;
00399 break;
00400 }
00401 prev = ae;
00402 ae = ae->next;
00403 }
00404 ast_mutex_unlock(&atexitslock);
00405 }
|
|
|
Unregister a source code file from the core.
Definition at line 268 of file asterisk.c. References AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_UNLOCK, and free. 00269 {
00270 struct file_version *find;
00271
00272 AST_LIST_LOCK(&file_versions);
00273 AST_LIST_TRAVERSE_SAFE_BEGIN(&file_versions, find, list) {
00274 if (!strcasecmp(find->file, file)) {
00275 AST_LIST_REMOVE_CURRENT(&file_versions, list);
00276 break;
00277 }
00278 }
00279 AST_LIST_TRAVERSE_SAFE_END;
00280 AST_LIST_UNLOCK(&file_versions);
00281 if (find)
00282 free(find);
00283 }
|
|
|
Definition at line 756 of file asterisk.c. References child_handler(). Referenced by child_handler(), and main(). 00757 {
00758 /* Must not ever ast_log or ast_verbose within signal handler */
00759 int n, status;
00760
00761 /*
00762 * Reap all dead children -- not just one
00763 */
00764 for (n = 0; wait4(-1, &status, WNOHANG, NULL) > 0; n++)
00765 ;
00766 if (n == 0 && option_debug)
00767 printf("Huh? Child handler, but nobody there?\n");
00768 signal(sig, child_handler);
00769 }
|
|
||||||||||||
|
Definition at line 1564 of file asterisk.c. References AST_CLI_COMPLETE_EOF, ast_cli_completion_matches(), ast_cli_display_match_list(), ast_cli_generatornummatches(), ast_consock, ast_el_strtoarr(), el, fdprint(), free, malloc, and realloc. Referenced by ast_el_initialize(). 01565 {
01566 int len=0;
01567 char *ptr;
01568 int nummatches = 0;
01569 char **matches;
01570 int retval = CC_ERROR;
01571 char buf[2048];
01572 int res;
01573
01574 LineInfo *lf = (LineInfo *)el_line(el);
01575
01576 *(char *)lf->cursor = '\0';
01577 ptr = (char *)lf->cursor;
01578 if (ptr) {
01579 while (ptr > lf->buffer) {
01580 if (isspace(*ptr)) {
01581 ptr++;
01582 break;
01583 }
01584 ptr--;
01585 }
01586 }
01587
01588 len = lf->cursor - ptr;
01589
01590 if (option_remote) {
01591 snprintf(buf, sizeof(buf),"_COMMAND NUMMATCHES \"%s\" \"%s\"", lf->buffer, ptr);
01592 fdprint(ast_consock, buf);
01593 res = read(ast_consock, buf, sizeof(buf));
01594 buf[res] = '\0';
01595 nummatches = atoi(buf);
01596
01597 if (nummatches > 0) {
01598 char *mbuf;
01599 int mlen = 0, maxmbuf = 2048;
01600 /* Start with a 2048 byte buffer */
01601 mbuf = malloc(maxmbuf);
01602 if (!mbuf)
01603 return (char *)(CC_ERROR);
01604 snprintf(buf, sizeof(buf),"_COMMAND MATCHESARRAY \"%s\" \"%s\"", lf->buffer, ptr);
01605 fdprint(ast_consock, buf);
01606 res = 0;
01607 mbuf[0] = '\0';
01608 while (!strstr(mbuf, AST_CLI_COMPLETE_EOF) && res != -1) {
01609 if (mlen + 1024 > maxmbuf) {
01610 /* Every step increment buffer 1024 bytes */
01611 maxmbuf += 1024;
01612 mbuf = realloc(mbuf, maxmbuf);
01613 if (!mbuf)
01614 return (char *)(CC_ERROR);
01615 }
01616 /* Only read 1024 bytes at a time */
01617 res = read(ast_consock, mbuf + mlen, 1024);
01618 if (res > 0)
01619 mlen += res;
01620 }
01621 mbuf[mlen] = '\0';
01622
01623 matches = ast_el_strtoarr(mbuf);
01624 free(mbuf);
01625 } else
01626 matches = (char **) NULL;
01627
01628
01629 } else {
01630
01631 nummatches = ast_cli_generatornummatches((char *)lf->buffer,ptr);
01632 matches = ast_cli_completion_matches((char *)lf->buffer,ptr);
01633 }
01634
01635 if (matches) {
01636 int i;
01637 int matches_num, maxlen, match_len;
01638
01639 if (matches[0][0] != '\0') {
01640 el_deletestr(el, (int) len);
01641 el_insertstr(el, matches[0]);
01642 retval = CC_REFRESH;
01643 }
01644
01645 if (nummatches == 1) {
01646 /* Found an exact match */
01647 el_insertstr(el, " ");
01648 retval = CC_REFRESH;
01649 } else {
01650 /* Must be more than one match */
01651 for (i=1, maxlen=0; matches[i]; i++) {
01652 match_len = strlen(matches[i]);
01653 if (match_len > maxlen)
01654 maxlen = match_len;
01655 }
01656 matches_num = i - 1;
01657 if (matches_num >1) {
01658 fprintf(stdout, "\n");
01659 ast_cli_display_match_list(matches, nummatches, maxlen);
01660 retval = CC_REDISPLAY;
01661 } else {
01662 el_insertstr(el," ");
01663 retval = CC_REFRESH;
01664 }
01665 }
01666 free(matches);
01667 }
01668
01669 return (char *)(long)retval;
01670 }
|
|
|
Definition at line 1331 of file asterisk.c. References ASTERISK_PROMPT, ASTERISK_PROMPT2, COLOR_BLACK, COLOR_WHITE, remotehostname, and term_color_code(). Referenced by ast_el_initialize(). 01332 {
01333 static char prompt[200];
01334 char *pfmt;
01335 int color_used=0;
01336 char term_code[20];
01337
01338 if ((pfmt = getenv("ASTERISK_PROMPT"))) {
01339 char *t = pfmt, *p = prompt;
01340 memset(prompt, 0, sizeof(prompt));
01341 while (*t != '\0' && *p < sizeof(prompt)) {
01342 if (*t == '%') {
01343 char hostname[MAXHOSTNAMELEN]="";
01344 int i;
01345 time_t ts;
01346 struct tm tm;
01347 #ifdef linux
01348 FILE *LOADAVG;
01349 #endif
01350 int fgcolor = COLOR_WHITE, bgcolor = COLOR_BLACK;
01351
01352 t++;
01353 switch (*t) {
01354 case 'C': /* color */
01355 t++;
01356 if (sscanf(t, "%d;%d%n", &fgcolor, &bgcolor, &i) == 2) {
01357 strncat(p, term_color_code(term_code, fgcolor, bgcolor, sizeof(term_code)),sizeof(prompt) - strlen(prompt) - 1);
01358 t += i - 1;
01359 } else if (sscanf(t, "%d%n", &fgcolor, &i) == 1) {
01360 strncat(p, term_color_code(term_code, fgcolor, 0, sizeof(term_code)),sizeof(prompt) - strlen(prompt) - 1);
01361 t += i - 1;
01362 }
01363
01364 /* If the color has been reset correctly, then there's no need to reset it later */
01365 if ((fgcolor == COLOR_WHITE) && (bgcolor == COLOR_BLACK)) {
01366 color_used = 0;
01367 } else {
01368 color_used = 1;
01369 }
01370 break;
01371 case 'd': /* date */
01372 memset(&tm, 0, sizeof(struct tm));
01373 time(&ts);
01374 if (localtime_r(&ts, &tm)) {
01375 strftime(p, sizeof(prompt) - strlen(prompt), "%Y-%m-%d", &tm);
01376 }
01377 break;
01378 case 'h': /* hostname */
01379 if (!gethostname(hostname, sizeof(hostname) - 1)) {
01380 strncat(p, hostname, sizeof(prompt) - strlen(prompt) - 1);
01381 } else {
01382 strncat(p, "localhost", sizeof(prompt) - strlen(prompt) - 1);
01383 }
01384 break;
01385 case 'H': /* short hostname */
01386 if (!gethostname(hostname, sizeof(hostname) - 1)) {
01387 for (i=0;i<sizeof(hostname);i++) {
01388 if (hostname[i] == '.') {
01389 hostname[i] = '\0';
01390 break;
01391 }
01392 }
01393 strncat(p, hostname, sizeof(prompt) - strlen(prompt) - 1);
01394 } else {
01395 strncat(p, "localhost", sizeof(prompt) - strlen(prompt) - 1);
01396 }
01397 break;
01398 #ifdef linux
01399 case 'l': /* load avg */
01400 t++;
01401 if ((LOADAVG = fopen("/proc/loadavg", "r"))) {
01402 float avg1, avg2, avg3;
01403 int actproc, totproc, npid, which;
01404 fscanf(LOADAVG, "%f %f %f %d/%d %d",
01405 &avg1, &avg2, &avg3, &actproc, &totproc, &npid);
01406 if (sscanf(t, "%d", &which) == 1) {
01407 switch (which) {
01408 case 1:
01409 snprintf(p, sizeof(prompt) - strlen(prompt), "%.2f", avg1);
01410 break;
01411 case 2:
01412 snprintf(p, sizeof(prompt) - strlen(prompt), "%.2f", avg2);
01413 break;
01414 case 3:
01415 snprintf(p, sizeof(prompt) - strlen(prompt), "%.2f", avg3);
01416 break;
01417 case 4:
01418 snprintf(p, sizeof(prompt) - strlen(prompt), "%d/%d", actproc, totproc);
01419 break;
01420 case 5:
01421 snprintf(p, sizeof(prompt) - strlen(prompt), "%d", npid);
01422 break;
01423 }
01424 }
01425 }
01426 break;
01427 #endif
01428 case 't': /* time */
01429 memset(&tm, 0, sizeof(struct tm));
01430 time(&ts);
01431 if (localtime_r(&ts, &tm)) {
01432 strftime(p, sizeof(prompt) - strlen(prompt), "%H:%M:%S", &tm);
01433 }
01434 break;
01435 case '#': /* process console or remote? */
01436 if (! option_remote) {
01437 strncat(p, "#", sizeof(prompt) - strlen(prompt) - 1);
01438 } else {
01439 strncat(p, ">", sizeof(prompt) - strlen(prompt) - 1);
01440 }
01441 break;
01442 case '%': /* literal % */
01443 strncat(p, "%", sizeof(prompt) - strlen(prompt) - 1);
01444 break;
01445 case '\0': /* % is last character - prevent bug */
01446 t--;
01447 break;
01448 }
01449 while (*p != '\0') {
01450 p++;
01451 }
01452 t++;
01453 } else {
01454 *p = *t;
01455 p++;
01456 t++;
01457 }
01458 }
01459 if (color_used) {
01460 /* Force colors back to normal at end */
01461 term_color_code(term_code, COLOR_WHITE, COLOR_BLACK, sizeof(term_code));
01462 if (strlen(term_code) > sizeof(prompt) - strlen(prompt)) {
01463 strncat(prompt + sizeof(prompt) - strlen(term_code) - 1, term_code, strlen(term_code));
01464 } else {
01465 strncat(p, term_code, sizeof(term_code));
01466 }
01467 }
01468 } else if (remotehostname)
01469 snprintf(prompt, sizeof(prompt), ASTERISK_PROMPT2, remotehostname);
01470 else
01471 snprintf(prompt, sizeof(prompt), ASTERISK_PROMPT);
01472
01473 return(prompt);
01474 }
|
|
||||||||||||||||||||
|
Definition at line 345 of file asterisk.c. References AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, and strdup. 00346 {
00347 struct file_version *find;
00348 int which = 0;
00349 char *ret = NULL;
00350 int matchlen = strlen(word);
00351
00352 if (pos != 3)
00353 return NULL;
00354
00355 AST_LIST_LOCK(&file_versions);
00356 AST_LIST_TRAVERSE(&file_versions, find, list) {
00357 if (!strncasecmp(word, find->file, matchlen)) {
00358 if (++which > state) {
00359 ret = strdup(find->file);
00360 break;
00361 }
00362 }
00363 }
00364 AST_LIST_UNLOCK(&file_versions);
00365
00366 return ret;
00367 }
|
|
||||||||||||||||||||
|
Definition at line 959 of file asterisk.c. References consolethread, fix_header(), option_console, s, VERBOSE_PREFIX_1, VERBOSE_PREFIX_2, VERBOSE_PREFIX_3, and VERBOSE_PREFIX_4. Referenced by main(). 00960 {
00961 char tmp[80];
00962 const char *c=NULL;
00963 /* Return to the beginning of the line */
00964 if (!pos) {
00965 fprintf(stdout, "\r");
00966 if ((c = fix_header(tmp, sizeof(tmp), s, VERBOSE_PREFIX_4)) ||
00967 (c = fix_header(tmp, sizeof(tmp), s, VERBOSE_PREFIX_3)) ||
00968 (c = fix_header(tmp, sizeof(tmp), s, VERBOSE_PREFIX_2)) ||
00969 (c = fix_header(tmp, sizeof(tmp), s, VERBOSE_PREFIX_1)))
00970 fputs(tmp, stdout);
00971 }
00972 if (c)
00973 fputs(c + pos,stdout);
00974 else
00975 fputs(s + pos,stdout);
00976 fflush(stdout);
00977 if (complete) {
00978 /* Wake up a poll()ing console */
00979 if (option_console && consolethread != AST_PTHREADT_NULL)
00980 pthread_kill(consolethread, SIGURG);
00981 }
00982 }
|
|
|
Definition at line 994 of file asterisk.c. References ast_all_zeros(), ast_cli_command(), ast_el_add_history(), ast_safe_system(), s, and term_end(). Referenced by main(). 00995 {
00996 printf(term_end());
00997 fflush(stdout);
00998 /* Called when readline data is available */
00999 if (s && !ast_all_zeros(s))
01000 ast_el_add_history(s);
01001 /* Give the console access to the shell */
01002 if (s) {
01003 /* The real handler for bang */
01004 if (s[0] == '!') {
01005 if (s[1])
01006 ast_safe_system(s+1);
01007 else
01008 ast_safe_system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh");
01009 } else
01010 ast_cli_command(STDOUT_FILENO, s);
01011 } else
01012 fprintf(stdout, "\nUse \"quit\" to exit\n");
01013 }
|
|
||||||||||||
|
Definition at line 407 of file asterisk.c. References s. Referenced by ast_network_puts(), ast_remotecontrol(), cli_complete(), listener(), and netconsole(). 00408 {
00409 return write(fd, s, strlen(s) + 1);
00410 }
|
|
||||||||||||||||||||
|
Definition at line 948 of file asterisk.c. References COLOR_GRAY, s, and term_color(). Referenced by console_verboser(). 00949 {
00950 const char *c;
00951 if (!strncmp(s, cmp, strlen(cmp))) {
00952 c = s + strlen(cmp);
00953 term_color(outbuf, cmp, COLOR_GRAY, 0, maxout);
00954 return c;
00955 }
00956 return NULL;
00957 }
|
|
||||||||||||||||
|
Definition at line 1144 of file asterisk.c. References ast_cancel_shutdown(), and shuttingdown. 01145 {
01146 if (argc != 2)
01147 return RESULT_SHOWUSAGE;
01148 ast_cancel_shutdown();
01149 shuttingdown = 0;
01150 return RESULT_SUCCESS;
01151 }
|
|
||||||||||||||||
|
Definition at line 1153 of file asterisk.c. 01154 {
01155 return RESULT_SUCCESS;
01156 }
|
|
||||||||||||||||
|
Definition at line 1128 of file asterisk.c. References quit_handler(). 01129 {
01130 if (argc != 2)
01131 return RESULT_SHOWUSAGE;
01132 quit_handler(0, 1 /* nicely */, 1 /* safely */, 1 /* restart */);
01133 return RESULT_SUCCESS;
01134 }
|
|
||||||||||||||||
|
Definition at line 1120 of file asterisk.c. References quit_handler(). 01121 {
01122 if (argc != 2)
01123 return RESULT_SHOWUSAGE;
01124 quit_handler(0, 0 /* not nicely */, 1 /* safely */, 1 /* restart */);
01125 return RESULT_SUCCESS;
01126 }
|
|
||||||||||||||||
|
Definition at line 1136 of file asterisk.c. References quit_handler(). 01137 {
01138 if (argc != 3)
01139 return RESULT_SHOWUSAGE;
01140 quit_handler(0, 2 /* really nicely */, 1 /* safely */, 1 /* restart */);
01141 return RESULT_SUCCESS;
01142 }
|
|
||||||||||||||||
|
CLI command to list module versions Definition at line 291 of file asterisk.c. References ast_cli(), AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, and FORMAT. 00292 {
00293 #define FORMAT "%-25.25s %-40.40s\n"
00294 struct file_version *iterator;
00295 regex_t regexbuf;
00296 int havepattern = 0;
00297 int havename = 0;
00298 int count_files = 0;
00299
00300 switch (argc) {
00301 case 5:
00302 if (!strcasecmp(argv[3], "like")) {
00303 if (regcomp(®exbuf, argv[4], REG_EXTENDED | REG_NOSUB))
00304 return RESULT_SHOWUSAGE;
00305 havepattern = 1;
00306 } else
00307 return RESULT_SHOWUSAGE;
00308 break;
00309 case 4:
00310 havename = 1;
00311 break;
00312 case 3:
00313 break;
00314 default:
00315 return RESULT_SHOWUSAGE;
00316 }
00317
00318 ast_cli(fd, FORMAT, "File", "Revision");
00319 ast_cli(fd, FORMAT, "----", "--------");
00320 AST_LIST_LOCK(&file_versions);
00321 AST_LIST_TRAVERSE(&file_versions, iterator, list) {
00322 if (havename && strcasecmp(iterator->file, argv[3]))
00323 continue;
00324
00325 if (havepattern && regexec(®exbuf, iterator->file, 0, NULL, 0))
00326 continue;
00327
00328 ast_cli(fd, FORMAT, iterator->file, iterator->version);
00329 count_files++;
00330 if (havename)
00331 break;
00332 }
00333 AST_LIST_UNLOCK(&file_versions);
00334 if (!havename) {
00335 ast_cli(fd, "%d files listed.\n", count_files);
00336 }
00337
00338 if (havepattern)
00339 regfree(®exbuf);
00340
00341 return RESULT_SUCCESS;
00342 #undef FORMAT
00343 }
|
|
||||||||||||||||
|
Definition at line 1104 of file asterisk.c. References quit_handler(). 01105 {
01106 if (argc != 2)
01107 return RESULT_SHOWUSAGE;
01108 quit_handler(0, 1 /* nicely */, 1 /* safely */, 0 /* no restart */);
01109 return RESULT_SUCCESS;
01110 }
|
|
||||||||||||||||
|
Definition at line 1096 of file asterisk.c. References quit_handler(). 01097 {
01098 if (argc != 2)
01099 return RESULT_SHOWUSAGE;
01100 quit_handler(0, 0 /* Not nice */, 1 /* safely */, 0 /* not restart */);
01101 return RESULT_SUCCESS;
01102 }
|
|
||||||||||||||||
|
Definition at line 1112 of file asterisk.c. References quit_handler(). 01113 {
01114 if (argc != 3)
01115 return RESULT_SHOWUSAGE;
01116 quit_handler(0, 2 /* really nicely */, 1 /* safely */, 0 /* don't restart */);
01117 return RESULT_SUCCESS;
01118 }
|
|
|
Definition at line 745 of file asterisk.c. References _argv, ast_module_reload(), hup_handler(), and option_verbose. Referenced by hup_handler(), and main(). 00746 {
00747 if (option_verbose > 1)
00748 printf("Received HUP signal -- Reloading configs\n");
00749 if (restartnow)
00750 execvp(_argv[0], _argv);
00751 /* XXX This could deadlock XXX */
00752 ast_module_reload(NULL);
00753 signal(num, hup_handler);
00754 }
|
|
|
Definition at line 576 of file asterisk.c. References AF_LOCAL, ast_log(), ast_pthread_create, ast_socket, ast_verbose(), consoles, pollfd::events, console::fd, pollfd::fd, fdprint(), LOG_ERROR, LOG_WARNING, netconsole(), option_verbose, poll(), s, and VERBOSE_PREFIX_3. Referenced by ast_makesocket(). 00577 {
00578 struct sockaddr_un sunaddr;
00579 int s;
00580 socklen_t len;
00581 int x;
00582 int flags;
00583 struct pollfd fds[1];
00584 pthread_attr_t attr;
00585 pthread_attr_init(&attr);
00586 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
00587 for(;;) {
00588 if (ast_socket < 0)
00589 return NULL;
00590 fds[0].fd = ast_socket;
00591 fds[0].events= POLLIN;
00592 s = poll(fds, 1, -1);
00593 if (s < 0) {
00594 if (errno != EINTR)
00595 ast_log(LOG_WARNING, "poll returned error: %s\n", strerror(errno));
00596 continue;
00597 }
00598 len = sizeof(sunaddr);
00599 s = accept(ast_socket, (struct sockaddr *)&sunaddr, &len);
00600 if (s < 0) {
00601 if (errno != EINTR)
00602 ast_log(LOG_WARNING, "Accept returned %d: %s\n", s, strerror(errno));
00603 } else {
00604 for (x=0;x<AST_MAX_CONNECTS;x++) {
00605 if (consoles[x].fd < 0) {
00606 if (socketpair(AF_LOCAL, SOCK_STREAM, 0, consoles[x].p)) {
00607 ast_log(LOG_ERROR, "Unable to create pipe: %s\n", strerror(errno));
00608 consoles[x].fd = -1;
00609 fdprint(s, "Server failed to create pipe\n");
00610 close(s);
00611 break;
00612 }
00613 flags = fcntl(consoles[x].p[1], F_GETFL);
00614 fcntl(consoles[x].p[1], F_SETFL, flags | O_NONBLOCK);
00615 consoles[x].fd = s;
00616 if (ast_pthread_create(&consoles[x].t, &attr, netconsole, &consoles[x])) {
00617 ast_log(LOG_ERROR, "Unable to spawn thread to handle connection: %s\n", strerror(errno));
00618 consoles[x].fd = -1;
00619 fdprint(s, "Server failed to spawn thread\n");
00620 close(s);
00621 }
00622 break;
00623 }
00624 }
00625 if (x >= AST_MAX_CONNECTS) {
00626 fdprint(s, "No more connections allowed\n");
00627 ast_log(LOG_WARNING, "No more connections allowed\n");
00628 close(s);
00629 } else if (consoles[x].fd > -1) {
00630 if (option_verbose > 2)
00631 ast_verbose(VERBOSE_PREFIX_3 "Remote UNIX connection\n");
00632 }
00633 }
00634 }
00635 return NULL;
00636 }
|
|
||||||||||||
|
Definition at line 2008 of file asterisk.c. References __ast_mm_init(), __quit_handler(), _argv, ast_alaw_init(), ast_cdr_engine_init(), ast_channels_init(), ast_cli_register_multiple(), ast_config_AST_CONFIG_FILE, ast_config_AST_PID, ast_config_AST_RUN_GROUP, ast_config_AST_RUN_USER, ast_config_AST_SOCKET, ast_device_state_engine_init(), ast_el_initialize(), ast_el_read_history(), ast_enum_init(), ast_enum_reload(), ast_file_init(), ast_image_init(), ast_log(), ast_mainpid, ast_makesocket(), ast_readconfig(), ast_register_verbose(), ast_remotecontrol(), ast_rtp_init(), ast_rtp_reload(), ast_set_priority(), ast_startuptime, ast_strlen_zero(), ast_tryconnect(), ast_ulaw_init(), ast_utils_init(), ast_verbose(), astdb_init(), callerid_init(), child_handler(), COLOR_BLACK, COLOR_BRWHITE, console_verboser(), consolehandler(), consolethread, core_cli, dnsmgr_init(), dnsmgr_start_refresh(), el, el_hist, fully_booted, hup_handler(), init_framer(), init_logger(), init_manager(), load_modules(), load_pbx(), LOG_ERROR, LOG_WARNING, option_cache_record_files, option_console, option_debug, option_dumpcore, option_exec, option_highpriority, option_initcrypto, option_maxcalls, option_maxload, option_nocolor, option_nofork, option_overrideconfig, option_quiet, option_reconnect, option_remote, option_timestamp, option_verbose, poll(), quit_handler(), read_config_maps(), register_config_cli(), reload_logger(), reload_manager(), set_icon(), set_title(), setenv(), show_cli_help(), show_version(), tdd_init(), term_color(), term_end(), term_init(), term_quit(), test_for_thread_safety(), and urg_handler(). 02009 {
02010 int c;
02011 char filename[80] = "";
02012 char hostname[MAXHOSTNAMELEN]="";
02013 char tmp[80];
02014 char * xarg = NULL;
02015 int x;
02016 FILE *f;
02017 sigset_t sigs;
02018 int num;
02019 int is_child_of_nonroot=0;
02020 char *buf;
02021 char *runuser=NULL, *rungroup=NULL;
02022
02023 /* Remember original args for restart */
02024 if (argc > sizeof(_argv) / sizeof(_argv[0]) - 1) {
02025 fprintf(stderr, "Truncating argument size to %d\n", (int)(sizeof(_argv) / sizeof(_argv[0])) - 1);
02026 argc = sizeof(_argv) / sizeof(_argv[0]) - 1;
02027 }
02028 for (x=0;x<argc;x++)
02029 _argv[x] = argv[x];
02030 _argv[x] = NULL;
02031
02032 /* if the progname is rasterisk consider it a remote console */
02033 if (argv[0] && (strstr(argv[0], "rasterisk")) != NULL) {
02034 option_remote++;
02035 option_nofork++;
02036 }
02037 if (gethostname(hostname, sizeof(hostname)-1))
02038 ast_copy_string(hostname, "<Unknown>", sizeof(hostname));
02039 ast_mainpid = getpid();
02040 ast_ulaw_init();
02041 ast_alaw_init();
02042 callerid_init();
02043 ast_utils_init();
02044 tdd_init();
02045 /* When Asterisk restarts after it has dropped the root privileges,
02046 * it can't issue setuid(), setgid(), setgroups() or set_priority()
02047 * */
02048 if (getenv("ASTERISK_ALREADY_NONROOT"))
02049 is_child_of_nonroot=1;
02050 if (getenv("HOME"))
02051 snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
02052 /* Check if we're root */
02053 /*
02054 if (geteuid()) {
02055 ast_log(LOG_ERROR, "Must be run as root\n");
02056 exit(1);
02057 }
02058 */
02059 /* Check for options */
02060 while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:L:M:")) != -1) {
02061 switch(c) {
02062 case 'd':
02063 option_debug++;
02064 option_nofork++;
02065 break;
02066 case 'c':
02067 option_console++;
02068 option_nofork++;
02069 break;
02070 case 'f':
02071 option_nofork++;
02072 break;
02073 case 'n':
02074 option_nocolor++;
02075 break;
02076 case 'r':
02077 option_remote++;
02078 option_nofork++;
02079 break;
02080 case 'R':
02081 option_remote++;
02082 option_nofork++;
02083 option_reconnect++;
02084 break;
02085 case 'p':
02086 option_highpriority++;
02087 break;
02088 case 'v':
02089 option_verbose++;
02090 option_nofork++;
02091 break;
02092 case 'M':
02093 if ((sscanf(optarg, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0))
02094 option_maxcalls = 0;
02095 break;
02096 case 'L':
02097 if ((sscanf(optarg, "%lf", &option_maxload) != 1) || (option_maxload < 0.0))
02098 option_maxload = 0.0;
02099 break;
02100 case 'q':
02101 option_quiet++;
02102 break;
02103 case 't':
02104 option_cache_record_files++;
02105 break;
02106 case 'T':
02107 option_timestamp++;
02108 break;
02109 case 'x':
02110 option_exec++;
02111 xarg = optarg;
02112 break;
02113 case 'C':
02114 ast_copy_string((char *)ast_config_AST_CONFIG_FILE,optarg,sizeof(ast_config_AST_CONFIG_FILE));
02115 option_overrideconfig++;
02116 break;
02117 case 'i':
02118 option_initcrypto++;
02119 break;
02120 case'g':
02121 option_dumpcore++;
02122 break;
02123 case 'h':
02124 show_cli_help();
02125 exit(0);
02126 case 'V':
02127 show_version();
02128 exit(0);
02129 case 'U':
02130 runuser = optarg;
02131 break;
02132 case 'G':
02133 rungroup = optarg;
02134 break;
02135 case '?':
02136 exit(1);
02137 }
02138 }
02139
02140 /* For remote connections, change the name of the remote connection.
02141 * We do this for the benefit of init scripts (which need to know if/when
02142 * the main asterisk process has died yet). */
02143 if (option_remote) {
02144 strcpy(argv[0], "rasterisk");
02145 for (x = 1; x < argc; x++) {
02146 argv[x] = argv[0] + 10;
02147 }
02148 }
02149
02150 if (option_console && !option_verbose)
02151 ast_verbose("[ Reading Master Configuration ]");
02152 ast_readconfig();
02153
02154 if (option_dumpcore) {
02155 struct rlimit l;
02156 memset(&l, 0, sizeof(l));
02157 l.rlim_cur = RLIM_INFINITY;
02158 l.rlim_max = RLIM_INFINITY;
02159 if (setrlimit(RLIMIT_CORE, &l)) {
02160 ast_log(LOG_WARNING, "Unable to disable core size resource limit: %s\n", strerror(errno));
02161 }
02162 }
02163
02164 if ((!rungroup) && !ast_strlen_zero(ast_config_AST_RUN_GROUP))
02165 rungroup = ast_config_AST_RUN_GROUP;
02166 if ((!runuser) && !ast_strlen_zero(ast_config_AST_RUN_USER))
02167 runuser = ast_config_AST_RUN_USER;
02168 #ifndef __CYGWIN__
02169
02170 if (!is_child_of_nonroot)
02171 ast_set_priority(option_highpriority);
02172
02173 if (!is_child_of_nonroot && rungroup) {
02174 struct group *gr;
02175 gr = getgrnam(rungroup);
02176 if (!gr) {
02177 ast_log(LOG_WARNING, "No such group '%s'!\n", rungroup);
02178 exit(1);
02179 }
02180 if (setgid(gr->gr_gid)) {
02181 ast_log(LOG_WARNING, "Unable to setgid to %d (%s)\n", (int)gr->gr_gid, rungroup);
02182 exit(1);
02183 }
02184 if (setgroups(0, NULL)) {
02185 ast_log(LOG_WARNING, "Unable to drop unneeded groups\n");
02186 exit(1);
02187 }
02188 if (option_verbose)
02189 ast_verbose("Running as group '%s'\n", rungroup);
02190 }
02191
02192 if (!is_child_of_nonroot && runuser) {
02193 struct passwd *pw;
02194 pw = getpwnam(runuser);
02195 if (!pw) {
02196 ast_log(LOG_WARNING, "No such user '%s'!\n", runuser);
02197 exit(1);
02198 }
02199 if (!rungroup) {
02200 if (setgid(pw->pw_gid)) {
02201 ast_log(LOG_WARNING, "Unable to setgid to %d!\n", (int)pw->pw_gid);
02202 exit(1);
02203 }
02204 if (initgroups(pw->pw_name, pw->pw_gid)) {
02205 ast_log(LOG_WARNING, "Unable to init groups for '%s'\n", runuser);
02206 exit(1);
02207 }
02208 }
02209 if (setuid(pw->pw_uid)) {
02210 ast_log(LOG_WARNING, "Unable to setuid to %d (%s)\n", (int)pw->pw_uid, runuser);
02211 exit(1);
02212 }
02213 setenv("ASTERISK_ALREADY_NONROOT","yes",1);
02214 if (option_verbose)
02215 ast_verbose("Running as user '%s'\n", runuser);
02216 }
02217
02218 #endif /* __CYGWIN__ */
02219
02220 #ifdef linux
02221
02222 if (geteuid() && option_dumpcore) {
02223 if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) < 0) {
02224 ast_log(LOG_WARNING, "Unable to set the process for core dumps after changing to a non-root user. %s\n", strerror(errno));
02225 }
02226 }
02227
02228 #endif
02229
02230 term_init();
02231 printf(term_end());
02232 fflush(stdout);
02233
02234 if (option_console && !option_verbose)
02235 ast_verbose("[ Initializing Custom Configuration Options ]");
02236 /* custom config setup */
02237 register_config_cli();
02238 read_config_maps();
02239
02240
02241 if (option_console) {
02242 if (el_hist == NULL || el == NULL)
02243 ast_el_initialize();
02244
02245 if (!ast_strlen_zero(filename))
02246 ast_el_read_history(filename);
02247 }
02248
02249 if (ast_tryconnect()) {
02250 /* One is already running */
02251 if (option_remote) {
02252 if (option_exec) {
02253 ast_remotecontrol(xarg);
02254 quit_handler(0, 0, 0, 0);
02255 exit(0);
02256 }
02257 printf(term_quit());
02258 ast_register_verbose(console_verboser);
02259 WELCOME_MESSAGE;
02260 ast_remotecontrol(NULL);
02261 quit_handler(0, 0, 0, 0);
02262 exit(0);
02263 } else {
02264 ast_log(LOG_ERROR, "Asterisk already running on %s. Use 'asterisk -r' to connect.\n", (char *)ast_config_AST_SOCKET);
02265 printf(term_quit());
02266 exit(1);
02267 }
02268 } else if (option_remote || option_exec) {
02269 ast_log(LOG_ERROR, "Unable to connect to remote asterisk (does %s exist?)\n",ast_config_AST_SOCKET);
02270 printf(term_quit());
02271 exit(1);
02272 }
02273 /* Blindly write pid file since we couldn't connect */
02274 unlink((char *)ast_config_AST_PID);
02275 f = fopen((char *)ast_config_AST_PID, "w");
02276 if (f) {
02277 fprintf(f, "%d\n", (int)getpid());
02278 fclose(f);
02279 } else
02280 ast_log(LOG_WARNING, "Unable to open pid file '%s': %s\n", (char *)ast_config_AST_PID, strerror(errno));
02281
02282 if (!option_verbose && !option_debug && !option_nofork && !option_console) {
02283 daemon(0,0);
02284 /* Blindly re-write pid file since we are forking */
02285 unlink((char *)ast_config_AST_PID);
02286 f = fopen((char *)ast_config_AST_PID, "w");
02287 if (f) {
02288 fprintf(f, "%d\n", (int)getpid());
02289 fclose(f);
02290 } else
02291 ast_log(LOG_WARNING, "Unable to open pid file '%s': %s\n", (char *)ast_config_AST_PID, strerror(errno));
02292 }
02293
02294 /* Test recursive mutex locking. */
02295 if (test_for_thread_safety())
02296 ast_verbose("Warning! Asterisk is not thread safe.\n");
02297
02298 ast_makesocket();
02299 sigemptyset(&sigs);
02300 sigaddset(&sigs, SIGHUP);
02301 sigaddset(&sigs, SIGTERM);
02302 sigaddset(&sigs, SIGINT);
02303 sigaddset(&sigs, SIGPIPE);
02304 sigaddset(&sigs, SIGWINCH);
02305 pthread_sigmask(SIG_BLOCK, &sigs, NULL);
02306 if (option_console || option_verbose || option_remote)
02307 ast_register_verbose(console_verboser);
02308 /* Print a welcome message if desired */
02309 if (option_verbose || option_console) {
02310 WELCOME_MESSAGE;
02311 }
02312 if (option_console && !option_verbose)
02313 ast_verbose("[ Booting...");
02314
02315 signal(SIGURG, urg_handler);
02316 signal(SIGINT, __quit_handler);
02317 signal(SIGTERM, __quit_handler);
02318 signal(SIGHUP, hup_handler);
02319 signal(SIGCHLD, child_handler);
02320 signal(SIGPIPE, SIG_IGN);
02321
02322 /* ensure that the random number generators are seeded with a different value every time
02323 Asterisk is started
02324 */
02325 srand((unsigned int) getpid() + (unsigned int) time(NULL));
02326 srandom((unsigned int) getpid() + (unsigned int) time(NULL));
02327
02328 if (init_logger()) {
02329 printf(term_quit());
02330 exit(1);
02331 }
02332 if (dnsmgr_init()) {
02333 printf(term_quit());
02334 exit(1);
02335 }
02336 /* load 'preload' modules, required for access to Realtime-mapped configuration files */
02337 if (load_modules(1)) {
02338 printf(term_quit());
02339 exit(1);
02340 }
02341 ast_channels_init();
02342 if (init_manager()) {
02343 printf(term_quit());
02344 exit(1);
02345 }
02346 if (ast_cdr_engine_init()) {
02347 printf(term_quit());
02348 exit(1);
02349 }
02350 if (ast_device_state_engine_init()) {
02351 printf(term_quit());
02352 exit(1);
02353 }
02354 ast_rtp_init();
02355 if (ast_image_init()) {
02356 printf(term_quit());
02357 exit(1);
02358 }
02359 if (ast_file_init()) {
02360 printf(term_quit());
02361 exit(1);
02362 }
02363 if (load_pbx()) {
02364 printf(term_quit());
02365 exit(1);
02366 }
02367 if (load_modules(0)) {
02368 printf(term_quit());
02369 exit(1);
02370 }
02371 if (init_framer()) {
02372 printf(term_quit());
02373 exit(1);
02374 }
02375 if (astdb_init()) {
02376 printf(term_quit());
02377 exit(1);
02378 }
02379 if (ast_enum_init()) {
02380 printf(term_quit());
02381 exit(1);
02382 }
02383
02384 dnsmgr_start_refresh();
02385
02386 #if 0
02387 /* This should no longer be necessary */
02388 /* sync cust config and reload some internals in case a custom config handler binded to them */
02389 read_ast_cust_config();
02390 reload_logger(0);
02391 reload_manager();
02392 ast_enum_reload();
02393 ast_rtp_reload();
02394 #endif
02395
02396
02397 /* We might have the option of showing a console, but for now just
02398 do nothing... */
02399 if (option_console && !option_verbose)
02400 ast_verbose(" ]\n");
02401 if (option_verbose || option_console)
02402 ast_verbose(term_color(tmp, "Asterisk Ready.\n", COLOR_BRWHITE, COLOR_BLACK, sizeof(tmp)));
02403 if (option_nofork)
02404 consolethread = pthread_self();
02405 fully_booted = 1;
02406 pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
02407 #ifdef __AST_DEBUG_MALLOC
02408 __ast_mm_init();
02409 #endif
02410 time(&ast_startuptime);
02411 ast_cli_register_multiple(core_cli, sizeof(core_cli) / sizeof(core_cli[0]));
02412 if (option_console) {
02413 /* Console stuff now... */
02414 /* Register our quit function */
02415 char title[256];
02416 set_icon("Asterisk");
02417 snprintf(title, sizeof(title), "Asterisk Console on '%s' (pid %d)", hostname, ast_mainpid);
02418 set_title(title);
02419
02420 for (;;) {
02421 buf = (char *)el_gets(el, &num);
02422 if (buf) {
02423 if (buf[strlen(buf)-1] == '\n')
02424 buf[strlen(buf)-1] = '\0';
02425
02426 consolehandler((char *)buf);
02427 } else {
02428 if (write(STDOUT_FILENO, "\nUse EXIT or QUIT to exit the asterisk console\n",
02429 strlen("\nUse EXIT or QUIT to exit the asterisk console\n")) < 0) {
02430 /* Whoa, stdout disappeared from under us... Make /dev/null's */
02431 int fd;
02432 fd = open("/dev/null", O_RDWR);
02433 if (fd > -1) {
02434 dup2(fd, STDOUT_FILENO);
02435 dup2(fd, STDIN_FILENO);
02436 } else
02437 ast_log(LOG_WARNING, "Failed to open /dev/null to recover from dead console. Bad things will happen!\n");
02438 break;
02439 }
02440 }
02441 }
02442
02443 }
02444 /* Do nothing */
02445 for(;;) { /* apparently needed for the MACos */
02446 struct pollfd p = { -1 /* no descriptor */, 0, 0 };
02447 poll(&p, 0, -1);
02448 }
02449 return 0;
02450 }
|
|
|
Definition at line 521 of file asterisk.c. References ast_cli_command(), ast_log(), ast_mainpid, ast_verbose(), ASTERISK_VERSION, pollfd::events, pollfd::fd, console::fd, fdprint(), LOG_ERROR, LOG_WARNING, option_verbose, console::p, poll(), pollfd::revents, and VERBOSE_PREFIX_3. Referenced by listener(). 00522 {
00523 struct console *con = vconsole;
00524 char hostname[MAXHOSTNAMELEN]="";
00525 char tmp[512];
00526 int res;
00527 struct pollfd fds[2];
00528
00529 if (gethostname(hostname, sizeof(hostname)-1))
00530 ast_copy_string(hostname, "<Unknown>", sizeof(hostname));
00531 snprintf(tmp, sizeof(tmp), "%s/%d/%s\n", hostname, ast_mainpid, ASTERISK_VERSION);
00532 fdprint(con->fd, tmp);
00533 for(;;) {
00534 fds[0].fd = con->fd;
00535 fds[0].events = POLLIN;
00536 fds[0].revents = 0;
00537 fds[1].fd = con->p[0];
00538 fds[1].events = POLLIN;
00539 fds[1].revents = 0;
00540
00541 res = poll(fds, 2, -1);
00542 if (res < 0) {
00543 if (errno != EINTR)
00544 ast_log(LOG_WARNING, "poll returned < 0: %s\n", strerror(errno));
00545 continue;
00546 }
00547 if (fds[0].revents) {
00548 res = read(con->fd, tmp, sizeof(tmp));
00549 if (res < 1) {
00550 break;
00551 }
00552 tmp[res] = 0;
00553 ast_cli_command(con->fd, tmp);
00554 }
00555 if (fds[1].revents) {
00556 res = read(con->p[0], tmp, sizeof(tmp));
00557 if (res < 1) {
00558 ast_log(LOG_ERROR, "read returned %d\n", res);
00559 break;
00560 }
00561 res = write(con->fd, tmp, res);
00562 if (res < 1)
00563 break;
00564 }
00565 }
00566 if (option_verbose > 2)
00567 ast_verbose(VERBOSE_PREFIX_3 "Remote UNIX connection disconnected\n");
00568 close(con->fd);
00569 close(con->p[0]);
00570 close(con->p[1]);
00571 con->fd = -1;
00572
00573 return NULL;
00574 }
|
|
||||||||||||||||||||
|
Definition at line 500 of file asterisk.c. References ast_log(), ast_network_puts(), LOG_ERROR, and s. Referenced by ast_makesocket(). 00502 {
00503 if (replace) {
00504 char *t = alloca(strlen(s) + 2);
00505 if (t) {
00506 sprintf(t, "\r%s", s);
00507 if (complete)
00508 ast_network_puts(t);
00509 } else {
00510 ast_log(LOG_ERROR, "Out of memory\n");
00511 ast_network_puts(s);
00512 }
00513 } else {
00514 if (complete)
00515 ast_network_puts(s);
00516 }
00517 }
|
|
|
NULL handler so we can collect the child exit status Definition at line 413 of file asterisk.c. Referenced by ast_safe_system(). 00414 {
00415
00416 }
|
|
||||||||||||||||||||
|
Definition at line 837 of file asterisk.c. References _argv, ast_active_channels(), ast_begin_shutdown(), ast_cdr_engine_term(), ast_config_AST_PID, ast_config_AST_SOCKET, ast_consock, ast_el_write_history(), ast_log(), ast_run_atexits(), ast_socket, ast_strlen_zero(), ast_verbose(), close_logger(), consolethread, el, el_hist, EVENT_FLAG_SYSTEM, LOG_DEBUG, manager_event(), option_console, option_verbose, restartnow, s, shuttingdown, and term_quit(). Referenced by __quit_handler(), ast_el_read_char(), handle_restart_gracefully(), handle_restart_now(), handle_restart_when_convenient(), handle_shutdown_gracefully(), handle_shutdown_now(), handle_shutdown_when_convenient(), main(), and remoteconsolehandler(). 00838 {
00839 char filename[80] = "";
00840 time_t s,e;
00841 int x;
00842 /* Try to get as many CDRs as possible submitted to the backend engines (if in batch mode) */
00843 ast_cdr_engine_term();
00844 if (safeshutdown) {
00845 shuttingdown = 1;
00846 if (!nice) {
00847 /* Begin shutdown routine, hanging up active channels */
00848 ast_begin_shutdown(1);
00849 if (option_verbose && option_console)
00850 ast_verbose("Beginning asterisk %s....\n", restart ? "restart" : "shutdown");
00851 time(&s);
00852 for(;;) {
00853 time(&e);
00854 /* Wait up to 15 seconds for all channels to go away */
00855 if ((e - s) > 15)
00856 break;
00857 if (!ast_active_channels())
00858 break;
00859 if (!shuttingdown)
00860 break;
00861 /* Sleep 1/10 of a second */
00862 usleep(100000);
00863 }
00864 } else {
00865 if (nice < 2)
00866 ast_begin_shutdown(0);
00867 if (option_verbose && option_console)
00868 ast_verbose("Waiting for inactivity to perform %s...\n", restart ? "restart" : "halt");
00869 for(;;) {
00870 if (!ast_active_channels())
00871 break;
00872 if (!shuttingdown)
00873 break;
00874 sleep(1);
00875 }
00876 }
00877
00878 if (!shuttingdown) {
00879 if (option_verbose && option_console)
00880 ast_verbose("Asterisk %s cancelled.\n", restart ? "restart" : "shutdown");
00881 return;
00882 }
00883 }
00884 if (option_console || option_remote) {
00885 if (getenv("HOME"))
00886 snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
00887 if (!ast_strlen_zero(filename))
00888 ast_el_write_history(filename);
00889 if (el != NULL)
00890 el_end(el);
00891 if (el_hist != NULL)
00892 history_end(el_hist);
00893 }
00894 if (option_verbose)
00895 ast_verbose("Executing last minute cleanups\n");
00896 ast_run_atexits();
00897 /* Called on exit */
00898 if (option_verbose && option_console)
00899 ast_verbose("Asterisk %s ending (%d).\n", ast_active_channels() ? "uncleanly" : "cleanly", num);
00900 else if (option_debug)
00901 ast_log(LOG_DEBUG, "Asterisk ending (%d).\n", num);
00902 manager_event(EVENT_FLAG_SYSTEM, "Shutdown", "Shutdown: %s\r\nRestart: %s\r\n", ast_active_channels() ? "Uncleanly" : "Cleanly", restart ? "True" : "False");
00903 if (ast_socket > -1) {
00904 close(ast_socket);
00905 ast_socket = -1;
00906 }
00907 if (ast_consock > -1)
00908 close(ast_consock);
00909 if (ast_socket > -1)
00910 unlink((char *)ast_config_AST_SOCKET);
00911 if (!option_remote) unlink((char *)ast_config_AST_PID);
00912 printf(term_quit());
00913 if (restart) {
00914 if (option_verbose || option_console)
00915 ast_verbose("Preparing for Asterisk restart...\n");
00916 /* Mark all FD's for closing on exec */
00917 for (x=3;x<32768;x++) {
00918 fcntl(x, F_SETFD, FD_CLOEXEC);
00919 }
00920 if (option_verbose || option_console)
00921 ast_verbose("Restarting Asterisk NOW...\n");
00922 restartnow = 1;
00923
00924 /* close logger */
00925 close_logger();
00926
00927 /* If there is a consolethread running send it a SIGHUP
00928 so it can execvp, otherwise we can do it ourselves */
00929 if ((consolethread != AST_PTHREADT_NULL) && (consolethread != pthread_self())) {
00930 pthread_kill(consolethread, SIGHUP);
00931 /* Give the signal handler some time to complete */
00932 sleep(2);
00933 } else
00934 execvp(_argv[0], _argv);
00935
00936 } else {
00937 /* close logger */
00938 close_logger();
00939 }
00940 exit(0);
00941 }
|
|
|
Definition at line 1015 of file asterisk.c. References ast_all_zeros(), ast_el_add_history(), ast_safe_system(), quit_handler(), and s. Referenced by ast_remotecontrol(). 01016 {
01017 int ret = 0;
01018 /* Called when readline data is available */
01019 if (s && !ast_all_zeros(s))
01020 ast_el_add_history(s);
01021 /* Give the console access to the shell */
01022 if (s) {
01023 /* The real handler for bang */
01024 if (s[0] == '!') {
01025 if (s[1])
01026 ast_safe_system(s+1);
01027 else
01028 ast_safe_system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh");
01029 ret = 1;
01030 }
01031 if ((strncasecmp(s, "quit", 4) == 0 || strncasecmp(s, "exit", 4) == 0) &&
01032 (s[4] == '\0' || isspace(s[4]))) {
01033 quit_handler(0, 0, 0, 0);
01034 ret = 1;
01035 }
01036 } else
01037 fprintf(stdout, "\nUse \"quit\" to exit\n");
01038
01039 return ret;
01040 }
|
|
|
Definition at line 778 of file asterisk.c. References text. Referenced by main(). 00779 {
00780 if (getenv("TERM") && strstr(getenv("TERM"), "xterm"))
00781 fprintf(stdout, "\033]1;%s\007", text);
00782 }
|
|
|
Set an X-term or screen title Definition at line 772 of file asterisk.c. References text. Referenced by main(). 00773 {
00774 if (getenv("TERM") && strstr(getenv("TERM"), "xterm"))
00775 fprintf(stdout, "\033]2;%s\007", text);
00776 }
|
|
|
Definition at line 1835 of file asterisk.c. References ASTERISK_VERSION. Referenced by main(). 01835 {
01836 printf("Asterisk " ASTERISK_VERSION ", Copyright (C) 1999 - 2005, Digium, Inc. and others.\n");
01837 printf("Usage: asterisk [OPTIONS]\n");
01838 printf("Valid Options:\n");
01839 printf(" -V Display version number and exit\n");
01840 printf(" -C <configfile> Use an alternate configuration file\n");
01841 printf(" -G <group> Run as a group other than the caller\n");
01842 printf(" -U <user> Run as a user other than the caller\n");
01843 printf(" -c Provide console CLI\n");
01844 printf(" -d Enable extra debugging\n");
01845 printf(" -f Do not fork\n");
01846 printf(" -g Dump core in case of a crash\n");
01847 printf(" -h This help screen\n");
01848 printf(" -i Initialize crypto keys at startup\n");
01849 printf(" -n Disable console colorization\n");
01850 printf(" -p Run as pseudo-realtime thread\n");
01851 printf(" -q Quiet mode (suppress output)\n");
01852 printf(" -r Connect to Asterisk on this machine\n");
01853 printf(" -R Connect to Asterisk, and attempt to reconnect if disconnected\n");
01854 printf(" -t Record soundfiles in /var/tmp and move them where they belong after they are done.\n");
01855 printf(" -T Display the time in [Mmm dd hh:mm:ss] format for each line of output to the CLI.\n");
01856 printf(" -v Increase verbosity (multiple v's = more verbose)\n");
01857 printf(" -x <cmd> Execute command <cmd> (only valid with -r)\n");
01858 printf("\n");
01859 return 0;
01860 }
|
|
||||||||||||||||
|
Definition at line 1211 of file asterisk.c. References ast_cli(), and license_lines. 01212 {
01213 int x;
01214
01215 for (x = 0; x < sizeof(license_lines) / sizeof(license_lines[0]); x++)
01216 ast_cli(fd, (char *) license_lines[x]);
01217
01218 return RESULT_SUCCESS;
01219 }
|
|
|
Definition at line 1829 of file asterisk.c. References ASTERISK_VERSION. Referenced by main(). 01830 {
01831 printf("Asterisk " ASTERISK_VERSION "\n");
01832 return 0;
01833 }
|
|
||||||||||||||||
|
Definition at line 1182 of file asterisk.c. References ast_cli(), and warranty_lines. 01183 {
01184 int x;
01185
01186 for (x = 0; x < sizeof(warranty_lines) / sizeof(warranty_lines[0]); x++)
01187 ast_cli(fd, (char *) warranty_lines[x]);
01188
01189 return RESULT_SUCCESS;
01190 }
|
|
|
Urgent handler Called by soft_hangup to interrupt the poll, read, or other system call. We don't actually need to do anything though. Remember: Cannot EVER ast_log from within a signal handler SLD: seems to be some pthread activity relating to the printf anyway: which is leading to a deadlock? Definition at line 735 of file asterisk.c. References option_debug, and urg_handler(). Referenced by main(), and urg_handler(). 00736 {
00737 #if 0
00738 if (option_debug > 2)
00739 printf("-- Asterisk Urgent handler\n");
00740 #endif
00741 signal(num, urg_handler);
00742 return;
00743 }
|
|
|
Definition at line 232 of file asterisk.c. Referenced by hup_handler(), main(), and quit_handler(). |
|
|
Initial value: "Usage: abort shutdown\n" " Causes Asterisk to abort an executing shutdown or restart, and resume normal\n" " call operations.\n" Definition at line 1042 of file asterisk.c. |
|
|
Definition at line 219 of file asterisk.c. Referenced by ast_readconfig(), and launch_script(). |
|
|
Definition at line 212 of file asterisk.c. Referenced by ast_ael_compile(), ast_readconfig(), compile_script(), config_text_file_load(), config_text_file_save(), handle_save_dialplan(), ices_exec(), and vm_change_password(). |
|
|
Definition at line 213 of file asterisk.c. Referenced by ast_readconfig(), and main(). |
|
|
Definition at line 230 of file asterisk.c. Referenced by ast_readconfig(). |
|
|
Definition at line 229 of file asterisk.c. Referenced by ast_makesocket(), and ast_readconfig(). |
|
|
Definition at line 228 of file asterisk.c. Referenced by ast_makesocket(), and ast_readconfig(). |
|
|
Definition at line 227 of file asterisk.c. Referenced by ast_makesocket(), and ast_readconfig(). |
|
|
Definition at line 220 of file asterisk.c. Referenced by ast_readconfig(), and dbinit(). |
|
|
Definition at line 221 of file asterisk.c. Referenced by ast_readconfig(), crypto_load(), init_keys(), and osp_build(). |
|
|
Definition at line 218 of file asterisk.c. Referenced by ast_readconfig(), csv_log(), init_logger(), load_config(), load_module(), make_logchannel(), reload_logger(), testclient_exec(), testserver_exec(), and writefile(). |
|
|
Definition at line 214 of file asterisk.c. Referenced by __load_resource(), add_module(), ast_readconfig(), complete_fn(), file_ok_sel(), and load_modules(). |
|
|
Definition at line 216 of file asterisk.c. Referenced by ast_monitor_change_fname(), ast_monitor_start(), ast_readconfig(), chanspy_exec(), and mixmonitor_exec(). |
|
|
Definition at line 222 of file asterisk.c. Referenced by ast_readconfig(), main(), and quit_handler(). |
|
|
Definition at line 224 of file asterisk.c. Referenced by ast_readconfig(). |
|
|
Definition at line 226 of file asterisk.c. Referenced by ast_readconfig(), and main(). |
|
|
Definition at line 225 of file asterisk.c. Referenced by ast_readconfig(), and main(). |
|
|
Definition at line 223 of file asterisk.c. Referenced by ast_makesocket(), ast_readconfig(), ast_tryconnect(), main(), and quit_handler(). |
|
|
Definition at line 215 of file asterisk.c. Referenced by ast_readconfig(), conf_run(), dictate_exec(), hasvoicemail_internal(), load_module(), and play_mailbox_owner(). |
|
|
Definition at line 217 of file asterisk.c. Referenced by ast_linear_stream(), ast_readconfig(), build_filename(), make_filename(), and reload_firmware(). |
|
|
UNIX Socket for controlling another asterisk Definition at line 182 of file asterisk.c. Referenced by ast_el_read_char(), ast_remotecontrol(), ast_tryconnect(), cli_complete(), and quit_handler(). |
|
|
Definition at line 198 of file asterisk.c. Referenced by ast_module_reload(). |
|
|
Definition at line 183 of file asterisk.c. Referenced by main(), netconsole(), and safe_append(). |
|
|
UNIX Socket for allowing remote control Definition at line 181 of file asterisk.c. Referenced by ast_makesocket(), listener(), and quit_handler(). |
|
|
Definition at line 197 of file asterisk.c. Referenced by main(). |
|
|
Referenced by ast_register_atexit(), and ast_unregister_atexit(). |
|
|
Initial value: "Usage: !<command>\n" " Executes a given shell command\n" Definition at line 1074 of file asterisk.c. |
|
|
Definition at line 204 of file asterisk.c. Referenced by ast_makesocket(), ast_network_puts(), and listener(). |
|
|
Definition at line 235 of file asterisk.c. Referenced by console_verboser(), main(), and quit_handler(). |
|
|
Definition at line 1225 of file asterisk.c. Referenced by main(). |
|
|
Definition at line 179 of file asterisk.c. Referenced by ast_log(), and handle_debuglevel(). |
|
|
Definition at line 206 of file asterisk.c. Referenced by ast_channel_alloc(). |
|
|
Definition at line 201 of file asterisk.c. Referenced by ast_el_add_history(), ast_el_initialize(), ast_el_read_history(), ast_el_write_history(), ast_remotecontrol(), cli_complete(), main(), and quit_handler(). |
|
|
Definition at line 200 of file asterisk.c. Referenced by ast_el_add_history(), ast_el_initialize(), ast_el_read_history(), ast_el_write_history(), ast_remotecontrol(), main(), and quit_handler(). |
|
|
Definition at line 177 of file asterisk.c. Referenced by main(). |
|
|
Definition at line 1192 of file asterisk.c. Referenced by show_license(). |
|
|
Definition at line 519 of file asterisk.c. Referenced by ast_makesocket(). |
|
|
Definition at line 178 of file asterisk.c. Referenced by ast_readconfig(), and ast_writefile(). |
|
|
Definition at line 202 of file asterisk.c. Referenced by ast_remotecontrol(), and cli_prompt(). |
|
|
Initial value: "Usage: restart gracefully\n" " Causes Asterisk to stop accepting new calls and exec() itself performing a cold\n" " restart when all active calls have ended.\n" Definition at line 1065 of file asterisk.c. |
|
|
Initial value: "Usage: restart now\n" " Causes Asterisk to hangup all calls and exec() itself performing a cold\n" " restart.\n" Definition at line 1060 of file asterisk.c. |
|
|
Initial value: "Usage: restart when convenient\n" " Causes Asterisk to perform a cold restart when all active calls have ended.\n" Definition at line 1070 of file asterisk.c. |
|
|
Definition at line 234 of file asterisk.c. Referenced by quit_handler(). |
|
|
Definition at line 419 of file asterisk.c. Referenced by ast_safe_system(). |
|
|
Definition at line 420 of file asterisk.c. Referenced by ast_safe_system(). |
|
|
Initial value: "Usage: show license\n" " Shows the license(s) for this copy of Asterisk.\n" Definition at line 1082 of file asterisk.c. |
|
|
Initial value: "Usage: show version files [like <pattern>]\n" " Shows the revision numbers of the files used to build this copy of Asterisk.\n" " Optional regular expression pattern is used to filter the file list.\n" Definition at line 285 of file asterisk.c. |
|
|
Initial value: "Usage: show warranty\n" " Shows the warranty (if any) for this copy of Asterisk.\n" Definition at line 1078 of file asterisk.c. |
|
|
Initial value: "Usage: stop gracefully\n" " Causes Asterisk to not accept new calls, and exit when all\n" " active calls have terminated normally.\n" Definition at line 1051 of file asterisk.c. |
|
|
Initial value: "Usage: stop now\n" " Shuts down a running Asterisk immediately, hanging up all active calls .\n" Definition at line 1047 of file asterisk.c. |
|
|
Initial value: "Usage: stop when convenient\n" " Causes Asterisk to perform a shutdown when all active calls have ended.\n" Definition at line 1056 of file asterisk.c. |
|
|
Definition at line 233 of file asterisk.c. Referenced by handle_abort_halt(), and quit_handler(). |
|
|
Definition at line 1157 of file asterisk.c. Referenced by show_warranty(). |
1.3.9.1