Asterisk - The Open Source Telephony Project GIT-master-57e2743
Loading...
Searching...
No Matches
Data Structures | Macros | Enumerations | Functions | Variables
asterisk.c File Reference

Top level source file for Asterisk - the Open Source PBX. Implementation of PBX core functions and CLI interface. More...

#include "asterisk.h"
#include "asterisk/_private.h"
#include <sys/time.h>
#include <fcntl.h>
#include <signal.h>
#include <sched.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <ctype.h>
#include <sys/resource.h>
#include <grp.h>
#include <pwd.h>
#include <sys/stat.h>
#include <sys/sysinfo.h>
#include <regex.h>
#include <histedit.h>
#include "asterisk/paths.h"
#include "asterisk/network.h"
#include "asterisk/cli.h"
#include "asterisk/channel.h"
#include "asterisk/translate.h"
#include "asterisk/pickup.h"
#include "asterisk/acl.h"
#include "asterisk/ulaw.h"
#include "asterisk/alaw.h"
#include "asterisk/callerid.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/app.h"
#include "asterisk/mwi.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/file.h"
#include "asterisk/io.h"
#include "asterisk/config.h"
#include "asterisk/ast_version.h"
#include "asterisk/linkedlists.h"
#include "asterisk/devicestate.h"
#include "asterisk/presencestate.h"
#include "asterisk/module.h"
#include "asterisk/buildinfo.h"
#include "asterisk/xmldoc.h"
#include "asterisk/poll-compat.h"
#include "asterisk/test.h"
#include "asterisk/rtp_engine.h"
#include "asterisk/format.h"
#include "asterisk/aoc.h"
#include "asterisk/uuid.h"
#include "asterisk/sorcery.h"
#include "asterisk/bucket.h"
#include "asterisk/stasis.h"
#include "asterisk/json.h"
#include "asterisk/stasis_endpoints.h"
#include "asterisk/stasis_system.h"
#include "asterisk/security_events.h"
#include "asterisk/endpoints.h"
#include "asterisk/codec.h"
#include "asterisk/format_cache.h"
#include "asterisk/media_cache.h"
#include "asterisk/astdb.h"
#include "asterisk/options.h"
#include "asterisk/utf8.h"
#include "../defaults.h"
#include "channelstorage.h"
#include "editline_compat.h"

Go to the source code of this file.

Data Structures

struct  ast_atexit
 
struct  atexits
 
struct  console
 
struct  console_state_data
 
struct  profile_data
 
struct  profile_entry
 
struct  thread_list
 
struct  thread_list_t
 

Macros

#define AF_LOCAL   AF_UNIX
 
#define AST_MAX_CONNECTS   128
 
#define ASTERISK_PROMPT   "*CLI> "
 
#define CHAR_T_LIBEDIT   wchar_t
 
#define CHAR_TO_LIBEDIT(c)   btowc(c)
 
#define CMD_MATCHESARRAY   "_COMMAND MATCHESARRAY \"%s\" \"%s\""
 
#define COPYRIGHT_TAG   "Copyright (C) 1999 - 2025, Sangoma Technologies Corporation and others."
 
#define DEFINE_PROFILE_MIN_MAX_VALUES
 
#define EL_BUF_SIZE   512
 
#define MAX_HISTORY_COMMAND_LENGTH   256
 
#define NUM_MSGS   64
 
#define PF_LOCAL   PF_UNIX
 
#define SHUTDOWN_TIMEOUT   15 /* Seconds */
 
#define WELCOME_MESSAGE
 Welcome message when starting a CLI interface.
 

Enumerations

enum  shutdown_nice_t {
  NOT_SHUTTING_DOWN , SHUTTING_DOWN_FINAL , SHUTTING_DOWN , SHUTDOWN_FAST ,
  SHUTDOWN_NORMAL , SHUTDOWN_NICE , SHUTDOWN_REALLY_NICE
}
 
enum  startup_commands_phase { STARTUP_COMMANDS_PRE_INIT = 0 , STARTUP_COMMANDS_PRE_MODULE , STARTUP_COMMANDS_FULLY_BOOTED }
 

Functions

static void __ast_unregister_atexit (void(*func)(void))
 
static void __quit_handler (int num)
 
static void __remote_quit_handler (int num)
 
static void _child_handler (int sig)
 
static void _hup_handler (int num)
 
static void _null_sig_handler (int sig)
 NULL handler so we can collect the child exit status.
 
static void _urg_handler (int num)
 Urgent handler.
 
int ast_add_profile (const char *name, uint64_t scale)
 allocates a counter with a given name and scale.
 
static int ast_all_zeros (const char *s)
 
static void ast_begin_shutdown (void)
 
int ast_cancel_shutdown (void)
 Cancel an existing shutdown and return to normal operation.
 
static void ast_cli_display_match_list (struct ast_vector_string *matches, int max)
 
void ast_console_puts (const char *string)
 write the string to the root console, and all attached network console clients
 
void ast_console_puts_mutable (const char *string, int level)
 log the string to the root console, and all attached network console clients
 
void ast_console_puts_mutable_full (const char *message, int level, int sublevel)
 log the string to the console, and all attached console clients
 
void ast_console_toggle_loglevel (int fd, int level, int state)
 enable or disable a logging level to a specified console
 
void ast_console_toggle_mute (int fd, int silent)
 mute or unmute a console from logging
 
static int ast_el_add_history (const char *)
 
static int ast_el_initialize (void)
 
static int ast_el_read_char (EditLine *editline, CHAR_T_LIBEDIT *cp)
 
static void ast_el_read_default_histfile (void)
 
static int ast_el_read_history (const char *)
 
static struct ast_vector_string * ast_el_strtoarr (char *buf)
 
static void ast_el_write_default_histfile (void)
 
static int ast_el_write_history (const char *)
 
static int ast_makesocket (void)
 
int64_t ast_mark (int i, int startstop)
 
static void ast_network_puts (const char *string)
 write the string to all attached console clients
 
static void ast_network_puts_mutable (const char *string, int level, int sublevel)
 log the string to all attached network console clients
 
int ast_pbx_uuid_get (char *pbx_uuid, int length)
 Retrieve the PBX UUID.
 
int64_t ast_profile (int i, int64_t delta)
 
int ast_register_atexit (void(*func)(void))
 Register a function to be executed before Asterisk exits.
 
int ast_register_cleanup (void(*func)(void))
 Register a function to be executed before Asterisk gracefully exits.
 
void ast_register_thread (char *name)
 
static void ast_remotecontrol (char *data)
 
void ast_replace_sigchld (void)
 Replace the SIGCHLD handler.
 
static void ast_run_atexits (int run_cleanups)
 
int ast_safe_execvp (int dualfork, const char *file, char *const argv[])
 Safely spawn an external program while closing file descriptors.
 
int ast_safe_system (const char *s)
 Safely spawn an OS shell command while closing file descriptors.
 
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 activity on it, this is a good thing.
 
int ast_shutdown_final (void)
 
int ast_shutting_down (void)
 
 AST_THREADSTORAGE_CUSTOM_SCOPE (console_state, console_state_init, ast_free_ptr, static)
 
static int ast_tryconnect (void)
 
void ast_unregister_atexit (void(*func)(void))
 Unregister a function registered with ast_register_atexit().
 
void ast_unregister_thread (void *id)
 
void ast_unreplace_sigchld (void)
 Restore the SIGCHLD handler.
 
static void asterisk_daemon (int isroot, const char *runuser, const char *rungroup)
 
static int can_safely_quit (shutdown_nice_t niceness, int restart)
 
static void canary_exit (void)
 
static void * canary_thread (void *unused)
 
static void check_init (int init_result, const char *name)
 
static char * cli_complete (EditLine *editline, int ch)
 
static char * cli_prompt (EditLine *editline)
 
static int console_print (const char *s)
 
static int console_state_init (void *ptr)
 
static void consolehandler (const char *s)
 
static void env_init (void)
 
static int fdprint (int fd, const char *s)
 
static int fdsend (int fd, const char *s)
 
