[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-java
Subject:    Re: [patch] daemonctl.c modified to use JAVA_HOME environment variable
From:       Brent Verner <brent () rcfile ! org>
Date:       2003-02-08 5:03:06
[Download RAW message or body]

[2003-02-08 03:20] k.j.koster@telecom.tno.nl said:
| Dear Brent,
| 
| I would prefer daemonctl to fail if the JAVA_HOME is pointing off 
| into lala land. I really dislike solutions that are helpfully 
| filling in information. If I set JAVA_HOME to something odd, I 
| expect my programs to fail. Please consider this.

Point taken.  Attached patch causes failure before stop() or start() 
if env JAVA_HOME doesn't contain a java program.

cheers.
  brent

-- 
"Develop your talent, man, and leave the world something. Records are 
really gifts from people. To think that an artist would love you enough
to share his music with anyone is a beautiful thing."  -- Duane Allman

["daemonctl.c.diff.1" (text/plain)]

--- ports/www/jakarta-tomcat4/files/daemonctl.c.orig	Fri Feb  7 18:19:35 2003
+++ ports/www/jakarta-tomcat4/files/daemonctl.c	Fri Feb  7 23:00:15 2003
@@ -20,6 +20,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/uio.h>
+#include <limits.h>
 
 /* The maximum size of the PID file, in bytes */
 #define MAX_FILE_SIZE			32
@@ -45,6 +46,7 @@
 #define ERR_STAT_JAVA_CMD					14
 #define ERR_JAVA_CMD_NOT_FILE				15
 #define ERR_JAVA_CMD_NOT_EXECUTABLE			16
+#define ERR_INVALID_JAVA_HOME               18
 
 #define private static
 
@@ -55,7 +57,13 @@
 private void start(void);
 private void stop(void);
 private void restart(void);
+private void setup_java_prog(void);
 
+#define C_JAVA_HOME "%%JAVA_HOME%%"
+#define C_JAVA_PROG "%%JAVA_HOME%%/%%JAVA_CMD%%"
+private int  using_java_home_env = 0;
+private char java_home[PATH_MAX] = C_JAVA_HOME;
+private char java_prog[PATH_MAX] = C_JAVA_PROG;
 
 /**
  * Main function. This function is called when this program is executed.
@@ -78,6 +86,8 @@
 		return 0;
 	}
 
+	setup_java_prog(); /* check for and use JAVA_HOME env */
+
 	/* XXX: Fix for setting up the environment for the java wrapper script */
 	setuid(geteuid());
 	setgid(getegid());
@@ -332,36 +342,36 @@
 	}
 
 	/* Check if the JDK home directory is actually a directory */
-	result = stat("%%JAVA_HOME%%", &sb);
+	result = stat(java_home, &sb);
 	if (result != 0) {
 		printf(" [ FAILED ]\n");
-		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to stat %%JAVA_HOME%%: ");
+		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to stat %s: ",java_home);
 		perror(NULL);
 		exit(ERR_STAT_JAVA_HOME);
 	}
 	if (!S_ISDIR(sb.st_mode)) {
 		printf(" [ FAILED ]\n");
-		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Java home directory %%JAVA_HOME%% is not \
a directory.\n"); +		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Java home directory %s \
is not a directory.\n",java_home);  exit(ERR_JAVA_HOME_NOT_DIR);
 	}
 
 	/* Check if the Java command is actually an executable regular file */
-	result = stat("%%JAVA_HOME%%/%%JAVA_CMD%%", &sb);
+	result = stat(java_prog, &sb);
 	if (result != 0) {
 		printf(" [ FAILED ]\n");
-		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to stat \
%%JAVA_HOME%%/%%JAVA_CMD%%: "); +		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable \
to stat %s: ",java_prog);  perror(NULL);
 		exit(ERR_STAT_JAVA_CMD);
 	}
 	if (!S_ISREG(sb.st_mode)) {
 		printf(" [ FAILED ]\n");
-		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Java command %%JAVA_HOME%%/%%JAVA_CMD%% \
is not a regular file.\n"); +		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Java command \
%s is not a regular file.\n",java_prog);  exit(ERR_JAVA_CMD_NOT_FILE);
 	}
-	result = access("%%JAVA_HOME%%/%%JAVA_CMD%%", X_OK);
+	result = access(java_prog, X_OK);
 	if (result != 0) {
 		printf(" [ FAILED ]\n");
-		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Java command %%JAVA_HOME%%/%%JAVA_CMD%% \
is not executable: "); +		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Java command %s \
is not executable: ",java_prog);  perror(NULL);
 		exit(ERR_JAVA_CMD_NOT_EXECUTABLE);
 	}
@@ -425,9 +435,9 @@
 		         file using pipe(2) */
 
 		/* Execute the command */
-		execl("%%JAVA_HOME%%/%%JAVA_CMD%%", "%%JAVA_HOME%%/%%JAVA_CMD%%", "-jar", \
                %%JAVA_ARGS%% "%%JAR_FILE%%", %%JAR_ARGS%% NULL);
-
-		fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to start %%APP_TITLE%% \
%%PORTVERSION%% since '%%JAVA_HOME%%/%%JAVA_CMD%% -jar %%JAR_FILE%%' in %%APP_HOME%%: \
"); +		execl(java_prog, java_prog, "-jar", %%JAVA_ARGS%% "%%JAR_FILE%%", %%JAR_ARGS%% \
NULL); +		
+        fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to start %%APP_TITLE%% \
%%PORTVERSION%% since '%s -jar %%JAR_FILE%%' in %%APP_HOME%%: ",java_prog);  \
perror(NULL);  } else {
 		printf(" [ DONE ]\n");
@@ -482,3 +492,44 @@
 	stop();
 	start();
 }
+
+/*
+ * setup java_home and java_prog.  If JAVA_HOME is defined in the 
+ * environemt, try to use it.  If JAVA_HOME does contain bin/java,
+ * do not use it.
+ */
+private void setup_java_prog(void){
+  char* _java_home;
+
+  /* use JAVA_HOME environemt variable if set */
+  _java_home = getenv("JAVA_HOME");
+  if( _java_home != NULL && strcmp("",_java_home) != 0 ){
+    char _java_prog[PATH_MAX];
+    struct stat st;
+    int rv;
+    strlcpy(_java_prog,_java_home,PATH_MAX);
+    strlcat(_java_prog,"/",PATH_MAX);
+    strlcat(_java_prog,"%%JAVA_CMD%%",PATH_MAX);
+    rv = stat(_java_prog,&st);
+
+    /* make sure _java_prog can be used */
+    if( rv == 0 
+        && S_ISREG(st.st_mode) 
+        && ! access(_java_prog, X_OK) )
+	{
+      strlcpy(java_home,_java_home,PATH_MAX);
+      strlcpy(java_prog,_java_prog,PATH_MAX);
+      using_java_home_env = 1;
+      printf("[info] using JAVA_HOME environment variable (%s)\n",java_home);
+      printf("[info] starting tomcat with %s\n",java_prog);
+    
+    }
+    else
+    {
+      fprintf(stderr,"[ FAILED ]\n");
+      fprintf(stderr,"%%CONTROL_SCRIPT_NAME%%: invalid JAVA_HOME; %s not \
found\n",_java_prog); +      exit(ERR_INVALID_JAVA_HOME);
+    }
+  }
+}
+


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-java" in the body of the message

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic