You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jean-frederic clere <jf...@fujitsu-siemens.com> on 2002/03/14 09:57:01 UTC

Re: cvs commit: jakarta-commons-sandbox/daemon/src/native/nt/service instmain.c Makefile instmain.cpp

Hi,

I have done a little more than copying the file.
I have added keys in the registry to store the parameters to start the jsvc.exe 

I have some questions:
- Is adding things to the registry the correct way? As I need a wrapper process
to start the JVM this could have been stored in a property file read by the
wrapper process. (What the win32 administrators are doing: regedit or notepad?).
- What about the keys names:
  Should they be something like
SOFTWARE\SERVER_BASEVENDOR\SERVER_BASEPRODUCT\SERVER_BASEREVISION?
  Where: SERVER_BASEVENDOR="Apache Group"
         SERVER_BASEPRODUCT="jakarta-commons-daemon"
         SERVER_BASEREVISION="1.0.0"

Any other comments?

Cheers

Jean-frederic



jfclere@apache.org wrote:
> 
> jfclere     02/03/13 15:07:31
> 
>   Modified:    daemon/src/native/nt/service Makefile
>   Added:       daemon/src/native/nt/service instmain.c
>   Removed:     daemon/src/native/nt/service instmain.cpp
>   Log:
>   Change the C++ file to a C file.
> 
>   Revision  Changes    Path
>   1.3       +7 -3      jakarta-commons-sandbox/daemon/src/native/nt/service/Makefile
> 
>   Index: Makefile
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons-sandbox/daemon/src/native/nt/service/Makefile,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- Makefile  9 Mar 2002 16:14:42 -0000       1.2
>   +++ Makefile  13 Mar 2002 23:07:31 -0000      1.3
>   @@ -1,3 +1,7 @@
>   -INCLUDE=-I../lib
>   -../../../../dist/INSTSVC: instmain.cpp
>   -     g++ $(INCLUDE) instmain.cpp   -o ../../../../dist/INSTSVC
>   +INCLUDE=-I../lib -I ../../unix/native
>   +../../../../dist/INSTSVC: instmain.c arguments.o debug.o
>   +     gcc $(INCLUDE) instmain.c   -o ../../../../dist/INSTSVC arguments.o debug.o
>   +arguments.o: ../../unix/native/arguments.c
>   +     gcc -c $(INCLUDE) ../../unix/native/arguments.c
>   +debug.o: ../../unix/native/debug.c
>   +     gcc -c $(INCLUDE) ../../unix/native/debug.c
> 
> 
> 
>   1.1                  jakarta-commons-sandbox/daemon/src/native/nt/service/instmain.c
> 
>   Index: instmain.c
>   ===================================================================
>   /*
>    * jsvc.exe install program, create the service JavaService
>    */
> 
>   // includes
>   #include <windows.h>
>   #include <string.h>
>   #include <stdio.h>
> 
>   #include "moni_inst.h"
> 
>   /* Definitions for booleans */
>   typedef enum {
>       false,
>       true
>   } bool;
>   #include "arguments.h"
> 
>   VOID Usage()
>   {
>       printf( "\r\n - Java service installer\r\n\r\n");
>       printf( " - Usage :\r\n");
> 
>       printf( "       To install Java service : InstSvc -install ");
>       printf( " [-home JAVA_HOME] [-Dproperty=value]\r\n");
>       printf( "                                 [-cp CLASSPATH] startclass\r\n");
>       printf( " Like:\r\n");
> 
>       printf( " InstSvc -install -home c:\\jdk1.3.1_02");
>       printf( " -Dcatalina.home=/home1/jakarta/jakarta-tomcat-4.1/build");
>       printf( " -Djava.io.tmpdir=/var/tmp ");
>       printf( " -cp \"c:\\jdk1.3.1_02\\lib\\tools.jar;");
>       printf( "c:\\home1\\jakarta\\jakarta-tomcat-4.1\\build\\bin\\commons-daemon.jar;");
>       printf( "c:\\home1\\jakarta\\jakarta-tomcat-4.1\\build\\bin\\bootstrap.jar\"");
>       printf( " org.apache.catalina.startup.BootstrapService\r\n");
> 
>       printf( "       To remove Java service  : InstSvc -remove\r\n\r\n");
>       printf( "   Use regedit if you want to change something\r\n\r\n");
>       printf( "   Note that the service keys are stored under:\r\n");
>       printf( "   HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\");
>       printf( "%s",SZSERVICENAME);
>       printf( "\r\n");
>       printf( "   The environment keys in:\r\n");
>       printf( "   ");
>       printf( "%s",SZKEY_ONSERVE);
>       printf( "\r\n");
>       return;
>   }
> 
>   /* 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;
>   }
> 
> 
>   /* remove the service (first stop it!) NT version */
> 
>   BOOL RemoveSvcNT (VOID)
>   {
>       BOOL            removed;
>       SC_HANDLE       hManager;
>       SC_HANDLE       hService;
>       SERVICE_STATUS  svcStatus;
>       DWORD           dwCount;
> 
>       removed = FALSE;
>       // open service control manager with full access right
>       hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
>       if (NULL != hManager) {
>           // open existing service
>           hService = OpenService(hManager, SZSERVICENAME, SERVICE_ALL_ACCESS);
>           if (NULL != hService) {
>               // get the status of the service
>               if (QueryServiceStatus(hService, &svcStatus)) {
>                   // and see if the service is stopped
>                   if (SERVICE_STOPPED != svcStatus.dwCurrentState) {
>                       // if not stop the service
>                       ControlService(hService, SERVICE_CONTROL_STOP, &svcStatus);
>                   }
>                   dwCount = 0;
>                   do {
>                       if (SERVICE_STOPPED == svcStatus.dwCurrentState) {
>                           // delete the service
>                           if (DeleteService(hService)) {
>                               removed = TRUE;
>                               break;
>                           }
>                       }
>                       // wait 10 seconds for the service to stop
>                       Sleep(10000);
>                       if (!QueryServiceStatus(hService, &svcStatus)) {
>                           // something went wrong
>                           break;
>                       }
>                       dwCount++;
>                   } while (10 > dwCount);
>               }
>               // close service handle
>               CloseServiceHandle(hService);
>           }
>           // close service control manager
>           CloseServiceHandle(hManager);
>       }
>       return removed;
>   } /* RemoveSvc */
> 
>   /* remove service (non NT) stopping it looks ugly!!! */
>   BOOL RemoveSvc (VOID)
>   {
>       HKEY hkey;
>       DWORD rv;
> 
>       rv = RegOpenKey(HKEY_LOCAL_MACHINE,
>           "Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",
>           &hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not open the RunServices registry key.\r\n");
>           return FALSE;
>       }
>       rv = RegDeleteValue(hkey, SZSERVICENAME);
>       RegCloseKey(hkey);
>       if (rv != ERROR_SUCCESS)
>           printf( "Could not delete the RunServices entry.\r\n");
> 
>       rv = RegOpenKey(HKEY_LOCAL_MACHINE,
>           "SYSTEM\\CurrentControlSet\\Services", &hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not open the Services registry key.\r\n");
>           return FALSE;
>       }
>       rv = RegDeleteKey(hkey, SZSERVICENAME);
>       RegCloseKey(hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not delete the Services registry key.\r\n");
>           return FALSE;
>       }
>       return TRUE;
>   }
> 
> 
>   /* Install service (NT version) */
> 
>   BOOL InstallSvcNT (CHAR *svcExePath)
>   {
>       BOOL        installed;
>       SC_HANDLE   hManager;
>       SC_HANDLE   hService;
> 
>       installed = FALSE;
>       // open the service control manager with full access right
>       hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
>       if (NULL != hManager) {
>           // create the service
>           hService = CreateService(hManager,
>               SZSERVICENAME,          // name of the service
>               SZSERVICEDISPLAYNAME,       // description
>               SERVICE_ALL_ACCESS,
>               SERVICE_WIN32_OWN_PROCESS,  // type of service
>               SERVICE_DEMAND_START, // AUTO_START,    // startmode
>               SERVICE_ERROR_NORMAL,       // error treatment
>               svcExePath,         // path_name
>               NULL,               // no load order enty
>               NULL,               // no tag identifier.
>               NULL,               // dependencies.
>               NULL,       // LocalSystem account
>               NULL);      // dummy user password
>           if (NULL != hService) {
>               // close service handle
>               CloseServiceHandle(hService);
>               installed = TRUE;
>           }
>       } else {
>           printf( "OpenSCManager failed\r\n");
>       }
>       return installed;
>   }
> 
>   /* Install service */
> 
>   BOOL InstallSvc (CHAR *svcExePath)
>   {
>       HKEY        hkey;
>       DWORD rv;
>       char szPath[MAX_PATH];
> 
>       printf( "InstallSvc for non-NT\r\n");
> 
>       rv = RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows"
>                 "\\CurrentVersion\\RunServices", &hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not open the RunServices registry key\r\n");
>           return FALSE;
>       }
>           rv = RegSetValueEx(hkey, SZSERVICENAME, 0, REG_SZ,
>                  (unsigned char *) svcExePath,
>                  strlen(svcExePath) + 1);
>       RegCloseKey(hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not add %s:%s ",SZSERVICENAME, svcExePath);
>           printf( "to RunServices Registry Key\r\n");
>           return FALSE;
>       }
> 
>       strcpy(szPath,
>            "SYSTEM\\CurrentControlSet\\Services\\");
>       strcat(szPath,SZSERVICENAME);
>       rv = RegCreateKey(HKEY_LOCAL_MACHINE, szPath, &hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not create/open the %s registry key\r\n",
>               szPath);
>           return FALSE;
>       }
>       rv = RegSetValueEx(hkey, "ImagePath", 0, REG_SZ,
>                  (unsigned char *) svcExePath,
>                  strlen(svcExePath) + 1);
>       if (rv != ERROR_SUCCESS) {
>           RegCloseKey(hkey);
>           printf( "Could not add ImagePath to our Registry Key\r\n");
>           return FALSE;
>       }
>       rv = RegSetValueEx(hkey, "DisplayName", 0, REG_SZ,
>                  (unsigned char *) SZSERVICEDISPLAYNAME,
>                  strlen(SZSERVICEDISPLAYNAME) + 1);
>       RegCloseKey(hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not add DisplayName to our Registry Key\r\n");
>           return FALSE;
>       }
>       return TRUE;
>   }
> 
>   /*
>    * Fill the registry with the environment variables
>    */
>   BOOL InstallEnv (char *var, char *value)
>   {
>       BOOL        installed;
>       HKEY        hKey;
> 
>       installed = FALSE;
>       // create the parameters registry tree
>           log_debug("InstallEnv: %s:%s",var,value);
>       if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, SZKEY_ONSERVE, 0,
>               NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,
>               &hKey, NULL)) {
>               // key is created or opened
>               RegSetValueEx(hKey,var,0,REG_SZ,(BYTE *)value,lstrlen(value)+1);
>               RegCloseKey(hKey);
>               installed = TRUE;
>               }
>       return installed;
>   } /* InstallEnv */
> 
>   /*
>    * Add the arguments to start jsvc like -Dcatalina.home=/home/jakarta/tomcat.
>    */
>   BOOL InstallEnvParm(int i,char *value)
>   {
>       BOOL        installed;
>       HKEY        hKey;
>       char var[64];
> 
>       sprintf(var,"arg%d",i);
>           log_debug("InstallEnvParm: %s:%s",var,value);
> 
>       installed = FALSE;
>       // create the parameters registry tree
>       if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE,
>               SZKEY_ONSERVEARG, 0,
>               NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,
>               &hKey, NULL)) {
>               // key is created or opened
>               RegSetValueEx(hKey,var,0,REG_SZ,
>                   (BYTE *)value,lstrlen(value)+1);
>               RegCloseKey(hKey);
>               installed = TRUE;
>       }
>       return installed;
>   }
> 
>   /*
>    * Remove the created keys
>    */
>   BOOL RemoveEnv()
>   {
>       HKEY hkey;
>       DWORD rv;
> 
>           log_debug("RemoveEnv");
> 
>       rv = RegOpenKey(HKEY_LOCAL_MACHINE,
>           NULL,
>           &hkey);
>       if (rv != ERROR_SUCCESS) {
>           printf( "Could not open the jsvc registry key.\r\n");
>           return FALSE;
>       }
>       rv = RegDeleteKey(hkey, SZKEY_ONSERVE);
>       RegCloseKey(hkey);
>       if (rv != ERROR_SUCCESS)
>           printf( "Could not delete the jsvc entry.\r\n");
> 
>           /* remove the key tree if empty */
> 
>       return TRUE;
>   }
> 
> 
>   /*
>    * Install or remove the OnServe service and Key in the registry.
>    * no parameter install the OnServe.
>    * -REMOVE: desinstall the OnServe service and Keys.
>    */
> 
>   INT main (INT argc, CHAR *argv[])
>   {
>       BOOL done;
>       arg_data *args=NULL;
>       char szPath[512];
>       int i;
> 
>       printf( "\r\n - Copyright (c) 2001 The Apache Software Foundation. \r\n");
>       printf( "\r\n");
>       if (GetModuleFileName(NULL, szPath, sizeof(szPath))) {
>           printf( "%s\r\n",szPath);
>       }
> 
>       args=arguments(argc,argv);
>       if (args==NULL) {
>           Usage();
>           return(1);
>       }
> 
> 
>       if (args->install==true) {
>           if (args->home==NULL) {
>               printf( "home empty or not defined...\r\n\r\n");
>               Usage();
>               return(1);
>           }
>           if (args->clas==NULL) {
>               printf( "startclass empty or not defined...\r\n\r\n");
>               Usage();
>               return(1);
>           }
>           printf( "\r\ninstalling...\r\n\r\n");
> 
>           /* install jsvcservice.exe as a service */
>           if (isWindowsNT())
>               done = InstallSvcNT(SZDEFMONISVCPATH);
>           else
>               done = InstallSvc(SZDEFMONISVCPATH);
> 
>           if (done)
>               printf( "InstallSvc done\r\n");
>           else
>               printf( "InstallSvc failed\r\n");
> 
>           /* install the environment variable in registry */
> 
>           /* should get it from szPath */
>           InstallEnv("JAKARTA_HOME",SZJAKARTA_HOME);
> 
>           InstallEnv("CYGWIN",SZCYGWINPATH); /* need APR to get ride of it */
> 
>           InstallEnv("JAVA_HOME",args->home);
> 
>           InstallEnv("STARTCLASS",args->clas);
> 
>           if (args->onum==0) return(0);
> 
>           for(i=0;i<args->onum;i++)
>               InstallEnvParm(i,args->opts[i]);
> 
>           return(0);
>       }
> 
>       if (args->remove==true) {
>           // remove the  service. removing the keys not yet done!!!
>           printf( "\r\n - removing Java Service...\r\n\r\n");
>           if (isWindowsNT())
>               done = RemoveSvcNT();
>           else
>               done = RemoveSvc();
>           if (!done) {
>               printf( "\r\n - REMOVE FAILED....\r\n\r\n");
>               return(2);
>           }
>           RemoveEnv();
>           return(0);
>       }
>       printf( "\r\nonly -install or -remove supported...\r\n\r\n");
>       Usage();
>       return(1);
>   }
> 
> 
> 
> 
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>