static char * handle_abort_shutdown (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_bang (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_clear_profile (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_restart_gracefully (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_restart_now (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)
 
static char * handle_show_profile (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_show_settings (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 Give an overview of core settings.
 
static char * handle_show_sysinfo (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 Give an overview of system statistics.
 
static char * handle_show_threads (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_stop_gracefully (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_stop_now (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_stop_when_convenient (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_version (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static int has_priority (void)
 Check whether we were set to high(er) priority.
 
static void * listener (void *unused)
 
int main (int argc, char *argv[])
 
static void main_atexit (void)
 
static void * monitor_sig_flags (void *unused)
 
static void * netconsole (void *vconsole)
 
static int print_file (int fd, char *desc, const char *filename)
 Print the contents of a file.
 
static void print_intro_message (const char *runuser, const char *rungroup)
 
static void process_histfile (int(*readwrite)(const char *filename))
 
static void publish_fully_booted (void)
 
static void quit_handler (int num, shutdown_nice_t niceness, int restart)
 
static __inline uint64_t rdtsc (void)
 
static int read_credentials (int fd, char *buffer, size_t size, struct console *con)
 read() function supporting the reception of user credentials.
 
static void read_pjproject_startup_options (void)
 
static void really_quit (int num, shutdown_nice_t niceness, int restart)
 
static int register_atexit (void(*func)(void), int is_cleanup)
 
static int remoteconsolehandler (const char *s)
 
static void run_startup_commands (enum startup_commands_phase phase)
 
static pid_t safe_exec_prep (int dualfork)
 fork and perform other preparations for spawning applications
 
static int safe_exec_wait (pid_t pid)
 wait for spawned application to complete and unreplace sigchld
 
static void send_rasterisk_connect_commands (void)
 
static void set_header (char *outbuf, int maxout, char level)
 
static void set_icon (char *text)
 
static int set_priority_all (int pri)
 Set priority on all known threads.
 
static void set_title (char *text)
 Set an X-term or screen title.
 
static int show_cli_help (void)
 
static char * show_license (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static int show_version (void)
 
static char * show_warranty (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static int wait_for_channels_to_die (shutdown_nice_t niceness, int seconds)
 

Variables

static char * _argv [256]
 
static int ast_consock = -1
 
struct timeval ast_lastreloadtime
 
pid_t ast_mainpid
 
static int ast_socket = -1
 
static int ast_socket_is_sd = 0
 
struct timeval ast_startuptime
 
static struct atexits atexits = AST_LIST_HEAD_INIT_VALUE
 
static char canary_filename [128]
 
static int canary_pid = 0
 
static struct sigaction child_handler
 
static struct ast_cli_entry cli_asterisk []
 
static struct ast_cli_entry cli_asterisk_shutdown []
 Shutdown Asterisk CLI commands.
 
struct console consoles [AST_MAX_CONNECTS]
 
static pthread_t consolethread = AST_PTHREADT_NULL
 
static EditLine * el
 
static History * el_hist
 
static struct sigaction hup_handler
 
static struct sigaction ignore_sig_handler
 
static const char license_lines []
 
static pthread_t lthread
 
static pthread_t mon_sig_flags
 
static int multi_thread_safe
 
static struct sigaction null_sig_handler
 
static struct profile_data * prof_data
 
static struct ast_str * prompt = NULL
 
static char randompool [256]
 
static char * remotehostname
 
static int restartnow
 
static unsigned int safe_system_level = 0
 Keep track of how many threads are currently trying to wait*() on a child process.
 
static ast_mutex_t safe_system_lock = AST_MUTEX_INIT_VALUE
 
static struct sigaction safe_system_prev_handler
 
static int shutdown_pending
 
static shutdown_nice_t shuttingdown = NOT_SHUTTING_DOWN
 
static int sig_alert_pipe [2] = { -1, -1 }
 
struct { 
 
   unsigned int   need_el_end:1 
 
   unsigned int   need_quit:1 
 
   unsigned int   need_quit_handler:1 
 
   unsigned int   need_reload:1 
 
} sig_flags 
 
static const char * startup_commands_phase_str []
 
static struct thread_list thread_list = AST_RWLIST_HEAD_INIT_VALUE
 
static struct sigaction urg_handler
 
static const char warranty_lines []
 

Detailed Description

Top level source file for Asterisk - the Open Source PBX. Implementation of PBX core functions and CLI interface.

Definition in file asterisk.c.

Macro Definition Documentation

◆ AF_LOCAL

#define AF_LOCAL   AF_UNIX

Definition at line 300 of file asterisk.c.

◆ AST_MAX_CONNECTS

#define AST_MAX_CONNECTS   128

Definition at line 304 of file asterisk.c.

◆ ASTERISK_PROMPT

#define ASTERISK_PROMPT   "*CLI> "

Definition at line 2624 of file asterisk.c.

◆ CHAR_T_LIBEDIT

#define CHAR_T_LIBEDIT   wchar_t

Definition at line 2689 of file asterisk.c.

◆ CHAR_TO_LIBEDIT

#define CHAR_TO_LIBEDIT (   c)    btowc(c)

Definition at line 2690 of file asterisk.c.

◆ CMD_MATCHESARRAY

#define CMD_MATCHESARRAY   "_COMMAND MATCHESARRAY \"%s\" \"%s\""

◆ COPYRIGHT_TAG

#define COPYRIGHT_TAG   "Copyright (C) 1999 - 2025, Sangoma Technologies Corporation and others."

Displayed copyright tag

Definition at line 308 of file asterisk.c.

◆ DEFINE_PROFILE_MIN_MAX_VALUES

#define DEFINE_PROFILE_MIN_MAX_VALUES

Definition at line 906 of file asterisk.c.

908 { /* specific entries */ \
909 if (isdigit(a->argv[3][0])) { \
910 min = atoi(a->argv[3]); \
911 if (a->argc == 5 && strcmp(a->argv[4], "-")) \
912 max = atoi(a->argv[4]); \
913 } else \
914 search = a->argv[3]; \
915 } \
916 if (max > prof_data->entries) \
static struct profile_data * prof_data
Definition asterisk.c:804
#define min(a, b)
Definition f2c.h:197
#define max(a, b)
Definition f2c.h:198
static struct test_val a

◆ EL_BUF_SIZE

#define EL_BUF_SIZE   512

◆ MAX_HISTORY_COMMAND_LENGTH

#define MAX_HISTORY_COMMAND_LENGTH   256

Definition at line 3170 of file asterisk.c.

◆ NUM_MSGS

#define NUM_MSGS   64

Definition at line 305 of file asterisk.c.

◆ PF_LOCAL

#define PF_LOCAL   PF_UNIX

Definition at line 301 of file asterisk.c.

◆ SHUTDOWN_TIMEOUT

#define SHUTDOWN_TIMEOUT   15 /* Seconds */

Definition at line 1932 of file asterisk.c.

◆ WELCOME_MESSAGE

#define WELCOME_MESSAGE

Welcome message when starting a CLI interface.

Definition at line 311 of file asterisk.c.

Enumeration Type Documentation

◆ shutdown_nice_t

Enumerator
NOT_SHUTTING_DOWN 

Normal operation

SHUTTING_DOWN_FINAL 

Committed to shutting down. Final phase

SHUTTING_DOWN 

Committed to shutting down. Initial phase

SHUTDOWN_FAST 

Valid values for quit_handler() niceness below. These shutdown/restart levels can be cancelled.

Remote console exit right now

SHUTDOWN_NORMAL 

core stop/restart now

SHUTDOWN_NICE 

core stop/restart gracefully

SHUTDOWN_REALLY_NICE 

core stop/restart when convenient

Definition at line 364 of file asterisk.c.

364 {
365 /*! Normal operation */
367 /*! Committed to shutting down. Final phase */
369 /*! Committed to shutting down. Initial phase */
371 /*!
372 * Valid values for quit_handler() niceness below.
373 * These shutdown/restart levels can be cancelled.
374 *
375 * Remote console exit right now
376 */
378 /*! core stop/restart now */
380 /*! core stop/restart gracefully */
382 /*! core stop/restart when convenient */
shutdown_nice_t
Definition asterisk.c:364
@ SHUTDOWN_FAST
Definition asterisk.c:377
@ SHUTDOWN_NORMAL
Definition asterisk.c:379
@ SHUTDOWN_NICE
Definition asterisk.c:381
@ SHUTDOWN_REALLY_NICE
Definition asterisk.c:383
@ SHUTTING_DOWN
Definition asterisk.c:370
@ SHUTTING_DOWN_FINAL
Definition asterisk.c:368
@ NOT_SHUTTING_DOWN
Definition asterisk.c:366

◆ startup_commands_phase

Enumerator
STARTUP_COMMANDS_PRE_INIT 
STARTUP_COMMANDS_PRE_MODULE 
STARTUP_COMMANDS_FULLY_BOOTED 

Definition at line 3547 of file asterisk.c.

3547 {
3551};
@ STARTUP_COMMANDS_PRE_MODULE
Definition asterisk.c:3549
@ STARTUP_COMMANDS_PRE_INIT
Definition asterisk.c:3548
@ STARTUP_COMMANDS_FULLY_BOOTED
Definition asterisk.c:3550

Function Documentation

◆ __ast_unregister_atexit()

static void __ast_unregister_atexit ( void(*)(void)  func)
static

Definition at line 1029 of file asterisk.c.

1030{
1031 struct ast_atexit *ae;
1032
1034 if (ae->func == func) {
1036 ast_free(ae);
1037 break;
1038 }
1039 }
1041}
#define ast_free(a)
Definition astmm.h:180
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#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.
struct ast_atexit::@317 list
void(* func)(void)
Definition asterisk.c:337

References ast_free, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_atexit::func, and ast_atexit::list.

Referenced by ast_unregister_atexit(), and register_atexit().

◆ __quit_handler()

static void __quit_handler ( int  num)
static

Definition at line 2154 of file asterisk.c.

2155{
2156 sig_flags.need_quit = 1;
2158 fprintf(stderr, "quit_handler: write() failed: %s\n", strerror(errno));
2159 }
2160 /* There is no need to restore the signal handler here, since the app
2161 * is going to exit */
2162}
ssize_t ast_alertpipe_write(int alert_pipe[2])
Write an event to an alert pipe.
Definition alertpipe.c:120
static int sig_alert_pipe[2]
Definition asterisk.c:404
static struct @316 sig_flags
int errno

References ast_alertpipe_write(), errno, sig_alert_pipe, and sig_flags.

Referenced by asterisk_daemon().

◆ __remote_quit_handler()

static void __remote_quit_handler ( int  num)
static

Definition at line 2164 of file asterisk.c.

2165{
2166 sig_flags.need_quit = 1;
2167}

References sig_flags.

Referenced by ast_remotecontrol().

◆ _child_handler()

static void _child_handler ( int  sig)
static

Definition at line 1756 of file asterisk.c.

1757{
1758 /* Must not ever ast_log or ast_verbose within signal handler */
1759 int n, status, save_errno = errno;
1760
1761 /*
1762 * Reap all dead children -- not just one
1763 */
1764 for (n = 0; waitpid(-1, &status, WNOHANG) > 0; n++)
1765 ;
1766 if (n == 0 && option_debug)
1767 printf("Huh? Child handler, but nobody there?\n");
1768 errno = save_errno;
1769}
jack_status_t status
Definition app_jack.c:149
int option_debug
Definition options.c:70

References errno, option_debug, and status.

◆ _hup_handler()

static void _hup_handler ( int  num)
static

Definition at line 1732 of file asterisk.c.

1733{
1734 int save_errno = errno;
1735
1736 if (restartnow) {
1737 if (el) {
1738 el_end(el);
1739 }
1740 execvp(_argv[0], _argv);
1741 }
1742
1743 printf("Received HUP signal -- Reloading configs\n");
1744 sig_flags.need_reload = 1;
1746 fprintf(stderr, "hup_handler: write() failed: %s\n", strerror(errno));
1747 }
1748 errno = save_errno;
1749}
static EditLine * el
Definition asterisk.c:348
static int restartnow
Definition asterisk.c:391
static char * _argv[256]
Definition asterisk.c:362

References _argv, ast_alertpipe_write(), el, errno, restartnow, sig_alert_pipe, and sig_flags.

◆ _null_sig_handler()

static void _null_sig_handler ( int  sig)
static

NULL handler so we can collect the child exit status.

Definition at line 1092 of file asterisk.c.

1093{
1094}

◆ _urg_handler()

static void _urg_handler ( int  num)
static

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

Definition at line 1723 of file asterisk.c.

1724{
1725 return;
1726}

◆ ast_add_profile()

int ast_add_profile ( const char *  name,
uint64_t  scale 
)

allocates a counter with a given name and scale.

support for event profiling

Returns
Returns the identifier of the counter.

Definition at line 810 of file asterisk.c.

811{
812#if !defined(LOW_MEMORY)
813 int l = sizeof(struct profile_data);
814 int n = 10; /* default entries */
815
816 if (prof_data == NULL) {
817 prof_data = ast_calloc(1, l + n*sizeof(struct profile_entry));
818 if (prof_data == NULL)
819 return -1;
820 prof_data->entries = 0;
821 prof_data->max_size = n;
822 }
824 void *p;
825 n = prof_data->max_size + 20;
826 p = ast_realloc(prof_data, l + n*sizeof(struct profile_entry));
827 if (p == NULL)
828 return -1;
829 prof_data = p;
830 prof_data->max_size = n;
831 }
832 n = prof_data->entries++;
834 prof_data->e[n].value = 0;
835 prof_data->e[n].events = 0;
836 prof_data->e[n].mark = 0;
837 prof_data->e[n].scale = scale;
838 return n;
839#else /* if defined(LOW_MEMORY) */
840 return 0;
841#endif
842}
#define ast_realloc(p, len)
A wrapper for realloc()
Definition astmm.h:226
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
static const char name[]
Definition format_mp3.c:68
#define NULL
Definition resample.c:96
struct profile_entry e[0]
Definition asterisk.c:801
Definition asterisk.c:790
int64_t events
Definition asterisk.c:795
int64_t mark
Definition asterisk.c:793
const char * name
Definition asterisk.c:791
int64_t value
Definition asterisk.c:794
uint64_t scale
Definition asterisk.c:792

References ast_calloc, ast_realloc, ast_strdup, profile_data::e, profile_data::entries, profile_entry::events, profile_entry::mark, profile_data::max_size, name, profile_entry::name, NULL, prof_data, profile_entry::scale, and profile_entry::value.

◆ ast_all_zeros()

static int ast_all_zeros ( const char *  s)
static

Definition at line 2299 of file asterisk.c.

2300{
2301 while (*s) {
2302 if (*s > 32)
2303 return 0;
2304 s++;
2305 }
2306 return 1;
2307}

Referenced by consolehandler(), and remoteconsolehandler().

◆ ast_begin_shutdown()

static void ast_begin_shutdown ( void  )
static

Definition at line 1911 of file asterisk.c.

1912{
1915 shutdown_pending = 1;
1916 }
1918}
static shutdown_nice_t shuttingdown
Definition asterisk.c:386
static int shutdown_pending
Definition asterisk.c:389
static ast_mutex_t safe_system_lock
Definition asterisk.c:1105
#define ast_mutex_unlock(a)
Definition lock.h:197
#define ast_mutex_lock(a)
Definition lock.h:196

References ast_mutex_lock, ast_mutex_unlock, NOT_SHUTTING_DOWN, safe_system_lock, shutdown_pending, and shuttingdown.

Referenced by can_safely_quit().

◆ ast_cancel_shutdown()

int ast_cancel_shutdown ( void  )

Cancel an existing shutdown and return to normal operation.

Note
Shutdown can be cancelled while the server is waiting for any existing channels to be destroyed before shutdown becomes irreversible.
Returns
non-zero if shutdown cancelled.

Definition at line 1893 of file asterisk.c.

1894{
1895 int shutdown_aborted = 0;
1896
1898 if (shuttingdown >= SHUTDOWN_FAST) {
1900 shutdown_pending = 0;
1901 shutdown_aborted = 1;
1902 }
1904 return shutdown_aborted;
1905}

References ast_mutex_lock, ast_mutex_unlock, NOT_SHUTTING_DOWN, safe_system_lock, SHUTDOWN_FAST, shutdown_pending, and shuttingdown.

Referenced by handle_abort_shutdown().

◆ ast_cli_display_match_list()

static void ast_cli_display_match_list ( struct ast_vector_string *  matches,
int  max 
)
static

Definition at line 2964 of file asterisk.c.

2965{
2966 int idx = 1;
2967 /* find out how many entries can be put on one line, with two spaces between strings */
2968 int limit = ast_get_termcols(STDOUT_FILENO) / (max + 2);
2969
2970 if (limit == 0) {
2971 limit = 1;
2972 }
2973
2974 for (;;) {
2975 int numoutputline;
2976
2977 for (numoutputline = 0; numoutputline < limit && idx < AST_VECTOR_SIZE(matches); idx++) {
2978 numoutputline++;
2979 fprintf(stdout, "%-*s ", max, AST_VECTOR_GET(matches, idx));
2980 }
2981
2982 if (!numoutputline) {
2983 break;
2984 }
2985
2986 fprintf(stdout, "\n");
2987 }
2988}
int ast_get_termcols(int fd)
Columns of Terminal.
Definition io.c:373
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition vector.h:637
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition vector.h:708

References ast_get_termcols(), AST_VECTOR_GET, AST_VECTOR_SIZE, and max.

Referenced by cli_complete().

◆ ast_console_puts()

void ast_console_puts ( const char *  string)

write the string to the root console, and all attached network console clients

Definition at line 1368 of file asterisk.c.

1369{
1370 /* Send to the root console */
1371 fputs(string, stdout);
1372 fflush(stdout);
1373
1374 /* Send to any network console clients */
1375 ast_network_puts(string);
1376}
static void ast_network_puts(const char *string)
write the string to all attached console clients
Definition asterisk.c:1352

References ast_network_puts().

◆ ast_console_puts_mutable()

void ast_console_puts_mutable ( const char *  string,
int  level 
)

log the string to the root console, and all attached network console clients

log the string to the console, and all attached console clients

Definition at line 1328 of file asterisk.c.

1329{
1330 ast_console_puts_mutable_full(string, level, 0);
1331}
void ast_console_puts_mutable_full(const char *message, int level, int sublevel)
log the string to the console, and all attached console clients
Definition asterisk.c:1335

References ast_console_puts_mutable_full().

Referenced by init_logger_chain(), and make_logchannel().

◆ ast_console_puts_mutable_full()

void ast_console_puts_mutable_full ( const char *  message,
int  level,
int  sublevel 
)

log the string to the console, and all attached console clients

Since
14.0.0
Parameters
messageThe message to write to the console
sublevelIf the log level supports it, the sub-level of the message
levelThe log level of the message

Definition at line 1335 of file asterisk.c.

1336{
1337 /* Send to the root console */
1339
1340 /* Wake up a poll()ing console */
1342 pthread_kill(consolethread, SIGURG);
1343 }
1344
1345 /* Send to any network console clients */
1346 ast_network_puts_mutable(message, level, sublevel);
1347}
static void ast_network_puts_mutable(const char *string, int level, int sublevel)
log the string to all attached network console clients
Definition asterisk.c:1309
static pthread_t consolethread
Definition asterisk.c:392
static int console_print(const char *s)
Definition asterisk.c:2228
#define AST_PTHREADT_NULL
Definition lock.h:73
#define ast_opt_console
Definition options.h:121

References ast_network_puts_mutable(), ast_opt_console, AST_PTHREADT_NULL, console_print(), and consolethread.

Referenced by ast_console_puts_mutable(), and logger_print_normal().

◆ ast_console_toggle_loglevel()

void ast_console_toggle_loglevel ( int  fd,
int  level,
int  state 
)

enable or disable a logging level to a specified console

enables or disables logging of a specified level to the console

Definition at line 1263 of file asterisk.c.

1264{
1265 int x;
1266
1267 if (level >= NUMLOGLEVELS) {
1268 level = NUMLOGLEVELS - 1;
1269 }
1270
1271 for (x = 0;x < AST_MAX_CONNECTS; x++) {
1272 if (fd == consoles[x].fd) {
1273 /*
1274 * Since the logging occurs when levels are false, set to
1275 * flipped iinput because this function accepts 0 as off and 1 as on
1276 */
1277 consoles[x].levels[level] = state ? 0 : 1;
1278 return;
1279 }
1280 }
1281}
#define AST_MAX_CONNECTS
Definition asterisk.c:304
struct console consoles[AST_MAX_CONNECTS]
Definition asterisk.c:351
#define NUMLOGLEVELS
int levels[NUMLOGLEVELS]
Definition asterisk.c:331

References AST_MAX_CONNECTS, consoles, console::levels, and NUMLOGLEVELS.

Referenced by handle_logger_set_level().

◆ ast_console_toggle_mute()

void ast_console_toggle_mute ( int  fd,
int  silent 
)

mute or unmute a console from logging

Definition at line 1286 of file asterisk.c.

1287{
1288 int x;
1289 for (x = 0;x < AST_MAX_CONNECTS; x++) {
1290 if (fd == consoles[x].fd) {
1291 if (consoles[x].mute) {
1292 consoles[x].mute = 0;
1293 if (!silent)
1294 ast_cli(fd, "Console is not muted anymore.\n");
1295 } else {
1296 consoles[x].mute = 1;
1297 if (!silent)
1298 ast_cli(fd, "Console is muted.\n");
1299 }
1300 return;
1301 }
1302 }
1303 ast_cli(fd, "Couldn't find remote console.\n");
1304}
void ast_cli(int fd, const char *fmt,...)
Definition clicompat.c:6
int mute
Definition asterisk.c:328

References ast_cli(), AST_MAX_CONNECTS, consoles, and console::mute.

Referenced by handle_logger_mute().

◆ ast_el_add_history()

static int ast_el_add_history ( const char *  buf)
static

Definition at line 3172 of file asterisk.c.

3173{
3174 HistEvent ev;
3175 char *stripped_buf;
3176
3177 if (el_hist == NULL || el == NULL) {
3179 }
3180 if (strlen(buf) > (MAX_HISTORY_COMMAND_LENGTH - 1)) {
3181 return 0;
3182 }
3183
3184 stripped_buf = ast_strip(ast_strdupa(buf));
3185
3186 /* HISTCONTROL=ignoredups */
3187 if (!history(el_hist, &ev, H_FIRST) && strcmp(ev.str, stripped_buf) == 0) {
3188 return 0;
3189 }
3190
3191 return history(el_hist, &ev, H_ENTER, stripped_buf);
3192}
static int ast_el_initialize(void)
Definition asterisk.c:3117
static History * el_hist
Definition asterisk.c:347
#define MAX_HISTORY_COMMAND_LENGTH
Definition asterisk.c:3170
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
char buf[BUFSIZE]
Definition eagi_proxy.c:66
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition strings.h:223

References ast_el_initialize(), ast_strdupa, ast_strip(), buf, el, el_hist, MAX_HISTORY_COMMAND_LENGTH, and NULL.

Referenced by consolehandler(), and remoteconsolehandler().

◆ ast_el_initialize()

static int ast_el_initialize ( void  )
static

Definition at line 3117 of file asterisk.c.

3118{
3119 HistEvent ev;
3120 char *editor, *editrc = getenv("EDITRC");
3121
3122 if (!(editor = getenv("AST_EDITMODE"))) {
3123 if (!(editor = getenv("AST_EDITOR"))) {
3124 editor = "emacs";
3125 }
3126 }
3127
3128 if (el != NULL)
3129 el_end(el);
3130 if (el_hist != NULL)
3131 history_end(el_hist);
3132
3133 el = el_init("asterisk", stdin, stdout, stderr);
3134 el_set(el, EL_PROMPT, cli_prompt);
3135
3136 el_set(el, EL_EDITMODE, 1);
3137 el_set(el, EL_EDITOR, editor);
3138 el_hist = history_init();
3139 if (!el || !el_hist)
3140 return -1;
3141
3142 /* setup history with 100 entries */
3143 history(el_hist, &ev, H_SETSIZE, 100);
3144
3145 el_set(el, EL_HIST, history, el_hist);
3146
3147 el_set(el, EL_ADDFN, "ed-complete", "Complete argument", cli_complete);
3148 /* Bind <tab> to command completion */
3149 el_set(el, EL_BIND, "^I", "ed-complete", NULL);
3150 /* Bind ? to command completion */
3151 el_set(el, EL_BIND, "?", "ed-complete", NULL);
3152 /* Bind ^D to redisplay */
3153 el_set(el, EL_BIND, "^D", "ed-redisplay", NULL);
3154 /* Bind Delete to delete char left */
3155 el_set(el, EL_BIND, "\\e[3~", "ed-delete-next-char", NULL);
3156 /* Bind Home and End to move to line start and end */
3157 el_set(el, EL_BIND, "\\e[1~", "ed-move-to-beg", NULL);
3158 el_set(el, EL_BIND, "\\e[4~", "ed-move-to-end", NULL);
3159 /* Bind C-left and C-right to move by word (not all terminals) */
3160 el_set(el, EL_BIND, "\\eOC", "vi-next-word", NULL);
3161 el_set(el, EL_BIND, "\\eOD", "vi-prev-word", NULL);
3162
3163 if (editrc) {
3164 el_source(el, editrc);
3165 }
3166
3167 return 0;
3168}
static char * cli_complete(EditLine *editline, int ch)
Definition asterisk.c:2991
static char * cli_prompt(EditLine *editline)
Definition asterisk.c:2804

References cli_complete(), cli_prompt(), el, el_hist, and NULL.

Referenced by ast_el_add_history(), ast_el_read_history(), ast_el_write_history(), ast_remotecontrol(), and asterisk_daemon().

◆ ast_el_read_char()

static int ast_el_read_char ( EditLine *  editline,
CHAR_T_LIBEDIT *  cp 
)
static

Definition at line 2696 of file asterisk.c.

2697{
2698 int num_read = 0;
2699 int lastpos = 0;
2700 struct pollfd fds[2];
2701 int res;
2702 int max;
2703#define EL_BUF_SIZE 512
2704 char buf[EL_BUF_SIZE];
2705
2706 for (;;) {
2707 max = 1;
2708 fds[0].fd = ast_consock;
2709 fds[0].events = POLLIN;
2710 if (!ast_opt_exec) {
2711 fds[1].fd = STDIN_FILENO;
2712 fds[1].events = POLLIN;
2713 max++;
2714 }
2715 res = ast_poll(fds, max, -1);
2716 if (res < 0) {
2717 if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
2718 break;
2719 }
2720 if (errno == EINTR) {
2721 continue;
2722 }
2723 fprintf(stderr, "poll failed: %s\n", strerror(errno));
2724 break;
2725 }
2726
2727 if (!ast_opt_exec && fds[1].revents) {
2728#ifdef HAVE_LIBEDIT_IS_UNICODE
2729 num_read = editline_read_char(editline, cp);
2730 if (num_read < 1) {
2731 break;
2732 }
2733#else
2734 char c = '\0';
2735
2736 num_read = read(STDIN_FILENO, &c, 1);
2737 if (num_read < 1) {
2738 break;
2739 }
2740
2741 *cp = CHAR_TO_LIBEDIT(c);
2742
2743#endif
2744 return num_read;
2745 }
2746
2747 if (fds[0].revents) {
2748 res = read(ast_consock, buf, sizeof(buf) - 1);
2749 /* if the remote side disappears exit */
2750 if (res < 1) {
2751 fprintf(stderr, "\nDisconnected from Asterisk server\n");
2752 if (!ast_opt_reconnect) {
2754 } else {
2755 int tries;
2756 int reconnects_per_second = 20;
2757
2758 fprintf(stderr, "Attempting to reconnect for 30 seconds\n");
2759 for (tries = 0; tries < 30 * reconnects_per_second; tries++) {
2760 if (ast_tryconnect()) {
2761 fprintf(stderr, "Reconnect succeeded after %.3f seconds\n", 1.0 / reconnects_per_second * tries);
2762 printf("%s", term_quit());
2765 break;
2766 }
2767
2768 usleep(1000000 / reconnects_per_second);
2769 }
2770 if (tries >= 30 * reconnects_per_second) {
2771 fprintf(stderr, "Failed to reconnect for 30 seconds. Quitting.\n");
2773 }
2774 }
2775 continue;
2776 }
2777
2778 buf[res] = '\0';
2779
2780 /* Write over the CLI prompt */
2781 if (!ast_opt_exec && !lastpos) {
2782 if (write(STDOUT_FILENO, "\r␛[0K", 5) < 0) {
2783 }
2784 }
2785
2787
2788 if ((res < EL_BUF_SIZE - 1) && ((buf[res-1] == '\n') || (res >= 2 && buf[res-2] == '\n'))) {
2789 *cp = CHAR_TO_LIBEDIT(CC_REFRESH);
2790
2791 return 1;
2792 }
2793 lastpos = 1;
2794 }
2795 }
2796
2797 *cp = CHAR_TO_LIBEDIT('\0');
2798
2799 return 0;
2800}
#define WELCOME_MESSAGE
Welcome message when starting a CLI interface.
Definition asterisk.c:311
static void send_rasterisk_connect_commands(void)
Definition asterisk.c:2660
#define CHAR_TO_LIBEDIT(c)
Definition asterisk.c:2690
static void quit_handler(int num, shutdown_nice_t niceness, int restart)
Definition asterisk.c:1923
#define EL_BUF_SIZE
static int ast_tryconnect(void)
Definition asterisk.c:1696
static int ast_consock
Definition asterisk.c:322
int editline_read_char(EditLine *el, wchar_t *cp)
#define ast_opt_exec
Definition options.h:125
#define ast_opt_reconnect
Definition options.h:133
#define ast_poll(a, b, c)
Definition poll-compat.h:88
const char * term_quit(void)
Definition term.c:412
static struct test_val c

References ast_consock, ast_opt_exec, ast_opt_reconnect, ast_poll, ast_tryconnect(), buf, c, CHAR_TO_LIBEDIT, console_print(), editline_read_char(), EL_BUF_SIZE, errno, max, quit_handler(), send_rasterisk_connect_commands(), SHUTDOWN_FAST, sig_flags, term_quit(), and WELCOME_MESSAGE.

Referenced by ast_remotecontrol(), and asterisk_daemon().

◆ ast_el_read_default_histfile()

static void ast_el_read_default_histfile ( void  )
static

Definition at line 3247 of file asterisk.c.

3248{
3250}
static int ast_el_read_history(const char *)
Definition asterisk.c:3204
static void process_histfile(int(*readwrite)(const char *filename))
Definition asterisk.c:3220

References ast_el_read_history(), and process_histfile().

Referenced by ast_remotecontrol(), and asterisk_daemon().

◆ ast_el_read_history()

static int ast_el_read_history ( const char *  filename)
static

Definition at line 3204 of file asterisk.c.

3205{
3206 HistEvent ev;
3207
3208 if (el_hist == NULL || el == NULL) {
3210 }
3211
3212 if (access(filename, F_OK) == 0) {
3213 return history(el_hist, &ev, H_LOAD, filename);
3214 }
3215
3216 /* If the history file doesn't exist, failing to read it is unremarkable. */
3217 return 0;
3218}
#define F_OK

References ast_el_initialize(), el, el_hist, F_OK, and NULL.

Referenced by ast_el_read_default_histfile().

◆ ast_el_strtoarr()

static struct ast_vector_string * ast_el_strtoarr ( char *  buf)
static

Definition at line 2930 of file asterisk.c.

2931{
2932 char *retstr;
2933 struct ast_vector_string *vec = ast_calloc(1, sizeof(*vec));
2934
2935 if (!vec) {
2936 return NULL;
2937 }
2938
2939 while ((retstr = strsep(&buf, " "))) {
2940 if (!strcmp(retstr, AST_CLI_COMPLETE_EOF)) {
2941 break;
2942 }
2943
2944 retstr = ast_strdup(retstr);
2945 if (!retstr || AST_VECTOR_APPEND(vec, retstr)) {
2946 ast_free(retstr);
2947 goto vector_cleanup;
2948 }
2949 }
2950
2951 if (!AST_VECTOR_SIZE(vec)) {
2952 goto vector_cleanup;
2953 }
2954
2955 return vec;
2956
2957vector_cleanup:
2960
2961 return NULL;
2962}
char * strsep(char **str, const char *delims)
#define AST_CLI_COMPLETE_EOF
Definition cli.h:52
String vector definitions.
Definition vector.h:55
#define AST_VECTOR_PTR_FREE(vec)
Deallocates this vector pointer.
Definition vector.h:200
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition vector.h:267
#define AST_VECTOR_CALLBACK_VOID(vec, callback,...)
Execute a callback on every element in a vector disregarding callback return.
Definition vector.h:890

References ast_calloc, AST_CLI_COMPLETE_EOF, ast_free, ast_strdup, AST_VECTOR_APPEND, AST_VECTOR_CALLBACK_VOID, AST_VECTOR_PTR_FREE, AST_VECTOR_SIZE, buf, NULL, and strsep().

Referenced by cli_complete().

◆ ast_el_write_default_histfile()

static void ast_el_write_default_histfile ( void  )
static

Definition at line 3252 of file asterisk.c.

3253{
3255}
static int ast_el_write_history(const char *)
Definition asterisk.c:3194

References ast_el_write_history(), and process_histfile().

Referenced by really_quit().

◆ ast_el_write_history()

static int ast_el_write_history ( const char *  filename)
static

Definition at line 3194 of file asterisk.c.

3195{
3196 HistEvent ev;
3197
3198 if (el_hist == NULL || el == NULL)
3200
3201 return (history(el_hist, &ev, H_SAVE, filename));
3202}

References ast_el_initialize(), el, el_hist, and NULL.

Referenced by ast_el_write_default_histfile().

◆ ast_makesocket()

static int ast_makesocket ( void  )
static

Definition at line 1610 of file asterisk.c.

1611{
1612 struct sockaddr_un sunaddr;
1613 int res;
1614 int x;
1615 uid_t uid = -1;
1616 gid_t gid = -1;
1617
1618 for (x = 0; x < AST_MAX_CONNECTS; x++) {
1619 consoles[x].fd = -1;
1620 }
1621
1622 if (ast_socket_is_sd) {
1624
1625 goto start_lthread;
1626 }
1627
1628 unlink(ast_config_AST_SOCKET);
1629 ast_socket = socket(PF_LOCAL, SOCK_STREAM, 0);
1630 if (ast_socket < 0) {
1631 ast_log(LOG_WARNING, "Unable to create control socket: %s\n", strerror(errno));
1632 return -1;
1633 }
1634 memset(&sunaddr, 0, sizeof(sunaddr));
1635 sunaddr.sun_family = AF_LOCAL;
1636 ast_copy_string(sunaddr.sun_path, ast_config_AST_SOCKET, sizeof(sunaddr.sun_path));
1637 res = bind(ast_socket, (struct sockaddr *)&sunaddr, sizeof(sunaddr));
1638 if (res) {
1639 ast_log(LOG_WARNING, "Unable to bind socket to %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
1640 close(ast_socket);
1641 ast_socket = -1;
1642 return -1;
1643 }
1644 res = listen(ast_socket, 2);
1645 if (res < 0) {
1646 ast_log(LOG_WARNING, "Unable to listen on socket %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
1647 close(ast_socket);
1648 ast_socket = -1;
1649 return -1;
1650 }
1651
1652start_lthread:
1654 ast_log(LOG_WARNING, "Unable to create listener thread.\n");
1655 close(ast_socket);
1656 return -1;
1657 }
1658
1659 if (ast_socket_is_sd) {
1660 /* owner/group/permissions are set by systemd, we might not even have access
1661 * to socket file so leave it alone */
1662 return 0;
1663 }
1664
1666 struct passwd *pw;
1667 if ((pw = getpwnam(ast_config_AST_CTL_OWNER)) == NULL)
1668 ast_log(LOG_WARNING, "Unable to find uid of user %s\n", ast_config_AST_CTL_OWNER);
1669 else
1670 uid = pw->pw_uid;
1671 }
1672
1674 struct group *grp;
1675 if ((grp = getgrnam(ast_config_AST_CTL_GROUP)) == NULL)
1676 ast_log(LOG_WARNING, "Unable to find gid of group %s\n", ast_config_AST_CTL_GROUP);
1677 else
1678 gid = grp->gr_gid;
1679 }
1680
1681 if (chown(ast_config_AST_SOCKET, uid, gid) < 0)
1682 ast_log(LOG_WARNING, "Unable to change ownership of %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
1683
1685 unsigned int p1;
1686 mode_t p;
1687 sscanf(ast_config_AST_CTL_PERMISSIONS, "%30o", &p1);
1688 p = p1;
1689 if ((chmod(ast_config_AST_SOCKET, p)) < 0)
1690 ast_log(LOG_WARNING, "Unable to change file permissions of %s: %s\n", ast_config_AST_SOCKET, strerror(errno));
1691 }
1692
1693 return 0;
1694}
static int ast_socket_is_sd
Definition asterisk.c:321
static pthread_t lthread
Definition asterisk.c:1378
#define PF_LOCAL
Definition asterisk.c:301
static void * listener(void *unused)
Definition asterisk.c:1530
static int ast_socket
Definition asterisk.c:320
#define AF_LOCAL
Definition asterisk.c:300
#define ast_log
Definition astobj2.c:42
#define LOG_WARNING
int ast_sd_get_fd_un(int type, const char *path)
Find a listening AF_LOCAL file descriptor provided by socket activation.
Definition io.c:454
const char * ast_config_AST_SOCKET
Definition options.c:168
const char * ast_config_AST_CTL_PERMISSIONS
Definition options.c:173
const char * ast_config_AST_CTL_GROUP
Definition options.c:175
const char * ast_config_AST_CTL_OWNER
Definition options.c:174
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
int fd
Definition asterisk.c:325
#define ast_pthread_create_background(a, b, c, d)
Definition utils.h:632

References AF_LOCAL, ast_config_AST_CTL_GROUP, ast_config_AST_CTL_OWNER, ast_config_AST_CTL_PERMISSIONS, ast_config_AST_SOCKET, ast_copy_string(), ast_log, AST_MAX_CONNECTS, ast_pthread_create_background, ast_sd_get_fd_un(), ast_socket, ast_socket_is_sd, ast_strlen_zero(), consoles, errno, console::fd, listener(), LOG_WARNING, lthread, NULL, and PF_LOCAL.

Referenced by asterisk_daemon().

◆ ast_mark()

int64_t ast_mark ( int  i,
int  startstop 
)

Definition at line 885 of file asterisk.c.

886{
887#if !defined(LOW_MEMORY)
888 if (!prof_data || i < 0 || i > prof_data->entries) /* invalid index */
889 return 0;
890 if (startstop == 1)
891 prof_data->e[i].mark = rdtsc();
892 else {
893 prof_data->e[i].mark = (rdtsc() - prof_data->e[i].mark);
894 if (prof_data->e[i].scale > 1)
895 prof_data->e[i].mark /= prof_data->e[i].scale;
896 prof_data->e[i].value += prof_data->e[i].mark;
897 prof_data->e[i].events++;
898 }
899 return prof_data->e[i].mark;
900#else /* if defined(LOW_MEMORY) */
901 return 0;
902#endif
903}
static __inline uint64_t rdtsc(void)
Definition asterisk.c:878

References profile_data::e, profile_data::entries, profile_entry::events, profile_entry::mark, prof_data, rdtsc(), profile_entry::scale, and profile_entry::value.

◆ ast_network_puts()

static void ast_network_puts ( const char *  string)
static

write the string to all attached console clients

Definition at line 1352 of file asterisk.c.

1353{
1354 int x;
1355
1356 for (x = 0; x < AST_MAX_CONNECTS; ++x) {
1357 if (consoles[x].fd < 0) {
1358 continue;
1359 }
1360 fdprint(consoles[x].p[1], string);
1361 }
1362}
static int fdprint(int fd, const char *s)
Definition asterisk.c:1086

References AST_MAX_CONNECTS, consoles, and fdprint().

Referenced by ast_console_puts().

◆ ast_network_puts_mutable()

static void ast_network_puts_mutable ( const char *  string,
int  level,
int  sublevel 
)
static

log the string to all attached network console clients

Definition at line 1309 of file asterisk.c.

1310{
1311 int x;
1312
1313 for (x = 0; x < AST_MAX_CONNECTS; ++x) {
1314 if (consoles[x].fd < 0
1315 || consoles[x].mute
1316 || consoles[x].levels[level]
1317 || (level == __LOG_VERBOSE && consoles[x].option_verbose < sublevel)) {
1318 continue;
1319 }
1320 fdprint(consoles[x].p[1], string);
1321 }
1322}
int option_verbose
Definition options.c:68
#define __LOG_VERBOSE
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition logger.c:227

References __LOG_VERBOSE, AST_MAX_CONNECTS, consoles, fdprint(), levels, and option_verbose.

Referenced by ast_console_puts_mutable_full().

◆ ast_pbx_uuid_get()

int ast_pbx_uuid_get ( char *  pbx_uuid,
int  length 
)

Retrieve the PBX UUID.

Parameters
pbx_uuidA buffer of at least AST_UUID_STR_LEN (36 + 1) size to receive the UUID
lengthThe buffer length

Definition at line 984 of file asterisk.c.

985{
986 return ast_db_get("pbx", "UUID", pbx_uuid, length);
987}
int ast_db_get(const char *family, const char *key, char *value, int valuelen)
Get key value specified by family/key.
Definition db.c:421

References ast_db_get().

Referenced by asterisk_daemon(), and handle_show_settings().

◆ ast_profile()

int64_t ast_profile ( int  i,
int64_t  delta 
)

Definition at line 844 of file asterisk.c.

845{
846#if !defined(LOW_MEMORY)
847 if (!prof_data || i < 0 || i > prof_data->entries) /* invalid index */
848 return 0;
849 if (prof_data->e[i].scale > 1)
850 delta /= prof_data->e[i].scale;
851 prof_data->e[i].value += delta;
852 prof_data->e[i].events++;
853 return prof_data->e[i].value;
854#else /* if defined(LOW_MEMORY) */
855 return 0;
856#endif
857}

References profile_data::e, profile_data::entries, profile_entry::events, prof_data, profile_entry::scale, and profile_entry::value.

◆ ast_register_atexit()

int ast_register_atexit ( void(*)(void)  func)

Register a function to be executed before Asterisk exits.

Parameters
funcThe callback function to use.
Return values
0on success.
-1on error.
Note
This function should be rarely used in situations where something must be shutdown to avoid corruption, excessive data loss, or when external programs must be stopped. All other cleanup in the core should use ast_register_cleanup.

Definition at line 1062 of file asterisk.c.

1063{
1064 return register_atexit(func, 0);
1065}
static int register_atexit(void(*func)(void), int is_cleanup)
Definition asterisk.c:1043

References ast_atexit::func, and register_atexit().

Referenced by asterisk_daemon().

◆ ast_register_cleanup()

int ast_register_cleanup ( void(*)(void)  func)

Register a function to be executed before Asterisk gracefully exits.

Since
11.9

If Asterisk is immediately shutdown (core stop now, or sending the TERM signal), the callback is not run. When the callbacks are run, they are run in sequence with ast_register_atexit() callbacks, in the reverse order of registration.

Parameters
funcThe callback function to use.
Return values
0on success.
-1on error.

Definition at line 1067 of file asterisk.c.

1068{
1069 return register_atexit(func, 1);
1070}

References ast_atexit::func, and register_atexit().

Referenced by asterisk_daemon().

◆ ast_register_thread()

void ast_register_thread ( char *  name)

Definition at line 422 of file asterisk.c.

423{
424 struct thread_list_t *new = ast_calloc(1, sizeof(*new));
425
426 if (!new)
427 return;
428
430 new->id = pthread_self();
431 new->lwp = ast_get_tid();
432 new->name = name; /* steal the allocated memory for the thread name */
436}
static int multi_thread_safe
Definition asterisk.c:396
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_RWLIST_INSERT_HEAD
struct thread_list_t::@318 list
#define ast_assert(a)
Definition utils.h:779
int ast_get_tid(void)
Get current thread ID.
Definition utils.c:2786

References ast_assert, ast_calloc, ast_get_tid(), AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, thread_list_t::list, multi_thread_safe, and name.

Referenced by dummy_start().

◆ ast_remotecontrol()

static void ast_remotecontrol ( char *  data)
static

Definition at line 3257 of file asterisk.c.

3258{
3259 char buf[256] = "";
3260 int res;
3261 char *hostname;
3262 char *cpid;
3263 char *version;
3264 int pid;
3265 char *stringp = NULL;
3266
3267 char *ebuf;
3268 int num = 0;
3269
3270 ast_term_init();
3271 printf("%s", term_end());
3272 fflush(stdout);
3273
3274 memset(&sig_flags, 0, sizeof(sig_flags));
3275 signal(SIGINT, __remote_quit_handler);
3276 signal(SIGTERM, __remote_quit_handler);
3277 signal(SIGHUP, __remote_quit_handler);
3278
3279 if (read(ast_consock, buf, sizeof(buf) - 1) < 0) {
3280 ast_log(LOG_ERROR, "read() failed: %s\n", strerror(errno));
3281 return;
3282 }
3283 if (data) {
3284 char prefix[] = "cli quit after ";
3285 char *tmp = ast_alloca(strlen(data) + strlen(prefix) + 1);
3286 sprintf(tmp, "%s%s", prefix, data);
3287 if (write(ast_consock, tmp, strlen(tmp) + 1) < 0) {
3288 ast_log(LOG_ERROR, "write() failed: %s\n", strerror(errno));
3289 if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
3290 return;
3291 }
3292 }
3293 }
3294 stringp = buf;
3295 hostname = strsep(&stringp, "/");
3296 cpid = strsep(&stringp, "/");
3297 version = strsep(&stringp, "\n");
3298 if (!version)
3299 version = "<Version Unknown>";
3300 stringp = hostname;
3301 strsep(&stringp, ".");
3302 if (cpid)
3303 pid = atoi(cpid);
3304 else
3305 pid = -1;
3306 if (!data) {
3308 }
3309
3310 if (ast_opt_exec && data) { /* hack to print output then exit if asterisk -rx is used */
3311 int linefull = 1, prev_linefull = 1, prev_line_verbose = 0;
3312 struct pollfd fds;
3313 fds.fd = ast_consock;
3314 fds.events = POLLIN;
3315 fds.revents = 0;
3316
3317 while (ast_poll(&fds, 1, 60000) > 0) {
3318 char buffer[512] = "", *curline = buffer, *nextline;
3319 int not_written = 1;
3320
3321 if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
3322 break;
3323 }
3324
3325 if (read(ast_consock, buffer, sizeof(buffer) - 1) <= 0) {
3326 break;
3327 }
3328
3329 do {
3330 prev_linefull = linefull;
3331 if ((nextline = strchr(curline, '\n'))) {
3332 linefull = 1;
3333 nextline++;
3334 } else {
3335 linefull = 0;
3336 nextline = strchr(curline, '\0');
3337 }
3338
3339 /* Skip verbose lines */
3340 /* Prev line full? | Line is verbose | Last line verbose? | Print
3341 * TRUE | TRUE* | TRUE | FALSE
3342 * TRUE | TRUE* | FALSE | FALSE
3343 * TRUE | FALSE* | TRUE | TRUE
3344 * TRUE | FALSE* | FALSE | TRUE
3345 * FALSE | TRUE | TRUE* | FALSE
3346 * FALSE | TRUE | FALSE* | TRUE
3347 * FALSE | FALSE | TRUE* | FALSE
3348 * FALSE | FALSE | FALSE* | TRUE
3349 */
3350 if ((!prev_linefull && !prev_line_verbose) || (prev_linefull && *curline > 0)) {
3351 prev_line_verbose = 0;
3352 not_written = 0;
3353 if (write(STDOUT_FILENO, curline, nextline - curline) < 0) {
3354 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
3355 }
3356 } else {
3357 prev_line_verbose = 1;
3358 }
3359 curline = nextline;
3360 } while (!ast_strlen_zero(curline));
3361
3362 /* No non-verbose output in 60 seconds. */
3363 if (not_written) {
3364 break;
3365 }
3366 }
3367 return;
3368 }
3369
3370 ast_verbose("Connected to Asterisk %s currently running on %s (pid = %d)\n", version, hostname, pid);
3372
3374 if (el_hist == NULL || el == NULL)
3377
3378 el_set(el, EL_GETCFN, ast_el_read_char);
3379
3380 for (;;) {
3381 ebuf = (char *)el_gets(el, &num);
3382
3383 if (sig_flags.need_quit || sig_flags.need_quit_handler || sig_flags.need_el_end) {
3384 break;
3385 }
3386
3387 if (!ebuf && write(1, "", 1) < 0)
3388 break;
3389
3390 if (!ast_strlen_zero(ebuf)) {
3391 if (ebuf[strlen(ebuf)-1] == '\n')
3392 ebuf[strlen(ebuf)-1] = '\0';
3393 if (!remoteconsolehandler(ebuf)) {
3394 res = write(ast_consock, ebuf, strlen(ebuf) + 1);
3395 if (res < 1) {
3396 ast_log(LOG_WARNING, "Unable to write: %s\n", strerror(errno));
3397 break;
3398 }
3399 }
3400 }
3401 }
3402 printf("\nDisconnected from Asterisk server\n");
3403}
int ast_term_init(void)
Definition term.c:165
static char * remotehostname
Definition asterisk.c:349
static void __remote_quit_handler(int num)
Definition asterisk.c:2164
static int remoteconsolehandler(const char *s)
Definition asterisk.c:2328
static int ast_el_read_char(EditLine *editline, CHAR_T_LIBEDIT *cp)
Definition asterisk.c:2696
static void ast_el_read_default_histfile(void)
Definition asterisk.c:3247
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
static char version[AST_MAX_EXTENSION]
void ast_init_logger_for_socket_console(void)
load logger.conf configuration for console socket connections
Definition logger.c:726
static char prefix[MAX_PREFIX]
Definition http.c:145
#define LOG_ERROR
#define ast_verbose(...)
static char hostname[MAXHOSTNAMELEN]
Definition logger.c:124
const char * term_end(void)
Definition term.c:407

References __remote_quit_handler(), ast_alloca, ast_consock, ast_el_initialize(), ast_el_read_char(), ast_el_read_default_histfile(), ast_init_logger_for_socket_console(), ast_log, ast_opt_exec, ast_poll, ast_strlen_zero(), ast_term_init(), ast_verbose, buf, el, el_hist, errno, hostname, LOG_ERROR, LOG_WARNING, NULL, prefix, remoteconsolehandler(), remotehostname, send_rasterisk_connect_commands(), sig_flags, strsep(), term_end(), and version.

Referenced by main().

◆ ast_replace_sigchld()

void ast_replace_sigchld ( void  )

Replace the SIGCHLD handler.

Normally, Asterisk has a SIGCHLD handler that is cleaning up all zombie processes from forking elsewhere in Asterisk. However, if you want to wait*() on the process to retrieve information about it's exit status, then this signal handler needs to be temporarily replaced.

Code that executes this function must call ast_unreplace_sigchld() after it is finished doing the wait*().

Definition at line 1112 of file asterisk.c.

1113{
1114 unsigned int level;
1115
1117 level = safe_system_level++;
1118
1119 /* only replace the handler if it has not already been done */
1120 if (level == 0) {
1121 sigaction(SIGCHLD, &null_sig_handler, &safe_system_prev_handler);
1122 }
1123
1125}
static unsigned int safe_system_level
Keep track of how many threads are currently trying to wait*() on a child process.
Definition asterisk.c:1109
static struct sigaction safe_system_prev_handler
Definition asterisk.c:1110
static struct sigaction null_sig_handler
Definition asterisk.c:1096

References ast_mutex_lock, ast_mutex_unlock, null_sig_handler, safe_system_level, safe_system_lock, and safe_system_prev_handler.

Referenced by safe_exec_prep().

◆ ast_run_atexits()

static void ast_run_atexits ( int  run_cleanups)
static

Definition at line 1015 of file asterisk.c.

1016{
1017 struct ast_atexit *ae;
1018
1020 while ((ae = AST_LIST_REMOVE_HEAD(&atexits, list))) {
1021 if (ae->func && (!ae->is_cleanup || run_cleanups)) {
1022 ae->func();
1023 }
1024 ast_free(ae);
1025 }
1027}
#define AST_LIST_LOCK(head)
Locks a list.
Definition linkedlists.h:40
#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 is_cleanup
Definition asterisk.c:338

References ast_free, AST_LIST_LOCK, AST_LIST_REMOVE_HEAD, AST_LIST_UNLOCK, ast_atexit::func, ast_atexit::is_cleanup, and ast_atexit::list.

Referenced by check_init(), and really_quit().

◆ ast_safe_execvp()

int ast_safe_execvp ( int  dualfork,
const char *  file,
char *const  argv[] 
)

Safely spawn an external program while closing file descriptors.

Note
This replaces the execvp call in all Asterisk modules
Parameters
dualforkNon-zero to simulate running the program in the background by forking twice. The option provides similar functionality to the '&' in the OS shell command "cmd &". The option allows Asterisk to run a reaper loop to watch the first fork which immediately exits after spaning the second fork. The actual program is run in the second fork.
fileexecvp(file, argv) file parameter
argvexecvp(file, argv) argv parameter

Definition at line 1234 of file asterisk.c.

1235{
1236 pid_t pid = safe_exec_prep(dualfork);
1237
1238 if (pid == 0) {
1239 execvp(file, argv);
1240 _exit(1);
1241 /* noreturn from _exit */
1242 }
1243
1244 return safe_exec_wait(pid);
1245}
static int safe_exec_wait(pid_t pid)
wait for spawned application to complete and unreplace sigchld
Definition asterisk.c:1208
static pid_t safe_exec_prep(int dualfork)
fork and perform other preparations for spawning applications
Definition asterisk.c:1147

References safe_exec_prep(), and safe_exec_wait().

Referenced by run_externnotify().

◆ ast_safe_system()

int ast_safe_system ( const char *  s)

Safely spawn an OS shell command while closing file descriptors.

Note
This replaces the system call in all Asterisk modules
Parameters
s- OS shell command string to execute.
Warning
Command injection can happen using this call if the passed in string is created using untrusted data from an external source. It is best not to use untrusted data. However, the caller could filter out dangerous characters to avoid command injection.

Definition at line 1247 of file asterisk.c.

1248{
1249 pid_t pid = safe_exec_prep(0);
1250
1251 if (pid == 0) {
1252 execl("/bin/sh", "/bin/sh", "-c", s, (char *) NULL);
1253 _exit(1);
1254 /* noreturn from _exit */
1255 }
1256
1257 return safe_exec_wait(pid);
1258}

References NULL, safe_exec_prep(), and safe_exec_wait().

Referenced by consolehandler(), and remoteconsolehandler().

◆ ast_set_priority()

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 activity on it, this is a good thing.

Provided by asterisk.c

Definition at line 1853 of file asterisk.c.

1854{
1855 struct sched_param sched;
1856 memset(&sched, 0, sizeof(sched));
1857#ifdef __linux__
1858 if (pri) {
1859 sched.sched_priority = 10;
1860 if (sched_setscheduler(0, SCHED_RR, &sched)) {
1861 return -1;
1862 }
1863 } else {
1864 sched.sched_priority = 0;
1865 /* According to the manpage, these parameters can never fail. */
1866 sched_setscheduler(0, SCHED_OTHER, &sched);
1867 }
1868#else
1869 if (pri) {
1870 if (setpriority(PRIO_PROCESS, 0, -10) == -1) {
1871 ast_log(LOG_WARNING, "Unable to set high priority\n");
1872 return -1;
1873 } else
1874 ast_verb(1, "Set to high priority\n");
1875 } else {
1876 /* According to the manpage, these parameters can never fail. */
1877 setpriority(PRIO_PROCESS, 0, 0);
1878 }
1879#endif
1880 return 0;
1881}
#define sched_setscheduler
Definition asterisk.h:51
#define setpriority
Definition asterisk.h:50
#define ast_verb(level,...)
Definition sched.c:76

References ast_log, ast_verb, LOG_WARNING, sched_setscheduler, and setpriority.

Referenced by app_exec(), asterisk_daemon(), launch_script(), main(), mp3play(), safe_exec_prep(), send_waveform_to_fd(), set_priority_all(), and spawn_mp3().

◆ ast_shutdown_final()

int ast_shutdown_final ( void  )
Returns
non-zero if the server is actively shutting down.
Since
13.3.0

The server is releasing resources and unloading modules. It won't be long now.

Definition at line 1883 of file asterisk.c.

1884{
1886}

References SHUTTING_DOWN_FINAL, and shuttingdown.

Referenced by httpd_process_request(), load_resource(), send_notify(), session_inv_on_media_update(), session_inv_on_redirected(), session_inv_on_rx_offer(), session_inv_on_state_changed(), session_inv_on_tsx_state_changed(), unload_module(), and unload_module().

◆ ast_shutting_down()

int ast_shutting_down ( void  )

The server is preventing new channel creation in preparation for shutdown and may actively be releasing resources. The shutdown process may be canceled by ast_cancel_shutdown() if it is not too late.

Note
The preparation to shutdown phase can be quite lengthy if we are gracefully shutting down. How long existing calls will last is not up to us.
Returns
non-zero if the server is preparing to or actively shutting down.

Definition at line 1888 of file asterisk.c.

1889{
1890 return shutdown_pending;
1891}

References shutdown_pending.

Referenced by __ast_channel_alloc_ap(), ast_cli_command_full(), ast_unregister_translator(), confbridge_exec(), options_on_rx_request(), and process_message().

◆ AST_THREADSTORAGE_CUSTOM_SCOPE()

AST_THREADSTORAGE_CUSTOM_SCOPE ( console_state  ,
console_state_init  ,
ast_free_ptr  ,
static   
)

◆ ast_tryconnect()

static int ast_tryconnect ( void  )
static

Definition at line 1696 of file asterisk.c.

1697{
1698 struct sockaddr_un sunaddr;
1699 int res;
1700 ast_consock = socket(PF_LOCAL, SOCK_STREAM, 0);
1701 if (ast_consock < 0) {
1702 fprintf(stderr, "Unable to create socket: %s\n", strerror(errno));
1703 return 0;
1704 }
1705 memset(&sunaddr, 0, sizeof(sunaddr));
1706 sunaddr.sun_family = AF_LOCAL;
1707 ast_copy_string(sunaddr.sun_path, ast_config_AST_SOCKET, sizeof(sunaddr.sun_path));
1708 res = connect(ast_consock, (struct sockaddr *)&sunaddr, sizeof(sunaddr));
1709 if (res) {
1710 close(ast_consock);
1711 ast_consock = -1;
1712 return 0;
1713 } else
1714 return 1;
1715}

References AF_LOCAL, ast_config_AST_SOCKET, ast_consock, ast_copy_string(), errno, and PF_LOCAL.

Referenced by ast_el_read_char(), and main().

◆ ast_unregister_atexit()

void ast_unregister_atexit ( void(*)(void)  func)

Unregister a function registered with ast_register_atexit().

Parameters
funcThe callback function to unregister.

Definition at line 1072 of file asterisk.c.

1073{
1077}
static void __ast_unregister_atexit(void(*func)(void))
Definition asterisk.c:1029

References __ast_unregister_atexit(), AST_LIST_LOCK, AST_LIST_UNLOCK, and ast_atexit::func.

Referenced by unload_module(), and unload_module().

◆ ast_unregister_thread()

void ast_unregister_thread ( void *  id)

Definition at line 438 of file asterisk.c.

439{
440 struct thread_list_t *x;
441
444 if ((void *) x->id == id) {
446 break;
447 }
448 }
451 if (x) {
452 ast_free(x->name);
453 ast_free(x);
454 }
455}
#define AST_RWLIST_REMOVE_CURRENT
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_RWLIST_TRAVERSE_SAFE_END
pthread_t id
Definition asterisk.c:416
char * name
Definition asterisk.c:415

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, thread_list_t::id, thread_list_t::list, and thread_list_t::name.

Referenced by dummy_start().

◆ ast_unreplace_sigchld()

void ast_unreplace_sigchld ( void  )

Restore the SIGCHLD handler.

This function is called after a call to ast_replace_sigchld. It restores the SIGCHLD handler that cleans up any zombie processes.

Definition at line 1127 of file asterisk.c.

1128{
1129 unsigned int level;
1130
1132
1133 /* Wrapping around here is an error */
1135
1136 level = --safe_system_level;
1137
1138 /* only restore the handler if we are the last one */
1139 if (level == 0) {
1140 sigaction(SIGCHLD, &safe_system_prev_handler, NULL);
1141 }
1142
1144}

References ast_assert, ast_mutex_lock, ast_mutex_unlock, NULL, safe_system_level, safe_system_lock, and safe_system_prev_handler.

Referenced by safe_exec_wait().

◆ asterisk_daemon()

static void asterisk_daemon ( int  isroot,
const char *  runuser,
const char *  rungroup 
)
static

Definition at line 4127 of file asterisk.c.

4128{
4129 FILE *f;
4130 sigset_t sigs;
4131 int num;
4132 char *buf;
4133 char pbx_uuid[AST_UUID_STR_LEN];
4134
4135 /* Set time as soon as possible */
4137
4138 /* This needs to remain as high up in the initial start up as possible.
4139 * daemon causes a fork to occur, which has all sorts of unintended
4140 * consequences for things that interact with threads. This call *must*
4141 * occur before anything in Asterisk spawns or manipulates thread related
4142 * primitives. */
4143#if HAVE_WORKING_FORK
4145#ifndef HAVE_SBIN_LAUNCHD
4146 if (daemon(1, 0) < 0) {
4147 fprintf(stderr, "daemon() failed: %s\n", strerror(errno));
4148 } else {
4149 ast_mainpid = getpid();
4150 }
4151#else
4152 fprintf(stderr, "Mac OS X detected. Use 'launchctl load /Library/LaunchDaemon/org.asterisk.asterisk.plist'.\n");
4153#endif
4154 }
4155#endif
4156
4157 /* At this point everything has been forked successfully,
4158 * we have determined that we aren't attempting to connect to
4159 * an Asterisk instance, and that there isn't one already running. */
4161
4163
4164 /* Check whether high prio was successfully set by us or some
4165 * other incantation. */
4166 if (has_priority()) {
4168 } else {
4170 }
4171
4172 /* Spawning of astcanary must happen AFTER the call to daemon(3) */
4174 snprintf(canary_filename, sizeof(canary_filename), "%s/alt.asterisk.canary.tweet.tweet.tweet", ast_config_AST_RUN_DIR);
4175
4176 /* Don't let the canary child kill Asterisk, if it dies immediately */
4177 sigaction(SIGPIPE, &ignore_sig_handler, NULL);
4178
4179 canary_pid = fork();
4180 if (canary_pid == 0) {
4181 char canary_binary[PATH_MAX], ppid[12];
4182
4183 /* Reset signal handler */
4184 signal(SIGCHLD, SIG_DFL);
4185 signal(SIGPIPE, SIG_DFL);
4186
4189 snprintf(ppid, sizeof(ppid), "%d", (int) ast_mainpid);
4190
4191 /* Use the astcanary binary that we installed */
4192 snprintf(canary_binary, sizeof(canary_binary), "%s/astcanary", ast_config_AST_SBIN_DIR);
4193 execl(canary_binary, "astcanary", canary_filename, ppid, (char *)NULL);
4194
4195 /* Should never happen */
4196 _exit(1);
4197 } else if (canary_pid > 0) {
4198 pthread_t dont_care;
4200 }
4201
4202 /* Kill the canary when we exit */
4204 }
4205
4206 /* Blindly write the PID file. */
4207 unlink(ast_config_AST_PID);
4208 f = fopen(ast_config_AST_PID, "w");
4209 if (f) {
4210 fprintf(f, "%ld\n", (long)ast_mainpid);
4211 fclose(f);
4212 } else {
4213 fprintf(stderr, "Unable to open pid file '%s': %s\n", ast_config_AST_PID, strerror(errno));
4214 }
4215
4216 /* Initialize the terminal. Since all processes have been forked,
4217 * we can now start using the standard log messages.
4218 */
4219 ast_term_init();
4220 printf("%s", term_end());
4221 fflush(stdout);
4222
4223 print_intro_message(runuser, rungroup);
4224
4226
4227 check_init(astobj2_init(), "AO2");
4228 check_init(ast_named_locks_init(), "Named Locks");
4229
4230 if (ast_opt_console) {
4231 if (el_hist == NULL || el == NULL)
4234 }
4235
4236#ifdef AST_XML_DOCS
4237 /* Load XML documentation. */
4239#endif
4240
4241 check_init(astdb_init(), "ASTdb");
4242
4243 ast_uuid_init();
4244
4245 if (ast_pbx_uuid_get(pbx_uuid, sizeof(pbx_uuid))) {
4246 ast_uuid_generate_str(pbx_uuid, sizeof(pbx_uuid));
4247 ast_db_put("pbx", "UUID", pbx_uuid);
4248 }
4249 ast_verb(0, "PBX UUID: %s\n", pbx_uuid);
4250
4251 check_init(ast_json_init(), "libjansson");
4252 ast_ulaw_init();
4253 ast_alaw_init();
4254 ast_utf8_init();
4255 tdd_init();
4256 callerid_init();
4258
4259 check_init(ast_utils_init(), "Utilities");
4260 check_init(ast_tps_init(), "Task Processor Core");
4261 check_init(ast_taskpool_init(), "Taskpool Support");
4262 check_init(ast_fd_init(), "File Descriptor Debugging");
4263 check_init(ast_pbx_init(), "ast_pbx_init");
4264 check_init(aco_init(), "Configuration Option Framework");
4265 check_init(stasis_init(), "Stasis");
4266#ifdef TEST_FRAMEWORK
4267 check_init(ast_test_init(), "Test Framework");
4268#endif
4269 check_init(ast_translate_init(), "Translator Core");
4270
4272
4273 check_init(ast_sorcery_init(), "Sorcery");
4274 check_init(ast_codec_init(), "Codecs");
4275 check_init(ast_format_init(), "Formats");
4276 check_init(ast_format_cache_init(), "Format Cache");
4277 check_init(ast_codec_builtin_init(), "Built-in Codecs");
4278 check_init(ast_bucket_init(), "Bucket API");
4279 check_init(ast_stasis_system_init(), "Stasis system-level information");
4280 check_init(ast_endpoint_stasis_init(), "Stasis Endpoint");
4281
4283 /* GCC 4.9 gives a bogus "right-hand operand of comma expression has
4284 * no effect" warning */
4285 (void) sigemptyset(&sigs);
4286 (void) sigaddset(&sigs, SIGHUP);
4287 (void) sigaddset(&sigs, SIGTERM);
4288 (void) sigaddset(&sigs, SIGINT);
4289 (void) sigaddset(&sigs, SIGPIPE);
4290 (void) sigaddset(&sigs, SIGWINCH);
4291 pthread_sigmask(SIG_BLOCK, &sigs, NULL);
4292 sigaction(SIGURG, &urg_handler, NULL);
4293 signal(SIGINT, __quit_handler);
4294 signal(SIGTERM, __quit_handler);
4295 sigaction(SIGHUP, &hup_handler, NULL);
4296 sigaction(SIGPIPE, &ignore_sig_handler, NULL);
4297
4298 /* ensure that the random number generators are seeded with a different value every time
4299 Asterisk is started
4300 */
4301 srand((unsigned int) getpid() + (unsigned int) time(NULL));
4302 initstate((unsigned int) getpid() * 65536 + (unsigned int) time(NULL), randompool, sizeof(randompool));
4303
4305
4306 check_init(init_logger(), "Logger");
4308
4309 check_init(ast_rtp_engine_init(), "RTP Engine");
4310
4312
4313 check_init(ast_timing_init(), "Timing");
4314 check_init(ast_ssl_init(), "SSL");
4316 check_init(ast_pj_init(), "Embedded PJProject");
4317 check_init(app_init(), "App Core");
4318 check_init(mwi_init(), "MWI Core");
4319 check_init(devstate_init(), "Device State Core");
4320 check_init(ast_msg_init(), "Messaging API");
4321 check_init(ast_channels_init(), "Channel");
4322 check_init(ast_endpoint_init(), "Endpoints");
4323 check_init(ast_pickup_init(), "Call Pickup");
4324 check_init(ast_bridging_init(), "Bridging");
4325 check_init(ast_parking_stasis_init(), "Parking Core");
4326 check_init(ast_device_state_engine_init(), "Device State Engine");
4327 check_init(ast_presence_state_engine_init(), "Presence State Engine");
4328 check_init(dns_core_init(), "DNS Resolver Core");
4329 check_init(ast_dns_system_resolver_init(), "Default DNS resolver");
4330 check_init(ast_security_stasis_init(), "Security Stasis Topic and Events");
4331 check_init(ast_image_init(), "Image");
4332 check_init(ast_file_init(), "Generic File Format Support");
4333 check_init(load_pbx(), "load_pbx");
4334 check_init(load_pbx_builtins(), "Builtin PBX Applications");
4335 check_init(load_pbx_functions_cli(), "PBX Functions Support");
4336 check_init(load_pbx_variables(), "PBX Variables Support");
4337 check_init(load_pbx_switch(), "PBX Switch Support");
4338 check_init(load_pbx_app(), "PBX Application Support");
4339 check_init(load_pbx_hangup_handler(), "PBX Hangup Handler Support");
4340 check_init(ast_extension_state_init(), "Extension State Support");
4341 check_init(ast_extension_state_legacy_init(), "Extension State Legacy Support");
4342 check_init(ast_extension_state_autohints_init(), "Extension State Autohints Support");
4343 check_init(ast_local_init(), "Local Proxy Channel Driver");
4344 check_init(ast_refer_init(), "Refer API");
4345
4347
4348 /* We should avoid most config loads before this point as they can't use realtime. */
4349 check_init(load_modules(), "Module");
4350
4351 /*
4352 * This has to load after the dynamic modules load, as items in the media
4353 * cache can't be constructed from items in the AstDB without their
4354 * bucket backends.
4355 */
4356 check_init(ast_media_cache_init(), "Media Cache");
4357
4358 /* loads the cli_permissions.conf file needed to implement cli restrictions. */
4360 ast_cli_channels_init(); /* Not always safe to access CLI commands until startup is complete. */
4361
4362 ast_stun_init();
4363
4365
4366 if (ast_opt_no_fork) {
4367 consolethread = pthread_self();
4368 }
4369
4371
4373
4376
4377 pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
4378
4380
4384
4386 ast_sd_notify("READY=1");
4387
4388 ast_verb(0, COLORIZE_FMT "\n", COLORIZE(COLOR_BRGREEN, 0, "Asterisk Ready."));
4389
4391
4392 if (ast_opt_console) {
4393 /* Console stuff now... */
4394 /* Register our quit function */
4395 char title[296];
4396 char hostname[MAXHOSTNAMELEN] = "";
4397
4398 if (gethostname(hostname, sizeof(hostname) - 1)) {
4399 ast_copy_string(hostname, "<Unknown>", sizeof(hostname));
4400 }
4401
4403
4404 set_icon("Asterisk");
4405 snprintf(title, sizeof(title), "Asterisk Console on '%s' (pid %ld)", hostname, (long)ast_mainpid);
4406 set_title(title);
4407
4408 el_set(el, EL_GETCFN, ast_el_read_char);
4409
4410 for (;;) {
4411 if (sig_flags.need_el_end) {
4412 el_end(el);
4413
4414 return;
4415 }
4416
4417 if (sig_flags.need_quit || sig_flags.need_quit_handler) {
4419 break;
4420 }
4421 buf = (char *) el_gets(el, &num);
4422
4423 if (!buf && write(1, "", 1) < 0)
4424 return; /* quit */
4425
4426 if (buf) {
4427 if (buf[strlen(buf)-1] == '\n')
4428 buf[strlen(buf)-1] = '\0';
4429
4431 }
4432 }
4433 }
4434
4435 /* Stall until a quit signal is given */
4437}
int load_pbx_variables(void)
void threadstorage_init(void)
void ast_process_pending_reloads(void)
Process reload requests received during startup.
Definition loader.c:1575
int ast_bridging_init(void)
Initialize the bridging system.
Definition bridge.c:5753
void dnsmgr_start_refresh(void)
Definition dnsmgr.c:302
int ast_extension_state_autohints_init(void)
int ast_timing_init(void)
Definition timing.c:289
int ast_device_state_engine_init(void)
Initialize the device state engine in separate thread.
int load_modules(void)
Definition loader.c:2517
void ast_cli_channels_init(void)
Definition main/cli.c:2329
void logger_queue_start(void)
Start the ast_queue_log() logger.
Definition logger.c:2175
int aco_init(void)
int ast_test_init(void)
Definition test.c:1505
void ast_stun_init(void)
Initialize the STUN system in Asterisk.
Definition stun.c:576
int astdb_init(void)
Definition db.c:1250
int ast_pj_init(void)
int load_pbx_functions_cli(void)
int ast_tps_init(void)
void load_astmm_phase_2(void)
Initialize malloc debug phase 2.
Definition astmm.c:1529
int ast_extension_state_legacy_init(void)
int ast_msg_init(void)
int load_pbx_hangup_handler(void)
int ast_extension_state_init(void)
int ast_local_init(void)
Initialize the local proxy channel.
int load_pbx_builtins(void)
int load_pbx_switch(void)
Definition pbx_switch.c:125
int ast_rtp_engine_init(void)
initializes the rtp engine arrays
int ast_xmldoc_load_documentation(void)
Load XML documentation. Provided by xmldoc.c.
Definition xmldoc.c:3214
int ast_named_locks_init(void)
Definition named_locks.c:52
int ast_taskpool_init(void)
Definition taskpool.c:1110
int ast_channels_init(void)
Definition channel.c:8177
void load_astmm_phase_1(void)
Initialize malloc debug phase 1.
Definition astmm.c:1525
void ast_builtins_init(void)
initialize the _full_cmd string in * each of the builtins.
Definition main/cli.c:2322
void ast_autoservice_init(void)
int init_logger(void)
Definition logger.c:2191
int ast_endpoint_init(void)
Endpoint support initialization.
int dns_core_init(void)
Definition dns_core.c:617
int load_pbx(void)
Definition pbx.c:6594
int astobj2_init(void)
Definition astobj2.c:1169
int load_pbx_app(void)
Definition pbx_app.c:550
int ast_dns_system_resolver_init(void)
Initializes the resolver.
int ast_ssl_init(void)
int ast_cli_perms_init(int reload)
Definition main/cli.c:2189
int ast_file_init(void)
Definition file.c:2155
int ast_refer_init(void)
Definition refer.c:531
int ast_parking_stasis_init(void)
initializes the rtp engine arrays
Definition parking.c:53
void ast_alaw_init(void)
To init the alaw to slinear conversion stuff, this needs to be run.
Definition alaw.c:152
int ast_alertpipe_init(int alert_pipe[2])
Initialize an alert pipe.
Definition alertpipe.c:38
int ast_aoc_cli_init(void)
enable aoc cli options
Definition aoc.c:2029
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
Definition db.c:335
static void canary_exit(void)
Definition asterisk.c:3538
static void check_init(int init_result, const char *name)
Definition asterisk.c:4114
static void publish_fully_booted(void)
Definition asterisk.c:989
static void main_atexit(void)
Definition asterisk.c:3615
static char randompool[256]
Definition asterisk.c:398
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition asterisk.c:1067
static char canary_filename[128]
Definition asterisk.c:395
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...
Definition asterisk.c:1853
static int has_priority(void)
Check whether we were set to high(er) priority.
Definition asterisk.c:1790
static struct sigaction hup_handler
Definition asterisk.c:1751
static pthread_t mon_sig_flags
Definition asterisk.c:393
int ast_pbx_uuid_get(char *pbx_uuid, int length)
Retrieve the PBX UUID.
Definition asterisk.c:984
struct timeval ast_lastreloadtime
Definition asterisk.c:345
static void * monitor_sig_flags(void *unused)
Definition asterisk.c:3484
static void consolehandler(const char *s)
Definition asterisk.c:2310
static struct ast_cli_entry cli_asterisk_shutdown[]
Shutdown Asterisk CLI commands.
Definition asterisk.c:2634
int ast_register_atexit(void(*func)(void))
Register a function to be executed before Asterisk exits.
Definition asterisk.c:1062
static void set_title(char *text)
Set an X-term or screen title.
Definition asterisk.c:1777
static int ast_makesocket(void)
Definition asterisk.c:1610
static int canary_pid
Definition asterisk.c:394
static void * canary_thread(void *unused)
Definition asterisk.c:3509
static struct ast_cli_entry cli_asterisk[]
Definition asterisk.c:2643
struct timeval ast_startuptime
Definition asterisk.c:344
static void read_pjproject_startup_options(void)
Definition asterisk.c:3450
pid_t ast_mainpid
Definition asterisk.c:323
static void __quit_handler(int num)
Definition asterisk.c:2154
static void set_icon(char *text)
Definition asterisk.c:1783
static void print_intro_message(const char *runuser, const char *rungroup)
Definition asterisk.c:3602
static struct sigaction ignore_sig_handler
Definition asterisk.c:1101
static struct sigaction urg_handler
Definition asterisk.c:1728
static void run_startup_commands(enum startup_commands_phase phase)
Definition asterisk.c:3560
int ast_pbx_init(void)
Definition pbx.c:7045
int ast_fd_init(void)
Definition astfd.c:371
#define PATH_MAX
Definition asterisk.h:40
int ast_bucket_init(void)
Initialize bucket support.
Definition bucket.c:924
void callerid_init(void)
CallerID Initialization.
Definition callerid.c:116
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition cli.h:265
int ast_codec_init(void)
Initialize codec support within the core.
Definition codec.c:250
int ast_codec_builtin_init(void)
Initialize built-in codecs within the core.
int devstate_init(void)
Initialize the device state core.
int ast_format_init(void)
Initialize media format support.
Definition format.c:77
int ast_format_cache_init(void)
Initialize format cache support within the core.
struct ast_flags64 ast_options
Definition options.c:62
@ AST_OPT_FLAG_HIGH_PRIORITY
Definition options.h:49
@ AST_OPT_FLAG_FULLY_BOOTED
Definition options.h:59
int ast_image_init(void)
Initialize image stuff Initializes all the various image stuff. Basically just registers the cli stuf...
Definition image.c:212
int app_init(void)
Initialize the application core.
Definition main/app.c:3366
void ast_close_fds_above_n(int n)
Common routine for child processes, to close all fds prior to exec(2)
Definition main/app.c:3203
int register_config_cli(void)
Exposed initialization method for core process.
int ast_sd_notify(const char *state)
a wrapper for sd_notify(): notify systemd of any state changes.
Definition io.c:392
int ast_json_init(void)
Initialize the JSON library.
Definition json.c:726
int ast_media_cache_init(void)
Initialize the media cache.
int mwi_init(void)
Initialize the mwi core.
Definition mwi.c:507
#define MAXHOSTNAMELEN
Definition network.h:69
#define ast_opt_high_priority
Definition options.h:122
#define ast_opt_always_fork
Definition options.h:136
#define ast_opt_no_fork
Definition options.h:119
const char * ast_config_AST_PID
Definition options.c:167
const char * ast_config_AST_RUN_DIR
Definition options.c:163
const char * ast_config_AST_SBIN_DIR
Definition options.c:164
int ast_pickup_init(void)
Initialize pickup.
Definition pickup.c:402
int ast_presence_state_engine_init(void)
int ast_security_stasis_init(void)
initializes stasis topic/event types for ast_security_topic and ast_security_event_type
int ast_sorcery_init(void)
Initialize the sorcery API.
Definition sorcery.c:444
int stasis_init(void)
Initialize the Stasis subsystem.
Definition stasis.c:3283
int ast_endpoint_stasis_init(void)
Initialization function for endpoint stasis support.
int ast_stasis_system_init(void)
Initialize the stasis system topic and message types.
void tdd_init(void)
Definition tdd.c:94
#define COLOR_BRGREEN
Definition term.h:55
#define COLORIZE(fg, bg, str)
Definition term.h:72
#define COLORIZE_FMT
Shortcut macros for coloring a set of text.
Definition term.h:71
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition time.h:159
int ast_translate_init(void)
Initialize the translation matrix and index to format conversion table.
Definition translate.c:1949
void ast_ulaw_init(void)
Set up mu-law conversion table.
Definition ulaw.c:173
int ast_utf8_init(void)
Register UTF-8 tests.
Definition utf8.c:919
#define ast_clear_flag64(p, flag)
Definition utils.h:154
int ast_utils_init(void)
Definition utils.c:2651
#define ast_pthread_create_detached(a, b, c, d)
Definition utils.h:628
#define ast_set_flag64(p, flag)
Definition utils.h:147
#define ARRAY_LEN(a)
Definition utils.h:706
#define AST_UUID_STR_LEN
Definition uuid.h:27
void ast_uuid_init(void)
Initialize the UUID system.
Definition uuid.c:192
char * ast_uuid_generate_str(char *buf, size_t size)
Generate a UUID string.
Definition uuid.c:141

References __quit_handler(), aco_init(), app_init(), ARRAY_LEN, ast_alaw_init(), ast_alertpipe_init(), ast_aoc_cli_init(), ast_autoservice_init(), ast_bridging_init(), ast_bucket_init(), ast_builtins_init(), ast_channels_init(), ast_clear_flag64, ast_cli_channels_init(), ast_cli_perms_init(), ast_cli_register_multiple, ast_close_fds_above_n(), ast_codec_builtin_init(), ast_codec_init(), ast_config_AST_PID, ast_config_AST_RUN_DIR, ast_config_AST_SBIN_DIR, ast_copy_string(), ast_db_put(), ast_device_state_engine_init(), ast_dns_system_resolver_init(), ast_el_initialize(), ast_el_read_char(), ast_el_read_default_histfile(), ast_endpoint_init(), ast_endpoint_stasis_init(), ast_extension_state_autohints_init(), ast_extension_state_init(), ast_extension_state_legacy_init(), ast_fd_init(), ast_file_init(), ast_format_cache_init(), ast_format_init(), ast_image_init(), ast_json_init(), ast_lastreloadtime, ast_local_init(), ast_mainpid, ast_makesocket(), ast_media_cache_init(), ast_msg_init(), ast_named_locks_init(), ast_opt_always_fork, ast_opt_console, AST_OPT_FLAG_FULLY_BOOTED, AST_OPT_FLAG_HIGH_PRIORITY, ast_opt_high_priority, ast_opt_no_fork, ast_options, ast_parking_stasis_init(), ast_pbx_init(), ast_pbx_uuid_get(), ast_pickup_init(), ast_pj_init(), ast_presence_state_engine_init(), ast_process_pending_reloads(), ast_pthread_create_detached, ast_refer_init(), ast_register_atexit(), ast_register_cleanup(), ast_rtp_engine_init(), ast_sd_notify(), ast_security_stasis_init(), ast_set_flag64, ast_set_priority(), ast_sorcery_init(), ast_ssl_init(), ast_startuptime, ast_stasis_system_init(), ast_stun_init(), ast_taskpool_init(), ast_term_init(), ast_test_init(), ast_timing_init(), ast_tps_init(), ast_translate_init(), ast_tvnow(), ast_ulaw_init(), ast_utf8_init(), ast_utils_init(), ast_uuid_generate_str(), ast_uuid_init(), AST_UUID_STR_LEN, ast_verb, ast_xmldoc_load_documentation(), astdb_init(), astobj2_init(), buf, callerid_init(), canary_exit(), canary_filename, canary_pid, canary_thread(), check_init(), cli_asterisk, cli_asterisk_shutdown, COLOR_BRGREEN, COLORIZE, COLORIZE_FMT, consolehandler(), consolethread, devstate_init(), dns_core_init(), dnsmgr_start_refresh(), el, el_hist, errno, has_priority(), hostname, hup_handler, ignore_sig_handler, init_logger(), load_astmm_phase_1(), load_astmm_phase_2(), load_modules(), load_pbx(), load_pbx_app(), load_pbx_builtins(), load_pbx_functions_cli(), load_pbx_hangup_handler(), load_pbx_switch(), load_pbx_variables(), logger_queue_start(), main_atexit(), MAXHOSTNAMELEN, mon_sig_flags, monitor_sig_flags(), multi_thread_safe, mwi_init(), NULL, PATH_MAX, print_intro_message(), publish_fully_booted(), quit_handler(), randompool, read_pjproject_startup_options(), register_config_cli(), run_startup_commands(), set_icon(), set_title(), SHUTDOWN_FAST, sig_alert_pipe, sig_flags, STARTUP_COMMANDS_FULLY_BOOTED, STARTUP_COMMANDS_PRE_INIT, STARTUP_COMMANDS_PRE_MODULE, stasis_init(), tdd_init(), term_end(), threadstorage_init(), and urg_handler.

Referenced by main().

◆ can_safely_quit()

static int can_safely_quit ( shutdown_nice_t  niceness,
int  restart 
)
static

Definition at line 1975 of file asterisk.c.

1976{
1977 int waited = 0;
1978
1979 /* Check if someone else isn't already doing this. */
1981 if (shuttingdown != NOT_SHUTTING_DOWN && niceness >= shuttingdown) {
1982 /* Already in progress and other request was less nice. */
1984 ast_verbose("Ignoring asterisk %s request, already in progress.\n", restart ? "restart" : "shutdown");
1985 return 0;
1986 }
1987 shuttingdown = niceness;
1989
1990 /* Try to get as many CDRs as possible submitted to the backend engines
1991 * (if in batch mode). really_quit happens to call it again when running
1992 * the atexit handlers, otherwise this would be a bit early. */
1994
1995 /*
1996 * Shutdown the message queue for the technology agnostic message channel.
1997 * This has to occur before we pause shutdown pending ast_undestroyed_channels.
1998 *
1999 * XXX This is not reversed on shutdown cancel.
2000 */
2002
2003 if (niceness == SHUTDOWN_NORMAL) {
2004 /* Begin shutdown routine, hanging up active channels */
2006 if (ast_opt_console) {
2007 ast_verb(0, "Beginning asterisk %s....\n", restart ? "restart" : "shutdown");
2008 }
2010 waited |= wait_for_channels_to_die(niceness, SHUTDOWN_TIMEOUT);
2011 } else if (niceness >= SHUTDOWN_NICE) {
2012 if (niceness != SHUTDOWN_REALLY_NICE) {
2014 }
2015 if (ast_opt_console) {
2016 ast_verb(0, "Waiting for inactivity to perform %s...\n", restart ? "restart" : "halt");
2017 }
2018 waited |= wait_for_channels_to_die(niceness, -1);
2019 }
2020
2021 /* Re-acquire lock and check if someone changed the niceness, in which
2022 * case someone else has taken over the shutdown.
2023 */
2025 if (shuttingdown != niceness) {
2027 ast_verb(0, "Asterisk %s cancelled.\n", restart ? "restart" : "shutdown");
2028 }
2030 return 0;
2031 }
2032
2033 if (niceness >= SHUTDOWN_REALLY_NICE) {
2036
2037 /* No more Mr. Nice guy. We are committed to shutting down now. */
2041
2043 }
2046
2047 if (niceness >= SHUTDOWN_NORMAL && waited) {
2048 /*
2049 * We were not idle. Give things in progress a chance to
2050 * recognize the final shutdown phase.
2051 */
2052 sleep(1);
2053 }
2054 return 1;
2055}
void ast_msg_shutdown(void)
static void ast_begin_shutdown(void)
Definition asterisk.c:1911
#define SHUTDOWN_TIMEOUT
Definition asterisk.c:1932
static int wait_for_channels_to_die(shutdown_nice_t niceness, int seconds)
Definition asterisk.c:1945
void ast_cdr_engine_term(void)
Definition cdr.c:4758
void ast_softhangup_all(void)
Soft hangup all active channels.
Definition channel.c:494

References ast_begin_shutdown(), ast_cdr_engine_term(), ast_msg_shutdown(), ast_mutex_lock, ast_mutex_unlock, ast_opt_console, ast_softhangup_all(), ast_verb, ast_verbose, NOT_SHUTTING_DOWN, safe_system_lock, SHUTDOWN_NICE, SHUTDOWN_NORMAL, SHUTDOWN_REALLY_NICE, SHUTDOWN_TIMEOUT, SHUTTING_DOWN, SHUTTING_DOWN_FINAL, shuttingdown, and wait_for_channels_to_die().

Referenced by quit_handler().

◆ canary_exit()

static void canary_exit ( void  )
static

Definition at line 3538 of file asterisk.c.

3539{
3540 if (canary_pid > 0) {
3541 int status;
3542 kill(canary_pid, SIGKILL);
3543 waitpid(canary_pid, &status, 0);
3544 }
3545}

References canary_pid, and status.

Referenced by asterisk_daemon().

◆ canary_thread()

static void * canary_thread ( void *  unused)
static

Definition at line 3509 of file asterisk.c.

3510{
3511 struct stat canary_stat;
3512 struct timeval now;
3513
3514 /* Give the canary time to sing */
3515 sleep(120);
3516
3517 for (;;) {
3518 now = ast_tvnow();
3519 if (stat(canary_filename, &canary_stat) || now.tv_sec > canary_stat.st_mtime + 60) {
3521 "The canary is no more. He has ceased to be! "
3522 "He's expired and gone to meet his maker! "
3523 "He's a stiff! Bereft of life, he rests in peace. "
3524 "His metabolic processes are now history! He's off the twig! "
3525 "He's kicked the bucket. He's shuffled off his mortal coil, "
3526 "run down the curtain, and joined the bleeding choir invisible!! "
3527 "THIS is an EX-CANARY. (Reducing priority)\n");
3529 pthread_exit(NULL);
3530 }
3531
3532 /* Check the canary once a minute */
3533 sleep(60);
3534 }
3535}
static int set_priority_all(int pri)
Set priority on all known threads.
Definition asterisk.c:1810

