commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mt...@apache.org
Subject svn commit: r980662 [3/15] - in /commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3: ./ src/ src/assembly/ src/docs/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/commons/ src/java/org/apache/commons/daemon/ src/java/org/apache/comm...
Date Fri, 30 Jul 2010 06:50:16 GMT
Added: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/lib/moni_inst.h
URL: http://svn.apache.org/viewvc/commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/lib/moni_inst.h?rev=980662&view=auto
==============================================================================
--- commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/lib/moni_inst.h (added)
+++ commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/lib/moni_inst.h Fri Jul 30 06:50:12 2010
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/*
+ * include for the service installation
+ */
+#define SZAPPNAME               "JavaService"
+#define SZSERVICENAME           "jsvc" // name of service
+#define SZDEPENDENCIES          ""
+#define SZSERVICEDISPLAYNAME    "Java Service" // name to display
+#define SZKEY_ONSERVE           "SOFTWARE\\apache\\jakarta\\1.0"
+#define SZKEY_ONSERVEARG        "SOFTWARE\\apache\\jakarta\\1.0\\arguments"
+#define SZKEY_F_DIR             "F_DIR"
+#define SZDEFMONISVCPATH        "\\vdmonisvc.exe"
+#define SZCYGWINPATH            "c:\\gnu"
+#define SZJAKARTA_HOME          "c:\\home\\jakarta"
+#define SZJAVA_HOME             "c:\\jdk1.3.1"

Propchange: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/lib/moni_inst.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/Makefile
URL: http://svn.apache.org/viewvc/commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/Makefile?rev=980662&view=auto
==============================================================================
--- commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/Makefile (added)
+++ commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/Makefile Fri Jul 30 06:50:12 2010
@@ -0,0 +1,33 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+INCLUDE=-I../lib
+BIN=../../../../dist
+all: $(BIN)/vdmoniadm $(BIN)/vdmonisvc
+
+$(BIN)/vdmoniadm: vdmoniadm.c
+	gcc $(INCLUDE) -I../executables/vdmoniadm  vdmoniadm.c \
+	-o $(BIN)/vdmoniadm -lgdi32
+$(BIN)/vdmonisvc: vdmonisvc.c vdenv.o kills.o
+	gcc -mno-cygwin -I/usr/include $(INCLUDE) -I../executables/vdmonisvc \
+	-DCYGWIN vdmonisvc.c \
+	-o $(BIN)/vdmonisvc vdenv.o kills.o
+vdenv.o: ../supcalls_nt/vdenv.c
+	gcc $(INCLUDE) -c ../supcalls_nt/vdenv.c
+kills.o: ../signals/kills.c
+	gcc $(INCLUDE) -c ../signals/kills.c
+clean:
+	rm -f vdenv.o kills.o 

Propchange: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/Makefile
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmoniadm.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmoniadm.c?rev=980662&view=auto
==============================================================================
--- commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmoniadm.c (added)
+++ commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmoniadm.c Fri Jul 30 06:50:12 2010
@@ -0,0 +1,595 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/* @version $Id: vdmoniadm.c 909069 2010-02-11 16:43:36Z mturk $ */
+
+#include <windows.h>       /* required for all Windows applications */
+#include <stdio.h>         /* for sprintf                           */
+#include <io.h>                                                               
+#include <fcntl.h>
+#include <shellapi.h>
+#include <winuser.h> 
+
+#include "resource.h"
+#include "moni_inst.h"                                                            
+                                                                              
+
+
+#define WINWIDTH  680
+#define WINHEIGHT 460
+
+#define CLASSMAIN
+#define VM_ICON_MESS    WM_USER+1
+#define VM_ID_TIMER     WM_USER+2
+#define VM_START_ICON   WM_USER+3
+#define VM_ID_TIMER1    WM_USER+4
+#define VM_ID_TIMER2    WM_USER+5
+
+BOOL InitApplication(HANDLE hInstance);
+
+HANDLE hInst;        /* current instance */
+SC_HANDLE hManager=NULL;                                     
+SC_HANDLE hService=NULL;
+int optmode;        /* start, stop or check. */
+int flagdown = 0;
+
+#define VDMONISTART 0
+#define VDMONISTOP  1
+#define VDMONICHECK 2
+
+#define NORMALWINDOW WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX
+#define ICONWINDOW   WS_CAPTION|WS_POPUPWINDOW|WS_MINIMIZEBOX|WS_MAXIMIZEBOX                                     
+
+
+/* display a message read from resources */
+
+static void DisplayMess(HWND hDlg,int item)                                            
+{                                                                               
+char MessBox[256];                                                              
+                                                                                
+  if (LoadString(hInst,item,MessBox,sizeof(MessBox)))                         
+    MessageBox(hDlg, MessBox,"ERROR" , MB_OK);                                  
+  else {                                                                        
+    sprintf(MessBox,"ERROR %d",item);                                           
+    MessageBox(hDlg, MessBox,"ERROR" , MB_OK);                                  
+    }                                                                           
+}
+/*
+ * MyTaskBarAddIcon - adds an icon to the taskbar status area. 
+ * Returns TRUE if successful or FALSE otherwise. 
+ * hwnd - handle of the window to receive callback messages 
+ * uID - identifier of the icon 
+ * hicon - handle of the icon to add 
+ * lpszTip - ToolTip text 
+ */
+BOOL MyTaskBarAddIcon(HWND hWnd)
+{ 
+    BOOL res; 
+    NOTIFYICONDATA  notifyicondata;
+    HICON hicon;
+ 
+    notifyicondata.cbSize=sizeof(notifyicondata); 
+    notifyicondata.hWnd=hWnd; 
+    notifyicondata.uID=ID_TASKICON; 
+    notifyicondata.uFlags= NIF_ICON|NIF_MESSAGE|NIF_TIP; 
+    notifyicondata.uCallbackMessage=VM_ICON_MESS;
+    hicon = LoadIcon(hInst,"OnServe");
+    notifyicondata.hIcon = hicon;
+    strcpy(notifyicondata.szTip,"Jakarta Service");
+
+
+    res = Shell_NotifyIcon(NIM_ADD,&notifyicondata);
+ 
+    if (hicon) 
+        DestroyIcon(hicon); 
+ 
+    return res; 
+} 
+/*  
+ * MyTaskBarDeleteIcon - deletes an icon from the taskbar 
+ *     status area. 
+ * Returns TRUE if successful or FALSE otherwise. 
+ * hwnd - handle of the window that added the icon 
+ * uID - identifier of the icon to delete 
+ */
+BOOL MyTaskBarDeleteIcon(HWND hwnd) 
+{ 
+    BOOL res; 
+    NOTIFYICONDATA tnid; 
+ 
+    tnid.cbSize = sizeof(NOTIFYICONDATA); 
+    tnid.hWnd = hwnd; 
+    tnid.uID = ID_TASKICON; 
+         
+    res = Shell_NotifyIcon(NIM_DELETE, &tnid); 
+    return res; 
+}
+
+/* start the vdcom process */
+void StartVdcom(HWND hDlg)
+{
+STARTUPINFO StartupInfo;                                                        
+PROCESS_INFORMATION ProcessInformation;
+                                     
+  memset(&StartupInfo,'\0',sizeof(StartupInfo));                                
+  StartupInfo.cb = sizeof(STARTUPINFO);                                         
+   
+  if (!CreateProcess(NULL,"vdcom.exe",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,      
+         NULL,NULL, &StartupInfo, &ProcessInformation)) {
+      DisplayMess(hDlg,CANNOT_START_VDCOM);
+      return;
+     }
+  /* the handle to the process */
+  CloseHandle(ProcessInformation.hProcess); 
+  CloseHandle(ProcessInformation.hThread);
+}
+/* start the vdconf process */
+void StartVdconf(HWND hDlg)
+{
+STARTUPINFO StartupInfo;                                                        
+PROCESS_INFORMATION ProcessInformation;
+                                     
+  memset(&StartupInfo,'\0',sizeof(StartupInfo));                                
+  StartupInfo.cb = sizeof(STARTUPINFO);                                         
+   
+  if (!CreateProcess(NULL,"vdconf.exe",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,      
+         NULL,NULL, &StartupInfo, &ProcessInformation)) {
+      DisplayMess(hDlg,CANNOT_START_VDCONF);
+      return;
+     }
+  /* the handle to the process */
+  CloseHandle(ProcessInformation.hProcess); 
+  CloseHandle(ProcessInformation.hThread);
+}
+
+/* test if service is running */
+BOOL IsRunning(HWND hDlg)
+{
+  SERVICE_STATUS  svcStatus;
+
+    if (!QueryServiceStatus(hService, &svcStatus)) {
+        DisplayMess(hDlg,ERROR_STATUS);
+        PostQuitMessage(0);
+        return(FALSE);
+    }
+    else {
+        if (SERVICE_RUNNING == svcStatus.dwCurrentState)
+            return(TRUE);
+    }
+    return(FALSE);
+
+}
+/* test if service is stoppped */
+BOOL IsStopped(HWND hDlg)
+{
+  SERVICE_STATUS  svcStatus;
+
+    if (!QueryServiceStatus(hService, &svcStatus)) {
+        DisplayMess(hDlg,ERROR_STATUS);
+        PostQuitMessage(0);
+        return(FALSE);
+    }
+    else {
+        if (SERVICE_STOPPED == svcStatus.dwCurrentState)
+            return(TRUE);
+    }
+    return(FALSE);
+
+}
+/* Yes/No dialog box */
+BOOL CALLBACK StopYesNo(
+        HWND hDlg,                /* window handle of the dialog box */
+        UINT message,             /* type of message                 */
+        WPARAM wParam,            /* message-specific information    */
+        LPARAM lParam)
+{
+    SERVICE_STATUS  svcStatus;
+    
+    switch (message) {
+    case WM_COMMAND:                     /* message: received a command */
+        if (LOWORD(wParam) == IDOK) {     /* "OK" box selected */
+            if (!IsStopped(hDlg)) {
+                ControlService(hService, SERVICE_CONTROL_STOP, &svcStatus);
+                EndDialog(hDlg, TRUE);
+            }
+            else
+                EndDialog(hDlg, FALSE);
+        }
+        if (LOWORD(wParam) == IDCANCEL)
+            EndDialog(hDlg, FALSE);
+        return(TRUE);
+    } /* End switch message */
+    return (FALSE);                            /* Didn't process a message    */
+    UNREFERENCED_PARAMETER(lParam);
+}
+/* Please wait stopping dialog box */
+BOOL CALLBACK PleaseWait(
+        HWND hDlg,                /* window handle of the dialog box */
+        UINT message,             /* type of message                 */
+        WPARAM wParam,            /* message-specific information    */
+        LPARAM lParam)
+{
+    
+    switch (message) {
+    case WM_INITDIALOG:
+        SetTimer(hDlg,VM_ID_TIMER2,5000,NULL); /* wait 5 seconds. */
+    case WM_COMMAND:                     /* message: received a command */
+        if (LOWORD(wParam) == IDCANCEL)
+            EndDialog(hDlg, FALSE);
+        return(TRUE);
+    case WM_TIMER:
+        if(IsStopped(hDlg))
+            EndDialog(hDlg, TRUE);
+        else
+            SetTimer(hDlg,VM_ID_TIMER2,5000,NULL); /* wait 5 seconds. */
+        return(TRUE);
+    } /* End switch message */
+    return (FALSE);                            /* Didn't process a message    */
+    UNREFERENCED_PARAMETER(lParam);
+}
+BOOL CALLBACK StartYesNo(
+        HWND hDlg,                /* window handle of the dialog box */
+        UINT message,             /* type of message                 */
+        WPARAM wParam,            /* message-specific information    */
+        LPARAM lParam)
+{
+
+    switch (message) {
+    case WM_INITDIALOG:
+        if (!StartService(hService,0,NULL)) {
+            DisplayMess(hDlg,CANNOT_START);
+            PostQuitMessage(0);
+        }
+        /* test if running, if not set a timer. */
+        /* wait until service is start */
+        if (IsRunning(hDlg)) 
+            EndDialog(hDlg, TRUE);
+        else
+            SetTimer(hDlg,VM_ID_TIMER1,5000,NULL); /* wait 5 seconds. */
+        return(TRUE);
+        
+    case WM_TIMER:
+        if(IsRunning(hDlg))
+            EndDialog(hDlg, TRUE);
+        else
+            SetTimer(hDlg,VM_ID_TIMER1,5000,NULL); /* wait 5 seconds. */
+        return(TRUE);
+        
+    case WM_COMMAND:                    /* message: received a command */
+        if (LOWORD(wParam) == IDCANCEL) {
+            if (IsRunning(hDlg)) 
+                EndDialog(hDlg, TRUE);
+            else
+                PostQuitMessage(0);
+        }
+        return(TRUE);
+        
+    } /* End switch message */
+    return (FALSE);                            /* Didn't process a message    */
+    UNREFERENCED_PARAMETER(lParam);
+}
+
+/* Display the menu */
+
+void ShowMenu(HWND hWnd)
+{
+   HMENU hMenu,hMenu1;
+   POINT point;
+
+   hMenu = LoadMenu(hInst,"MENU");
+   SetMenu(hWnd,hMenu);
+   hMenu1 = GetSubMenu(hMenu,0);
+
+   GetCursorPos(&point);
+
+   SetForegroundWindow(hWnd); /* MS bug. */
+   TrackPopupMenuEx(hMenu1,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
+                    point.x,point.y,hWnd,NULL);
+   PostMessage(hWnd, WM_USER, 0, 0); /* MS bug. */
+   DestroyMenu(hMenu);
+
+}                                                                             
+/****************************************************************************\
+*
+*    FUNCTION:  InitInstance(HANDLE, int)
+*
+*    PURPOSE:  Saves instance handle and creates main window
+*
+*\***************************************************************************/
+
+BOOL InitInstance(
+    HANDLE          hInstance,          /* Current instance identifier.       */
+    int             nCmdShow)           /* Param for first ShowWindow() call. */
+{
+    HWND            hWnd;               /* Main window handle.                */
+    DWORD           dwStyle,dwExStyle;
+
+
+    /* Save the instance handle in static variable, which will be used in  */
+    /* many subsequence calls from this application to Windows.            */
+
+    hInst = hInstance;
+
+    /* Create a main window for this application instance.  */
+
+    if (optmode == VDMONISTART || optmode == VDMONICHECK) {
+        dwStyle = ICONWINDOW;
+        dwExStyle = WS_EX_APPWINDOW;
+    }
+    else {
+        dwStyle = NORMALWINDOW;
+        dwExStyle = 0;
+    }
+
+    hWnd = CreateWindowEx(
+        dwExStyle,
+        "OnServe",                      /* See RegisterClass() call.          */
+        "OnServe Monitor Control",      /* Text for window title bar.   */
+        dwStyle,                        /* Window style.*/
+        CW_USEDEFAULT,                  /* Default horizontal position.       */
+        CW_USEDEFAULT,                  /* Default vertical position.         */
+        WINWIDTH,                       /* Windows width.                     */
+        WINHEIGHT,                      /* Windows height.                    */
+        NULL,                           /* Overlapped windows have no parent. */
+        NULL,                           /* Use the window class menu.         */
+        hInstance,                      /* This instance owns this window.    */
+        NULL                            /* Pointer not needed.                */
+    );
+
+
+    /* If window could not be created, return "failure" */
+
+    if (!hWnd) {
+        return (FALSE);
+    }
+
+    return (TRUE);               /* Returns the value from PostQuitMessage */
+
+}
+/****************************************************************************\
+*
+*    FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
+*
+*    PURPOSE:  Processes main window messages
+*
+*\***************************************************************************/
+
+LRESULT CALLBACK MainWndProc(
+        HWND hWnd,                /* window handle                   */
+        UINT message,             /* type of message                 */
+        WPARAM wParam,            /* additional information          */
+        LPARAM lParam)            /* additional information          */
+{
+   SERVICE_STATUS  svcStatus;
+
+   switch (message) {
+   case WM_CREATE:
+
+      /* acces to service manager. */
+      hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+      if (hManager==NULL) {
+          DisplayMess(hWnd,NO_ACCESS);
+          PostQuitMessage(0);
+          break;
+      }
+      /* access to monitor service.  */
+      hService = OpenService(hManager, SZSERVICENAME, SERVICE_ALL_ACCESS);
+      if (hService==NULL) {
+          DisplayMess(hWnd,NO_ACCESS_MONI);
+          PostQuitMessage(0);
+          break;
+      }
+      /* check if running. */
+      if (QueryServiceStatus(hService, &svcStatus)) {       
+          /* and see if the service is stopped */
+          if (SERVICE_STOPPED == svcStatus.dwCurrentState &&
+              optmode == VDMONISTOP) {
+              DisplayMess(hWnd,ALREADY_STOP);
+              PostQuitMessage(0);
+              break;
+          }
+          else if (SERVICE_RUNNING == svcStatus.dwCurrentState &&
+              optmode == VDMONISTART) {
+              DisplayMess(hWnd,ALREADY_START);
+              PostQuitMessage(0);
+              break;
+          }
+
+      }
+      else {
+          DisplayMess(hWnd,ERROR_STATUS);
+          PostQuitMessage(0);
+          break;
+      }
+
+      /* DialogBoxes Yes/No */
+      if (optmode == VDMONISTART)
+          DialogBox(hInst,                     /* current instance         */
+                "StartYesNo",                /* resource to use          */
+                hWnd,                        /* parent handle            */
+                StartYesNo);                 /* instance address         */
+      else if (optmode == VDMONISTOP)
+          if (DialogBox(hInst,"StopYesNo",hWnd,StopYesNo))
+              DialogBox(hInst,"PleaseWait",hWnd,PleaseWait);
+
+    
+      if (optmode == VDMONISTOP)
+          PostQuitMessage(0);
+      else {
+          SetTimer(hWnd,VM_ID_TIMER,5000,NULL);
+          MyTaskBarAddIcon(hWnd);
+      }
+
+      break;   /* WM_CREATE */
+
+   case VM_ICON_MESS:
+       switch ((UINT)lParam) {
+       case WM_LBUTTONDBLCLK:
+           StartVdcom(hWnd);
+           break;
+       case WM_RBUTTONDOWN:
+             flagdown = 1;
+           break;
+       case WM_RBUTTONUP:
+           if (flagdown == 1) {
+           flagdown = 2;
+           /* show a  menu. */
+           ShowMenu(hWnd);
+           }
+           break;
+       }
+       break;
+
+
+   case WM_TIMER:
+       /* check if service is running */
+       if (QueryServiceStatus(hService, &svcStatus)) {       
+          /* and see if the service is stopped */
+           if (SERVICE_STOPPED == svcStatus.dwCurrentState) {
+               MyTaskBarDeleteIcon(hWnd);
+               PostQuitMessage(0);
+           }
+           SetTimer(hWnd,VM_ID_TIMER,5000,NULL);
+           return(0);
+       }
+       break;
+
+   case VM_START_ICON:
+       /* add the icon and timer. */
+       MyTaskBarAddIcon(hWnd);
+       SetTimer(hWnd,VM_ID_TIMER,5000,NULL);
+       break;
+
+   case WM_COMMAND:
+       /* command for the popup menu. */
+       switch (LOWORD(wParam)) {
+       case ID_START_VDCOM:
+           StartVdcom(hWnd);
+           break;
+       case ID_STOP_VDMONI:
+           if (DialogBox(hInst,"StopYesNo",hWnd,StopYesNo))
+              DialogBox(hInst,"PleaseWait",hWnd,PleaseWait);
+           break;
+       case ID_PROPRETY:
+           StartVdconf(hWnd);
+           break;
+
+       }
+       break;
+
+  /*
+   *   Clean up.
+   */
+   case WM_DESTROY:
+       if (hService!=NULL)
+           CloseServiceHandle(hService);
+       if (hManager!=NULL) 
+           CloseServiceHandle(hManager);
+      PostQuitMessage(0);
+      break;
+
+   default:                       /* Passes it on if unproccessed    */
+      return (DefWindowProc(hWnd, message, wParam, lParam));
+
+   }
+   return (0);
+
+}
+
+/****************************************************************************
+*
+*    FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
+*
+*    PURPOSE: calls initialization function, processes message loop
+*
+*\***************************************************************************/
+
+WINAPI WinMain(
+    HINSTANCE hInstance,
+    HINSTANCE hPrevInstance,
+    LPSTR lpCmdLine,
+    int nCmdShow
+    )
+{
+
+    MSG msg;
+
+    UNREFERENCED_PARAMETER( lpCmdLine );
+    if (strcmp(lpCmdLine,"start")==0) 
+        optmode = VDMONISTART;
+    else if (strcmp(lpCmdLine,"stop")==0)
+        optmode = VDMONISTOP;
+    else
+        optmode = VDMONICHECK;
+
+    if (!hPrevInstance)                  /* Other instances of app running? */
+        if (!InitApplication(hInstance)) /* Initialize shared things        */
+            return (FALSE);              /* Exits if unable to initialize   */
+
+    /*
+    *   Perform initializations that apply to a specific instance
+    */
+    if (!InitInstance(hInstance, nCmdShow))
+        return (FALSE);
+
+    /*
+    *   Acquire and dispatch messages until a WM_QUIT message is received.
+    */
+    while (GetMessage(&msg,        /* message structure                      */
+            NULL,                  /* handle of window receiving the message */
+            0,             /* lowest message to examine              */
+            0))            /* highest message to examine             */
+        {
+        TranslateMessage(&msg);    /* Translates virtual key codes           */
+        DispatchMessage(&msg);     /* Dispatches message to window           */
+   }
+    return (msg.wParam);           /* Returns the value from PostQuitMessage */
+}
+
+/****************************************************************************
+*
+*    FUNCTION: InitApplication(HANDLE)
+*
+*    PURPOSE: Initializes window data and registers window class
+*
+*\***************************************************************************/
+
+BOOL InitApplication(HANDLE hInstance)       /* current instance             */
+{
+    WNDCLASS  wc;
+
+    /* Fill in window class structure with parameters that describe the       */
+    /* main window.                                                           */
+
+    wc.style = 0;                       /* Class style(s).                    */
+    wc.lpfnWndProc = MainWndProc;       /* Function to retrieve messages for  */
+                                        /* windows of this class.             */
+    wc.cbClsExtra = 0;                  /* No per-class extra data.           */
+    wc.cbWndExtra = 0;                  /* No per-window extra data.          */
+    wc.hIcon = LoadIcon (hInstance, "onserve"); /* Icon name from .RC        */
+    wc.hInstance = hInstance;          /* Application that owns the class.   */
+    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+    wc.hbrBackground = GetStockObject(WHITE_BRUSH);
+    wc.lpszMenuName =  "onservemenu";   /* Name of menu resource in .RC file. */
+    wc.lpszClassName = "OnServe"; /* Name used in call to CreateWindow. */
+
+    /* Register the window class and return success/failure code. */
+
+    return (RegisterClass(&wc));
+
+}
+

