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-02-23 22:41:08 +00:00
static int RUNNING = 0 ;
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-01-20 15:05:05 +00:00
int main ( int argc , char * argv [ ] )
{
2006-02-26 03:13:01 +00:00
char * lfile = " freeswitch.log " ;
char * pfile = " freeswitch.pid " ;
char path [ 256 ] = " " ;
2006-03-01 17:06:10 +00:00
char * ppath = NULL ;
2006-06-05 18:36:02 +00:00
const char * err = NULL ;
2006-04-29 01:00:52 +00:00
switch_event_t * event ;
2006-02-24 19:11:49 +00:00
int bg = 0 ;
2006-02-26 03:13:01 +00:00
FILE * f ;
# ifdef WIN32
2006-02-28 05:55:22 +00:00
SetPriorityClass ( GetCurrentProcess ( ) , HIGH_PRIORITY_CLASS ) ;
2006-02-26 03:13:01 +00:00
# else
int pid ;
2006-06-30 21:45:29 +00:00
nice ( - 20 ) ;
2006-02-28 21:21:48 +00:00
# endif
2006-02-26 03:13:01 +00:00
2006-06-09 15:39:12 +00:00
# ifdef HAVE_MLOCKALL
mlockall ( MCL_CURRENT | MCL_FUTURE ) ;
# endif
2006-02-28 21:21:48 +00:00
# ifndef WIN32
2006-02-26 03:13:01 +00:00
if ( argv [ 1 ] & & ! strcmp ( argv [ 1 ] , " -stop " ) ) {
pid_t pid = 0 ;
2006-03-01 17:06:10 +00:00
switch_core_set_globals ( ) ;
snprintf ( path , sizeof ( path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . log_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
2006-02-26 03:13:01 +00:00
if ( ( f = fopen ( path , " r " ) ) = = 0 ) {
fprintf ( stderr , " Cannot open pid file %s. \n " , path ) ;
return 255 ;
}
fscanf ( f , " %d " , & pid ) ;
if ( pid > 0 ) {
2006-03-01 17:06:10 +00:00
fprintf ( stderr , " Killing %d \n " , ( int ) pid ) ;
2006-02-26 03:13:01 +00:00
kill ( pid , SIGTERM ) ;
}
2005-11-19 20:07:43 +00:00
2006-02-26 03:13:01 +00:00
fclose ( f ) ;
return 0 ;
2006-02-24 19:11:49 +00:00
}
2006-02-26 03:13:01 +00:00
# endif
2006-02-24 19:11:49 +00:00
2006-03-01 17:06:10 +00:00
if ( argv [ 1 ] & & ! strcmp ( argv [ 1 ] , " -nc " ) ) {
bg + + ;
}
if ( bg ) {
//snprintf(path, sizeof(path), "%s%c%s", SWITCH_GLOBAL_dirs.log_dir, sep, lfile);
ppath = lfile ;
2006-04-26 19:11:49 +00:00
signal ( SIGHUP , ( void * ) handle_SIGHUP ) ;
signal ( SIGTERM , ( void * ) handle_SIGHUP ) ;
# ifdef WIN32
FreeConsole ( ) ;
# else
if ( ( pid = fork ( ) ) ) {
fprintf ( stderr , " %d Backgrounding. \n " , ( int ) pid ) ;
exit ( 0 ) ;
}
# endif
2006-03-01 17:06:10 +00:00
}
2006-06-05 18:36:02 +00:00
if ( switch_core_init ( ppath , & err ) ! = SWITCH_STATUS_SUCCESS ) {
fprintf ( stderr , " Cannot Initilize [%s] \n " , err ) ;
2006-03-01 17:06:10 +00:00
return 255 ;
}
2006-03-30 23:02:50 +00:00
# ifdef __ICC
# pragma warning (disable:167)
# endif
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-03-01 17:06:10 +00:00
2006-02-26 03:13:01 +00:00
2006-02-24 19:11:49 +00:00
2006-03-01 17:06:10 +00:00
snprintf ( path , sizeof ( path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . log_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
2006-02-26 03:13:01 +00:00
if ( ( f = fopen ( path , " w " ) ) = = 0 ) {
fprintf ( stderr , " Cannot open pid file %s. \n " , path ) ;
return 255 ;
}
fprintf ( f , " %d " , getpid ( ) ) ;
fclose ( f ) ;
2006-02-28 21:21:48 +00:00
2005-11-19 20:07:43 +00:00
if ( ! err ) {
2006-04-11 21:13:44 +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 " ) ;
2005-11-19 20:07:43 +00:00
if ( switch_loadable_module_init ( ) ! = SWITCH_STATUS_SUCCESS ) {
err = " Cannot load modules " ;
}
}
2006-01-20 15:05:05 +00:00
if ( err ) {
2006-04-11 21:13:44 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Error: %s " , err ) ;
2005-11-19 20:07:43 +00:00
exit ( - 1 ) ;
}
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-05-05 13:35:33 +00:00
# ifdef CRASH_PROT
# define __CP "ENABLED"
# else
# define __CP "DISABLED"
# endif
2006-07-07 18:59:14 +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 ) ) ;
2006-03-01 17:06:10 +00:00
snprintf ( path , sizeof ( path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . log_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
2005-11-19 20:07:43 +00:00
2006-02-24 19:11:49 +00:00
if ( bg ) {
2006-02-26 03:13:01 +00:00
bg = 0 ;
2006-02-23 22:41:08 +00:00
RUNNING = 1 ;
while ( RUNNING ) {
2006-02-26 03:13:01 +00:00
# ifdef WIN32
bg + + ;
if ( bg = = 100 ) {
if ( ( f = fopen ( path , " r " ) ) = = 0 ) {
break ;
}
fclose ( f ) ;
bg = 0 ;
}
# endif
2006-02-23 22:41:08 +00:00
switch_yield ( 10000 ) ;
}
2006-02-24 19:11:49 +00:00
} else {
2006-02-23 22:41:08 +00:00
/* wait for console input */
switch_console_loop ( ) ;
}
2006-02-24 19:11:49 +00:00
2005-12-22 23:59:33 +00:00
if ( switch_event_create ( & event , SWITCH_EVENT_SHUTDOWN ) = = SWITCH_STATUS_SUCCESS ) {
2005-12-23 21:09:36 +00:00
switch_event_add_header ( event , SWITCH_STACK_BOTTOM , " Event-Info " , " System Shutting Down " ) ;
2005-12-22 23:59:33 +00:00
switch_event_fire ( & event ) ;
}
2006-07-07 18:59:14 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " End existing sessions \n " ) ;
switch_core_session_hupall ( ) ;
2006-04-11 21:13:44 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Clean up modules. \n " ) ;
2006-01-05 21:03:22 +00:00
switch_loadable_module_shutdown ( ) ;
2006-04-11 21:13:44 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Tearing down environment. \n " ) ;
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Exiting Now. \n " ) ;
2006-02-26 03:13:01 +00:00
switch_core_destroy ( ) ;
2005-11-19 20:07:43 +00:00
return 0 ;
}