References ast_log, ast_tvnow(), canary_filename, LOG_WARNING, NULL, and set_priority_all().

Referenced by asterisk_daemon().

◆ check_init()

static void check_init ( int  init_result,
const char *  name 
)
inlinestatic

Definition at line 4114 of file asterisk.c.

4115{
4116 if (init_result) {
4118 ast_log(LOG_ERROR, "%s initialization failed. ASTERISK EXITING!\n%s", name, term_quit());
4119 } else {
4120 fprintf(stderr, "%s initialization failed. ASTERISK EXITING!\n%s", name, term_quit());
4121 }
4122 ast_run_atexits(0);
4123 exit(init_result == -2 ? 2 : 1);
4124 }
4125}
static void ast_run_atexits(int run_cleanups)
Definition asterisk.c:1015
int ast_is_logger_initialized(void)
Test if logger is initialized.
Definition logger.c:2164

References ast_is_logger_initialized(), ast_log, ast_run_atexits(), LOG_ERROR, name, and term_quit().

Referenced by asterisk_daemon().

◆ cli_complete()

static char * cli_complete ( EditLine *  editline,
int  ch 
)
static

Definition at line 2991 of file asterisk.c.

2992{
2993 int len = 0;
2994 char *ptr;
2995 struct ast_vector_string *matches;
2996 int retval = CC_ERROR;
2997 char savechr;
2998 int res;
2999
3000 LineInfo *lf = (LineInfo *)el_line(editline);
3001
3002 savechr = *(char *)lf->cursor;
3003 *(char *)lf->cursor = '\0';
3004 ptr = (char *)lf->cursor;
3005 if (ptr) {
3006 while (ptr > lf->buffer) {
3007 if (isspace(*ptr)) {
3008 ptr++;
3009 break;
3010 }
3011 ptr--;
3012 }
3013 }
3014
3015 len = lf->cursor - ptr;
3016
3017 if (ast_opt_remote) {
3018#define CMD_MATCHESARRAY "_COMMAND MATCHESARRAY \"%s\" \"%s\""
3019 char *mbuf;
3020 char *new_mbuf;
3021 int mlen = 0;
3022 int maxmbuf = ast_asprintf(&mbuf, CMD_MATCHESARRAY, lf->buffer, ptr);
3023
3024 if (maxmbuf == -1) {
3025 *((char *) lf->cursor) = savechr;
3026
3027 return (char *)(CC_ERROR);
3028 }
3029
3030 fdsend(ast_consock, mbuf);
3031 res = 0;
3032 mlen = 0;
3033 mbuf[0] = '\0';
3034
3035 while (!strstr(mbuf, AST_CLI_COMPLETE_EOF) && res != -1) {
3036 if (mlen + 1024 > maxmbuf) {
3037 /* Expand buffer to the next 1024 byte increment plus a NULL terminator. */
3038 maxmbuf = mlen + 1024;
3039 new_mbuf = ast_realloc(mbuf, maxmbuf + 1);
3040 if (!new_mbuf) {
3041 ast_free(mbuf);
3042 *((char *) lf->cursor) = savechr;
3043
3044 return (char *)(CC_ERROR);
3045 }
3046 mbuf = new_mbuf;
3047 }
3048 /* Only read 1024 bytes at a time */
3049 res = read(ast_consock, mbuf + mlen, 1024);
3050 if (res > 0) {
3051 if (!strncmp(mbuf, "Usage:", 6)) {
3052 /*
3053 * Abort on malformed tab completes
3054 * If help (tab complete) follows certain
3055 * special characters, the main Asterisk process
3056 * provides usage for the internal tab complete
3057 * helper command that the remote console processes
3058 * use.
3059 * If this happens, the AST_CLI_COMPLETE_EOF sentinel
3060 * value never gets sent. As a result, we'll just block
3061 * forever if we don't handle this case.
3062 * If we get command usage on a tab complete, then
3063 * we know this scenario just happened and we should
3064 * just silently ignore and do nothing.
3065 */
3066 break;
3067 }
3068 mlen += res;
3069 mbuf[mlen] = '\0';
3070 }
3071 }
3072 mbuf[mlen] = '\0';
3073
3074 matches = ast_el_strtoarr(mbuf);
3075 ast_free(mbuf);
3076 } else {
3077 matches = ast_cli_completion_vector((char *)lf->buffer, ptr);
3078 }
3079
3080 if (matches) {
3081 int i;
3082 int maxlen, match_len;
3083 const char *best_match = AST_VECTOR_GET(matches, 0);
3084
3085 if (!ast_strlen_zero(best_match)) {
3086 el_deletestr(editline, (int) len);
3087 el_insertstr(editline, best_match);
3088 retval = CC_REFRESH;
3089 }
3090
3091 if (AST_VECTOR_SIZE(matches) == 2) {
3092 /* Found an exact match */
3093 el_insertstr(editline, " ");
3094 retval = CC_REFRESH;
3095 } else {
3096 /* Must be more than one match */
3097 for (i = 1, maxlen = 0; i < AST_VECTOR_SIZE(matches); i++) {
3098 match_len = strlen(AST_VECTOR_GET(matches, i));
3099 if (match_len > maxlen) {
3100 maxlen = match_len;
3101 }
3102 }
3103
3104 fprintf(stdout, "\n");
3105 ast_cli_display_match_list(matches, maxlen);
3106 retval = CC_REDISPLAY;
3107 }
3109 AST_VECTOR_PTR_FREE(matches);
3110 }
3111
3112 *((char *) lf->cursor) = savechr;
3113
3114 return (char *)(long)retval;
3115}
static void ast_cli_display_match_list(struct ast_vector_string *matches, int max)
Definition asterisk.c:2964
#define CMD_MATCHESARRAY
static int fdsend(int fd, const char *s)
Definition asterisk.c:1080
static struct ast_vector_string * ast_el_strtoarr(char *buf)
Definition asterisk.c:2930
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition astmm.h:267
struct ast_vector_string * ast_cli_completion_vector(const char *text, const char *word)
Generates a vector of strings for CLI completion.
Definition main/cli.c:2850
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define ast_opt_remote
Definition options.h:124