Propchange: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmoniadm.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmonisvc.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmonisvc.c?rev=980662&view=auto
==============================================================================
--- commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmonisvc.c (added)
+++ commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmonisvc.c Fri Jul 30 06:50:12 2010
@@ -0,0 +1,708 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/* @version $Id: vdmonisvc.c 909069 2010-02-11 16:43:36Z mturk $ */
+
+/* jsvc monitor service module:
+ * Implements the body of the service.
+ * It reads the register entry and starts the jsvc.
+ */
+
+#include <windows.h>
+#include <winuser.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <process.h>
+#include <time.h>
+#ifdef CYGWIN
+#else
+#include <tchar.h>
+#endif
+#include "moni_inst.h"
+
+/* globals */
+SERVICE_STATUS          ssStatus;
+SERVICE_STATUS_HANDLE   sshStatusHandle;
+DWORD                   dwErr;
+HANDLE                  hServerStopEvent = NULL;
+HANDLE                  hMonitorProcess = NULL;
+
+/*
+ * 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)
+{
+    TCHAR   szMsg[256];
+    HANDLE  hEventSource;
+    LPCTSTR lpszStrings[2];
+
+
+        dwErr = GetLastError();
+
+        /* Use event logging to log the error. */
+
+    if (isWindowsNT())
+            hEventSource = RegisterEventSource(NULL, TEXT(SZSERVICENAME));
+    else
+        hEventSource = NULL;
+
+#ifdef CYGWIN
+    sprintf(szMsg, TEXT("%s ERROR: %d"), TEXT(SZSERVICENAME), dwErr);
+#else
+        _stprintf(szMsg, TEXT("%s ERROR: %d"), TEXT(SZSERVICENAME), dwErr);
+#endif
+        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 */
+
+            (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 );
+
+                if (dwErr)
+            fprintf(log,"%.24s:%s: %s\n",asctime(newtime),szMsg, lpszMsg);
+                else
+            fprintf(log,"%.24s: %s\n",asctime(newtime), lpszMsg);
+        fclose(log);
+        }
+    }
+}
+
+/*
+ *
+ *  FUNCTION: ServiceStop
+ *
+ *  PURPOSE: Stops the service
+ *
+ *  PARAMETERS:
+ *    none
+ *
+ *  RETURN VALUE:
+ *    none
+ *
+ *  COMMENTS:
+ *    If a ServiceStop procedure is going to
+ *    take longer than 3 seconds to execute,
+ *    it should spawn a thread to execute the
+ *    stop code, and return.  Otherwise, the
+ *    ServiceControlManager will believe that
+ *    the service has stopped responding.
+ *    
+ */
+VOID ServiceStop()
+{
+    if ( hServerStopEvent )
+        SetEvent(hServerStopEvent);
+}
+
+/*
+ * Wait for the monitor process to stop
+ */
+int WaitForMonitor(int num)
+{
+    DWORD   qreturn;
+    int     i;
+
+    for (i=0;i<num;i++) {
+        if (hMonitorProcess == NULL) break;
+        if (GetExitCodeProcess(hMonitorProcess, &qreturn)) {
+            if (qreturn == STILL_ACTIVE) {
+                Sleep(1000);
+                continue;
+            }
+            hMonitorProcess = NULL;
+            break;
+        }
+        break;
+    }
+    if (i==num)
+        return -1;
+    return 0;
+}
+/*  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!).
+ */
+
+/* This is the WndProc procedure for our invisible window.
+ * When our subclasssed tty window receives the WM_CLOSE, WM_ENDSESSION,
+ * or WM_QUERYENDSESSION messages, the message is dispatched to our hidden
+ * window (this message process), and we call the installed HandlerRoutine
+ * that was registered by the app.
+ */
+#ifndef ENDSESSION_LOGOFF
+#define ENDSESSION_LOGOFF    0x80000000
+#endif
+static LRESULT CALLBACK ttyConsoleCtrlWndProc(HWND hwnd, UINT msg,
+                                              WPARAM wParam, LPARAM lParam)
+{
+    int   qreturn;
+    if (msg == WM_CREATE) {
+        AddToMessageLog(TEXT("ttyConsoleCtrlWndProc WM_CREATE"));
+        return 0;
+    } else if (msg == WM_DESTROY) {
+        AddToMessageLog(TEXT("ttyConsoleCtrlWndProc WM_DESTROY"));
+        return 0;
+    } else if (msg == WM_CLOSE) {
+        /* Call StopService?. */
+        AddToMessageLog(TEXT("ttyConsoleCtrlWndProc WM_CLOSE"));
+        return 0; /* May return 1 if StopService failed. */
+    } else if ((msg == WM_QUERYENDSESSION) || (msg == WM_ENDSESSION)) {
+        if (lParam & ENDSESSION_LOGOFF) {
+            /* Here we have nothing to our hidden windows should stay. */
+            AddToMessageLog(TEXT("ttyConsoleCtrlWndProc LOGOFF"));
+            return(1); /* Otherwise it cancels the logoff */
+        } else {
+            /* Stop Service. */
+            AddToMessageLog(TEXT("ttyConsoleCtrlWndProc SHUTDOWN"));
+            ServiceStop();
+
+            /* Wait until it stops. */
+            qreturn = WaitForMonitor(3);
+
+            if (msg == WM_QUERYENDSESSION) {
+                AddToMessageLog(
+                    TEXT("ttyConsoleCtrlWndProc SHUTDOWN (query)"));
+                if (qreturn) {
+                    AddToMessageLog(
+                        TEXT("Cancelling shutdown: cannot stop service"));
+                    return(0);
+                }
+            } else
+                AddToMessageLog(TEXT("ttyConsoleCtrlWndProc SHUTDOWN"));
+            return(1); /* Otherwise it cancels the shutdown. */
+        }
+    }
+    return (DefWindowProc(hwnd, msg, wParam, lParam));
+}                                                                               
+/* ttyConsoleCreateThread is the process that runs within the user app's
+ * context.  It creates and pumps the messages of a hidden monitor window,
+ * watching for messages from the system, or the associated subclassed tty
+ * window.  Things can happen in our context that can't be done from the
+ * tty's context, and visa versa, so the subclass procedure and this hidden
+ * window work together to make it all happen.
+ */
+static DWORD WINAPI ttyConsoleCtrlThread()
+{
+    HWND monitor_hwnd;
+    WNDCLASS wc;
+    MSG msg;
+    wc.style         = CS_GLOBALCLASS;
+    wc.lpfnWndProc   = ttyConsoleCtrlWndProc;
+    wc.cbClsExtra    = 0;
+    wc.cbWndExtra    = 8;
+    wc.hInstance     = NULL;
+    wc.hIcon         = NULL;
+    wc.hCursor       = NULL;
+    wc.hbrBackground = NULL;
+    wc.lpszMenuName  = NULL;
+    wc.lpszClassName = "ApacheJakartaService";
+ 
+    if (!RegisterClass(&wc)) {
+        AddToMessageLog(TEXT("RegisterClass failed"));
+        return 0;
+    }
+ 
+    /* Create an invisible window */
+    monitor_hwnd = CreateWindow(wc.lpszClassName, 
+                                "ApacheJakartaService",
+                                WS_OVERLAPPED & ~WS_VISIBLE,
+                                CW_USEDEFAULT, CW_USEDEFAULT,
+                                CW_USEDEFAULT, CW_USEDEFAULT,
+                                NULL, NULL,
+                                GetModuleHandle(NULL), NULL);
+ 
+    if (!monitor_hwnd) {
+        AddToMessageLog(TEXT("RegisterClass failed"));
+        return 0;
+    }
+ 
+    while (GetMessage(&msg, NULL, 0, 0))
+    {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+    }
+ 
+    return 0;
+}
+/*
+ * Register the process to resist logoff and start the thread that will receive
+ * the shutdown via a hidden window.
+ */
+BOOL Windows9xServiceCtrlHandler()
+{
+    HANDLE hThread;
+    DWORD tid;
+    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.
+     */
+     hThread = CreateThread(NULL, 0, ttyConsoleCtrlThread,
+                               (LPVOID)NULL, 0, &tid);
+     if (hThread) {
+        CloseHandle(hThread);
+        return TRUE;
+     }
+    AddToMessageLog(TEXT("jsvc shutdown listener start failed"));
+    return TRUE;
+}
+
+/* 
+ *
+ *  FUNCTION: ReportStatusToSCMgr()
+ *
+ *  PURPOSE: Sets the current status of the service and
+ *           reports it to the Service Control Manager
+ *
+ *  PARAMETERS:
+ *    dwCurrentState - the state of the service
+ *    dwWin32ExitCode - error code to report
+ *    dwWaitHint - worst case estimate to next checkpoint
+ *
+ *  RETURN VALUE:
+ *    TRUE  - success
+ *    FALSE - failure
+ *
+ *  COMMENTS:
+ *
+ */
+BOOL ReportStatusToSCMgr(DWORD dwCurrentState,
+                         DWORD dwWin32ExitCode,
+                         DWORD dwWaitHint)
+{
+    static DWORD dwCheckPoint = 1;
+    BOOL fResult = TRUE;
+
+
+        if (dwCurrentState == SERVICE_START_PENDING)
+            ssStatus.dwControlsAccepted = 0;
+        else
+            ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+
+        ssStatus.dwCurrentState = dwCurrentState;
+        ssStatus.dwWin32ExitCode = dwWin32ExitCode;
+        ssStatus.dwWaitHint = dwWaitHint;
+
+        if ( ( dwCurrentState == SERVICE_RUNNING ) ||
+             ( dwCurrentState == SERVICE_STOPPED ) )
+            ssStatus.dwCheckPoint = 0;
+        else
+            ssStatus.dwCheckPoint = dwCheckPoint++;
+
+
+        /* Report the status of the service to the service control manager. */
+
+        if (!(fResult = SetServiceStatus( sshStatusHandle, &ssStatus))) {
+            AddToMessageLog(TEXT("SetServiceStatus"));
+        }
+    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);
+} 
+
+/*
+ *
+ *  FUNCTION: ServiceStart
+ *
+ *  PURPOSE: Actual code of the service
+ *           that does the work.
+ *
+ *  PARAMETERS:
+ *    dwArgc   - number of command line arguments
+ *    lpszArgv - array of command line arguments
+ *
+ *  RETURN VALUE:
+ *    none
+ *
+ *  COMMENTS:
+ *    The default behavior is to read the registry and start jsvc.
+ *    The service stops when hServerStopEvent is signalled, the jsvc
+ *    is stopped via TermPid(pid) (see kills.c).
+ *
+ */
+VOID ServiceStart (DWORD dwArgc, LPTSTR *lpszArgv)
+{
+char    Data[512];
+DWORD   qreturn;
+STARTUPINFO StartupInfo;
+PROCESS_INFORMATION ProcessInformation;
+char *qptr;
+
+
+    /* Service initialization */
+    ProcessInformation.hProcess = NULL;
+
+    /* report the status to the service control manager. */
+
+    AddToMessageLog(TEXT("ServiceStart: starting"));
+    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.
+     *
+     */
+    hServerStopEvent = CreateEvent(
+        NULL,    /* no security attributes */
+        TRUE,    /* manual reset event */
+        FALSE,   /* not-signalled */
+        NULL);   /* no name */
+
+    if ( hServerStopEvent == NULL)
+        goto cleanup;
+
+    /* report the status to the service control manager. */
+    if (!ReportManager(SERVICE_START_PENDING))
+        goto cleanup;
+
+    /* Read the registry and set environment. */
+    if (OnServeSetEnv()) {
+      AddToMessageLog(TEXT("ServiceStart: read environment failed"));
+      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;
+    }
+
+    /* Build the start jsvc command according to the registry information. */
+    strcpy(Data,qptr);
+    BuildCommand(Data);
+    AddToMessageLog(TEXT(Data));
+
+    /* 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,
+         DETACHED_PROCESS|NORMAL_PRIORITY_CLASS,
+         NULL,NULL, &StartupInfo, &ProcessInformation))
+      goto cleanup;
+    AddToMessageLog(TEXT("ServiceStart: jsvc started"));
+    CloseHandle(ProcessInformation.hThread);
+    ProcessInformation.hThread = NULL;
+    hMonitorProcess = ProcessInformation.hProcess;
+
+    if (!ReportManager(SERVICE_START_PENDING))
+        goto cleanup;
+
+    /* wait until the process is completly created. */
+/* With the DETACHED_PROCESS it does not work...
+    if (WaitForInputIdle(ProcessInformation.hProcess , INFINITE)) {
+      AddToMessageLog(TEXT("ServiceStart: jsvc stopped after creation"));
+      goto cleanup;
+      }
+ */
+
+    /*
+     * jsvc is now running.
+     * report the status to the service control manager.
+     */
+
+    if (!ReportManager(SERVICE_RUNNING))
+        goto cleanup;
+
+    /* End of initialization */
+
+    /*
+     *
+     * Service is now running, perform work until shutdown:
+     * Check every 60 seconds if the monitor is up.
+     *
+     */
+
+    for (;;) {
+      qreturn = WaitForSingleObject(hServerStopEvent,60000); /* each minutes. */
+
+      if (qreturn == WAIT_FAILED) break;/* something have gone wrong. */
+
+      if (qreturn == WAIT_TIMEOUT) {
+        /* timeout check the monitor. */
+        if (GetExitCodeProcess(ProcessInformation.hProcess, &qreturn)) {
+          if (qreturn == STILL_ACTIVE) continue;
+          }
+        AddToMessageLog(TEXT("ServiceStart: jsvc crashed"));
+        hMonitorProcess = NULL;
+        CloseHandle(hServerStopEvent);
+        CloseHandle(ProcessInformation.hProcess);
+        exit(0); /* exit ungracefully so
+                  * Service Control Manager 
+                  * will attempt a restart. */
+                    
+        break; /*failed. */
+        }
+
+      /* stop the monitor by signal(event) */
+      sprintf(Data,"ServiceStart: stopping jsvc: %d",
+              ProcessInformation.dwProcessId);
+      AddToMessageLog(Data);
+
+      if (TermPid(ProcessInformation.dwProcessId)) {
+        AddToMessageLog(TEXT("ServiceStart: jsvc stop failed"));
+        break;
+        }
+      WaitForMonitor(6);
+      AddToMessageLog(TEXT("ServiceStart: jsvc stopped"));
+      break; /* finished!!! */
+      }
+
+  cleanup:
+
+    AddToMessageLog(TEXT("ServiceStart: stopped"));
+    if (hServerStopEvent)
+        CloseHandle(hServerStopEvent);
+
+    if (ProcessInformation.hProcess)
+        CloseHandle(ProcessInformation.hProcess);
+
+}
+
+/*
+ *
+ *  FUNCTION: service_ctrl
+ *
+ *  PURPOSE: This function is called by the SCM whenever
+ *           ControlService() is called on this service.
+ *
+ *  PARAMETERS:
+ *    dwCtrlCode - type of control requested
+ *
+ *  RETURN VALUE:
+ *    none
+ *
+ *  COMMENTS:
+ *
+ */
+VOID WINAPI service_ctrl(DWORD dwCtrlCode)
+{
+    /* Handle the requested control code. */
+    switch(dwCtrlCode)
+    {
+        /* Stop the service.
+         *
+         * SERVICE_STOP_PENDING should be reported before
+         * setting the Stop Event - hServerStopEvent - in
+         * ServiceStop().  This avoids a race condition
+         * which may result in a 1053 - The Service did not respond...
+         * error.
+         */
+        case SERVICE_CONTROL_STOP:
+            ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0);
+            ServiceStop();
+            return;
+
+        /* Update the service status. */
+        case SERVICE_CONTROL_INTERROGATE:
+            break;
+
+        /* invalid control code */
+        default:
+            break;
+
+    }
+
+    ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
+}
+
+/*
+ *
+ *  FUNCTION: service_main
+ *
+ *  PURPOSE: To perform actual initialization of the service
+ *
+ *  PARAMETERS:
+ *    dwArgc   - number of command line arguments
+ *    lpszArgv - array of command line arguments
+ *
+ *  RETURN VALUE:
+ *    none
+ *
+ *  COMMENTS:
+ *    This routine performs the service initialization and then calls
+ *    the user defined ServiceStart() routine to perform majority
+ *    of the work.
+ *
+ */
+void WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv)
+{
+
+    AddToMessageLog(TEXT("service_main:starting"));
+
+    /* register our service control handler: */
+    sshStatusHandle = RegisterServiceCtrlHandler( TEXT(SZSERVICENAME),
+                                                   service_ctrl);
+
+    if (!sshStatusHandle) {
+    AddToMessageLog(TEXT("service_main:RegisterServiceCtrlHandler failed"));
+        goto cleanup;
+    }
+
+    /* SERVICE_STATUS members that don't change in example */
+    ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+    ssStatus.dwServiceSpecificExitCode = 0;
+
+
+    /* report the status to the service control manager. */
+    if (!ReportStatusToSCMgr(SERVICE_START_PENDING,NO_ERROR,3000))   {
+    AddToMessageLog(TEXT("service_main:ReportStatusToSCMgr failed"));
+        goto cleanup;
+    }
+
+
+    ServiceStart( dwArgc, lpszArgv );
+
+cleanup:
+    /*
+     * try to report the stopped status to the service control manager.
+     */
+    if (sshStatusHandle)
+        (VOID)ReportStatusToSCMgr(
+                            SERVICE_STOPPED,
+                            dwErr,
+                            0);
+
+    AddToMessageLog(TEXT("service_main:stopped"));
+    return;
+}
+
+/*
+ *
+ *  FUNCTION: main
+ *
+ *  PURPOSE: entrypoint for service
+ *
+ *  PARAMETERS:
+ *    argc - number of command line arguments
+ *    argv - array of command line arguments
+ *
+ *  RETURN VALUE:
+ *    none
+ *
+ *  COMMENTS:
+ *    main() either performs the command line task, or
+ *    call StartServiceCtrlDispatcher to register the
+ *    main service thread.  When the this call returns,
+ *    the service has stopped, so exit.
+ *
+ */
+#ifdef CYGWIN
+int main(int argc, char **argv)
+#else
+void _CRTAPI1 main(int argc, char **argv)
+#endif
+{
+    SERVICE_TABLE_ENTRY dispatchTable[] =
+    {
+        { TEXT(SZSERVICENAME), (LPSERVICE_MAIN_FUNCTION)service_main },
+        { NULL, NULL }
+    };
+
+    AddToMessageLog(TEXT("StartService starting"));
+    if (isWindowsNT()) {
+            if (!StartServiceCtrlDispatcher(dispatchTable)) {
+        AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));
+        return;
+        }
+        AddToMessageLog(TEXT("StartService started"));
+    } else {
+        Windows9xServiceCtrlHandler();
+        ServiceStart(argc,argv);
+        AddToMessageLog(TEXT("StartService stopped"));
+    }
+}

