>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 - 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.
_______________________________________________
freebsd-java@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-java
To unsubscribe, send any mail to "freebsd-java-unsubscribe@freebsd.org"