References ast_asprintf, AST_CLI_COMPLETE_EOF, ast_cli_completion_vector(), ast_cli_display_match_list(), ast_consock, ast_el_strtoarr(), ast_free, ast_opt_remote, ast_realloc, ast_strlen_zero(), AST_VECTOR_CALLBACK_VOID, AST_VECTOR_GET, AST_VECTOR_PTR_FREE, AST_VECTOR_SIZE, CMD_MATCHESARRAY, fdsend(), and len().

Referenced by ast_el_initialize().

◆ cli_prompt()

static char * cli_prompt ( EditLine *  editline)
static

Definition at line 2804 of file asterisk.c.

2805{
2806 char tmp[100];
2807 char *pfmt;
2808 int color_used = 0;
2809 static int cli_prompt_changes = 0;
2810 struct passwd *pw;
2811 struct group *gr;
2812
2813 if (prompt == NULL) {
2814 prompt = ast_str_create(100);
2815 } else if (!cli_prompt_changes) {
2816 return ast_str_buffer(prompt);
2817 } else {
2819 }
2820
2821 if ((pfmt = getenv("ASTERISK_PROMPT"))) {
2822 char *t = pfmt;
2823 struct timeval ts = ast_tvnow();
2824 while (*t != '\0') {
2825 if (*t == '%') {
2826 char hostname[MAXHOSTNAMELEN] = "";
2827 int i, which;
2828 struct ast_tm tm = { 0, };
2829 int fgcolor = COLOR_WHITE, bgcolor = COLOR_BLACK;
2830
2831 t++;
2832 switch (*t) {
2833 case 'C': /* color */
2834 t++;
2835 if (sscanf(t, "%30d;%30d%n", &fgcolor, &bgcolor, &i) == 2) {
2836 ast_term_color_code(&prompt, fgcolor, bgcolor);
2837 t += i - 1;
2838 } else if (sscanf(t, "%30d%n", &fgcolor, &i) == 1) {
2839 ast_term_color_code(&prompt, fgcolor, 0);
2840 t += i - 1;
2841 }
2842
2843 /* If the color has been reset correctly, then there's no need to reset it later */
2844 color_used = ((fgcolor == COLOR_WHITE) && (bgcolor == COLOR_BLACK)) ? 0 : 1;
2845 break;
2846 case 'd': /* date */
2847 if (ast_localtime(&ts, &tm, NULL)) {
2848 ast_strftime(tmp, sizeof(tmp), "%Y-%m-%d", &tm);
2849 ast_str_append(&prompt, 0, "%s", tmp);
2850 cli_prompt_changes++;
2851 }
2852 break;
2853 case 'g': /* group */
2854 if ((gr = getgrgid(getgid()))) {
2855 ast_str_append(&prompt, 0, "%s", gr->gr_name);
2856 }
2857 break;
2858 case 'h': /* hostname */
2859 if (!gethostname(hostname, sizeof(hostname) - 1)) {
2860 ast_str_append(&prompt, 0, "%s", hostname);
2861 } else {
2862 ast_str_append(&prompt, 0, "%s", "localhost");
2863 }
2864 break;
2865 case 'H': /* short hostname */
2866 if (!gethostname(hostname, sizeof(hostname) - 1)) {
2867 char *dotptr;
2868 if ((dotptr = strchr(hostname, '.'))) {
2869 *dotptr = '\0';
2870 }
2871 ast_str_append(&prompt, 0, "%s", hostname);
2872 } else {
2873 ast_str_append(&prompt, 0, "%s", "localhost");
2874 }
2875 break;
2876#ifdef HAVE_GETLOADAVG
2877 case 'l': /* load avg */
2878 t++;
2879 if (sscanf(t, "%30d", &which) == 1 && which > 0 && which <= 3) {
2880 double list[3];
2881 getloadavg(list, 3);
2882 ast_str_append(&prompt, 0, "%.2f", list[which - 1]);
2883 cli_prompt_changes++;
2884 }
2885 break;
2886#endif
2887 case 's': /* Asterisk system name (from asterisk.conf) */
2889 break;
2890 case 't': /* time */
2891 if (ast_localtime(&ts, &tm, NULL)) {
2892 ast_strftime(tmp, sizeof(tmp), "%H:%M:%S", &tm);
2893 ast_str_append(&prompt, 0, "%s", tmp);
2894 cli_prompt_changes++;
2895 }
2896 break;
2897 case 'u': /* username */
2898 if ((pw = getpwuid(getuid()))) {
2899 ast_str_append(&prompt, 0, "%s", pw->pw_name);
2900 }
2901 break;
2902 case '#': /* process console or remote? */
2903 ast_str_append(&prompt, 0, "%c", ast_opt_remote ? '>' : '#');
2904 break;
2905 case '%': /* literal % */
2906 ast_str_append(&prompt, 0, "%c", '%');
2907 break;
2908 case '\0': /* % is last character - prevent bug */
2909 t--;
2910 break;
2911 }
2912 } else {
2913 ast_str_append(&prompt, 0, "%c", *t);
2914 }
2915 t++;
2916 }
2917 if (color_used) {
2918 /* Force colors back to normal at end */
2920 }
2921 } else {
2922 ast_str_set(&prompt, 0, "%s%s",
2925 }
2926
2927 return ast_str_buffer(prompt);
2928}
int getloadavg(double *list, int nelem)
static struct ast_str * prompt
Definition asterisk.c:2802
#define ASTERISK_PROMPT
Definition asterisk.c:2624
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition localtime.c:1739
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...
Definition localtime.c:2524
const char * ast_config_AST_SYSTEM_NAME
Definition options.c:171
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition strings.h:1139
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition strings.h:693
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition strings.h:1113
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
int ast_term_color_code(struct ast_str **str, int fgcolor, int bgcolor)
Append a color sequence to an ast_str.
Definition term.c:296
#define COLOR_WHITE
Definition term.h:64
#define COLOR_BLACK
Definition term.h:50

References ast_config_AST_SYSTEM_NAME, ast_localtime(), ast_opt_remote, ast_str_append(), ast_str_buffer(), ast_str_create, ast_str_reset(), ast_str_set(), ast_strftime(), ast_term_color_code(), ast_tvnow(), ASTERISK_PROMPT, COLOR_BLACK, COLOR_WHITE, getloadavg(), hostname, MAXHOSTNAMELEN, NULL, prompt, and remotehostname.

Referenced by ast_el_initialize().

◆ console_print()

static int console_print ( const char *  s)
static

Definition at line 2228 of file asterisk.c.

2229{
2230 struct console_state_data *state =
2231 ast_threadstorage_get(&console_state, sizeof(*state));
2232
2233 char prefix[80];
2234 const char *c;
2235 int num, res = 0;
2236 unsigned int newline;
2237
2238 do {
2239 if (VERBOSE_HASMAGIC(s)) {
2240
2241 /* always use the given line's level, otherwise
2242 we'll use the last line's level */
2243 state->verbose_line_level = VERBOSE_MAGIC2LEVEL(s);
2244
2245 /* move past magic */
2246 s++;
2247
2248 set_header(prefix, sizeof(prefix), state->verbose_line_level);
2249 } else {
2250 *prefix = '\0';
2251 }
2252 c = s;
2253
2254 /* for a given line separate on verbose magic, newline, and eol */
2255 if ((s = strchr(c, '\n'))) {
2256 ++s;
2257 newline = 1;
2258 } else {
2259 s = strchr(c, '\0');
2260 newline = 0;
2261 }
2262
2263 /* check if we should write this line after calculating begin/end
2264 so we process the case of a higher level line embedded within
2265 two lower level lines */
2266 if (state->verbose_line_level > option_verbose) {
2267 continue;
2268 }
2269
2270 if (!ast_strlen_zero(prefix)) {
2271 fputs(prefix, stdout);
2272 }
2273
2274 num = s - c;
2275 if (fwrite(c, sizeof(char), num, stdout) < num) {
2276 break;
2277 }
2278
2279 if (!res) {
2280 /* if at least some info has been written
2281 we'll want to return true */
2282 res = 1;
2283 }
2284 } while (*s);
2285
2286 if (newline) {
2287 /* if ending on a newline then reset last level to zero
2288 since what follows may be not be logging output */
2289 state->verbose_line_level = 0;
2290 }
2291
2292 if (res) {
2293 fflush(stdout);
2294 }
2295
2296 return res;
2297}
static void set_header(char *outbuf, int maxout, char level)
Definition asterisk.c:2169
#define VERBOSE_MAGIC2LEVEL(x)
#define VERBOSE_HASMAGIC(x)
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.

References ast_strlen_zero(), ast_threadstorage_get(), c, option_verbose, prefix, set_header(), VERBOSE_HASMAGIC, and VERBOSE_MAGIC2LEVEL.

Referenced by ast_console_puts_mutable_full(), and ast_el_read_char().

◆ console_state_init()

static int console_state_init ( void *  ptr)
static

Definition at line 2219 of file asterisk.c.

2220{
2221 struct console_state_data *state = ptr;
2222 state->verbose_line_level = 0;
2223 return 0;
2224}

◆ consolehandler()

static void consolehandler ( const char *  s)
static

Definition at line 2310 of file asterisk.c.

2311{
2312 printf("%s", term_end());
2313 fflush(stdout);
2314
2315 /* Called when readline data is available */
2316 if (!ast_all_zeros(s))
2318 /* The real handler for bang */
2319 if (s[0] == '!') {
2320 if (s[1])
2321 ast_safe_system(s+1);
2322 else
2323 ast_safe_system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh");
2324 } else
2325 ast_cli_command(STDOUT_FILENO, s);
2326}
static int ast_el_add_history(const char *)
Definition asterisk.c:3172
int ast_safe_system(const char *s)
Safely spawn an OS shell command while closing file descriptors.
Definition asterisk.c:1247
static int ast_all_zeros(const char *s)
Definition asterisk.c:2299
#define ast_cli_command(fd, s)
Definition cli.h:232

References ast_all_zeros(), ast_cli_command, ast_el_add_history(), ast_safe_system(), and term_end().

Referenced by asterisk_daemon().

◆ env_init()

static void env_init ( void  )
static

Definition at line 3590 of file asterisk.c.

3591{
3592 setenv("AST_SYSTEMNAME", ast_config_AST_SYSTEM_NAME, 1);
3593 setenv("AST_BUILD_HOST", ast_build_hostname, 1);
3594 setenv("AST_BUILD_DATE", ast_build_date, 1);
3595 setenv("AST_BUILD_KERNEL", ast_build_kernel, 1);
3596 setenv("AST_BUILD_MACHINE", ast_build_machine, 1);
3597 setenv("AST_BUILD_OS", ast_build_os, 1);
3598 setenv("AST_BUILD_USER", ast_build_user, 1);
3599 setenv("AST_VERSION", ast_get_version(), 1);
3600}
const char * ast_get_version(void)
Retrieve the Asterisk version string.
int setenv(const char *name, const char *value, int overwrite)
const char * ast_build_os
Definition buildinfo.c:32
const char * ast_build_machine
Definition buildinfo.c:31
const char * ast_build_hostname
Definition buildinfo.c:29
const char * ast_build_user
Definition buildinfo.c:34
const char * ast_build_date
Definition buildinfo.c:33
const char * ast_build_kernel
Definition buildinfo.c:30

References ast_build_date, ast_build_hostname, ast_build_kernel, ast_build_machine, ast_build_os, ast_build_user, ast_config_AST_SYSTEM_NAME, ast_get_version(), and setenv().

Referenced by main().

◆ fdprint()

static int fdprint ( int  fd,
const char *  s 
)
static

Definition at line 1086 of file asterisk.c.

1087{
1088 return write(fd, s, strlen(s));
1089}

Referenced by ast_network_puts(), ast_network_puts_mutable(), listener(), and netconsole().

◆ fdsend()

static int fdsend ( int  fd,
const char *  s 
)
static

Definition at line 1080 of file asterisk.c.

1081{
1082 return write(fd, s, strlen(s) + 1);
1083}

Referenced by cli_complete(), and send_rasterisk_connect_commands().

◆ handle_abort_shutdown()

static char * handle_abort_shutdown ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2506 of file asterisk.c.

2507{
2508 switch (cmd) {
2509 case CLI_INIT:
2510 e->command = "core abort shutdown";
2511 e->usage =
2512 "Usage: core abort shutdown\n"
2513 " Causes Asterisk to abort an executing shutdown or restart, and resume normal\n"
2514 " call operations.\n";
2516 return NULL;
2517 case CLI_GENERATE:
2518 return NULL;
2519 }
2520
2521 if (a->argc != e->args)
2522 return CLI_SHOWUSAGE;
2523
2525
2526 return CLI_SUCCESS;
2527}
int ast_cancel_shutdown(void)
Cancel an existing shutdown and return to normal operation.
Definition asterisk.c:1893
#define CLI_SHOWUSAGE
Definition cli.h:45
#define CLI_SUCCESS
Definition cli.h:44
int ast_cli_allow_at_shutdown(struct ast_cli_entry *e)
Allow a CLI command to be executed while Asterisk is shutting down.
Definition main/cli.c:3145
@ CLI_INIT
Definition cli.h:152
@ CLI_GENERATE
Definition cli.h:153
int args
This gets set in ast_cli_register()
Definition cli.h:185
char * command
Definition cli.h:186
const char * usage
Definition cli.h:177

References a, ast_cli_entry::args, ast_cancel_shutdown(), ast_cli_allow_at_shutdown(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, and ast_cli_entry::usage.

◆ handle_bang()

static char * handle_bang ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2529 of file asterisk.c.

2530{
2531 switch (cmd) {
2532 case CLI_INIT:
2533 e->command = "!";
2534 e->usage =
2535 "Usage: !<command>\n"
2536 " Executes a given shell command\n";
2537 return NULL;
2538 case CLI_GENERATE:
2539 return NULL;
2540 }
2541
2542 return CLI_SUCCESS;
2543}

References CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, NULL, and ast_cli_entry::usage.

◆ handle_clear_profile()

static char * handle_clear_profile ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 954 of file asterisk.c.

955{
956 int i, min, max;
957 const char *search = NULL;
958 switch (cmd) {
959 case CLI_INIT:
960 e->command = "core clear profile";
961 e->usage = "Usage: core clear profile\n"
962 " clear profile information";
963 return NULL;
964 case CLI_GENERATE:
965 return NULL;
966 }
967
968 if (prof_data == NULL)
969 return 0;
970
972 for (i= min; i < max; i++) {
973 if (!search || strstr(prof_data->e[i].name, search)) {
974 prof_data->e[i].value = 0;
975 prof_data->e[i].events = 0;
976 }
977 }
978 return CLI_SUCCESS;
979}
#define DEFINE_PROFILE_MIN_MAX_VALUES
Definition asterisk.c:906

References CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, DEFINE_PROFILE_MIN_MAX_VALUES, profile_data::e, profile_entry::events, max, min, profile_entry::name, NULL, prof_data, ast_cli_entry::usage, and profile_entry::value.

◆ handle_restart_gracefully()

static char * handle_restart_gracefully ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2464 of file asterisk.c.

2465{
2466 switch (cmd) {
2467 case CLI_INIT:
2468 e->command = "core restart gracefully";
2469 e->usage =
2470 "Usage: core restart gracefully\n"
2471 " Causes Asterisk to stop accepting new calls and exec() itself performing a cold\n"
2472 " restart when all active calls have ended.\n";
2474 return NULL;
2475 case CLI_GENERATE:
2476 return NULL;
2477 }
2478
2479 if (a->argc != e->args)
2480 return CLI_SHOWUSAGE;
2481 quit_handler(0, SHUTDOWN_NICE, 1 /* restart */);
2482 return CLI_SUCCESS;
2483}

References a, ast_cli_entry::args, ast_cli_allow_at_shutdown(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, quit_handler(), SHUTDOWN_NICE, and ast_cli_entry::usage.

◆ handle_restart_now()

static char * handle_restart_now ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2443 of file asterisk.c.

2444{
2445 switch (cmd) {
2446 case CLI_INIT:
2447 e->command = "core restart now";
2448 e->usage =
2449 "Usage: core restart now\n"
2450 " Causes Asterisk to hangup all calls and exec() itself performing a cold\n"
2451 " restart.\n";
2453 return NULL;
2454 case CLI_GENERATE:
2455 return NULL;
2456 }
2457
2458 if (a->argc != e->args)
2459 return CLI_SHOWUSAGE;
2460 quit_handler(0, SHUTDOWN_NORMAL, 1 /* restart */);
2461 return CLI_SUCCESS;
2462}

References a, ast_cli_entry::args, ast_cli_allow_at_shutdown(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, quit_handler(), SHUTDOWN_NORMAL, and ast_cli_entry::usage.

◆ handle_restart_when_convenient()

static char * handle_restart_when_convenient ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2485 of file asterisk.c.

2486{
2487 switch (cmd) {
2488 case CLI_INIT:
2489 e->command = "core restart when convenient";
2490 e->usage =
2491 "Usage: core restart when convenient\n"
2492 " Causes Asterisk to perform a cold restart when all active calls have ended.\n";
2494 return NULL;
2495 case CLI_GENERATE:
2496 return NULL;
2497 }
2498
2499 if (a->argc != e->args)
2500 return CLI_SHOWUSAGE;
2501 ast_cli(a->fd, "Waiting for inactivity to perform restart\n");
2502 quit_handler(0, SHUTDOWN_REALLY_NICE, 1 /* restart */);
2503 return CLI_SUCCESS;
2504}

References a, ast_cli_entry::args, ast_cli(), ast_cli_allow_at_shutdown(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, quit_handler(), SHUTDOWN_REALLY_NICE, and ast_cli_entry::usage.

◆ handle_show_profile()

static char * handle_show_profile ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 919 of file asterisk.c.

920{
921 int i, min, max;
922 const char *search = NULL;
923 switch (cmd) {
924 case CLI_INIT:
925 e->command = "core show profile";
926 e->usage = "Usage: core show profile\n"
927 " show profile information";
928 return NULL;
929 case CLI_GENERATE:
930 return NULL;
931 }
932
933 if (prof_data == NULL)
934 return 0;
935
937 ast_cli(a->fd, "profile values (%d, allocated %d)\n-------------------\n",
939 ast_cli(a->fd, "%6s %8s %10s %12s %12s %s\n", "ID", "Scale", "Events",
940 "Value", "Average", "Name");
941 for (i = min; i < max; i++) {
942 struct profile_entry *entry = &prof_data->e[i];
943 if (!search || strstr(entry->name, search))
944 ast_cli(a->fd, "%6d: [%8ld] %10ld %12lld %12lld %s\n",
945 i,
946 (long)entry->scale,
947 (long)entry->events, (long long)entry->value,
948 (long long)(entry->events ? entry->value / entry->events : entry->value),
949 entry->name);
950 }
951 return CLI_SUCCESS;
952}
int value
Definition syslog.c:37

References a, ast_cli(), CLI_GENERATE, CLI_INIT, CLI_SUCCESS, DEFINE_PROFILE_MIN_MAX_VALUES, profile_data::e, profile_data::entries, profile_entry::events, max, profile_data::max_size, min, profile_entry::name, NULL, prof_data, profile_entry::scale, and profile_entry::value.

◆ handle_show_settings()

static char * handle_show_settings ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Give an overview of core settings.

Todo:
we could check musiconhold, voicemail, smdi, adsi, queues

Definition at line 475 of file asterisk.c.

476{
477 char buf[BUFSIZ];
478 struct ast_tm tm;
479 char eid_str[128];
480 struct rlimit limits;
481 char pbx_uuid[AST_UUID_STR_LEN];
482#if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
483 char dir[PATH_MAX];
484#endif
485
486 switch (cmd) {
487 case CLI_INIT:
488 e->command = "core show settings";
489 e->usage = "Usage: core show settings\n"
490 " Show core misc settings";
491 return NULL;
492 case CLI_GENERATE:
493 return NULL;
494 }
495
496 ast_eid_to_str(eid_str, sizeof(eid_str), &ast_eid_default);
497 ast_pbx_uuid_get(pbx_uuid, sizeof(pbx_uuid));
498
499 ast_cli(a->fd, "\nPBX Core settings\n");
500 ast_cli(a->fd, "-----------------\n");
501 ast_cli(a->fd, " Version: %s\n", ast_get_version());
502 ast_cli(a->fd, " ABI related Build Options: %s\n", S_OR(ast_get_build_opts(), "(none)"));
503 ast_cli(a->fd, " All Build Options: %s\n", S_OR(ast_get_build_opts_all(), "(none)"));
505 ast_cli(a->fd, " Maximum calls: %d (Current %d)\n", ast_option_maxcalls, ast_active_channels());
506 else
507 ast_cli(a->fd, " Maximum calls: Not set\n");
508
509 if (getrlimit(RLIMIT_NOFILE, &limits)) {
510 ast_cli(a->fd, " Maximum open file handles: Error because of %s\n", strerror(errno));
511 } else if (limits.rlim_cur == RLIM_INFINITY) {
512 ast_cli(a->fd, " Maximum open file handles: Unlimited\n");
513 } else if (limits.rlim_cur < ast_option_maxfiles) {
514 ast_cli(a->fd, " Maximum open file handles: %d (is) %d (requested)\n", (int) limits.rlim_cur, ast_option_maxfiles);
515 } else {
516 ast_cli(a->fd, " Maximum open file handles: %d\n", (int) limits.rlim_cur);
517 }
518
519 ast_cli(a->fd, " Root console verbosity: %d\n", option_verbose);
520 ast_cli(a->fd, " Current console verbosity: %d\n", ast_verb_console_get());
521 ast_cli(a->fd, " Debug level: %d\n", option_debug);
522 ast_cli(a->fd, " Trace level: %d\n", option_trace);
523 ast_cli(a->fd, " Dump core on crash: %s\n", ast_opt_dump_core ? "Yes" : "No");
524 print_file(a->fd, " Core dump file: ", "/proc/sys/kernel/core_pattern");
525 ast_cli(a->fd, " Maximum load average: %lf\n", ast_option_maxload);
526#if defined(HAVE_SYSINFO)
527 ast_cli(a->fd, " Minimum free memory: %ld MB\n", option_minmemfree);
528#endif
529 if (ast_localtime(&ast_startuptime, &tm, NULL)) {
530 ast_strftime(buf, sizeof(buf), "%H:%M:%S", &tm);
531 ast_cli(a->fd, " Startup time: %s\n", buf);
532 }
534 ast_strftime(buf, sizeof(buf), "%H:%M:%S", &tm);
535 ast_cli(a->fd, " Last reload time: %s\n", buf);
536 }
537 ast_cli(a->fd, " System: %s/%s built by %s on %s %s\n", ast_build_os, ast_build_kernel, ast_build_user, ast_build_machine, ast_build_date);
538 ast_cli(a->fd, " System name: %s\n", ast_config_AST_SYSTEM_NAME);
539 ast_cli(a->fd, " Entity ID: %s\n", eid_str);
540 ast_cli(a->fd, " PBX UUID: %s\n", pbx_uuid);
541 ast_cli(a->fd, " Default language: %s\n", ast_defaultlanguage);
542 ast_cli(a->fd, " User name and group: %s/%s\n", ast_config_AST_RUN_USER, ast_config_AST_RUN_GROUP);
543#if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
544#if defined(HAVE_EUIDACCESS) && !defined(HAVE_EACCESS)
545#define eaccess euidaccess
546#endif
547 if (!getcwd(dir, sizeof(dir))) {
548 if (eaccess(dir, R_OK | X_OK | F_OK)) {
549 ast_cli(a->fd, " Running directory: %s\n", "Unable to access");
550 } else {
551 ast_cli(a->fd, " Running directory: %s (%s)\n", dir, "Unable to access");
552 }
553 } else {
554 ast_cli(a->fd, " Running directory: %s\n", dir);
555 }
556#endif /* defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS) */
557 ast_cli(a->fd, " Executable includes: %s\n", ast_opt_exec_includes ? "Enabled" : "Disabled");
558 ast_cli(a->fd, " Transcode via SLIN: %s\n", ast_opt_transcode_via_slin ? "Enabled" : "Disabled");
559 ast_cli(a->fd, " Transmit silence during rec: %s\n", ast_opt_transmit_silence ? "Enabled" : "Disabled");
560 ast_cli(a->fd, " Generic PLC: %s\n", ast_opt_generic_plc ? "Enabled" : "Disabled");
561 ast_cli(a->fd, " Generic PLC on equal codecs: %s\n", ast_opt_generic_plc_on_equal_codecs ? "Enabled" : "Disabled");
562 ast_cli(a->fd, " Hide Msg Chan AMI events: %s\n", ast_opt_hide_messaging_ami_events ? "Enabled" : "Disabled");
563 ast_cli(a->fd, " Sounds search custom dir: %s\n", ast_opt_sounds_search_custom ? "Enabled" : "Disabled");
564 ast_cli(a->fd, " Min DTMF duration:: %u\n", option_dtmfminduration);
565#if !defined(LOW_MEMORY)
566 ast_cli(a->fd, " Cache media frames: %s\n", ast_opt_cache_media_frames ? "Enabled" : "Disabled");
567#endif
568 ast_cli(a->fd, " RTP use dynamic payloads: %u\n", ast_option_rtpusedynamic);
569
571 ast_cli(a->fd, " RTP dynamic payload types: %u,%u-%u\n",
575 ast_cli(a->fd, " RTP dynamic payload types: %u-%u,%u-%u\n",
578 } else {
579 ast_cli(a->fd, " RTP dynamic payload types: %u-%u\n",
581 }
582 ast_cli(a->fd, " Channel storage backend: %s\n",
584 ast_cli(a->fd, " Shell on remote consoles: %s\n",
585 ast_option_disable_remote_console_shell ? "Disabled" : "Enabled");
586
587 ast_cli(a->fd, "\n* Subsystems\n");
588 ast_cli(a->fd, " -------------\n");
589 ast_cli(a->fd, " Manager (AMI): %s\n", ast_manager_check_enabled() ? "Enabled" : "Disabled");
590 ast_cli(a->fd, " Web Manager (AMI/HTTP): %s\n", ast_webmanager_check_enabled() ? "Enabled" : "Disabled");
591 ast_cli(a->fd, " Call data records: %s\n", ast_cdr_is_enabled() ? "Enabled" : "Disabled");
592 ast_cli(a->fd, " Realtime Architecture (ARA): %s\n", ast_realtime_enabled() ? "Enabled" : "Disabled");
593
594 /*! \todo we could check musiconhold, voicemail, smdi, adsi, queues */
595
596 ast_cli(a->fd, "\n* Directories\n");
597 ast_cli(a->fd, " -------------\n");
598 ast_cli(a->fd, " Configuration file: %s\n", ast_config_AST_CONFIG_FILE);
599 ast_cli(a->fd, " Configuration directory: %s\n", ast_config_AST_CONFIG_DIR);
600 ast_cli(a->fd, " Module directory: %s\n", ast_config_AST_MODULE_DIR);
601 ast_cli(a->fd, " Spool directory: %s\n", ast_config_AST_SPOOL_DIR);
602 ast_cli(a->fd, " Log directory: %s\n", ast_config_AST_LOG_DIR);
603 ast_cli(a->fd, " Run/Sockets directory: %s\n", ast_config_AST_RUN_DIR);
604 ast_cli(a->fd, " PID file: %s\n", ast_config_AST_PID);
605 ast_cli(a->fd, " VarLib directory: %s\n", ast_config_AST_VAR_DIR);
606 ast_cli(a->fd, " Data directory: %s\n", ast_config_AST_DATA_DIR);
607 ast_cli(a->fd, " ASTDB: %s\n", ast_config_AST_DB);
608 ast_cli(a->fd, " IAX2 Keys directory: %s\n", ast_config_AST_KEY_DIR);
609 ast_cli(a->fd, " AGI Scripts directory: %s\n", ast_config_AST_AGI_DIR);
610 ast_cli(a->fd, " Cache directory: %s\n", ast_config_AST_CACHE_DIR);
611 ast_cli(a->fd, "\n\n");
612 return CLI_SUCCESS;
613}
const char * ast_get_build_opts(void)
const char * ast_get_build_opts_all(void)
static int print_file(int fd, char *desc, const char *filename)
Print the contents of a file.
Definition asterisk.c:458
int ast_cdr_is_enabled(void)
Return TRUE if CDR subsystem is enabled.
Definition cdr.c:2999
const char * ast_channel_get_current_storage_driver_name(void)
Get the name of the current channel storage driver.
Definition channel.c:8149
int ast_active_channels(void)
returns number of active/allocated channels
Definition channel.c:500
int ast_manager_check_enabled(void)
Check if AMI is enabled.
Definition manager.c:683
int ast_webmanager_check_enabled(void)
Check if AMI/HTTP is enabled.
Definition manager.c:688
int ast_option_rtpusedynamic
Definition options.c:89
int ast_option_maxfiles
Definition options.c:82
int ast_option_maxcalls
Definition options.c:80
int ast_option_disable_remote_console_shell
Definition options.c:91
double ast_option_maxload
Definition options.c:78
unsigned int ast_option_rtpptdynamic
Definition options.c:90
unsigned int option_dtmfminduration
Definition options.c:84
long option_minmemfree
Definition options.c:87
int option_trace
Definition options.c:72
int ast_realtime_enabled(void)
Check if there's any realtime engines loaded.
int ast_verb_console_get(void)
Get this thread's console verbosity level.
Definition logger.c:2740
#define R_OK
#define ast_opt_dump_core
Definition options.h:129
#define ast_opt_transcode_via_slin
Definition options.h:128
#define ast_opt_generic_plc_on_equal_codecs
Definition options.h:146
#define ast_opt_hide_messaging_ami_events
Definition options.h:147
#define ast_opt_sounds_search_custom
Definition options.h:148
#define ast_opt_generic_plc
Definition options.h:144
#define ast_opt_cache_media_frames
Definition options.h:131
#define ast_opt_exec_includes
Definition options.h:118
char ast_defaultlanguage[]
Definition options.c:99
#define ast_opt_transmit_silence
Definition options.h:134
const char * ast_config_AST_KEY_DIR
Definition options.c:162
const char * ast_config_AST_CACHE_DIR
Definition options.c:151
const char * ast_config_AST_RUN_GROUP
Definition options.c:170
const char * ast_config_AST_RUN_USER
Definition options.c:169
const char * ast_config_AST_MODULE_DIR
Definition options.c:154
const char * ast_config_AST_DATA_DIR
Definition options.c:159
const char * ast_config_AST_CONFIG_DIR
Definition options.c:152
const char * ast_config_AST_SPOOL_DIR
Definition options.c:155
const char * ast_config_AST_AGI_DIR
Definition options.c:161
const char * ast_config_AST_VAR_DIR
Definition options.c:158
const char * ast_config_AST_CONFIG_FILE
Definition options.c:153
const char * ast_config_AST_LOG_DIR
Definition options.c:160
const char * ast_config_AST_DB
Definition options.c:166
#define AST_RTP_PT_LAST_REASSIGN
Definition rtp_engine.h:95
#define AST_RTP_MAX_PT
Definition rtp_engine.h:83
#define AST_RTP_PT_FIRST_DYNAMIC
Definition rtp_engine.h:92
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
char * ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid)
Convert an EID to a string.
Definition utils.c:2873
struct ast_eid ast_eid_default
Global EID.
Definition options.c:94

References a, ast_active_channels(), ast_build_date, ast_build_kernel, ast_build_machine, ast_build_os, ast_build_user, ast_cdr_is_enabled(), ast_channel_get_current_storage_driver_name(), ast_cli(), ast_config_AST_AGI_DIR, ast_config_AST_CACHE_DIR, ast_config_AST_CONFIG_DIR, ast_config_AST_CONFIG_FILE, ast_config_AST_DATA_DIR, ast_config_AST_DB, ast_config_AST_KEY_DIR, ast_config_AST_LOG_DIR, ast_config_AST_MODULE_DIR, ast_config_AST_PID, ast_config_AST_RUN_DIR, ast_config_AST_RUN_GROUP, ast_config_AST_RUN_USER, ast_config_AST_SPOOL_DIR, ast_config_AST_SYSTEM_NAME, ast_config_AST_VAR_DIR, ast_defaultlanguage, ast_eid_default, ast_eid_to_str(), ast_get_build_opts(), ast_get_build_opts_all(), ast_get_version(), ast_lastreloadtime, ast_localtime(), ast_manager_check_enabled(), ast_opt_cache_media_frames, ast_opt_dump_core, ast_opt_exec_includes, ast_opt_generic_plc, ast_opt_generic_plc_on_equal_codecs, ast_opt_hide_messaging_ami_events, ast_opt_sounds_search_custom, ast_opt_transcode_via_slin, ast_opt_transmit_silence, ast_option_disable_remote_console_shell, ast_option_maxcalls, ast_option_maxfiles, ast_option_maxload, ast_option_rtpptdynamic, ast_option_rtpusedynamic, ast_pbx_uuid_get(), ast_realtime_enabled(), AST_RTP_MAX_PT, AST_RTP_PT_FIRST_DYNAMIC, AST_RTP_PT_LAST_REASSIGN, ast_startuptime, ast_strftime(), AST_UUID_STR_LEN, ast_verb_console_get(), ast_webmanager_check_enabled(), buf, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, errno, F_OK, NULL, option_debug, option_dtmfminduration, option_minmemfree, option_trace, option_verbose, PATH_MAX, print_file(), R_OK, S_OR, and ast_cli_entry::usage.

◆ handle_show_sysinfo()

static char * handle_show_sysinfo ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Give an overview of system statistics.

Definition at line 681 of file asterisk.c.

682{
683 uint64_t physmem, freeram;
684#if defined(HAVE_SYSINFO) || defined(HAVE_SWAPCTL)
685 int totalswap = 0;
686 uint64_t freeswap = 0;
687#endif
688 int nprocs = 0;
689 long uptime = 0;
690#if defined(HAVE_SYSINFO)
691 struct sysinfo sys_info;
692#elif defined(HAVE_SYSCTL)
693 static int pageshift;
694 struct vmtotal vmtotal;
695 struct timeval boottime;
696 time_t now;
697 int mib[2], pagesize;
698#if defined(HAVE_SWAPCTL)
699 int usedswap = 0;
700#endif
701 size_t len;
702#endif
703
704 switch (cmd) {
705 case CLI_INIT:
706 e->command = "core show sysinfo";
707 e->usage =
708 "Usage: core show sysinfo\n"
709 " List current system information.\n";
710 return NULL;
711 case CLI_GENERATE:
712 return NULL;
713 }
714
715#if defined(HAVE_SYSINFO)
716 sysinfo(&sys_info);
717 uptime = sys_info.uptime / 3600;
718 physmem = sys_info.totalram * sys_info.mem_unit;
719 freeram = (sys_info.freeram * sys_info.mem_unit) / 1024;
720 totalswap = (sys_info.totalswap * sys_info.mem_unit) / 1024;
721 freeswap = (sys_info.freeswap * sys_info.mem_unit) / 1024;
722 nprocs = sys_info.procs;
723#elif defined(HAVE_SYSCTL)
724 /* calculate the uptime by looking at boottime */
725 time(&now);
726 mib[0] = CTL_KERN;
727 mib[1] = KERN_BOOTTIME;
728 len = sizeof(boottime);
729 if (sysctl(mib, 2, &boottime, &len, NULL, 0) != -1) {
730 uptime = now - boottime.tv_sec;
731 }
732 uptime = uptime/3600;
733 /* grab total physical memory */
734 mib[0] = CTL_HW;
735#if defined(HW_PHYSMEM64)
736 mib[1] = HW_PHYSMEM64;
737#else
738 mib[1] = HW_PHYSMEM;
739#endif
740 len = sizeof(physmem);
741 sysctl(mib, 2, &physmem, &len, NULL, 0);
742
743 pagesize = getpagesize();
744 pageshift = 0;
745 while (pagesize > 1) {
746 pageshift++;
747 pagesize >>= 1;
748 }
749
750 /* we only need the amount of log(2)1024 for our conversion */
751 pageshift -= 10;
752
753 /* grab vm totals */
754 mib[0] = CTL_VM;
755 mib[1] = VM_METER;
756 len = sizeof(vmtotal);
757 sysctl(mib, 2, &vmtotal, &len, NULL, 0);
758 freeram = (vmtotal.t_free << pageshift);
759 /* generate swap usage and totals */
760#if defined(HAVE_SWAPCTL)
761 swapmode(&usedswap, &totalswap);
762 freeswap = (totalswap - usedswap);
763#endif
764 /* grab number of processes */
765#if defined(__OpenBSD__)
766 mib[0] = CTL_KERN;
767 mib[1] = KERN_NPROCS;
768 len = sizeof(nprocs);
769 sysctl(mib, 2, &nprocs, &len, NULL, 0);
770#endif
771#endif
772
773 ast_cli(a->fd, "\nSystem Statistics\n");
774 ast_cli(a->fd, "-----------------\n");
775 ast_cli(a->fd, " System Uptime: %ld hours\n", uptime);
776 ast_cli(a->fd, " Total RAM: %" PRIu64 " KiB\n", physmem / 1024);
777 ast_cli(a->fd, " Free RAM: %" PRIu64 " KiB\n", freeram);
778#if defined(HAVE_SYSINFO)
779 ast_cli(a->fd, " Buffer RAM: %" PRIu64 " KiB\n", ((uint64_t) sys_info.bufferram * sys_info.mem_unit) / 1024);
780#endif
781#if defined(HAVE_SYSINFO) || defined(HAVE_SWAPCTL)
782 ast_cli(a->fd, " Total Swap Space: %d KiB\n", totalswap);
783 ast_cli(a->fd, " Free Swap Space: %" PRIu64 " KiB\n\n", freeswap);
784#endif
785 ast_cli(a->fd, " Number of Processes: %d \n\n", nprocs);
786 return CLI_SUCCESS;
787}

References a, ast_cli(), CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, len(), NULL, and ast_cli_entry::usage.

◆ handle_show_threads()

static char * handle_show_threads ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 615 of file asterisk.c.

616{
617 int count = 0;
618 struct thread_list_t *cur;
619 switch (cmd) {
620 case CLI_INIT:
621 e->command = "core show threads";
622 e->usage =
623 "Usage: core show threads\n"
624 " List threads currently active in the system.\n";
625 return NULL;
626 case CLI_GENERATE:
627 return NULL;
628 }
629
632 ast_cli(a->fd, "%p %d %s\n", (void *)cur->id, cur->lwp, cur->name);
633 count++;
634 }
636 ast_cli(a->fd, "%d threads listed.\n", count);
637 return CLI_SUCCESS;
638}
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition linkedlists.h:78
#define AST_RWLIST_TRAVERSE

References a, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, thread_list_t::id, thread_list_t::list, thread_list_t::lwp, thread_list_t::name, NULL, and ast_cli_entry::usage.

◆ handle_stop_gracefully()

static char * handle_stop_gracefully ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2401 of file asterisk.c.

2402{
2403 switch (cmd) {
2404 case CLI_INIT:
2405 e->command = "core stop gracefully";
2406 e->usage =
2407 "Usage: core stop gracefully\n"
2408 " Causes Asterisk to not accept new calls, and exit when all\n"
2409 " active calls have terminated normally.\n";
2411 return NULL;
2412 case CLI_GENERATE:
2413 return NULL;
2414 }
2415
2416 if (a->argc != e->args)
2417 return CLI_SHOWUSAGE;
2418 quit_handler(0, SHUTDOWN_NICE, 0 /* no restart */);
2419 return CLI_SUCCESS;
2420}

References a, ast_cli_entry::args, ast_cli_allow_at_shutdown(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, quit_handler(), SHUTDOWN_NICE, and ast_cli_entry::usage.

◆ handle_stop_now()

static char * handle_stop_now ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2381 of file asterisk.c.

2382{
2383 switch (cmd) {
2384 case CLI_INIT:
2385 e->command = "core stop now";
2386 e->usage =
2387 "Usage: core stop now\n"
2388 " Shuts down a running Asterisk immediately, hanging up all active calls .\n";
2390 return NULL;
2391 case CLI_GENERATE:
2392 return NULL;
2393 }
2394
2395 if (a->argc != e->args)
2396 return CLI_SHOWUSAGE;
2397 quit_handler(0, SHUTDOWN_NORMAL, 0 /* not restart */);
2398 return CLI_SUCCESS;
2399}

References a, ast_cli_entry::args, ast_cli_allow_at_shutdown(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, quit_handler(), SHUTDOWN_NORMAL, and ast_cli_entry::usage.

◆ handle_stop_when_convenient()

static char * handle_stop_when_convenient ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2422 of file asterisk.c.

2423{
2424 switch (cmd) {
2425 case CLI_INIT:
2426 e->command = "core stop when convenient";
2427 e->usage =
2428 "Usage: core stop when convenient\n"
2429 " Causes Asterisk to perform a shutdown when all active calls have ended.\n";
2431 return NULL;
2432 case CLI_GENERATE:
2433 return NULL;
2434 }
2435
2436 if (a->argc != e->args)
2437 return CLI_SHOWUSAGE;
2438 ast_cli(a->fd, "Waiting for inactivity to perform halt\n");
2439 quit_handler(0, SHUTDOWN_REALLY_NICE, 0 /* don't restart */);
2440 return CLI_SUCCESS;
2441}

References a, ast_cli_entry::args, ast_cli(), ast_cli_allow_at_shutdown(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, quit_handler(), SHUTDOWN_REALLY_NICE, and ast_cli_entry::usage.

◆ handle_version()

static char * handle_version ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2360 of file asterisk.c.

2361{
2362 switch (cmd) {
2363 case CLI_INIT:
2364 e->command = "core show version";
2365 e->usage =
2366 "Usage: core show version\n"
2367 " Shows Asterisk version information.\n";
2368 return NULL;
2369 case CLI_GENERATE:
2370 return NULL;
2371 }
2372
2373 if (a->argc != 3)
2374 return CLI_SHOWUSAGE;
2375 ast_cli(a->fd, "Asterisk %s built by %s @ %s on a %s running %s on %s\n",
2378 return CLI_SUCCESS;
2379}

References a, ast_build_date, ast_build_hostname, ast_build_machine, ast_build_os, ast_build_user, ast_cli(), ast_get_version(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, NULL, and ast_cli_entry::usage.

◆ has_priority()

static int has_priority ( void  )
static

Check whether we were set to high(er) priority.

Definition at line 1790 of file asterisk.c.

1791{
1792 /* Neither of these calls should fail with these arguments. */
1793#ifdef __linux__
1794 /* For SCHED_OTHER, SCHED_BATCH and SCHED_IDLE, this will return
1795 * 0. For the realtime priorities SCHED_RR and SCHED_FIFO, it
1796 * will return something >= 1. */
1797 return sched_getscheduler(0);
1798#else
1799 /* getpriority() can return a value in -20..19 (or even -INF..20)
1800 * where negative numbers are high priority. We don't bother
1801 * checking errno. If the query fails and it returns -1, we'll
1802 * assume that we're running at high prio; a safe assumption
1803 * that will enable the resource starvation monitor (canary)
1804 * just in case. */
1805 return (getpriority(PRIO_PROCESS, 0) < 0);
1806#endif
1807}

Referenced by ast_ari_validate_dialplan_cep(), and asterisk_daemon().

◆ listener()

static void * listener ( void *  unused)
static

Definition at line 1530 of file asterisk.c.

1531{
1532 struct sockaddr_un sunaddr;
1533 int s;
1534 socklen_t len;
1535 int x;
1536 int poll_result;
1537 struct pollfd fds[1];
1538
1539 for (;;) {
1540 if (ast_socket < 0) {
1541 return NULL;
1542 }
1543 fds[0].fd = ast_socket;
1544 fds[0].events = POLLIN;
1545 poll_result = ast_poll(fds, 1, -1);
1546 pthread_testcancel();
1547 if (poll_result < 0) {
1548 if (errno != EINTR) {
1549 ast_log(LOG_WARNING, "poll returned error: %s\n", strerror(errno));
1550 }
1551 continue;
1552 }
1553 len = sizeof(sunaddr);
1554 s = accept(ast_socket, (struct sockaddr *)&sunaddr, &len);
1555 if (s < 0) {
1556 if (errno != EINTR)
1557 ast_log(LOG_WARNING, "Accept returned %d: %s\n", s, strerror(errno));
1558 } else {
1559#if defined(SO_PASSCRED)
1560 int sckopt = 1;
1561 /* turn on socket credentials passing. */
1562 if (setsockopt(s, SOL_SOCKET, SO_PASSCRED, &sckopt, sizeof(sckopt)) < 0) {
1563 ast_log(LOG_WARNING, "Unable to turn on socket credentials passing\n");
1564 close(s);
1565 } else
1566#endif
1567 {
1568 for (x = 0; x < AST_MAX_CONNECTS; x++) {
1569 if (consoles[x].fd >= 0) {
1570 continue;
1571 }
1572 if (socketpair(AF_LOCAL, SOCK_STREAM, 0, consoles[x].p)) {
1573 ast_log(LOG_ERROR, "Unable to create pipe: %s\n", strerror(errno));
1574 fdprint(s, "Server failed to create pipe\n");
1575 close(s);
1576 break;
1577 }
1578 ast_fd_set_flags(consoles[x].p[1], O_NONBLOCK);
1579 consoles[x].mute = 1; /* Default is muted, we will un-mute if necessary */
1580 /* Default uid and gid to -2, so then in cli.c/cli_has_permissions() we will be able
1581 to know if the user didn't send the credentials. */
1582 consoles[x].uid = -2;
1583 consoles[x].gid = -2;
1584 /* Server default of remote console verbosity level is OFF. */
1585 consoles[x].option_verbose = 0;
1586 consoles[x].fd = s;
1588 consoles[x].fd = -1;
1589 ast_log(LOG_ERROR, "Unable to spawn thread to handle connection: %s\n", strerror(errno));
1590 close(consoles[x].p[0]);
1591 close(consoles[x].p[1]);
1592 fdprint(s, "Server failed to spawn thread\n");
1593 close(s);
1594 }
1595 break;
1596 }
1597 if (x >= AST_MAX_CONNECTS) {
1598 fdprint(s, "No more connections allowed\n");
1599 ast_log(LOG_WARNING, "No more connections allowed\n");
1600 close(s);
1601 } else if ((consoles[x].fd > -1) && (!ast_opt_hide_connect)) {
1602 ast_verb(3, "Remote UNIX connection\n");
1603 }
1604 }
1605 }
1606 }
1607 return NULL;
1608}
static void * netconsole(void *vconsole)
Definition asterisk.c:1440
#define ast_opt_hide_connect
Definition options.h:142
int uid
Definition asterisk.c:329
int gid
Definition asterisk.c:330
int option_verbose
Definition asterisk.c:333
#define ast_fd_set_flags(fd, flags)
Set flags on the given file descriptor.
Definition utils.h:1079
#define ast_pthread_create_detached_background(a, b, c, d)
Definition utils.h:637

References AF_LOCAL, ast_fd_set_flags, ast_log, AST_MAX_CONNECTS, ast_opt_hide_connect, ast_poll, ast_pthread_create_detached_background, ast_socket, ast_verb, consoles, errno, console::fd, fdprint(), console::gid, len(), LOG_ERROR, LOG_WARNING, console::mute, netconsole(), NULL, console::option_verbose, and console::uid.

Referenced by __allocate_taskprocessor(), __ast_taskpool_serializer_push_wait(), ast_makesocket(), ast_taskpool_serializer_group(), ast_taskpool_serializer_suspend(), ast_taskpool_serializer_unsuspend(), ast_taskprocessor_create_with_listener(), ast_taskprocessor_get(), ast_taskprocessor_listener_alloc(), ast_taskprocessor_listener_get_tps(), ast_taskprocessor_listener_get_user_data(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), ast_threadpool_create(), ast_threadpool_listener_alloc(), ast_threadpool_listener_get_user_data(), ast_threadpool_serializer_group(), default_listener_pvt_dtor(), default_listener_shutdown(), default_listener_start(), default_task_pushed(), default_tps_processing_function(), execute_tasks(), handle_cli_threadpool_push_efficiency(), handle_cli_threadpool_push_serializer_efficiency(), listener_check(), listener_shutdown(), serializer_shutdown(), serializer_shutdown(), serializer_task_pushed(), serializer_task_pushed(), taskpool_serializer_suspend_task(), taskprocessor_listener_dtor(), test_emptied(), test_emptied(), test_shutdown(), test_shutdown(), test_state_changed(), test_task_pushed(), test_task_pushed(), threadpool_tps_emptied(), threadpool_tps_shutdown(), threadpool_tps_task_pushed(), and wait_for_task_pushed().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Check for options

Todo:
Document these options
Note
Please keep the ordering here to alphabetical, capital letters first. This will make it easier in the future to select unused option flags for new features.
The q option is never used anywhere, only defined
Can ONLY be used with remote console

Definition at line 3620 of file asterisk.c.

3621{
3622 int c;
3623 int x;
3624 int isroot = 1, rundir_exists = 0;
3625 RAII_VAR(char *, runuser, NULL, ast_free);
3626 RAII_VAR(char *, rungroup, NULL, ast_free);
3627 RAII_VAR(char *, xarg, NULL, ast_free);
3628 struct rlimit l;
3629 static const char *getopt_settings = "BC:cde:FfG:ghIiL:M:mnpqRrs:TtU:VvWXx:";
3630
3631 /* Try to explicitly set a UTF-8 locale. This is needed for
3632 libedit, as the LC_CTYPE category of the locale impacts the the
3633 multi-byte character functions provided by libc. If it fails,
3634 so be it. */
3635 if (!setlocale(LC_ALL, "C.UTF-8")) {
3636 ast_debug(1, "Tried to set locale to C.UTF-8 but it failed\n");
3637 }
3638
3639 /* Remember original args for restart */
3640 if (argc > ARRAY_LEN(_argv) - 1) {
3641 fprintf(stderr, "Truncating argument size to %d\n", (int)ARRAY_LEN(_argv) - 1);
3642 argc = ARRAY_LEN(_argv) - 1;
3643 }
3644 for (x = 0; x < argc; x++)
3645 _argv[x] = argv[x];
3646 _argv[x] = NULL;
3647
3648 if (geteuid() != 0)
3649 isroot = 0;
3650
3651 /* if the progname is rasterisk consider it a remote console */
3652 if (argv[0] && (strstr(argv[0], "rasterisk")) != NULL) {
3654 }
3655 ast_mainpid = getpid();
3656
3657 /* Process command-line options that affect asterisk.conf load. */
3658 while ((c = getopt(argc, argv, getopt_settings)) != -1) {
3659 switch (c) {
3660 case 'X':
3662 break;
3663 case 'C':
3664 set_asterisk_conf_path(optarg);
3665 break;
3666 case 'd':
3667 option_debug++;
3668 break;
3669 case 'h':
3670 show_cli_help();
3671 exit(0);
3672 case 'R':
3673 case 'r':
3674 case 'x':
3675 /* ast_opt_remote is checked during config load. This is only part of what
3676 * these options do, see the second loop for the rest of the actions. */
3678 break;
3679 case 'V':
3680 show_version();
3681 exit(0);
3682 case 'v':
3684 break;
3685 case '?':
3686 exit(1);
3687 }
3688 }
3689
3690 /* Initialize env so it is available if #exec is used in asterisk.conf. */
3691 env_init();
3692
3694
3695 /* Update env to include any systemname that was set. */
3696 env_init();
3697
3698 /*! \brief Check for options
3699 *
3700 * \todo Document these options
3701 */
3702 optind = 1;
3703 while ((c = getopt(argc, argv, getopt_settings)) != -1) {
3704 /*!\note Please keep the ordering here to alphabetical, capital letters
3705 * first. This will make it easier in the future to select unused
3706 * option flags for new features. */
3707 switch (c) {
3708 case 'B': /* Force black background */
3711 break;
3712 case 'X':
3713 /* The command-line -X option enables #exec for asterisk.conf only. */
3714 break;
3715 case 'C':
3716 /* already processed. */
3717 break;
3718 case 'c':
3720 break;
3721 case 'd':
3722 /* already processed. */
3723 break;
3724#if defined(HAVE_SYSINFO)
3725 case 'e':
3726 if ((sscanf(&optarg[1], "%30ld", &option_minmemfree) != 1) || (option_minmemfree < 0)) {
3728 }
3729 break;
3730#endif
3731#if HAVE_WORKING_FORK
3732 case 'F':
3734 break;
3735 case 'f':
3737 break;
3738#endif
3739 case 'G':
3740 rungroup = ast_strdup(optarg);
3741 break;
3742 case 'g':
3744 break;
3745 case 'h':
3746 /* already processed. */
3747 break;
3748 case 'I':
3749 fprintf(stderr,
3750 "NOTICE: The -I option is no longer needed.\n"
3751 " It will always be enabled if you have a timing module loaded.\n");
3752 break;
3753 case 'i':
3755 break;
3756 case 'L':
3757 if ((sscanf(optarg, "%30lf", &ast_option_maxload) != 1) || (ast_option_maxload < 0.0)) {
3758 ast_option_maxload = 0.0;
3759 }
3760 break;
3761 case 'M':
3762 if ((sscanf(optarg, "%30d", &ast_option_maxcalls) != 1) || (ast_option_maxcalls < 0)) {
3764 }
3765 break;
3766 case 'm':
3768 break;
3769 case 'n':
3771 break;
3772 case 'p':
3774 break;
3775 case 'q':
3777 break;
3778 case 'R':
3780 break;
3781 case 'r':
3783 break;
3784 case 's':
3785 if (ast_opt_remote) {
3786 set_socket_path(optarg);
3787 }
3788 break;
3789 case 'T':
3791 break;
3792 case 't':
3794 break;
3795 case 'U':
3796 runuser = ast_strdup(optarg);
3797 break;
3798 case 'V':
3799 case 'v':
3800 /* already processed. */
3801 break;
3802 case 'W': /* White background */
3805 break;
3806 case 'x':
3807 /* -r is implied by -x so set the flags -r sets as well. */
3809
3811 xarg = ast_strdup(optarg);
3812 break;
3813 case '?':
3814 /* already processed. */
3815 break;
3816 }
3817 }
3818
3819 if (ast_opt_remote) {
3820 int didwarn = 0;
3821 optind = 1;
3822
3823 /* Not all options can be used with remote console. Warn if they're used. */
3824 while ((c = getopt(argc, argv, getopt_settings)) != -1) {
3825 switch (c) {
3826 /* okay to run with remote console */
3827 case 'B': /* force black background */
3828 case 'C': /* set config path */
3829 case 'd': /* debug */
3830 case 'h': /* help */
3831 case 'I': /* obsolete timing option: warning already thrown if used */
3832 case 'L': /* max load */
3833 case 'M': /* max calls */
3834 case 'm': /* mute */
3835 /*! \note The q option is never used anywhere, only defined */
3836 case 'q': /* quiet */
3837 case 'R': /* reconnect */
3838 case 'r': /* remote */
3839 /*! \note Can ONLY be used with remote console */
3840 case 's': /* set socket path */
3841 case 'T': /* timestamp */
3842 case 'V': /* version */
3843 case 'v': /* verbose */
3844 case 'W': /* white background */
3845 case 'x': /* remote execute */
3846 case '?': /* ? */
3847 break;
3848 /* can only be run when Asterisk is starting */
3849 case 'X': /* enables #exec for asterisk.conf only. */
3850 case 'c': /* foreground console */
3851 case 'e': /* minimum memory free */
3852 case 'F': /* always fork */
3853 case 'f': /* no fork */
3854 case 'G': /* run group */
3855 case 'g': /* dump core */
3856 case 'i': /* init keys */
3857 case 'n': /* no color */
3858 case 'p': /* high priority */
3859 case 't': /* cache record files */
3860 case 'U': /* run user */
3861 fprintf(stderr, "'%c' option is not compatible with remote console mode and has no effect.\n", c);
3862 didwarn = 1;
3863 }
3864 }
3865 if (didwarn) {
3866 fprintf(stderr, "\n"); /* if any warnings print out, make them stand out */
3867 }
3868 }
3869
3870 /* For remote connections, change the name of the remote connection.
3871 * We do this for the benefit of init scripts (which need to know if/when
3872 * the main asterisk process has died yet). */
3873 if (ast_opt_remote) {
3874 strcpy(argv[0], "rasterisk");
3875 for (x = 1; x < argc; x++) {
3876 argv[x] = argv[0] + 10;
3877 }
3878 }
3879
3881 fprintf(stderr, "'alwaysfork' is not compatible with console or remote console mode; ignored\n");
3883 }
3884
3885 if (ast_opt_dump_core) {
3886 memset(&l, 0, sizeof(l));
3887 l.rlim_cur = RLIM_INFINITY;
3888 l.rlim_max = RLIM_INFINITY;
3889 if (setrlimit(RLIMIT_CORE, &l)) {
3890 fprintf(stderr, "Unable to disable core size resource limit: %s\n", strerror(errno));
3891 }
3892 }
3893
3894 if (getrlimit(RLIMIT_NOFILE, &l)) {
3895 fprintf(stderr, "Unable to check file descriptor limit: %s\n", strerror(errno));
3896 }
3897
3898#if !defined(CONFIGURE_RAN_AS_ROOT)
3899 /* Check if select(2) will run with more file descriptors */
3900 do {
3901 int fd, fd2;
3902 ast_fdset readers;
3903 struct timeval tv = { 0, };
3904
3905 if (l.rlim_cur <= FD_SETSIZE) {
3906 /* The limit of select()able FDs is irrelevant, because we'll never
3907 * open one that high. */
3908 break;
3909 }
3910
3911 if (!(fd = open("/dev/null", O_RDONLY))) {
3912 fprintf(stderr, "Cannot open a file descriptor at boot? %s\n", strerror(errno));
3913 break; /* XXX Should we exit() here? XXX */
3914 }
3915
3916 fd2 = ((l.rlim_cur > sizeof(readers) * 8) ? sizeof(readers) * 8 : l.rlim_cur) - 1;
3917 if (dup2(fd, fd2) < 0) {
3918 fprintf(stderr, "Cannot open maximum file descriptor %d at boot? %s\n", fd2, strerror(errno));
3919 close(fd);
3920 break;
3921 }
3922
3923 FD_ZERO(&readers);
3924 FD_SET(fd2, &readers);
3925 if (ast_select(fd2 + 1, &readers, NULL, NULL, &tv) < 0) {
3926 fprintf(stderr, "Maximum select()able file descriptor is %d\n", FD_SETSIZE);
3927 }
3928 ast_FD_SETSIZE = l.rlim_cur > ast_FDMAX ? ast_FDMAX : l.rlim_cur;
3929 close(fd);
3930 close(fd2);
3931 } while (0);
3932#elif defined(HAVE_VARIABLE_FDSET)
3933 ast_FD_SETSIZE = l.rlim_cur > ast_FDMAX ? ast_FDMAX : l.rlim_cur;
3934#endif /* !defined(CONFIGURE_RAN_AS_ROOT) */
3935
3936 if ((!rungroup) && !ast_strlen_zero(ast_config_AST_RUN_GROUP))
3938 if ((!runuser) && !ast_strlen_zero(ast_config_AST_RUN_USER))
3940
3941 /* Must install this signal handler up here to ensure that if the canary
3942 * fails to execute that it doesn't kill the Asterisk process.
3943 */
3944 sigaction(SIGCHLD, &child_handler, NULL);
3945
3946 /* It's common on some platforms to clear /var/run at boot. Create the
3947 * socket file directory before we drop privileges. */
3948 if (mkdir(ast_config_AST_RUN_DIR, 0755)) {
3949 if (errno == EEXIST) {
3950 rundir_exists = 1;
3951 } else {
3952 fprintf(stderr, "Unable to create socket file directory. Remote consoles will not be able to connect! (%s)\n", strerror(x));
3953 }
3954 }
3955
3956#ifndef __CYGWIN__
3957
3958 if (isroot) {
3960 }
3961
3962 if (isroot && rungroup) {
3963 struct group *gr;
3964 gr = getgrnam(rungroup);
3965 if (!gr) {
3966 fprintf(stderr, "No such group '%s'!\n", rungroup);
3967 exit(1);
3968 }
3969 if (!rundir_exists && chown(ast_config_AST_RUN_DIR, -1, gr->gr_gid)) {
3970 fprintf(stderr, "Unable to chgrp run directory to %d (%s)\n", (int) gr->gr_gid, rungroup);
3971 }
3972 if (setgid(gr->gr_gid)) {
3973 fprintf(stderr, "Unable to setgid to %d (%s)\n", (int)gr->gr_gid, rungroup);
3974 exit(1);
3975 }
3976 if (setgroups(0, NULL)) {
3977 fprintf(stderr, "Unable to drop unneeded groups\n");
3978 exit(1);
3979 }
3980 }
3981
3982 if (runuser && !ast_opt_remote) {
3983#ifdef HAVE_CAP
3984 int has_cap = 1;
3985#endif /* HAVE_CAP */
3986 struct passwd *pw;
3987 pw = getpwnam(runuser);
3988 if (!pw) {
3989 fprintf(stderr, "No such user '%s'!\n", runuser);
3990 exit(1);
3991 }
3992 if (chown(ast_config_AST_RUN_DIR, pw->pw_uid, -1)) {
3993 fprintf(stderr, "Unable to chown run directory to %d (%s)\n", (int) pw->pw_uid, runuser);
3994 }
3995#ifdef HAVE_CAP
3996 if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0)) {
3997 ast_log(LOG_WARNING, "Unable to keep capabilities.\n");
3998 has_cap = 0;
3999 }
4000#endif /* HAVE_CAP */
4001 if (!isroot && pw->pw_uid != geteuid()) {
4002 fprintf(stderr, "Asterisk started as nonroot, but runuser '%s' requested.\n", runuser);
4003 exit(1);
4004 }
4005 if (!rungroup) {
4006 if (setgid(pw->pw_gid)) {
4007 fprintf(stderr, "Unable to setgid to %d!\n", (int)pw->pw_gid);
4008 exit(1);
4009 }
4010 if (isroot && initgroups(pw->pw_name, pw->pw_gid)) {
4011 fprintf(stderr, "Unable to init groups for '%s'\n", runuser);
4012 exit(1);
4013 }
4014 }
4015 if (setuid(pw->pw_uid)) {
4016 fprintf(stderr, "Unable to setuid to %d (%s)\n", (int)pw->pw_uid, runuser);
4017 exit(1);
4018 }
4019#ifdef HAVE_CAP
4020 if (has_cap) {
4021 cap_t cap;
4022
4023 cap = cap_from_text("cap_net_admin=eip");
4024
4025 if (cap_set_proc(cap)) {
4026 fprintf(stderr, "Unable to install capabilities.\n");
4027 }
4028 if (cap_free(cap)) {
4029 fprintf(stderr, "Unable to drop capabilities.\n");
4030 }
4031 }
4032#endif /* HAVE_CAP */
4033 }
4034
4035#endif /* __CYGWIN__ */
4036
4037#ifdef linux
4038 if (geteuid() && ast_opt_dump_core) {
4039 if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) < 0) {
4040 fprintf(stderr, "Unable to set the process for core dumps after changing to a non-root user. %s\n", strerror(errno));
4041 }
4042 }
4043#endif
4044
4045 {
4046#if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
4047 char dir[PATH_MAX];
4048 if (!getcwd(dir, sizeof(dir)) || eaccess(dir, R_OK | X_OK | F_OK)) {
4049 fprintf(stderr, "Unable to access the running directory (%s). Changing to '/' for compatibility.\n", strerror(errno));
4050 /* If we cannot access the CWD, then we couldn't dump core anyway,
4051 * so chdir("/") won't break anything. */
4052 if (chdir("/")) {
4053 /* chdir(/) should never fail, so this ends up being a no-op */
4054 fprintf(stderr, "chdir(\"/\") failed?!! %s\n", strerror(errno));
4055 }
4056 } else
4057#endif /* defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS) */
4059 /* Backgrounding, but no cores, so chdir won't break anything. */
4060 if (chdir("/")) {
4061 fprintf(stderr, "Unable to chdir(\"/\") ?!! %s\n", strerror(errno));
4062 }
4063 }
4064 }
4065
4066 /* Initial value of the maximum active system verbosity level. */
4068
4069 if (ast_sd_get_fd_un(SOCK_STREAM, ast_config_AST_SOCKET) > 0) {
4070 ast_socket_is_sd = 1;
4071 }
4072
4073 /* DO NOT perform check for existing daemon if systemd has CLI socket activation */
4074 if (!ast_socket_is_sd && ast_tryconnect()) {
4075 /* One is already running */
4076 if (ast_opt_remote) {
4078 if (ast_opt_exec) {
4079 ast_remotecontrol(xarg);
4081 exit(0);
4082 }
4083 ast_term_init();
4084 printf("%s", term_end());
4085 fflush(stdout);
4086
4087 print_intro_message(runuser, rungroup);
4088 printf("%s", term_quit());
4091 exit(0);
4092 } else {
4093 fprintf(stderr, "Asterisk already running on %s. Use 'asterisk -r' to connect.\n", ast_config_AST_SOCKET);
4094 printf("%s", term_quit());
4095 exit(1);
4096 }
4097 } else if (ast_opt_remote || ast_opt_exec) {
4098 fprintf(stderr, "Unable to connect to remote asterisk (does %s exist?)\n", ast_config_AST_SOCKET);
4099 printf("%s", term_quit());
4100 exit(1);
4101 }
4102
4103#ifdef HAVE_CAP
4104 child_cap = cap_from_text("cap_net_admin-eip");
4105#endif
4106 /* Not a remote console? Start the daemon. */
4107 asterisk_daemon(isroot, runuser, rungroup);
4108#ifdef HAS_CAP
4109 cap_free(child_cap);
4110#endif
4111 return 0;
4112}
void load_asterisk_conf(void)
Definition options.c:211
void set_asterisk_conf_path(const char *path)
Definition options.c:201
void set_socket_path(const char *path)
Definition options.c:206
static int show_version(void)
Definition asterisk.c:3405
static struct sigaction child_handler
Definition asterisk.c:1771
static void asterisk_daemon(int isroot, const char *runuser, const char *rungroup)
Definition asterisk.c:4127
static void ast_remotecontrol(char *data)
Definition asterisk.c:3257
static int show_cli_help(void)
Definition asterisk.c:3411
static void env_init(void)
Definition asterisk.c:3590
int ast_verb_sys_level
Definition options.c:65
@ AST_OPT_FLAG_EXEC_INCLUDES
Definition options.h:41
@ AST_OPT_FLAG_NO_COLOR
Definition options.h:57
@ AST_OPT_FLAG_NO_FORK
Definition options.h:43
@ AST_OPT_FLAG_ALWAYS_FORK
Definition options.h:83
@ AST_OPT_FLAG_QUIET
Definition options.h:45
@ AST_OPT_FLAG_MUTE
Definition options.h:85
@ AST_OPT_FLAG_TIMESTAMP
Definition options.h:69
@ AST_OPT_FLAG_EXEC
Definition options.h:55
@ AST_OPT_FLAG_CACHE_RECORD_FILES
Definition options.h:67
@ AST_OPT_FLAG_INIT_KEYS
Definition options.h:51
@ AST_OPT_FLAG_CONSOLE
Definition options.h:47
@ AST_OPT_FLAG_FORCE_BLACK_BACKGROUND
Definition options.h:95
@ AST_OPT_FLAG_LIGHT_BACKGROUND
Definition options.h:91
@ AST_OPT_FLAG_REMOTE
Definition options.h:53
@ AST_OPT_FLAG_DUMP_CORE
Definition options.h:65
@ AST_OPT_FLAG_RECONNECT
Definition options.h:73
#define ast_debug(level,...)
Log a DEBUG message.
#define FD_SET(fd, fds)
Definition select.h:58
#define ast_FDMAX
Definition select.h:41
unsigned int ast_FD_SETSIZE
Definition poll.c:86
static int ast_select(int nfds, ast_fdset *rfds, ast_fdset *wfds, ast_fdset *efds, struct timeval *tvp)
Waits for activity on a group of channels.
Definition select.h:79
#define FD_ZERO(a)
Definition select.h:49
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:981

References _argv, ARRAY_LEN, ast_clear_flag64, ast_config_AST_RUN_DIR, ast_config_AST_RUN_GROUP, ast_config_AST_RUN_USER, ast_config_AST_SOCKET, ast_debug, ast_FD_SETSIZE, ast_FDMAX, ast_free, ast_log, ast_mainpid, ast_opt_always_fork, ast_opt_console, ast_opt_dump_core, ast_opt_exec, AST_OPT_FLAG_ALWAYS_FORK, AST_OPT_FLAG_CACHE_RECORD_FILES, AST_OPT_FLAG_CONSOLE, AST_OPT_FLAG_DUMP_CORE, AST_OPT_FLAG_EXEC, AST_OPT_FLAG_EXEC_INCLUDES, AST_OPT_FLAG_FORCE_BLACK_BACKGROUND, AST_OPT_FLAG_HIGH_PRIORITY, AST_OPT_FLAG_INIT_KEYS, AST_OPT_FLAG_LIGHT_BACKGROUND, AST_OPT_FLAG_MUTE, AST_OPT_FLAG_NO_COLOR, AST_OPT_FLAG_NO_FORK, AST_OPT_FLAG_QUIET, AST_OPT_FLAG_RECONNECT, AST_OPT_FLAG_REMOTE, AST_OPT_FLAG_TIMESTAMP, ast_opt_high_priority, ast_opt_no_fork, ast_opt_remote, ast_option_maxcalls, ast_option_maxload, ast_options, ast_remotecontrol(), ast_sd_get_fd_un(), ast_select(), ast_set_flag64, ast_set_priority(), ast_socket_is_sd, ast_strdup, ast_strlen_zero(), ast_term_init(), ast_tryconnect(), ast_verb_sys_level, asterisk_daemon(), c, child_handler, env_init(), errno, F_OK, FD_SET, FD_ZERO, load_asterisk_conf(), LOG_WARNING, multi_thread_safe, NULL, option_debug, option_minmemfree, option_verbose, PATH_MAX, print_intro_message(), quit_handler(), R_OK, RAII_VAR, set_asterisk_conf_path(), set_socket_path(), show_cli_help(), show_version(), SHUTDOWN_FAST, term_end(), and term_quit().

◆ main_atexit()

static void main_atexit ( void  )
static

Definition at line 3615 of file asterisk.c.

3616{
3618}
void ast_cli_unregister_multiple(void)
Definition ael_main.c:408

References ARRAY_LEN, ast_cli_unregister_multiple(), and cli_asterisk.

Referenced by asterisk_daemon().

◆ monitor_sig_flags()

static void * monitor_sig_flags ( void *  unused)
static

Definition at line 3484 of file asterisk.c.

3485{
3486 for (;;) {
3487 struct pollfd p = { sig_alert_pipe[0], POLLIN, 0 };
3488
3489 ast_poll(&p, 1, -1);
3490 if (sig_flags.need_reload) {
3491 sig_flags.need_reload = 0;
3493 }
3494 if (sig_flags.need_quit) {
3495 sig_flags.need_quit = 0;
3496 if ((consolethread != AST_PTHREADT_NULL) && (consolethread != pthread_self())) {
3497 sig_flags.need_quit_handler = 1;
3498 pthread_kill(consolethread, SIGURG);
3499 } else {
3501 }
3502 }
3504 }
3505
3506 return NULL;
3507}
ast_alert_status_t ast_alertpipe_read(int alert_pipe[2])
Read an event from an alert pipe.
Definition alertpipe.c:102
enum ast_module_reload_result ast_module_reload(const char *name)
Reload asterisk modules.
Definition loader.c:1730

References ast_alertpipe_read(), ast_module_reload(), ast_poll, AST_PTHREADT_NULL, consolethread, NULL, quit_handler(), SHUTDOWN_NORMAL, sig_alert_pipe, and sig_flags.

Referenced by asterisk_daemon().

◆ netconsole()

static void * netconsole ( void *  vconsole)
static

Definition at line 1440 of file asterisk.c.

1441{
1442 struct console *con = vconsole;
1443 char hostname[MAXHOSTNAMELEN] = "";
1444 char inbuf[512];
1445 char outbuf[512];
1446 const char * const end_buf = inbuf + sizeof(inbuf);
1447 char *start_read = inbuf;
1448 int res;
1449 struct pollfd fds[2];
1450
1451 if (gethostname(hostname, sizeof(hostname)-1))
1452 ast_copy_string(hostname, "<Unknown>", sizeof(hostname));
1453 snprintf(outbuf, sizeof(outbuf), "%s/%ld/%s\n", hostname, (long)ast_mainpid, ast_get_version());
1454 fdprint(con->fd, outbuf);
1456 for (;;) {
1457 fds[0].fd = con->fd;
1458 fds[0].events = POLLIN;
1459 fds[0].revents = 0;
1460 fds[1].fd = con->p[0];
1461 fds[1].events = POLLIN;
1462 fds[1].revents = 0;
1463
1464 res = ast_poll(fds, 2, -1);
1465 if (res < 0) {
1466 if (errno != EINTR)
1467 ast_log(LOG_WARNING, "poll returned < 0: %s\n", strerror(errno));
1468 continue;
1469 }
1470 if (fds[0].revents) {
1471 int cmds_read, bytes_read;
1472 if ((bytes_read = read_credentials(con->fd, start_read, end_buf - start_read, con)) < 1) {
1473 break;
1474 }
1475 /* XXX This will only work if it is the first command, and I'm not sure fixing it is worth the effort. */
1476 if (strncmp(inbuf, "cli quit after ", 15) == 0) {
1477 ast_cli_command_multiple_full(con->uid, con->gid, con->fd, bytes_read - 15, inbuf + 15);
1478 break;
1479 }
1480 /* ast_cli_command_multiple_full will only process individual commands terminated by a
1481 * NULL and not trailing partial commands. */
1482 if (!(cmds_read = ast_cli_command_multiple_full(con->uid, con->gid, con->fd, bytes_read + start_read - inbuf, inbuf))) {
1483 /* No commands were read. We either have a short read on the first command
1484 * with space left, or a command that is too long */
1485 if (start_read + bytes_read < end_buf) {
1486 start_read += bytes_read;
1487 } else {
1488 ast_log(LOG_ERROR, "Command too long! Skipping\n");
1489 start_read = inbuf;
1490 }
1491 continue;
1492 }
1493 if (start_read[bytes_read - 1] == '\0') {
1494 /* The read ended on a command boundary, start reading again at the head of inbuf */
1495 start_read = inbuf;
1496 continue;
1497 }
1498 /* If we get this far, we have left over characters that have not been processed.
1499 * Advance to the character after the last command read by ast_cli_command_multiple_full.
1500 * We are guaranteed to have at least cmds_read NULLs */
1501 while (cmds_read-- && (start_read = strchr(start_read, '\0'))) {
1502 start_read++;
1503 }
1504 memmove(inbuf, start_read, end_buf - start_read);
1505 start_read = end_buf - start_read + inbuf;
1506 }
1507 if (fds[1].revents) {
1508 res = read_credentials(con->p[0], outbuf, sizeof(outbuf), con);
1509 if (res < 1) {
1510 ast_log(LOG_ERROR, "read returned %d\n", res);
1511 break;
1512 }
1513 res = write(con->fd, outbuf, res);
1514 if (res < 1)
1515 break;
1516 }
1517 }
1519 if (!ast_opt_hide_connect) {
1520 ast_verb(3, "Remote UNIX connection disconnected\n");
1521 }
1522 close(con->fd);
1523 close(con->p[0]);
1524 close(con->p[1]);
1525 con->fd = -1;
1526
1527 return NULL;
1528}
static int read_credentials(int fd, char *buffer, size_t size, struct console *con)
read() function supporting the reception of user credentials.
Definition asterisk.c:1390
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,...
Definition main/cli.c:3123
void ast_verb_console_unregister(void)
Unregister this thread's console verbosity level.
Definition logger.c:2729
void ast_verb_console_register(int *level)
Register this thread's console verbosity level pointer.
Definition logger.c:2713
int p[2]
Definition asterisk.c:326
static int inbuf(struct baseio *bio, FILE *fi)
utility used by inchar(), for base_encode()
Definition utils.c:588

References ast_cli_command_multiple_full(), ast_copy_string(), ast_get_version(), ast_log, ast_mainpid, ast_opt_hide_connect, ast_poll, ast_verb, ast_verb_console_register(), ast_verb_console_unregister(), errno, console::fd, fdprint(), console::gid, hostname, inbuf(), LOG_ERROR, LOG_WARNING, MAXHOSTNAMELEN, NULL, console::option_verbose, console::p, read_credentials(), and console::uid.

Referenced by listener().

◆ print_file()

static int print_file ( int  fd,
char *  desc,
const char *  filename 
)
static

Print the contents of a file.

Definition at line 458 of file asterisk.c.

459{
460 FILE *f;
461 char c;
462 if (!(f = fopen(filename, "r"))) {
463 return -1;
464 }
465 ast_cli(fd, "%s", desc);
466 while ((c = fgetc(f)) != EOF) {
467 ast_cli(fd, "%c", c);
468 }
469 fclose(f);
470 /* no need for trailing new line, the file already has one */
471 return 0;
472}
static const char desc[]
Definition cdr_radius.c:84

References ast_cli(), c, and desc.

Referenced by handle_show_settings().

◆ print_intro_message()

static void print_intro_message ( const char *  runuser,
const char *  rungroup 
)
static

Definition at line 3602 of file asterisk.c.

3603{
3606 if (runuser) {
3607 ast_verbose("Running as user '%s'\n", runuser);
3608 }
3609 if (rungroup) {
3610 ast_verbose("Running under group '%s'\n", rungroup);
3611 }
3612 }
3613}

References ast_opt_console, ast_opt_exec, ast_opt_remote, ast_verbose, option_verbose, and WELCOME_MESSAGE.

Referenced by asterisk_daemon(), and main().

◆ process_histfile()

static void process_histfile ( int(*)(const char *filename)  readwrite)
static

Definition at line 3220 of file asterisk.c.

3221{
3222 struct passwd *pw = getpwuid(geteuid());
3223 int ret = 0;
3224 char *name = NULL;
3225
3226 if (!pw || ast_strlen_zero(pw->pw_dir)) {
3227 ast_log(LOG_ERROR, "Unable to determine home directory. History read/write disabled.\n");
3228 return;
3229 }
3230
3231 ret = ast_asprintf(&name, "%s/.asterisk_history", pw->pw_dir);
3232 if (ret <= 0) {
3233 ast_log(LOG_ERROR, "Unable to create history file name. History read/write disabled.\n");
3234 return;
3235 }
3236
3237 ret = readwrite(name);
3238 if (ret < 0) {
3239 ast_log(LOG_ERROR, "Unable to read or write history file '%s'\n", name);
3240 }
3241
3242 ast_free(name);
3243
3244 return;
3245}

References ast_asprintf, ast_free, ast_log, ast_strlen_zero(), LOG_ERROR, name, and NULL.

Referenced by ast_el_read_default_histfile(), and ast_el_write_default_histfile().

◆ publish_fully_booted()

static void publish_fully_booted ( void  )
static

Definition at line 989 of file asterisk.c.

990{
991 struct ast_json *json_object;
992 int uptime = 0;
993 int lastreloaded = 0;
994 struct timeval tmp;
995 struct timeval curtime = ast_tvnow();
996
997 if (ast_startuptime.tv_sec) {
998 tmp = ast_tvsub(curtime, ast_startuptime);
999 uptime = (int) tmp.tv_sec;
1000 }
1001
1002 if (ast_lastreloadtime.tv_sec) {
1003 tmp = ast_tvsub(curtime, ast_lastreloadtime);
1004 lastreloaded = (int) tmp.tv_sec;
1005 }
1006
1007 json_object = ast_json_pack("{s: s, s: i, s: i}",
1008 "Status", "Fully Booted",
1009 "Uptime", uptime,
1010 "LastReload", lastreloaded);
1011 ast_manager_publish_event("FullyBooted", EVENT_FLAG_SYSTEM, json_object);
1012 ast_json_unref(json_object);
1013}
void ast_manager_publish_event(const char *type, int class_type, struct ast_json *obj)
Publish an event to AMI.
Definition manager.c:637
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition json.c:612
#define EVENT_FLAG_SYSTEM
Definition manager.h:75
Abstract JSON element (object, array, string, int, ...).
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
Definition extconf.c:2293

References ast_json_pack(), ast_json_unref(), ast_lastreloadtime, ast_manager_publish_event(), ast_startuptime, ast_tvnow(), ast_tvsub(), and EVENT_FLAG_SYSTEM.

Referenced by asterisk_daemon().

◆ quit_handler()

static void quit_handler ( int  num,
shutdown_nice_t  niceness,
int  restart 
)
static

Definition at line 1923 of file asterisk.c.

1924{
1925 if (can_safely_quit(niceness, restart)) {
1926 really_quit(num, niceness, restart);
1927 /* No one gets here. */
1928 }
1929 /* It wasn't our time. */
1930}
static int can_safely_quit(shutdown_nice_t niceness, int restart)
Definition asterisk.c:1975
static void really_quit(int num, shutdown_nice_t niceness, int restart)
Definition asterisk.c:2058

References can_safely_quit(), and really_quit().

Referenced by ast_el_read_char(), asterisk_daemon(), handle_restart_gracefully(), handle_restart_now(), handle_restart_when_convenient(), handle_stop_gracefully(), handle_stop_now(), handle_stop_when_convenient(), main(), monitor_sig_flags(), and remoteconsolehandler().

◆ rdtsc()

static __inline uint64_t rdtsc ( void  )
static

Definition at line 878 of file asterisk.c.

879{
880 return 0;
881}

Referenced by ast_mark().

◆ read_credentials()

static int read_credentials ( int  fd,
char *  buffer,
size_t  size,
struct console *  con 
)
static

read() function supporting the reception of user credentials.

Parameters
fdSocket file descriptor.
bufferReceive buffer.
size'buffer' size.
conConsole structure to set received credentials
Return values
-1on error
thenumber of bytes received on success.

Definition at line 1390 of file asterisk.c.

1391{
1392#if defined(SO_PEERCRED)
1393#ifdef HAVE_STRUCT_SOCKPEERCRED_UID
1394#define HAVE_STRUCT_UCRED_UID
1395 struct sockpeercred cred;
1396#else
1397 struct ucred cred;
1398#endif
1399 socklen_t len = sizeof(cred);
1400#endif
1401#if defined(HAVE_GETPEEREID)
1402 uid_t uid;
1403 gid_t gid;
1404#else
1405 int uid, gid;
1406#endif
1407 int result;
1408
1409 result = read(fd, buffer, size);
1410 if (result < 0) {
1411 return result;
1412 }
1413
1414#if defined(SO_PEERCRED) && (defined(HAVE_STRUCT_UCRED_UID) || defined(HAVE_STRUCT_UCRED_CR_UID))
1415 if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len)) {
1416 return result;
1417 }
1418#if defined(HAVE_STRUCT_UCRED_UID)
1419 uid = cred.uid;
1420 gid = cred.gid;
1421#else /* defined(HAVE_STRUCT_UCRED_CR_UID) */
1422 uid = cred.cr_uid;
1423 gid = cred.cr_gid;
1424#endif /* defined(HAVE_STRUCT_UCRED_UID) */
1425
1426#elif defined(HAVE_GETPEEREID)
1427 if (getpeereid(fd, &uid, &gid)) {
1428 return result;
1429 }
1430#else
1431 return result;
1432#endif
1433 con->uid = uid;
1434 con->gid = gid;
1435
1436 return result;
1437}
static PGresult * result
Definition cel_pgsql.c:84

References console::gid, len(), result, and console::uid.

Referenced by netconsole().

◆ read_pjproject_startup_options()

static void read_pjproject_startup_options ( void  )
static

Definition at line 3450 of file asterisk.c.

3451{
3452 struct ast_config *cfg;
3453 struct ast_variable *v;
3454 struct ast_flags config_flags = { CONFIG_FLAG_NOCACHE | CONFIG_FLAG_NOREALTIME };
3455
3458
3459 cfg = ast_config_load2("pjproject.conf", "" /* core, can't reload */, config_flags);
3460 if (!cfg
3462 || cfg == CONFIG_STATUS_FILEINVALID) {
3463 /* We'll have to use defaults */
3464 return;
3465 }
3466
3467 for (v = ast_variable_browse(cfg, "startup"); v; v = v->next) {
3468 if (!strcasecmp(v->name, "log_level")) {
3469 if (sscanf(v->value, "%30d", &ast_option_pjproject_log_level) != 1) {
3471 } else if (ast_option_pjproject_log_level < 0) {
3475 }
3476 } else if (!strcasecmp(v->name, "cache_pools")) {
3478 }
3479 }
3480
3481 ast_config_destroy(cfg);
3482}
int ast_option_pjproject_log_level
Definition options.c:75
int ast_option_pjproject_cache_pools
Definition options.c:76
@ CONFIG_FLAG_NOCACHE
@ CONFIG_FLAG_NOREALTIME
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
#define CONFIG_STATUS_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
Definition extconf.c:1287
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition extconf.c:1213
#define MAX_PJ_LOG_MAX_LEVEL
Definition options.h:151
#define DEFAULT_PJPROJECT_CACHE_POOLS
Definition options.h:188
#define DEFAULT_PJ_LOG_MAX_LEVEL
Definition options.h:159
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
Definition utils.c:2250
Structure used to handle boolean flags.
Definition utils.h:220
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next

References ast_config_destroy(), ast_config_load2(), ast_false(), ast_option_pjproject_cache_pools, ast_option_pjproject_log_level, ast_variable_browse(), CONFIG_FLAG_NOCACHE, CONFIG_FLAG_NOREALTIME, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, DEFAULT_PJ_LOG_MAX_LEVEL, DEFAULT_PJPROJECT_CACHE_POOLS, MAX_PJ_LOG_MAX_LEVEL, ast_variable::name, ast_variable::next, and ast_variable::value.

Referenced by asterisk_daemon().

◆ really_quit()

static void really_quit ( int  num,
shutdown_nice_t  niceness,
int  restart 
)
static

Called when exiting is certain.

Definition at line 2058 of file asterisk.c.

2059{
2060 int active_channels;
2061 struct ast_json *json_object = NULL;
2062 int run_cleanups = niceness >= SHUTDOWN_NICE;
2063
2064 if (run_cleanups && modules_shutdown()) {
2065 ast_verb(0, "Some modules could not be unloaded, switching to fast shutdown\n");
2066 run_cleanups = 0;
2067 }
2068
2069 if (!restart && !ast_opt_remote) {
2070 ast_sd_notify("STOPPING=1");
2071 }
2074 if (consolethread == AST_PTHREADT_NULL || consolethread == pthread_self()) {
2075 /* Only end if we are the consolethread, otherwise there's a race with that thread. */
2076 if (el != NULL) {
2077 el_end(el);
2078 }
2079 if (el_hist != NULL) {
2080 history_end(el_hist);
2081 }
2082 } else if (!restart) {
2083 sig_flags.need_el_end = 1;
2084 pthread_kill(consolethread, SIGURG);
2085 }
2086 }
2088 /* Don't publish messages if we're a remote console - we won't have all of the Stasis
2089 * topics or message types
2090 */
2091 if (!ast_opt_remote) {
2092 json_object = ast_json_pack("{s: s, s: s}",
2093 "Shutdown", active_channels ? "Uncleanly" : "Cleanly",
2094 "Restart", restart ? "True" : "False");
2095 ast_manager_publish_event("Shutdown", EVENT_FLAG_SYSTEM, json_object);
2096 ast_json_unref(json_object);
2097 json_object = NULL;
2098 }
2099 ast_verb(0, "Asterisk %s ending (%d).\n",
2100 active_channels ? "uncleanly" : "cleanly", num);
2101
2102 ast_verb(0, "Executing last minute cleanups\n");
2103 ast_run_atexits(run_cleanups);
2104
2105 ast_debug(1, "Asterisk ending (%d).\n", num);
2106 if (ast_socket > -1) {
2107 pthread_cancel(lthread);
2108 close(ast_socket);
2109 ast_socket = -1;
2110 if (!ast_socket_is_sd) {
2111 unlink(ast_config_AST_SOCKET);
2112 }
2113 pthread_kill(lthread, SIGURG);
2114 pthread_join(lthread, NULL);
2115 }
2116 if (ast_consock > -1)
2117 close(ast_consock);
2118 if (!ast_opt_remote)
2119 unlink(ast_config_AST_PID);
2121 printf("%s", term_quit());
2122 if (restart) {
2123 int i;
2124 ast_verb(0, "Preparing for Asterisk restart...\n");
2125 /* Mark all FD's for closing on exec */
2126 for (i = 3; i < 32768; i++) {
2127 fcntl(i, F_SETFD, FD_CLOEXEC);
2128 }
2129 ast_verb(0, "Asterisk is now restarting...\n");
2130 restartnow = 1;
2131
2132 /* close logger */
2133 close_logger();
2135
2136 /* If there is a consolethread running send it a SIGHUP
2137 so it can execvp, otherwise we can do it ourselves */
2138 if ((consolethread != AST_PTHREADT_NULL) && (consolethread != pthread_self())) {
2139 pthread_kill(consolethread, SIGHUP);
2140 /* Give the signal handler some time to complete */
2141 sleep(2);
2142 } else
2143 execvp(_argv[0], _argv);
2144
2145 } else {
2146 /* close logger */
2147 close_logger();
2149 }
2150
2151 exit(0);
2152}
int modules_shutdown(void)
Definition loader.c:1181
void close_logger(void)
Definition logger.c:2234
void clean_time_zones(void)
Definition localtime.c:1590
void ast_alertpipe_close(int alert_pipe[2])
Close an alert pipe.
Definition alertpipe.c:79
static void ast_el_write_default_histfile(void)
Definition asterisk.c:3252
static int active_channels(struct ast_channelstorage_instance *driver, int rdlock)
returns number of active/allocated channels

