Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Dec 2004 19:04:59 +1300 (NZDT)
From:      Jonathan Chen <jonc@chen.org.nz>
To:        FreeBSD-gnats-submit@freebsd.org
Cc:        freebsd-java@freebsd.org
Subject:   JBoss4 update
Message-ID:  <20041221060459.C5C455644D@chen.org.nz>

next in thread | raw e-mail | index | archive | help

>Submitter-Id:	current-users
>Originator:	Jonathan Chen
>Organization:	
>Confidential:	no 
>Synopsis:	JBoss4 update
>Severity:	non-critical
>Priority:	medium
>Category:	ports
>Class:		maintainer-update
>Release:	FreeBSD 5.3-STABLE i386
>Environment:
System: FreeBSD osiris.chen.org.nz 5.3-STABLE FreeBSD 5.3-STABLE #0: Mon Dec 20 23:24:42 NZDT 2004 root@osiris.chen.org.nz:/usr/obj/usr/src/sys/GENERIC i386
>Description:
Yet another JBoss4 update:
	1. fix cold-boot startup failure.
	2. add note on starting up JBoss4 with rcNG.
	3. add new "-config" option to jboss4ctl for JBoss4 startup config.
>How-To-Repeat:
>Fix:


diff -ruN /usr/ports/java/jboss4/Makefile ./Makefile
--- /usr/ports/java/jboss4/Makefile	Tue Dec 21 07:24:57 2004
+++ ./Makefile	Tue Dec 21 18:26:45 2004
@@ -7,7 +7,7 @@
 
 PORTNAME=	${APP_TITLE:L}
 PORTVERSION=	4.0.0
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	java
 MASTER_SITES=	${MASTER_SITE_SOURCEFORGE}
 MASTER_SITE_SUBDIR=	${PORTNAME}
diff -ruN /usr/ports/java/jboss4/files/daemonctl.c ./files/daemonctl.c
--- /usr/ports/java/jboss4/files/daemonctl.c	Tue Dec 21 07:24:58 2004
+++ ./files/daemonctl.c	Tue Dec 21 15:45:21 2004
@@ -27,17 +27,12 @@
 #define	TRUE	1
 #define	FALSE	0
 
-/* The maximum size of the PID file, in bytes */
-#define MAX_FILE_SIZE			32
-
 /* The interval in seconds between the checks to make sure the process
    died after a kill */
 #define STOP_TIME_INTERVAL		1
 
 #define ERR_ILLEGAL_ARGUMENT				1
 #define ERR_PID_FILE_NOT_FOUND				2
-#define ERR_PID_FILE_TOO_LARGE				3
-#define ERR_PID_FILE_CONTAINS_ILLEGAL_CHAR	4
 #define ERR_KILL_FAILED						5
 #define ERR_ALREADY_RUNNING					6
 #define ERR_NOT_RUNNING						7
@@ -56,18 +51,20 @@
 	Function declarations.
  */
 static void printUsage (void);
-static int openPIDFile (void);
-static int readPID (int);
-static void writePID (int file, int pid);
-static void start (int optcount, char * opts []);
+static int readPID (void);
+static void writePID (int pid);
+static void clearPID (void);
+static void start (int javaOpt, char * javaArgs [], int jbossOpt, char * jbossArgs []);
 static void stop (void);
-static void restart (int optcount, char * opts []);
+static void restart (int javaOpt, char * javaArgs [], int jbossOpt, char * jbossArgs []);
 static void logOutput (char *);
 
 /*
 	Globals
  */
 static int isQuiet = FALSE;
+static char * optQuiet = "-q",			/* quiet option */
+			* optConfig = "-config";	/* jboss configuration option */
 
 /**
  * Main function. This function is called when this program is executed.
@@ -84,10 +81,9 @@
  int argc,
  char *argv [])
 {
-
 	/* Declare variables, like all other good ANSI C programs do :) */
-	int i, jopt;
-	char *argument, **jargs;
+	int i, javaOpt, jbossOpt;
+	char *argument, **javaArgs, **jbossArgs;
 
 	/* Parse the arguments */
 	if (argc < 2)
