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>