References _argv, active_channels(), ast_active_channels(), ast_alertpipe_close(), ast_config_AST_PID, ast_config_AST_SOCKET, ast_consock, ast_debug, ast_el_write_default_histfile(), ast_json_pack(), ast_json_unref(), ast_manager_publish_event(), ast_opt_console, ast_opt_exec, ast_opt_remote, AST_PTHREADT_NULL, ast_run_atexits(), ast_sd_notify(), ast_socket, ast_socket_is_sd, ast_verb, clean_time_zones(), close_logger(), consolethread, el, el_hist, EVENT_FLAG_SYSTEM, lthread, modules_shutdown(), NULL, restartnow, SHUTDOWN_NICE, sig_alert_pipe, sig_flags, and term_quit().

Referenced by quit_handler().

◆ register_atexit()

static int register_atexit ( void(*)(void)  func,
int  is_cleanup 
)
static

Definition at line 1043 of file asterisk.c.

1044{
1045 struct ast_atexit *ae;
1046
1047 ae = ast_calloc(1, sizeof(*ae));
1048 if (!ae) {
1049 return -1;
1050 }
1051 ae->func = func;
1052 ae->is_cleanup = is_cleanup;
1053
1058
1059 return 0;
1060}
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.

References __ast_unregister_atexit(), ast_calloc, AST_LIST_INSERT_HEAD, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_atexit::func, ast_atexit::is_cleanup, and ast_atexit::list.

Referenced by ast_register_atexit(), and ast_register_cleanup().

◆ remoteconsolehandler()

static int remoteconsolehandler ( const char *  s)
static

Definition at line 2328 of file asterisk.c.

2329{
2330 int ret = 0;
2331
2332 /* Called when readline data is available */
2333 if (!ast_all_zeros(s))
2335
2336 while (isspace(*s)) {
2337 s++;
2338 }
2339
2340 /* The real handler for bang */
2341 if (s[0] == '!') {
2343 printf("Shell access is disabled on remote consoles\n");
2344 return 1;
2345 }
2346 if (s[1])
2347 ast_safe_system(s+1);
2348 else
2349 ast_safe_system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh");
2350 ret = 1;
2351 } else if ((strncasecmp(s, "quit", 4) == 0 || strncasecmp(s, "exit", 4) == 0) &&
2352 (s[4] == '\0' || isspace(s[4]))) {
2354 ret = 1;
2355 }
2356
2357 return ret;
2358}

References ast_all_zeros(), ast_el_add_history(), ast_option_disable_remote_console_shell, ast_safe_system(), quit_handler(), and SHUTDOWN_FAST.

Referenced by ast_remotecontrol().

◆ run_startup_commands()

static void run_startup_commands ( enum startup_commands_phase  phase)
static

