David,

I believe the J-T-C version of jk_nt_service.c is more out of
sync than just this.  This is why I didn't apply your patch
to the J-T-C version when I applied it to jakarta-tomcat.
It is on my to do list to get them back in sync after
Tomcat 3.3.1 is final.

Cheers,
Larry

> -----Original Message-----
> From: Schreibman, David [mailto:[EMAIL PROTECTED]] 
> Sent: Thursday, March 14, 2002 1:31 PM
> To: 'Tomcat Developers List'
> Subject: RE: cvs commit: 
> jakarta-tomcat-connectors/jk/native/nt_service jk _nt_service.c
> 
> 
> Hi Costin,
> 
> This merge from 3.3 doesn't include the -n option that Larry 
> added 2 weeks ago.  It allows for specifying a display name 
> separately from the service name since the rules for what is 
> a valid name differ in each case.  For example, the display 
> name is allowed to contain spaces while the service name is not.
> 
> Was it left behind on purpose?
> 
> I have a tough time keeping up with all the great stuff 
> you're checking in but I'm trying.
> 
> Thanks,
> 
> -David
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, March 14, 2002 9:44 AM
> To: [EMAIL PROTECTED]
> Subject: cvs commit: jakarta-tomcat-connectors/jk/native/nt_service
> jk_nt_service.c
> 
> 
> costin      02/03/14 09:43:47
> 
>   Modified:    jk/native/nt_service jk_nt_service.c
>   Log:
>   Merged changes from 3.3
>   
>   Addition of stop_cmd, allowing the stop to be done by executing
>   a command. ( catalina shutdown protocol is already supported )
>   
>   Removed some of the checks for settings that are not required.
>   If cmd_line is specified, there is no need for server.xml
>   or other tomcat-specific things.
>   
>   cmd_line, stdout, stderr are required.
>   
>   Revision  Changes    Path
>   1.4       +288 -79
> 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.3
>   retrieving revision 1.4
>   diff -u -r1.3 -r1.4
>   --- jk_nt_service.c 17 Jan 2002 21:17:02 -0000      1.3
>   +++ jk_nt_service.c 14 Mar 2002 17:43:47 -0000      1.4
>   @@ -58,14 +58,14 @@
>  
> /*************************************************************
> **************
>     * Description: NT System service for Jakarta/Tomcat
> *
>     * Author:      Gal Shachor <[EMAIL PROTECTED]>
> *
>   - * Version:     $Revision: 1.3 $
> *
>   + *              Dave Oxley <[EMAIL PROTECTED]>
> *
>   + * Version:     $Revision: 1.4 $
> *
>  
> **************************************************************
> *************/
>    
>    #include "jk_global.h"
>    #include "jk_util.h"
>    #include "jk_ajp13.h"
>    #include "jk_connect.h"
>   -
>    #include <windows.h>
>    #include <stdio.h>
>    #include <stdlib.h>
>   @@ -86,23 +86,39 @@
>    static HANDLE                  hServerStopEvent = NULL;
>    static int                     shutdown_port;
>    static char                    *shutdown_protocol = AJP12_TAG;
>   -static char                    *shutdown_secret = NULL;
>   +static char                    *shutdown_secret = NULL;
>   +static char                    *shutdown_cmd=NULL;
>   +
>   +typedef enum ActionEnum
>   +{   acNoAction  = 0,
>   +    acInstall   = 1,
>   +    acRemove    = 2,
>   +    acStartTC   = 3,
>   +    acStopTC    = 4
>   +}   ActionEnum;
>   +
>    
>    struct jk_tomcat_startup_data {
>   -    char *classpath;
>   -    char *tomcat_home;
>   +    char *cmd_line; /* Start command line */
>        char *stdout_file;
>        char *stderr_file;
>   +    char *extra_path;
>   +    char *tomcat_home;
>        char *java_bin;
>   -    char *tomcat_class;
>   -    char *server_file;
>   -    char *cmd_line;
>   -    int  shutdown_port;
>   +
>        char *shutdown_protocol;
>   +    /* for cmd */
>   +    char *stop_cmd;
>   +    /* For ajp13/ajp12/catalina */
>   +    int  shutdown_port;
>        char *shutdown_secret;
>    
>   -    char *extra_path;
>   +    /* Optional/not needed */
>   +    char *classpath;
>   +    char *tomcat_class;
>   +    char *server_file;
>    };
>   +
>    typedef struct jk_tomcat_startup_data jk_tomcat_startup_data_t;
>    
>    // internal function prototypes
>   @@ -110,8 +126,16 @@
>    static void WINAPI service_main(DWORD dwArgc, 
>                                    char **lpszArgv);
>    static void install_service(char *name, 
>   -                            char *prp_file);
>   +                            char *user, 
>   +                            char *password, 
>   +                            char *deps, 
>   +                            BOOL bAutomatic, 
>   +                            char *rel_prp_file);
>    static void remove_service(char *name);
>   +static void start_service(char *name,
>   +                          char *machine);
>   +static void stop_service(char *name,
>   +                         char *machine);
>    static char *GetLastErrorText(char *lpszBuf, DWORD dwSize);
>    static void AddToMessageLog(char *lpszMsg);
>    static BOOL ReportStatusToSCMgr(DWORD dwCurrentState,
>   @@ -131,34 +155,59 @@
>                                             char *b, DWORD sz);
>    static int start_tomcat(const char *name, 
>                            HANDLE *hTomcat);
>   -static void stop_tomcat(short port, 
>   +static void stop_tomcat(char *name,
>   +                        short port, 
>                            const char *protocol,
>   -                                           char *secret,
>   -                        HANDLE hTomcat);
>   +                        char *secret,
>   +                        HANDLE hTomcat);
>    static int read_startup_data(jk_map_t *init_map, 
>                                 jk_tomcat_startup_data_t *data, 
>                                 jk_pool_t *p);
>   -
>   +static int exec_cmd(const char *name, HANDLE *hTomcat, 
> char *cmdLine);
>    
>    static void usage_message(const char *name)
>    {
>   -    printf("%s - Usage:\n", name);
>   -    printf("%s -i <service name> <configuration properties 
> file>\n",
> name);
>   -    printf("\tto install the service\n");
>   -    printf("%s -r <service name>\n", name);    
>   -    printf("\tto remove the service\n");
>   +    printf("%s - Usage:\n\n", name);
>   +    printf("To install the service:\n");
>   +    printf("%s -i <service name> {optional params} <config 
> properties
> file>\n", name);
>   +    printf("    Optional parameters\n");
>   +    printf("        -u <user name> - In the form 
> DomainName\\UserName
> (.\\UserName for local)\n");
>   +    printf("        -p <user password>\n");
>   +    printf("        -a - Set startup type to automatic\n");
>   +    printf("        -d <service dependency> - Can be 
> entered multiple
> times\n\n");
>   +    printf("To remove the service:\n");
>   +    printf("%s -r <service name>\n\n", name);
>   +    printf("To start the service:\n");
>   +    printf("%s -s <service name> {optional params}\n", name);
>   +    printf("    Optional parameters\n");
>   +    printf("        -m <machine>\n\n");
>   +    printf("To stop the service:\n");
>   +    printf("%s -t <service name> {optional params}\n", name);
>   +    printf("    Optional parameters\n");
>   +    printf("        -m <machine>\n");
>    }
>    
>    void main(int argc, char **argv)
>    {
>        WORD wVersionRequested;
>        WSADATA wsaData;
>   -    int err; 
>   -        
>   +    int i;
>   +    int err;
>   +    int count;
>   +    int iAction = acNoAction;
>   +    char *pServiceName = NULL;
>   +    char *pUserName = NULL;
>   +    char *pPassword = NULL;
>   +    char *pMachine = NULL;
>   +    BOOL bAutomatic = FALSE;
>   +    char strDependancy[256] = "";
>   +
>   +    memset(strDependancy, 0, 255);
>   +
>        wVersionRequested = MAKEWORD(1, 1); 
>        err = WSAStartup(wVersionRequested, &wsaData);
>        if(0 != err) {
>   -        fprintf(stderr, "Error connecting to winosck");
>   +        fprintf(stderr, "Error connecting to winsock");
>            return;
>        } 
>    
>   @@ -175,20 +224,51 @@
>                        LOBYTE(wsaData.wVersion),
>                        HIBYTE(wsaData.wVersion));
>    
>   -
>        __try {
>   -        if((argc > 2) && ((*argv[1] == '-') || (*argv[1] 
> == '/'))) {
>   -            char *cmd = argv[1];
>   -            cmd++;
>   -            if(0 == stricmp("i", cmd) && (4 == argc)) {
>   -                install_service(argv[2], argv[3]);
>   +        if(argc > 2) {
>   +            count=0;
>   +            for (i=1;i<argc;i++) {
>   +                if ((*argv[i] == '-') || (*argv[i] == '/')) {
>   +                    char *cmd = argv[i];
>   +                    cmd++;
>   +                    if(0 == stricmp("i", cmd)) {
>   +                        iAction = acInstall;
>   +                        pServiceName = argv[i+1];
>   +                    } else if(0 == stricmp("r", cmd)) {
>   +                        iAction = acRemove;
>   +                        pServiceName = argv[i+1];
>   +                    } else if(0 == stricmp("s", cmd)) {
>   +                        iAction = acStartTC;
>   +                        pServiceName = argv[i+1];
>   +                    } else if(0 == stricmp("t", cmd)) {
>   +                        iAction = acStopTC;
>   +                        pServiceName = argv[i+1];
>   +                    } else if(0 == stricmp("u", cmd)) {
>   +                        pUserName = argv[i+1];
>   +                    } else if(0 == stricmp("p", cmd)) {
>   +                        pPassword = argv[i+1];
>   +                    } else if(0 == stricmp("m", cmd)) {
>   +                        pMachine = argv[i+1];
>   +                    } else if(0 == stricmp("a", cmd)) {
>   +                        bAutomatic = TRUE;
>   +                    } else if(0 == stricmp("d", cmd)) {
>   +                        memcpy(strDependancy+count, argv[i+1],
> strlen(argv[i+1]));
>   +                        count+= strlen(argv[i+1])+1;
>   +                    }
>   +                }
>   +            }
>   +            switch (iAction) {
>   +            case acInstall:
>   +                install_service(pServiceName, pUserName, pPassword,
> strDependancy, bAutomatic, argv[i-1]);
>                    return;
>   -            } else if(0 == stricmp("r", cmd) && (3 == argc)) {
>   -                remove_service(argv[2]);
>   +            case acRemove:
>   +                remove_service(pServiceName);
>                    return;
>   -            } else if(0 == stricmp("s", cmd) && (3 == argc)) {
>   -                HANDLE hTomcat;
>   -                start_tomcat(argv[2], &hTomcat);
>   +            case acStartTC:
>   +                start_service(pServiceName, pMachine);
>   +                return;
>   +            case acStopTC:
>   +                stop_service(pServiceName, pMachine);
>                    return;
>                }
>            } else if(2  == argc) {
>   @@ -309,6 +389,10 @@
>    }
>    
>    void install_service(char *name, 
>   +                     char *user, 
>   +                     char *password, 
>   +                     char *deps, 
>   +                     BOOL bAutomatic,
>                         char *rel_prp_file)
>    {
>        SC_HANDLE   schService;
>   @@ -317,6 +401,9 @@
>        char        szPropPath[2048];
>        char        *dummy;
>    
>   +    if (0 == stricmp("", deps))
>   +        deps = NULL;
>   +
>        if(!GetFullPathName(rel_prp_file, sizeof(szPropPath) - 
> 1, szPropPath,
> &dummy)) {
>            printf("Unable to install %s - %s\n", 
>                   name, 
>   @@ -338,8 +425,8 @@
>            return;
>        }
>    
>   -    schSCManager = OpenSCManager(NULL,  // machine (NULL == local)
>   -                                 NULL,  // database (NULL 
> == default)
>   +    schSCManager = OpenSCManager(NULL,     // machine 
> (NULL == local)
>   +                                 NULL,     // database 
> (NULL == default)
>                                     SC_MANAGER_ALL_ACCESS);   
> // access
> required                       
>        if(schSCManager) {
>            schService = CreateService(schSCManager, // 
> SCManager database
>   @@ -347,14 +434,14 @@
>                                       name,         // name to display
>                                       SERVICE_ALL_ACCESS, // 
> desired access
>                                       
> SERVICE_WIN32_OWN_PROCESS,  // service type
>   -                                   SERVICE_DEMAND_START,   
>     // start
> type
>   +                                   bAutomatic ? 
> SERVICE_AUTO_START :
> SERVICE_DEMAND_START,       // start type
>                                       SERVICE_ERROR_NORMAL,   
>     // error
> control type
>                                       szExecPath,                 //
> service's binary
>                                       NULL,                   
>     // no load
> ordering group
>                                       NULL,                   
>     // no tag
> identifier
>   -                                   NULL,                       //
> dependencies
>   -                                   NULL,                       //
> LocalSystem account
>   -                                   NULL);                  
>     // no
> password
>   +                                   deps,                       //
> dependencies
>   +                                   user,                   
>     // account
>   +                                   password);                  //
> password
>    
>            if(schService) {
>                printf("The service named %s was created. Now 
> adding registry entries\n", name);
>   @@ -428,6 +515,100 @@
>        }
>    }
>    
>   +void start_service(char *name, char *machine)
>   +{
>   +    SC_HANDLE   schService;
>   +    SC_HANDLE   schSCManager;
>   +
>   +    schSCManager = OpenSCManager(machine,  // machine 
> (NULL == local)
>   +                                 NULL,     // database 
> (NULL == default)
>   +                                 SC_MANAGER_ALL_ACCESS);   
> // access
> required                       
>   +
>   +    if(schSCManager) {
>   +        schService = OpenService(schSCManager, name, 
> SERVICE_ALL_ACCESS);
>   +
>   +        if(schService) {
>   +            // try to start the service
>   +            if(StartService(schService, 0, NULL)) {
>   +                printf("Starting %s.", name);
>   +                Sleep(1000);
>   +
>   +                while(QueryServiceStatus(schService, &ssStatus )) {
>   +                    if(ssStatus.dwCurrentState == 
> SERVICE_START_PENDING)
> {
>   +                        printf(".");
>   +                        Sleep(1000);
>   +                    } else {
>   +                        break;
>   +                    }
>   +                }
>   +
>   +                if(ssStatus.dwCurrentState == SERVICE_RUNNING) {
>   +                    printf("\n%s started.\n", name);
>   +                } else {
>   +                    printf("\n%s failed to start.\n", name);
>   +                }
>   +            }
>   +            else
>   +                printf("StartService failed - %s\n",
> GetLastErrorText(szErr, sizeof(szErr)));
>   +
>   +            CloseServiceHandle(schService);
>   +        } else {
>   +            printf("OpenService failed - %s\n", 
> GetLastErrorText(szErr,
> sizeof(szErr)));
>   +        }
>   +
>   +        CloseServiceHandle(schSCManager);
>   +    } else {
>   +        printf("OpenSCManager failed - %s\n", 
> GetLastErrorText(szErr,
> sizeof(szErr)));
>   +    }
>   +}
>   +
>   +void stop_service(char *name, char *machine)
>   +{
>   +    SC_HANDLE   schService;
>   +    SC_HANDLE   schSCManager;
>   +
>   +    schSCManager = OpenSCManager(machine,  // machine 
> (NULL == local)
>   +                                 NULL,     // database 
> (NULL == default)
>   +                                 SC_MANAGER_ALL_ACCESS);   
> // access
> required                       
>   +
>   +    if(schSCManager) {
>   +        schService = OpenService(schSCManager, name, 
> SERVICE_ALL_ACCESS);
>   +
>   +        if(schService) {
>   +            // try to stop the service
>   +            if(ControlService( schService, SERVICE_CONTROL_STOP,
> &ssStatus )) {
>   +                printf("Stopping %s.", name);
>   +                Sleep(1000);
>   +
>   +                while(QueryServiceStatus(schService, &ssStatus )) {
>   +                    if(ssStatus.dwCurrentState == 
> SERVICE_STOP_PENDING) {
>   +                        printf(".");
>   +                        Sleep(1000);
>   +                    } else {
>   +                        break;
>   +                    }
>   +                }
>   +
>   +                if(ssStatus.dwCurrentState == SERVICE_STOPPED) {
>   +                    printf("\n%s stopped.\n", name);
>   +                } else {
>   +                    printf("\n%s failed to stop.\n", name);
>   +                }
>   +            }
>   +            else
>   +                printf("StopService failed - %s\n",
> GetLastErrorText(szErr, sizeof(szErr)));
>   +
>   +            CloseServiceHandle(schService);
>   +        } else {
>   +            printf("OpenService failed - %s\n", 
> GetLastErrorText(szErr,
> sizeof(szErr)));
>   +        }
>   +
>   +        CloseServiceHandle(schSCManager);
>   +    } else {
>   +        printf("OpenSCManager failed - %s\n", 
> GetLastErrorText(szErr,
> sizeof(szErr)));
>   +    }
>   +}
>   +
>    static int set_registry_values(char *name, 
>                                   char *prp_file)
>    {
>   @@ -481,7 +662,7 @@
>                                                       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 
> \"net start %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);                    
>                    }
>   @@ -534,20 +715,25 @@
>                             * Stop order arrived 
>                             */ 
>                            ResetEvent(hServerStopEvent);
>   -                        stop_tomcat((short)shutdown_port,
> shutdown_protocol,
>   +                        stop_tomcat(name, (short)shutdown_port,
> shutdown_protocol,
>                                        shutdown_secret, hTomcat);
>                            break;
>                        case (WAIT_OBJECT_0 + 1):
>                            /* 
>                             * Tomcat died !!!
>                             */ 
>   +                        CloseHandle(hServerStopEvent);
>   +                        CloseHandle(hTomcat);
>   +                        exit(0); // exit ungracefully so
>   +                                 // Service Control Manager 
>   +                                 // will attempt a restart.
>                            break;
>                        default:
>                            /* 
>                             * some error... 
>                             * close the servlet container and exit 
>                             */ 
>   -                        stop_tomcat((short)shutdown_port,
> shutdown_protocol,
>   +                        stop_tomcat(name, (short)shutdown_port,
> shutdown_protocol,
>                                        shutdown_secret, hTomcat);
>                        }
>                        CloseHandle(hServerStopEvent);
>   @@ -644,17 +830,26 @@
>        return lpszBuf;
>    }
>    
>   -static void stop_tomcat(short port, 
>   +static void stop_tomcat(char *name,
>   +                        short port, 
>                            const char *protocol,
>                            char *secret,
>                            HANDLE hTomcat)
>    {
>        struct sockaddr_in in;
>   +
>   +    if(strcasecmp(protocol, "cmd") == 0 ) {
>   +        exec_cmd( name, hTomcat, shutdown_cmd);
>   +        /* XXX sleep 100 */
>   +        TerminateProcess(hTomcat, 0);
>   +        return;
>   +    } 
>        
>        if(jk_resolve("localhost", port, &in)) {
>            int sd = jk_open_socket(&in, JK_TRUE, NULL);
>            if(sd >0) {
>                int rc = JK_FALSE;
>   +
>                if(strcasecmp(protocol, "catalina") == 0 ) {
>                    char len;
>                    
>   @@ -679,6 +874,11 @@
>                    rc = ajp13_marshal_shutdown_into_msgb(msg, 
>                                                          &pool,
>                                                          NULL);
>   +                if( secret!=NULL ) {
>   +                    /** will work with old clients, as well as new
>   +                     */
>   +                    rc = jk_b_append_string(msg, secret);
>   +                }
>                    if(rc) {
>                        jk_b_end(msg, AJP13_PROTO);
>        
>   @@ -707,7 +907,7 @@
>        TerminateProcess(hTomcat, 0);    
>    }
>    
>   -static int start_tomcat(const char *name, HANDLE *hTomcat)
>   +static int exec_cmd(const char *name, HANDLE *hTomcat, 
> char *cmdLine)
>    {
>        char  tag[1024];
>        HKEY  hk;
>   @@ -774,10 +974,13 @@
>                                           FILE_END);
>    
>                            memset(&processInformation, 0, 
> sizeof(processInformation));
>   -                        
>   -                        printf(data.cmd_line);
>   +                        
>   +                                           if( cmdLine==NULL ) 
>   +
> cmdLine=data.cmd_line;
>   +
>   +                        printf(cmdLine);
>                            if(CreateProcess(data.java_bin,
>   -                                        data.cmd_line,
>   +                                        cmdLine,
>                                            NULL,
>                                            NULL,
>                                            TRUE,
>   @@ -791,9 +994,11 @@
>                                
> CloseHandle(processInformation.hThread);
>                                CloseHandle(startupInfo.hStdOutput);
>                                CloseHandle(startupInfo.hStdError);
>   +
>                                shutdown_port = data.shutdown_port;
>                                shutdown_secret = data.shutdown_secret;
>   -                            shutdown_protocol =
> strdup(data.shutdown_protocol);
>   +                            shutdown_protocol =
> strdup(data.shutdown_protocol);
>   +                                                   shutdown_cmd =
> strdup(data.stop_cmd);
>    
>                                return JK_TRUE;
>                            } else {
>   @@ -812,18 +1017,23 @@
>        return JK_FALSE;
>    }
>    
>   +static int start_tomcat(const char *name, HANDLE *hTomcat)
>   +{
>   +    return exec_cmd( name, hTomcat, NULL );
>   +}
>   +
>    static int create_registry_key(const char *tag,
>                                   HKEY *key)
>    {
>        LONG  lrc = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
>                                   tag,
>   -                                      0,
>   -                                      NULL,
>   -                                      REG_OPTION_NON_VOLATILE,
>   -                                      KEY_WRITE,
>   -                                      NULL,
>   -                                      key,
>   -                                      NULL);
>   +                               0,
>   +                               NULL,
>   +                               REG_OPTION_NON_VOLATILE,
>   +                               KEY_WRITE,
>   +                               NULL,
>   +                               key,
>   +                               NULL);
>        if(ERROR_SUCCESS != lrc) {
>            return JK_FALSE;        
>        }
>   @@ -839,9 +1049,9 @@
>    
>        lrc = RegSetValueEx(hkey, 
>                            tag,            
>   -                               0,              
>   -                               REG_SZ,  
>   -                                   value, 
>   +                        0,              
>   +                        REG_SZ,  
>   +                        value, 
>                            strlen(value));
>    
>        if(ERROR_SUCCESS != lrc) {
>   @@ -890,45 +1100,40 @@
>        data->tomcat_class = NULL;
>        data->server_file = NULL;
>    
>   +    /* All this is wrong - you just need to configure cmd_line */
>   +    /* Optional - you may have cmd_line defined */
>        data->server_file = map_get_string(init_map, 
>                                           "wrapper.server_xml", 
>                                           NULL);
>   -    if(!data->server_file) {
>   -        return JK_FALSE;
>   -    }
>   -
>        data->classpath = map_get_string(init_map, 
>                                         "wrapper.class_path", 
>                                           NULL);
>   -    if(!data->classpath) {
>   -        return JK_FALSE;
>   -    }
>   -
>        data->tomcat_home = map_get_string(init_map, 
>                                           "wrapper.tomcat_home", 
>                                           NULL);
>   -    if(!data->tomcat_home) {
>   -        return JK_FALSE;
>   -    }
>   -
>        data->java_bin = map_get_string(init_map, 
>                                        "wrapper.javabin", 
>                                        NULL);
>   -    if(!data->java_bin) {
>   -        return JK_FALSE;
>   -    }
>   -
>        data->tomcat_class = map_get_string(init_map,
>                                            "wrapper.startup_class",
>  
> "org.apache.tomcat.startup.Tomcat");
>    
>   -    if(NULL == data->tomcat_class) {
>   -        return JK_FALSE;
>   -    }
>   -
>        data->cmd_line = map_get_string(init_map,
>                                        "wrapper.cmd_line",
>                                        NULL);
>   +
>   +    data->stop_cmd = map_get_string(init_map,
>   +                                    "wrapper.stop_cmd",
>   +                                    NULL);
>   +
>   +    if(NULL == data->cmd_line &&
>   +       ( (NULL == data->tomcat_class) ||
>   +         (NULL == data->server_file) ||
>   +         (NULL == data->tomcat_home) ||
>   +         (NULL == data->java_bin) )) {
>   +       return JK_FALSE;
>   +    }
>   +
>        if(NULL == data->cmd_line) {
>            data->cmd_line = (char *)jk_pool_alloc(p, (20 + 
>                                                       
> strlen(data->java_bin)
> +
>   @@ -974,6 +1179,10 @@
>                                           "wrapper.stdout",
>                                           NULL);
>    
>   +    if(NULL == data->stdout_file && NULL == data->tomcat_home ) {
>   +        return JK_FALSE;
>   +    }
>   +    
>        if(NULL == data->stdout_file) {
>            data->stdout_file = jk_pool_alloc(p, 
> strlen(data->tomcat_home) + 2 + strlen("\\stdout.log"));
>            strcpy(data->stdout_file, data->tomcat_home);
>   
>   
>   
> 
> --
> To unsubscribe, e-mail:   
> <mailto:tomcat-dev-> [EMAIL PROTECTED]>
> For 
> additional commands, 
> e-mail: <mailto:[EMAIL PROTECTED]>
> 
> --
> To unsubscribe, e-mail:   
> <mailto:tomcat-dev-> [EMAIL PROTECTED]>
> For 
> additional commands, 
> e-mail: <mailto:[EMAIL PROTECTED]>
> 

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to