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