Definition at line 3560 of file asterisk.c.

3561{
3562 int fd;
3563 struct ast_config *cfg;
3564 struct ast_flags cfg_flags = { 0 };
3565 struct ast_variable *v;
3566
3567 if (!(cfg = ast_config_load2("cli.conf", "" /* core, can't reload */, cfg_flags)))
3568 return;
3570 return;
3571 }
3572
3573 fd = open("/dev/null", O_RDWR);
3574 if (fd < 0) {
3575 ast_config_destroy(cfg);
3576 return;
3577 }
3578
3579 for (v = ast_variable_browse(cfg, "startup_commands"); v; v = v->next) {
3582 ast_cli_command(fd, v->name);
3583 }
3584 }
3585
3586 close(fd);
3587 ast_config_destroy(cfg);
3588}
static const char * startup_commands_phase_str[]
Definition asterisk.c:3553
#define CONFIG_STATUS_FILEMISSING
static force_inline char * ast_str_to_lower(char *str)
Convert a string to all lower-case.
Definition strings.h:1321
int ast_in_delimited_string(const char *needle, const char *haystack, char delim)
Check if there is an exact match for 'needle' between delimiters in 'haystack'.
Definition strings.c:466

References ast_cli_command, ast_config_destroy(), ast_config_load2(), ast_in_delimited_string(), ast_str_to_lower(), ast_strdupa, ast_variable_browse(), CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEMISSING, CONFIG_STATUS_FILEUNCHANGED, ast_variable::name, ast_variable::next, startup_commands_phase_str, ast_variable::value, and value.

