You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by jf...@apache.org on 2002/02/16 23:57:51 UTC
cvs commit: jakarta-tomcat-service/native/winnt/moni Makefile vdmonisvc.c
jfclere 02/02/16 14:57:51
Modified: native/winnt/moni Makefile vdmonisvc.c
Log:
Arrange the logic so that is starting on win9x.
Revision Changes Path
1.3 +4 -0 jakarta-tomcat-service/native/winnt/moni/Makefile
Index: Makefile
===================================================================
RCS file: /home/cvs/jakarta-tomcat-service/native/winnt/moni/Makefile,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Makefile 12 Feb 2002 21:55:46 -0000 1.2
+++ Makefile 16 Feb 2002 22:57:51 -0000 1.3
@@ -12,3 +12,7 @@
gcc $(INCLUDE) -c ../supcalls_nt/vdenv.c
kills.o: ../signals/kills.c
gcc $(INCLUDE) -c ../signals/kills.c
+
+install:
+ cp ../bin/vdmoniadm c:/home/jakarta/bin
+ cp ../bin/vdmonisvc c:/home/jakarta/bin
1.4 +155 -44 jakarta-tomcat-service/native/winnt/moni/vdmonisvc.c
Index: vdmonisvc.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-service/native/winnt/moni/vdmonisvc.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- vdmonisvc.c 10 Feb 2002 18:02:12 -0000 1.3
+++ vdmonisvc.c 16 Feb 2002 22:57:51 -0000 1.4
@@ -15,6 +15,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
+#include <time.h>
#ifdef CYGWIN
#else
#include <tchar.h>
@@ -26,7 +27,29 @@
SERVICE_STATUS_HANDLE sshStatusHandle;
DWORD dwErr;
-/* Event logger routines */
+/*
+ * NT/other detection
+ * from src/os/win32/service.c (httpd-1.3!).
+ */
+
+BOOL isWindowsNT(void)
+{
+ static BOOL once = FALSE;
+ static BOOL isNT = FALSE;
+
+ if (!once)
+ {
+ OSVERSIONINFO osver;
+ osver.dwOSVersionInfoSize = sizeof(osver);
+ if (GetVersionEx(&osver))
+ if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ isNT = TRUE;
+ once = TRUE;
+ }
+ return isNT;
+}
+
+/* Event logger routine */
VOID AddToMessageLog(LPTSTR lpszMsg)
{
@@ -39,7 +62,10 @@
// Use event logging to log the error.
//
- hEventSource = RegisterEventSource(NULL, TEXT(SZSERVICENAME));
+ if (isWindowsNT())
+ hEventSource = RegisterEventSource(NULL, TEXT(SZSERVICENAME));
+ else
+ hEventSource = NULL;
#ifdef CYGWIN
sprintf(szMsg, TEXT("%s error: %d"), TEXT(SZSERVICENAME), dwErr);
@@ -61,10 +87,89 @@
NULL); // no raw data
(VOID) DeregisterEventSource(hEventSource);
- }
-}
+ } else {
+ /* Default to a trace file */
+ FILE *log;
+ log = fopen("c:/jakarta-service.log","a+");
+ if (log != NULL) {
+ struct tm *newtime;
+ time_t long_time;
+
+ time( &long_time );
+ newtime = localtime( &long_time );
+
+ fprintf(log,"%.24s:%s: %s\n",asctime(newtime),szMsg, lpszMsg);
+ fclose(log);
+ }
+ }
+}
+/* This group of functions are provided for the service/console app
+ * to register itself a HandlerRoutine to accept tty or service messages
+ * adapted from src/os/win32/Win9xConHook.c (httpd-1.3!).
+ */
+
+/* Exported function that creates a Win9x 'service' via a hidden window,
+ * that notifies the process via the HandlerRoutine messages.
+ */
+BOOL __declspec(dllexport) WINAPI Windows9xServiceCtrlHandler(
+ PHANDLER_ROUTINE phandler,
+ LPCSTR name)
+{
+ HINSTANCE hkernel;
+ DWORD (WINAPI *register_service_process)(DWORD, DWORD) = NULL;
+
+ /* If we have not yet done so */
+ FreeConsole();
+
+ /* Make sure the process will resist logoff */
+ hkernel = LoadLibrary("KERNEL32.DLL");
+ if (!hkernel) {
+ AddToMessageLog(TEXT("LoadLibrary KERNEL32.DLL failed"));
+ return 0;
+ }
+ register_service_process = (DWORD (WINAPI *)(DWORD, DWORD))
+ GetProcAddress(hkernel, "RegisterServiceProcess");
+ if (register_service_process == NULL) {
+ AddToMessageLog(TEXT("dlsym RegisterServiceProcess failed"));
+ return 0;
+ }
+ if (!register_service_process(0,TRUE)) {
+ FreeLibrary(hkernel);
+ AddToMessageLog(TEXT("register_service_process failed"));
+ return 0;
+ }
+ AddToMessageLog(TEXT("jsvc registered as a service"));
+
+ /*
+ * To be handle notice the shutdown, we need a thread and window.
+ */
+/*
+ if (name)
+ {
+ DWORD tid;
+ HANDLE hThread;
+ static tty_info tty; // Must be static, because we are going to return.
+ tty.instance = GetModuleHandle(NULL);
+ tty.phandler = phandler;
+ tty.parent = NULL;
+ tty.name = name;
+ tty.type = 2;
+ RegisterWindows9xService(TRUE);
+ hThread = CreateThread(NULL, 0, ttyConsoleCtrlThread,
+ (LPVOID)&tty, 0, &tid);
+ if (hThread)
+ {
+ CloseHandle(hThread);
+ return TRUE;
+ }
+ }
+ return FALSE;
+ */
+ return TRUE;
+}
+
//
// FUNCTION: ReportStatusToSCMgr()
//
@@ -114,6 +219,19 @@
return fResult;
}
+/*
+ * Report event to the Service Manager
+ */
+int ReportManager(int event)
+{
+ if (isWindowsNT())
+ return(ReportStatusToSCMgr(
+ event, // service state
+ NO_ERROR, // exit code
+ 3000)); // wait hint
+ return(1);
+}
+
// this event is signalled when the
// service should end
//
@@ -156,11 +274,8 @@
// report the status to the service control manager.
//
AddToMessageLog(TEXT("ServiceStart: starting"));
- if (!ReportStatusToSCMgr(
- SERVICE_START_PENDING, // service state
- NO_ERROR, // exit code
- 3000)) // wait hint
- goto cleanup;
+ if (!ReportManager(SERVICE_START_PENDING))
+ goto cleanup;
// create the event object. The control handler function signals
// this event when it receives the "stop" control code.
@@ -176,11 +291,8 @@
// report the status to the service control manager.
//
- if (!ReportStatusToSCMgr(
- SERVICE_START_PENDING, // service state
- NO_ERROR, // exit code
- 3000)) // wait hint
- goto cleanup;
+ if (!ReportManager(SERVICE_START_PENDING))
+ goto cleanup;
// Read the registry and set environment.
if (OnServeSetEnv()) {
@@ -188,57 +300,51 @@
goto cleanup;
}
- if (!ReportStatusToSCMgr(
- SERVICE_START_PENDING, // service state
- NO_ERROR, // exit code
- 3000)) // wait hint
- goto cleanup;
+ if (!ReportManager(SERVICE_START_PENDING))
+ goto cleanup;
// set the start path for jsvc.exe
- qptr = getenv("JAKARTA_HOME");
- if (qptr==NULL || strlen(qptr)==0) {
- AddToMessageLog(TEXT("ServiceStart: read JAKARTA_HOME failed"));
- goto cleanup;
- }
- strcpy(Data,qptr);
+ qptr = getenv("JAKARTA_HOME");
+ if (qptr==NULL || strlen(qptr)==0) {
+ AddToMessageLog(TEXT("ServiceStart: read JAKARTA_HOME failed"));
+ goto cleanup;
+ }
+ strcpy(Data,qptr);
strcat(Data,"\\bin\\jsvc.exe -nodetach");
- strcat(Data," -cp ");
- strcat(Data,qptr);
- strcat(Data,"/lib/service.jar org.apache.service.support.SimpleService");
+ strcat(Data," -cp ");
+ strcat(Data,qptr);
+ strcat(Data,"/lib/service.jar org.apache.service.support.SimpleService");
// create the jsvc process.
AddToMessageLog(TEXT("ServiceStart: start jsvc"));
memset(&StartupInfo,'\0',sizeof(StartupInfo));
StartupInfo.cb = sizeof(STARTUPINFO);
- if (!CreateProcess(NULL,Data,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,
+ if (!CreateProcess(NULL,Data,NULL,NULL,FALSE,
+ DETACHED_PROCESS|NORMAL_PRIORITY_CLASS,
NULL,NULL, &StartupInfo, &ProcessInformation))
goto cleanup;
AddToMessageLog(TEXT("ServiceStart: jsvc started"));
CloseHandle(ProcessInformation.hThread);
ProcessInformation.hThread = NULL;
- if (!ReportStatusToSCMgr(
- SERVICE_START_PENDING, // service state
- NO_ERROR, // exit code
- 3000)) // wait hint
- goto cleanup;
+ if (!ReportManager(SERVICE_START_PENDING))
+ goto cleanup;
// wait until the process is completly created.
- if (!WaitForInputIdle(ProcessInformation.hProcess , INFINITE)) {
+/* With the DETACHED_PROCESS it does not work...
+ if (WaitForInputIdle(ProcessInformation.hProcess , INFINITE)) {
AddToMessageLog(TEXT("ServiceStart: jsvc stopped after creation"));
goto cleanup;
}
+ */
//
- // OnServe monitor is now running.
+ // jsvc is now running.
// report the status to the service control manager.
//
- if (!ReportStatusToSCMgr(
- SERVICE_RUNNING, // service state
- NO_ERROR, // exit code
- 0)) // wait hint
- goto cleanup;
+ if (!ReportManager(SERVICE_RUNNING))
+ goto cleanup;
//
// End of initialization
@@ -458,10 +564,15 @@
{ NULL, NULL }
};
- AddToMessageLog(TEXT("StartService starting"));
- if (!StartServiceCtrlDispatcher(dispatchTable)) {
+ AddToMessageLog(TEXT("StartService starting"));
+ if (isWindowsNT()) {
+ if (!StartServiceCtrlDispatcher(dispatchTable)) {
AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));
return;
- }
+ }
+ } else {
+ Windows9xServiceCtrlHandler(service_ctrl,TEXT(SZSERVICENAME));
+ ServiceStart(argc,argv);
+ }
AddToMessageLog(TEXT("StartService started"));
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>