📄 jk_nt_service.c
字号:
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(SC_HANDLE schService, char *name, char *prp_file){ char tag[1024]; HKEY hk; int rc; /* 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 { char value[2024]; rc = JK_FALSE; strcpy(tag, BASE_REGISTRY_LOCATION); strcat(tag, name); if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, tag, (DWORD)0, KEY_WRITE | KEY_READ, &hk)) { rc = get_registry_config_parameter(hk, IMAGE_NAME, value, sizeof(value)); if(rc) { strcat(value, " "); strcat(value, name); rc = set_registry_config_parameter(hk, IMAGE_NAME, 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", name, name); } } RegCloseKey(hk); } if(!rc) { printf("Error: Failed to update the service command line - %s\n", 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;}static void start_jk_service(char *name){ /* * report the status to the service control manager. */ if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state NO_ERROR, // exit code 3000)) { // wait hint /* * create the event object. The control handler function signals * this event when it receives the "stop" control code. */ hServerStopEvent = CreateEvent(NULL, // no security attributes TRUE, // manual reset event FALSE, // not-signalled NULL); // no name if(hServerStopEvent) { if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state NO_ERROR, // exit code 20000)) { // wait hint HANDLE hTomcat = NULL; 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 0)) { // wait hint HANDLE waitfor[] = { hServerStopEvent, hTomcat}; DWORD dwIndex = WaitForMultipleObjects(2, waitfor, FALSE, INFINITE); switch(dwIndex) { case WAIT_OBJECT_0: /* * Stop order arrived */ ResetEvent(hServerStopEvent); 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(name, (short)shutdown_port, shutdown_protocol, shutdown_secret, hTomcat); } CloseHandle(hServerStopEvent); CloseHandle(hTomcat); } } } } if(hServerStopEvent) { CloseHandle(hServerStopEvent); }}static void stop_jk_service(void){ if(hServerStopEvent) { SetEvent(hServerStopEvent); }}static void AddToMessageLog(char *lpszMsg){ char szMsg[2048]; HANDLE hEventSource; char * lpszStrings[2]; printf("Error: %s\n", lpszMsg); dwErr = GetLastError(); hEventSource = RegisterEventSource(NULL, "Jakrta - Tomcat"); sprintf(szMsg, "%s error: %d", "Jakrta - Tomcat", dwErr); lpszStrings[0] = szMsg; lpszStrings[1] = lpszMsg; if(hEventSource != NULL) { ReportEvent(hEventSource, // handle of event source EVENTLOG_ERROR_TYPE, // event type 0, // event category 0, // event ID NULL, // current user's SID 2, // strings in lpszStrings 0, // no bytes of raw data lpszStrings, // array of error strings NULL); // no raw data DeregisterEventSource(hEventSource); } }//// FUNCTION: GetLastErrorText//// PURPOSE: copies error message text to string//// PARAMETERS:// lpszBuf - destination buffer// dwSize - size of buffer//// RETURN VALUE:// destination buffer//// COMMENTS://char *GetLastErrorText( char *lpszBuf, DWORD dwSize ){ DWORD dwRet; char *lpszTemp = NULL; dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, GetLastError(), LANG_NEUTRAL, (char *)&lpszTemp, 0, NULL); // supplied buffer is not long enough if(!dwRet || ((long)dwSize < (long)dwRet+14)) { lpszBuf[0] = '\0'; } else { lpszTemp[lstrlen(lpszTemp)-2] = '\0'; //remove cr and newline character sprintf(lpszBuf, "%s (0x%x)", lpszTemp, GetLastError()); } if(lpszTemp) { LocalFree((HLOCAL) lpszTemp ); } return lpszBuf;}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, 0, NULL); if(sd >0) { int rc = JK_FALSE; if(strcasecmp(protocol, "catalina") == 0 ) { char len; if( secret==NULL ) secret="SHUTDOWN"; len=strlen( secret ); rc = send(sd, secret, len , 0); if(len == rc) { rc = JK_TRUE; } } else if(!strcasecmp(protocol, "ajp13")) { jk_pool_t pool; jk_msg_buf_t *msg = NULL; jk_pool_atom_t buf[TINY_POOL_SIZE]; jk_open_pool(&pool, buf, sizeof(buf)); msg = jk_b_new(&pool); jk_b_set_buffer_size(msg, 512); 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); if(0 > jk_tcp_socket_sendfull(sd, jk_b_get_buff(msg), jk_b_get_len(msg))) { rc = JK_FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -