When upgrading to tomcat5 from tomcat4, I noticed the service handling changed and broke some useful things like passing parameters to tomcat when running as a service. Specifically, it lost the ability to override the configuration files, with "-config server.xml", for example.
I reworked the command syntax a bit to expand on the --StartupClass argument. It now works with an arbitrary number of parameters to pass to the method: --StartupClass package.Class;method;param0;param1;param2;...;paramN instead of: --StartupClass package.Class;method;param ie. --StartupClass org.apache.catalina.startup.Bootstrap;main;-config;..\custom\server.xml;start To do this I had to make a couple changes to procrun.h (expanding the java_t struct) and, of course, converting the parameter handling code to something a little more loop based. I tried to stick with the existing conventions, please don't beat me if I missed something! ~Ryan patch below: Index: procrun.c =================================================================== RCS file: /home/cvspublic/jakarta-commons/daemon/src/native/nt/procrun/procrun.c,v retrieving revision 1.14 diff -u -r1.14 procrun.c --- procrun.c 11 Feb 2004 06:52:24 -0000 1.14 +++ procrun.c 8 Mar 2004 18:34:29 -0000 @@ -565,6 +565,7 @@ */ static void debug_process(int argc, char **argv, process_t *p) { + int i; DBPRINTF1("DUMPING %s\n", argv[0]); DBPRINTF0(" SERVICE:\n"); DBPRINTF1(" name : %s\n", p->service.name); @@ -581,8 +582,10 @@ DBPRINTF1(" stop : %s\n", p->java.stop_class); DBPRINTF1(" start method: %s\n", p->java.start_method); DBPRINTF1(" stop method : %s\n", p->java.stop_method); - DBPRINTF1(" start param : %s\n", p->java.start_param); - DBPRINTF1(" stop param : %s\n", p->java.stop_param); + for (i = 0; i < p->java.start_param_count; i++) + DBPRINTF2(" start param %d : %s\n", i, p->java.start_param[i]); + for (i = 0; i < p->java.stop_param_count; i++) + DBPRINTF2(" stop param %d : %s\n", i, p->java.stop_param[i]); DBPRINTF0("DONE...\n"); } @@ -848,7 +851,9 @@ char skey[256]; char kval[MAX_PATH]; unsigned long klen; + int param_count; DWORD err; + char *px; if (!proc->service.name) return 0; @@ -916,15 +921,36 @@ p = strchr(kval, ';'); if (p) *p = '\0'; proc->java.start_class = pool_strdup(proc->pool, kval); + DBPRINTF1("read start_class: %s\n", kval); + if (p) { + p++; + px = p; + if (p = strchr(p, ';')) { + *p = '\0'; + p++; + } + proc->java.start_method = pool_strdup(proc->pool, px); + DBPRINTF1("read start_method: %s\n", px); + } if (p) { - ++p; - proc->java.start_method = pool_strdup(proc->pool, p); - p = strchr(proc->java.start_method, ';'); - if (p) { - *p = '\0'; - ++p; - proc->java.start_param = pool_strdup(proc->pool, p); - } + DBPRINTF1("reading parameters from: %s\n", p); + px = p; + param_count = 0; + while ( p && *p ) { + px = strchr(p, ';'); + if (px) { + //there are more parameters to come + *px = '\0'; + px++; + DBPRINTF1("there are more parameters in: %s\n", px); + } + proc->java.start_param[param_count] = pool_strdup(proc->pool, p); + DBPRINTF2("read parameter %d: %s\n", param_count, p); + param_count++; + /* param_count is 0 base, start_param_count is not */ + proc->java.start_param_count = param_count; + p = px; + } } } klen = MAX_PATH; @@ -935,15 +961,36 @@ p = strchr(kval, ';'); if (p) *p = '\0'; proc->java.stop_class = pool_strdup(proc->pool, kval); + DBPRINTF1("read stop_class: %s\n", kval); + if (p) { + p++; + px = p; + if (p = strchr(p, ';')) { + *p = '\0'; + p++; + } + proc->java.stop_method = pool_strdup(proc->pool, px); + DBPRINTF1("read stop_method: %s\n", px); + } if (p) { - ++p; - proc->java.stop_method = pool_strdup(proc->pool, p); - p = strchr(proc->java.stop_method, ';'); - if (p) { - *p = '\0'; - ++p; - proc->java.stop_param = pool_strdup(proc->pool, p); - } + DBPRINTF1("reading parameters from: %s\n", p); + px = p; + param_count = 0; + while ( p && *p ) { + px = strchr(p, ';'); + if (px) { + //there are more parameters to come + *px = '\0'; + px++; + DBPRINTF1("there are more parameters in: %s\n", px); + } + proc->java.stop_param[param_count] = pool_strdup(proc->pool, p); + DBPRINTF2("read parameter %d: %s\n", param_count, p); + param_count++; + /* param_count is 0 base, stop_param_count is not */ + proc->java.stop_param_count = param_count; + p = px; + } } } klen = MAX_PATH; @@ -1231,6 +1278,7 @@ JavaVM *jvm = proc->java.jvm; int err; JNIEnv *env; + jstring arg_i; DBPRINTF2("procrun_destroy_jvm dll %08x jvm %08x\n",proc->java.dll,proc->java.jvm); if (!proc->java.dll || !jvm) { @@ -1260,10 +1308,16 @@ DBPRINTF1("Calling shutdown %s\n", proc->java.stop_class); strclass = (*env)->FindClass(env, "java/lang/String"); - if (proc->java.stop_param) { - jstring arg = (*env)->NewStringUTF(env, proc->java.stop_param); - jargs = (*env)->NewObjectArray(env, 1, strclass, NULL); - (*env)->SetObjectArrayElement(env, jargs, 0, arg); + if (proc->java.stop_param_count) { + /* Add each parameter to the array */ + int i; + jargs = (*env)->NewObjectArray(env, proc->java.stop_param_count, strclass, NULL); + for (i = 0; i < proc->java.stop_param_count; i++) { + DBPRINTF2("adding stop parameter %d: %s\n", i, proc->java.stop_param[i]); + arg_i = (*env)->NewStringUTF(env, proc->java.stop_param[i]); + (*env)->SetObjectArrayElement(env, jargs, i, arg_i); + } + } (*env)->CallStaticVoidMethod(env, proc->java.stop_bridge, @@ -1312,6 +1366,7 @@ char *cp; char *opts[32]; int optn, i, err; + jstring arg_i; vm_args11.version = JNI_VERSION_1_2; @@ -1403,10 +1458,15 @@ return 0; } strclass = (*env)->FindClass(env, "java/lang/String"); - if (proc->java.start_param) { - jstring arg = (*env)->NewStringUTF(env, proc->java.start_param); - jargs = (*env)->NewObjectArray(env, 1, strclass, NULL); - (*env)->SetObjectArrayElement(env, jargs, 0, arg); + if (proc->java.start_param_count) { + /* Add each parameter to the array */ + int i; + jargs = (*env)->NewObjectArray(env, proc->java.start_param_count, strclass, NULL); + for (i = 0; i < proc->java.start_param_count; i++) { + DBPRINTF2("adding start parameter %d: %s\n", i, proc->java.start_param[i]); + arg_i = (*env)->NewStringUTF(env, proc->java.start_param[i]); + (*env)->SetObjectArrayElement(env, jargs, i, arg_i); + } } (*env)->CallStaticVoidMethod(env, proc->java.start_bridge, @@ -1673,7 +1733,8 @@ int i, j, len = strlen(env->m->argw) + 8192; char *opts[64], *nargw; char *javaClass = starting ? env->m->java.start_class : env->m->java.stop_class, - *javaParam = starting ? env->m->java.start_param : env->m->java.stop_param; + **javaParam = starting ? env->m->java.start_param : env->m->java.stop_param; + int javaParam_count = starting ? env->m->java.start_param_count : env->m->java.stop_param_count; j = make_array(env->m->java.opts, opts, 60, env->m); @@ -1700,10 +1761,10 @@ strcat(nargw, program); strcat(nargw, " "); strcat(nargw, javaClass); - if (javaParam) { - strcat(nargw, " "); - strcat(nargw, javaParam); - } + for (i = 0; i < javaParam_count; i++) { + strcat(nargw, " "); + strcat(nargw, javaParam[i]); + } env->m->argw = nargw; program = env->m->java.jbin; return program; Index: procrun.h =================================================================== RCS file: /home/cvspublic/jakarta-commons/daemon/src/native/nt/procrun/procrun.h,v retrieving revision 1.7 diff -u -r1.7 procrun.h --- procrun.h 11 Feb 2004 05:11:48 -0000 1.7 +++ procrun.h 8 Mar 2004 18:34:29 -0000 @@ -269,8 +269,10 @@ jmethodID stop_mid; char *start_method; char *stop_method; - char *start_param; - char *stop_param; + char *start_param[MAX_PATH]; + char *stop_param[MAX_PATH]; + int start_param_count; + int stop_param_count; char *opts; char *display; }; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]