@@ -101,26 +97,58 @@
 	setgid (getegid ());
 
 	/*
-		Build up java-option block.
+		Build up java and jboss option blocks.
 	 */
-	jopt = 0;
+	javaOpt = jbossOpt = 0;
 	for (i = 1; i < argc; i++)
 	{
-		if (strcmp (argv [i], "-q") == 0)
+		if (strcmp (argv [i], optQuiet) == 0)
+		{
 			isQuiet = TRUE;
-		else if (*argv [i] == '-')
-			jopt++;
+
+		} else if (strcmp (argv [i], optConfig) == 0)
+		{
+			jbossOpt += 2;
+			if (++i >= argc)
+			{
+				printUsage ();
+				return ERR_ILLEGAL_ARGUMENT;
+			}
+
+		} else if (*argv [i] == '-')
+		{
+			javaOpt++;
+		}
+	}
+	if (javaOpt == 0)
+		javaArgs = NULL;
+	else
+	{
+		int j = 0;
+		javaArgs = malloc (sizeof (char *) * javaOpt);
+		for (i = 0; i < argc; i++)
+		{
+			if (strcmp (argv [i], optQuiet) &&
+				strcmp (argv [i], optConfig) &&
+				*argv [i] == '-')
+			{
+				javaArgs [j++] = argv [i];
+			}
+		}
 	}
-	if (jopt == 0)
-		jargs = NULL;
+	if (jbossOpt == 0)
+		jbossArgs = NULL;
 	else
 	{
 		int j = 0;
-		jargs = malloc (sizeof (char *) * jopt);
+		jbossArgs = malloc (sizeof (char *) * jbossOpt);
 		for (i = 0; i < argc; i++)
 		{
-			if (strcmp (argv [i], "-q") && *argv [i] == '-')
-				jargs [j++] = argv [i];
+			if (strcmp (argv [i], optConfig) == 0)
+			{
+				jbossArgs [j++] = "-c";
+				jbossArgs [j++] = argv [++i];
+			}
 		}
 	}
 
@@ -130,14 +158,15 @@
 	argument = argv [argc - 1];
 	if (strcmp ("start", argument) == 0)
 	{
-		start (jopt, jargs);
+		start (javaOpt, javaArgs, jbossOpt, jbossArgs);
 
 	} else if (strcmp ("stop", argument) == 0)
 	{
 		stop ();
+
 	} else if (strcmp ("restart", argument) == 0)
 	{
-		restart (jopt, jargs);
+		restart (javaOpt, javaArgs, jbossOpt, jbossArgs);
 
 	} else {
 		fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Illegal argument \"%s\".\n", argument);
@@ -145,134 +174,85 @@
 		exit (ERR_ILLEGAL_ARGUMENT);
 	}
 
-	return 0;
+	return EXIT_SUCCESS;
 }
 
-
 /**
  * Prints usage information to stdout.
  */
 static void
 printUsage (void)
 {
-	printf ("Usage: %%CONTROL_SCRIPT_NAME%% [java-options] {start|stop|restart}\n");
+	printf ("Usage: %%CONTROL_SCRIPT_NAME%% [java-options] [-config jbossconfig] {start|stop|restart}\n");
 }
 
 /**
- * Attempts to open the PID file. If that file is successfully opened, then
- * the file handle (an int) will be returned.
+ * Reads a PID from the PID file.
  *
  * @return
- *    the file handle.
+ *    the PID, or -1 if the file was empty.
  */
 static int
