costin 02/03/14 11:17:52 Modified: jk/native/nt_service jk_nt_service.c Log: Patch from WRowe ( modified to match the merged version ). It allows spaces in service names by 'mangling' the internal name. Also use the API to add services instead of editing the registry ( I left the original code as backup ). I'm not sure about deps - are Tcp and Afd required ? ( I have no idea what Afd is :-) Revision Changes Path 1.5 +90 -34 jakarta-tomcat-connectors/jk/native/nt_service/jk_nt_service.c Index: jk_nt_service.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/nt_service/jk_nt_service.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- jk_nt_service.c 14 Mar 2002 17:43:47 -0000 1.4 +++ jk_nt_service.c 14 Mar 2002 19:17:52 -0000 1.5 @@ -59,7 +59,7 @@ * Description: NT System service for Jakarta/Tomcat * * Author: Gal Shachor <[EMAIL PROTECTED]> * * Dave Oxley <[EMAIL PROTECTED]> * - * Version: $Revision: 1.4 $ * + * Version: $Revision: 1.5 $ * ***************************************************************************/ #include "jk_global.h" @@ -143,7 +143,7 @@ DWORD dwWaitHint); static void start_jk_service(char *name); static void stop_jk_service(void); -static int set_registry_values(char *name, +static int set_registry_values(SC_HANDLE schService, char *name, char *prp_file); static int create_registry_key(const char *tag, HKEY *key); @@ -388,6 +388,10 @@ return fResult; } +typedef WINADVAPI BOOL (WINAPI * pfnChangeServiceConfig2_t) + (SC_HANDLE hService, DWORD dwInfoLevel, LPVOID lpInfo); + + void install_service(char *name, char *user, char *password, @@ -399,11 +403,26 @@ SC_HANDLE schSCManager; char szExecPath[2048]; char szPropPath[2048]; + char szTrueName[256]; char *dummy; + char *src, *dst; + + dst = szTrueName; + for (src = name; *src; ++src) { + if (dst >= szTrueName + sizeof(szTrueName) - 1) { + break; + } + if (!isspace(*src) && *src != '/' && *src != '\\') { + *(dst++) = *src; + } + } + *dst = '\0'; if (0 == stricmp("", deps)) deps = NULL; + /* XXX strcat( deps, "Tcpip\0Afd\0" ); */ + if(!GetFullPathName(rel_prp_file, sizeof(szPropPath) - 1, szPropPath, &dummy)) { printf("Unable to install %s - %s\n", name, @@ -418,19 +437,25 @@ return; } - if(GetModuleFileName( NULL, szExecPath, sizeof(szExecPath) - 1) == 0) { + szExecPath[0] = '\"'; + if(GetModuleFileName( NULL, szExecPath + 1, sizeof(szExecPath) - 2) == 0) { + /* Was: if(GetModuleFileName( NULL, szExecPath, sizeof(szExecPath) - 1) == 0) { */ printf("Unable to install %s - %s\n", name, GetLastErrorText(szErr, sizeof(szErr))); return; } + strcat(szExecPath, "\" "); + strcat(szExecPath, szTrueName); + schSCManager = OpenSCManager(NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS); // access required if(schSCManager) { + schService = CreateService(schSCManager, // SCManager database - name, // name of service + szTrueName, // name of service name, // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type @@ -444,9 +469,10 @@ password); // password if(schService) { + printf("The service named %s was created. Now adding registry entries\n", name); - if(set_registry_values(name, szPropPath)) { + if(set_registry_values(schService, szTrueName, szPropPath)) { CloseServiceHandle(schService); } else { printf("CreateService failed setting the private registry - %s\n", GetLastErrorText(szErr, sizeof(szErr))); @@ -467,13 +493,19 @@ { SC_HANDLE schService; SC_HANDLE schSCManager; + char szNameBuff[256]; + DWORD lenNameBuff = 256; + char *szTrueName = name; schSCManager = OpenSCManager(NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS ); // access required if(schSCManager) { - schService = OpenService(schSCManager, name, SERVICE_ALL_ACCESS); + if (GetServiceKeyName(schSCManager, name, szNameBuff, &lenNameBuff)) { + szTrueName = szNameBuff; + } + schService = OpenService(schSCManager, szTrueName, SERVICE_ALL_ACCESS); if(schService) { // try to stop the service @@ -526,8 +558,8 @@ if(schSCManager) { schService = OpenService(schSCManager, name, SERVICE_ALL_ACCESS); - - if(schService) { + + if(schService) { // try to start the service if(StartService(schService, 0, NULL)) { printf("Starting %s.", name); @@ -609,35 +641,24 @@ } } -static int set_registry_values(char *name, +static int set_registry_values(SC_HANDLE schService, char *name, char *prp_file) { char tag[1024]; HKEY hk; int rc; - - strcpy(tag, BASE_REGISTRY_LOCATION); - strcat(tag, name); - strcat(tag, "\\"); - strcat(tag, PARAMS_LOCATION); - - rc = create_registry_key(tag, &hk); - - if(rc) { - rc = set_registry_config_parameter(hk, PRP_LOCATION, prp_file); - if(!rc) { - printf("Error: Can not create value [%s] - %s\n", - PRP_LOCATION, - GetLastErrorText(szErr, sizeof(szErr))); - } - RegCloseKey(hk); + /* Api based */ + HANDLE hAdvApi32; + char *szDescription = "Jakarta Tomcat Server"; + pfnChangeServiceConfig2_t pfnChangeServiceConfig2; + + if((hAdvApi32 = GetModuleHandle("advapi32.dll")) + && ((pfnChangeServiceConfig2 = (pfnChangeServiceConfig2_t) + GetProcAddress(hAdvApi32, "ChangeServiceConfig2A")))) { + (void) pfnChangeServiceConfig2(schService, // Service Handle + 1, // SERVICE_CONFIG_DESCRIPTION + &szDescription); } else { - printf("Error: Can not create key [%s] - %s\n", - tag, - GetLastErrorText(szErr, sizeof(szErr))); - } - - if(rc) { char value[2024]; rc = JK_FALSE; @@ -662,7 +683,8 @@ value); if(rc) { printf("Registry values were added\n"); - printf("If you have already updated wrapper.properties you may start the %s service by executing \"jk_nt_service -s %s\" from the command prompt\n", + printf("If you have already updated wrapper.properties you may start the %s" + "service by executing \"jk_nt_service -s %s\" from the command prompt\n", name, name); } @@ -671,10 +693,30 @@ } if(!rc) { printf("Error: Failed to update the service command line - %s\n", - GetLastErrorText(szErr, sizeof(szErr))); + GetLastErrorText(szErr, sizeof(szErr))); } } + + strcpy(tag, BASE_REGISTRY_LOCATION); + strcat(tag, name); + strcat(tag, "\\"); + strcat(tag, PARAMS_LOCATION); + rc = create_registry_key(tag, &hk); + + if(rc) { + rc = set_registry_config_parameter(hk, PRP_LOCATION, prp_file); + if(!rc) { + printf("Error: Can not create value [%s] - %s\n", + PRP_LOCATION, + GetLastErrorText(szErr, sizeof(szErr))); + } + RegCloseKey(hk); + } else { + printf("Error: Can not create key [%s] - %s\n", + tag, + GetLastErrorText(szErr, sizeof(szErr))); + } return rc; } @@ -701,7 +743,21 @@ NO_ERROR, // exit code 20000)) { // wait hint HANDLE hTomcat = NULL; - int rc = start_tomcat(name, &hTomcat); + char szNameBuff[256]; + DWORD lenNameBuff = 256; + char *szTrueName = name; + SC_HANDLE schSCManager; + int rc; + + schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS ); + if(schSCManager) { + if (GetServiceKeyName(schSCManager, name, szNameBuff, &lenNameBuff)) { + szTrueName = szNameBuff; + } + CloseServiceHandle(schSCManager); + } + + rc = start_tomcat(szTrueName, &hTomcat); if(rc && ReportStatusToSCMgr(SERVICE_RUNNING, // service state NO_ERROR, // exit code
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>