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]>

Reply via email to