-openPIDFile (void)
+readPID (void)
 {
+	FILE * file;
+	int pid;
 
- 	int file;
-
-	/* Attempt to open the PID file */
-	file = open ("%%PID_FILE%%", O_RDWR);
-	if (file < 0) {
+	logOutput (">> Reading PID file (%%PID_FILE%%)...");
+	file = fopen ("%%PID_FILE%%", "r");
+	if (!file)
+	{
 		logOutput (" [ FAILED ]\n");
-		fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to open %%PID_FILE%% for reading and writing: ");
-		perror (NULL);
+		perror ("%%CONTROL_SCRIPT_NAME%%: Unable to open %%PID_FILE%% for reading: ");
 		exit (ERR_PID_FILE_NOT_FOUND);
 	}
+	if (fscanf (file, "%d", &pid) < 1)
+		pid = -1;
+	fclose (file);
 
-	return file;
-}
-
-
-/**
- * Reads a PID from the specified file. The file is identified by a file
- * handle.
- *
- * @param file
- *    the file handle.
- *
- * @return
- *    the PID, or -1 if the file was empty.
- */
-static int
-readPID (
- int file)
-{
-
-	char *buffer;
-	int hadNewline = 0;
-	unsigned int count;
-	unsigned int i;
-	int pid;
-
-	/* Read the PID file contents */
-	buffer = (char *) malloc ((MAX_FILE_SIZE + 1) * sizeof (char));
-	count = read (file, buffer, MAX_FILE_SIZE + 1);
-	if (count > MAX_FILE_SIZE) {
-		logOutput (" [ FAILED ]\n");
-		fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: The file %%PID_FILE%% contains more than %d bytes.\n", MAX_FILE_SIZE);
-		exit (ERR_PID_FILE_TOO_LARGE);
-	}
-
-	/* Convert the bytes to a number */
-	pid = 0;
-	for (i=0; i<count; i++) {
-		char c = buffer[i];
-		if (c >= '0' && c <= '9') {
-			char digit = c - '0';
-			pid *= 10;
-			pid += digit;
-		} else if (i == (count - 1) && c == '\n') {
-			/* XXX: Ignore a newline at the end of the file */
-			hadNewline = 1;
-		} else {
-			logOutput (" [ FAILED ]\n");
-			fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: The file %%PID_FILE%% contains an illegal character (%d) at position %d.\n", c, i);
-			exit (ERR_PID_FILE_CONTAINS_ILLEGAL_CHAR);
-		}
-	}
 	logOutput (" [ DONE ]\n");
-
-	if (count == 0 || (count == 1 && hadNewline == 1)) {
-		return -1;
-	}
-
 	return pid;
 }
 
-
 /**
  * Writes a process ID to the specified file. The file is identified by a file
  * handle.
  *
- * @param file
- *    the file handle, always greater than 0.
- *
  * @param pid
  *    the PID to store, always greater than 0.
  */
 static void
 writePID (
- int file,
  int pid)
 {
-
-	char *buffer;
-	int nbytes;
-
-	/* Check preconditions */
-	assert (file > 0);
-	assert (pid > 0);
+	FILE * file;
 
 	logOutput (">> Writing PID file...");
+	file = fopen ("%%PID_FILE%%", "w");
+	if (!file)
+	{
+		logOutput (" [ FAILED ]\n");
+		perror ("%%CONTROL_SCRIPT_NAME%%: Unable to open %%PID_FILE%% for writing: ");
+		exit (ERR_PID_FILE_NOT_FOUND);
+	}
+	fprintf (file, "%d\n", pid);
+	fclose (file);
 
-	lseek (file, (off_t) 0, SEEK_SET);
-	ftruncate (file, (off_t) 0);
-	nbytes = asprintf (&buffer, "%d\n", pid);
-	write (file, buffer, nbytes);
 	logOutput (" [ DONE ]\n");
 }
 
+/**
+	Truncate the PID file.
+ */
+static void
+clearPID (void)
+{
+	if (truncate ("%%PID_FILE%%", 0) != 0)
+	{
+		perror ("%%CONTROL_SCRIPT_NAME%%: Unable to clear %%PID_FILE%%: ");
+		exit (ERR_PID_FILE_NOT_FOUND);
+	}
+}
 
 /**
  * Checks if the specified process is running.
@@ -287,7 +267,6 @@
 existsProcess (
  int pid)
 {
-
 	int result;
 
 	/* Check preconditions */
@@ -297,14 +276,9 @@
    	result = kill (pid, 0);
 
 	/* If the result is 0, then the process exists */
-	if (result == 0) {
-		return 1;
-	} else {
-		return 0;
-	}
+	return result == 0;
 }
 
-
 /**
  * Kills the process identified by the specified ID.
  *
@@ -315,7 +289,6 @@
 killProcess (
  int pid)
 {
-
 	int result;
 	unsigned int waited;
 	unsigned int forced;
@@ -347,13 +320,13 @@
 
 	/* If the process still exists, then have no mercy and kill it */
 	forced = 0;
