154 #undef sched_setscheduler
156 #include <sys/time.h>
161 #include <sys/wait.h>
163 #include <sys/resource.h>
166 #include <sys/stat.h>
167 #if defined(HAVE_SYSINFO)
168 #include <sys/sysinfo.h>
169 #elif defined(HAVE_SYSCTL)
170 #include <sys/param.h>
171 #include <sys/sysctl.h>
172 #include <sys/vmmeter.h>
173 #if defined(__FreeBSD__) || defined(__DragonFly__)
174 #include <vm/vm_param.h>
176 #if defined(HAVE_SWAPCTL)
177 #include <sys/swap.h>
181 #include <histedit.h>
184 int daemon(
int,
int);
185 #include <sys/loadavg.h>
189 #include <sys/prctl.h>
191 #include <sys/capability.h>
247 #include "../defaults.h"
292 #define AF_LOCAL AF_UNIX
293 #define PF_LOCAL PF_UNIX
296 #define AST_MAX_CONNECTS 128
300 #define COPYRIGHT_TAG "Copyright (C) 1999 - 2021, Sangoma Technologies Corporation and others."
303 #define WELCOME_MESSAGE \
304 ast_verbose("Asterisk %s, " COPYRIGHT_TAG "\n" \
305 "Created by Mark Spencer <markster@digium.com>\n" \
306 "Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.\n" \
307 "This is free software, with components licensed under the GNU General Public\n" \
308 "License version 2 and other licenses; you are welcome to redistribute it under\n" \
309 "certain conditions. Type 'core show license' for details.\n" \
310 "=========================================================================\n", ast_get_version()) \
352 static void asterisk_daemon(
int isroot,
const char *runuser,
const char *rungroup);
393 static cap_t child_cap;
404 #if !defined(LOW_MEMORY)
422 new->id = pthread_self();
436 if ((
void *) x->id ==
id) {
454 if (!(f = fopen(filename,
"r"))) {
458 while ((
c = fgetc(f)) != EOF) {
474 #if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
480 e->
command =
"core show settings";
481 e->
usage =
"Usage: core show settings\n"
482 " Show core misc settings";
491 ast_cli(
a->fd,
"\nPBX Core settings\n");
492 ast_cli(
a->fd,
"-----------------\n");
498 ast_cli(
a->fd,
" Maximum calls: Not set\n");
500 if (getrlimit(RLIMIT_NOFILE, &
limits)) {
501 ast_cli(
a->fd,
" Maximum open file handles: Error because of %s\n", strerror(
errno));
502 }
else if (
limits.rlim_cur == RLIM_INFINITY) {
503 ast_cli(
a->fd,
" Maximum open file handles: Unlimited\n");
507 ast_cli(
a->fd,
" Maximum open file handles: %d\n", (
int)
limits.rlim_cur);
515 print_file(
a->fd,
" Core dump file: ",
"/proc/sys/kernel/core_pattern");
517 #if defined(HAVE_SYSINFO)
530 ast_cli(
a->fd,
" Entity ID: %s\n", eid_str);
531 ast_cli(
a->fd,
" PBX UUID: %s\n", pbx_uuid);
535 #if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
536 #if defined(HAVE_EUIDACCESS) && !defined(HAVE_EACCESS)
537 #define eaccess euidaccess
539 if (!getcwd(dir,
sizeof(dir))) {
540 if (eaccess(dir, R_OK | X_OK | F_OK)) {
541 ast_cli(
a->fd,
" Running directory: %s\n",
"Unable to access");
543 ast_cli(
a->fd,
" Running directory: %s (%s)\n", dir,
"Unable to access");
546 ast_cli(
a->fd,
" Running directory: %s\n", dir);
556 #if !defined(LOW_MEMORY)
562 ast_cli(
a->fd,
" RTP dynamic payload types: %u,%u-%u\n",
566 ast_cli(
a->fd,
" RTP dynamic payload types: %u-%u,%u-%u\n",
570 ast_cli(
a->fd,
" RTP dynamic payload types: %u-%u\n",
583 ast_cli(
a->fd,
"\n* Directories\n");
607 e->
command =
"core show threads";
609 "Usage: core show threads\n"
610 " List threads currently active in the system.\n";
618 ast_cli(
a->fd,
"%p %d %s\n", (
void *)cur->id, cur->lwp, cur->name);
622 ast_cli(
a->fd,
"%d threads listed.\n", count);
626 #if defined (HAVE_SYSCTL) && defined(HAVE_SWAPCTL)
631 static int swapmode(
int *used,
int *
total)
633 struct swapent *swdev;
634 int nswap, rnswap, i;
636 nswap = swapctl(SWAP_NSWAP, 0, 0);
644 rnswap = swapctl(SWAP_STATS, swdev, nswap);
654 for (i = 0; i < nswap; i++) {
655 if (swdev[i].se_flags & SWF_ENABLE) {
656 *used += (swdev[i].se_inuse / (1024 / DEV_BSIZE));
657 *
total += (swdev[i].se_nblks / (1024 / DEV_BSIZE));
665 #if defined(HAVE_SYSINFO) || defined(HAVE_SYSCTL)
669 uint64_t physmem, freeram;
670 #if defined(HAVE_SYSINFO) || defined(HAVE_SWAPCTL)
672 uint64_t freeswap = 0;
676 #if defined(HAVE_SYSINFO)
677 struct sysinfo sys_info;
678 #elif defined(HAVE_SYSCTL)
679 static int pageshift;
680 struct vmtotal vmtotal;
681 struct timeval boottime;
683 int mib[2], pagesize;
684 #if defined(HAVE_SWAPCTL)
692 e->
command =
"core show sysinfo";
694 "Usage: core show sysinfo\n"
695 " List current system information.\n";
701 #if defined(HAVE_SYSINFO)
703 uptime = sys_info.uptime / 3600;
704 physmem = sys_info.totalram * sys_info.mem_unit;
705 freeram = (sys_info.freeram * sys_info.mem_unit) / 1024;
706 totalswap = (sys_info.totalswap * sys_info.mem_unit) / 1024;
707 freeswap = (sys_info.freeswap * sys_info.mem_unit) / 1024;
708 nprocs = sys_info.procs;
709 #elif defined(HAVE_SYSCTL)
713 mib[1] = KERN_BOOTTIME;
714 len =
sizeof(boottime);
715 if (sysctl(mib, 2, &boottime, &
len,
NULL, 0) != -1) {
716 uptime = now - boottime.tv_sec;
718 uptime = uptime/3600;
721 #if defined(HW_PHYSMEM64)
722 mib[1] = HW_PHYSMEM64;
726 len =
sizeof(physmem);
727 sysctl(mib, 2, &physmem, &
len,
NULL, 0);
729 pagesize = getpagesize();
731 while (pagesize > 1) {
742 len =
sizeof(vmtotal);
743 sysctl(mib, 2, &vmtotal, &
len,
NULL, 0);
744 freeram = (vmtotal.t_free << pageshift);
746 #if defined(HAVE_SWAPCTL)
747 swapmode(&usedswap, &totalswap);
748 freeswap = (totalswap - usedswap);
751 #if defined(__OpenBSD__)
753 mib[1] = KERN_NPROCS;
754 len =
sizeof(nprocs);
755 sysctl(mib, 2, &nprocs, &
len,
NULL, 0);
759 ast_cli(
a->fd,
"\nSystem Statistics\n");
760 ast_cli(
a->fd,
"-----------------\n");
761 ast_cli(
a->fd,
" System Uptime: %ld hours\n", uptime);
762 ast_cli(
a->fd,
" Total RAM: %" PRIu64
" KiB\n", physmem / 1024);
763 ast_cli(
a->fd,
" Free RAM: %" PRIu64
" KiB\n", freeram);
764 #if defined(HAVE_SYSINFO)
765 ast_cli(
a->fd,
" Buffer RAM: %" PRIu64
" KiB\n", ((uint64_t) sys_info.bufferram * sys_info.mem_unit) / 1024);
767 #if defined(HAVE_SYSINFO) || defined(HAVE_SWAPCTL)
768 ast_cli(
a->fd,
" Total Swap Space: %d KiB\n", totalswap);
769 ast_cli(
a->fd,
" Free Swap Space: %" PRIu64
" KiB\n\n", freeswap);
771 ast_cli(
a->fd,
" Number of Processes: %d \n\n", nprocs);
798 #if !defined(LOW_MEMORY)
832 #if !defined(LOW_MEMORY)
845 #if !defined(LOW_MEMORY)
849 #if defined ( __i686__) && (defined(__FreeBSD__) || defined(__NetBSD__) || defined(linux))
850 #if defined(__FreeBSD__)
851 #include <machine/cpufunc.h>
852 #elif defined(__NetBSD__) || defined(linux)
853 static __inline uint64_t
858 __asm __volatile(
".byte 0x0f, 0x31" :
"=A" (rv));
863 static __inline uint64_t
873 #if !defined(LOW_MEMORY)
891 #if !defined(LOW_MEMORY)
892 #define DEFINE_PROFILE_MIN_MAX_VALUES min = 0; \
893 max = prof_data->entries;\
895 if (isdigit(a->argv[3][0])) { \
896 min = atoi(a->argv[3]); \
897 if (a->argc == 5 && strcmp(a->argv[4], "-")) \
898 max = atoi(a->argv[4]); \
900 search = a->argv[3]; \
902 if (max > prof_data->entries) \
903 max = prof_data->entries;
908 const char *search =
NULL;
911 e->command =
"core show profile";
912 e->usage =
"Usage: core show profile\n"
913 " show profile information";
923 ast_cli(
a->fd,
"profile values (%d, allocated %d)\n-------------------\n",
925 ast_cli(
a->fd,
"%6s %8s %10s %12s %12s %s\n",
"ID",
"Scale",
"Events",
926 "Value",
"Average",
"Name");
927 for (i =
min; i <
max; i++) {
929 if (!search || strstr(
entry->name, search))
930 ast_cli(
a->fd,
"%6d: [%8ld] %10ld %12lld %12lld %s\n",
943 const char *search =
NULL;
946 e->
command =
"core clear profile";
947 e->
usage =
"Usage: core clear profile\n"
948 " clear profile information";
958 for (i=
min; i <
max; i++) {
966 #undef DEFINE_PROFILE_MIN_MAX_VALUES
972 return ast_db_get(
"pbx",
"UUID", pbx_uuid, length);
979 int lastreloaded = 0;
985 uptime = (int)
tmp.tv_sec;
990 lastreloaded = (int)
tmp.tv_sec;
994 "Status",
"Fully Booted",
996 "LastReload", lastreloaded);
1068 return write(fd, s, strlen(s) + 1);
1074 return write(fd, s, strlen(s));
1084 .sa_flags = SA_RESTART,
1088 .sa_handler = SIG_IGN,
1133 #if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
1136 #ifdef HAVE_WORKING_FORK
1144 cap_set_proc(child_cap);
1146 #ifdef HAVE_WORKING_FORK
1154 #ifdef HAVE_WORKING_FORK
1194 #if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
1199 res = waitpid(pid, &
status, 0);
1204 if (
errno != EINTR) {
1234 execl(
"/bin/sh",
"/bin/sh",
"-c", s, (
char *)
NULL);
1276 ast_cli(fd,
"Console is not muted anymore.\n");
1280 ast_cli(fd,
"Console is muted.\n");
1285 ast_cli(fd,
"Couldn't find remote console.\n");
1353 fputs(
string, stdout);
1374 #if defined(SO_PEERCRED)
1375 #ifdef HAVE_STRUCT_SOCKPEERCRED_UID
1376 #define HAVE_STRUCT_UCRED_UID
1377 struct sockpeercred cred;
1381 socklen_t
len =
sizeof(cred);
1383 #if defined(HAVE_GETPEEREID)
1391 result = read(fd, buffer, size);
1396 #if defined(SO_PEERCRED) && (defined(HAVE_STRUCT_UCRED_UID) || defined(HAVE_STRUCT_UCRED_CR_UID))
1397 if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &
len)) {
1400 #if defined(HAVE_STRUCT_UCRED_UID)
1408 #elif defined(HAVE_GETPEEREID)
1409 if (getpeereid(fd, &uid, &gid)) {
1424 struct console *con = vconsole;
1428 const char *
const end_buf =
inbuf +
sizeof(
inbuf);
1429 char *start_read =
inbuf;
1431 struct pollfd fds[2];
1439 fds[0].fd = con->
fd;
1440 fds[0].events = POLLIN;
1442 fds[1].fd = con->
p[0];
1443 fds[1].events = POLLIN;
1452 if (fds[0].revents) {
1453 int cmds_read, bytes_read;
1454 if ((bytes_read =
read_credentials(con->
fd, start_read, end_buf - start_read, con)) < 1) {
1458 if (strncmp(
inbuf,
"cli quit after ", 15) == 0) {
1467 if (start_read + bytes_read < end_buf) {
1468 start_read += bytes_read;
1475 if (start_read[bytes_read - 1] ==
'\0') {
1483 while (cmds_read-- && (start_read = strchr(start_read,
'\0'))) {
1486 memmove(
inbuf, start_read, end_buf - start_read);
1487 start_read = end_buf - start_read +
inbuf;
1489 if (fds[1].revents) {
1495 res = write(con->
fd, outbuf, res);
1502 ast_verb(3,
"Remote UNIX connection disconnected\n");
1514 struct sockaddr_un sunaddr;
1519 struct pollfd fds[1];
1526 fds[0].events = POLLIN;
1527 poll_result =
ast_poll(fds, 1, -1);
1528 pthread_testcancel();
1529 if (poll_result < 0) {
1530 if (
errno != EINTR) {
1535 len =
sizeof(sunaddr);
1541 #if defined(SO_PASSCRED)
1544 if (setsockopt(s, SOL_SOCKET, SO_PASSCRED, &sckopt,
sizeof(sckopt)) < 0) {
1556 fdprint(s,
"Server failed to create pipe\n");
1574 fdprint(s,
"Server failed to spawn thread\n");
1580 fdprint(s,
"No more connections allowed\n");
1584 ast_verb(3,
"Remote UNIX connection\n");
1594 struct sockaddr_un sunaddr;
1616 memset(&sunaddr, 0,
sizeof(sunaddr));
1619 res = bind(
ast_socket, (
struct sockaddr *)&sunaddr,
sizeof(sunaddr));
1680 struct sockaddr_un sunaddr;
1684 fprintf(stderr,
"Unable to create socket: %s\n", strerror(
errno));
1687 memset(&sunaddr, 0,
sizeof(sunaddr));
1690 res = connect(
ast_consock, (
struct sockaddr *)&sunaddr,
sizeof(sunaddr));
1716 int save_errno =
errno;
1725 printf(
"Received HUP signal -- Reloading configs\n");
1728 fprintf(stderr,
"hup_handler: write() failed: %s\n", strerror(
errno));
1735 .sa_flags = SA_RESTART,
1746 for (n = 0; waitpid(-1, &
status, WNOHANG) > 0; n++)
1749 printf(
"Huh? Child handler, but nobody there?\n");
1755 .sa_flags = SA_RESTART,
1761 if (getenv(
"TERM") && strstr(getenv(
"TERM"),
"xterm"))
1762 fprintf(stdout,
"\033]2;%s\007",
text);
1767 if (getenv(
"TERM") && strstr(getenv(
"TERM"),
"xterm"))
1768 fprintf(stdout,
"\033]1;%s\007",
text);
1779 return sched_getscheduler(0);
1787 return (getpriority(PRIO_PROCESS, 0) < 0);
1794 #if !defined(__linux__)
1797 #elif defined(LOW_MEMORY)
1802 struct sched_param
sched;
1803 char const *policy_str;
1809 policy_str =
"realtime";
1810 sched.sched_priority = 10;
1812 policy = SCHED_OTHER;
1813 policy_str =
"regular";
1814 sched.sched_priority = 0;
1817 ast_log(
LOG_WARNING,
"Unable to set %s thread priority on main thread\n", policy_str);
1820 ast_verb(1,
"Setting %s thread priority on all threads\n", policy_str);
1837 struct sched_param
sched;
1841 sched.sched_priority = 10;
1846 sched.sched_priority = 0;
1856 ast_verb(1,
"Set to high priority\n");
1877 int shutdown_aborted = 0;
1883 shutdown_aborted = 1;
1886 return shutdown_aborted;
1914 #define SHUTDOWN_TIMEOUT 15
1945 if (seconds < (now - start)) {
1966 ast_verbose(
"Ignoring asterisk %s request, already in progress.\n", restart ?
"restart" :
"shutdown");
1989 ast_verb(0,
"Beginning asterisk %s....\n", restart ?
"restart" :
"shutdown");
1998 ast_verb(0,
"Waiting for inactivity to perform %s...\n", restart ?
"restart" :
"halt");
2009 ast_verb(0,
"Asterisk %s cancelled.\n", restart ?
"restart" :
"shutdown");
2042 int active_channels;
2047 ast_verb(0,
"Some modules could not be unloaded, switching to fast shutdown\n");
2064 }
else if (!restart) {
2075 "Shutdown", active_channels ?
"Uncleanly" :
"Cleanly",
2076 "Restart", restart ?
"True" :
"False");
2081 ast_verb(0,
"Asterisk %s ending (%d).\n",
2082 active_channels ?
"uncleanly" :
"cleanly", num);
2084 ast_verb(0,
"Executing last minute cleanups\n");
2087 ast_debug(1,
"Asterisk ending (%d).\n", num);
2095 pthread_kill(
lthread, SIGURG);
2106 ast_verb(0,
"Preparing for Asterisk restart...\n");
2108 for (i = 3; i < 32768; i++) {
2109 fcntl(i, F_SETFD, FD_CLOEXEC);
2111 ast_verb(0,
"Asterisk is now restarting...\n");
2140 fprintf(stderr,
"quit_handler: write() failed: %s\n", strerror(
errno));
2176 snprintf(outbuf, maxout,
"%s%s%s%s%s%s",
2192 state->verbose_line_level = 0;
2206 unsigned int newline;
2225 if ((s = strchr(
c,
'\n'))) {
2229 s = strchr(
c,
'\0');
2245 if (fwrite(
c,
sizeof(
char), num, stdout) < num) {
2259 state->verbose_line_level = 0;
2306 while (isspace(*s)) {
2317 }
else if ((strncasecmp(s,
"quit", 4) == 0 || strncasecmp(s,
"exit", 4) == 0) &&
2318 (s[4] ==
'\0' || isspace(s[4]))) {
2330 e->
command =
"core show version";
2332 "Usage: core show version\n"
2333 " Shows Asterisk version information.\n";
2341 ast_cli(
a->fd,
"Asterisk %s built by %s @ %s on a %s running %s on %s\n",
2353 "Usage: core stop now\n"
2354 " Shuts down a running Asterisk immediately, hanging up all active calls .\n";
2361 if (
a->argc != e->
args)
2371 e->
command =
"core stop gracefully";
2373 "Usage: core stop gracefully\n"
2374 " Causes Asterisk to not accept new calls, and exit when all\n"
2375 " active calls have terminated normally.\n";
2382 if (
a->argc != e->
args)
2392 e->
command =
"core stop when convenient";
2394 "Usage: core stop when convenient\n"
2395 " Causes Asterisk to perform a shutdown when all active calls have ended.\n";
2402 if (
a->argc != e->
args)
2404 ast_cli(
a->fd,
"Waiting for inactivity to perform halt\n");
2413 e->
command =
"core restart now";
2415 "Usage: core restart now\n"
2416 " Causes Asterisk to hangup all calls and exec() itself performing a cold\n"
2424 if (
a->argc != e->
args)
2434 e->
command =
"core restart gracefully";
2436 "Usage: core restart gracefully\n"
2437 " Causes Asterisk to stop accepting new calls and exec() itself performing a cold\n"
2438 " restart when all active calls have ended.\n";
2445 if (
a->argc != e->
args)
2455 e->
command =
"core restart when convenient";
2457 "Usage: core restart when convenient\n"
2458 " Causes Asterisk to perform a cold restart when all active calls have ended.\n";
2465 if (
a->argc != e->
args)
2467 ast_cli(
a->fd,
"Waiting for inactivity to perform restart\n");
2476 e->
command =
"core abort shutdown";
2478 "Usage: core abort shutdown\n"
2479 " Causes Asterisk to abort an executing shutdown or restart, and resume normal\n"
2480 " call operations.\n";
2487 if (
a->argc != e->
args)
2501 "Usage: !<command>\n"
2502 " Executes a given shell command\n";
2514 "BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n"
2515 "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n"
2516 "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n"
2517 "PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n"
2518 "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n"
2519 "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n"
2520 "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n"
2521 "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n"
2522 "REPAIR OR CORRECTION.\n"
2524 "IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n"
2525 "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n"
2526 "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n"
2527 "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n"
2528 "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n"
2529 "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n"
2530 "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n"
2531 "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n"
2532 "POSSIBILITY OF SUCH DAMAGES.\n"
2539 e->
command =
"core show warranty";
2541 "Usage: core show warranty\n"
2542 " Shows the warranty (if any) for this copy of Asterisk.\n";
2555 "This program is free software; you can redistribute it and/or modify\n"
2556 "it under the terms of the GNU General Public License version 2 as\n"
2557 "published by the Free Software Foundation.\n"
2559 "This program also contains components licensed under other licenses.\n"
2562 "This program is distributed in the hope that it will be useful,\n"
2563 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
2564 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
2565 "GNU General Public License for more details.\n"
2567 "You should have received a copy of the GNU General Public License\n"
2568 "along with this program; if not, write to the Free Software\n"
2569 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
2576 e->
command =
"core show license";
2578 "Usage: core show license\n"
2579 " Shows the license(s) for this copy of Asterisk.\n";
2590 #define ASTERISK_PROMPT "*CLI> "
2615 #if !defined(LOW_MEMORY)
2617 #if defined(HAVE_SYSINFO) || defined(HAVE_SYSCTL)
2650 printf(
"log and verbose output currently muted ('logger mute' to unmute)\n");
2654 #ifdef HAVE_LIBEDIT_IS_UNICODE
2655 #define CHAR_T_LIBEDIT wchar_t
2656 #define CHAR_TO_LIBEDIT(c) btowc(c)
2658 #define CHAR_T_LIBEDIT char
2659 #define CHAR_TO_LIBEDIT(c) c
2666 struct pollfd fds[2];
2669 #define EL_BUF_SIZE 512
2675 fds[0].events = POLLIN;
2677 fds[1].fd = STDIN_FILENO;
2678 fds[1].events = POLLIN;
2686 if (
errno == EINTR) {
2689 fprintf(stderr,
"poll failed: %s\n", strerror(
errno));
2696 num_read = read(STDIN_FILENO, &
c, 1);
2706 if (fds[0].revents) {
2710 fprintf(stderr,
"\nDisconnected from Asterisk server\n");
2715 int reconnects_per_second = 20;
2717 fprintf(stderr,
"Attempting to reconnect for 30 seconds\n");
2718 for (tries = 0; tries < 30 * reconnects_per_second; tries++) {
2720 fprintf(stderr,
"Reconnect succeeded after %.3f seconds\n", 1.0 / reconnects_per_second * tries);
2727 usleep(1000000 / reconnects_per_second);
2729 if (tries >= 30 * reconnects_per_second) {
2730 fprintf(stderr,
"Failed to reconnect for 30 seconds. Quitting.\n");
2741 if (write(STDOUT_FILENO,
"\r␛[0K", 5) < 0) {
2747 if ((res <
EL_BUF_SIZE - 1) && ((
buf[res-1] ==
'\n') || (res >= 2 &&
buf[res-2] ==
'\n'))) {
2768 static int cli_prompt_changes = 0;
2774 }
else if (!cli_prompt_changes) {
2780 if ((pfmt = getenv(
"ASTERISK_PROMPT"))) {
2783 while (*t !=
'\0') {
2787 struct ast_tm tm = { 0, };
2794 if (sscanf(t,
"%30d;%30d%n", &fgcolor, &bgcolor, &i) == 2) {
2797 }
else if (sscanf(t,
"%30d%n", &fgcolor, &i) == 1) {
2809 cli_prompt_changes++;
2813 if ((gr = getgrgid(getgid()))) {
2827 if ((dotptr = strchr(
hostname,
'.'))) {
2835 #ifdef HAVE_GETLOADAVG
2838 if (sscanf(t,
"%30d", &which) == 1 && which > 0 && which <= 3) {
2842 cli_prompt_changes++;
2853 cli_prompt_changes++;
2857 if ((pw = getpwuid(getuid()))) {
2906 goto vector_cleanup;
2911 goto vector_cleanup;
2936 for (numoutputline = 0; numoutputline < limit && idx <
AST_VECTOR_SIZE(matches); idx++) {
2941 if (!numoutputline) {
2945 fprintf(stdout,
"\n");
2959 LineInfo *lf = (LineInfo *)el_line(editline);
2961 savechr = *(
char *)lf->cursor;
2962 *(
char *)lf->cursor =
'\0';
2963 ptr = (
char *)lf->cursor;
2965 while (ptr > lf->buffer) {
2966 if (isspace(*ptr)) {
2974 len = lf->cursor - ptr;
2977 #define CMD_MATCHESARRAY "_COMMAND MATCHESARRAY \"%s\" \"%s\""
2983 if (maxmbuf == -1) {
2984 *((
char *) lf->cursor) = savechr;
2986 return (
char *)(CC_ERROR);
2995 if (mlen + 1024 > maxmbuf) {
2997 maxmbuf = mlen + 1024;
3001 *((
char *) lf->cursor) = savechr;
3003 return (
char *)(CC_ERROR);
3024 int maxlen, match_len;
3028 el_deletestr(editline, (
int)
len);
3029 el_insertstr(editline, best_match);
3035 el_insertstr(editline,
" ");
3041 if (match_len > maxlen) {
3046 fprintf(stdout,
"\n");
3054 *((
char *) lf->cursor) = savechr;
3056 return (
char *)(long)
retval;
3062 char *editor, *editrc = getenv(
"EDITRC");
3064 if (!(editor = getenv(
"AST_EDITMODE"))) {
3065 if (!(editor = getenv(
"AST_EDITOR"))) {
3075 el = el_init(
"asterisk", stdin, stdout, stderr);
3078 el_set(
el, EL_EDITMODE, 1);
3079 el_set(
el, EL_EDITOR, editor);
3085 history(
el_hist, &ev, H_SETSIZE, 100);
3089 el_set(
el, EL_ADDFN,
"ed-complete",
"Complete argument",
cli_complete);
3091 el_set(
el, EL_BIND,
"^I",
"ed-complete",
NULL);
3093 el_set(
el, EL_BIND,
"?",
"ed-complete",
NULL);
3095 el_set(
el, EL_BIND,
"^D",
"ed-redisplay",
NULL);
3097 el_set(
el, EL_BIND,
"\\e[3~",
"ed-delete-next-char",
NULL);
3099 el_set(
el, EL_BIND,
"\\e[1~",
"ed-move-to-beg",
NULL);
3100 el_set(
el, EL_BIND,
"\\e[4~",
"ed-move-to-end",
NULL);
3102 el_set(
el, EL_BIND,
"\\eOC",
"vi-next-word",
NULL);
3103 el_set(
el, EL_BIND,
"\\eOD",
"vi-prev-word",
NULL);
3106 el_source(
el, editrc);
3112 #define MAX_HISTORY_COMMAND_LENGTH 256
3129 if (!history(
el_hist, &ev, H_FIRST) && strcmp(ev.str, stripped_buf) == 0) {
3133 return history(
el_hist, &ev, H_ENTER, stripped_buf);
3143 return (history(
el_hist, &ev, H_SAVE, filename));
3154 return history(
el_hist, &ev, H_LOAD, filename);
3159 char histfile[80] =
"";
3160 const char *home = getenv(
"HOME");
3163 snprintf(histfile,
sizeof(histfile),
"%s/.asterisk_history", home);
3170 char histfile[80] =
"";
3171 const char *home = getenv(
"HOME");
3174 snprintf(histfile,
sizeof(histfile),
"%s/.asterisk_history", home);
3187 char *stringp =
NULL;
3206 char prefix[] =
"cli quit after ";
3218 cpid =
strsep(&stringp,
"/");
3221 version =
"<Version Unknown>";
3233 int linefull = 1, prev_linefull = 1, prev_line_verbose = 0;
3236 fds.events = POLLIN;
3239 while (
ast_poll(&fds, 1, 60000) > 0) {
3240 char buffer[512] =
"", *curline = buffer, *nextline;
3241 int not_written = 1;
3247 if (read(
ast_consock, buffer,
sizeof(buffer) - 1) <= 0) {
3252 prev_linefull = linefull;
3253 if ((nextline = strchr(curline,
'\n'))) {
3258 nextline = strchr(curline,
'\0');
3272 if ((!prev_linefull && !prev_line_verbose) || (prev_linefull && *curline > 0)) {
3273 prev_line_verbose = 0;
3275 if (write(STDOUT_FILENO, curline, nextline - curline) < 0) {
3279 prev_line_verbose = 1;
3303 ebuf = (
char *)el_gets(
el, &num);
3309 if (!ebuf && write(1,
"", 1) < 0)
3313 if (ebuf[strlen(ebuf)-1] ==
'\n')
3314 ebuf[strlen(ebuf)-1] =
'\0';
3324 printf(
"\nDisconnected from Asterisk server\n");
3336 printf(
"Usage: asterisk [OPTIONS]\n");
3337 printf(
"Valid Options:\n");
3338 printf(
" -V Display version number and exit\n");
3339 printf(
" -C <configfile> Use an alternate configuration file\n");
3340 printf(
" -G <group> Run as a group other than the caller\n");
3341 printf(
" -U <user> Run as a user other than the caller\n");
3342 printf(
" -c Provide console CLI\n");
3343 printf(
" -d Increase debugging (multiple d's = more debugging)\n");
3344 #if HAVE_WORKING_FORK
3345 printf(
" -f Do not fork\n");
3346 printf(
" -F Always fork\n");
3348 printf(
" -g Dump core in case of a crash\n");
3349 printf(
" -h This help screen\n");
3350 printf(
" -i Initialize crypto keys at startup\n");
3351 printf(
" -L <load> Limit the maximum load average before rejecting new calls\n");
3352 printf(
" -M <value> Limit the maximum number of calls to the specified value\n");
3353 printf(
" -m Mute debugging and console output on the console\n");
3354 printf(
" -n Disable console colorization. Can be used only at startup.\n");
3355 printf(
" -p Run as pseudo-realtime thread\n");
3356 printf(
" -q Quiet mode (suppress output)\n");
3357 printf(
" -r Connect to Asterisk on this machine\n");
3358 printf(
" -R Same as -r, except attempt to reconnect if disconnected\n");
3359 printf(
" -s <socket> Connect to Asterisk via socket <socket> (only valid with -r)\n");
3360 printf(
" -t Record soundfiles in /var/tmp and move them where they\n");
3361 printf(
" belong after they are done\n");
3362 printf(
" -T Display the time in [Mmm dd hh:mm:ss] format for each line\n");
3363 printf(
" of output to the CLI. Cannot be used with remote console mode.\n\n");
3364 printf(
" -v Increase verbosity (multiple v's = more verbose)\n");
3365 printf(
" -x <cmd> Execute command <cmd> (implies -r)\n");
3366 printf(
" -X Enable use of #exec in asterisk.conf\n");
3367 printf(
" -W Adjust terminal colors to compensate for a light background\n");
3390 if (!strcasecmp(v->
name,
"log_level")) {
3398 }
else if (!strcasecmp(v->
name,
"cache_pools")) {
3433 struct stat canary_stat;
3441 if (stat(
canary_filename, &canary_stat) || now.tv_sec > canary_stat.st_mtime + 60) {
3443 "The canary is no more. He has ceased to be! "
3444 "He's expired and gone to meet his maker! "
3445 "He's a stiff! Bereft of life, he rests in peace. "
3446 "His metabolic processes are now history! He's off the twig! "
3447 "He's kicked the bucket. He's shuffled off his mortal coil, "
3448 "run down the curtain, and joined the bleeding choir invisible!! "
3449 "THIS is an EX-CANARY. (Reducing priority)\n");
3483 fd = open(
"/dev/null", O_RDWR);
3518 ast_verbose(
"Running under group '%s'\n", rungroup);
3532 int isroot = 1, rundir_exists = 0;
3537 static const char *getopt_settings =
"BC:cde:FfG:ghIiL:M:mnpqRrs:TtU:VvWXx:";
3541 fprintf(stderr,
"Truncating argument size to %d\n", (
int)
ARRAY_LEN(
_argv) - 1);
3544 for (x = 0; x < argc; x++)
3552 if (argv[0] && (strstr(argv[0],
"rasterisk")) !=
NULL) {
3558 while ((
c = getopt(argc, argv, getopt_settings)) != -1) {
3603 while ((
c = getopt(argc, argv, getopt_settings)) != -1) {
3624 #if defined(HAVE_SYSINFO)
3631 #if HAVE_WORKING_FORK
3650 "NOTICE: The -I option is no longer needed.\n"
3651 " It will always be enabled if you have a timing module loaded.\n");
3724 while ((
c = getopt(argc, argv, getopt_settings)) != -1) {
3759 fprintf(stderr,
"'%c' option is not compatible with remote console mode and has no effect.\n",
c);
3764 fprintf(stderr,
"\n");
3772 strcpy(argv[0],
"rasterisk");
3773 for (x = 1; x < argc; x++) {
3774 argv[x] = argv[0] + 10;
3779 fprintf(stderr,
"The 'languageprefix' option in asterisk.conf is deprecated; in a future release it will be removed, and your sound files will need to be organized in the 'new style' language layout.\n");
3783 fprintf(stderr,
"'alwaysfork' is not compatible with console or remote console mode; ignored\n");
3788 memset(&l, 0,
sizeof(l));
3789 l.rlim_cur = RLIM_INFINITY;
3790 l.rlim_max = RLIM_INFINITY;
3791 if (setrlimit(RLIMIT_CORE, &l)) {
3792 fprintf(stderr,
"Unable to disable core size resource limit: %s\n", strerror(
errno));
3796 if (getrlimit(RLIMIT_NOFILE, &l)) {
3797 fprintf(stderr,
"Unable to check file descriptor limit: %s\n", strerror(
errno));
3800 #if !defined(CONFIGURE_RAN_AS_ROOT)
3805 struct timeval tv = { 0, };
3807 if (l.rlim_cur <= FD_SETSIZE) {
3813 if (!(fd = open(
"/dev/null", O_RDONLY))) {
3814 fprintf(stderr,
"Cannot open a file descriptor at boot? %s\n", strerror(
errno));
3818 fd2 = ((l.rlim_cur >
sizeof(readers) * 8) ?
sizeof(readers) * 8 : l.rlim_cur) - 1;
3819 if (dup2(fd, fd2) < 0) {
3820 fprintf(stderr,
"Cannot open maximum file descriptor %d at boot? %s\n", fd2, strerror(
errno));
3828 fprintf(stderr,
"Maximum select()able file descriptor is %d\n", FD_SETSIZE);
3834 #elif defined(HAVE_VARIABLE_FDSET)
3851 if (
errno == EEXIST) {
3854 fprintf(stderr,
"Unable to create socket file directory. Remote consoles will not be able to connect! (%s)\n", strerror(x));
3864 if (isroot && rungroup) {
3866 gr = getgrnam(rungroup);
3868 fprintf(stderr,
"No such group '%s'!\n", rungroup);
3872 fprintf(stderr,
"Unable to chgrp run directory to %d (%s)\n", (
int) gr->gr_gid, rungroup);
3874 if (setgid(gr->gr_gid)) {
3875 fprintf(stderr,
"Unable to setgid to %d (%s)\n", (
int)gr->gr_gid, rungroup);
3878 if (setgroups(0,
NULL)) {
3879 fprintf(stderr,
"Unable to drop unneeded groups\n");
3889 pw = getpwnam(runuser);
3891 fprintf(stderr,
"No such user '%s'!\n", runuser);
3895 fprintf(stderr,
"Unable to chown run directory to %d (%s)\n", (
int) pw->pw_uid, runuser);
3898 if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0)) {
3903 if (!isroot && pw->pw_uid != geteuid()) {
3904 fprintf(stderr,
"Asterisk started as nonroot, but runuser '%s' requested.\n", runuser);
3908 if (setgid(pw->pw_gid)) {
3909 fprintf(stderr,
"Unable to setgid to %d!\n", (
int)pw->pw_gid);
3912 if (isroot && initgroups(pw->pw_name, pw->pw_gid)) {
3913 fprintf(stderr,
"Unable to init groups for '%s'\n", runuser);
3917 if (setuid(pw->pw_uid)) {
3918 fprintf(stderr,
"Unable to setuid to %d (%s)\n", (
int)pw->pw_uid, runuser);
3925 cap = cap_from_text(
"cap_net_admin=eip");
3927 if (cap_set_proc(cap)) {
3928 fprintf(stderr,
"Unable to install capabilities.\n");
3930 if (cap_free(cap)) {
3931 fprintf(stderr,
"Unable to drop capabilities.\n");
3941 if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) < 0) {
3942 fprintf(stderr,
"Unable to set the process for core dumps after changing to a non-root user. %s\n", strerror(
errno));
3948 #if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
3950 if (!getcwd(dir,
sizeof(dir)) || eaccess(dir, R_OK | X_OK | F_OK)) {
3951 fprintf(stderr,
"Unable to access the running directory (%s). Changing to '/' for compatibility.\n", strerror(
errno));
3956 fprintf(stderr,
"chdir(\"/\") failed?!! %s\n", strerror(
errno));
3963 fprintf(stderr,
"Unable to chdir(\"/\") ?!! %s\n", strerror(
errno));
3995 fprintf(stderr,
"Asterisk already running on %s. Use 'asterisk -r' to connect.\n",
ast_config_AST_SOCKET);
4006 child_cap = cap_from_text(
"cap_net_admin-eip");
4011 cap_free(child_cap);
4022 fprintf(stderr,
"%s initialization failed. ASTERISK EXITING!\n%s",
name,
term_quit());
4025 exit(init_result == -2 ? 2 : 1);
4045 #if HAVE_WORKING_FORK
4047 #ifndef HAVE_SBIN_LAUNCHD
4048 if (daemon(1, 0) < 0) {
4049 fprintf(stderr,
"daemon() failed: %s\n", strerror(
errno));
4054 fprintf(stderr,
"Mac OS X detected. Use 'launchctl load /Library/LaunchDaemon/org.asterisk.asterisk.plist'.\n");
4083 char canary_binary[
PATH_MAX], ppid[12];
4086 signal(SIGCHLD, SIG_DFL);
4087 signal(SIGPIPE, SIG_DFL);
4091 snprintf(ppid,
sizeof(ppid),
"%d", (
int)
ast_mainpid);
4100 pthread_t dont_care;
4151 ast_verb(0,
"PBX UUID: %s\n", pbx_uuid);
4167 #ifdef TEST_FRAMEWORK
4186 (void) sigemptyset(&sigs);
4187 (void) sigaddset(&sigs, SIGHUP);
4188 (void) sigaddset(&sigs, SIGTERM);
4189 (void) sigaddset(&sigs, SIGINT);
4190 (void) sigaddset(&sigs, SIGPIPE);
4191 (void) sigaddset(&sigs, SIGWINCH);
4192 pthread_sigmask(SIG_BLOCK, &sigs,
NULL);
4202 srand((
unsigned int) getpid() + (
unsigned int) time(
NULL));
4269 pthread_sigmask(SIG_UNBLOCK, &sigs,
NULL);
4297 snprintf(title,
sizeof(title),
"Asterisk Console on '%s' (pid %ld)",
hostname, (
long)
ast_mainpid);
4313 buf = (
char *) el_gets(
el, &num);
4315 if (!
buf && write(1,
"", 1) < 0)
4319 if (
buf[strlen(
buf)-1] ==
'\n')
4320 buf[strlen(
buf)-1] =
'\0';
Prototypes for public functions only of internal interest,.
int load_pbx_variables(void)
void threadstorage_init(void)
void ast_process_pending_reloads(void)
Process reload requests received during startup.
int modules_shutdown(void)
int ast_bridging_init(void)
Initialize the bridging system.
void dnsmgr_start_refresh(void)
int ast_timing_init(void)
int ast_device_state_engine_init(void)
Initialize the device state engine in separate thread.
void ast_msg_shutdown(void)
void logger_queue_start(void)
Start the ast_queue_log() logger.
void load_asterisk_conf(void)
void ast_stun_init(void)
Initialize the STUN system in Asterisk.
void set_asterisk_conf_path(const char *path)
int load_pbx_functions_cli(void)
void load_astmm_phase_2(void)
Initialize malloc debug phase 2.
int load_pbx_hangup_handler(void)
int ast_local_init(void)
Initialize the local proxy channel.
int load_pbx_builtins(void)
int load_pbx_switch(void)
int ast_rtp_engine_init(void)
initializes the rtp engine arrays
int ast_xmldoc_load_documentation(void)
Load XML documentation. Provided by xmldoc.c.
int ast_named_locks_init(void)
int ast_channels_init(void)
void clean_time_zones(void)
void load_astmm_phase_1(void)
Initialize malloc debug phase 1.
void ast_builtins_init(void)
initialize the _full_cmd string in * each of the builtins.
void ast_autoservice_init(void)
int ast_endpoint_init(void)
Endpoint support initialization.
int ast_dns_system_resolver_init(void)
Initializes the resolver.
int ast_cli_perms_init(int reload)
void set_socket_path(const char *path)
int ast_parking_stasis_init(void)
initializes the rtp engine arrays
Access Control of various sorts.
A-Law to Signed linear conversion.
void ast_alaw_init(void)
To init the alaw to slinear conversion stuff, this needs to be run.
void ast_alertpipe_close(int alert_pipe[2])
Close an alert pipe.
ssize_t ast_alertpipe_write(int alert_pipe[2])
Write an event to an alert pipe.
int ast_alertpipe_init(int alert_pipe[2])
Initialize an alert pipe.
ast_alert_status_t ast_alertpipe_read(int alert_pipe[2])
Read an event from an alert pipe.
Generic Advice of Charge encode and decode routines.
int ast_aoc_cli_init(void)
enable aoc cli options
Asterisk version information.
const char * ast_get_version(void)
Retrieve the Asterisk version string.
const char * ast_get_build_opts(void)
Persistent data storage (akin to *doze registry)
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
int ast_db_get(const char *family, const char *key, char *value, int valuelen)
Get key value specified by family/key.
static int ast_el_add_history(const char *)
static char * remotehostname
static void __ast_unregister_atexit(void(*func)(void))
int64_t ast_mark(int i, int startstop)
int main(int argc, char *argv[])
static int ast_socket_is_sd
int ast_shutdown_final(void)
static void canary_exit(void)
static shutdown_nice_t shuttingdown
static void check_init(int init_result, const char *name)
static void __remote_quit_handler(int num)
static void _urg_handler(int num)
Urgent handler.
static char * show_license(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void * canary_thread(void *unused)
static void ast_run_atexits(int run_cleanups)
static int console_state_init(void *ptr)
static struct profile_data * prof_data
static int remoteconsolehandler(const char *s)
static struct ast_str * prompt
static char * handle_restart_now(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void publish_fully_booted(void)
static int show_version(void)
static char * handle_bang(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void main_atexit(void)
static int safe_exec_wait(pid_t pid)
wait for spawned application to complete and unreplace sigchld
static char * cli_complete(EditLine *editline, int ch)
int ast_add_profile(const char *name, uint64_t scale)
allocates a counter with a given name and scale.
static void ast_cli_display_match_list(struct ast_vector_string *matches, int max)
static void _hup_handler(int num)
static unsigned int safe_system_level
Keep track of how many threads are currently trying to wait*() on a child process.
static void ast_network_puts_mutable(const char *string, int level, int sublevel)
log the string to all attached network console clients
static char randompool[256]
static char * handle_show_threads(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_restart_when_convenient(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define WELCOME_MESSAGE
Welcome message when starting a CLI interface.
int ast_safe_execvp(int dualfork, const char *file, char *const argv[])
Safely spawn an external program while closing file descriptors.
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
static void set_header(char *outbuf, int maxout, char level)
static int ast_el_read_char(EditLine *editline, CHAR_T_LIBEDIT *cp)
static char canary_filename[128]
static __inline uint64_t rdtsc(void)
static struct sigaction child_handler
int ast_set_priority(int pri)
We set ourselves to a high priority, that we might pre-empt everything else. If your PBX has heavy ac...
static void asterisk_daemon(int isroot, const char *runuser, const char *rungroup)
void ast_console_toggle_loglevel(int fd, int level, int state)
enable or disable a logging level to a specified console
static int has_priority(void)
Check whether we were set to high(er) priority.
void ast_console_toggle_mute(int fd, int silent)
mute or unmute a console from logging
static void send_rasterisk_connect_commands(void)
static struct sigaction safe_system_prev_handler
static struct sigaction hup_handler
static pthread_t mon_sig_flags
static int fdprint(int fd, const char *s)
static void * netconsole(void *vconsole)
static pthread_t consolethread
static struct ast_vector_string * ast_el_strtoarr(char *buf)
static char * show_warranty(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int ast_el_initialize(void)
static int set_priority_all(int pri)
Set priority on all known threads.
static void * monitor_sig_flags(void *unused)
static void ast_begin_shutdown(void)
static int ast_el_read_history(const char *)
int ast_shutting_down(void)
static void _child_handler(int sig)
void ast_console_puts_mutable(const char *string, int level)
log the string to the root console, and all attached network console clients
static char * handle_stop_gracefully(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
int ast_pbx_uuid_get(char *pbx_uuid, int length)
Retrieve the PBX UUID.
void ast_replace_sigchld(void)
Replace the SIGCHLD handler.
int ast_cancel_shutdown(void)
Cancel an existing shutdown and return to normal operation.
static void ast_network_puts(const char *string)
write the string to all attached console clients
static int read_credentials(int fd, char *buffer, size_t size, struct console *con)
read() function supporting the reception of user credentials.
#define CHAR_TO_LIBEDIT(c)
static char * cli_prompt(EditLine *editline)
static int shutdown_pending
static void _null_sig_handler(int sig)
NULL handler so we can collect the child exit status.
static char * handle_show_sysinfo(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Give an overview of system statistics.
static int sig_alert_pipe[2]
struct timeval ast_lastreloadtime
static const char warranty_lines[]
void ast_console_puts(const char *string)
write the string to the root console, and all attached network console clients
void ast_unregister_atexit(void(*func)(void))
Unregister a function registered with ast_register_atexit().
static int console_print(const char *s)
static void quit_handler(int num, shutdown_nice_t niceness, int restart)
static char * handle_version(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define MAX_HISTORY_COMMAND_LENGTH
void ast_register_thread(char *name)
static void ast_remotecontrol(char *data)
static int print_file(int fd, char *desc, const char *filename)
Print the contents of a file.
void ast_unregister_thread(void *id)
static void consolehandler(const char *s)
static struct ast_cli_entry cli_asterisk_shutdown[]
Shutdown Asterisk CLI commands.
int ast_register_atexit(void(*func)(void))
Register a function to be executed before Asterisk exits.
static ast_mutex_t safe_system_lock
static pid_t safe_exec_prep(int dualfork)
fork and perform other preparations for spawning applications
int ast_safe_system(const char *s)
Safely spawn an OS shell command while closing file descriptors.
static int ast_all_zeros(const char *s)
static char * handle_clear_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int can_safely_quit(shutdown_nice_t niceness, int restart)
static struct @327 sig_flags
static void set_title(char *text)
Set an X-term or screen title.
static int register_atexit(void(*func)(void), int is_cleanup)
static int wait_for_channels_to_die(shutdown_nice_t niceness, int seconds)
static struct ast_threadstorage console_state
static int ast_makesocket(void)
#define DEFINE_PROFILE_MIN_MAX_VALUES
unsigned int need_quit_handler
static int ast_tryconnect(void)
static struct ast_cli_entry cli_asterisk[]
static int fdsend(int fd, const char *s)
static int ast_el_write_history(const char *)
static void run_startup_commands(void)
static int show_cli_help(void)
static char * handle_abort_shutdown(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void ast_el_read_default_histfile(void)
static char * handle_restart_gracefully(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void env_init(void)
static char * handle_stop_when_convenient(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_show_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct timeval ast_startuptime
static void read_pjproject_startup_options(void)
static char * handle_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Give an overview of core settings.
static const char license_lines[]
void ast_unreplace_sigchld(void)
Restore the SIGCHLD handler.
static void * listener(void *unused)
static void really_quit(int num, shutdown_nice_t niceness, int restart)
static void ast_el_write_default_histfile(void)
static int multi_thread_safe
static void __quit_handler(int num)
static char * handle_stop_now(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
void ast_console_puts_mutable_full(const char *message, int level, int sublevel)
log the string to the console, and all attached console clients
static void set_icon(char *text)
static void print_intro_message(const char *runuser, const char *rungroup)
static struct sigaction ignore_sig_handler
static struct sigaction null_sig_handler
struct console consoles[AST_MAX_CONNECTS]
int64_t ast_profile(int i, int64_t delta)
static struct sigaction urg_handler
Asterisk main include file. File version handling, generic pbx functions.
#define sched_setscheduler
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
#define ast_realloc(p, len)
A wrapper for realloc()
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
void ast_free_ptr(void *ptr)
free() wrapper
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
#define ast_calloc(num, len)
A wrapper for calloc()
int ast_bucket_init(void)
Initialize bucket support.
const char * ast_build_os
const char * ast_build_machine
const char * ast_build_hostname
const char * ast_build_user
const char * ast_build_date
const char * ast_build_kernel
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
void callerid_init(void)
CallerID Initialization.
int ast_cdr_is_enabled(void)
Return TRUE if CDR subsystem is enabled.
void ast_cdr_engine_term(void)
static char version[AST_MAX_EXTENSION]
General Asterisk PBX channel definitions.
void ast_softhangup_all(void)
Soft hangup all active channels.
int ast_undestroyed_channels(void)
int ast_active_channels(void)
returns number of active/allocated channels
Standard Command Line Interface.
#define AST_CLI_COMPLETE_EOF
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
#define AST_CLI_DEFINE(fn, txt,...)
struct ast_vector_string * ast_cli_completion_vector(const char *text, const char *word)
Generates a vector of strings for CLI completion.
void ast_cli(int fd, const char *fmt,...)
int ast_cli_allow_at_shutdown(struct ast_cli_entry *e)
Allow a CLI command to be executed while Asterisk is shutting down.
int ast_cli_command_multiple_full(int uid, int gid, int fd, size_t size, const char *s)
Executes multiple CLI commands Interpret strings separated by NULL and execute each one,...
ast_cli_command
calling arguments for new-style handlers.
#define ast_cli_register_multiple(e, len)
Register multiple commands.
int ast_codec_init(void)
Initialize codec support within the core.
int ast_codec_builtin_init(void)
Initialize built-in codecs within the core.
int devstate_init(void)
Initialize the device state core.
void ast_verbose(const char *fmt,...)
Generic File Format Support. Should be included by clients of the file handling routines....
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
int ast_manager_check_enabled(void)
Check if AMI is enabled.
int ast_webmanager_check_enabled(void)
Check if AMI/HTTP is enabled.
void ast_manager_publish_event(const char *type, int class_type, struct ast_json *obj)
Publish an event to AMI.
int ast_option_rtpusedynamic
int ast_option_pjproject_log_level
double ast_option_maxload
unsigned int ast_option_rtpptdynamic
struct ast_flags ast_options
unsigned int option_dtmfminduration
int ast_option_pjproject_cache_pools
@ AST_OPT_FLAG_HIGH_PRIORITY
@ AST_OPT_FLAG_GENERIC_PLC
@ AST_OPT_FLAG_TRANSCODE_VIA_SLIN
@ AST_OPT_FLAG_EXEC_INCLUDES
@ AST_OPT_FLAG_TRANSMIT_SILENCE
@ AST_OPT_FLAG_ALWAYS_FORK
@ AST_OPT_FLAG_GENERIC_PLC_ON_EQUAL_CODECS
@ AST_OPT_FLAG_CACHE_RECORD_FILES
@ AST_OPT_FLAG_FULLY_BOOTED
@ AST_OPT_FLAG_FORCE_BLACK_BACKGROUND
@ AST_OPT_FLAG_LIGHT_BACKGROUND
static char prefix[MAX_PREFIX]
General Asterisk channel definitions for image handling.
int ast_image_init(void)
Initialize image stuff Initializes all the various image stuff. Basically just registers the cli stuf...
Application convenience functions, designed to give consistent look and feel to Asterisk apps.
int app_init(void)
Initialize the application core.
void ast_close_fds_above_n(int n)
Common routine for child processes, to close all fds prior to exec(2)
int setenv(const char *name, const char *value, int overwrite)
int getloadavg(double *list, int nelem)
char * strsep(char **str, const char *delims)
Configuration File Parser.
#define CONFIG_STATUS_FILEMISSING
int ast_realtime_enabled(void)
Check if there's any realtime engines loaded.
#define CONFIG_STATUS_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
int register_config_cli(void)
Exposed initialization method for core process.
void ast_verb_console_unregister(void)
Unregister this thread's console verbosity level.
void ast_verb_console_register(int *level)
Register this thread's console verbosity level pointer.
#define ast_debug(level,...)
Log a DEBUG message.
int ast_is_logger_initialized(void)
Test if logger is initialized.
void ast_init_logger_for_socket_console(void)
load logger.conf configuration for console socket connections
const char * ast_logger_get_dateformat(void)
Get the logger configured date format.
#define ast_verb(level,...)
int ast_verb_console_get(void)
Get this thread's console verbosity level.
#define VERBOSE_MAGIC2LEVEL(x)
#define VERBOSE_HASMAGIC(x)
Security Event Reporting API.
int ast_security_stasis_init(void)
initializes stasis topic/event types for ast_security_topic and ast_security_event_type
I/O Management (derived from Cheops-NG)
int ast_get_termcols(int fd)
Columns of Terminal.
int ast_sd_notify(const char *state)
a wrapper for sd_notify(): notify systemd of any state changes.
int ast_sd_get_fd_un(int type, const char *path)
Find a listening AF_LOCAL file descriptor provided by socket activation.
Asterisk JSON abstraction layer.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
int ast_json_init(void)
Initialize the JSON library.
A set of macros to manage forward-linked lists.
#define AST_RWLIST_REMOVE_CURRENT
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
#define AST_LIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_RWLIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a read/write list of specified type, statically initialized.
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define AST_RWLIST_TRAVERSE_SAFE_END
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_LOCK(head)
Locks a list.
#define AST_RWLIST_TRAVERSE
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
#define AST_RWLIST_INSERT_HEAD
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Asterisk locking-related definitions:
#define AST_PTHREADT_NULL
#define ast_mutex_unlock(a)
#define ast_mutex_lock(a)
#define AST_MUTEX_DEFINE_STATIC(mutex)
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
static char hostname[MAXHOSTNAMELEN]
#define WEXITSTATUS(status)
#define WIFEXITED(status)
static int inbuf(struct baseio *bio, FILE *fi)
utility used by inchar(), for base_encode()
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
#define EVENT_FLAG_SYSTEM
Asterisk module definitions.
enum ast_module_reload_result ast_module_reload(const char *name)
Reload asterisk modules.
int mwi_init(void)
Initialize the mwi core.
Wrapper for network related headers, masking differences between various operating systems....
Options provided by main asterisk program.
#define ast_opt_dump_core
int ast_language_is_prefix
The following variable controls the layout of localized sound files. If 0, use the historical layout ...
#define MAX_PJ_LOG_MAX_LEVEL
#define ast_opt_reconnect
#define DEFAULT_PJPROJECT_CACHE_POOLS
#define ast_opt_hide_connect