Referenced by asterisk_daemon().

◆ safe_exec_prep()

static pid_t safe_exec_prep ( int  dualfork)
static

fork and perform other preparations for spawning applications

Definition at line 1147 of file asterisk.c.

1148{
1149 pid_t pid;
1150
1151#if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
1153
1154#ifdef HAVE_WORKING_FORK
1155 pid = fork();
1156#else
1157 pid = vfork();
1158#endif
1159
1160 if (pid == 0) {
1161#ifdef HAVE_CAP
1162 cap_set_proc(child_cap);
1163#endif
1164#ifdef HAVE_WORKING_FORK
1167 }
1168 /* Close file descriptors and launch system command */
1169 ast_close_fds_above_n(STDERR_FILENO);
1170#endif
1171 if (dualfork) {
1172#ifdef HAVE_WORKING_FORK
1173 pid = fork();
1174#else
1175 pid = vfork();
1176#endif
1177 if (pid < 0) {
1178 /* Second fork failed. */
1179 /* No logger available. */
1180 _exit(1);
1181 }
1182
1183 if (pid > 0) {
1184 /* This is the first fork, exit so the reaper finishes right away. */
1185 _exit(0);
1186 }
1187
1188 /* This is the second fork. The first fork will exit immediately so
1189 * Asterisk doesn't have to wait for completion.
1190 * ast_safe_system("cmd &") would run in the background, but the '&'
1191 * cannot be added with ast_safe_execvp, so we have to double fork.
1192 */
1193 }
1194 }
1195
1196 if (pid < 0) {
1197 ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(errno));
1198 }
1199#else
1200 ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(ENOTSUP));
1201 pid = -1;
1202#endif
1203
1204 return pid;
1205}
void ast_replace_sigchld(void)
Replace the SIGCHLD handler.
Definition asterisk.c:1112

References ast_close_fds_above_n(), ast_log, ast_opt_high_priority, ast_replace_sigchld(), ast_set_priority(), errno, and LOG_WARNING.

Referenced by ast_safe_execvp(), and ast_safe_system().

◆ safe_exec_wait()

static int safe_exec_wait ( pid_t  pid)
static

wait for spawned application to complete and unreplace sigchld

Definition at line 1208 of file asterisk.c.

1209{
1210 int res = -1;
1211
1212#if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
1213 if (pid > 0) {
1214 for (;;) {
1215 int status;
1216
1217 res = waitpid(pid, &status, 0);
1218 if (res > -1) {
1219 res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
1220 break;
1221 }
1222 if (errno != EINTR) {
1223 break;
1224 }
1225 }
1226 }
1227
1229#endif
1230
1231 return res;
1232}
void ast_unreplace_sigchld(void)
Restore the SIGCHLD handler.
Definition asterisk.c:1127
#define WEXITSTATUS(status)
#define WIFEXITED(status)

References ast_unreplace_sigchld(), errno, status, WEXITSTATUS, and WIFEXITED.

Referenced by ast_safe_execvp(), and ast_safe_system().

◆ send_rasterisk_connect_commands()

static void send_rasterisk_connect_commands ( void  )
static

Definition at line 2660 of file asterisk.c.

2661{
2662 char buf[80];
2663
2664 /*
2665 * Tell the server asterisk instance about the verbose level
2666 * initially desired.
2667 */
2668 if (option_verbose) {
2669 snprintf(buf, sizeof(buf), "core set verbose atleast %d silent", option_verbose);
2671 }
2672
2673 if (option_debug) {
2674 snprintf(buf, sizeof(buf), "core set debug atleast %d", option_debug);
2676 }
2677
2678 /* Leave verbose filtering to the server. */
2679 option_verbose = INT_MAX;
2680
2681 if (!ast_opt_mute) {
2682 fdsend(ast_consock, "logger mute silent");
2683 } else {
2684 printf("log and verbose output currently muted ('logger mute' to unmute)\n");
2685 }
2686}
#define ast_opt_mute
Definition options.h:137

References ast_consock, ast_opt_mute, buf, fdsend(), option_debug, and option_verbose.

Referenced by ast_el_read_char(), and ast_remotecontrol().

◆ set_header()

static void set_header ( char *  outbuf,
int  maxout,
char  level 
)
static

Definition at line 2169 of file asterisk.c.

2170{
2171 const char *cmp;
2172 char date[40];
2173
2174 switch (level) {
2175 case 0: cmp = NULL;
2176 break;
2177 case 1: cmp = VERBOSE_PREFIX_1;
2178 break;
2179 case 2: cmp = VERBOSE_PREFIX_2;
2180 break;
2181 case 3: cmp = VERBOSE_PREFIX_3;
2182 break;
2183 case 4: cmp = VERBOSE_PREFIX_4;
2184 break;
2185 case 5: cmp = VERBOSE_PREFIX_5;
2186 break;
2187 case 6: cmp = VERBOSE_PREFIX_6;
2188 break;
2189 case 7: cmp = VERBOSE_PREFIX_7;
2190 break;
2191 case 8: cmp = VERBOSE_PREFIX_8;
2192 break;
2193 case 9: cmp = VERBOSE_PREFIX_9;
2194 break;
2195 default: cmp = VERBOSE_PREFIX_10;
2196 break;
2197 }
2198
2199 if (ast_opt_timestamp) {
2200 struct ast_tm tm;
2201 struct timeval now = ast_tvnow();
2202 ast_localtime(&now, &tm, NULL);
2203 ast_strftime(date, sizeof(date), ast_logger_get_dateformat(), &tm);
2204 }
2205
2206 snprintf(outbuf, maxout, "%s%s%s%s%s%s",
2207 ast_opt_timestamp ? "[" : "",
2208 ast_opt_timestamp ? date : "",
2209 ast_opt_timestamp ? "] " : "",
2210 cmp ? ast_term_color(COLOR_GRAY, 0) : "",
2211 cmp ? cmp : "",
2212 cmp ? ast_term_reset() : "");
2213}
#define VERBOSE_PREFIX_3
#define VERBOSE_PREFIX_10
#define VERBOSE_PREFIX_6
#define VERBOSE_PREFIX_2
#define VERBOSE_PREFIX_8
#define VERBOSE_PREFIX_7
#define VERBOSE_PREFIX_4
#define VERBOSE_PREFIX_5
#define VERBOSE_PREFIX_1
#define VERBOSE_PREFIX_9
const char * ast_logger_get_dateformat(void)
Get the logger configured date format.
Definition logger.c:2994
#define ast_opt_timestamp
Definition options.h:132
#define COLOR_GRAY
Definition term.h:51
const char * ast_term_reset(void)
Returns the terminal reset code.
Definition term.c:357
const char * ast_term_color(int fgcolor, int bgcolor)
Return a color sequence string.
Definition term.c:341

References ast_localtime(), ast_logger_get_dateformat(), ast_opt_timestamp, ast_strftime(), ast_term_color(), ast_term_reset(), ast_tvnow(), COLOR_GRAY, NULL, VERBOSE_PREFIX_1, VERBOSE_PREFIX_10, VERBOSE_PREFIX_2, VERBOSE_PREFIX_3, VERBOSE_PREFIX_4, VERBOSE_PREFIX_5, VERBOSE_PREFIX_6, VERBOSE_PREFIX_7, VERBOSE_PREFIX_8, and VERBOSE_PREFIX_9.

Referenced by console_print().

◆ set_icon()

static void set_icon ( char *  text)
static

Definition at line 1783 of file asterisk.c.

1784{
1785 if (getenv("TERM") && strstr(getenv("TERM"), "xterm"))
1786 fprintf(stdout, "\033]1;%s\007", text);
1787}

References text.

Referenced by asterisk_daemon().

◆ set_priority_all()

static int set_priority_all ( int  pri)
static

Set priority on all known threads.

Definition at line 1810 of file asterisk.c.

1811{
1812#if !defined(__linux__)
1813 /* The non-linux version updates the entire process prio. */
1814 return ast_set_priority(pri);
1815#elif defined(LOW_MEMORY)
1816 ast_log(LOG_WARNING, "Unable to enumerate all threads to update priority\n");
1817 return ast_set_priority(pri);
1818#else
1819 struct thread_list_t *cur;
1820 struct sched_param sched;
1821 char const *policy_str;
1822 int policy;
1823
1824 memset(&sched, 0, sizeof(sched));
1825 if (pri) {
1826 policy = SCHED_RR;
1827 policy_str = "realtime";
1828 sched.sched_priority = 10;
1829 } else {
1830 policy = SCHED_OTHER;
1831 policy_str = "regular";
1832 sched.sched_priority = 0;
1833 }
1834 if (sched_setscheduler(getpid(), policy, &sched)) {
1835 ast_log(LOG_WARNING, "Unable to set %s thread priority on main thread\n", policy_str);
1836 return -1;
1837 }
1838 ast_verb(1, "Setting %s thread priority on all threads\n", policy_str);
1840 AST_RWLIST_TRAVERSE(&thread_list, cur, list) {
1841 /* Don't care about the return value. It should work. */
1842 sched_setscheduler(cur->lwp, policy, &sched);
1843 }
1845 return 0;
1846#endif
1847}

References ast_log, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_set_priority(), ast_verb, LOG_WARNING, thread_list_t::lwp, and sched_setscheduler.

Referenced by canary_thread().

◆ set_title()

static void set_title ( char *  text)
static

Set an X-term or screen title.

Definition at line 1777 of file asterisk.c.

1778{
1779 if (getenv("TERM") && strstr(getenv("TERM"), "xterm"))
1780 fprintf(stdout, "\033]2;%s\007", text);
1781}

References text.

Referenced by asterisk_daemon().

◆ show_cli_help()

static int show_cli_help ( void  )
static

Definition at line 3411 of file asterisk.c.

3412{
3413 printf("Asterisk %s, " COPYRIGHT_TAG "\n", ast_get_version());
3414 printf("Usage: asterisk [OPTIONS]\n");
3415 printf("Valid Options:\n");
3416 printf(" -V Display version number and exit\n");
3417 printf(" -C <configfile> Use an alternate configuration file\n");
3418 printf(" -G <group> Run as a group other than the caller\n");
3419 printf(" -U <user> Run as a user other than the caller\n");
3420 printf(" -c Provide console CLI\n");
3421 printf(" -d Increase debugging (multiple d's = more debugging)\n");
3422#if HAVE_WORKING_FORK
3423 printf(" -f Do not fork\n");
3424 printf(" -F Always fork\n");
3425#endif
3426 printf(" -g Dump core in case of a crash\n");
3427 printf(" -h This help screen\n");
3428 printf(" -i Initialize crypto keys at startup\n");
3429 printf(" -L <load> Limit the maximum load average before rejecting new calls\n");
3430 printf(" -M <value> Limit the maximum number of calls to the specified value\n");
3431 printf(" -m Mute debugging and console output on the console\n");
3432 printf(" -n Disable console colorization. Can be used only at startup.\n");
3433 printf(" -p Run as pseudo-realtime thread\n");
3434 printf(" -q Quiet mode (suppress output)\n");
3435 printf(" -r Connect to Asterisk on this machine\n");
3436 printf(" -R Same as -r, except attempt to reconnect if disconnected\n");
3437 printf(" -s <socket> Connect to Asterisk via socket <socket> (only valid with -r)\n");
3438 printf(" -t Record soundfiles in /var/tmp and move them where they\n");
3439 printf(" belong after they are done\n");
3440 printf(" -T Display the time in [Mmm dd hh:mm:ss] format for each line\n");
3441 printf(" of output to the CLI. Cannot be used with remote console mode.\n\n");
3442 printf(" -v Increase verbosity (multiple v's = more verbose)\n");
3443 printf(" -x <cmd> Execute command <cmd> (implies -r)\n");
3444 printf(" -X Enable use of #exec in asterisk.conf\n");
3445 printf(" -W Adjust terminal colors to compensate for a light background\n");
3446 printf("\n");
3447 return 0;
3448}
#define COPYRIGHT_TAG
Definition asterisk.c:308

References ast_get_version(), and COPYRIGHT_TAG.

Referenced by main().

◆ show_license()

static char * show_license ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2606 of file asterisk.c.

2607{
2608 switch (cmd) {
2609 case CLI_INIT:
2610 e->command = "core show license";
2611 e->usage =
2612 "Usage: core show license\n"
2613 " Shows the license(s) for this copy of Asterisk.\n";
2614 return NULL;
2615 case CLI_GENERATE:
2616 return NULL;
2617 }
2618
2619 ast_cli(a->fd, "%s", license_lines);
2620
2621 return CLI_SUCCESS;
2622}
static const char license_lines[]
Definition asterisk.c:2587

References a, ast_cli(), CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, license_lines, NULL, and ast_cli_entry::usage.

◆ show_version()

static int show_version ( void  )
static

Definition at line 3405 of file asterisk.c.

3406{
3407 printf("Asterisk %s\n", ast_get_version());
3408 return 0;
3409}

References ast_get_version().

Referenced by main().

◆ show_warranty()

static char * show_warranty ( struct ast_cli_entry *  e,
int  cmd,
struct ast_cli_args *  a 
)
static

Definition at line 2569 of file asterisk.c.

2570{
2571 switch (cmd) {
2572 case CLI_INIT:
2573 e->command = "core show warranty";
2574 e->usage =
2575 "Usage: core show warranty\n"
2576 " Shows the warranty (if any) for this copy of Asterisk.\n";
2577 return NULL;
2578 case CLI_GENERATE:
2579 return NULL;
2580 }
2581
2582 ast_cli(a->fd, "%s", warranty_lines);
2583
2584 return CLI_SUCCESS;
2585}
static const char warranty_lines[]
Definition asterisk.c:2544

References a, ast_cli(), CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, NULL, ast_cli_entry::usage, and warranty_lines.

◆ wait_for_channels_to_die()

static int wait_for_channels_to_die ( shutdown_nice_t  niceness,
int  seconds 
)
static

Definition at line 1945 of file asterisk.c.

1946{
1947 time_t start;
1948 time_t now;
1949 int waited = 0;
1950
1951 time(&start);
1952 for (;;) {
1953 if (!ast_undestroyed_channels() || shuttingdown != niceness) {
1954 break;
1955 }
1956 if (seconds < 0) {
1957 /* No timeout so just poll every second */
1958 sleep(1);
1959 } else {
1960 time(&now);
1961
1962 /* Wait up to the given seconds for all channels to go away */
1963 if (seconds < (now - start)) {
1964 break;
1965 }
1966
1967 /* Sleep 1/10 of a second */
1968 usleep(100000);
1969 }
1970 waited = 1;
1971 }
1972 return waited;
1973}
int ast_undestroyed_channels(void)
Definition channel.c:505

References ast_undestroyed_channels(), and shuttingdown.

Referenced by can_safely_quit().

Variable Documentation

◆ _argv

char* _argv[256]
static

Definition at line 362 of file asterisk.c.

Referenced by _hup_handler(), main(), and really_quit().

◆ ast_consock

int ast_consock = -1
static

UNIX Socket for controlling another asterisk

Definition at line 322 of file asterisk.c.

Referenced by ast_el_read_char(), ast_remotecontrol(), ast_tryconnect(), cli_complete(), really_quit(), and send_rasterisk_connect_commands().

◆ ast_lastreloadtime

struct timeval ast_lastreloadtime

◆ ast_mainpid

pid_t ast_mainpid

Definition at line 323 of file asterisk.c.

Referenced by asterisk_daemon(), main(), netconsole(), safe_append(), and scan_service().

◆ ast_socket

int ast_socket = -1
static

UNIX Socket for allowing remote control

Definition at line 320 of file asterisk.c.

Referenced by ast_makesocket(), listener(), and really_quit().

◆ ast_socket_is_sd

int ast_socket_is_sd = 0
static

Is socket activation responsible for ast_socket?

Definition at line 321 of file asterisk.c.

Referenced by ast_makesocket(), main(), and really_quit().

◆ ast_startuptime

struct timeval ast_startuptime

◆ atexits

◆ canary_filename

char canary_filename[128]
static

Definition at line 395 of file asterisk.c.

Referenced by asterisk_daemon(), and canary_thread().

◆ canary_pid

int canary_pid = 0
static

Definition at line 394 of file asterisk.c.

Referenced by asterisk_daemon(), and canary_exit().

◆ child_handler

struct sigaction child_handler
static
Initial value:
= {
.sa_handler = _child_handler,
.sa_flags = SA_RESTART,
}
static void _child_handler(int sig)
Definition asterisk.c:1756

Definition at line 1771 of file asterisk.c.

1771 {
1772 .sa_handler = _child_handler,
1773 .sa_flags = SA_RESTART,
1774};

Referenced by main().

◆ cli_asterisk

struct ast_cli_entry cli_asterisk[]
static

Definition at line 2643 of file asterisk.c.

2643 {
2644 AST_CLI_DEFINE(handle_abort_shutdown, "Cancel a running shutdown"),
2645 AST_CLI_DEFINE(show_warranty, "Show the warranty (if any) for this copy of Asterisk"),
2646 AST_CLI_DEFINE(show_license, "Show the license(s) for this copy of Asterisk"),
2647 AST_CLI_DEFINE(handle_version, "Display version info"),
2648 AST_CLI_DEFINE(handle_bang, "Execute a shell command"),
2649#if !defined(LOW_MEMORY)
2650 AST_CLI_DEFINE(handle_show_threads, "Show running threads"),
2651#if defined(HAVE_SYSINFO) || defined(HAVE_SYSCTL)
2652 AST_CLI_DEFINE(handle_show_sysinfo, "Show System Information"),
2653#endif
2654 AST_CLI_DEFINE(handle_show_profile, "Display profiling info"),
2655 AST_CLI_DEFINE(handle_show_settings, "Show some core settings"),
2656 AST_CLI_DEFINE(handle_clear_profile, "Clear profiling info"),
2657#endif /* ! LOW_MEMORY */
2658};
static char * show_license(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2606
static char * handle_show_threads(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:615
static char * handle_version(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2360
static char * handle_show_sysinfo(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Give an overview of system statistics.
Definition asterisk.c:681
static char * handle_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Give an overview of core settings.
Definition asterisk.c:475
static char * handle_bang(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2529
static char * handle_abort_shutdown(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2506
static char * show_warranty(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2569
static char * handle_clear_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:954
static char * handle_show_profile(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:919
#define AST_CLI_DEFINE(fn, txt,...)
Definition cli.h:197

Referenced by asterisk_daemon(), and main_atexit().

◆ cli_asterisk_shutdown

struct ast_cli_entry cli_asterisk_shutdown[]
static

Shutdown Asterisk CLI commands.

Note
These CLI commands cannot be unregistered at shutdown because one of them is likely the reason for the shutdown. The CLI generates a warning if a command is in-use when it is unregistered.

Definition at line 2634 of file asterisk.c.

2634 {
2635 AST_CLI_DEFINE(handle_stop_now, "Shut down Asterisk immediately"),
2636 AST_CLI_DEFINE(handle_stop_gracefully, "Gracefully shut down Asterisk"),
2637 AST_CLI_DEFINE(handle_stop_when_convenient, "Shut down Asterisk at empty call volume"),
2638 AST_CLI_DEFINE(handle_restart_now, "Restart Asterisk immediately"),
2639 AST_CLI_DEFINE(handle_restart_gracefully, "Restart Asterisk gracefully"),
2640 AST_CLI_DEFINE(handle_restart_when_convenient, "Restart Asterisk at empty call volume"),
2641};
static char * handle_stop_gracefully(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2401
static char * handle_stop_when_convenient(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2422
static char * handle_stop_now(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2381
static char * handle_restart_now(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2443
static char * handle_restart_when_convenient(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2485
static char * handle_restart_gracefully(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition asterisk.c:2464

Referenced by asterisk_daemon().

◆ consoles

struct console consoles[AST_MAX_CONNECTS]

◆ consolethread

pthread_t consolethread = AST_PTHREADT_NULL
static

◆ el

EditLine* el
static

◆ el_hist

History* el_hist
static

◆ hup_handler

struct sigaction hup_handler
static
Initial value:
= {
.sa_handler = _hup_handler,
.sa_flags = SA_RESTART,
}
static void _hup_handler(int num)
Definition asterisk.c:1732

Definition at line 1751 of file asterisk.c.

1751 {
1752 .sa_handler = _hup_handler,
1753 .sa_flags = SA_RESTART,
1754};

Referenced by asterisk_daemon().

◆ ignore_sig_handler

struct sigaction ignore_sig_handler
static
Initial value:
= {
.sa_handler = SIG_IGN,
}

Definition at line 1101 of file asterisk.c.

1101 {
1102 .sa_handler = SIG_IGN,
1103};

Referenced by asterisk_daemon().

◆ license_lines

const char license_lines[]
static

Definition at line 2587 of file asterisk.c.

2587 {
2588 "\n"
2589 "This program is free software; you can redistribute it and/or modify\n"
2590 "it under the terms of the GNU General Public License version 2 as\n"
2591 "published by the Free Software Foundation.\n"
2592 "\n"
2593 "This program also contains components licensed under other licenses.\n"
2594 "They include:\n"
2595 "\n"
2596 "This program is distributed in the hope that it will be useful,\n"
2597 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
2598 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
2599 "GNU General Public License for more details.\n"
2600 "\n"
2601 "You should have received a copy of the GNU General Public License\n"
2602 "along with this program; if not, write to the Free Software\n"
2603 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
2604};

Referenced by show_license().

◆ lthread

pthread_t lthread
static

Definition at line 1378 of file asterisk.c.

Referenced by ast_makesocket(), and really_quit().

◆ mon_sig_flags

pthread_t mon_sig_flags
static

Definition at line 393 of file asterisk.c.

Referenced by asterisk_daemon().

◆ multi_thread_safe

int multi_thread_safe
static

Definition at line 396 of file asterisk.c.

Referenced by ast_register_thread(), asterisk_daemon(), and main().

◆ need_el_end

unsigned int need_el_end

Definition at line 409 of file asterisk.c.

◆ need_quit

unsigned int need_quit

Definition at line 407 of file asterisk.c.

◆ need_quit_handler

unsigned int need_quit_handler

Definition at line 408 of file asterisk.c.

◆ need_reload

unsigned int need_reload

Definition at line 406 of file asterisk.c.

◆ null_sig_handler

struct sigaction null_sig_handler
static
Initial value:
= {
.sa_handler = _null_sig_handler,
.sa_flags = SA_RESTART,
}
static void _null_sig_handler(int sig)
NULL handler so we can collect the child exit status.
Definition asterisk.c:1092

Definition at line 1096 of file asterisk.c.

1096 {
1097 .sa_handler = _null_sig_handler,
1098 .sa_flags = SA_RESTART,
1099};

Referenced by ast_replace_sigchld().

◆ prof_data

struct profile_data* prof_data
static

◆ prompt

struct ast_str* prompt = NULL
static

◆ randompool

char randompool[256]
static

Definition at line 398 of file asterisk.c.

Referenced by asterisk_daemon().

◆ remotehostname

char* remotehostname
static

Definition at line 349 of file asterisk.c.

Referenced by ast_remotecontrol(), and cli_prompt().

◆ restartnow

int restartnow
static

Definition at line 391 of file asterisk.c.

Referenced by _hup_handler(), and really_quit().

◆ safe_system_level

unsigned int safe_system_level = 0
static

Keep track of how many threads are currently trying to wait*() on a child process.

Definition at line 1109 of file asterisk.c.

Referenced by ast_replace_sigchld(), and ast_unreplace_sigchld().

◆ safe_system_lock

ast_mutex_t safe_system_lock = AST_MUTEX_INIT_VALUE
static

◆ safe_system_prev_handler

struct sigaction safe_system_prev_handler
static

Definition at line 1110 of file asterisk.c.

Referenced by ast_replace_sigchld(), and ast_unreplace_sigchld().

◆ shutdown_pending

int shutdown_pending
static

Prevent new channel allocation for shutdown.

Definition at line 389 of file asterisk.c.

Referenced by ast_begin_shutdown(), ast_cancel_shutdown(), and ast_shutting_down().

◆ shuttingdown

shutdown_nice_t shuttingdown = NOT_SHUTTING_DOWN
static

◆ sig_alert_pipe

int sig_alert_pipe[2] = { -1, -1 }
static

Definition at line 404 of file asterisk.c.

404{ -1, -1 };

Referenced by __quit_handler(), _hup_handler(), asterisk_daemon(), monitor_sig_flags(), and really_quit().

◆ [struct]

struct { ... } sig_flags

◆ startup_commands_phase_str

const char* startup_commands_phase_str[]
static
Initial value:
= {
"pre-init",
"pre-module",
"fully-booted,yes,true,y,t,1,on"
}

Definition at line 3553 of file asterisk.c.

3553 {
3554 "pre-init",
3555 "pre-module",
3556 "fully-booted,yes,true,y,t,1,on"
3557};

Referenced by run_startup_commands().

◆ thread_list

◆ urg_handler

struct sigaction urg_handler
static
Initial value:
= {
.sa_handler = _urg_handler,
}
static void _urg_handler(int num)
Urgent handler.
Definition asterisk.c:1723

Definition at line 1728 of file asterisk.c.

1728 {
1729 .sa_handler = _urg_handler,
1730};

Referenced by asterisk_daemon().

◆ warranty_lines

const char warranty_lines[]
static

Definition at line 2544 of file asterisk.c.

2544 {
2545 "\n"
2546 " NO WARRANTY\n"
2547 "\n"
2548 "BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n"
2549 "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n"
2550 "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n"
2551 "PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n"
2552 "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n"
2553 "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n"
2554 "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n"
2555 "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n"
2556 "REPAIR OR CORRECTION.\n"
2557 "\n"
2558 "IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n"
2559 "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n"
2560 "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n"
2561 "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n"
2562 "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n"
2563 "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n"
2564 "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n"
2565 "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n"
2566 "POSSIBILITY OF SUCH DAMAGES.\n"
2567};

Referenced by show_warranty().