-	if (result == 1) {
-
+	if (result == 1)
+	{
 		/* Force the process to die */
 		result = kill (pid, SIGKILL);
 		if (result == 0) {
 			forced = 1;
-			logOutput (" [ DONE ]\n");
+			logOutput (" [ KILLED ]\n");
 			fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Process %d did not terminate within %%STOP_TIMEOUT%% sec. Killed.\n", pid);
 		} else if (result != ESRCH) {
 			logOutput (" [ FAILED ]\n");
@@ -373,27 +346,28 @@
  */
 static void
 start (
- int optcount,
- char * opts [])
+ int javaOpt,
+ char * javaArgs [],
+ int jbossOpt,
+ char * jbossArgs [])
 {
-	int file;
+	int i, argc;
+	char ** argv;
 	int pid;
 	int result;
 	int stdoutLogFile;
 	int stderrLogFile;
 	struct stat sb;
 
-	/* Open and read the PID file */
-	logOutput (">> Reading PID file (%%PID_FILE%%)...");
-	file = openPIDFile ();
-	pid = readPID (file);
+	pid = readPID ();
 
 	logOutput (">> Starting %%APP_TITLE%% %%PORTVERSION%%...");
-	if (pid != -1) {
-
+	if (pid != -1)
+	{
 		/* Check if the process actually exists */
 		result = existsProcess (pid);
-		if (result == 1) {
+		if (result == 1)
+		{
 			logOutput (" [ FAILED ]\n");
 			fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTVERSION%% is already running, PID is %d.\n", pid);
 			exit (ERR_ALREADY_RUNNING);
@@ -474,19 +448,16 @@
 	lseek (stderrLogFile, (off_t) 0, SEEK_END);
 
 	/* Split this process in two */
-	pid = fork ();
-	if (pid == -1) {
+	switch (pid = fork ())
+	{
+	case -1:
 		logOutput (" [ FAILED ]\n");
 		fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to fork: ");
 		perror (NULL);
 		exit (ERR_FORK_FAILED);
-	}
-
-	if (pid == 0)
-	{
-		int i, argc;
-		char **argv;
+		break;
 
+	case 0:
 		/* Redirect stdout to log file */
 		dup2 (stdoutLogFile, STDOUT_FILENO);
 
@@ -494,29 +465,31 @@
 		dup2 (stderrLogFile, STDERR_FILENO);
 
 		/* TODO: Support redirection of both stdout and stderr to the same
-		         file using pipe (2) */
+				 file using pipe (2) */
 
 		/*
-			Build the argument vector, with the java-options if any.
+			Build the argument vector, with the java/jboss options if any.
 		 */
-		argv = malloc (sizeof (char *) * (optcount + 5));
+		argv = malloc (sizeof (char *) * (javaOpt + jbossOpt + 5));
 		argc = 0;
 		argv [argc++] = "%%JAVA%%";
-		for (i = 0; i < optcount; i++)
-			argv [argc++] = opts [i];
+		for (i = 0; i < javaOpt; i++)
+			argv [argc++] = javaArgs [i];
 		argv [argc++] = "-cp";
 		argv [argc++] = "%%JAVA_CP%%";
 		argv [argc++] = "%%JAVA_MAIN%%";
+		for (i = 0; i < jbossOpt; i++)
+			argv [argc++] = jbossArgs [i];
 		argv [argc++] = NULL;
 
 		/* Execute the command */
 		execv (argv [0], argv);
-
 		perror (NULL);
-	} else
-	{
+		break;
+
+	default:
 		logOutput (" [ DONE ]\n");
-		writePID (file, pid);
+		writePID (pid);
 	}
 }
 
@@ -526,28 +499,26 @@
 static void
 stop (void)
 {
-
-	int file;
 	int pid;
 
-	/* Open and read the PID file */
-	logOutput (">> Reading PID file (%%PID_FILE%%)...");
-	file = openPIDFile ();
-	pid = readPID (file);
+	pid = readPID ();
 
 	logOutput (">> Checking if %%APP_TITLE%% %%PORTVERSION%% is running...");
 
 	/* If there is a PID, see if the process still exists */
-	if (pid != -1) {
+	if (pid != -1)
+	{
 		int result = kill (pid, 0);
-		if (result != 0 && errno == ESRCH) {
-			ftruncate (file, (off_t) 0);
+		if (result != 0 && errno == ESRCH)
+		{
+			clearPID ();
 			pid = -1;
 		}
 	}
 
 	/* If there is no running process, produce an error */
-	if (pid == -1) {
+	if (pid == -1)
+	{
 		logOutput (" [ FAILED ]\n");
 		fprintf (stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTVERSION%% is currently not running.\n");
 		exit (ERR_NOT_RUNNING);
@@ -556,9 +527,7 @@
 
 	/* Terminate the process */
 	killProcess (pid);
-
-	/* Clear the PID file */
-	ftruncate (file, (off_t) 0);
+	clearPID ();
 }
 
 
@@ -567,11 +536,13 @@
  */
 static void
 restart (
- int optcount,
- char * opts [])
+ int javaOpt,
+ char * javaArgs [],
+ int jbossOpt,
+ char * jbossArgs [])
 {
 	stop ();
-	start (optcount, opts);
+	start (javaOpt, javaArgs, jbossOpt, jbossArgs);
 }
 
 /**
diff -ruN /usr/ports/java/jboss4/files/startup.sh ./files/startup.sh
--- /usr/ports/java/jboss4/files/startup.sh	Tue Dec 21 07:24:58 2004
+++ ./files/startup.sh	Tue Dec 21 15:27:10 2004
@@ -1,6 +1,4 @@
 #!/bin/sh
-# -*- mode: Fundamental; tab-width: 4; -*-
-# ex:ts=4
 #
 # %%APP_TITLE%% startup script.
 #
@@ -15,6 +13,8 @@
 #				Set it to "YES" to enable %%APP_SHORTNAME%%
 # %%APP_SHORTNAME%%_flags (str):		Set to "-server" by default.
 #				Extra JVM flags.
+# %%APP_SHORTNAME%%_config (str):		Set to "" by default
+#				JBoss server config, eg {all|default|minimal|standard}
 #
 . %%RC_SUBR%%
 
@@ -28,19 +28,31 @@
 
 [ -z "$%%APP_SHORTNAME%%_enable" ]	&& %%APP_SHORTNAME%%_enable="NO"
 [ -z "$%%APP_SHORTNAME%%_flags" ]	&& %%APP_SHORTNAME%%_flags="-server"
+[ -z "$%%APP_SHORTNAME%%_config" ]	&& %%APP_SHORTNAME%%_config=""
 
 %%APP_SHORTNAME%%_start ()
 {
 	checkyesno %%APP_SHORTNAME%%_enable &&
-		%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} start &&
+	{
+		if [ ! -f ${pidfile} ]
+		then
+			touch ${pidfile}
+			chown %%USER%%:%%GROUP%% ${pidfile}
+		fi
+
+		%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} start &&
 		echo -n " %%APP_SHORTNAME%%"
+	}
 }
 
 %%APP_SHORTNAME%%_restart ()
 {
 	checkyesno %%APP_SHORTNAME%%_enable &&
-		%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} restart
+		%%CONTROL_SCRIPT%% -q ${%%APP_SHORTNAME%%_flags} ${%%APP_SHORTNAME%%_configflag} ${%%APP_SHORTNAME%%_config} restart
 }
 
 load_rc_config $name
+
+[ -n "${%%APP_SHORTNAME%%_config}" ] && %%APP_SHORTNAME%%_configflag="-config"
+
 run_rc_command "$1"
diff -ruN /usr/ports/java/jboss4/pkg-message ./pkg-message
--- /usr/ports/java/jboss4/pkg-message	Thu Jan  1 12:00:00 1970
+++ ./pkg-message	Tue Dec 21 12:21:50 2004
@@ -0,0 +1,2 @@
+To run the JBoss4 server from startup, add jboss4_enable="YES"
+in your /etc/rc.conf. Extra options can be found in startup script.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041221060459.C5C455644D>