2005-11-19 20:07:43 +00:00
/*
* FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
2010-02-06 03:38:24 +00:00
* Copyright ( C ) 2005 - 2010 , Anthony Minessale II < anthm @ freeswitch . org >
2005-11-19 20:07:43 +00:00
*
* 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
2009-02-04 21:20:54 +00:00
* Anthony Minessale II < anthm @ freeswitch . org >
2005-11-19 20:07:43 +00:00
* Portions created by the Initial Developer are Copyright ( C )
* the Initial Developer . All Rights Reserved .
*
* Contributor ( s ) :
*
2009-02-04 21:20:54 +00:00
* Anthony Minessale II < anthm @ freeswitch . org >
2006-09-18 05:08:55 +00:00
* Michael Jerris < mike @ jerris . com >
2007-01-19 12:59:49 +00:00
* Pawel Pierscionek < pawel @ voiceworks . pl >
2007-02-06 17:05:14 +00:00
* Bret McDanel < trixter AT 0xdecafbad . com >
2005-11-19 20:07:43 +00:00
*
*
* switch . c - - Main
*
*/
2006-02-28 21:21:48 +00:00
2007-03-11 04:02:10 +00:00
# ifndef _XOPEN_SOURCE
2007-03-19 00:33:54 +00:00
# define _XOPEN_SOURCE 600
2007-03-11 04:02:10 +00:00
# endif
2009-03-07 02:20:29 +00:00
# ifndef WIN32
# ifdef HAVE_SETRLIMIT
# include <sys/resource.h>
# endif
# endif
2005-11-19 20:07:43 +00:00
# include <switch.h>
2010-01-23 18:37:11 +00:00
# include <switch_version.h>
2007-12-08 03:41:00 +00:00
# include "private/switch_core_pvt.h"
2006-08-18 21:57:47 +00:00
2007-03-02 05:53:45 +00:00
/* pid filename: Stores the process id of the freeswitch process */
2006-08-18 21:57:47 +00:00
# define PIDFILE "freeswitch.pid"
2006-10-30 01:36:51 +00:00
static char * pfile = PIDFILE ;
2006-09-20 20:25:26 +00:00
2006-08-18 21:57:47 +00:00
2007-03-02 05:53:45 +00:00
/* Picky compiler */
2006-08-18 21:57:47 +00:00
# ifdef __ICC
# pragma warning (disable:167)
# endif
2006-02-23 22:41:08 +00:00
2006-08-19 18:51:22 +00:00
# ifdef WIN32
2008-05-12 19:05:02 +00:00
/* If we are a windows service, what should we be called */
# define SERVICENAME_DEFAULT "FreeSWITCH"
# define SERVICENAME_MAXLEN 256
static char service_name [ SERVICENAME_MAXLEN ] ;
2006-08-20 03:04:55 +00:00
# include <winsock2.h>
# include <windows.h>
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* event to signal shutdown (for you unix people, this is like a pthread_cond) */
2006-08-19 18:51:22 +00:00
static HANDLE shutdown_event ;
# endif
2006-02-26 03:13:01 +00:00
2007-03-02 05:53:45 +00:00
/* signal handler for when freeswitch is running in background mode.
* signal triggers the shutdown of freeswitch
2008-05-12 19:05:02 +00:00
# * /
2008-09-23 22:09:40 +00:00
static void handle_SIGILL ( int sig )
2006-02-23 22:41:08 +00:00
{
2007-10-03 23:43:01 +00:00
int32_t arg = 0 ;
2007-03-29 22:31:56 +00:00
if ( sig ) ;
2007-03-02 05:53:45 +00:00
/* send shutdown signal to the freeswitch core */
2006-09-20 20:25:26 +00:00
switch_core_session_ctl ( SCSC_SHUTDOWN , & arg ) ;
2006-10-02 16:48:00 +00:00
return ;
2006-02-23 22:41:08 +00:00
}
2007-03-02 05:53:45 +00:00
/* kill a freeswitch process running in background mode */
2006-08-18 21:57:47 +00:00
static int freeswitch_kill_background ( )
{
2007-03-29 22:31:56 +00:00
FILE * f ; /* FILE handle to open the pid file */
char path [ 256 ] = " " ; /* full path of the PID file */
pid_t pid = 0 ; /* pid from the pid file */
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* set the globals so we can use the global paths. */
2006-08-20 03:04:55 +00:00
switch_core_set_globals ( ) ;
2009-01-15 23:32:19 +00:00
2007-03-02 05:53:45 +00:00
/* get the full path of the pid file. */
2009-09-04 18:26:15 +00:00
switch_snprintf ( path , sizeof ( path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . run_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* open the pid file */
2006-08-18 21:57:47 +00:00
if ( ( f = fopen ( path , " r " ) ) = = 0 ) {
2007-03-02 05:53:45 +00:00
/* pid file does not exist */
2006-08-18 21:57:47 +00:00
fprintf ( stderr , " Cannot open pid file %s. \n " , path ) ;
2006-03-01 17:06:10 +00:00
return 255 ;
}
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* pull the pid from the file */
2010-02-06 03:38:24 +00:00
if ( fscanf ( f , " %d " , ( int * ) ( intptr_t ) & pid ) ! = 1 ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " Unable to get the pid! \n " ) ;
2007-08-03 21:29:01 +00:00
}
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* if we have a valid pid */
2006-08-18 21:57:47 +00:00
if ( pid > 0 ) {
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* kill the freeswitch running at the pid we found */
2006-08-19 18:51:22 +00:00
fprintf ( stderr , " Killing: %d \n " , ( int ) pid ) ;
# ifdef WIN32
2008-10-06 23:05:55 +00:00
/* for windows we need the event to signal for shutting down a background FreeSWITCH */
2006-08-19 18:51:22 +00:00
snprintf ( path , sizeof ( path ) , " Global \\ Freeswitch.%d " , pid ) ;
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* open the event so we can signal it */
2006-08-19 19:00:35 +00:00
shutdown_event = OpenEvent ( EVENT_MODIFY_STATE , FALSE , path ) ;
2006-10-30 01:36:51 +00:00
2008-10-06 23:05:55 +00:00
/* did we successfully open the event */
2006-08-19 19:00:35 +00:00
if ( ! shutdown_event ) {
/* we can't get the event, so we can't signal the process to shutdown */
2006-08-19 18:51:22 +00:00
fprintf ( stderr , " ERROR: Can't Shutdown: %d \n " , ( int ) pid ) ;
2006-08-19 19:00:35 +00:00
} else {
2007-03-02 05:53:45 +00:00
/* signal the event to shutdown */
2006-08-19 19:00:35 +00:00
SetEvent ( shutdown_event ) ;
2007-12-15 20:04:49 +00:00
/* cleanup */
CloseHandle ( shutdown_event ) ;
2006-08-19 19:00:35 +00:00
}
2006-08-19 18:51:22 +00:00
# else
2007-03-02 05:53:45 +00:00
/* for unix, send the signal to kill. */
2008-11-11 19:27:49 +00:00
kill ( pid , SIGTERM ) ;
2006-03-30 23:02:50 +00:00
# endif
2006-08-18 21:57:47 +00:00
}
2006-03-01 17:06:10 +00:00
2007-03-02 05:53:45 +00:00
/* be nice and close the file handle to the pid file */
2006-08-19 18:51:22 +00:00
fclose ( f ) ;
2006-10-30 01:36:51 +00:00
2006-08-18 21:57:47 +00:00
return 0 ;
}
2006-08-11 23:27:08 +00:00
2006-08-20 03:04:55 +00:00
# ifdef WIN32
2006-10-30 01:36:51 +00:00
2007-03-02 05:53:45 +00:00
/* we need these vars to handle the service */
2006-08-20 03:36:14 +00:00
SERVICE_STATUS_HANDLE hStatus ;
SERVICE_STATUS status ;
2007-03-02 05:53:45 +00:00
/* Handler function for service start/stop from the service */
2007-03-29 22:31:56 +00:00
void WINAPI ServiceCtrlHandler ( DWORD control )
2006-08-20 03:36:14 +00:00
{
2007-03-29 22:31:56 +00:00
switch ( control ) {
2006-10-30 01:36:51 +00:00
case SERVICE_CONTROL_SHUTDOWN :
case SERVICE_CONTROL_STOP :
2007-03-02 05:53:45 +00:00
/* Shutdown freeswitch */
2007-03-02 09:22:34 +00:00
switch_core_destroy ( ) ;
2008-10-06 23:05:55 +00:00
/* set service status values */
2006-10-30 01:36:51 +00:00
status . dwCurrentState = SERVICE_STOPPED ;
status . dwWin32ExitCode = 0 ;
status . dwCheckPoint = 0 ;
status . dwWaitHint = 0 ;
break ;
case SERVICE_CONTROL_INTERROGATE :
2007-03-02 05:53:45 +00:00
/* we already set the service status every time it changes. */
/* if there are other times we change it and don't update, we should do so here */
2006-10-30 01:36:51 +00:00
break ;
}
2007-03-29 22:31:56 +00:00
SetServiceStatus ( hStatus , & status ) ;
2006-08-20 03:36:14 +00:00
}
2007-03-02 05:53:45 +00:00
/* the main service entry point */
2007-03-29 22:31:56 +00:00
void WINAPI service_main ( DWORD numArgs , char * * args )
2006-08-20 03:36:14 +00:00
{
2010-01-15 21:09:51 +00:00
switch_core_flag_t flags = SCF_USE_SQL | SCF_USE_AUTO_NAT | SCF_CALIBRATE_CLOCK | SCF_USE_CLOCK_RT ;
2007-03-02 05:53:45 +00:00
const char * err = NULL ; /* error value for return from freeswitch initialization */
/* we have to initialize the service-specific stuff */
2007-03-29 22:31:56 +00:00
memset ( & status , 0 , sizeof ( SERVICE_STATUS ) ) ;
2006-10-30 01:36:51 +00:00
status . dwServiceType = SERVICE_WIN32 ;
status . dwCurrentState = SERVICE_START_PENDING ;
status . dwControlsAccepted = SERVICE_ACCEPT_STOP ;
2006-08-20 03:36:14 +00:00
2007-03-02 05:53:45 +00:00
/* register our handler for service control messages */
2008-05-12 19:05:02 +00:00
hStatus = RegisterServiceCtrlHandler ( service_name , & ServiceCtrlHandler ) ;
2006-08-20 03:36:14 +00:00
2007-03-02 05:53:45 +00:00
/* update the service status */
2007-03-29 22:31:56 +00:00
SetServiceStatus ( hStatus , & status ) ;
2006-11-05 19:41:03 +00:00
2008-07-21 05:05:36 +00:00
switch_core_set_globals ( ) ;
2007-03-02 05:53:45 +00:00
/* attempt to initialize freeswitch and load modules */
2007-12-06 13:40:00 +00:00
if ( switch_core_init_and_modload ( flags , SWITCH_FALSE , & err ) ! = SWITCH_STATUS_SUCCESS ) {
2008-10-06 23:05:55 +00:00
/* freeswitch did not start successfully */
2006-10-30 01:36:51 +00:00
status . dwCurrentState = SERVICE_STOPPED ;
2006-08-20 03:04:55 +00:00
} else {
2007-03-02 05:53:45 +00:00
/* freeswitch started */
2006-08-20 03:04:55 +00:00
status . dwCurrentState = SERVICE_RUNNING ;
}
2006-08-20 03:36:14 +00:00
2007-03-02 05:53:45 +00:00
/* update the service status */
2007-03-29 22:31:56 +00:00
SetServiceStatus ( hStatus , & status ) ;
2006-08-20 03:36:14 +00:00
}
2008-09-17 02:09:58 +00:00
# else
2010-02-06 03:38:24 +00:00
void daemonize ( void )
{
2008-09-17 02:09:58 +00:00
int fd ;
pid_t pid ;
switch ( fork ( ) ) {
2010-02-06 03:38:24 +00:00
case 0 :
break ;
case - 1 :
fprintf ( stderr , " Error Backgrounding (fork)! %d - %s \n " , errno , strerror ( errno ) ) ;
exit ( 0 ) ;
break ;
default :
exit ( 0 ) ;
2008-09-17 02:09:58 +00:00
}
if ( setsid ( ) < 0 ) {
fprintf ( stderr , " Error Backgrounding (setsid)! %d - %s \n " , errno , strerror ( errno ) ) ;
exit ( 0 ) ;
}
pid = fork ( ) ;
switch ( pid ) {
2010-02-06 03:38:24 +00:00
case 0 :
break ;
case - 1 :
fprintf ( stderr , " Error Backgrounding (fork2)! %d - %s \n " , errno , strerror ( errno ) ) ;
exit ( 0 ) ;
break ;
default :
fprintf ( stderr , " %d Backgrounding. \n " , ( int ) pid ) ;
exit ( 0 ) ;
2008-09-17 02:09:58 +00:00
}
/* redirect std* to null */
fd = open ( " /dev/null " , O_RDONLY ) ;
if ( fd ! = 0 ) {
dup2 ( fd , 0 ) ;
close ( fd ) ;
}
fd = open ( " /dev/null " , O_WRONLY ) ;
if ( fd ! = 1 ) {
dup2 ( fd , 1 ) ;
close ( fd ) ;
}
fd = open ( " /dev/null " , O_WRONLY ) ;
if ( fd ! = 2 ) {
dup2 ( fd , 2 ) ;
close ( fd ) ;
}
}
2006-08-20 03:04:55 +00:00
# endif
2007-03-02 05:53:45 +00:00
/* the main application entry point */
2006-08-18 21:57:47 +00:00
int main ( int argc , char * argv [ ] )
{
2007-03-02 05:53:45 +00:00
char pid_path [ 256 ] = " " ; /* full path to the pid file */
2007-12-08 03:41:00 +00:00
char pid_buffer [ 32 ] = " " ; /* pid string */
2008-11-21 15:52:22 +00:00
char old_pid_buffer [ 32 ] = " " ; /* pid string */
switch_size_t pid_len , old_pid_len ;
2007-03-02 05:53:45 +00:00
const char * err = NULL ; /* error value for return from freeswitch initialization */
2007-01-19 22:47:23 +00:00
# ifndef WIN32
2007-03-02 05:53:45 +00:00
int nf = 0 ; /* TRUE if we are running in nofork mode */
2007-10-23 15:56:23 +00:00
char * runas_user = NULL ;
char * runas_group = NULL ;
2010-02-02 22:53:36 +00:00
# else
int win32_service = 0 ;
2007-01-19 22:47:23 +00:00
# endif
2007-03-02 05:53:45 +00:00
int nc = 0 ; /* TRUE if we are running in noconsole mode */
2007-03-29 22:31:56 +00:00
pid_t pid = 0 ;
2010-02-06 03:38:24 +00:00
int i , x ;
2009-07-24 18:20:37 +00:00
char * opts ;
char opts_str [ 1024 ] = " " ;
char * local_argv [ 1024 ] = { 0 } ;
2009-10-15 15:25:06 +00:00
int local_argc = argc ;
2009-07-24 18:20:37 +00:00
char * arg_argv [ 128 ] = { 0 } ;
2007-03-29 22:31:56 +00:00
char * usageDesc ;
2009-10-26 21:46:21 +00:00
int alt_dirs = 0 , log_set = 0 , run_set = 0 , kill = 0 ;
2007-04-21 16:58:35 +00:00
int known_opt ;
2008-05-27 04:34:23 +00:00
int high_prio = 0 ;
2009-08-01 05:53:28 +00:00
# ifdef __sun
switch_core_flag_t flags = SCF_USE_SQL ;
# else
2010-01-15 21:09:51 +00:00
switch_core_flag_t flags = SCF_USE_SQL | SCF_USE_AUTO_NAT | SCF_CALIBRATE_CLOCK | SCF_USE_CLOCK_RT ;
2009-08-01 05:53:28 +00:00
# endif
2008-10-02 17:40:41 +00:00
int ret = 0 ;
2008-10-02 16:46:20 +00:00
switch_status_t destroy_status ;
2008-05-27 04:34:23 +00:00
switch_file_t * fd ;
2007-12-08 03:41:00 +00:00
switch_memory_pool_t * pool = NULL ;
2009-03-07 02:20:29 +00:00
# ifdef HAVE_SETRLIMIT
struct rlimit rlp ;
int waste = 0 ;
# endif
2007-12-08 03:41:00 +00:00
2009-07-24 18:20:37 +00:00
for ( x = 0 ; x < argc ; x + + ) {
local_argv [ x ] = argv [ x ] ;
}
if ( ( opts = getenv ( " FREESWITCH_OPTS " ) ) ) {
strncpy ( opts_str , opts , sizeof ( opts_str ) - 1 ) ;
i = switch_separate_string ( opts_str , ' ' , arg_argv , ( sizeof ( arg_argv ) / sizeof ( arg_argv [ 0 ] ) ) ) ;
for ( x = 0 ; x < i ; x + + ) {
2009-10-15 15:25:06 +00:00
local_argv [ local_argc + + ] = arg_argv [ x ] ;
2009-07-24 18:20:37 +00:00
}
}
if ( local_argv [ 0 ] & & strstr ( local_argv [ 0 ] , " freeswitchd " ) ) {
2009-01-29 00:17:33 +00:00
nc + + ;
}
2007-03-29 22:31:56 +00:00
usageDesc = " these are the optional arguments you can pass to freeswitch \n "
2007-10-20 06:46:16 +00:00
# ifdef WIN32
2009-02-03 19:37:58 +00:00
" \t -service [name] -- start freeswitch as a service, cannot be used if loaded as a console app \n "
" \t -install [name] -- install freeswitch as a service, with optional service name \n "
" \t -uninstall -- remove freeswitch as a service \n "
2007-02-06 17:05:14 +00:00
# else
2009-02-03 19:37:58 +00:00
" \t -nf -- no forking \n "
2010-02-06 03:38:24 +00:00
" \t -u [user] -- specify user to switch to \n " " \t -g [group] -- specify group to switch to \n "
2007-10-20 06:46:16 +00:00
# endif
2010-02-06 03:38:24 +00:00
" \t -help -- this message \n " " \t -version -- print the version and exit \n "
2007-12-18 16:55:39 +00:00
# ifdef HAVE_SETRLIMIT
2010-02-06 03:38:24 +00:00
" \t -waste -- allow memory waste \n " " \t -core -- dump cores \n "
2007-12-18 16:55:39 +00:00
# endif
2009-02-03 19:37:58 +00:00
" \t -hp -- enable high priority settings \n "
" \t -vg -- run under valgrind \n "
" \t -nosql -- disable internal sql scoreboard \n "
2010-03-01 19:25:27 +00:00
" \t -heavy-timer -- Heavy Timer, possibly more accurate but at a cost \n "
2009-06-02 16:55:10 +00:00
" \t -nonat -- disable auto nat detection \n "
2010-01-15 21:09:51 +00:00
" \t -nocal -- disable clock calibration \n "
" \t -nort -- disable clock clock_realtime \n "
2009-02-03 19:37:58 +00:00
" \t -stop -- stop freeswitch \n "
" \t -nc -- do not output to a console and background \n "
" \t -c -- output to a console and stay in the foreground \n "
" \t -conf [confdir] -- specify an alternate config dir \n "
" \t -log [logdir] -- specify an alternate log dir \n "
2009-09-04 18:26:15 +00:00
" \t -run [rundir] -- specify an alternate run dir \n "
2009-02-03 19:37:58 +00:00
" \t -db [dbdir] -- specify an alternate db dir \n "
" \t -mod [moddir] -- specify an alternate mod dir \n "
2010-02-06 03:38:24 +00:00
" \t -htdocs [htdocsdir] -- specify an alternate htdocs dir \n " " \t -scripts [scriptsdir] -- specify an alternate scripts dir \n " ;
2006-08-20 03:04:55 +00:00
2009-10-15 15:25:06 +00:00
for ( x = 1 ; x < local_argc ; x + + ) {
2007-04-21 16:58:35 +00:00
known_opt = 0 ;
2006-09-20 20:25:26 +00:00
# ifdef WIN32
if ( x = = 1 ) {
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -service " ) ) {
2008-05-12 19:05:02 +00:00
/* New installs will always have the service name specified, but keep a default for compat */
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
switch_copy_string ( service_name , local_argv [ x ] , SERVICENAME_MAXLEN ) ;
2008-05-12 19:05:02 +00:00
} else {
switch_copy_string ( service_name , SERVICENAME_DEFAULT , SERVICENAME_MAXLEN ) ;
}
2010-02-02 22:53:36 +00:00
known_opt + + ;
win32_service + + ;
continue ;
2006-09-20 20:25:26 +00:00
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -install " ) ) {
2006-09-20 20:25:26 +00:00
char exePath [ 1024 ] ;
char servicePath [ 1024 ] ;
2008-05-12 19:05:02 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
switch_copy_string ( service_name , local_argv [ x ] , SERVICENAME_MAXLEN ) ;
2008-05-12 19:05:02 +00:00
} else {
switch_copy_string ( service_name , SERVICENAME_DEFAULT , SERVICENAME_MAXLEN ) ;
}
2007-04-21 16:58:35 +00:00
known_opt + + ;
2007-03-29 22:31:56 +00:00
GetModuleFileName ( NULL , exePath , 1024 ) ;
2008-05-12 19:05:02 +00:00
snprintf ( servicePath , sizeof ( servicePath ) , " %s -service %s " , exePath , service_name ) ;
2010-02-06 03:38:24 +00:00
{ /* Perform service installation */
SC_HANDLE hService ;
2008-05-12 19:05:02 +00:00
SC_HANDLE hSCManager = OpenSCManager ( NULL , NULL , SC_MANAGER_ALL_ACCESS ) ;
if ( ! hSCManager ) {
fprintf ( stderr , " Could not open service manager (%d). \n " , GetLastError ( ) ) ;
exit ( 1 ) ;
}
2010-02-06 03:38:24 +00:00
hService = CreateService ( hSCManager , service_name , service_name , GENERIC_READ | GENERIC_EXECUTE | SERVICE_CHANGE_CONFIG , SERVICE_WIN32_OWN_PROCESS , SERVICE_AUTO_START , SERVICE_ERROR_IGNORE , servicePath , NULL , NULL , NULL , NULL , /* Service start name */
2008-05-12 19:05:02 +00:00
NULL ) ;
if ( ! hService ) {
fprintf ( stderr , " Error creating freeswitch service (%d). \n " , GetLastError ( ) ) ;
} else {
/* Set desc, and don't care if it succeeds */
SERVICE_DESCRIPTION desc ;
desc . lpDescription = " The FreeSWITCH service. " ;
if ( ! ChangeServiceConfig2 ( hService , SERVICE_CONFIG_DESCRIPTION , & desc ) ) {
fprintf ( stderr , " FreeSWITCH installed, but could not set the service description (%d). \n " , GetLastError ( ) ) ;
}
CloseServiceHandle ( hService ) ;
}
CloseServiceHandle ( hSCManager ) ;
exit ( 0 ) ;
2007-12-15 20:04:49 +00:00
}
2006-09-20 20:25:26 +00:00
}
2009-03-07 02:20:29 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -uninstall " ) ) {
2008-05-12 19:05:02 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
switch_copy_string ( service_name , local_argv [ x ] , SERVICENAME_MAXLEN ) ;
2008-05-12 19:05:02 +00:00
} else {
switch_copy_string ( service_name , SERVICENAME_DEFAULT , SERVICENAME_MAXLEN ) ;
}
2010-02-06 03:38:24 +00:00
{ /* Do the uninstallation */
2008-05-12 19:05:02 +00:00
SC_HANDLE hService ;
SC_HANDLE hSCManager = OpenSCManager ( NULL , NULL , SC_MANAGER_ALL_ACCESS ) ;
if ( ! hSCManager ) {
fprintf ( stderr , " Could not open service manager (%d). \n " , GetLastError ( ) ) ;
exit ( 1 ) ;
}
hService = OpenService ( hSCManager , service_name , DELETE ) ;
known_opt + + ;
if ( hService ! = NULL ) {
/* remove the service! */
if ( ! DeleteService ( hService ) ) {
fprintf ( stderr , " Error deleting service (%d). \n " , GetLastError ( ) ) ;
}
CloseServiceHandle ( hService ) ;
} else {
fprintf ( stderr , " Error opening service (%d). \n " , GetLastError ( ) ) ;
}
CloseServiceHandle ( hSCManager ) ;
exit ( 0 ) ;
2006-10-30 01:36:51 +00:00
}
2006-09-20 20:25:26 +00:00
}
2006-08-20 03:36:14 +00:00
}
2007-01-19 12:59:49 +00:00
# else
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -u " ) ) {
2007-10-23 15:56:23 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
runas_user = local_argv [ x ] ;
2007-10-23 15:56:23 +00:00
}
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -g " ) ) {
2007-10-23 15:56:23 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
runas_group = local_argv [ x ] ;
2007-10-23 15:56:23 +00:00
}
known_opt + + ;
}
2007-01-19 22:47:23 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -nf " ) ) {
2007-01-19 22:47:23 +00:00
nf + + ;
2007-04-21 16:58:35 +00:00
known_opt + + ;
2007-01-19 12:59:49 +00:00
}
2010-01-23 18:37:11 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -version " ) ) {
fprintf ( stdout , " FreeSWITCH version: %s \n " , SWITCH_VERSION_FULL ) ;
return 0 ;
known_opt + + ;
}
2006-08-20 03:04:55 +00:00
# endif
2007-12-18 16:55:39 +00:00
# ifdef HAVE_SETRLIMIT
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -core " ) ) {
2007-12-18 16:55:39 +00:00
memset ( & rlp , 0 , sizeof ( rlp ) ) ;
rlp . rlim_cur = RLIM_INFINITY ;
rlp . rlim_max = RLIM_INFINITY ;
setrlimit ( RLIMIT_CORE , & rlp ) ;
known_opt + + ;
}
2009-03-07 02:20:29 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -waste " ) ) {
2009-03-07 02:20:29 +00:00
waste + + ;
known_opt + + ;
}
2007-12-18 16:55:39 +00:00
# endif
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -hp " ) ) {
2007-10-23 15:56:23 +00:00
high_prio + + ;
2007-04-21 16:58:35 +00:00
known_opt + + ;
2006-09-20 20:25:26 +00:00
}
2006-10-30 01:36:51 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -nosql " ) ) {
2007-09-29 01:06:08 +00:00
flags & = ~ SCF_USE_SQL ;
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -nonat " ) ) {
2009-06-02 16:55:10 +00:00
flags & = ~ SCF_USE_AUTO_NAT ;
known_opt + + ;
}
2010-03-01 19:25:27 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -heavy-timer " ) ) {
flags | = SCF_USE_HEAVY_TIMING ;
2010-01-15 21:09:51 +00:00
known_opt + + ;
}
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -nort " ) ) {
flags & = ~ SCF_USE_CLOCK_RT ;
known_opt + + ;
}
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -nocal " ) ) {
flags & = ~ SCF_CALIBRATE_CLOCK ;
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -vg " ) ) {
2008-08-22 19:00:56 +00:00
flags | = SCF_VG ;
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -stop " ) ) {
2009-10-26 21:46:21 +00:00
kill + + ;
2009-10-27 16:53:53 +00:00
known_opt + + ;
2006-09-20 20:25:26 +00:00
}
2006-08-20 03:04:55 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -nc " ) ) {
2007-01-19 22:47:23 +00:00
nc + + ;
2007-04-21 16:58:35 +00:00
known_opt + + ;
2007-01-19 22:47:23 +00:00
}
2006-11-16 19:43:25 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -c " ) ) {
2008-01-25 14:08:53 +00:00
nc = 0 ;
known_opt + + ;
}
2007-02-06 17:05:14 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -conf " ) ) {
2007-03-29 22:31:56 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
SWITCH_GLOBAL_dirs . conf_dir = ( char * ) malloc ( strlen ( local_argv [ x ] ) + 1 ) ;
2008-05-15 21:05:32 +00:00
if ( ! SWITCH_GLOBAL_dirs . conf_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
2009-07-24 18:20:37 +00:00
strcpy ( SWITCH_GLOBAL_dirs . conf_dir , local_argv [ x ] ) ;
2007-02-06 17:05:14 +00:00
alt_dirs + + ;
2007-03-29 22:31:56 +00:00
} else {
fprintf ( stderr , " When using -conf you must specify a config directory \n " ) ;
return 255 ;
}
2007-04-21 16:58:35 +00:00
known_opt + + ;
2007-03-29 22:31:56 +00:00
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -mod " ) ) {
2008-10-09 16:05:35 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
SWITCH_GLOBAL_dirs . mod_dir = ( char * ) malloc ( strlen ( local_argv [ x ] ) + 1 ) ;
2008-10-09 16:05:35 +00:00
if ( ! SWITCH_GLOBAL_dirs . mod_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
2009-07-24 18:20:37 +00:00
strcpy ( SWITCH_GLOBAL_dirs . mod_dir , local_argv [ x ] ) ;
2008-10-09 16:05:35 +00:00
} else {
fprintf ( stderr , " When using -mod you must specify a module directory \n " ) ;
return 255 ;
}
known_opt + + ;
}
2010-02-06 03:38:24 +00:00
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -log " ) ) {
2007-03-29 22:31:56 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
SWITCH_GLOBAL_dirs . log_dir = ( char * ) malloc ( strlen ( local_argv [ x ] ) + 1 ) ;
2008-05-15 21:05:32 +00:00
if ( ! SWITCH_GLOBAL_dirs . log_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
2009-07-24 18:20:37 +00:00
strcpy ( SWITCH_GLOBAL_dirs . log_dir , local_argv [ x ] ) ;
2007-02-06 17:05:14 +00:00
alt_dirs + + ;
2009-10-26 21:46:21 +00:00
log_set + + ;
2007-03-29 22:31:56 +00:00
} else {
fprintf ( stderr , " When using -log you must specify a log directory \n " ) ;
return 255 ;
}
2007-04-21 16:58:35 +00:00
known_opt + + ;
2007-03-29 22:31:56 +00:00
}
2009-09-04 18:26:15 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -run " ) ) {
x + + ;
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
SWITCH_GLOBAL_dirs . run_dir = ( char * ) malloc ( strlen ( local_argv [ x ] ) + 1 ) ;
if ( ! SWITCH_GLOBAL_dirs . run_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
strcpy ( SWITCH_GLOBAL_dirs . run_dir , local_argv [ x ] ) ;
2009-10-26 21:46:21 +00:00
run_set + + ;
2009-09-04 18:26:15 +00:00
} else {
fprintf ( stderr , " When using -run you must specify a pid directory \n " ) ;
return 255 ;
}
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -db " ) ) {
2007-03-29 22:31:56 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
SWITCH_GLOBAL_dirs . db_dir = ( char * ) malloc ( strlen ( local_argv [ x ] ) + 1 ) ;
2008-05-15 21:05:32 +00:00
if ( ! SWITCH_GLOBAL_dirs . db_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
2009-07-24 18:20:37 +00:00
strcpy ( SWITCH_GLOBAL_dirs . db_dir , local_argv [ x ] ) ;
2007-02-06 17:05:14 +00:00
alt_dirs + + ;
2007-03-29 22:31:56 +00:00
} else {
fprintf ( stderr , " When using -db you must specify a db directory \n " ) ;
return 255 ;
}
2007-04-21 16:58:35 +00:00
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -scripts " ) ) {
2007-10-20 06:46:16 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
SWITCH_GLOBAL_dirs . script_dir = ( char * ) malloc ( strlen ( local_argv [ x ] ) + 1 ) ;
2008-05-15 21:05:32 +00:00
if ( ! SWITCH_GLOBAL_dirs . script_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
2009-07-24 18:20:37 +00:00
strcpy ( SWITCH_GLOBAL_dirs . script_dir , local_argv [ x ] ) ;
2007-10-20 06:46:16 +00:00
} else {
fprintf ( stderr , " When using -scripts you must specify a scripts directory \n " ) ;
return 255 ;
}
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & ! strcmp ( local_argv [ x ] , " -htdocs " ) ) {
2009-02-03 19:37:58 +00:00
x + + ;
2009-07-24 18:20:37 +00:00
if ( local_argv [ x ] & & strlen ( local_argv [ x ] ) ) {
SWITCH_GLOBAL_dirs . htdocs_dir = ( char * ) malloc ( strlen ( local_argv [ x ] ) + 1 ) ;
2009-02-03 19:37:58 +00:00
if ( ! SWITCH_GLOBAL_dirs . htdocs_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
2009-07-24 18:20:37 +00:00
strcpy ( SWITCH_GLOBAL_dirs . htdocs_dir , local_argv [ x ] ) ;
2009-02-03 19:37:58 +00:00
} else {
fprintf ( stderr , " When using -htdocs you must specify a htdocs directory \n " ) ;
return 255 ;
}
known_opt + + ;
}
2009-07-24 18:20:37 +00:00
if ( ! known_opt | | ( local_argv [ x ] & & ( ! strcmp ( local_argv [ x ] , " -help " ) | | ! strcmp ( local_argv [ x ] , " -h " ) | | ! strcmp ( local_argv [ x ] , " -? " ) ) ) ) {
2007-04-21 16:58:35 +00:00
printf ( " %s \n " , usageDesc ) ;
exit ( 0 ) ;
2007-03-29 22:31:56 +00:00
}
2007-12-15 20:04:49 +00:00
}
2010-02-06 03:38:24 +00:00
2009-10-26 21:46:21 +00:00
if ( log_set & & ! run_set ) {
2009-10-27 14:01:13 +00:00
SWITCH_GLOBAL_dirs . run_dir = ( char * ) malloc ( strlen ( SWITCH_GLOBAL_dirs . log_dir ) + 1 ) ;
if ( ! SWITCH_GLOBAL_dirs . run_dir ) {
fprintf ( stderr , " Allocation error \n " ) ;
return 255 ;
}
2009-10-26 21:46:21 +00:00
strcpy ( SWITCH_GLOBAL_dirs . run_dir , SWITCH_GLOBAL_dirs . log_dir ) ;
}
if ( kill ) {
return freeswitch_kill_background ( ) ;
}
2007-03-29 22:31:56 +00:00
2007-12-15 20:04:49 +00:00
if ( apr_initialize ( ) ! = SWITCH_STATUS_SUCCESS ) {
2008-01-07 10:45:06 +00:00
fprintf ( stderr , " FATAL ERROR! Could not initialize APR \n " ) ;
2007-12-15 20:04:49 +00:00
return 255 ;
2006-08-18 21:57:47 +00:00
}
2007-03-29 22:31:56 +00:00
if ( alt_dirs & & alt_dirs ! = 3 ) {
2007-10-20 06:46:16 +00:00
fprintf ( stderr , " You must specify all or none of -conf, -log, and -db \n " ) ;
2007-02-06 17:05:14 +00:00
return 255 ;
}
2008-09-23 22:09:40 +00:00
signal ( SIGILL , handle_SIGILL ) ;
2008-11-11 19:27:49 +00:00
signal ( SIGTERM , handle_SIGILL ) ;
2006-08-18 21:57:47 +00:00
2007-12-04 23:47:27 +00:00
if ( nc ) {
2006-02-26 03:13:01 +00:00
# ifdef WIN32
2006-08-18 21:57:47 +00:00
FreeConsole ( ) ;
# else
2008-09-17 02:09:58 +00:00
if ( ! nf ) {
daemonize ( ) ;
2006-02-26 03:13:01 +00:00
}
# endif
2006-02-23 22:41:08 +00:00
}
2009-03-16 20:14:36 +00:00
# if defined(HAVE_SETRLIMIT) && !defined(__sun)
2009-03-20 01:22:40 +00:00
if ( ! waste & & ! ( flags & SCF_VG ) ) {
2009-03-07 02:20:29 +00:00
memset ( & rlp , 0 , sizeof ( rlp ) ) ;
getrlimit ( RLIMIT_STACK , & rlp ) ;
if ( rlp . rlim_max > SWITCH_THREAD_STACKSIZE ) {
2009-03-07 14:07:48 +00:00
char buf [ 1024 ] = " " ;
int i = 0 ;
2009-06-30 20:01:48 +00:00
2010-02-06 03:38:24 +00:00
fprintf ( stderr , " Error: stacksize %d is too large: run ulimit -s %d or run %s -waste. \n auto-adjusting stack size for optimal performance... \n " ,
( int ) ( rlp . rlim_max / 1024 ) , SWITCH_THREAD_STACKSIZE / 1024 , local_argv [ 0 ] ) ;
2009-06-30 20:01:48 +00:00
2009-03-07 02:20:29 +00:00
memset ( & rlp , 0 , sizeof ( rlp ) ) ;
rlp . rlim_cur = SWITCH_THREAD_STACKSIZE ;
rlp . rlim_max = SWITCH_THREAD_STACKSIZE ;
setrlimit ( RLIMIT_STACK , & rlp ) ;
2009-06-30 20:01:48 +00:00
2009-03-07 14:07:48 +00:00
apr_terminate ( ) ;
2010-02-06 03:38:24 +00:00
ret = ( int ) execv ( argv [ 0 ] , argv ) ;
for ( i = 0 ; i < argc ; i + + ) {
2009-10-15 15:25:06 +00:00
switch_snprintf ( buf + strlen ( buf ) , sizeof ( buf ) - strlen ( buf ) , " %s " , argv [ i ] ) ;
2009-03-07 14:07:48 +00:00
}
return system ( buf ) ;
2010-02-06 03:38:24 +00:00
2009-03-07 02:20:29 +00:00
}
}
# endif
2007-10-23 15:56:23 +00:00
if ( high_prio ) {
set_high_priority ( ) ;
}
2008-01-07 20:40:59 +00:00
switch_core_setrlimits ( ) ;
2008-05-27 04:34:23 +00:00
2009-03-07 02:20:29 +00:00
2007-10-23 15:56:23 +00:00
# ifndef WIN32
if ( runas_user | | runas_group ) {
2008-02-15 23:16:01 +00:00
if ( change_user_group ( runas_user , runas_group ) < 0 ) {
2010-02-06 03:38:24 +00:00
fprintf ( stderr , " Failed to switch user / group \n " ) ;
2007-10-23 15:56:23 +00:00
return 255 ;
}
}
2010-02-02 22:53:36 +00:00
# else
if ( win32_service ) {
2010-02-06 03:38:24 +00:00
{ /* Attempt to start service */
2010-02-02 22:53:36 +00:00
SERVICE_TABLE_ENTRY dispatchTable [ ] = {
2010-02-06 03:38:24 +00:00
{ service_name , & service_main }
,
2010-02-02 22:53:36 +00:00
{ NULL , NULL }
} ;
if ( StartServiceCtrlDispatcher ( dispatchTable ) = = 0 ) {
/* Not loaded as a service */
fprintf ( stderr , " Error Freeswitch loaded as a console app with -service option \n " ) ;
fprintf ( stderr , " To install the service load freeswitch with -install \n " ) ;
}
exit ( 0 ) ;
}
}
2007-10-23 15:56:23 +00:00
# endif
2007-12-08 03:41:00 +00:00
switch_core_set_globals ( ) ;
pid = getpid ( ) ;
2007-12-25 03:00:29 +00:00
memset ( pid_buffer , 0 , sizeof ( pid_buffer ) ) ;
2009-09-04 18:26:15 +00:00
switch_snprintf ( pid_path , sizeof ( pid_path ) , " %s%s%s " , SWITCH_GLOBAL_dirs . run_dir , SWITCH_PATH_SEPARATOR , pfile ) ;
2007-12-15 20:04:49 +00:00
switch_snprintf ( pid_buffer , sizeof ( pid_buffer ) , " %d " , pid ) ;
2008-09-17 02:09:58 +00:00
pid_len = strlen ( pid_buffer ) ;
2007-12-08 03:41:00 +00:00
apr_pool_create ( & pool , NULL ) ;
2010-02-06 03:38:24 +00:00
2010-01-12 17:20:16 +00:00
switch_dir_make_recursive ( SWITCH_GLOBAL_dirs . run_dir , SWITCH_DEFAULT_DIR_PERMS , pool ) ;
2008-11-21 15:52:22 +00:00
2010-02-06 03:38:24 +00:00
if ( switch_file_open ( & fd , pid_path , SWITCH_FOPEN_READ , SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE , pool ) = = SWITCH_STATUS_SUCCESS ) {
2008-11-21 15:55:17 +00:00
old_pid_len = sizeof ( old_pid_buffer ) ;
switch_file_read ( fd , old_pid_buffer , & old_pid_len ) ;
switch_file_close ( fd ) ;
2008-11-21 15:52:22 +00:00
}
if ( switch_file_open ( & fd ,
pid_path ,
SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE | SWITCH_FOPEN_TRUNCATE ,
2010-02-06 03:38:24 +00:00
SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE , pool ) ! = SWITCH_STATUS_SUCCESS ) {
2008-11-21 15:52:22 +00:00
fprintf ( stderr , " Cannot open pid file %s. \n " , pid_path ) ;
return 255 ;
2006-08-20 03:04:55 +00:00
}
2007-12-08 03:41:00 +00:00
if ( switch_file_lock ( fd , SWITCH_FLOCK_EXCLUSIVE | SWITCH_FLOCK_NONBLOCK ) ! = SWITCH_STATUS_SUCCESS ) {
fprintf ( stderr , " Cannot lock pid file %s. \n " , pid_path ) ;
2008-11-21 15:52:22 +00:00
old_pid_len = strlen ( old_pid_buffer ) ;
2008-11-21 15:55:17 +00:00
if ( strlen ( old_pid_buffer ) ) {
switch_file_write ( fd , old_pid_buffer , & old_pid_len ) ;
}
2007-12-08 03:41:00 +00:00
return 255 ;
}
switch_file_write ( fd , pid_buffer , & pid_len ) ;
if ( switch_core_init_and_modload ( flags , nc ? SWITCH_FALSE : SWITCH_TRUE , & err ) ! = SWITCH_STATUS_SUCCESS ) {
2008-01-07 10:45:06 +00:00
fprintf ( stderr , " Cannot Initialize [%s] \n " , err ) ;
2007-12-08 03:41:00 +00:00
return 255 ;
}
2006-08-20 03:04:55 +00:00
2007-01-19 12:59:49 +00:00
switch_core_runtime_loop ( nc ) ;
2006-08-18 21:57:47 +00:00
2008-10-02 16:46:20 +00:00
destroy_status = switch_core_destroy ( ) ;
2010-02-06 03:38:24 +00:00
2007-12-08 03:41:00 +00:00
switch_file_close ( fd ) ;
2007-12-07 02:03:55 +00:00
2007-12-15 20:04:49 +00:00
if ( unlink ( pid_path ) ! = 0 ) {
fprintf ( stderr , " Failed to delete pid file [%s] \n " , pid_path ) ;
}
2008-10-02 16:46:20 +00:00
if ( destroy_status = = SWITCH_STATUS_RESTART ) {
2009-01-20 18:35:07 +00:00
char buf [ 1024 ] = " " ;
2009-07-29 22:33:44 +00:00
int j = 0 ;
2010-02-06 03:38:24 +00:00
2009-01-20 18:35:07 +00:00
switch_sleep ( 1000000 ) ;
2010-02-06 03:38:24 +00:00
ret = ( int ) execv ( argv [ 0 ] , argv ) ;
2009-01-20 18:35:07 +00:00
fprintf ( stderr , " Restart Failed [%s] resorting to plan b \n " , strerror ( errno ) ) ;
2010-02-06 03:38:24 +00:00
for ( j = 0 ; j < argc ; j + + ) {
2009-10-15 15:25:06 +00:00
switch_snprintf ( buf + strlen ( buf ) , sizeof ( buf ) - strlen ( buf ) , " %s " , argv [ j ] ) ;
2009-01-20 18:35:07 +00:00
}
ret = system ( buf ) ;
2008-10-02 16:46:20 +00:00
}
2007-12-15 20:04:49 +00:00
return ret ;
2005-11-19 20:07:43 +00:00
}
2006-11-27 22:30:48 +00:00
/* For Emacs:
* Local Variables :
* mode : c
2008-02-03 22:14:57 +00:00
* indent - tabs - mode : t
2006-11-27 22:30:48 +00:00
* tab - width : 4
* c - basic - offset : 4
* End :
* For VIM :
2008-07-03 19:12:26 +00:00
* vim : set softtabstop = 4 shiftwidth = 4 tabstop = 4 :
2006-11-27 22:30:48 +00:00
*/