From 461295664f55b21bafc4744db459d8513aef6bf9 Mon Sep 17 00:00:00 2001 From: Michael Jerris <mike@jerris.com> Date: Mon, 30 Oct 2006 01:36:51 +0000 Subject: [PATCH] formatting and comments. More to come. git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3233 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/switch.c | 159 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 96 insertions(+), 63 deletions(-) diff --git a/src/switch.c b/src/switch.c index 5f89d8f8dd..34659a8dae 100644 --- a/src/switch.c +++ b/src/switch.c @@ -33,111 +33,146 @@ #include <switch.h> +//pid filename: Stores the process id of the freeswitch process #define PIDFILE "freeswitch.pid" -#define LOGFILE "freeswitch.log" - -static char *lfile = LOGFILE; static char *pfile = PIDFILE; + +//log filename: Filename of the freeswitch log file to be used if we are in background mode +#define LOGFILE "freeswitch.log" +static char *lfile = LOGFILE; + +//If we are a windows service, what should we be called #define SERVICENAME "Freeswitch" +//Picky compiler #ifdef __ICC #pragma warning (disable:167) #endif - #ifdef WIN32 #include <winsock2.h> #include <windows.h> + +//event to signal shutdown (for you unix people, this is like a pthread_cond) static HANDLE shutdown_event; #endif +//signal handler for when freeswitch is running in background mode. +//signal triggers the shutdown of freeswitch static void handle_SIGHUP(int sig) { uint32_t arg = 0; if(sig); + //send shutdown signal to the freeswitch core switch_core_session_ctl(SCSC_SHUTDOWN, &arg); return; } - +//kill a freeswitch process running in background mode static int freeswitch_kill_background() { - FILE *f; - char path[256] = ""; - pid_t pid = 0; + 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 + + //set the globals so we can use the global paths. switch_core_set_globals(); + + //get the full path of the pid file. snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, pfile); + + //open the pid file if ((f = fopen(path, "r")) == 0) { + //pid file does not exist fprintf(stderr, "Cannot open pid file %s.\n", path); return 255; } + + //pull the pid from the file fscanf(f, "%d", &pid); + + //if we have a valid pid if (pid > 0) { + + //kill the freeswitch running at the pid we found fprintf(stderr, "Killing: %d\n", (int) pid); #ifdef WIN32 + //for windows we need the event to signal for shutting down a background freewitc snprintf(path, sizeof(path), "Global\\Freeswitch.%d", pid); + + //open the event so we can signal it shutdown_event = OpenEvent(EVENT_MODIFY_STATE, FALSE, path); + + //did we sucessfully open the event if (!shutdown_event) { /* we can't get the event, so we can't signal the process to shutdown */ fprintf(stderr, "ERROR: Can't Shutdown: %d\n", (int) pid); } else { + //signal the event to shutdown SetEvent(shutdown_event); } + //cleanup CloseHandle(shutdown_event); #else + //for unix, send the signal to kill. kill(pid, SIGTERM); #endif } + //be nice and close the file handle to the pid file fclose(f); + return 0; } #ifdef WIN32 + +//we need these vars to handle the service SERVICE_STATUS_HANDLE hStatus; SERVICE_STATUS status; +//Handler function for service start/stop from the service void WINAPI ServiceCtrlHandler( DWORD control ) { - switch( control ) - { - case SERVICE_CONTROL_SHUTDOWN: - case SERVICE_CONTROL_STOP: - // do shutdown stuff here + switch( control ) + { + case SERVICE_CONTROL_SHUTDOWN: + case SERVICE_CONTROL_STOP: + // do shutdown stuff here switch_core_destroy(); - status.dwCurrentState = SERVICE_STOPPED; - status.dwWin32ExitCode = 0; - status.dwCheckPoint = 0; - status.dwWaitHint = 0; - break; - case SERVICE_CONTROL_INTERROGATE: - // just set the current state to whatever it is... - break; - } + status.dwCurrentState = SERVICE_STOPPED; + status.dwWin32ExitCode = 0; + status.dwCheckPoint = 0; + status.dwWaitHint = 0; + break; + case SERVICE_CONTROL_INTERROGATE: + // just set the current state to whatever it is... + break; + } - SetServiceStatus( hStatus, &status ); + SetServiceStatus( hStatus, &status ); } void WINAPI service_main( DWORD numArgs, char **args ) { const char *err = NULL; - // we have to initialize the service-specific stuff - memset( &status, 0, sizeof(SERVICE_STATUS) ); - status.dwServiceType = SERVICE_WIN32; - status.dwCurrentState = SERVICE_START_PENDING; - status.dwControlsAccepted = SERVICE_ACCEPT_STOP; + // we have to initialize the service-specific stuff + memset( &status, 0, sizeof(SERVICE_STATUS) ); + status.dwServiceType = SERVICE_WIN32; + status.dwCurrentState = SERVICE_START_PENDING; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP; - hStatus = RegisterServiceCtrlHandler( SERVICENAME, &ServiceCtrlHandler ); + hStatus = RegisterServiceCtrlHandler( SERVICENAME, &ServiceCtrlHandler ); - SetServiceStatus( hStatus, &status ); + SetServiceStatus( hStatus, &status ); set_high_priority(); if (switch_core_init_and_modload(lfile, &err) != SWITCH_STATUS_SUCCESS) { - status.dwCurrentState = SERVICE_STOPPED; + status.dwCurrentState = SERVICE_STOPPED; } else { status.dwCurrentState = SERVICE_RUNNING; } - SetServiceStatus( hStatus, &status ); + SetServiceStatus( hStatus, &status ); } #endif @@ -153,23 +188,22 @@ int main(int argc, char *argv[]) int x, die = 0; #ifdef WIN32 - SERVICE_TABLE_ENTRY dispatchTable[] = - { - { SERVICENAME, &service_main }, - { NULL, NULL } - }; + SERVICE_TABLE_ENTRY dispatchTable[] = + { + { SERVICENAME, &service_main }, + { NULL, NULL } + }; #endif for (x = 1; x < argc; x++) { #ifdef WIN32 if (x == 1) { if (argv[x] && !strcmp(argv[x], "-service")) { - 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"); - } + 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); } if (argv[x] && !strcmp(argv[x], "-install")) { @@ -180,30 +214,29 @@ int main(int argc, char *argv[]) GetModuleFileName( NULL, exePath, 1024 ); snprintf(servicePath, sizeof(servicePath), "%s -service", exePath); CreateService( - handle, - SERVICENAME, - SERVICENAME, - GENERIC_READ | GENERIC_EXECUTE, - SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, - SERVICE_ERROR_IGNORE, - servicePath, - NULL, - NULL, - NULL, - NULL, - NULL - ); + handle, + SERVICENAME, + SERVICENAME, + GENERIC_READ | GENERIC_EXECUTE, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_AUTO_START, + SERVICE_ERROR_IGNORE, + servicePath, + NULL, + NULL, + NULL, + NULL, + NULL + ); exit(0); } if (argv[x] && !strcmp(argv[x], "-uninstall")) { SC_HANDLE handle = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); SC_HANDLE service = OpenService( handle, SERVICENAME, DELETE ); - if( service != NULL ) - { - // remove the service! - DeleteService( service ); - } + if( service != NULL ) { + // remove the service! + DeleteService( service ); + } exit(0); } } @@ -211,7 +244,7 @@ int main(int argc, char *argv[]) if (argv[x] && !strcmp(argv[x], "-hp")) { set_high_priority(); } - + if (argv[x] && !strcmp(argv[x], "-stop")) { die++; }