Propchange: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/moni/vdmonisvc.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/README.dev
URL: http://svn.apache.org/viewvc/commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/README.dev?rev=980662&view=auto
==============================================================================
--- commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/README.dev (added)
+++ commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/README.dev Fri Jul 30 06:50:12 2010
@@ -0,0 +1,25 @@
+Apache Commons Daemon
+=====================
+
+
+Configuring and Building Commons Daemon on Windows
+==================================================
+
+Using Visual Studio, you can build the Commons Daemon.
+The Makefile make file has a bunch of documentation about it's
+options, but a trivial build is simply;
+
+  nmake CPU=X86
+  nmake CPU=X86 PREFIX=c:\desired\path\of\daemon install
+
+
+Needed Tools
+============
+
+Commons Daemon needs the Microsoft Visual C 6/SP5 to
+build the x86 binaries. This is because this compiler
+doesn't create MSVCRTnn.DLL dependecies which will
+be loaded inside running JVM if used.
+For building AMD64/EMT64 binaries use the Platform SDK
+for Windows Server 2003R2.
+

Added: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/apps/prunmgr/Makefile
URL: http://svn.apache.org/viewvc/commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/apps/prunmgr/Makefile?rev=980662&view=auto
==============================================================================
--- commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/apps/prunmgr/Makefile (added)
+++ commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/apps/prunmgr/Makefile Fri Jul 30 06:50:12 2010
@@ -0,0 +1,87 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# @author Mladen Turk
+#
+#
+TARGET = GUI
+PROJECT = prunmgr
+UNICODE = 1
+!include <..\..\include\Makefile.inc>
+
+!IF !DEFINED(PREFIX) || "$(PREFIX)" == ""
+PREFIX = .\..\..\dist
+!ENDIF
+!IF !DEFINED(SRCDIR) || "$(SRCDIR)" == ""
+SRCDIR = .\..\..
+!ENDIF
+
+LFLAGS = $(LFLAGS) /version:1.0
+LIBS = $(LIBS) user32.lib gdi32.lib winspool.lib comdlg32.lib comctl32.lib shlwapi.lib netapi32.lib
+INCLUDES = -I$(SRCDIR)\include -I$(SRCDIR)\src $(JAVA_INCLUDES)
+
+PDBFLAGS = -Fo$(WORKDIR)\ -Fd$(WORKDIR)\$(PROJECT)-src
+OBJECTS = \
+	$(WORKDIR)\cmdline.obj \
+	$(WORKDIR)\console.obj \
+	$(WORKDIR)\gui.obj \
+	$(WORKDIR)\handles.obj \
+	$(WORKDIR)\javajni.obj \
+	$(WORKDIR)\log.obj \
+	$(WORKDIR)\mclib.obj \
+	$(WORKDIR)\registry.obj \
+	$(WORKDIR)\rprocess.obj \
+	$(WORKDIR)\service.obj \
+	$(WORKDIR)\utils.obj \
+	$(WORKDIR)\prunmgr.obj
+
+BUILDEXE = $(WORKDIR)\$(PROJECT).exe
+BUILDLOC = $(PREFIX)
+!IF "$(CPU)" == "X64"
+BUILDLOC = $(PREFIX)\amd64
+!ELSEIF "$(CPU)" == "I64"
+BUILDLOC = $(PREFIX)\ia64
+!ENDIF
+BUILDPDB = $(WORKDIR)\$(PROJECT).pdb
+BUILDRES = $(WORKDIR)\$(PROJECT).res
+BUILDMAN = $(BUILDEXE).manifest
+
+all : $(WORKDIR) $(BUILDEXE)
+
+$(BUILDLOC) :
+	@if not exist "$(BUILDLOC)\$(NULL)" mkdir "$(BUILDLOC)"
+
+$(WORKDIR) :
+	@$(MAKEWORKDIR)
+
+{$(SRCDIR)\src}.c{$(WORKDIR)}.obj:
+	$(CC) $(CFLAGS) $(INCLUDES) $(PDBFLAGS) $<
+
+{$(SRCDIR)\apps\prunmgr}.c{$(WORKDIR)}.obj:
+	$(CC) $(CFLAGS) $(INCLUDES) $(PDBFLAGS) $<
+
+$(BUILDRES): $(SRCDIR)/apps/prunmgr/prunmgr.rc
+	$(RC) $(RCFLAGS) /i "$(SRCDIR)\include" /fo $(BUILDRES) $(SRCDIR)/apps/prunmgr/prunmgr.rc
+
+$(BUILDEXE): $(WORKDIR) $(OBJECTS) $(BUILDRES)
+	$(LINK) $(LFLAGS) $(OBJECTS) $(BUILDRES) $(LIBS) $(LDIRS) /pdb:$(BUILDPDB) /out:$(BUILDEXE)
+	IF EXIST $(BUILDMAN) \
+		mt -nologo -manifest $(BUILDMAN) -outputresource:$(BUILDEXE);1
+
+clean:
+	@$(CLEANTARGET)
+
+install: $(BUILDLOC) $(WORKDIR) $(BUILDEXE)
+	@xcopy "$(WORKDIR)\*.exe" "$(BUILDLOC)" /Y /Q

Propchange: commons/proper/daemon/tags/COMMONS_DAEMON_1_0_3_RC3/src/native/nt/procrun/apps/prunmgr/Makefile
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message