From b61da6e5906bfc75968d535ccc1a1f9bfb754e43 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Mon, 12 May 2008 19:05:02 +0000 Subject: [PATCH] add configurable windows service name (FSCORE-122) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8370 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/switch.c | 125 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 89 insertions(+), 36 deletions(-) diff --git a/src/switch.c b/src/switch.c index 00ee1e5a27..534f879126 100644 --- a/src/switch.c +++ b/src/switch.c @@ -44,8 +44,6 @@ #define PIDFILE "freeswitch.pid" static char *pfile = PIDFILE; -/* If we are a windows service, what should we be called */ -#define SERVICENAME "Freeswitch" /* Picky compiler */ #ifdef __ICC @@ -53,6 +51,10 @@ static char *pfile = PIDFILE; #endif #ifdef WIN32 +/* 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]; #include #include @@ -62,7 +64,7 @@ static HANDLE shutdown_event; /* signal handler for when freeswitch is running in background mode. * signal triggers the shutdown of freeswitch - */ +# */ static void handle_SIGTERM(int sig) { int32_t arg = 0; @@ -172,7 +174,7 @@ void WINAPI service_main(DWORD numArgs, char **args) status.dwControlsAccepted = SERVICE_ACCEPT_STOP; /* register our handler for service control messages */ - hStatus = RegisterServiceCtrlHandler(SERVICENAME, &ServiceCtrlHandler); + hStatus = RegisterServiceCtrlHandler(service_name, &ServiceCtrlHandler); /* update the service status */ SetServiceStatus(hStatus, &status); @@ -217,17 +219,10 @@ int main(int argc, char *argv[]) switch_file_t *fd; switch_memory_pool_t *pool = NULL; - -#ifdef WIN32 - SERVICE_TABLE_ENTRY dispatchTable[] = { - {SERVICENAME, &service_main}, - {NULL, NULL} - }; -#endif usageDesc = "these are the optional arguments you can pass to freeswitch\n" #ifdef WIN32 - "\t-service -- start freeswitch as a service, cannot be used if loaded as a console app\n" - "\t-install -- install freeswitch as a service\n" + "\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" #else "\t-nf -- no forking\n" @@ -253,42 +248,100 @@ int main(int argc, char *argv[]) #ifdef WIN32 if (x == 1) { if (argv[x] && !strcmp(argv[x], "-service")) { - known_opt++; - 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"); + /* New installs will always have the service name specified, but keep a default for compat */ + x++; + if (argv[x] && strlen(argv[x])) { + switch_copy_string(service_name, argv[x], SERVICENAME_MAXLEN); + } else { + switch_copy_string(service_name, SERVICENAME_DEFAULT, SERVICENAME_MAXLEN); + } + { /* Attempt to start service */ + SERVICE_TABLE_ENTRY dispatchTable[] = { + {service_name, &service_main}, + {NULL, NULL} + }; + known_opt++; + 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); } - exit(0); } if (argv[x] && !strcmp(argv[x], "-install")) { char exePath[1024]; char servicePath[1024]; - - SC_HANDLE handle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + x++; + if (argv[x] && strlen(argv[x])) { + switch_copy_string(service_name, argv[x], SERVICENAME_MAXLEN); + } else { + switch_copy_string(service_name, SERVICENAME_DEFAULT, SERVICENAME_MAXLEN); + } known_opt++; GetModuleFileName(NULL, exePath, 1024); - snprintf(servicePath, sizeof(servicePath), "%s -service", exePath); - if (!CreateService(handle, - SERVICENAME, - SERVICENAME, - GENERIC_READ | GENERIC_EXECUTE, - SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, servicePath, NULL, NULL, NULL, NULL, NULL)) { - fprintf(stderr, "Error installing freeswitch as a service.\n"); + snprintf(servicePath, sizeof(servicePath), "%s -service %s", exePath, service_name); + { /* Perform service installation */ + 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 = 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, + "NT AUTHORITY\\NetworkService", /* Service start name */ + 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); } - 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); - known_opt++; - if (service != NULL) { - /* remove the service! */ - DeleteService(service); + x++; + if (argv[x] && strlen(argv[x])) { + switch_copy_string(service_name, argv[x], SERVICENAME_MAXLEN); + } else { + switch_copy_string(service_name, SERVICENAME_DEFAULT, SERVICENAME_MAXLEN); + } + { /* Do the uninstallation */ + 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); } - exit(0); } } + #else if (argv[x] && !strcmp(argv[x], "-u")) { x++;