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 [EMAIL PROTECTED] 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: <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>