2005-11-19 20:07:43 +00:00
/*
* FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
* Copyright ( C ) 2005 / 2006 , Anthony Minessale II < anthmct @ yahoo . com >
*
* Version : MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 ( the " License " ) ; you may not use this file except in compliance with
* the License . You may obtain a copy of the License at
* http : //www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
* for the specific language governing rights and limitations under the
* License .
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
*
* The Initial Developer of the Original Code is
* Anthony Minessale II < anthmct @ yahoo . com >
* Portions created by the Initial Developer are Copyright ( C )
* the Initial Developer . All Rights Reserved .
*
* Contributor ( s ) :
*
* Anthony Minessale II < anthmct @ yahoo . com >
*
*
* switch . c - - Main
*
*/
2006-02-28 21:21:48 +00:00
2005-11-19 20:07:43 +00:00
# include <switch.h>
2006-05-15 15:00:10 +00:00
# include <switch_version.h>
2006-06-09 15:39:12 +00:00
# ifdef HAVE_MLOCKALL
# include <sys/mman.h>
# endif
2005-11-19 20:07:43 +00:00
2006-08-18 21:57:47 +00:00
# ifdef CRASH_PROT
# define __CP "ENABLED"
# else
# define __CP "DISABLED"
# endif
# define PIDFILE "freeswitch.pid"
# define LOGFILE "freeswitch.log"
2006-02-23 22:41:08 +00:00
static int RUNNING = 0 ;
2006-08-18 21:57:47 +00:00
static char * lfile = LOGFILE ;
static char * pfile = PIDFILE ;
# ifdef __ICC
# pragma warning (disable:167)
# endif
2006-02-23 22:41:08 +00:00
2006-02-26 03:13:01 +00:00
static int handle_SIGPIPE ( int sig )
{
2006-03-30 23:02:50 +00:00
if ( sig ) ;
2006-04-11 21:13:44 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Sig Pipe! \n " ) ;
2006-02-26 03:13:01 +00:00
return 0 ;
}
# ifdef TRAP_BUS
static int handle_SIGBUS ( int sig )
{
2006-04-11 21:13:44 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Sig BUS! \n " ) ;
2006-02-26 03:13:01 +00:00
return 0 ;
}
# endif
/* no ctl-c mofo */
static int handle_SIGINT ( int sig )
{
2006-03-30 23:02:50 +00:00
if ( sig ) ;
2006-02-26 03:13:01 +00:00
return 0 ;
}
2006-02-23 22:41:08 +00:00
static int handle_SIGHUP ( int sig )
{
2006-03-30 23:02:50 +00:00
if ( sig ) ;
2006-02-23 22:41:08 +00:00
RUNNING = 0 ;
return 0 ;
}
2006-08-18 21:57:47 +00:00
static void set_high_priority ( )
2006-01-20 15:05:05 +00:00
{
2006-02-26 03:13:01 +00:00
# ifdef WIN32
2006-02-28 05:55:22 +00:00
SetPriorityClass ( GetCurrentProcess ( ) , HIGH_PRIORITY_CLASS ) ;
2006-02-26 03:13:01 +00:00
# else
2006-06-30 21:45:29 +00:00
nice ( - 20 ) ;
2006-02-28 21:21:48 +00:00
# endif
2006-08-18 21:57:47 +00:00
}
2006-02-26 03:13:01 +00:00
2006-08-18 21:57:47 +00:00
static int freeswitch_shutdown ( )
{
switch_event_t * event ;
if ( switch_event_create ( & event , SWITCH_EVENT_SHUTDOWN ) = = SWITCH_STATUS_SUCCESS ) {
switch_event_add_header ( event , SWITCH_STACK_BOTTOM , " Event-Info " , " System Shutting Down " ) ;
switch_event_fire ( & event ) ;
2006-03-01 17:06:10 +00:00
}
2006-08-18 21:57:47 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " End existing sessions \n " ) ;
switch_core_session_hupall ( ) ;
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Clean up modules. \n " ) ;
switch_loadable_module_shutdown ( ) ;
switch_core_destroy ( ) ;
return 0 ;
}
2006-04-26 19:11:49 +00:00
2006-08-18 21:57:47 +00:00
static void freeswitch_runtime_loop ( int bg )
{
FILE * f ;
char path [ 256 ] = " " ;
snprintf ( path , sizeof ( path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . log_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
2006-04-26 19:11:49 +00:00
2006-08-18 21:57:47 +00:00
if ( bg ) {
bg = 0 ;
RUNNING = 1 ;
while ( RUNNING ) {
2006-04-26 19:11:49 +00:00
# ifdef WIN32
2006-08-18 21:57:47 +00:00
bg + + ;
if ( bg = = 100 ) {
if ( ( f = fopen ( path , " r " ) ) = = 0 ) {
break ;
}
fclose ( f ) ;
bg = 0 ;
2006-04-26 19:11:49 +00:00
}
# endif
2006-08-18 21:57:47 +00:00
switch_yield ( 10000 ) ;
}
} else {
/* wait for console input */
switch_console_loop ( ) ;
2006-03-01 17:06:10 +00:00
}
2006-08-18 21:57:47 +00:00
}
2006-03-01 17:06:10 +00:00
2006-08-18 21:57:47 +00:00
static int freeswitch_kill_background ( )
{
# ifdef WIN32
# else
char path [ 256 ] = " " ;
pid_t pid = 0 ;
snprintf ( path , sizeof ( path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . log_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
if ( ( f = fopen ( path , " r " ) ) = = 0 ) {
fprintf ( stderr , " Cannot open pid file %s. \n " , path ) ;
2006-03-01 17:06:10 +00:00
return 255 ;
}
2006-08-18 21:57:47 +00:00
fscanf ( f , " %d " , & pid ) ;
if ( pid > 0 ) {
fprintf ( stderr , " Killing %d \n " , ( int ) pid ) ;
kill ( pid , SIGTERM ) ;
}
2006-03-01 17:06:10 +00:00
2006-08-18 21:57:47 +00:00
fclose ( f ) ;
2006-03-30 23:02:50 +00:00
# endif
2006-08-18 21:57:47 +00:00
return 0 ;
}
static int freeswitch_init ( char * path , const char * * err )
{
switch_event_t * event ;
if ( switch_core_init ( path , err ) ! = SWITCH_STATUS_SUCCESS ) {
return 255 ;
}
2006-03-01 17:06:10 +00:00
2006-02-26 03:13:01 +00:00
/* set signal handlers */
2006-03-26 21:38:40 +00:00
signal ( SIGINT , ( void * ) handle_SIGINT ) ;
2006-02-26 03:13:01 +00:00
# ifdef SIGPIPE
2006-03-26 21:38:40 +00:00
signal ( SIGPIPE , ( void * ) handle_SIGPIPE ) ;
2006-02-26 03:13:01 +00:00
# endif
# ifdef TRAP_BUS
2006-03-26 21:38:40 +00:00
signal ( SIGBUS , ( void * ) handle_SIGBUS ) ;
2006-02-24 19:11:49 +00:00
# endif
2006-02-28 21:21:48 +00:00
2006-08-18 21:57:47 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Bringing up environment. \n " ) ;
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Loading Modules. \n " ) ;
if ( switch_loadable_module_init ( ) ! = SWITCH_STATUS_SUCCESS ) {
* err = " Cannot load modules " ;
2006-04-11 21:13:44 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Error: %s " , err ) ;
2006-08-18 21:57:47 +00:00
return 255 ;
2005-11-19 20:07:43 +00:00
}
2005-12-19 18:55:31 +00:00
if ( switch_event_create ( & event , SWITCH_EVENT_STARTUP ) = = SWITCH_STATUS_SUCCESS ) {
2005-12-23 21:09:36 +00:00
switch_event_add_header ( event , SWITCH_STACK_BOTTOM , " Event-Info " , " System Ready " ) ;
2005-12-19 18:55:31 +00:00
switch_event_fire ( & event ) ;
}
2006-08-11 23:27:08 +00:00
# ifdef HAVE_MLOCKALL
mlockall ( MCL_CURRENT | MCL_FUTURE ) ;
# endif
2006-08-18 21:57:47 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " freeswitch Version %s Started. Crash Protection [%s] Max Sessions[%u] \n \n " , SWITCH_VERSION_FULL , __CP , switch_core_session_limit ( 0 ) ) ;
return 0 ;
}
2006-08-11 23:27:08 +00:00
2006-08-18 21:57:47 +00:00
int main ( int argc , char * argv [ ] )
{
char path [ 256 ] = " " ;
char * ppath = NULL ;
const char * err = NULL ;
int bg = 0 ;
FILE * f ;
2006-05-05 13:35:33 +00:00
2006-08-18 21:57:47 +00:00
set_high_priority ( ) ;
switch_core_set_globals ( ) ;
if ( argv [ 1 ] & & ! strcmp ( argv [ 1 ] , " -stop " ) ) {
return freeswitch_kill_background ( ) ;
}
if ( argv [ 1 ] & & ! strcmp ( argv [ 1 ] , " -nc " ) ) {
bg + + ;
}
2005-11-19 20:07:43 +00:00
2006-02-24 19:11:49 +00:00
if ( bg ) {
2006-08-18 21:57:47 +00:00
ppath = lfile ;
signal ( SIGHUP , ( void * ) handle_SIGHUP ) ;
signal ( SIGTERM , ( void * ) handle_SIGHUP ) ;
2006-02-26 03:13:01 +00:00
# ifdef WIN32
2006-08-18 21:57:47 +00:00
FreeConsole ( ) ;
# else
if ( ( pid = fork ( ) ) ) {
fprintf ( stderr , " %d Backgrounding. \n " , ( int ) pid ) ;
exit ( 0 ) ;
2006-02-26 03:13:01 +00:00
}
# endif
2006-02-23 22:41:08 +00:00
}
2006-08-18 21:57:47 +00:00
snprintf ( path , sizeof ( path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . log_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
if ( ( f = fopen ( path , " w " ) ) = = 0 ) {
fprintf ( stderr , " Cannot open pid file %s. \n " , path ) ;
return 255 ;
2005-12-22 23:59:33 +00:00
}
2006-08-18 21:57:47 +00:00
fprintf ( f , " %d " , getpid ( ) ) ;
fclose ( f ) ;
if ( freeswitch_init ( ppath , & err ) = = 255 ) {
fprintf ( stderr , " Cannot Initilize [%s] \n " , err ) ;
return 255 ;
}
freeswitch_runtime_loop ( bg ) ;
return freeswitch_shutdown ( ) ;
2005-11-19 20:07:43 +00:00
}