You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Ryan M. Graham" <ry...@ELOQUENT-SYSTEMS.com> on 2004/03/08 19:51:24 UTC
[PATCH] daemon: pass arbitrary number of parameters through procrun
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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org
Re: [PATCH] daemon: pass arbitrary number of parameters through procrun
Posted by Bill Barker <wb...@wilshire.com>.
I've committed a slight variant of this patch to the CVS.
Thanks Much!
"Ryan M. Graham" <ry...@ELOQUENT-SYSTEMS.com> wrote in message
news:AAF3B79E8DE5A842A938B33CAF9B04180BEDB9@eloserv.eloquent-systems.com...
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;star
t
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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org