diff -Nru service-wrapper-java-3.5.22/build-tests.xml service-wrapper-java-3.5.25/build-tests.xml
--- service-wrapper-java-3.5.22/build-tests.xml 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/build-tests.xml 2014-06-30 18:06:59.000000000 +0000
@@ -110,6 +110,13 @@
value="wrapper.logfile=../test/testwrapper.log" />
+
+
+
+
+
+
+
@@ -685,128 +692,271 @@
wrapper.app.parameter.5=0]]>
-
-
-
-
+
+
+
+
-
-
+
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+ ABC DEF GHI
+
+
+
+
+
+
+
+ ]]>
+
+
+ "Hello World."
+
+
+
+
+
+
+
+ ]]>
+
+
+ "Hello World."
+
+
+
+
+
+
+
+ ]]>
+
+
+ #encoding=UTF-8
+ABC
+
+
+
+
+
+
+
+ ]]>
+
+
+ # This is a comment.
+ABC # This is another comment.
+DEF##param2
+"#GHI"
+
+
+
+
+
+
+
+ ]]>
+
+
+ %WRAPPER_LANG%
+"%WRAPPER_BIN_DIR%"
+%WRAPPER_BITS%
+
+
+
+
+
+
+
+
+wrapper.java.additional_file=../test/javaadditionalfile-01-empty.param]]>
-
-
-
+
+
-
-
-
+
+
+
-
-
+
+wrapper.java.additional_file=../test/javaadditionalfile-02-1line.param]]>
-
- -Dparam=param
+ -Dparam1=param1 -Dparam2=param2 -Dparam3=param3
-
-
-
+
+
+
-
-
+
-
- -Dparam="Hello World."
+ -Dparam="Hello World."
-
-
-
+
+
+
-
-
+
-
- -Dparam="Hello World."
+ -Dparam="Hello World."
-
-
-
+
+
+
-
-
+
+wrapper.java.additional_file=../test/javaadditionalfile-05-encoding.param]]>
-
- #encoding=UTF-8
+ #encoding=UTF-8
-Dparam=param
-
-
-
+
+
+
-
-
+
+wrapper.java.additional_file=../test/javaadditionalfile-06-multilines.param]]>
-
- # This is a comment.
+ # This is a comment.
-Dparam1=param1 # This is another comment.
-Dparam2=##param2
-Dparam3="#param3"
+
+
+
+
+
+
+
+
+
+
+ -Dparam1=%WRAPPER_LANG%
+-Dparam2="%WRAPPER_BIN_DIR%"
+-Dparam3=%WRAPPER_BITS%
+
@@ -1361,72 +1511,161 @@
token='set _WRAPPER_CONF_DEFAULT="../conf/%_WRAPPER_BASE%.conf"'
value='set _WRAPPER_CONF_DEFAULT=../test/performancestartstop.conf' />
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+ value='set _WRAPPER_CONF_DEFAULT=../test/appparameterfile-03-stripq-false.conf' />
-
+
-
-
+ value='set _WRAPPER_CONF_DEFAULT=../test/appparameterfile-04-stripq-true.conf' />
-
+
-
-
+ value='set _WRAPPER_CONF_DEFAULT=../test/appparameterfile-05-encoding.conf' />
-
+
-
-
+ value='set _WRAPPER_CONF_DEFAULT=../test/appparameterfile-06-multilines.conf' />
-
+
-
-
+ value='set _WRAPPER_CONF_DEFAULT=../test/appparameterfile-07-envvars.conf' />
-
+
+
-
-
+ value='set _WRAPPER_CONF_DEFAULT=../test/javaadditionalfile-01-empty.conf' />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1820,48 +2059,105 @@
filtering="on"/>
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
diff -Nru service-wrapper-java-3.5.22/debian/changelog service-wrapper-java-3.5.25/debian/changelog
--- service-wrapper-java-3.5.22/debian/changelog 2013-11-06 01:08:58.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/changelog 2014-07-26 23:40:04.000000000 +0000
@@ -1,3 +1,31 @@
+service-wrapper-java (3.5.25-1ubuntu1) trusty; urgency=medium
+
+ * Upload to PPA
+
+ -- Kill Your TV Sat, 26 Jul 2014 23:38:44 +0000
+
+service-wrapper-java (3.5.25-1) unstable; urgency=low
+
+ * Imported Upstream version 3.5.25
+
+ -- Kill Your TV Mon, 30 Jun 2014 18:07:32 +0000
+
+service-wrapper-java (3.5.24-1) unstable; urgency=medium
+
+ * Imported Upstream version 3.5.24
+ * Rebase kFreeBSD patch for 3.5.24
+ * bump standards version (no source changes needed)
+
+ -- Kill Your TV Fri, 21 Feb 2014 14:25:36 +0000
+
+service-wrapper-java (3.5.23-1) unstable; urgency=medium
+
+ * Imported Upstream version 3.5.23
+ * add mips patch
+ * rebase kFreeBSD patch for 3.5.23
+
+ -- Kill Your TV Tue, 10 Dec 2013 23:29:39 +0000
+
service-wrapper-java (3.5.22-1~trusty1) trusty; urgency=low
* Upload to PPA
diff -Nru service-wrapper-java-3.5.22/debian/control service-wrapper-java-3.5.25/debian/control
--- service-wrapper-java-3.5.22/debian/control 2013-11-06 01:08:58.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/control 2014-07-26 23:40:04.000000000 +0000
@@ -3,8 +3,8 @@
Priority: optional
Maintainer: Kill Your TV
Build-Depends: debhelper (>= 9), javahelper, default-jdk,
- ant, ant-optional, junit, junit4, hardening-wrapper
-Standards-Version: 3.9.4
+ ant, ant-optional, junit, junit4, libcunit1-ncurses-dev, libncurses5-dev
+Standards-Version: 3.9.5
Homepage: http://wrapper.tanukisoftware.com
Package: service-wrapper
diff -Nru service-wrapper-java-3.5.22/debian/patches/0001-x64-windows.patch service-wrapper-java-3.5.25/debian/patches/0001-x64-windows.patch
--- service-wrapper-java-3.5.22/debian/patches/0001-x64-windows.patch 2013-11-06 01:08:58.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/patches/0001-x64-windows.patch 2014-07-26 23:40:04.000000000 +0000
@@ -7,9 +7,6 @@
1 file changed, 62 insertions(+)
create mode 100644 src/c/Makefile-windows-x86-64.nmake
-diff --git a/src/c/Makefile-windows-x86-64.nmake b/src/c/Makefile-windows-x86-64.nmake
-new file mode 100644
-index 0000000..76adac5
--- /dev/null
+++ b/src/c/Makefile-windows-x86-64.nmake
@@ -0,0 +1,62 @@
@@ -28,21 +25,21 @@
+LINK = link /NOLOGO /MANIFEST /DEBUG /MACHINE:AMD64 /ERRORREPORT:PROMPT DelayImp.lib
+RC = rc
+
++
+# EXE Definitions
+EXE_OUTDIR = $(PROJ)32_VC8__Win64_Release
-+EXE_OBJS = $(EXE_OUTDIR)\wrapper_i18n.obj $(EXE_OUTDIR)\logger.obj $(EXE_OUTDIR)\property.obj $(EXE_OUTDIR)\wrapper.obj $(EXE_OUTDIR)\wrapper_win.obj $(EXE_OUTDIR)\wrappereventloop.obj $(EXE_OUTDIR)\wrapper_file.obj $(EXE_OUTDIR)\wrapperinfo.obj
++EXE_OBJS = $(EXE_OUTDIR)\wrapper.obj $(EXE_OUTDIR)\wrapperinfo.obj $(EXE_OUTDIR)\wrappereventloop.obj $(EXE_OUTDIR)\wrapper_win.obj $(EXE_OUTDIR)\property.obj $(EXE_OUTDIR)\logger.obj $(EXE_OUTDIR)\wrapper_file.obj $(EXE_OUTDIR)\wrapper_i18n.obj $(EXE_OUTDIR)\wrapper_hashmap.obj
+EXE_LIBS = mpr.lib shell32.lib netapi32.lib wsock32.lib shlwapi.lib advapi32.lib user32.lib Crypt32.lib Wintrust.lib pdh.lib
+EXE_COMPILE_OPTS = /O2 /GL /D "_CONSOLE"
+EXE_LINK_OPTS = /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFESTFILE:"$(EXE_OUTDIR)\$(PROJ).exe.intermediate.manifest" /PDB:"$(EXE_OUTDIR)\$(PROJ).pdb" /OPT:REF /OPT:ICF /LTCG
+
+# DLL Definitions
+DLL_OUTDIR = $(PROJ)JNI32_VC8__Win64_Release
-+DLL_OBJS = $(DLL_OUTDIR)\wrapper_i18n.obj $(DLL_OUTDIR)\wrapperjni.obj $(DLL_OUTDIR)\wrapperjni_win.obj $(DLL_OUTDIR)\wrapperinfo.obj
-+DLL_LIBS = shell32.lib advapi32.lib user32.lib
++DLL_OBJS = $(DLL_OUTDIR)\wrapper_i18n.obj $(DLL_OUTDIR)\wrapperjni_win.obj $(DLL_OUTDIR)\wrapperinfo.obj $(DLL_OUTDIR)\wrapperjni.obj $(DLL_OUTDIR)\loggerjni.obj
++DLL_LIBS = shell32.lib wsock32.lib advapi32.lib user32.lib
+DLL_COMPILE_OPTS = /Od /I "..\" /I ".\" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "_WINDOWS" /D "_USRDLL" /D "DECODERJNI_VC8_EXPORTS" /D "_WINDLL"
+DLL_LINK_OPTS = /INCREMENTAL /DLL /SUBSYSTEM:WINDOWS /MANIFESTFILE:"$(DLL_OUTDIR)\$(PROJ).dll.intermediate.manifest" /PDB:"$(DLL_OUTDIR)\$(PROJ).pdb"
+
-+
+all: $(EXE_OUTDIR) $(DLL_OUTDIR) $(PROJ).exe $(PROJ).dll
+
+# Define project specific macros
diff -Nru service-wrapper-java-3.5.22/debian/patches/0002-kfreebsd-support.patch service-wrapper-java-3.5.25/debian/patches/0002-kfreebsd-support.patch
--- service-wrapper-java-3.5.22/debian/patches/0002-kfreebsd-support.patch 2013-11-06 01:08:58.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/patches/0002-kfreebsd-support.patch 2014-07-26 23:40:04.000000000 +0000
@@ -6,9 +6,9 @@
build.xml | 5 ++++-
src/c/Makefile-kfreebsd-x86-32.make | 42 +++++++++++++++++++++++++++++++++++++
src/c/Makefile-kfreebsd-x86-64.make | 42 +++++++++++++++++++++++++++++++++++++
- src/c/logger.c | 2 +-
+ src/c/logger.c | 3 ++-
src/c/wrapper.c | 6 ++++--
- 5 files changed, 93 insertions(+), 4 deletions(-)
+ 5 files changed, 94 insertions(+), 4 deletions(-)
create mode 100644 src/c/Makefile-kfreebsd-x86-32.make
create mode 100644 src/c/Makefile-kfreebsd-x86-64.make
@@ -132,23 +132,24 @@
+#%.o: %.c
+# $(COMPILE) -c $(DEFS) $<
diff --git a/src/c/logger.c b/src/c/logger.c
-index 363d42f..fbc9fbd 100644
+index 15e5bc8..3c873bc 100644
--- a/src/c/logger.c
+++ b/src/c/logger.c
-@@ -76,7 +76,7 @@ typedef long intptr_t;
+@@ -74,7 +74,8 @@ typedef long intptr_t;
+ #include
#elif defined(AIX) || defined(HPUX) || defined(MACOSX) || defined(OSF1)
#elif defined(IRIX)
- #define PATH_MAX FILENAME_MAX
- #elif defined(FREEBSD)
++ #define PATH_MAX FILENAME_MAX
+ #elif defined(FREEBSD) || defined(KFREEBSD)
#include
#include
#else /* LINUX */
diff --git a/src/c/wrapper.c b/src/c/wrapper.c
-index 13312b5..1f4a064 100644
+index deed088..4807571 100644
--- a/src/c/wrapper.c
+++ b/src/c/wrapper.c
-@@ -98,7 +98,7 @@
+@@ -93,7 +93,7 @@
#elif defined(AIX) || defined(HPUX) || defined(MACOSX) || defined(OSF1)
#elif defined(IRIX)
#define PATH_MAX FILENAME_MAX
@@ -157,7 +158,7 @@
#include
#include
#else /* LINUX */
-@@ -4619,7 +4619,7 @@ int checkIfBinary(const TCHAR *filename) {
+@@ -4701,7 +4701,7 @@ int checkIfBinary(const TCHAR *filename) {
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Magic number for file %s: 0x%02x%02x%02x%02x"), filename, head[0], head[1], head[2], head[3]);
}
@@ -166,7 +167,7 @@
if (head[1] == 'E' && head[2] == 'L' && head[3] == 'F') {
return 1; /*ELF */
#elif defined(AIX)
-@@ -5912,6 +5912,8 @@ int wrapperBuildJavaCommandArrayInner(TCHAR **strings, int addQuotes, const TCHA
+@@ -6022,6 +6022,8 @@ int wrapperBuildJavaCommandArrayInner(TCHAR **strings, int addQuotes, const TCHA
TEXT("wrapper.java.additional.auto_bits.solaris"),
#elif defined(FREEBSD)
TEXT("wrapper.java.additional.auto_bits.freebsd"),
diff -Nru service-wrapper-java-3.5.22/debian/patches/0003-mips-support.patch service-wrapper-java-3.5.25/debian/patches/0003-mips-support.patch
--- service-wrapper-java-3.5.22/debian/patches/0003-mips-support.patch 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/patches/0003-mips-support.patch 2014-07-26 23:40:04.000000000 +0000
@@ -0,0 +1,63 @@
+From: Kill Your TV
+Date: Sat, 23 Nov 2013 00:17:46 +0000
+Subject: mips support
+
+---
+ src/c/Makefile-linux-mips-32.make | 48 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 48 insertions(+)
+ create mode 100644 src/c/Makefile-linux-mips-32.make
+
+diff --git a/src/c/Makefile-linux-mips-32.make b/src/c/Makefile-linux-mips-32.make
+new file mode 100644
+index 0000000..b27e7ec
+--- /dev/null
++++ b/src/c/Makefile-linux-mips-32.make
+@@ -0,0 +1,48 @@
++# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
++# http://www.tanukisoftware.com
++# All rights reserved.
++#
++# This software is the proprietary information of Tanuki Software.
++# You shall use it only in accordance with the terms of the
++# license agreement you entered into with Tanuki Software.
++# http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
++
++COMPILE = gcc -O3 -fPIC -Wall --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++
++INCLUDE=$(JAVA_HOME)/include
++
++DEFS = -I$(INCLUDE) -I$(INCLUDE)/linux
++
++wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c test.c wrapper_hashmap.c
++
++libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
++
++BIN = ../../bin
++LIB = ../../lib
++
++all: init wrapper libwrapper.so
++
++clean:
++ rm -f *.o
++
++cleanall: clean
++ rm -rf *~ .deps
++ rm -f $(BIN)/wrapper $(LIB)/libwrapper.so
++
++init:
++ if test ! -d .deps; then mkdir .deps; fi
++
++wrapper: $(wrapper_SOURCE)
++ $(COMPILE) -pthread $(wrapper_SOURCE) -lm -o $(BIN)/wrapper
++
++libwrapper.so: $(libwrapper_so_OBJECTS)
++ ${COMPILE} -shared $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
++
++%.o: %.c
++ @echo '$(COMPILE) -c $<'; \
++ $(COMPILE) $(DEFS) -Wp,-MD,.deps/$(*F).pp -c $<
++ @-cp .deps/$(*F).pp .deps/$(*F).P; \
++ tr ' ' '\012' < .deps/$(*F).pp \
++ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
++ >> .deps/$(*F).P; \
++ rm .deps/$(*F).pp
diff -Nru service-wrapper-java-3.5.22/debian/patches/0004-hardening-attempt.patch service-wrapper-java-3.5.25/debian/patches/0004-hardening-attempt.patch
--- service-wrapper-java-3.5.22/debian/patches/0004-hardening-attempt.patch 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/patches/0004-hardening-attempt.patch 2014-07-26 23:40:04.000000000 +0000
@@ -0,0 +1,120 @@
+From: Kill Your TV
+Date: Mon, 30 Jun 2014 21:12:31 +0000
+Subject: hardening attempt
+
+---
+ src/c/Makefile-linux-armel-32.make | 2 +-
+ src/c/Makefile-linux-armhf-32.make | 2 +-
+ src/c/Makefile-linux-ia-64.make | 2 +-
+ src/c/Makefile-linux-mips-32.make | 3 ++-
+ src/c/Makefile-linux-ppc-32.make | 2 +-
+ src/c/Makefile-linux-ppc-64.make | 2 +-
+ src/c/Makefile-linux-x86-32.make | 2 +-
+ src/c/Makefile-linux-x86-64.make | 2 +-
+ 8 files changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/src/c/Makefile-linux-armel-32.make b/src/c/Makefile-linux-armel-32.make
+index c257910..a4bbb08 100644
+--- a/src/c/Makefile-linux-armel-32.make
++++ b/src/c/Makefile-linux-armel-32.make
+@@ -7,7 +7,7 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -fPIC -Wall --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
+
+ INCLUDE=$(JAVA_HOME)/include
+
+diff --git a/src/c/Makefile-linux-armhf-32.make b/src/c/Makefile-linux-armhf-32.make
+index c257910..a4bbb08 100644
+--- a/src/c/Makefile-linux-armhf-32.make
++++ b/src/c/Makefile-linux-armhf-32.make
+@@ -7,7 +7,7 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -fPIC -Wall --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
+
+ INCLUDE=$(JAVA_HOME)/include
+
+diff --git a/src/c/Makefile-linux-ia-64.make b/src/c/Makefile-linux-ia-64.make
+index d4be3f1..9189c5e 100644
+--- a/src/c/Makefile-linux-ia-64.make
++++ b/src/c/Makefile-linux-ia-64.make
+@@ -7,7 +7,7 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -fPIC -Wall --pedantic -DLINUX -DJSW64 -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -DJSW64 -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
+
+ INCLUDE=$(JAVA_HOME)/include
+
+diff --git a/src/c/Makefile-linux-mips-32.make b/src/c/Makefile-linux-mips-32.make
+index b27e7ec..6e19912 100644
+--- a/src/c/Makefile-linux-mips-32.make
++++ b/src/c/Makefile-linux-mips-32.make
+@@ -7,7 +7,8 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -fPIC -Wall --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
++
+
+ INCLUDE=$(JAVA_HOME)/include
+
+diff --git a/src/c/Makefile-linux-ppc-32.make b/src/c/Makefile-linux-ppc-32.make
+index fbc2424..cac52a2 100644
+--- a/src/c/Makefile-linux-ppc-32.make
++++ b/src/c/Makefile-linux-ppc-32.make
+@@ -7,7 +7,7 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -m32 -fPIC -Wall --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -m32 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
+
+ INCLUDE=$(JAVA_HOME)/include
+
+diff --git a/src/c/Makefile-linux-ppc-64.make b/src/c/Makefile-linux-ppc-64.make
+index 78db926..018e4b6 100644
+--- a/src/c/Makefile-linux-ppc-64.make
++++ b/src/c/Makefile-linux-ppc-64.make
+@@ -7,7 +7,7 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -m64 -fPIC -Wall --pedantic -DLINUX -DJSW64 -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -m64 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -DJSW64 -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
+
+ INCLUDE=$(JAVA_HOME)/include
+
+diff --git a/src/c/Makefile-linux-x86-32.make b/src/c/Makefile-linux-x86-32.make
+index 5cad095..685ab8b 100644
+--- a/src/c/Makefile-linux-x86-32.make
++++ b/src/c/Makefile-linux-x86-32.make
+@@ -7,7 +7,7 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -fPIC -Wall --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
+
+ INCLUDE=$(JAVA_HOME)/include
+
+diff --git a/src/c/Makefile-linux-x86-64.make b/src/c/Makefile-linux-x86-64.make
+index d6af907..86eb2a3 100644
+--- a/src/c/Makefile-linux-x86-64.make
++++ b/src/c/Makefile-linux-x86-64.make
+@@ -7,7 +7,7 @@
+ # license agreement you entered into with Tanuki Software.
+ # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+
+-COMPILE = gcc -O3 -fPIC -Wall --pedantic -DLINUX -DJSW64 -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE
++COMPILE = gcc -O2 -fPIC -Wall -Wl,-z,relro --pedantic -DLINUX -DJSW64 -D_FILE_OFFSET_BITS=64 -fpic -D_GNU_SOURCE -DUNICODE -D_UNICODE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security
+
+ INCLUDE=$(JAVA_HOME)/include
+
diff -Nru service-wrapper-java-3.5.22/debian/patches/series service-wrapper-java-3.5.25/debian/patches/series
--- service-wrapper-java-3.5.22/debian/patches/series 2013-11-06 01:08:58.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/patches/series 2014-07-26 23:40:04.000000000 +0000
@@ -1,2 +1,4 @@
0001-x64-windows.patch
0002-kfreebsd-support.patch
+0003-mips-support.patch
+0004-hardening-attempt.patch
diff -Nru service-wrapper-java-3.5.22/debian/rules service-wrapper-java-3.5.25/debian/rules
--- service-wrapper-java-3.5.22/debian/rules 2013-11-06 01:08:58.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/rules 2014-07-26 23:40:04.000000000 +0000
@@ -14,7 +14,7 @@
export DEB_HOST_ARCH_CPU := $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)
export JAVA_HOME=/usr/lib/jvm/default-java
-export DEB_BUILD_HARDENING=1
+
#build:
# @echo 'The build target is disabled. Use the appropriate binary target.'
diff -Nru service-wrapper-java-3.5.22/debian/wrapper.1 service-wrapper-java-3.5.25/debian/wrapper.1
--- service-wrapper-java-3.5.22/debian/wrapper.1 2013-11-06 01:08:58.000000000 +0000
+++ service-wrapper-java-3.5.25/debian/wrapper.1 2014-07-26 23:40:04.000000000 +0000
@@ -1,45 +1,35 @@
-.TH JavaServiceWrapper 1 "10/08/2010"
+.TH javawrapper 1 "12/24/2012"
.SH NAME
wrapper \- Jar daemon wrapper
-.SH USAGE
- \fBwrapper\fP [configuration properties] [...]
- \fBwrapper\fP [configuration properties] [...]
- ( implicitly '-c')
- \fBwrapper\fP
- ( implicitly 'wrapper.conf')
- \fBwrapper\fP
- ( implicitly '-c' and 'wrapper.conf')
+.SH USAGE
+\fBwrapper\fP [\f[I]\f[]] [\f[I]\f[]] [\f[I]]\f[]
where can be one of:
- -c --console run as a Console application
- -v --version print the wrapper's version information.
- -? --help print this help message
- -- mark the end of Wrapper arguments. All arguments after the
- '--' will be passed through unmodified to the java application.
- is the wrapper.conf to use. Name must be absolute or relative
- to the location of \fBwrapper\fP
+.TP
+.B -c --console
+run as a Console application
+
+.TP
+.B -v --version
+print the wrapper's version information.
+
+.TP
+.B -? --help
+print this help message
+
+.TP
+.B --
+ mark the end of Wrapper arguments. All arguments after the '--' will be passed through unmodified to the java application.
-[configuration properties] are configuration name-value pairs which override values
- in wrapper.conf. For example:
+.TP
+ is the wrapper.conf to use. The filename must either be absolute or relative to the location of \fBwrapper\fP
+
+.TP
+\f[I]\f[] are configuration name-value pairs which override values in wrapper.conf. For example:
wrapper.debug=true
- Please note that any file references must be absolute or relative to the location
- of the Wrapper executable.
-.br
-.SH JAVA WRAPPER SERVICE DESCRIPTION
- The Java Service Wrapper makes very easy to install a Java Application as a
- daemon process on Unix systems. The Wrapper monitors a JVM (Java Virtual
- Machine) process and automatically restarts it if it that the JVM has crashed
- or hung. This process takes just a few seconds once the Wrapper has decided
- there is a problem. It also gives the ability to handle process priority.
-
-.br
-.SH AUTHOR
-Java Service Wrapper Community Edition 32-bit 3.5.3
-Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
-http://wrapper.tanukisoftware.com
+.TP
+Please note that any file references must be either absolute or relative to the location of the wrapper executable.
-.PP
-This manual page was written by RĂ©mi Debay .
diff -Nru service-wrapper-java-3.5.22/default.properties service-wrapper-java-3.5.25/default.properties
--- service-wrapper-java-3.5.22/default.properties 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/default.properties 2014-06-30 18:06:59.000000000 +0000
@@ -8,10 +8,10 @@
name = wrapper
Name = Wrapper
long.name = Java Service Wrapper Community ${Version}
-Version = 3.5.22
+Version = 3.5.25
version = ${Version}
-version.root = 3.5.22
-year = 2013
+version.root = 3.5.25
+year = 2014
# NOTE - The version property gets corrupted by the use of Xalan
# so Version is used instead.
diff -Nru service-wrapper-java-3.5.22/doc/revisions.txt service-wrapper-java-3.5.25/doc/revisions.txt
--- service-wrapper-java-3.5.22/doc/revisions.txt 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/doc/revisions.txt 2014-06-30 18:06:59.000000000 +0000
@@ -1,6 +1,123 @@
Java Service Wrapper Revision History.
--------------------------------------
+3.5.25
+* (Professional) Improve the wrapper.timer..interval property so it is now
+ possible to specify ranges and lists of values as well as offsets for
+ interval values to more precisely control when timers are fired.
+* (Professional) Fix a problem with the wrapper.timer..interval property
+ where timers would not fire during an interval the system time was set back.
+ Also fixed a problem where timers would stop firing permanently if the system
+ time was set forward by more than the value of the wrapper.timer.max_catchup
+ property and a timer had been scheduled to be fired during that interval.
+ Both of these issues were most likely during daylight savings time.
+* Fix a problem where signals received by the JVM were not being logged in
+ debug output correctly if the wrapper.ignore_signals property is set to true.
+ We now also log debug output even if a user event listener consumes the
+ signal event.
+* Fix a problem on Gentoo Linux where the shell script was not correctly
+ detecting the system architecture. This may also be a problem on other
+ distributions whose 'uname -p' returns a detailed architecture.
+* In the shell script, when the flag to use systemd (USE_SYSTEMD) is set,
+ the shell script generates a ".service" file in /etc/systemd/system/
+ when installing the Wrapper as a daemon.
+* In the shell script, add a function to validate the size of APP_NAME when
+ installing or removing the daemon on AIX.
+* It was possible to disable the logging of the Java command line even when
+ debug output was enabled by setting the wrapper.java.command.loglevel
+ property to NONE. This made it difficult to debug problems and is no longer
+ possible.
+* When the wrapper.java.version.output property is set to true, add debug log
+ output to show the actual command line used.
+* Fix a problem on Windows when the wrapper.java.version.output property is
+ true where it was possible that java executable being run to get the version
+ could be different than that used to run the application if the java
+ executable was being located on the default system PATH as well as the PATH
+ defined in the environment. The Wrapper now looks once and uses the same
+ fully resolved path in both places. For clarity, both java command lines are
+ now included in debug log output when the version is requested. (Bug #288)
+* Change the timing of the logging of the Java command line on UNIX so it is
+ consistent with Windows.
+* Improve the error message text thrown when a native feature is not available
+ from Java to be more clear about whether the problem is that the native
+ library could not be loaded versus the wrong edition being used.
+* On Windows, detect when the Wrapper is running under Cygwin and set the
+ default value for wrapper.console.flush to TRUE. On other platforms,
+ the script will display a message and stop running.
+* (Professional) Add support for WRAPPER_EVENT_TIME_* and WRAPPER_EVENT_RAND_*
+ variable references so event times can be used when events are fired.
+* Fix a buffer overflow problem on AIX which caused crashes or deadlocks on
+ startup for some users. This had been an issue since 3.5.0 but only reported
+ recently.
+* Remove output debug messages on UNIX when the wrapper.port.address property
+ was set.
+* Clean up code when converting multibyte characters to wide characters. Some
+ error checks were not implemented correctly. Found during a code review and
+ is not known to have actually caused any problems.
+
+3.5.24
+* Fix a problem where the message source of remote syslog messages from the JVM
+ were being logged as "jvm %d" rather than "jvm 1".
+* Add a new wrapper.syslog.split_messages property which controls whether or
+ not multi-line messages will be logged as is or first split into individual
+ lines.
+* Fix a problem on Windows Vista and above where the wrapper.single_invocation
+ property was not correctly identifying Wrapper instances running in different
+ sessions under some circumstances.
+
+3.5.23
+* Clean up the error messages logged when the Wrapper failed to elevate itself
+ on Windows platforms. They are now more informative.
+* (Professional) Fix a handle leak on Windows in WrapperProcess.isAlive().
+* (Professional) Modify the exception thrown when WrapperManager.exec is called
+ while the Wrapper is shutdown so it now says that rather than saying that the
+ native library is not loaded.
+* (Processional) The Wrapper is now more careful to make sure that the backend
+ is never closed while a child process is being launched to ensure that the
+ Wrapper knows about all child processes launched.
+* (Professional) Add a warning message in case the Wrapper is not notified of
+ a launched child process due to the backend connection being closed.
+* (Professional) Fix a potential NPE that could be thrown while reading stdout
+ or stderr output from a child process while the Wrapper was shutting down and
+ after the child process exited.
+* (Professional) Fix a problem on UNIX platforms where we were getting stuck
+ trying to cleanup after a process which was currently blocking on a read from
+ stdout or stderr.
+* (Professional) Fix a problem on UNIX platforms where a timeout attempting to
+ obtain an internal lock of the child process list was causing an internal
+ counter to get out of sync, leading to a other terminated child processes
+ being left as defunct zombies until the Java process terminated.
+* (Professional) Fix a problem on UNIX platforms where pipe file descriptions
+ used to communicate with child processes were being incorrectly passed to all
+ child processes. They were not growing over time.
+* (Professional) Fix a potential synchronization problem calling
+ WrapperProcess.waitFor() or WrapperProcess.exitValue().
+* Add additional debug log output showing the various timeout values to help
+ with debugging user issues.
+* Fix a problem where the shell script was not correctly detecting the OS
+ version with Mac OSX Maverick.
+* Add warnings about undefined environment variables in include file references
+ in the configuration file.
+* Add support for environment variable expansion in files specified with the
+ wrapper.java.additional_file and wrapper.app.parameter_file properties.
+* Correct the integer formatting in the WrapperUNIXGroup.toString() method so
+ it is consistent with the rest of the Wrapper.
+* Fix a problem where the iconv library requirement couldn't be satisfied in
+ FreeBSD 10. We now locate the library dynamically by looking for
+ /usr/local/lib/libiconv.so, /usr/local/lib/libbiconv.so, or
+ /lib/libkiconv.so.4 in that order.
+* Fix a the WrapperPrintStream.println method so strings containing linefeeds
+ will correctly have each line prepended with the configured header.
+* (Standard, Professional) When an unknown license type is encountered, include
+ the unknown type in the error message to help with debugging.
+* (Standard, Professional) Fix a problem on FreeBSD systems where the
+ wrapper.lang.encoding was not resolving to UTF-8 correctly when the LANG
+ environment variable was not set.
+* (Professional) Fix a memory corruption problem on z/OS when the language was
+ set to a double byte locale like Japanese.
+* Go through and make the Wrapper much more durable when badly encoded double
+ byte characters are encountered.
+
3.5.22
* (Standard, Professional) Fix a crash in native code behind WrapperResources
instances which could happen if the system was very low on memory. Since
@@ -30,7 +147,7 @@
was not being recognized if a wrapper.lang value was not set.
* (Standard, Professional) Fix a small memory leak resolving the language to
run the Wrapper with.
-* (Professional) Fix a potential buffer overlow reading data from a child
+* (Professional) Fix a potential buffer overflow reading data from a child
process stderr or stdout if the amount of data available in the pipe is
larger than the buffer length passed in to WrapperProcessInputStream.
read(byte b[], int off, int len).
@@ -110,11 +227,11 @@
* Add a new wrapper.property_warning.loglevel property which controls the log
level at which the Wrapper will log warnings about undefined but referenced
environment variables, as well as invalid boolean or integer values.
-* Update the way environment variables withing property values are parsed to
- make it possible to report those are not defined. Each pair of '%'s is now
- expected to be part of a variable reference. For example "%AAA%BBB%CCC%",
- previosly if "AAA" was not defined, "BBB" would be located, but now only
- "AAA" and "CCC" will be recognized as variables.
+* Update the way environment variable references within property values are
+ parsed to make it possible to report those which are not defined. Each pair
+ of '%'s is now expected to be part of a variable reference. For example
+ "%AAA%BBB%CCC%", previously if "AAA" was not defined, "BBB" would be located,
+ but now only "AAA" and "CCC" will be recognized as variables.
* Fix a problem on Windows where a non-existent wrapper.working.dir directory
was causing multiple error messages in the log file.
* Modify the way the wrapper.environment.dump property works so it will now
@@ -213,7 +330,7 @@
functions.
* Added wrapper.app.parameter_file property, which works similar to the
wrapper.java.additional_file property
-* Reduce CPU-consuption of WrapperProcess.waitFor() function
+* Reduce CPU-consumption of WrapperProcess.waitFor() function
3.5.16
* (Standard, Professional) Retry failed share mappings if the target host or
@@ -223,7 +340,7 @@
feature to run the child process in the logged on users desktop was
only allowing to create a process once per second.
* Include information about the base configuration file in the debug output
- when debugging of cacading configuration files has been enabled.
+ when debugging of cascading configuration files has been enabled.
* Add a check in the UNIX script to output a more descriptive error message,
when the user specified in the RUN_AS_USER variable doesn't exist.
* (Standard, Professional) Fix a problem where console log output was not being
@@ -264,7 +381,7 @@
* Add support for Linux on ARM systems.
* Re-Enabled the forced reloading of the SYSTEM (and if set to a specific
account, the user) registry before launching the Wrapper as a service on
- Windows XP and 2003. This has been originally disabeld for Windows XP and
+ Windows XP and 2003. This has been originally disabled for Windows XP and
2003 since version 3.5.5.
* (Standard, Professional) Fix a problem where the instance class names logged
when a deadlock involving ReentrantLock instances were corrupted. The actual
@@ -291,6 +408,8 @@
platform and stayed defunct after a forced kill until the Wrapper process
itself stopped. This was especially noticeable if the JVM is frozen and the
JVM is being killed forcibly.
+* Add additional debug log output showing the various timeout values to help
+ with debugging user issues.
3.5.15
* Add a new _WRAPPER_CONF_OVERRIDE setting to the Wrapper dedicated command
diff -Nru service-wrapper-java-3.5.22/README_de.txt service-wrapper-java-3.5.25/README_de.txt
--- service-wrapper-java-3.5.22/README_de.txt 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/README_de.txt 2014-06-30 18:06:59.000000000 +0000
@@ -1,6 +1,6 @@
-----------------------------------------------------------------------------
-Java Service Wrapper Community Edition 3.5.22
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Java Service Wrapper Community Edition 3.5.25
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
http://wrapper.tanukisoftware.com
-----------------------------------------------------------------------------
@@ -170,4 +170,4 @@
-----------------------------------------------------------------------------
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
diff -Nru service-wrapper-java-3.5.22/README_en.txt service-wrapper-java-3.5.25/README_en.txt
--- service-wrapper-java-3.5.22/README_en.txt 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/README_en.txt 2014-06-30 18:06:59.000000000 +0000
@@ -1,6 +1,6 @@
-----------------------------------------------------------------------------
-Java Service Wrapper Community Edition 3.5.22
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Java Service Wrapper Community Edition 3.5.25
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
http://wrapper.tanukisoftware.com
-----------------------------------------------------------------------------
@@ -161,4 +161,4 @@
-----------------------------------------------------------------------------
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
diff -Nru service-wrapper-java-3.5.22/README_es.txt service-wrapper-java-3.5.25/README_es.txt
--- service-wrapper-java-3.5.22/README_es.txt 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/README_es.txt 2014-06-30 18:06:59.000000000 +0000
@@ -1,6 +1,6 @@
-----------------------------------------------------------------------------
-Java Service Wrapper Community Edition 3.5.22
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Java Service Wrapper Community Edition 3.5.25
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
http://wrapper.tanukisoftware.com
-----------------------------------------------------------------------------
@@ -190,4 +190,4 @@
-----------------------------------------------------------------------------
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
diff -Nru service-wrapper-java-3.5.22/README_ja.txt service-wrapper-java-3.5.25/README_ja.txt
--- service-wrapper-java-3.5.22/README_ja.txt 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/README_ja.txt 2014-06-30 18:06:59.000000000 +0000
@@ -1,6 +1,6 @@
-----------------------------------------------------------------------------
-Java Service Wrapper Community Edition 3.5.22
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Java Service Wrapper Community Edition 3.5.25
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
http://wrapper.tanukisoftware.com
-----------------------------------------------------------------------------
@@ -172,4 +172,4 @@
-----------------------------------------------------------------------------
-Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.
+Copyright (C) 1999-2014 Tanuki Software, Ltd. All Rights Reserved.
diff -Nru service-wrapper-java-3.5.22/src/bin/App.bat.in service-wrapper-java-3.5.25/src/bin/App.bat.in
--- service-wrapper-java-3.5.22/src/bin/App.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/App.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -15,7 +15,7 @@
rem
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/AppCommand.bat.in service-wrapper-java-3.5.25/src/bin/AppCommand.bat.in
--- service-wrapper-java-3.5.22/src/bin/AppCommand.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/AppCommand.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/AppNoWrapper.bat.in service-wrapper-java-3.5.25/src/bin/AppNoWrapper.bat.in
--- service-wrapper-java-3.5.22/src/bin/AppNoWrapper.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/AppNoWrapper.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
diff -Nru service-wrapper-java-3.5.22/src/bin/AppTemplate.bat.in service-wrapper-java-3.5.25/src/bin/AppTemplate.bat.in
--- service-wrapper-java-3.5.22/src/bin/AppTemplate.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/AppTemplate.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/AppTemplatePassThrough.bat.in service-wrapper-java-3.5.25/src/bin/AppTemplatePassThrough.bat.in
--- service-wrapper-java-3.5.22/src/bin/AppTemplatePassThrough.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/AppTemplatePassThrough.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -15,7 +15,7 @@
rem
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/InstallApp-NT.bat.in service-wrapper-java-3.5.25/src/bin/InstallApp-NT.bat.in
--- service-wrapper-java-3.5.22/src/bin/InstallApp-NT.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/InstallApp-NT.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -15,7 +15,7 @@
rem
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/PauseApp-NT.bat.in service-wrapper-java-3.5.25/src/bin/PauseApp-NT.bat.in
--- service-wrapper-java-3.5.22/src/bin/PauseApp-NT.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/PauseApp-NT.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/QueryApp-NT.bat.in service-wrapper-java-3.5.25/src/bin/QueryApp-NT.bat.in
--- service-wrapper-java-3.5.22/src/bin/QueryApp-NT.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/QueryApp-NT.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/ResumeApp-NT.bat.in service-wrapper-java-3.5.25/src/bin/ResumeApp-NT.bat.in
--- service-wrapper-java-3.5.22/src/bin/ResumeApp-NT.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/ResumeApp-NT.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/sh.script.in service-wrapper-java-3.5.25/src/bin/sh.script.in
--- service-wrapper-java-3.5.22/src/bin/sh.script.in 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/sh.script.in 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
#! /bin/sh
#
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -16,7 +16,7 @@
#-----------------------------------------------------------------------------
# These settings can be modified to fit the needs of your application
-# Optimized for use with version 3.5.22 of the Wrapper.
+# Optimized for use with version 3.5.25 of the Wrapper.
# IMPORTANT - Please always stop and uninstall an application before making
# any changes to this file. Failure to do so could remove the
@@ -97,6 +97,9 @@
# flag for using upstart when installing (rather than init.d rc.d)
USE_UPSTART=
+# flag for using systemd when installing
+USE_SYSTEMD=
+
# When installing on On Mac OSX platforms, the following domain will be used to
# prefix the plist file name.
PLIST_DOMAIN=org.tanukisoftware.wrapper
@@ -134,6 +137,14 @@
# Do not modify anything beyond this point
#-----------------------------------------------------------------------------
+# check if we are running under Cygwin terminal
+CYGWIN=`uname -o`
+if [ "$CYGWIN" = "Cygwin" ]
+then
+ eval echo `gettext 'This script is not compatible with Cygwin. Please use the Wrapper batch files to control the Wrapper.'`
+ exit 1
+fi
+
if [ -n "$FIXED_COMMAND" ]
then
COMMAND="$FIXED_COMMAND"
@@ -281,7 +292,7 @@
# Resolve the architecture
if [ "$DIST_OS" = "macosx" ]
then
- OS_VER=`sw_vers | grep 'ProductVersion:' | grep -o '[0-9]*\.[0-9]*\.[0-9]*'`
+ OS_VER=`sw_vers | grep 'ProductVersion:' | grep -o '[0-9]*\.[0-9]*\.[0-9]*\|[0-9]*\.[0-9]*'`
DIST_ARCH="universal"
if [[ "$OS_VER" < "10.5.0" ]]
then
@@ -297,8 +308,12 @@
APP_PLIST_BASE=${PLIST_DOMAIN}.${APP_NAME}
APP_PLIST=${APP_PLIST_BASE}.plist
else
- DIST_ARCH=
- DIST_ARCH=`uname -p 2>/dev/null | $TREXE "[A-Z]" "[a-z]" | $TREXE -d ' '`
+ if [ "$DIST_OS" = "linux" ]
+ then
+ DIST_ARCH=
+ else
+ DIST_ARCH=`uname -p 2>/dev/null | $TREXE "[A-Z]" "[a-z]" | $TREXE -d ' '`
+ fi
if [ "X$DIST_ARCH" = "X" ]
then
DIST_ARCH="unknown"
@@ -855,7 +870,7 @@
prepAdditionalParams "$@"
# The string passed to eval must handles spaces in paths correctly.
- COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP wrapper.script.version=3.5.22 $ADDITIONAL_PARA"
+ COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP wrapper.script.version=3.5.25 $ADDITIONAL_PARA"
eval $COMMAND_LINE
else
eval echo `gettext '$APP_LONG_NAME is already running.'`
@@ -878,7 +893,7 @@
prepAdditionalParams "$@"
# The string passed to eval must handles spaces in paths correctly.
- COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" $ANCHORPROP $STATUSPROP $COMMANDPROP $LOCKPROP wrapper.script.version=3.5.22 $ADDITIONAL_PARA"
+ COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" $ANCHORPROP $STATUSPROP $COMMANDPROP $LOCKPROP wrapper.script.version=3.5.25 $ADDITIONAL_PARA"
eval $COMMAND_LINE
else
eval echo `gettext '$APP_LONG_NAME is already running.'`
@@ -1000,7 +1015,7 @@
prepAdditionalParams "$@"
# The string passed to eval must handles spaces in paths correctly.
- COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP wrapper.script.version=3.5.22 $ADDITIONAL_PARA"
+ COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP wrapper.script.version=3.5.25 $ADDITIONAL_PARA"
eval $COMMAND_LINE
else
eval echo `gettext '$APP_LONG_NAME is already running.'`
@@ -1104,6 +1119,15 @@
fi
}
+# Make sure APP_NAME is less than 14 characters, otherwise in AIX, the command
+# "lsitab" will fail
+validateAppNameLength() {
+ if [ ${#APP_NAME} -gt 14 ] ; then
+ eval echo `gettext ' APP_NAME (${APP_NAME}) must be less than 14 characters long'`
+ exit 1
+ fi
+}
+
installUpstart() {
eval echo `gettext ' Installing the $APP_LONG_NAME daemon using upstart..'`
if [ -f "${REALDIR}/${APP_NAME}.install" ] ; then
@@ -1121,6 +1145,30 @@
fi
}
+installSystemd() {
+ eval echo `gettext ' Installing the $APP_LONG_NAME daemon using systemd..'`
+ if [ -f "${REALDIR}/${APP_NAME}.service" ] ; then
+ eval echo `gettext ' a custom service file ${APP_NAME}.service found'`
+ cp "${REALDIR}/${APP_NAME}.service" "/etc/systemd/system/${APP_NAME}.service"
+ else
+ eval echo `gettext ' creating default service file..'`
+ echo "[Unit]" > "/etc/systemd/system/${APP_NAME}.service"
+ echo "Description=${APP_LONG_NAME}" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "After=syslog.target" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "[Service]" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "Type=forking" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "ExecStart=\"${REALPATH}\" start" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "ExecStop=\"${REALPATH}\" stop" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "[Install]" >> "/etc/systemd/system/${APP_NAME}.service"
+ echo "WantedBy=multi-user.target" >> "/etc/systemd/system/${APP_NAME}.service"
+
+ systemctl daemon-reload
+ systemctl enable "${APP_NAME}.service"
+ fi
+}
+
installdaemon() {
if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then
eval echo `gettext 'Must be root to perform this action.'`
@@ -1148,6 +1196,8 @@
if [ -f "/etc/init.d/$APP_NAME" -o -L "/etc/init.d/$APP_NAME" -o -f "/etc/init/${APP_NAME}.conf" ] ; then
eval echo `gettext ' The $APP_LONG_NAME daemon is already installed.'`
exit 1
+ elif [ -n "$USE_SYSTEMD" -a -d "/etc/systemd" ] ; then
+ installSystemd
else
if [ -n "$USE_UPSTART" -a -d "/etc/init" ] ; then
installUpstart
@@ -1163,6 +1213,8 @@
if [ -f "/etc/init.d/$APP_NAME" -o -L "/etc/init.d/$APP_NAME" ] ; then
eval echo `gettext ' The $APP_LONG_NAME daemon is already installed.'`
exit 1
+ elif [ -n "$USE_SYSTEMD" -a -d "/etc/systemd" ] ; then
+ installSystemd
else
eval echo `gettext ' Installing the $APP_LONG_NAME daemon..'`
ln -s "$REALPATH" "/etc/init.d/$APP_NAME"
@@ -1174,7 +1226,9 @@
eval echo `gettext ' The $APP_LONG_NAME daemon is already installed.'`
exit 1
else
- if [ -n "$USE_UPSTART" -a -d "/etc/init" ] ; then
+ if [ -n "$USE_SYSTEMD" -a -d "/etc/systemd" ] ; then
+ installSystemd
+ elif [ -n "$USE_UPSTART" -a -d "/etc/init" ] ; then
installUpstart
else
eval echo `gettext ' Installing the $APP_LONG_NAME daemon using init.d..'`
@@ -1187,7 +1241,7 @@
if [ -f "/etc/init.d/$APP_NAME" -o -L "/etc/init.d/$APP_NAME" ] ; then
eval echo `gettext ' The $APP_LONG_NAME daemon is already installed.'`
exit 1
- else
+ # "lsitab" will failse
eval echo `gettext ' Installing the $APP_LONG_NAME daemon..'`
ln -s "$REALPATH" /etc/init.d/$APP_NAME
for i in `ls "/etc/rc3.d/K"??"$APP_NAME_LOWER" "/etc/rc5.d/K"??"$APP_NAME_LOWER" "/etc/rc3.d/S"??"$APP_NAME_LOWER" "/etc/rc5.d/S"??"$APP_NAME_LOWER" 2>/dev/null` ; do
@@ -1217,6 +1271,7 @@
fi
elif [ "$DIST_OS" = "aix" ] ; then
eval echo `gettext 'Detected AIX:'`
+ validateAppNameLength
if [ -f "/etc/rc.d/init.d/$APP_NAME" ] ; then
eval echo `gettext ' The $APP_LONG_NAME daemon is already installed as rc.d script.'`
exit 1
@@ -1354,6 +1409,12 @@
/sbin/chkconfig "$APP_NAME" off
/sbin/chkconfig --del "$APP_NAME"
rm -f "/etc/init.d/$APP_NAME"
+ elif [ -f "/etc/systemd/system/${APP_NAME}.service" ] ; then
+ stopit "0"
+ eval echo `gettext ' Removing $APP_LONG_NAME daemon from systemd...'`
+ systemctl stop "${APP_NAME}.service"
+ rm "/etc/systemd/system/${APP_NAME}.service"
+ systemctl daemon-reload
elif [ -f "/etc/init/${APP_NAME}.conf" ] ; then
stopit "0"
eval echo `gettext ' Removing $APP_LONG_NAME daemon from upstart...'`
@@ -1369,6 +1430,12 @@
eval echo `gettext ' Removing $APP_LONG_NAME daemon...'`
insserv -r "/etc/init.d/$APP_NAME"
rm -f "/etc/init.d/$APP_NAME"
+ elif [ -f "/etc/systemd/system/${APP_NAME}.service" ] ; then
+ stopit "0"
+ eval echo `gettext ' Removing $APP_LONG_NAME daemon from systemd...'`
+ systemctl stop "${APP_NAME}.service"
+ rm "/etc/systemd/system/${APP_NAME}.service"
+ systemctl daemon-reload
else
eval echo `gettext ' The $APP_LONG_NAME daemon is not currently installed.'`
exit 1
@@ -1380,6 +1447,12 @@
eval echo `gettext ' Removing $APP_LONG_NAME daemon from init.d...'`
update-rc.d -f "$APP_NAME" remove
rm -f "/etc/init.d/$APP_NAME"
+ elif [ -f "/etc/systemd/system/${APP_NAME}.service" ] ; then
+ stopit "0"
+ eval echo `gettext ' Removing $APP_LONG_NAME daemon from systemd...'`
+ systemctl stop "${APP_NAME}.service"
+ rm "/etc/systemd/system/${APP_NAME}.service"
+ systemctl daemon-reload
elif [ -f "/etc/init/${APP_NAME}.conf" ] ; then
stopit "0"
eval echo `gettext ' Removing $APP_LONG_NAME daemon from upstart...'`
@@ -1415,6 +1488,7 @@
fi
elif [ "$DIST_OS" = "aix" ] ; then
eval echo `gettext 'Detected AIX:'`
+ validateAppNameLength
if [ -f "/etc/rc.d/init.d/$APP_NAME" -o -L "/etc/rc.d/init.d/$APP_NAME" -o -n "`/usr/sbin/lsitab $APP_NAME`" -o -n "`/usr/bin/lssrc -S -s $APP_NAME`" ] ; then
stopit "0"
eval echo `gettext ' Removing $APP_LONG_NAME daemon...'`
diff -Nru service-wrapper-java-3.5.22/src/bin/StartApp-NT.bat.in service-wrapper-java-3.5.25/src/bin/StartApp-NT.bat.in
--- service-wrapper-java-3.5.22/src/bin/StartApp-NT.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/StartApp-NT.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/StopApp-NT.bat.in service-wrapper-java-3.5.25/src/bin/StopApp-NT.bat.in
--- service-wrapper-java-3.5.22/src/bin/StopApp-NT.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/StopApp-NT.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/bin/UninstallApp-NT.bat.in service-wrapper-java-3.5.25/src/bin/UninstallApp-NT.bat.in
--- service-wrapper-java-3.5.22/src/bin/UninstallApp-NT.bat.in 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/bin/UninstallApp-NT.bat.in 2014-06-30 18:06:59.000000000 +0000
@@ -2,7 +2,7 @@
setlocal
rem
-rem Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+rem Copyright (c) 1999, 2014 Tanuki Software, Ltd.
rem http://www.tanukisoftware.com
rem All rights reserved.
rem
@@ -16,7 +16,7 @@
rem -----------------------------------------------------------------------------
rem These settings can be modified to fit the needs of your application
-rem Optimized for use with version 3.5.22 of the Wrapper.
+rem Optimized for use with version 3.5.25 of the Wrapper.
rem The base name for the Wrapper binary.
set _WRAPPER_BASE=wrapper
diff -Nru service-wrapper-java-3.5.22/src/c/logger_base.h service-wrapper-java-3.5.25/src/c/logger_base.h
--- service-wrapper-java-3.5.22/src/c/logger_base.h 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/logger_base.h 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#ifndef _LOGGER_BASE_H
+#define _LOGGER_BASE_H
+
+#include "wrapper_i18n.h"
+
+/* * * Log level constants * * */
+
+/* No logging at all. */
+#define LEVEL_NONE 9
+
+/* Notice messages which should always be displayed. These never go to the syslog. */
+#define LEVEL_NOTICE 8
+
+/* Advisor messages which should always be displayed. These never go to the syslog. */
+#define LEVEL_ADVICE 7
+
+/* Too many restarts, unable to start etc. Case when the Wrapper is forced to exit. */
+#define LEVEL_FATAL 6
+
+/* JVM died, hung messages */
+#define LEVEL_ERROR 5
+
+/* Warning messages. */
+#define LEVEL_WARN 4
+
+/* Started, Stopped, Restarted messages. */
+#define LEVEL_STATUS 3
+
+/* Copyright message. and logged console output. */
+#define LEVEL_INFO 2
+
+/* Current debug messages */
+#define LEVEL_DEBUG 1
+
+/* Unknown level */
+#define LEVEL_UNKNOWN 0
+
+/* The maximum length of a source string, not including the null character. */
+#define MAX_SOURCE_LENGTH 8
+
+/* * * Function predeclaration * * */
+#define strcmpIgnoreCase(str1, str2) _tcsicmp(str1, str2)
+
+extern TCHAR* getLastErrorText();
+
+extern int getLastError();
+
+extern void outOfMemory(const TCHAR *context, int id);
+
+#endif
diff -Nru service-wrapper-java-3.5.22/src/c/logger.c service-wrapper-java-3.5.25/src/c/logger.c
--- service-wrapper-java-3.5.22/src/c/logger.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/logger.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -44,38 +44,36 @@
#include "wrapper_file.h"
#ifdef WIN32
-#include
-#include
-#include
-#include
-#include
-#include
-#include "messages.h"
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include "messages.h"
/* MS Visual Studio 8 went and deprecated the POXIX names for functions.
* Fixing them all would be a big headache for UNIX versions. */
-#pragma warning(disable : 4996)
+ #pragma warning(disable : 4996)
/* Defines for MS Visual Studio 6 */
-#ifndef _INTPTR_T_DEFINED
+ #ifndef _INTPTR_T_DEFINED
typedef long intptr_t;
-#define _INTPTR_T_DEFINED
-#endif
+ #define _INTPTR_T_DEFINED
+ #endif
#else
-#include
-#include
-#include
-#include
-#include
-
+ #include
+ #include
+ #include
+ #include
+ #include
#if defined(SOLARIS)
#include
#include
#elif defined(AIX) || defined(HPUX) || defined(MACOSX) || defined(OSF1)
#elif defined(IRIX)
- #define PATH_MAX FILENAME_MAX
#elif defined(FREEBSD)
#include
#include
@@ -89,11 +87,11 @@
#include "logger.h"
#ifndef TRUE
-#define TRUE -1
+ #define TRUE -1
#endif
#ifndef FALSE
-#define FALSE 0
+ #define FALSE 0
#endif
const TCHAR* defaultLogFile = TEXT("wrapper.log");
@@ -114,6 +112,7 @@
int currentConsoleLevel = LEVEL_UNKNOWN;
int currentLogfileLevel = LEVEL_UNKNOWN;
int currentLoginfoLevel = LEVEL_UNKNOWN;
+int currentLogSplitMessages = FALSE;
/* Default syslog facility is LOG_USER */
int currentLogfacilityLevel = LOG_USER;
@@ -128,9 +127,12 @@
int logBufferGrowth = FALSE;
TCHAR *logFilePath;
+
+/* Size of the currentLogFileName and workLogFileName buffers. */
+size_t currentLogFileNameSize;
TCHAR *currentLogFileName;
TCHAR *workLogFileName;
-size_t logFileNameSize;
+
int logFileRollMode = ROLL_MODE_SIZE;
int logFileUmask = 0022;
TCHAR *logLevelNames[] = { TEXT("NONE "), TEXT("DEBUG "), TEXT("INFO "), TEXT("STATUS"), TEXT("WARN "), TEXT("ERROR "), TEXT("FATAL "), TEXT("ADVICE"), TEXT("NOTICE") };
@@ -650,7 +652,8 @@
TCHAR *c;
#endif
- logFileNameSize = len + 10 + 1;
+ /* The currentLogFileNameSize is the size of log_file_path + 10 ("." + a roll number) + 1 (NULL). */
+ currentLogFileNameSize = len + 10 + 1;
if (logFilePath) {
free(logFilePath);
free(currentLogFileName);
@@ -667,7 +670,7 @@
}
_tcsncpy(logFilePath, log_file_path, len + 1);
- currentLogFileName = malloc(sizeof(TCHAR) * (len + 10 + 1));
+ currentLogFileName = malloc(sizeof(TCHAR) * currentLogFileNameSize);
if (!currentLogFileName) {
outOfMemoryQueued(TEXT("SLP"), 2);
free(logFilePath);
@@ -675,13 +678,13 @@
return TRUE;
}
currentLogFileName[0] = TEXT('\0');
- workLogFileName = malloc(sizeof(TCHAR) * (len + 10 + 1));
+ workLogFileName = malloc(sizeof(TCHAR) * currentLogFileNameSize);
if (!workLogFileName) {
outOfMemoryQueued(TEXT("SLP"), 3);
free(logFilePath);
logFilePath = NULL;
free(currentLogFileName);
- logFileNameSize = 0;
+ currentLogFileNameSize = 0;
currentLogFileName = NULL;
return TRUE;
}
@@ -732,7 +735,7 @@
* If that is false then we will return an empty length, but valid, string. */
logFileCopy = malloc(sizeof(TCHAR) * (_tcslen(currentLogFileName) + 1));
if (!logFileCopy) {
- _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("P3"));
+ _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("CLFP1"));
} else {
_tcsncpy(logFileCopy, currentLogFileName, _tcslen(currentLogFileName) + 1);
}
@@ -1182,6 +1185,10 @@
setSyslogLevelInt(getLogLevelForName(loginfo_level));
}
+void setSyslogSplitMessages(int splitMessages) {
+ currentLogSplitMessages = splitMessages;
+}
+
#ifndef WIN32
void setSyslogFacilityInt( int logfacility_level ) {
currentLogfacilityLevel = logfacility_level;
@@ -1203,7 +1210,11 @@
#ifdef WIN32
size = sizeof(TCHAR) * (_tcslen(event_source_name) + 1);
#else
- size = wcstombs(NULL, event_source_name, 0) + 1;
+ size = wcstombs(NULL, event_source_name, 0);
+ if (size == (size_t)-1) {
+ return;
+ }
+ size++;
#endif
loginfoSourceName = malloc(size);
if (!loginfoSourceName) {
@@ -1530,11 +1541,14 @@
* Generates a log file name given.
*
* buffer - Buffer into which to _sntprintf the generated name.
+ * bufferSize - Size of the buffer.
* template - Template from which the name is generated.
* nowDate - Optional date used to replace any YYYYMMDD tokens.
* rollNum - Optional roll number used to replace any ROLLNUM tokens.
*/
-void generateLogFileName(TCHAR *buffer, const TCHAR *template, const TCHAR *nowDate, const TCHAR *rollNum ) {
+void generateLogFileName(TCHAR *buffer, size_t bufferSize, const TCHAR *template, const TCHAR *nowDate, const TCHAR *rollNum ) {
+ size_t bufferLen;
+
/* Copy the template to the buffer to get started. */
_tcsncpy(buffer, template, _tcslen(logFilePath) + 11);
@@ -1568,7 +1582,9 @@
/* The name did not contain a ROLLNUM token. */
if (rollNum != NULL ) {
/* Generate the name as if ".ROLLNUM" was appended to the template. */
- _sntprintf(buffer + _tcslen(buffer), logFileNameSize, TEXT(".%s"), rollNum);
+ bufferLen = _tcslen(buffer);
+ _sntprintf(buffer + bufferLen, bufferSize - bufferLen, TEXT(".%s"), rollNum);
+ buffer[bufferSize - 1] = TEXT('\0');
}
}
}
@@ -1649,9 +1665,9 @@
/* Generate the log file name if it is not already set. */
if (currentLogFileName[0] == TEXT('\0')) {
if (logFileRollMode & ROLL_MODE_DATE) {
- generateLogFileName(currentLogFileName, logFilePath, nowDate, NULL);
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, nowDate, NULL);
} else {
- generateLogFileName(currentLogFileName, logFilePath, NULL, NULL);
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, NULL, NULL);
}
logFileChanged = TRUE;
}
@@ -1684,7 +1700,7 @@
/* Try the default file location. */
setLogfilePath(defaultLogFile, NULL, TRUE);
- _sntprintf(currentLogFileName, logFileNameSize, defaultLogFile);
+ _sntprintf(currentLogFileName, currentLogFileNameSize, defaultLogFile);
logFileChanged = TRUE;
logfileFP = _tfopen(currentLogFileName, TEXT("a"));
if (logfileFP == NULL) {
@@ -1959,19 +1975,21 @@
previousNowMillis = nowMillis;
break;
}
-
- /* Syslog messages are printed first so we can print them including line feeds as is.
- * This must be done before we break up multi-line messages into individual lines. */
-#ifdef WIN32
- if (sysLogEnabled) {
-#else
- /* On UNIX we never want to log to the syslog here if this is in a forked thread.
- * In this case, any lines will be broken up into individual lines and then logged
- * as usual by the main process. But this can't be helped and is very rare anyway. */
- if (sysLogEnabled && (_tcsstr(message, LOG_FORK_MARKER) != message)) {
+
+ if (!currentLogSplitMessages) {
+ /* Syslog messages are printed first so we can print them including line feeds as is.
+ * This must be done before we break up multi-line messages into individual lines. */
+#ifdef WIN32
+ if (sysLogEnabled) {
+#else
+ /* On UNIX we never want to log to the syslog here if this is in a forked thread.
+ * In this case, any lines will be broken up into individual lines and then logged
+ * as usual by the main process. But this can't be helped and is very rare anyway. */
+ if (sysLogEnabled && (_tcsstr(message, LOG_FORK_MARKER) != message)) {
#endif
- /* syslog/Eventlog. */
- log_printf_message_sysLog(source_id, level, message, nowTM, FALSE);
+ /* syslog/Eventlog. */
+ log_printf_message_sysLog(source_id, level, message, nowTM, FALSE);
+ }
}
/* If the message contains line feeds then break up the line into substrings and recurse. */
@@ -2051,6 +2069,11 @@
/* The current thread was specified. Resolve what thread this actually is. */
threadId = getThreadId();
}
+
+ /* Syslog outbut by format (If messages splitting is enabled. Otherwise done above.) */
+ if (currentLogSplitMessages) {
+ log_printf_message_sysLog(source_id, level, message, nowTM, FALSE);
+ }
/* Console output by format */
log_printf_message_console(source_id, level, threadId, queued, message, nowTM, nowMillis, durationMillis);
@@ -2152,7 +2175,7 @@
}
msg[wcslen(lpszFmt)] = TEXT('\0');
} else {
- _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("P0"));
+ _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("P1"));
return;
}
flag = TRUE;
@@ -2177,7 +2200,7 @@
#endif
threadMessageBuffer = malloc(sizeof(TCHAR) * threadMessageBufferSize);
if (!threadMessageBuffer) {
- _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("P1"));
+ _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("P2"));
threadMessageBufferSize = 0;
#if defined(UNICODE) && !defined(WIN32)
if (flag == TRUE) {
@@ -2260,7 +2283,7 @@
* depending on where exactly this function was called from. (See Wrapper protocol mutex.) */
logFileCopy = malloc(sizeof(TCHAR) * (_tcslen(currentLogFileName) + 1));
if (!logFileCopy) {
- _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("P3"));
+ _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("P4"));
} else {
_tcsncpy(logFileCopy, currentLogFileName, _tcslen(currentLogFileName) + 1);
/* Now after we have 100% prepared the log file name. Put into the queue variable
@@ -2349,7 +2372,7 @@
TCHAR* t;
size_t req;
c = strerror(errno);
- req = mbstowcs(NULL, c, 0);
+ req = mbstowcs(NULL, c, MBSTOWCS_QUERY_LENGTH);
if (req == (size_t)-1) {
invalidMultiByteSequence(TEXT("GLET"), 1);
return NULL;
@@ -2360,6 +2383,7 @@
return NULL;
}
mbstowcs(t, c, req + 1);
+ t[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
return t;
#else
@@ -2485,6 +2509,7 @@
default:
_sntprintf( header, 16, TEXT("jvm %d"), source_id );
+ header[15] = TEXT('\0'); /* Just in case we get lots of restarts. */
break;
}
@@ -2920,7 +2945,7 @@
do {
i++;
_sntprintf(rollNum, 11, TEXT("%d"), i);
- generateLogFileName(workLogFileName, logFilePath, NULL, rollNum);
+ generateLogFileName(workLogFileName, currentLogFileNameSize, logFilePath, NULL, rollNum);
result = _tstat(workLogFileName, &fileStat);
#ifdef _DEBUG
if (result == 0) {
@@ -2933,7 +2958,7 @@
for (; i > 1; i--) {
_tcsncpy(currentLogFileName, workLogFileName, _tcslen(logFilePath) + 11);
_sntprintf(rollNum, 11, TEXT("%d"), i - 1);
- generateLogFileName(workLogFileName, logFilePath, NULL, rollNum);
+ generateLogFileName(workLogFileName, currentLogFileNameSize, logFilePath, NULL, rollNum);
if ((logFileMaxLogFiles > 0) && (i > logFileMaxLogFiles) && (!logFilePurgePattern)) {
/* The file needs to be deleted rather than rolled. If a purge pattern was not specified,
@@ -2955,7 +2980,7 @@
log_printf_queue(TRUE, WRAPPER_SOURCE_WRAPPER, LEVEL_WARN, TEXT("Unable to delete old log file: %s (%s)"), workLogFileName, getLastErrorText());
}
rollFailure = TRUE;
- generateLogFileName(currentLogFileName, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
return;
}
} else {
@@ -2969,7 +2994,7 @@
log_printf_queue(TRUE, WRAPPER_SOURCE_WRAPPER, LEVEL_WARN, TEXT("Unable to delete old log file: %s"), workLogFileName);
}
rollFailure = TRUE;
- generateLogFileName(currentLogFileName, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
return;
}
#ifdef _DEBUG
@@ -2997,7 +3022,7 @@
#endif
}
rollFailure = TRUE;
- generateLogFileName(currentLogFileName, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
return;
}
#ifdef _DEBUG
@@ -3009,7 +3034,7 @@
}
/* Rename the current file to the #1 index position */
- generateLogFileName(currentLogFileName, logFilePath, NULL, NULL);
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, NULL, NULL);
if (_trename(currentLogFileName, workLogFileName) != 0) {
if (rollFailure == FALSE) {
if (getLastError() == 2) {
@@ -3028,7 +3053,7 @@
}
}
rollFailure = TRUE;
- generateLogFileName(currentLogFileName, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, NULL, NULL); /* Set the name back so we don't cause a logfile name changed event. */
return;
}
#ifdef _DEBUG
@@ -3122,12 +3147,12 @@
* Check the maximum file count. */
if (logFileMaxLogFiles > 0) {
/* We will check for too many files here and then clear the current log file name so it will be set later. */
- generateLogFileName(currentLogFileName, logFilePath, nowDate, NULL);
+ generateLogFileName(currentLogFileName, currentLogFileNameSize, logFilePath, nowDate, NULL);
if (logFilePurgePattern) {
limitLogFileCount(currentLogFileName, logFilePurgePattern, logFilePurgeSortMode, logFileMaxLogFiles + 1);
} else {
- generateLogFileName(workLogFileName, logFilePath, TEXT("????????"), NULL);
+ generateLogFileName(workLogFileName, currentLogFileNameSize, logFilePath, TEXT("????????"), NULL);
limitLogFileCount(currentLogFileName, workLogFileName, WRAPPER_FILE_SORT_MODE_NAMES_DEC, logFileMaxLogFiles + 1);
}
diff -Nru service-wrapper-java-3.5.22/src/c/logger.h service-wrapper-java-3.5.25/src/c/logger.h
--- service-wrapper-java-3.5.22/src/c/logger.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/logger.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -54,10 +54,10 @@
#include
#define LOG_USER (1<<3)
#endif
-#include "wrapper_i18n.h"
#ifndef DWORD
#define DWORD unsigned long
#endif
+#include "logger_base.h"
/* * * Log source constants * * */
@@ -90,38 +90,6 @@
#define LOG_FORMAT_LOGFILE_DEFAULT TEXT("LPTM")
#define LOG_FORMAT_CONSOLE_DEFAULT TEXT("PM")
-/* * * Log level constants * * */
-
-/* No logging at all. */
-#define LEVEL_NONE 9
-
-/* Notice messages which should always be displayed. These never go to the syslog. */
-#define LEVEL_NOTICE 8
-
-/* Advisor messages which should always be displayed. These never go to the syslog. */
-#define LEVEL_ADVICE 7
-
-/* Too many restarts, unable to start etc. Case when the Wrapper is forced to exit. */
-#define LEVEL_FATAL 6
-
-/* JVM died, hung messages */
-#define LEVEL_ERROR 5
-
-/* Warning messages. */
-#define LEVEL_WARN 4
-
-/* Started, Stopped, Restarted messages. */
-#define LEVEL_STATUS 3
-
-/* Copyright message. and logged console output. */
-#define LEVEL_INFO 2
-
-/* Current debug messages */
-#define LEVEL_DEBUG 1
-
-/* Unknown level */
-#define LEVEL_UNKNOWN 0
-
/* * * Log file roll mode constants * * */
#define ROLL_MODE_UNKNOWN 0
#define ROLL_MODE_NONE 1
@@ -135,9 +103,6 @@
#define ROLL_MODE_DATE_TOKEN TEXT("YYYYMMDD")
-/* * * Function predeclaration * * */
-#define strcmpIgnoreCase(str1, str2) _tcsicmp(str1, str2)
-
/* This can be called from within logging code that would otherwise get stuck in recursion.
* Log to the console exactly when it happens and then also try to get it into the log
@@ -288,6 +253,7 @@
extern void setSyslogLevelInt(int loginfo_level);
extern int getSyslogLevelInt();
extern void setSyslogLevel( const TCHAR *loginfo_level );
+extern void setSyslogSplitMessages(int splitMessages);
#ifndef WIN32
extern void setSyslogFacility( const TCHAR *loginfo_level );
#endif
@@ -332,8 +298,6 @@
*/
extern void log_printf_queue( int useQueue, int source_id, int level, const TCHAR *lpszFmt, ... );
-extern TCHAR* getLastErrorText();
-extern int getLastError();
extern void maintainLogger();
extern void invalidMultiByteSequence(const TCHAR *context, int id);
#endif
diff -Nru service-wrapper-java-3.5.22/src/c/loggerjni.c service-wrapper-java-3.5.25/src/c/loggerjni.c
--- service-wrapper-java-3.5.22/src/c/loggerjni.c 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/loggerjni.c 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#include
+#include
+#ifdef WIN32
+ #include
+ #include
+#else
+ #include
+#endif
+#include
+#include "loggerjni.h"
+
+void outOfMemory(const TCHAR *context, int id) {
+ _tprintf(TEXT("WrapperJNI Error: Out of memory (%s%02d). %s\n"), context, id, getLastErrorText());fflush(NULL);
+}
+
+void invalidMultiByteSequence(const TCHAR *context, int id) {
+ _tprintf(TEXT("WrapperJNI Error: Invalid multibyte Sequence found in (%s%02d). %s"), context, id, getLastErrorText());fflush(NULL);
+}
+
+/**
+ * Create an error message from GetLastError() using the
+ * FormatMessage API Call...
+ */
+#ifdef WIN32
+TCHAR lastErrBuf[1024];
+TCHAR* getLastErrorText() {
+ DWORD dwRet;
+ TCHAR* lpszTemp = NULL;
+
+ dwRet = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
+ NULL,
+ GetLastError(),
+ LANG_NEUTRAL,
+ (TCHAR*)&lpszTemp,
+ 0,
+ NULL);
+
+ /* supplied buffer is not long enough */
+ if (!dwRet || ((long)1023 < (long)dwRet+14)) {
+ lastErrBuf[0] = TEXT('\0');
+ } else {
+ lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0'); /*remove cr and newline character */
+ _sntprintf( lastErrBuf, 1024, TEXT("%s (0x%x)"), lpszTemp, GetLastError());
+ }
+
+ if (lpszTemp) {
+ GlobalFree((HGLOBAL) lpszTemp);
+ }
+
+ return lastErrBuf;
+}
+int getLastError() {
+ return GetLastError();
+}
+#else
+TCHAR* getLastErrorText() {
+#ifdef UNICODE
+ char* c;
+ TCHAR* t;
+ size_t req;
+ c = strerror(errno);
+ req = mbstowcs(NULL, c, MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ invalidMultiByteSequence(TEXT("GLET"), 1);
+ return NULL;
+ }
+ t = malloc(sizeof(TCHAR) * (req + 1));
+
+ if (!t) {
+ _tprintf(TEXT("Out of memory in logging code (%s)\n"), TEXT("GLET1"));
+ return NULL;
+ }
+ mbstowcs(t, c, req + 1);
+ t[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
+ return t;
+
+#else
+ return strerror(errno);
+#endif
+}
+int getLastError() {
+ return errno;
+}
+#endif
diff -Nru service-wrapper-java-3.5.22/src/c/loggerjni.h service-wrapper-java-3.5.25/src/c/loggerjni.h
--- service-wrapper-java-3.5.22/src/c/loggerjni.h 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/loggerjni.h 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#ifndef _LOGGERJNI_H
+#define _LOGGERJNI_H
+
+#include "logger_base.h"
+
+#endif
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-aix-ppc-32.make service-wrapper-java-3.5.25/src/c/Makefile-aix-ppc-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-aix-ppc-32.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-aix-ppc-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_a_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c
+libwrapper_a_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c loggerjni.c
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-aix-ppc-64.make service-wrapper-java-3.5.25/src/c/Makefile-aix-ppc-64.make
--- service-wrapper-java-3.5.22/src/c/Makefile-aix-ppc-64.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-aix-ppc-64.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_a_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c
+libwrapper_a_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c loggerjni.c
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-freebsd-x86-32.gmake service-wrapper-java-3.5.25/src/c/Makefile-freebsd-x86-32.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-freebsd-x86-32.gmake 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-freebsd-x86-32.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -7,7 +7,7 @@
# license agreement you entered into with Tanuki Software.
# http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
-CC = gcc -Wall -pedantic -DFREEBSD -I/usr/local/include -L/usr/local/lib -liconv -DUNICODE -D_UNICODE
+CC = gcc -Wall -pedantic -DFREEBSD -I/usr/local/include -L/usr/local/lib -DUNICODE -D_UNICODE
INCLUDE=$(JAVA_HOME)/include
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
@@ -33,10 +33,10 @@
if test ! -d .deps; then mkdir .deps; fi
wrapper: $(wrapper_SOURCE)
- $(CC) $(wrapper_SOURCE) -lm -lcompat -pthread -o $(BIN)/wrapper
+ $(CC) $(wrapper_SOURCE) -lm -lcompat -rdynamic -lc -pthread -o $(BIN)/wrapper
libwrapper.so: $(libwrapper_so_OBJECTS)
- $(CC) -shared $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
+ $(CC) -shared -rdynamic -lc $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
#%.o: %.c
# $(COMPILE) -c $(DEFS) $<
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-freebsd-x86-64.gmake service-wrapper-java-3.5.25/src/c/Makefile-freebsd-x86-64.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-freebsd-x86-64.gmake 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-freebsd-x86-64.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -7,7 +7,7 @@
# license agreement you entered into with Tanuki Software.
# http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
-CC = gcc -Wall -pedantic -DFREEBSD -DJSW64 -fPIC -I/usr/local/include -L/usr/local/lib -liconv -DUNICODE -D_UNICODE
+CC = gcc -Wall -pedantic -DFREEBSD -DJSW64 -fPIC -I/usr/local/include -L/usr/local/lib -DUNICODE -D_UNICODE
INCLUDE=$(JAVA_HOME)/include
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
@@ -33,10 +33,10 @@
if test ! -d .deps; then mkdir .deps; fi
wrapper: $(wrapper_SOURCE)
- $(CC) $(wrapper_SOURCE) -lm -lcompat -pthread -o $(BIN)/wrapper
+ $(CC) $(wrapper_SOURCE) -lm -lcompat -rdynamic -lc -pthread -o $(BIN)/wrapper
libwrapper.so: $(libwrapper_so_OBJECTS)
- $(CC) -shared $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
+ $(CC) -shared -rdynamic -lc $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
#%.o: %.c
# $(COMPILE) -c $(DEFS) $<
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-hpux-ia-32.make service-wrapper-java-3.5.25/src/c/Makefile-hpux-ia-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-hpux-ia-32.make 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-hpux-ia-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -17,7 +17,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c
+libwrapper_so_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c loggerjni.c
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-hpux-ia-64.make service-wrapper-java-3.5.25/src/c/Makefile-hpux-ia-64.make
--- service-wrapper-java-3.5.22/src/c/Makefile-hpux-ia-64.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-hpux-ia-64.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -14,9 +14,9 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/hp-ux
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_i18n.c wrapper_file.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c
+libwrapper_so_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c loggerjni.c
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-hpux-parisc-32.make service-wrapper-java-3.5.25/src/c/Makefile-hpux-parisc-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-hpux-parisc-32.make 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-hpux-parisc-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_sl_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c
+libwrapper_sl_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c loggerjni.c
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-hpux-parisc-64.make service-wrapper-java-3.5.25/src/c/Makefile-hpux-parisc-64.make
--- service-wrapper-java-3.5.22/src/c/Makefile-hpux-parisc-64.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-hpux-parisc-64.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,9 +13,9 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/hp-ux
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_i18n.c wrapper_file.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_sl_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c
+libwrapper_sl_SOURCE = wrapper_i18n.c wrapperjni_unix.c wrapperinfo.c wrapperjni.c loggerjni.c
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-irix-mips-32.cc service-wrapper-java-3.5.25/src/c/Makefile-irix-mips-32.cc
--- service-wrapper-java-3.5.22/src/c/Makefile-irix-mips-32.cc 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-irix-mips-32.cc 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,9 +15,9 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/irix
-wrapper_OBJECTS = wrapper.o wrapperinfo.o wrappereventloop.o wrapper_unix.o property.o logger.o wrapper_file.o wrapper_i18n.o wrapper_hashmap.c
+wrapper_OBJECTS = wrapper.o wrapperinfo.o wrappereventloop.o wrapper_unix.o property.o logger.o wrapper_file.o wrapper_i18n.o wrapper_hashmap.o
-libwrapper_so_OBJECTS = wrapperjni_unix.o wrapperinfo.o wrapperjni.o wrapper_i18n.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-irix-mips-32.gmake service-wrapper-java-3.5.25/src/c/Makefile-irix-mips-32.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-irix-mips-32.gmake 2013-10-08 06:19:49.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-irix-mips-32.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,9 +13,9 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/irix -DUNICODE -D_UNICODE
-wrapper_OBJECTS = wrapper.o wrapperinfo.o wrappereventloop.o wrapper_unix.o property.o logger.o wrapper_file.o wrapper_i18n.o wrapper_hashmap.c
+wrapper_OBJECTS = wrapper.o wrapperinfo.o wrappereventloop.o wrapper_unix.o property.o logger.o wrapper_file.o wrapper_i18n.o wrapper_hashmap.o
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-linux-armel-32.make service-wrapper-java-3.5.25/src/c/Makefile-linux-armel-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-linux-armel-32.make 2013-10-08 06:19:49.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-linux-armel-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,9 +13,9 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/linux
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c test.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-linux-armhf-32.make service-wrapper-java-3.5.25/src/c/Makefile-linux-armhf-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-linux-armhf-32.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-linux-armhf-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,9 +13,9 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/linux
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c test.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-linux-ia-64.make service-wrapper-java-3.5.25/src/c/Makefile-linux-ia-64.make
--- service-wrapper-java-3.5.22/src/c/Makefile-linux-ia-64.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-linux-ia-64.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-linux-ppc-32.make service-wrapper-java-3.5.25/src/c/Makefile-linux-ppc-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-linux-ppc-32.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-linux-ppc-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-linux-ppc-64.make service-wrapper-java-3.5.25/src/c/Makefile-linux-ppc-64.make
--- service-wrapper-java-3.5.22/src/c/Makefile-linux-ppc-64.make 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-linux-ppc-64.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-linux-x86-32.make service-wrapper-java-3.5.25/src/c/Makefile-linux-x86-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-linux-x86-32.make 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-linux-x86-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,14 +13,17 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/linux
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c test.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
+
+testsuite_SOURCE = testsuite.c test_example.c test_javaadditionalparam.c test_hashmap.c test_filter.c wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
BIN = ../../bin
LIB = ../../lib
+TEST = ../../test
-all: init wrapper libwrapper.so
+all: init wrapper libwrapper.so
clean:
rm -f *.o
@@ -35,6 +38,9 @@
wrapper: $(wrapper_SOURCE)
$(COMPILE) -pthread $(wrapper_SOURCE) -lm -o $(BIN)/wrapper
+testsuite: $(testsuite_SOURCE)
+ $(COMPILE) -DCUNIT $(testsuite_SOURCE) -lm -pthread -L/usr/local/lib -lncurses -lcunit -o $(TEST)/testsuite
+
libwrapper.so: $(libwrapper_so_OBJECTS)
${COMPILE} -shared $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-linux-x86-64.make service-wrapper-java-3.5.25/src/c/Makefile-linux-x86-64.make
--- service-wrapper-java-3.5.22/src/c/Makefile-linux-x86-64.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-linux-x86-64.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,14 +13,17 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/linux
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c test.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
+
+testsuite_SOURCE = testsuite.c test_example.c test_javaadditionalparam.c test_hashmap.c test_filter.c wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
BIN = ../../bin
LIB = ../../lib
+TEST = ../../test
-all: init wrapper libwrapper.so
+all: init wrapper libwrapper.so testsuite
clean:
rm -f *.o
@@ -35,6 +38,9 @@
wrapper: $(wrapper_SOURCE)
$(COMPILE) -pthread $(wrapper_SOURCE) -lm -o $(BIN)/wrapper
+testsuite: $(testsuite_SOURCE)
+ $(COMPILE) -DCUNIT $(testsuite_SOURCE) -lm -pthread -L/usr/local/lib -lncurses -lcunit -o $(TEST)/testsuite
+
libwrapper.so: $(libwrapper_so_OBJECTS)
${COMPILE} -shared $(libwrapper_so_OBJECTS) -o $(LIB)/libwrapper.so
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-macosx-universal-32.make service-wrapper-java-3.5.25/src/c/Makefile-macosx-universal-32.make
--- service-wrapper-java-3.5.22/src/c/Makefile-macosx-universal-32.make 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-macosx-universal-32.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -19,15 +19,18 @@
DEFS = -I$(UNIVERSAL_SDK_HOME)/System/Library/Frameworks/JavaVM.framework/Headers
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c test.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
+
+testsuite_SOURCE = testsuite.c test_example.c test_javaadditionalparam.c test_hashmap.c test_filter.c wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
BIN = ../../bin
LIB = ../../lib
TEST = ../../test
-all: init testsuite wrapper libwrapper.jnilib
+#all: init testsuite wrapper libwrapper.jnilib
+all: init wrapper libwrapper.jnilib
clean:
rm -f *.o
@@ -45,8 +48,8 @@
libwrapper.jnilib: $(libwrapper_so_OBJECTS)
$(COMPILE) -bundle -liconv -o $(LIB)/libwrapper.jnilib $(libwrapper_so_OBJECTS)
-testsuite: $(wrapper_SOURCE)
- $(COMPILET) -DCUNIT $(wrapper_SOURCE) -liconv -lncurses -lcunit -o $(TEST)/testsuite
+testsuite: $(testsuite_SOURCE)
+ $(COMPILET) -DCUNIT $(testsuite_SOURCE) -liconv -lncurses -lcunit -o $(TEST)/testsuite
%.o: %.c
$(COMPILE) -c $(DEFS) $<
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-macosx-universal-64.make service-wrapper-java-3.5.25/src/c/Makefile-macosx-universal-64.make
--- service-wrapper-java-3.5.22/src/c/Makefile-macosx-universal-64.make 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-macosx-universal-64.make 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -14,7 +14,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-osf1-alpha-64.gmake service-wrapper-java-3.5.25/src/c/Makefile-osf1-alpha-64.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-osf1-alpha-64.gmake 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-osf1-alpha-64.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-solaris-sparc-32.gmake service-wrapper-java-3.5.25/src/c/Makefile-solaris-sparc-32.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-solaris-sparc-32.gmake 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-solaris-sparc-32.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,9 +13,9 @@
DEFS = -I$(INCLUDE) -I$(INCLUDE)/solaris
-wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_i18n.c wrapper_file.c wrapper_hashmap.c
+wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-solaris-sparc-64.gmake service-wrapper-java-3.5.25/src/c/Makefile-solaris-sparc-64.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-solaris-sparc-64.gmake 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-solaris-sparc-64.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-solaris-x86-32.gmake service-wrapper-java-3.5.25/src/c/Makefile-solaris-x86-32.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-solaris-x86-32.gmake 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-solaris-x86-32.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -15,7 +15,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-solaris-x86-64.gmake service-wrapper-java-3.5.25/src/c/Makefile-solaris-x86-64.gmake
--- service-wrapper-java-3.5.22/src/c/Makefile-solaris-x86-64.gmake 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-solaris-x86-64.gmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -20,7 +20,7 @@
wrapper_SOURCE = wrapper.c wrapperinfo.c wrappereventloop.c wrapper_unix.c property.c logger.c wrapper_file.c wrapper_i18n.c wrapper_hashmap.c
-libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o
+libwrapper_so_OBJECTS = wrapper_i18n.o wrapperjni_unix.o wrapperinfo.o wrapperjni.o loggerjni.o
BIN = ../../bin
LIB = ../../lib
diff -Nru service-wrapper-java-3.5.22/src/c/Makefile-windows-x86-32.nmake service-wrapper-java-3.5.25/src/c/Makefile-windows-x86-32.nmake
--- service-wrapper-java-3.5.22/src/c/Makefile-windows-x86-32.nmake 2013-10-08 06:19:50.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Makefile-windows-x86-32.nmake 2014-06-30 18:06:59.000000000 +0000
@@ -1,4 +1,4 @@
-# Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+# Copyright (c) 1999, 2014 Tanuki Software, Ltd.
# http://www.tanukisoftware.com
# All rights reserved.
#
@@ -13,21 +13,21 @@
LINK = link /NOLOGO /MANIFEST /DEBUG /MACHINE:X86 /ERRORREPORT:PROMPT DelayImp.lib
RC = rc
+
# EXE Definitions
EXE_OUTDIR = $(PROJ)32_VC8__Win32_Release
-EXE_OBJS = $(EXE_OUTDIR)\wrapper_i18n.obj $(EXE_OUTDIR)\logger.obj $(EXE_OUTDIR)\property.obj $(EXE_OUTDIR)\wrapper.obj $(EXE_OUTDIR)\wrapper_win.obj $(EXE_OUTDIR)\wrappereventloop.obj $(EXE_OUTDIR)\wrapper_file.obj $(EXE_OUTDIR)\wrapperinfo.obj $(EXE_OUTDIR)\wrapper_hashmap.obj
+EXE_OBJS = $(EXE_OUTDIR)\wrapper.obj $(EXE_OUTDIR)\wrapperinfo.obj $(EXE_OUTDIR)\wrappereventloop.obj $(EXE_OUTDIR)\wrapper_win.obj $(EXE_OUTDIR)\property.obj $(EXE_OUTDIR)\logger.obj $(EXE_OUTDIR)\wrapper_file.obj $(EXE_OUTDIR)\wrapper_i18n.obj $(EXE_OUTDIR)\wrapper_hashmap.obj
EXE_LIBS = mpr.lib shell32.lib netapi32.lib wsock32.lib shlwapi.lib advapi32.lib user32.lib Crypt32.lib Wintrust.lib pdh.lib
EXE_COMPILE_OPTS = /O2 /GL /D "_CONSOLE"
EXE_LINK_OPTS = /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFESTFILE:"$(EXE_OUTDIR)\$(PROJ).exe.intermediate.manifest" /PDB:"$(EXE_OUTDIR)\$(PROJ).pdb" /OPT:REF /OPT:ICF /LTCG
# DLL Definitions
DLL_OUTDIR = $(PROJ)JNI32_VC8__Win32_Release
-DLL_OBJS = $(DLL_OUTDIR)\wrapper_i18n.obj $(DLL_OUTDIR)\wrapperjni.obj $(DLL_OUTDIR)\wrapperjni_win.obj $(DLL_OUTDIR)\wrapperinfo.obj
-DLL_LIBS = shell32.lib advapi32.lib user32.lib
+DLL_OBJS = $(DLL_OUTDIR)\wrapper_i18n.obj $(DLL_OUTDIR)\wrapperjni_win.obj $(DLL_OUTDIR)\wrapperinfo.obj $(DLL_OUTDIR)\wrapperjni.obj $(DLL_OUTDIR)\loggerjni.obj
+DLL_LIBS = shell32.lib wsock32.lib advapi32.lib user32.lib
DLL_COMPILE_OPTS = /Od /I "..\" /I ".\" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "_WINDOWS" /D "_USRDLL" /D "DECODERJNI_VC8_EXPORTS" /D "_WINDLL"
DLL_LINK_OPTS = /INCREMENTAL /DLL /SUBSYSTEM:WINDOWS /MANIFESTFILE:"$(DLL_OUTDIR)\$(PROJ).dll.intermediate.manifest" /PDB:"$(DLL_OUTDIR)\$(PROJ).pdb"
-
all: $(EXE_OUTDIR) $(DLL_OUTDIR) $(PROJ).exe $(PROJ).dll
# Define project specific macros
diff -Nru service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager.h service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager.h
--- service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager.h 2014-06-30 18:06:59.000000000 +0000
@@ -153,6 +153,7 @@
/* Inaccessible static: m_shutdownJVMComplete */
/* Inaccessible static: m_shutdownLockMap */
/* Inaccessible static: m_shutdownLocks */
+/* Inaccessible static: m_runningExecs */
/* Inaccessible static: m_args */
/* Inaccessible static: m_backendType */
/* Inaccessible static: m_backendConnected */
diff -Nru service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_ShutdownLock.h service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_ShutdownLock.h
--- service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_ShutdownLock.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_ShutdownLock.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include
-/* Header for class org_tanukisoftware_wrapper_WrapperManager_ShutdownLock */
-
-#ifndef _Included_org_tanukisoftware_wrapper_WrapperManager_ShutdownLock
-#define _Included_org_tanukisoftware_wrapper_WrapperManager_ShutdownLock
-#ifdef __cplusplus
-extern "C" {
-#endif
-#ifdef __cplusplus
-}
-#endif
-#endif
diff -Nru service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperEventListenerMask.h service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperEventListenerMask.h
--- service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperEventListenerMask.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperEventListenerMask.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include
-/* Header for class org_tanukisoftware_wrapper_WrapperManager_WrapperEventListenerMask */
-
-#ifndef _Included_org_tanukisoftware_wrapper_WrapperManager_WrapperEventListenerMask
-#define _Included_org_tanukisoftware_wrapper_WrapperManager_WrapperEventListenerMask
-#ifdef __cplusplus
-extern "C" {
-#endif
-#ifdef __cplusplus
-}
-#endif
-#endif
diff -Nru service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream.h service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream.h
--- service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,15 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include
-/* Header for class org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream */
-
-#ifndef _Included_org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream
-#define _Included_org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream_MAX_SKIP_BUFFER_SIZE
-#define org_tanukisoftware_wrapper_WrapperManager_WrapperInputStream_MAX_SKIP_BUFFER_SIZE 2048L
-#ifdef __cplusplus
-}
-#endif
-#endif
diff -Nru service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl.h service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl.h
--- service-wrapper-java-3.5.22/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,15 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include
-/* Header for class org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl */
-
-#ifndef _Included_org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl
-#define _Included_org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl_serialVersionUID
-#define org_tanukisoftware_wrapper_WrapperManager_WrapperTickEventImpl_serialVersionUID 5516075349620653480LL
-#ifdef __cplusplus
-}
-#endif
-#endif
diff -Nru service-wrapper-java-3.5.22/src/c/property.c service-wrapper-java-3.5.25/src/c/property.c
--- service-wrapper-java-3.5.22/src/c/property.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/property.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.comment
* All rights reserved.
*
@@ -29,7 +29,7 @@
#if defined(MACOSX) || defined(FREEBSD)
#else
-#include
+ #include
#endif
#include
@@ -38,20 +38,17 @@
#include
#ifdef WIN32
-#include
+ #include
/* MS Visual Studio 8 went and deprecated the POXIX names for functions.
* Fixing them all would be a big headache for UNIX versions. */
-#pragma warning(disable : 4996)
+ #pragma warning(disable : 4996)
#else
-#include
-#include
-#include
-#include
-#if defined(IRIX)
-#define PATH_MAX FILENAME_MAX
-#endif
+ #include
+ #include
+ #include
+ #include
#endif
#include "wrapper_i18n.h"
#include "logger.h"
@@ -199,27 +196,30 @@
/**
* This function returns a reference to a static buffer and is NOT thread safe.
+ * It is currently called only when loading a property file and when firing an event.
+ * Both happen in the main thread.
+ * The largest return value can be 15+1 characters.
*/
-TCHAR* generateTimeValue(const TCHAR* format) {
+TCHAR* generateTimeValue(const TCHAR* format, struct tm *timeTM) {
if (strcmpIgnoreCase(format, TEXT("YYYYMMDDHHIISS")) == 0) {
_sntprintf(generateValueBuffer, 256, TEXT("%04d%02d%02d%02d%02d%02d"),
- loadPropertiesTM.tm_year + 1900, loadPropertiesTM.tm_mon + 1, loadPropertiesTM.tm_mday,
- loadPropertiesTM.tm_hour, loadPropertiesTM.tm_min, loadPropertiesTM.tm_sec );
+ timeTM->tm_year + 1900, timeTM->tm_mon + 1, timeTM->tm_mday,
+ timeTM->tm_hour, timeTM->tm_min, timeTM->tm_sec );
} else if (strcmpIgnoreCase(format, TEXT("YYYYMMDD_HHIISS")) == 0) {
_sntprintf(generateValueBuffer, 256, TEXT("%04d%02d%02d_%02d%02d%02d"),
- loadPropertiesTM.tm_year + 1900, loadPropertiesTM.tm_mon + 1, loadPropertiesTM.tm_mday,
- loadPropertiesTM.tm_hour, loadPropertiesTM.tm_min, loadPropertiesTM.tm_sec );
+ timeTM->tm_year + 1900, timeTM->tm_mon + 1, timeTM->tm_mday,
+ timeTM->tm_hour, timeTM->tm_min, timeTM->tm_sec );
} else if (strcmpIgnoreCase(format, TEXT("YYYYMMDDHHII")) == 0) {
_sntprintf(generateValueBuffer, 256, TEXT("%04d%02d%02d%02d%02d"),
- loadPropertiesTM.tm_year + 1900, loadPropertiesTM.tm_mon + 1, loadPropertiesTM.tm_mday,
- loadPropertiesTM.tm_hour, loadPropertiesTM.tm_min );
+ timeTM->tm_year + 1900, timeTM->tm_mon + 1, timeTM->tm_mday,
+ timeTM->tm_hour, timeTM->tm_min );
} else if (strcmpIgnoreCase(format, TEXT("YYYYMMDDHH")) == 0) {
_sntprintf(generateValueBuffer, 256, TEXT("%04d%02d%02d%02d"),
- loadPropertiesTM.tm_year + 1900, loadPropertiesTM.tm_mon + 1, loadPropertiesTM.tm_mday,
- loadPropertiesTM.tm_hour );
+ timeTM->tm_year + 1900, timeTM->tm_mon + 1, timeTM->tm_mday,
+ timeTM->tm_hour );
} else if (strcmpIgnoreCase(format, TEXT("YYYYMMDD")) == 0) {
_sntprintf(generateValueBuffer, 256, TEXT("%04d%02d%02d"),
- loadPropertiesTM.tm_year + 1900, loadPropertiesTM.tm_mon + 1, loadPropertiesTM.tm_mday);
+ timeTM->tm_year + 1900, timeTM->tm_mon + 1, timeTM->tm_mday);
} else {
_sntprintf(generateValueBuffer, 256, TEXT("{INVALID}"));
}
@@ -228,6 +228,9 @@
/**
* This function returns a reference to a static buffer and is NOT thread safe.
+ * It is currently called only when loading a property file and when firing an event.
+ * Both happen in the main thread.
+ * The largest return value can be 9+1 characters.
*/
TCHAR* generateRandValue(const TCHAR* format) {
if (strcmpIgnoreCase(format, TEXT("N")) == 0) {
@@ -303,7 +306,7 @@
envValueNeedFree = FALSE;
if (_tcsstr(envName, TEXT("WRAPPER_TIME_")) == envName) {
/* Found a time value. */
- envValue = generateTimeValue(envName + 13);
+ envValue = generateTimeValue(envName + 13, &loadPropertiesTM);
} else if (_tcsstr(envName, TEXT("WRAPPER_RAND_")) == envName) {
/* Found a time value. */
envValue = generateRandValue(envName + 13);
@@ -462,213 +465,6 @@
}
}
-/**
- * Function to get the system encoding name/number for the encoding
- * of the conf file
- *
- * @para String holding the encoding from the conf file
- *
- * @return TRUE if not found, FALSE otherwise
- *
- */
-#ifdef WIN32
-#define strIgnoreCaseCmp stricmp
-int getEncodingByName(char* encodingMB, int *encoding) {
-#else
-#define strIgnoreCaseCmp strcasecmp
-int getEncodingByName(char* encodingMB, char** encoding) {
-#endif
- if (strIgnoreCaseCmp(encodingMB, "Shift_JIS") == 0) {
-#if defined(FREEBSD) || defined (AIX) || defined(MACOSX)
- *encoding = "SJIS";
-#elif defined(WIN32)
- *encoding = 932;
-#else
- *encoding = "shiftjis";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "eucJP") == 0) {
-#if defined(AIX)
- *encoding = "IBM-eucJP";
-#elif defined(WIN32)
- *encoding = 20932;
-#else
- *encoding = "eucJP";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "UTF-8") == 0) {
-#if defined(HPUX)
- *encoding = "utf8";
-#elif defined(WIN32)
- *encoding = 65001;
-#else
- *encoding = "UTF-8";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-1") == 0) {
-#if defined(WIN32)
- *encoding = 28591;
-#elif defined(LINUX)
- *encoding = "ISO-8859-1";
-#else
- *encoding = "ISO8859-1";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "CP1252") == 0) {
-#if defined(WIN32)
- *encoding = 1252;
-#else
- *encoding = "CP1252";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-2") == 0) {
-#if defined(WIN32)
- *encoding = 28592;
-#elif defined(LINUX)
- *encoding = "ISO-8859-2";
-#else
- *encoding = "ISO8859-2";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-3") == 0) {
-#if defined(WIN32)
- *encoding = 28593;
-#elif defined(LINUX)
- *encoding = "ISO-8859-3";
-#else
- *encoding = "ISO8859-3";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-4") == 0) {
-#if defined(WIN32)
- *encoding = 28594;
-#elif defined(LINUX)
- *encoding = "ISO-8859-4";
-#else
- *encoding = "ISO8859-4";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-5") == 0) {
-#if defined(WIN32)
- *encoding = 28595;
-#elif defined(LINUX)
- *encoding = "ISO-8859-5";
-#else
- *encoding = "ISO8859-5";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-6") == 0) {
-#if defined(WIN32)
- *encoding = 28596;
-#elif defined(LINUX)
- *encoding = "ISO-8859-6";
-#else
- *encoding = "ISO8859-6";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-7") == 0) {
-#if defined(WIN32)
- *encoding = 28597;
-#elif defined(LINUX)
- *encoding = "ISO-8859-7";
-#else
- *encoding = "ISO8859-7";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-8") == 0) {
-#if defined(WIN32)
- *encoding = 28598;
-#elif defined(LINUX)
- *encoding = "ISO-8859-8";
-#else
- *encoding = "ISO8859-8";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-9") == 0) {
-#if defined(WIN32)
- *encoding = 28599;
-#elif defined(LINUX)
- *encoding = "ISO-8859-9";
-#else
- *encoding = "ISO8859-9";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-10") == 0) {
-#if defined(WIN32)
- *encoding = 28600;
-#elif defined(LINUX)
- *encoding = "ISO-8859-10";
-#else
- *encoding = "ISO8859-10";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-11") == 0) {
-#if defined(WIN32)
- *encoding = 28601;
-#elif defined(LINUX)
- *encoding = "ISO-8859-11";
-#else
- *encoding = "ISO8859-11";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-13") == 0) {
-#if defined(WIN32)
- *encoding = 28603;
-#elif defined(LINUX)
- *encoding = "ISO-8859-13";
-#else
- *encoding = "ISO8859-13";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-14") == 0) {
-#if defined(WIN32)
- *encoding = 28604;
-#elif defined(LINUX)
- *encoding = "ISO-8859-14";
-#else
- *encoding = "ISO8859-14";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-15") == 0) {
-#if defined(WIN32)
- *encoding = 28605;
-#elif defined(LINUX)
- *encoding = "ISO-8859-15";
-#else
- *encoding = "ISO8859-15";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-16") == 0) {
-#if defined(WIN32)
- *encoding = 28606;
-#elif defined(LINUX)
- *encoding = "ISO-8859-16";
-#else
- *encoding = "ISO8859-16";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "CP1250") == 0) {
-#if defined(WIN32)
- *encoding = 1250;
-#else
- *encoding = "CP1250";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "CP1251") == 0) {
-#if defined(WIN32)
- *encoding = 1251;
-#else
- *encoding = "CP1251";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "KOI8-R") == 0) {
-#if defined(WIN32)
- *encoding = 20866;
-#else
- *encoding = "KOI8-R";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "KOI8-U") == 0) {
-#if defined(WIN32)
- *encoding = 21866;
-#else
- *encoding = "KOI8-U";
-#endif
- } else if (strIgnoreCaseCmp(encodingMB, "DEFAULT") == 0) {
-#ifdef WIN32
- *encoding = GetACP();
-#else
- *encoding = nl_langinfo(CODESET);
- #ifdef MACOSX
- if (strlen(*encoding) == 0) {
- *encoding = "UTF-8";
- }
- #endif
-#endif
- } else {
- return TRUE;
- }
- return FALSE;
-}
-
static int loadPropertiesCallback(void *callbackParam, const TCHAR *fileName, int lineNumber, TCHAR *config, int debugProperties)
{
Properties *properties = (Properties *)callbackParam;
@@ -709,13 +505,12 @@
#else
struct timeval timevalNow;
#endif
- time_t now;
- struct tm *nowTM;
- ConfigFileReader reader;
+ time_t now;
+ struct tm *nowTM;
int loadResult;
#ifdef WIN32
- _ftime( &timebNow );
+ _ftime(&timebNow);
now = (time_t)timebNow.time;
#else
gettimeofday(&timevalNow, NULL);
@@ -724,12 +519,7 @@
nowTM = localtime(&now);
memcpy(&loadPropertiesTM, nowTM, sizeof(struct tm));
- configFileReader_Initialize(&reader, loadPropertiesCallback, properties, TRUE);
-
- /* Store the preload flag for this loading of properties. */
- reader.preload = preload;
-
- loadResult = configFileReader_Read(&reader, filename, 0, 0, NULL, 0);
+ loadResult = configFileReader(filename, FALSE, loadPropertiesCallback, properties, TRUE, preload);
/* Any failure is a failure in the root. */
switch (loadResult) {
diff -Nru service-wrapper-java-3.5.22/src/c/property.h service-wrapper-java-3.5.25/src/c/property.h
--- service-wrapper-java-3.5.22/src/c/property.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/property.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -99,6 +99,29 @@
extern int setEnv(const TCHAR *name, const TCHAR *value, int source);
/**
+ * Parses a property value and populates any environment variables. If the expanded
+ * environment variable would result in a string that is longer than bufferLength
+ * the value is truncated.
+ *
+ * @param warnUndefinedVars Log warnings about missing environment variables.
+ * @param warnedUndefVarMap Map of variables which have previously been logged, may be NULL if warnUndefinedVars false.
+ * @param warnLogLevel Log level at which any warnings will be logged.
+ */
+extern void evaluateEnvironmentVariables(const TCHAR *propertyValue, TCHAR *buffer, int bufferLength, int warnUndefinedVars, PHashMap warnedUndefVarMap, int warnLogLevel);
+
+/**
+ * This function returns a reference to a static buffer and is NOT thread safe.
+ * Check implementation notes before using.
+ */
+extern TCHAR* generateTimeValue(const TCHAR* format, struct tm *timeTM);
+
+/**
+ * This function returns a reference to a static buffer and is NOT thread safe.
+ * Check implementation notes before using.
+ */
+extern TCHAR* generateRandValue(const TCHAR* format);
+
+/**
* Create a Properties structure loaded in from the specified file.
* Must call disposeProperties to free up allocated memory.
*
diff -Nru service-wrapper-java-3.5.22/src/c/runnmake.bat service-wrapper-java-3.5.25/src/c/runnmake.bat
--- service-wrapper-java-3.5.22/src/c/runnmake.bat 2013-10-08 06:19:52.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/runnmake.bat 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
@echo off
setlocal
-rem Copyright (c) 1999, 2013 Tanuki Software Inc.
+rem Copyright (c) 1999, 2014 Tanuki Software Inc.
rem
rem Java Service Wrapper windows build script. This script is designed to be
rem called by the ant build.xml file.
diff -Nru service-wrapper-java-3.5.22/src/c/test.c service-wrapper-java-3.5.25/src/c/test.c
--- service-wrapper-java-3.5.22/src/c/test.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/test.c 1970-01-01 00:00:00.000000000 +0000
@@ -1,305 +0,0 @@
-/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
- * http://www.tanukisoftware.com
- * All rights reserved.
- *
- * This software is the proprietary information of Tanuki Software.
- * You shall use it only in accordance with the terms of the
- * license agreement you entered into with Tanuki Software.
- * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
- */
-
-#ifdef CUNIT
-
-#include
-#include
-#include
-#include "CUnit/Basic.h"
-#include "logger.h"
-#include "wrapper_i18n.h"
-#include "wrapper.h"
-
-/**
- * The suite initialization function.
- * Opens the temporary file used by the tests.
- * Returns zero on success, non-zero otherwise.
- */
-int init_suite1(void) {
- return 0;
-}
-
-/**
- * The suite cleanup function.
- * Closes the temporary file used by the tests.
- * Returns zero on success, non-zero otherwise.
- */
-int clean_suite1(void) {
- return 0;
-}
-
-void dummyLogFileChanged(const TCHAR *logFile) {
-}
-int init_wrapper(void) {
- initLogging(dummyLogFileChanged);
- logRegisterThread(WRAPPER_THREAD_MAIN);
- setLogfileLevelInt(LEVEL_NONE);
- setConsoleLogFormat(TEXT("LPM"));
- setConsoleLogLevelInt(LEVEL_DEBUG);
- setConsoleFlush(TRUE);
- setSyslogLevelInt(LEVEL_NONE);
- return 0;
-}
-
-
-/**
- * Simple test that passes.
- */
-void testPass(void) {
- CU_ASSERT(0 == 0);
-}
-
-/**
- * Simple test that passes.
- */
-void testFail(void) {
- CU_ASSERT(0 == 1);
-}
-
-/********************************************************************
- * Common Tools
- *******************************************************************/
-TCHAR *randomChars = TEXT("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-");
-#define WORK_BUFFER_LEN 4096
-TCHAR workBuffer[WORK_BUFFER_LEN];
-
-int getRandom(int min, int max) {
- int num;
- int rNum;
-
- num = max + 1 - min;
- if (num <= 0) {
- return min;
- }
-
- /* Some platforms use very large RAND_MAX values that cause overflow problems in our math */
- if (RAND_MAX > 0x10000) {
- rNum = (int)((rand() >> 8) * num / (RAND_MAX >> 8));
- } else {
- rNum = (int)(rand() * num / RAND_MAX);
- }
-
- return min + rNum;
-}
-
-/**
- * Creates a string of random characters that is within the specified range of lengths.
- * It is the responsibility of the caller to free up the string.
- *
- * @param minLen Minimum Length of the string.
- * @param maxLen Maximum Length of the string.
- *
- * @return the requested string, or NULL if out of memory.
- */
-TCHAR *buildRandomString(int minLen, int maxLen) {
- int num;
- int len;
- TCHAR *str;
- int i;
-
- num = _tcslen(randomChars);
-
- len = getRandom(minLen, maxLen);
-
- str = malloc(sizeof(TCHAR) * (len + 1));
- if (!str) {
- return NULL;
- }
-
- for (i = 0; i < len; i++) {
- str[i] = randomChars[getRandom(0, num - 1)];
- }
- str[len] = TEXT('\0');
-
- return str;
-}
-
-/**
- * Creates a string of random characters that is within the specified range of lengths.
- * It is the responsibility of the caller to free up the string.
- *
- * @param minLen Minimum Length of the string.
- * @param maxLen Maximum Length of the string.
- *
- * @return the requested string, or NULL if out of memory.
- */
-TCHAR *buildRandomStrinWithTail(int minLen, int maxLen, int tail) {
- int num;
- size_t len;
- size_t strLen;
- TCHAR *str;
- size_t i;
- TCHAR tailStr[32];
-
- _sntprintf(tailStr, 32, TEXT("-%d"), tail);
-
- num = _tcslen(randomChars);
-
- len = getRandom(minLen, maxLen);
-
- strLen = len + _tcslen(tailStr) + 1;
- str = malloc(sizeof(TCHAR) * strLen);
- if (!str) {
- return NULL;
- }
-
- for (i = 0; i < len; i++) {
- str[i] = randomChars[getRandom(0, num - 1)];
- }
- str[len] = TEXT('\0');
- _tcsncat(str, tailStr, strLen);
-
- return str;
-}
-
-/**
- * Frees up an array and its contents. Depends on the values being NULL if they are not allocated.
- *
- * @param array Array to be freed.
- */
-void freeTCHARArray(TCHAR **array, int len) {
- int i;
-
- if (array) {
- for (i = 0; i < len; i++) {
- if (array[i]) {
- free(array[i]);
- }
- }
-
- free(array);
- }
-}
-
-/********************************************************************
- * Filter Tests
- *******************************************************************/
-void subTestWrapperWildcardMatch(const TCHAR *pattern, const TCHAR *text, size_t expectedMinLen, int expectedMatch) {
- size_t minLen;
- int matched;
-
- minLen = wrapperGetMinimumTextLengthForPattern(pattern);
- if (minLen != expectedMinLen) {
- _sntprintf(workBuffer, WORK_BUFFER_LEN, TEXT("wrapperGetMinimumTextLengthForPattern(\"%s\") returned %d rather than expected %d."), pattern, minLen, expectedMinLen);
- _tprintf(TEXT("%s\n"), workBuffer);
- CU_FAIL(workBuffer);
- } else {
- _sntprintf(workBuffer, WORK_BUFFER_LEN, TEXT("wrapperGetMinimumTextLengthForPattern(\"%s\") returned %d."), pattern, minLen);
- CU_PASS(workBuffer);
- }
-
- matched = wrapperWildcardMatch(text, pattern, expectedMinLen);
- if (matched != expectedMatch) {
- _sntprintf(workBuffer, WORK_BUFFER_LEN, TEXT("wrapperWildcardMatch(\"%s\", \"%s\", %d) returned %s rather than expected %s."),
- text, pattern, expectedMinLen, (matched ? TEXT("TRUE") : TEXT("FALSE")), (expectedMatch ? TEXT("TRUE") : TEXT("FALSE")));
- _tprintf(TEXT("%s\n"), workBuffer);
- CU_FAIL(workBuffer);
- } else {
- _sntprintf(workBuffer, WORK_BUFFER_LEN, TEXT("wrapperWildcardMatch(\"%s\", \"%s\", %d) returned %s."),
- text, pattern, expectedMinLen, (matched ? TEXT("TRUE") : TEXT("FALSE")));
- CU_PASS(workBuffer);
- }
-}
-
-void testWrapperWildcardMatch() {
- subTestWrapperWildcardMatch(TEXT("a"), TEXT("a"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("a"), TEXT("b"), 1, FALSE);
- subTestWrapperWildcardMatch(TEXT("a"), TEXT(""), 1, FALSE);
-
- subTestWrapperWildcardMatch(TEXT("a"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("b"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("c"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("d"), TEXT("abc"), 1, FALSE);
-
- subTestWrapperWildcardMatch(TEXT("?"), TEXT("a"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("?"), TEXT(""), 1, FALSE);
-
- subTestWrapperWildcardMatch(TEXT("*"), TEXT(""), 0, TRUE);
- subTestWrapperWildcardMatch(TEXT("*"), TEXT("a"), 0, TRUE);
- subTestWrapperWildcardMatch(TEXT("*"), TEXT("abc"), 0, TRUE);
-
- subTestWrapperWildcardMatch(TEXT("*a"), TEXT("a"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("*a"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("*b"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("a*"), TEXT("a"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("a*"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("b*"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("*a*"), TEXT("a"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("*a*"), TEXT("abc"), 1, TRUE);
- subTestWrapperWildcardMatch(TEXT("*b*"), TEXT("abc"), 1, TRUE);
-
- subTestWrapperWildcardMatch(TEXT("HEAD*TAIL"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
- subTestWrapperWildcardMatch(TEXT("HEAD**TAIL"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
- subTestWrapperWildcardMatch(TEXT("*HEAD*TAIL*"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
- subTestWrapperWildcardMatch(TEXT("HEAD*TAIL"), TEXT("This is the HEAD and this is the TaIL....."), 8, FALSE);
- subTestWrapperWildcardMatch(TEXT("HEAD**TAIL"), TEXT("This is the HEAD and this is the TaIL....."), 8, FALSE);
- subTestWrapperWildcardMatch(TEXT("*HEAD*TAIL*"), TEXT("This is the HEAD and this is the TaIL....."), 8, FALSE);
- subTestWrapperWildcardMatch(TEXT("HEAD*TA?L"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
- subTestWrapperWildcardMatch(TEXT("HEAD**TA?L"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
- subTestWrapperWildcardMatch(TEXT("*HEAD*TA?L*"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
-}
-
-/* The main() function for setting up and running the tests.
- * Returns a CUE_SUCCESS on successful running, another
- * CUnit error code on failure.
- */
-int main()
-{
- CU_pSuite pSuite = NULL;
- CU_pSuite filterSuite = NULL;
- CU_pSuite javaAdditionalParamSuite = NULL;
-
- /* Initialize the random seed. */
- srand((unsigned)time(NULL));
-
- /* initialize the CUnit test registry */
- if (CUE_SUCCESS != CU_initialize_registry())
- return CU_get_error();
-
- /* add a suite to the registry */
- pSuite = CU_add_suite("Suite_1", init_suite1, clean_suite1);
- if (NULL == pSuite) {
- CU_cleanup_registry();
- return CU_get_error();
- }
- filterSuite = CU_add_suite("Filter Suite", init_wrapper, NULL);
- if (NULL == filterSuite) {
- CU_cleanup_registry();
- return CU_get_error();
- }
- javaAdditionalParamSuite = CU_add_suite("Java Additional Parameter Suite", NULL, NULL);
- if (NULL == javaAdditionalParamSuite) {
- CU_cleanup_registry();
- return CU_get_error();
- }
-
- /* add the tests to the suite */
- /*
- if ((NULL == CU_add_test(pSuite, "test of pass", testPass)) ||
- (NULL == CU_add_test(pSuite, "test of fail", testFail)) {
- CU_cleanup_registry();
- return CU_get_error();
- }
- */
-
- CU_add_test(filterSuite, "wrapperWildcardMatch", testWrapperWildcardMatch);
-
- CU_add_test(javaAdditionalParamSuite, "loadJavaAdditionalCallback()", testJavaAdditionalParamSuite);
-
- /* Run all tests using the CUnit Basic interface */
- CU_basic_set_mode(CU_BRM_VERBOSE);
- CU_basic_run_tests();
- CU_cleanup_registry();
- return CU_get_error();
-}
-
-#endif
diff -Nru service-wrapper-java-3.5.22/src/c/test_example.c service-wrapper-java-3.5.25/src/c/test_example.c
--- service-wrapper-java-3.5.22/src/c/test_example.c 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/test_example.c 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#include
+#include
+#include
+#include "CUnit/Basic.h"
+#include "property.h"
+
+/********************************************************************
+ * Example Tests
+ *******************************************************************/
+
+/**
+ * The suite initialization function.
+ * Opens the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int tsEX_init_suite1(void) {
+ return 0;
+}
+
+/**
+ * The suite cleanup function.
+ * Closes the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int tsEX_clean_suite1(void) {
+ return 0;
+}
+
+/**
+ * Simple test that passes.
+ */
+void tsEX_testPass(void) {
+ CU_ASSERT_EQUAL(0, 0);
+}
+
+/**
+ * Simple test that passes.
+ */
+void tsEX_testFail(void) {
+ CU_ASSERT_NOT_EQUAL(0, 1);
+}
+
+int tsEX_suiteExample() {
+ CU_pSuite exampleSuite;
+
+ exampleSuite = CU_add_suite("Example Suite", tsEX_init_suite1, tsEX_clean_suite1);
+ if (NULL == exampleSuite) {
+ return CU_get_error();
+ }
+
+ CU_add_test(exampleSuite, "Pass", tsEX_testPass);
+ CU_add_test(exampleSuite, "Fail", tsEX_testFail);
+
+ return FALSE;
+}
+
diff -Nru service-wrapper-java-3.5.22/src/c/test_filter.c service-wrapper-java-3.5.25/src/c/test_filter.c
--- service-wrapper-java-3.5.22/src/c/test_filter.c 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/test_filter.c 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#include
+#include
+#include
+#include "CUnit/Basic.h"
+#include "logger.h"
+#include "property.h"
+#include "wrapper.h"
+
+/********************************************************************
+ * Filter Tests
+ *******************************************************************/
+#define TSFLTR_WORK_BUFFER_LEN 4096
+TCHAR tsFLTR_workBuffer[TSFLTR_WORK_BUFFER_LEN];
+
+void tsFLTR_dummyLogFileChanged(const TCHAR *logFile) {
+}
+
+int tsFLTR_init_wrapper(void) {
+ initLogging(tsFLTR_dummyLogFileChanged);
+ logRegisterThread(WRAPPER_THREAD_MAIN);
+ setLogfileLevelInt(LEVEL_NONE);
+ setConsoleLogFormat(TEXT("LPM"));
+ setConsoleLogLevelInt(LEVEL_DEBUG);
+ setConsoleFlush(TRUE);
+ setSyslogLevelInt(LEVEL_NONE);
+ return 0;
+}
+
+int tsFLTR_clean_wrapper(void) {
+ disposeLogging();
+ return 0;
+}
+
+void tsFLTR_subTestWrapperWildcardMatch(const TCHAR *pattern, const TCHAR *text, size_t expectedMinLen, int expectedMatch) {
+ size_t minLen;
+ int matched;
+
+ minLen = wrapperGetMinimumTextLengthForPattern(pattern);
+ if (minLen != expectedMinLen) {
+ _sntprintf(tsFLTR_workBuffer, TSFLTR_WORK_BUFFER_LEN, TEXT("wrapperGetMinimumTextLengthForPattern(\"%s\") returned %d rather than expected %d."), pattern, minLen, expectedMinLen);
+ _tprintf(TEXT("%s\n"), tsFLTR_workBuffer);
+ CU_FAIL(tsFLTR_workBuffer);
+ } else {
+ _sntprintf(tsFLTR_workBuffer, TSFLTR_WORK_BUFFER_LEN, TEXT("wrapperGetMinimumTextLengthForPattern(\"%s\") returned %d."), pattern, minLen);
+ CU_PASS(tsFLTR_workBuffer);
+ }
+
+ matched = wrapperWildcardMatch(text, pattern, expectedMinLen);
+ if (matched != expectedMatch) {
+ _sntprintf(tsFLTR_workBuffer, TSFLTR_WORK_BUFFER_LEN, TEXT("wrapperWildcardMatch(\"%s\", \"%s\", %d) returned %s rather than expected %s."),
+ text, pattern, expectedMinLen, (matched ? TEXT("TRUE") : TEXT("FALSE")), (expectedMatch ? TEXT("TRUE") : TEXT("FALSE")));
+ _tprintf(TEXT("%s\n"), tsFLTR_workBuffer);
+ CU_FAIL(tsFLTR_workBuffer);
+ } else {
+ _sntprintf(tsFLTR_workBuffer, TSFLTR_WORK_BUFFER_LEN, TEXT("wrapperWildcardMatch(\"%s\", \"%s\", %d) returned %s."),
+ text, pattern, expectedMinLen, (matched ? TEXT("TRUE") : TEXT("FALSE")));
+ CU_PASS(tsFLTR_workBuffer);
+ }
+}
+
+void tsFLTR_testWrapperWildcardMatch() {
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("a"), TEXT("a"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("a"), TEXT("b"), 1, FALSE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("a"), TEXT(""), 1, FALSE);
+
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("a"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("b"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("c"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("d"), TEXT("abc"), 1, FALSE);
+
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("?"), TEXT("a"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("?"), TEXT(""), 1, FALSE);
+
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*"), TEXT(""), 0, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*"), TEXT("a"), 0, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*"), TEXT("abc"), 0, TRUE);
+
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*a"), TEXT("a"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*a"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*b"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("a*"), TEXT("a"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("a*"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("b*"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*a*"), TEXT("a"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*a*"), TEXT("abc"), 1, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*b*"), TEXT("abc"), 1, TRUE);
+
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("HEAD*TAIL"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("HEAD**TAIL"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*HEAD*TAIL*"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("HEAD*TAIL"), TEXT("This is the HEAD and this is the TaIL....."), 8, FALSE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("HEAD**TAIL"), TEXT("This is the HEAD and this is the TaIL....."), 8, FALSE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*HEAD*TAIL*"), TEXT("This is the HEAD and this is the TaIL....."), 8, FALSE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("HEAD*TA?L"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("HEAD**TA?L"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
+ tsFLTR_subTestWrapperWildcardMatch(TEXT("*HEAD*TA?L*"), TEXT("This is the HEAD and this is the TAIL....."), 8, TRUE);
+}
+
+int tsFLTR_suiteFilter() {
+ CU_pSuite filterSuite;
+
+ filterSuite = CU_add_suite("Filter Suite", tsFLTR_init_wrapper, tsFLTR_clean_wrapper);
+ if (NULL == filterSuite) {
+ return CU_get_error();
+ }
+
+ CU_add_test(filterSuite, "wrapperWildcardMatch", tsFLTR_testWrapperWildcardMatch);
+
+ return FALSE;
+}
+
diff -Nru service-wrapper-java-3.5.22/src/c/test_hashmap.c service-wrapper-java-3.5.25/src/c/test_hashmap.c
--- service-wrapper-java-3.5.22/src/c/test_hashmap.c 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/test_hashmap.c 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,260 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#include
+#include
+#include
+#include "CUnit/Basic.h"
+#include "logger.h"
+#include "property.h"
+#include "wrapper_hashmap.h"
+
+/********************************************************************
+ * Hash Map Tests
+ *******************************************************************/
+TCHAR *tsHASH_randomChars = TEXT("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-");
+#define TSHASH_WORK_BUFFER_LEN 4096
+TCHAR tsHASH_workBuffer[TSHASH_WORK_BUFFER_LEN];
+
+int tsHASH_getRandom(int min, int max) {
+ int num;
+ int rNum;
+
+ num = max + 1 - min;
+ if (num <= 0) {
+ return min;
+ }
+
+ /* Some platforms use very large RAND_MAX values that cause overflow problems in our math */
+ if (RAND_MAX > 0x10000) {
+ rNum = (int)((rand() >> 8) * num / (RAND_MAX >> 8));
+ } else {
+ rNum = (int)(rand() * num / RAND_MAX);
+ }
+
+ return min + rNum;
+}
+
+/**
+ * Creates a string of random characters that is within the specified range of lengths.
+ * It is the responsibility of the caller to free up the string.
+ *
+ * @param minLen Minimum Length of the string.
+ * @param maxLen Maximum Length of the string.
+ *
+ * @return the requested string, or NULL if out of memory.
+ */
+TCHAR *tsHASH_buildRandomString(int minLen, int maxLen) {
+ int num;
+ int len;
+ TCHAR *str;
+ int i;
+
+ num = _tcslen(tsHASH_randomChars);
+
+ len = tsHASH_getRandom(minLen, maxLen);
+
+ str = malloc(sizeof(TCHAR) * (len + 1));
+ if (!str) {
+ return NULL;
+ }
+
+ for (i = 0; i < len; i++) {
+ str[i] = tsHASH_randomChars[tsHASH_getRandom(0, num - 1)];
+ }
+ str[len] = TEXT('\0');
+
+ return str;
+}
+
+/**
+ * Creates a string of random characters that is within the specified range of lengths.
+ * It is the responsibility of the caller to free up the string.
+ *
+ * @param minLen Minimum Length of the string.
+ * @param maxLen Maximum Length of the string.
+ *
+ * @return the requested string, or NULL if out of memory.
+ */
+TCHAR *tsHASH_buildRandomStringWithTail(int minLen, int maxLen, int tail) {
+ int num;
+ size_t len;
+ size_t strLen;
+ TCHAR *str;
+ size_t i;
+ TCHAR tailStr[32];
+
+ _sntprintf(tailStr, 32, TEXT("-%d"), tail);
+
+ num = _tcslen(tsHASH_randomChars);
+
+ len = tsHASH_getRandom(minLen, maxLen);
+
+ strLen = len + _tcslen(tailStr) + 1;
+ str = malloc(sizeof(TCHAR) * strLen);
+ if (!str) {
+ return NULL;
+ }
+
+ for (i = 0; i < len; i++) {
+ str[i] = tsHASH_randomChars[tsHASH_getRandom(0, num - 1)];
+ }
+ str[len] = TEXT('\0');
+ _tcsncat(str, tailStr, strLen);
+
+ return str;
+}
+
+/**
+ * Frees up an array and its contents. Depends on the values being NULL if they are not allocated.
+ *
+ * @param array Array to be freed.
+ */
+void tsHASH_freeTCHARArray(TCHAR **array, int len) {
+ int i;
+
+ if (array) {
+ for (i = 0; i < len; i++) {
+ if (array[i]) {
+ free(array[i]);
+ }
+ }
+
+ free(array);
+ }
+}
+
+void tsHASH_hashMapCommon(int buckets, int valueCount) {
+ PHashMap hashMap;
+ int i;
+ TCHAR **keys = NULL;
+ TCHAR **values = NULL;
+ const TCHAR *value;
+
+ hashMap = newHashMap(buckets);
+
+ if (valueCount > 0) {
+ keys = malloc(sizeof(TCHAR*) * valueCount);
+ if (!keys) {
+ CU_FAIL(TEXT("Out of memory HMC1"));
+ freeHashMap(hashMap);
+ return;
+ }
+ memset(keys, 0, sizeof(TCHAR*) * valueCount);
+
+ values = malloc(sizeof(TCHAR*) * valueCount);
+ if (!values) {
+ CU_FAIL(TEXT("Out of memory HMC2"));
+ tsHASH_freeTCHARArray(keys, valueCount);
+ freeHashMap(hashMap);
+ return;
+ }
+ memset(values, 0, sizeof(TCHAR*) * valueCount);
+
+ /* Generate and add key-value pairs. */
+ for (i = 0; i < valueCount; i++) {
+ keys[i] = tsHASH_buildRandomStringWithTail(1, 20, i);
+ if (!keys[i]) {
+ CU_FAIL(TEXT("Out of memory HMC3"));
+ tsHASH_freeTCHARArray(keys, valueCount);
+ tsHASH_freeTCHARArray(values, valueCount);
+ freeHashMap(hashMap);
+ return;
+ }
+
+ values[i] = tsHASH_buildRandomString(1, 255);
+ if (!values[i]) {
+ CU_FAIL(TEXT("Out of memory HMC3"));
+ tsHASH_freeTCHARArray(keys, valueCount);
+ tsHASH_freeTCHARArray(values, valueCount);
+ freeHashMap(hashMap);
+ return;
+ }
+
+ hashMapPutKWVW(hashMap, keys[i], values[i]);
+ }
+
+#ifdef _DEBUG_HASHMAP
+ dumpHashMapStats(hashMap);
+#endif
+
+ /* Now check to make sure all of the values were set correctly. */
+ for (i = 0; i < valueCount; i++) {
+ value = hashMapGetKWVW(hashMap, keys[i]);
+ if (value) {
+ if (_tcscmp(values[i], value) != 0) {
+ _sntprintf(tsHASH_workBuffer, TSHASH_WORK_BUFFER_LEN, TEXT("hashMapGetKWVW(map, \"%s\") returned \"%s\" rather than expected \"%s\"."), keys[i], value, values[i]);
+ _tprintf(TEXT("%s\n"), tsHASH_workBuffer);
+ CU_FAIL(tsHASH_workBuffer);
+ } else {
+ _sntprintf(tsHASH_workBuffer, TSHASH_WORK_BUFFER_LEN, TEXT("hashMapGetKWVW(map, \"%s\") returned \"%s\" as expected."), keys[i], value);
+ CU_PASS(tsHASH_workBuffer);
+ }
+ } else {
+ _sntprintf(tsHASH_workBuffer, TSHASH_WORK_BUFFER_LEN, TEXT("hashMapGetKWVW(map, \"%s\") returned NULL rather than expected \"%s\"."), keys[i], values[i]);
+ _tprintf(TEXT("%s\n"), tsHASH_workBuffer);
+ CU_FAIL(tsHASH_workBuffer);
+ }
+ }
+
+ /* Check for a value that will not be in the map. */
+ value = hashMapGetKWVW(hashMap, TEXT("$"));
+ if (value) {
+ _sntprintf(tsHASH_workBuffer, TSHASH_WORK_BUFFER_LEN, TEXT("hashMapGetKWVW(map, \"$\") returned \"%s\" rather than expected NULL."), value);
+ _tprintf(TEXT("%s\n"), tsHASH_workBuffer);
+ CU_FAIL(tsHASH_workBuffer);
+ } else {
+ _sntprintf(tsHASH_workBuffer, TSHASH_WORK_BUFFER_LEN, TEXT("hashMapGetKWVW(map, \"$\") returned NULL as expected."));
+ CU_PASS(tsHASH_workBuffer);
+ }
+
+ tsHASH_freeTCHARArray(keys, valueCount);
+ tsHASH_freeTCHARArray(values, valueCount);
+ }
+
+ freeHashMap(hashMap);
+}
+
+/**
+ * Make sure we can create and destroy an empty hash map.
+ */
+void tsHASH_testHashMapEmpty() {
+ tsHASH_hashMapCommon(100, 0);
+}
+
+/**
+ * Make sure we can create and destroy an sparsely filled hash map that has many empty buckets.
+ */
+void tsHASH_testHashMapSparse() {
+ tsHASH_hashMapCommon(100, 10);
+}
+
+/**
+ * Make sure we can create and destroy an sparsely filled hash map that has many empty buckets.
+ */
+void tsHASH_testHashMapLarge() {
+ tsHASH_hashMapCommon(100, 10000);
+}
+
+int tsHASH_suiteHashMap() {
+ CU_pSuite hashMapSuite;
+
+ hashMapSuite = CU_add_suite("HashMap Suite", NULL, NULL);
+ if (NULL == hashMapSuite) {
+ return CU_get_error();
+ }
+
+ CU_add_test(hashMapSuite, "empty HashMap", tsHASH_testHashMapEmpty);
+ CU_add_test(hashMapSuite, "sparce HashMap", tsHASH_testHashMapSparse);
+ CU_add_test(hashMapSuite, "large HashMap", tsHASH_testHashMapLarge);
+
+ return FALSE;
+}
diff -Nru service-wrapper-java-3.5.22/src/c/test_javaadditionalparam.c service-wrapper-java-3.5.25/src/c/test_javaadditionalparam.c
--- service-wrapper-java-3.5.22/src/c/test_javaadditionalparam.c 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/test_javaadditionalparam.c 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#include
+#include
+#include
+#include "CUnit/Basic.h"
+#include "logger.h"
+#include "property.h"
+#include "wrapper.h"
+
+/********************************************************************
+ * JavaAdditionalParam Utilities
+ *******************************************************************/
+
+/* TODO: Currently the source of tsJAP_testJavaAdditionalParamSuite is in wrapper.c Should we move it in here? */
+
+void tsJAP_dummyLogFileChanged(const TCHAR *logFile) {
+}
+
+int tsJAP_init_properties(void) {
+ initLogging(tsJAP_dummyLogFileChanged);
+ logRegisterThread(WRAPPER_THREAD_MAIN);
+ setLogfileLevelInt(LEVEL_NONE);
+ setConsoleLogFormat(TEXT("LPM"));
+ setConsoleLogLevelInt(LEVEL_DEBUG);
+ setConsoleFlush(TRUE);
+ setSyslogLevelInt(LEVEL_NONE);
+
+ properties = createProperties();
+ return properties ? 0 : 1;
+}
+
+int tsJAP_clean_properties(void) {
+ disposeLogging();
+
+ disposeProperties(properties);
+ return 0;
+}
+
+int tsJAP_suiteJavaAdditionalParam() {
+ CU_pSuite javaAdditionalParamSuite;
+
+ javaAdditionalParamSuite = CU_add_suite("Java Additional Parameter Suite", tsJAP_init_properties, tsJAP_clean_properties);
+ if (NULL == javaAdditionalParamSuite) {
+ return CU_get_error();
+ }
+
+ CU_add_test(javaAdditionalParamSuite, "loadJavaAdditionalCallback()", tsJAP_testJavaAdditionalParamSuite);
+
+ return FALSE;
+}
+
diff -Nru service-wrapper-java-3.5.22/src/c/testsuite.c service-wrapper-java-3.5.25/src/c/testsuite.c
--- service-wrapper-java-3.5.22/src/c/testsuite.c 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/testsuite.c 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+/* NOTES:
+ *
+ * See for ASSERTS:
+ * http://cunit.sourceforge.net/doc/writing_tests.html#tests
+ */
+
+#include
+#include
+#include
+#include "CUnit/Automated.h"
+#include "CUnit/Basic.h"
+#include
+#include "testsuite.h"
+#include "logger.h"
+
+/********************************************************************
+ * Main
+ *******************************************************************/
+void showHelp(TCHAR *app) {
+ _tprintf(TEXT("Wrapper testsuite help.\n"));
+ _tprintf(TEXT("%s \n"), app);
+ _tprintf(TEXT("\n"));
+ _tprintf(TEXT("Commands:\n"));
+ _tprintf(TEXT(" --basic : Runs all tests in basic mode. Only summaries visible.\n"));
+ _tprintf(TEXT(" --auto : Runs all tests in automatic mode. Output visible but results output to file.\n"));
+ _tprintf(TEXT(" See CUnitAutomated-Results.xml for results.\n"));
+ _tprintf(TEXT(" --console : Interactive mode.\n"));
+ _tprintf(TEXT(" --help : This help.\n"));
+ _tprintf(TEXT("\n"));
+}
+
+/* The main() function for setting up and running the tests.
+ * Returns a CUE_SUCCESS on successful running, another
+ * CUnit error code on failure.
+ */
+int main(int argc, char **cargv) {
+ TCHAR **argv;
+ int i;
+ size_t req;
+
+ argv = malloc(argc * sizeof * argv);
+ if (!argv) {
+ _tprintf(TEXT("Out of Memory in Main\n"));
+ return 1;
+ }
+ for (i = 0; i < argc; i++) {
+ req = mbstowcs(NULL, cargv[i], MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ _tprintf(TEXT("Encoding problem with arguments in Main\n"));
+ return 1;
+ }
+ argv[i] = malloc(sizeof(TCHAR) * (req + 1));
+ if (!argv[i]) {
+ _tprintf(TEXT("Out of Memory in Main\n"));
+ while (--i > 0) {
+ free(argv[i]);
+ }
+ free(argv);
+ return 1;
+ }
+ mbstowcs(argv[i], cargv[i], req + 1);
+ argv[i][req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
+ }
+
+ /* Initialize the random seed. */
+ srand((unsigned)time(NULL));
+
+ /* initialize the CUnit test registry */
+ if (CUE_SUCCESS != CU_initialize_registry())
+ {
+ return CU_get_error();
+ }
+
+ /* add a suite to the registry */
+ if (tsEX_suiteExample()) {
+ CU_cleanup_registry();
+ return CU_get_error();
+ }
+
+ if (tsFLTR_suiteFilter()) {
+ CU_cleanup_registry();
+ return CU_get_error();
+ }
+
+ if (tsJAP_suiteJavaAdditionalParam()) {
+ CU_cleanup_registry();
+ return CU_get_error();
+ }
+
+ if (tsHASH_suiteHashMap()) {
+ CU_cleanup_registry();
+ return CU_get_error();
+ }
+
+ if (argc < 2) {
+ showHelp(argv[0]);
+ return 1;
+ } else if (strcmpIgnoreCase(argv[1], TEXT("--basic")) == 0) {
+ /* Run all tests using the CUnit Basic interface */
+ CU_set_output_filename("testsuite");
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ CU_cleanup_registry();
+ return CU_get_error();
+ } else if (strcmpIgnoreCase(argv[1], TEXT("--auto")) == 0) {
+ /* Run all tests using the CUnit Automated interface */
+ CU_list_tests_to_file();
+ CU_automated_run_tests();
+ CU_cleanup_registry();
+ return CU_get_error();
+ } else if (strcmpIgnoreCase(argv[1], TEXT("--console")) == 0) {
+ /* Run all tests using the CUnit Console interface */
+ CU_console_run_tests();
+ CU_cleanup_registry();
+ return CU_get_error();
+ } else {
+ showHelp(argv[0]);
+ return 1;
+ }
+}
+
diff -Nru service-wrapper-java-3.5.22/src/c/testsuite.h service-wrapper-java-3.5.25/src/c/testsuite.h
--- service-wrapper-java-3.5.22/src/c/testsuite.h 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/testsuite.h 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+#ifndef _TESTSUITE_H
+#define _TESTSUITE_H
+
+#include "CUnit/Basic.h"
+#include "wrapper_i18n.h"
+
+extern int tsEX_suiteExample();
+extern int tsFLTR_suiteFilter();
+extern int tsJAP_suiteJavaAdditionalParam();
+extern int tsHASH_suiteHashMap();
+
+#endif
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper.c service-wrapper-java-3.5.25/src/c/wrapper.c
--- service-wrapper-java-3.5.22/src/c/wrapper.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -68,11 +68,6 @@
#define _INTPTR_T_DEFINED
#endif
- #define EADDRINUSE WSAEADDRINUSE
- #define EWOULDBLOCK WSAEWOULDBLOCK
- #define ENOTSOCK WSAENOTSOCK
- #define ECONNRESET WSAECONNRESET
-
#else /* UNIX */
#include
#include
@@ -116,6 +111,17 @@
extern char** environ;
#endif /* WIN32 */
+/* Define some common defines to make cross platform code a bit cleaner. */
+#ifdef WIN32
+ #define WRAPPER_EADDRINUSE WSAEADDRINUSE
+ #define WRAPPER_EWOULDBLOCK WSAEWOULDBLOCK
+ #define WRAPPER_EACCES WSAEACCES
+#else
+ #define WRAPPER_EADDRINUSE EADDRINUSE
+ #define WRAPPER_EWOULDBLOCK EWOULDBLOCK
+ #define WRAPPER_EACCES EACCES
+#endif
+
WrapperConfig *wrapperData;
TCHAR packetBuffer[MAX_LOG_SIZE + 1];
TCHAR *keyChars = TEXT("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-");
@@ -295,7 +301,7 @@
free(confDirTemp);
return;
}
- if (_trealpath(confDirTemp, wrapperData->confDir) == NULL) {
+ if (_trealpathN(confDirTemp, wrapperData->confDir, PATH_MAX + 1) == NULL) {
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL,
TEXT("Unable to resolve the original working directory: %s"), getLastErrorText());
free(confDirTemp);
@@ -410,7 +416,7 @@
#else
i = 0;
while (environment[i]) {
- len = mbstowcs(NULL, environment[i], 0);
+ len = mbstowcs(NULL, environment[i], MBSTOWCS_QUERY_LENGTH);
if (len == (size_t)-1) {
/* Invalid string. Skip. */
} else {
@@ -421,6 +427,7 @@
return TRUE;
}
mbstowcs(sourcePair, environment[i], len + 1);
+ sourcePair[len] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
#endif
len = _tcslen(sourcePair);
@@ -577,9 +584,31 @@
log_printf(WRAPPER_SOURCE_WRAPPER, logLevel, TEXT(""));
}
+#ifdef WIN32
+/**
+ * Check if the Wrapper is running under cygwin terminal.
+ * I'm looking for the environment variable TERM to be equal to "xterm".
+ * I tried with OSTYPE and MACHTYPE, but _tgetenv always returns NULL.
+ * @return TRUE if under cygwin, otherwise returns FALSE
+ */
+int isCygwin() {
+ TCHAR *osType;
+ int retVal = FALSE;
+
+ osType = _tgetenv(TEXT("TERM"));
+
+ if ((osType != NULL) && (_tcscmp(osType, TEXT("xterm")) == 0)) {
+ retVal = TRUE;
+ }
+
+ return retVal;
+}
+#endif
+
void wrapperLoadLoggingProperties(int preload) {
const TCHAR *logfilePath;
int logfileRollMode;
+ int underCygwin = FALSE;
setLogPropertyWarnings(properties, !preload);
@@ -637,8 +666,13 @@
setConsoleLogLevel(getStringProperty(properties, TEXT("wrapper.console.loglevel"), TEXT("INFO")));
+#ifdef WIN32
+ /* check if the current instance of the Wrapper is running under Cygwin */
+ underCygwin = isCygwin();
+#endif
+
/* Load the console flush flag. */
- setConsoleFlush(getBooleanProperty(properties, TEXT("wrapper.console.flush"), FALSE));
+ setConsoleFlush(getBooleanProperty(properties, TEXT("wrapper.console.flush"), FALSE || underCygwin));
#ifdef WIN32
/* Load the console direct flag. */
@@ -653,6 +687,9 @@
/* Load syslog log level */
setSyslogLevel(getStringProperty(properties, TEXT("wrapper.syslog.loglevel"), TEXT("NONE")));
+
+ /* Load syslog split messages flag. */
+ setSyslogSplitMessages(getBooleanProperty(properties, TEXT("wrapper.syslog.split_messages"), FALSE));
#ifndef WIN32
/* Load syslog facility */
@@ -739,7 +776,7 @@
outOfMemory(TEXT("WLCP"), 4);
return TRUE;
}
- if (_trealpath(TEXT("."), wrapperData->originalWorkingDir) == NULL) {
+ if (_trealpathN(TEXT("."), wrapperData->originalWorkingDir, PATH_MAX + 1) == NULL) {
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL,
TEXT("Unable to resolve the original working directory: %s"), getLastErrorText());
return TRUE;
@@ -782,7 +819,7 @@
outOfMemory(TEXT("WLCP"), 2);
return TRUE;
}
- if (_trealpath(wrapperData->argConfFile, wrapperData->configFile) == NULL) {
+ if (_trealpathN(wrapperData->argConfFile, wrapperData->configFile, PATH_MAX + 1) == NULL) {
/* Most likely the file does not exist. The wrapperData->configFile has the first
* file that could not be found. May not be the config file directly if symbolic
* links are involved. */
@@ -887,7 +924,7 @@
outOfMemory(TEXT("WLCP"), 6);
return TRUE;
}
- if (_trealpath(prop, wrapperData->workingDir) == NULL) {
+ if (_trealpathN(prop, wrapperData->workingDir, PATH_MAX + 1) == NULL) {
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL,
TEXT("Unable to resolve the working directory %s: %s"), prop, getLastErrorText());
return TRUE;
@@ -1177,20 +1214,20 @@
}
WideCharToMultiByte(CP_OEMCP, 0, wrapperData->portAddress, -1, tempAddress, (int)len, NULL, NULL);
#else
- len = wcstombs(NULL, wrapperData->portAddress, 0) + 1;
- _tprintf(TEXT("%d hanth %s\n"), len, wrapperData->portAddress);
+ len = wcstombs(NULL, wrapperData->portAddress, 0);
+ /* _tprintf(TEXT("%d hanth %s\n"), len, wrapperData->portAddress); */
if (len == (size_t)-1) {
log_printf(WRAPPER_SOURCE_PROTOCOL, LEVEL_WARN,
TEXT("Invalid multibyte sequence in port address \"%s\" : %s"), wrapperData->portAddress, getLastErrorText());
return;
}
- tempAddress = malloc(len);
+ tempAddress = malloc(len + 1);
if (!tempAddress) {
outOfMemory(TEXT("PSSS"), 2);
return;
}
- wcstombs(tempAddress, wrapperData->portAddress, len);
- _tprintf(TEXT("%d hanth % s\n"), len, tempAddress);
+ wcstombs(tempAddress, wrapperData->portAddress, len + 1);
+ /* _tprintf(TEXT("%d hanth % s\n"), len, tempAddress); */
#endif
addr_srv.sin_addr.s_addr = inet_addr(tempAddress);
free(tempAddress);
@@ -1209,12 +1246,8 @@
rc = wrapperGetLastError();
/* The specified port could bot be bound. */
- if (rc == EADDRINUSE ||
-#ifdef WIN32
- rc == WSAEACCES) {
-#else
- rc == EACCES) {
-#endif
+ if ((rc == WRAPPER_EADDRINUSE) || (rc == WRAPPER_EACCES)) {
+
/* Address in use, try looking at the next one. */
if (fixedPort) {
/* The last port checked was the defined fixed port, switch to the dynamic range. */
@@ -1352,7 +1385,7 @@
if (newBackendSD == INVALID_SOCKET) {
rc = wrapperGetLastError();
/* EWOULDBLOCK != EAGAIN on some platforms. */
- if ((rc == EWOULDBLOCK) || (rc == EAGAIN)) {
+ if ((rc == WRAPPER_EWOULDBLOCK) || (rc == EAGAIN)) {
/* There are no incomming sockets right now. */
return;
} else {
@@ -1390,6 +1423,11 @@
int req;
#ifdef WIN32
req = MultiByteToWideChar(CP_OEMCP, 0, inet_ntoa(addr_srv.sin_addr), -1, NULL, 0);
+ if (req <= 0) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in protocol message \"%s\" : %s"), inet_ntoa(addr_srv.sin_addr), getLastErrorText());
+ return;
+ }
socketSource = malloc(sizeof(TCHAR) * (req + 1));
if (!socketSource) {
outOfMemory(TEXT("PO"), 1);
@@ -1398,13 +1436,19 @@
MultiByteToWideChar(CP_OEMCP, 0, inet_ntoa(addr_srv.sin_addr), -1, socketSource, req + 1);
#else
- req = mbstowcs(NULL, inet_ntoa(addr_srv.sin_addr), 0);
+ req = mbstowcs(NULL, inet_ntoa(addr_srv.sin_addr), MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ log_printf(WRAPPER_SOURCE_PROTOCOL, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in protocol message \"%s\" : %s"), inet_ntoa(addr_srv.sin_addr), getLastErrorText());
+ return;
+ }
socketSource = malloc(sizeof(TCHAR) * (req + 1));
if (!socketSource) {
outOfMemory(TEXT("PO"), 2);
return;
}
mbstowcs(socketSource, inet_ntoa(addr_srv.sin_addr), req + 1);
+ socketSource[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
#endif
log_printf(WRAPPER_SOURCE_PROTOCOL, LEVEL_DEBUG, TEXT("accepted a socket from %s on port %d"),
socketSource, ntohs(addr_srv.sin_port));
@@ -1759,20 +1803,20 @@
}
}
#else
- len = wcstombs(NULL, messageW, 0) + 1;
+ len = wcstombs(NULL, messageW, 0);
if (len == (size_t)-1) {
log_printf(WRAPPER_SOURCE_PROTOCOL, LEVEL_WARN,
TEXT("Invalid multibyte sequence in protocol message \"%s\" : %s"), messageW, getLastErrorText());
returnVal = TRUE;
ok = FALSE;
} else {
- messageMB = malloc(len);
+ messageMB = malloc(len + 1);
if (!messageMB) {
outOfMemory(TEXT("WPF"), 2);
returnVal = TRUE;
ok = FALSE;
} else {
- wcstombs(messageMB, messageW, len);
+ wcstombs(messageMB, messageW, len + 1);
}
}
#endif
@@ -1866,9 +1910,9 @@
rc = send(protocolActiveBackendSD, protocolSendBuffer, sizeof(char) * (int)len, 0);
cnt++;
- } while ((rc == SOCKET_ERROR) && (wrapperGetLastError() == EWOULDBLOCK) && (cnt < 200));
+ } while ((rc == SOCKET_ERROR) && (wrapperGetLastError() == WRAPPER_EWOULDBLOCK) && (cnt < 200));
if (rc == SOCKET_ERROR) {
- if (wrapperGetLastError() == EWOULDBLOCK) {
+ if (wrapperGetLastError() == WRAPPER_EWOULDBLOCK) {
log_printf(WRAPPER_SOURCE_PROTOCOL, LEVEL_WARN, TEXT(
"socket send failed. Blocked for 2 seconds. %s"),
getLastErrorText());
@@ -2029,7 +2073,7 @@
len = recv(protocolActiveBackendSD, (void*) &c, 1, 0);
if (len == SOCKET_ERROR) {
err = wrapperGetLastError();
- if ((err != EWOULDBLOCK) && /* Windows - Would block. */
+ if ((err != WRAPPER_EWOULDBLOCK) && /* Windows - Would block. */
(err != EAGAIN)) { /* UNIX - Would block. */
if (wrapperData->isDebugging) {
log_printf(WRAPPER_SOURCE_PROTOCOL, LEVEL_DEBUG, TEXT("socket read failed. (%s)"), getLastErrorText());
@@ -2106,7 +2150,7 @@
len = read(protocolActiveServerPipeIn, (void*) &c, 1);
if (len == SOCKET_ERROR) {
err = wrapperGetLastError();
- if ((err != EWOULDBLOCK) && /* Windows - Would block. */
+ if ((err != WRAPPER_EWOULDBLOCK) && /* Windows - Would block. */
(err != EAGAIN)) { /* UNIX - Would block. */
if (wrapperData->isDebugging) {
log_printf(WRAPPER_SOURCE_PROTOCOL, LEVEL_DEBUG, TEXT("pipe read failed. (%s)"), getLastErrorText());
@@ -2287,6 +2331,7 @@
wrapperSetJavaState(WRAPPER_JSTATE_DOWN_CLEAN, 0, -1);
wrapperData->lastPingTicks = wrapperGetTicks();
wrapperData->lastLoggedPingTicks = wrapperGetTicks();
+ wrapperData->jvmVersionCommand = NULL;
wrapperData->jvmCommand = NULL;
wrapperData->exitRequested = FALSE;
wrapperData->restartRequested = WRAPPER_RESTART_REQUESTED_INITIAL; /* The first JVM needs to be started. */
@@ -2429,6 +2474,10 @@
wrapperData->portAddress = NULL;
}
#ifdef WIN32
+ if (wrapperData->jvmVersionCommand) {
+ free(wrapperData->jvmVersionCommand);
+ wrapperData->jvmVersionCommand = NULL;
+ }
if (wrapperData->jvmCommand) {
free(wrapperData->jvmCommand);
wrapperData->jvmCommand = NULL;
@@ -2462,6 +2511,14 @@
wrapperData->ctrlCodeQueue = NULL;
}
#else
+ if(wrapperData->jvmVersionCommand) {
+ for (i = 0; wrapperData->jvmVersionCommand[i] != NULL; i++) {
+ free(wrapperData->jvmVersionCommand[i]);
+ wrapperData->jvmVersionCommand[i] = NULL;
+ }
+ free(wrapperData->jvmVersionCommand);
+ wrapperData->jvmVersionCommand = NULL;
+ }
if(wrapperData->jvmCommand) {
for (i = 0; wrapperData->jvmCommand[i] != NULL; i++) {
free(wrapperData->jvmCommand[i]);
@@ -2574,16 +2631,16 @@
void wrapperDispose() {
/* Make sure not to dispose twice. This should not happen, but check for safety. */
if (disposed) {
- _tprintf(TEXT("wrapperDispose was called more than once."));
- return;
+ /* Don't use log_printf here as the second call may have already disposed logging. */
+ _tprintf(TEXT("wrapperDispose was called more than once.\n"));
+ return;
}
disposed = TRUE;
#ifdef WIN32
if (protocolMutexHandle) {
if (!CloseHandle(protocolMutexHandle)) {
- _tprintf(TEXT("Unable to close protocol mutex handle. %s\n"), getLastErrorText());
- fflush(NULL);
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("Unable to close protocol mutex handle. %s"), getLastErrorText());
}
}
@@ -2666,7 +2723,7 @@
TCHAR *generateVersionBanner() {
TCHAR *banner = TEXT("Java Service Wrapper %s Edition %s-bit %s\n Copyright (C) 1999-%s Tanuki Software, Ltd. All Rights Reserved.\n http://wrapper.tanukisoftware.com");
TCHAR *product = TEXT("Community");
- TCHAR *copyright = TEXT("2013");
+ TCHAR *copyright = TEXT("2014");
TCHAR *buffer;
size_t len;
@@ -3219,21 +3276,33 @@
#ifdef WIN32
GetLocaleInfo(GetThreadLocale(), LOCALE_IDEFAULTANSICODEPAGE, buffer, sizeof(buffer));
cp = _ttoi(buffer);
- size = MultiByteToWideChar(cp, 0, log, -1 , NULL, 0) + 1;
- tlog = (TCHAR*)malloc(size * sizeof(TCHAR));
+ size = MultiByteToWideChar(cp, 0, log, -1 , NULL, 0);
+ if (size <= 0) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in protocol message \"%s\" : %s"), log, getLastErrorText());
+ return;
+ }
+
+ tlog = (TCHAR*)malloc((size + 1) * sizeof(TCHAR));
if (!tlog) {
outOfMemory(TEXT("WLCO"), 1);
return;
}
- MultiByteToWideChar(cp, 0, log, -1, (TCHAR*)tlog, size);
+ MultiByteToWideChar(cp, 0, log, -1, (TCHAR*)tlog, size + 1);
#else
- size = mbstowcs(NULL, log, 0) + 1;
- tlog = malloc(size * sizeof(TCHAR));
+ size = mbstowcs(NULL, log, MBSTOWCS_QUERY_LENGTH);
+ if (size == (size_t)-1) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in protocol message \"%s\" : %s"), log, getLastErrorText());
+ return;
+ }
+ tlog = malloc(sizeof(TCHAR) * (size + 1));
if (!tlog) {
outOfMemory(TEXT("WLCO"), 1);
return;
}
- mbstowcs(tlog, log, size);
+ mbstowcs(tlog, log, size + 1);
+ tlog[size] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
#endif
#else
tlog = (TCHAR*)log;
@@ -3539,9 +3608,10 @@
currentLogFilePath = getCurrentLogfilePath();
- wrapperProtocolFunction(WRAPPER_MSG_LOGFILE, currentLogFilePath);
-
- free(currentLogFilePath);
+ if (currentLogFilePath) {
+ wrapperProtocolFunction(WRAPPER_MSG_LOGFILE, currentLogFilePath);
+ free(currentLogFilePath);
+ }
}
/**
@@ -4016,33 +4086,55 @@
tzset();
#if defined(UNICODE)
#if !defined(WIN32)
- req = mbstowcs(NULL, tzname[0], 0) + 1;
- tz1 = malloc(req * sizeof(TCHAR));
+ req = mbstowcs(NULL, tzname[0], MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ return 1;
+ }
+ tz1 = malloc(sizeof(TCHAR) * (req + 1));
if (!tz1) {
outOfMemory(TEXT("LHN"), 1);
} else {
- mbstowcs(tz1, tzname[0], req);
- req = mbstowcs(NULL, tzname[1], 0) + 1;
- tz2 = malloc(req * sizeof(TCHAR));
+ mbstowcs(tz1, tzname[0], req + 1);
+ tz1[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
+
+ req = mbstowcs(NULL, tzname[1], MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ free(tz1);
+ return 1;
+ }
+ tz2 = malloc(sizeof(TCHAR) * (req + 1));
if (!tz2) {
outOfMemory(TEXT("LHN"), 2);
free(tz1);
} else {
- mbstowcs(tz2, tzname[1], req);
+ mbstowcs(tz2, tzname[1], req + 1);
+ tz2[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
#else
req = MultiByteToWideChar(CP_OEMCP, 0, tzname[0], -1, NULL, 0);
- tz1 = malloc(req * sizeof(TCHAR));
+ if (req <= 0) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in port address \"%s\" : %s"), tzname[0], getLastErrorText());
+ return 1;
+ }
+
+ tz1 = malloc((req + 1) * sizeof(TCHAR));
if (!tz1) {
outOfMemory(TEXT("LHN"), 1);
} else {
- MultiByteToWideChar(CP_OEMCP,0, tzname[0], -1, tz1, (int)req);
+ MultiByteToWideChar(CP_OEMCP,0, tzname[0], -1, tz1, (int)req + 1);
req = MultiByteToWideChar(CP_OEMCP, 0, tzname[1], -1, NULL, 0);
- tz2 = malloc(req * sizeof(TCHAR));
+ if (req <= 0) {
+ free(tz1);
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in port address \"%s\" : %s"), tzname[1], getLastErrorText());
+ return 1;
+ }
+ tz2 = malloc((req + 1) * sizeof(TCHAR));
if (!tz2) {
free(tz1);
outOfMemory(TEXT("LHN"), 2);
} else {
- MultiByteToWideChar(CP_OEMCP,0, tzname[1], -1, tz2, (int)req);
+ MultiByteToWideChar(CP_OEMCP,0, tzname[1], -1, tz2, (int)req + 1);
#endif
#else
@@ -4050,17 +4142,17 @@
tz2 = tzname[1];
#endif
#ifndef FREEBSD
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Timezone: %s (%s) Offset: %ld, hasDaylight: %d"),
- tz1, tz2, timezone, daylight);
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Timezone: %s (%s) Offset: %ld, hasDaylight: %d"),
+ tz1, tz2, timezone, daylight);
#else
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Timezone: %s (%s) Offset: %ld"),
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Timezone: %s (%s) Offset: %ld"),
tz1, tz2, timezone);
#endif
- if (wrapperData->useSystemTime) {
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Using system timer."));
- } else {
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Using tick timer."));
- }
+ if (wrapperData->useSystemTime) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Using system timer."));
+ } else {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Using tick timer."));
+ }
#ifdef UNICODE
free(tz1);
free(tz2);
@@ -4079,6 +4171,10 @@
}
free(szOS);
}
+
+ if (isCygwin()) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Cygwin detected"));
+ }
}
#endif
@@ -4430,6 +4526,11 @@
return j;
}
+/**
+ * Stripped quotes out of the prop argument.
+ * The resulting value in propStripped will always be equal or shorter in length
+ * so the propStripped buffer should always be equal to the prop buffer in length.
+ */
void wrapperStripQuotes(const TCHAR *prop, TCHAR *propStripped) {
size_t len;
@@ -4437,25 +4538,6 @@
propStripped[len] = TEXT('\0');
}
-/*
- * Corrects a windows path in place by replacing all '/' characters with '\'
- * on Windows versions.
- *
- * filename - Filename to be modified. Could be null.
- */
-void correctWindowsPath(TCHAR *filename) {
-#ifdef WIN32
- TCHAR *c;
-
- if (filename) {
- c = (TCHAR *)filename;
- while((c = _tcschr(c, TEXT('/'))) != NULL) {
- c[0] = TEXT('\\');
- }
- }
-#endif
-}
-
/**
* Adds quotes around the specified string in such a way that everything is
* escaped correctly. If the bufferSize is not large enough then the
@@ -4669,7 +4751,7 @@
if (exe[0] == TEXT('/')) {
/* This is an absolute reference. */
- if (_trealpath(exe, resolvedPath)) {
+ if (_trealpathN(exe, resolvedPath, PATH_MAX + 1)) {
_tcsncpy(pth, resolvedPath, PATH_MAX + 1);
if (checkIfExecutable(pth)) {
ret = malloc((_tcslen(pth) + 1) * sizeof(TCHAR));
@@ -4693,7 +4775,7 @@
}
/* This is a non-absolute reference. See if it is a relative reference. */
- if (_trealpath(exe, resolvedPath)) {
+ if (_trealpathN(exe, resolvedPath, PATH_MAX + 1)) {
/* Resolved. See if the file exists. */
_tcsncpy(pth, resolvedPath, PATH_MAX + 1);
if (checkIfExecutable(pth)) {
@@ -4755,7 +4837,7 @@
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT(" Check PATH entry: %s"), pth);
}
#endif
- if (_trealpath(pth, resolvedPath) != NULL) {
+ if (_trealpathN(pth, resolvedPath, PATH_MAX + 1) != NULL) {
/* Copy over the result. */
_tcsncpy(pth, resolvedPath, PATH_MAX + 1);
found = checkIfExecutable(pth);
@@ -4894,7 +4976,7 @@
* be replaced by '\' characters in the specified path.
* prop is supposed to be constant, but allow this change as it is
* the actual value that we want. */
- correctWindowsPath((TCHAR *)prop);
+ wrapperCorrectWindowsPath((TCHAR *)prop);
/* If the full path to the java command was not specified, then we
* need to try and resolve it here to avoid problems later when
@@ -5103,54 +5185,81 @@
/**
* Java command line callback.
+ *
+ * @return FALSE if there were any problems.
*/
-static int loadParameterFileCallbackParam_AddArg(LoadParameterFileCallbackParam *param, TCHAR *arg, size_t argLen)
-{
- TCHAR str[MAX_PROPERTY_VALUE_LENGTH];
- TCHAR *s;
+static int loadParameterFileCallbackParam_AddArg(LoadParameterFileCallbackParam *param, TCHAR *arg, size_t argLen) {
+ TCHAR *argTerm;
+ TCHAR *argStripped;
+ TCHAR argExpanded[MAX_PROPERTY_VALUE_LENGTH];
size_t len;
+ /* The incoming arg can not be considered to be null terminated so we need a local copy. */
+ if (!(argTerm = malloc(sizeof(TCHAR) * (argLen + 1)))) {
+ outOfMemory(TEXT("LPFCPAA"), 1);
+ return FALSE;
+ }
+ memcpy(argTerm, arg, sizeof(TCHAR) * argLen);
+ argTerm[argLen] = TEXT('\0');
#ifdef _DEBUG
- memcpy(str, arg, sizeof(TCHAR) * argLen);
- str[argLen] = TEXT('\0');
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_NOTICE, TEXT(" :> %s"), str);
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_NOTICE, TEXT(" :> %s"), argTerm);
#endif
if (param->isJVMParam == TRUE) {
/* As in wrapperBuildJavaCommandArrayJavaAdditional(), skip an
argument which does not begin with '-'. */
- if ((arg[0] != TEXT('-')) && !((arg[0] == TEXT('"')) && (arg[1] == TEXT('-')))) {
+ if ((argTerm[0] != TEXT('-')) && !((argTerm[0] == TEXT('"')) && (argTerm[1] == TEXT('-')))) {
if (param->strings) {
- memcpy(str, arg, sizeof(TCHAR) * argLen);
- str[argLen] = TEXT('\0');
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
- TEXT("The value '%s' is not a valid argument to the JVM. Skipping."), str);
+ TEXT("The value '%s' is not a valid argument to the JVM. Skipping."), argTerm);
}
+ free(argTerm);
return TRUE;
}
}
if (param->strings) {
+ /* Create a buffer to hold the stripped copy of argTerm. */
+ len = _tcslen(argTerm);
+ if (!(argStripped = malloc(sizeof(TCHAR) * (len + 1)))) {
+ outOfMemory(TEXT("LPFCPAA"), 2);
+ free(argTerm);
+ return FALSE;
+ }
+
if (!param->stripQuote) {
- s = arg;
- len = argLen;
+ /* Nothing to strip, simply copy the string. */
+ _tcsncpy(argStripped, argTerm, len + 1);
} else {
- len = wrapperStripQuotesInner(arg, argLen, str);
- s = str;
+ /* Strip the quotes. */
+ wrapperStripQuotes(argTerm, argStripped);
}
+
+ /* No longer needed. */
+ free(argTerm);
+
+ /* Just in case the string contains and environment variable references, make sure they are all evaluated.
+ * argExpanded needs to be static because there is no way to know how long it will be in advance. */
+ evaluateEnvironmentVariables(argStripped, argExpanded, MAX_PROPERTY_VALUE_LENGTH, properties->logWarnings, properties->warnedVarMap, properties->logWarningLogLevel);
+
+ /* No longer needed. */
+ free(argStripped);
+
+ len = _tcslen(argExpanded);
param->strings[param->index] = malloc(sizeof(TCHAR) * (len + 1));
if (!param->strings[param->index]) {
return FALSE;
}
- memcpy(param->strings[param->index], s, sizeof(TCHAR) * len);
- param->strings[param->index][len] = TEXT('\0');
+ _tcsncpy(param->strings[param->index], argExpanded, len + 1);
+ } else {
+ free(argTerm);
}
+
param->index++;
return TRUE;
}
-static int loadParameterFileCallback(void *callbackParam, const TCHAR *fileName, int lineNumber, TCHAR *config, int debugProperties)
-{
+static int loadParameterFileCallback(void *callbackParam, const TCHAR *fileName, int lineNumber, TCHAR *config, int debugProperties) {
LoadParameterFileCallbackParam *param = (LoadParameterFileCallbackParam *)callbackParam;
TCHAR *tail_bound;
TCHAR *arg;
@@ -5225,7 +5334,6 @@
int wrapperLoadParameterFile(TCHAR **strings, int addQuotes, int detectDebugJVM, int index, TCHAR *parameterName, int isJVMParameter) {
const TCHAR *parameterFilePath;
LoadParameterFileCallbackParam callbackParam;
- ConfigFileReader reader;
int readResult;
TCHAR prop[256];
@@ -5248,8 +5356,7 @@
callbackParam.index = index;
callbackParam.isJVMParam = isJVMParameter;
- configFileReader_Initialize(&reader, loadParameterFileCallback, &callbackParam, FALSE);
- readResult = configFileReader_Read(&reader, parameterFilePath, TRUE, 0, NULL, 0);
+ readResult = configFileReader(parameterFilePath, TRUE, loadParameterFileCallback, &callbackParam, FALSE, FALSE);
switch (readResult) {
case CONFIG_FILE_READER_SUCCESS:
return callbackParam.index;
@@ -5368,12 +5475,12 @@
}
/* Start with the property value. */
- _sntprintf(&(strings[index][cpLen]), cpLenAlloc, TEXT("-Djava.library.path="));
+ _sntprintf(&(strings[index][cpLen]), cpLenAlloc - cpLen, TEXT("-Djava.library.path="));
cpLen += 20;
/* Add an open quote to the library path */
if (addQuotes) {
- _sntprintf(&(strings[index][cpLen]), cpLenAlloc, TEXT("\""));
+ _sntprintf(&(strings[index][cpLen]), cpLenAlloc - cpLen, TEXT("\""));
cpLen++;
}
@@ -5418,7 +5525,7 @@
if (j > 0) {
strings[index][cpLen++] = wrapperClasspathSeparator; /* separator */
}
- _sntprintf(&(strings[index][cpLen]), cpLenAlloc, TEXT("%s"), prop);
+ _sntprintf(&(strings[index][cpLen]), cpLenAlloc - cpLen, TEXT("%s"), prop);
cpLen += len2;
j++;
}
@@ -5452,7 +5559,7 @@
if (j > 0) {
strings[index][cpLen++] = wrapperClasspathSeparator; /* separator */
}
- _sntprintf(&(strings[index][cpLen]), cpLenAlloc, TEXT("%s"), systemPath);
+ _sntprintf(&(strings[index][cpLen]), cpLenAlloc - cpLen, TEXT("%s"), systemPath);
cpLen += len2;
j++;
}
@@ -5460,7 +5567,8 @@
if (j == 0) {
/* No library path, use default. always room */
- _sntprintf(&(strings[index][cpLen++]), cpLenAlloc, TEXT("./"));
+ _sntprintf(&(strings[index][cpLen]), cpLenAlloc - cpLen, TEXT("./"));
+ cpLen++;
}
/* Add ending quote. If the previous character is a backslash then
* Windows will use it to escape the quote. To make things work
@@ -5468,10 +5576,10 @@
* result in a single backslash before the quote. */
if (addQuotes) {
if (strings[index][cpLen - 1] == TEXT('\\')) {
- _sntprintf(&(strings[index][cpLen]), cpLenAlloc, TEXT("\\"));
+ _sntprintf(&(strings[index][cpLen]), cpLenAlloc - cpLen, TEXT("\\"));
cpLen++;
}
- _sntprintf(&(strings[index][cpLen]), cpLenAlloc, TEXT("\""));
+ _sntprintf(&(strings[index][cpLen]), cpLenAlloc - cpLen, TEXT("\""));
cpLen++;
}
@@ -5595,7 +5703,7 @@
if (j > 0) {
(*classpath)[cpLen++] = wrapperClasspathSeparator; /* separator */
}
- _sntprintf(&((*classpath)[cpLen]), cpLenAlloc, TEXT("%s"), files[cnt]);
+ _sntprintf(&((*classpath)[cpLen]), cpLenAlloc - cpLen, TEXT("%s"), files[cnt]);
cpLen += len2;
j++;
cnt++;
@@ -5682,7 +5790,8 @@
freeStringProperties(propertyNames, propertyValues, propertyIndices);
if (j == 0) {
/* No classpath, use default. always room */
- _sntprintf(&(*classpath[cpLen++]), cpLenAlloc, TEXT("./"));
+ _sntprintf(&(*classpath[cpLen]), cpLenAlloc - cpLen, TEXT("./"));
+ cpLen++;
}
return 0;
@@ -5720,11 +5829,11 @@
/* Add an open quote the classpath */
if (addQuotes) {
- _sntprintf(&(strings[index][cpLen]), len + 4, TEXT("\""));
+ _sntprintf(&(strings[index][cpLen]), len + 4 - cpLen, TEXT("\""));
cpLen++;
}
- _sntprintf(&(strings[index][cpLen]), len + 4, TEXT("%s"), classpath);
+ _sntprintf(&(strings[index][cpLen]), len + 4 - cpLen, TEXT("%s"), classpath);
cpLen += len;
/* Add ending quote. If the previous character is a backslash then
@@ -5733,10 +5842,10 @@
* result in a single backslash before the quote. */
if (addQuotes) {
if (strings[index][cpLen - 1] == TEXT('\\')) {
- _sntprintf(&(strings[index][cpLen]), len + 4, TEXT("\\"));
+ _sntprintf(&(strings[index][cpLen]), len + 4 - cpLen, TEXT("\\"));
cpLen++;
}
- _sntprintf(&(strings[index][cpLen]), len + 4, TEXT("\""));
+ _sntprintf(&(strings[index][cpLen]), len + 4 - cpLen, TEXT("\""));
cpLen++;
}
@@ -6842,37 +6951,49 @@
getLastErrorText());
} else {
#ifdef UNICODE
-#ifdef WIN32
+ #ifdef WIN32
len = MultiByteToWideChar(CP_OEMCP, 0, hostName, -1, NULL, 0);
- hostName2 = malloc((len + 1) * sizeof(LPWSTR));
+ if (len <= 0) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in port address \"%s\" : %s"), hostName, getLastErrorText());
+ return;
+ }
+
+ hostName2 = malloc(sizeof(LPWSTR) * (len + 1));
if (!hostName2) {
outOfMemory(TEXT("LHN"), 1);
return;
}
MultiByteToWideChar(CP_OEMCP,0, hostName, -1, hostName2, len + 1);
-#else
- len = mbstowcs(NULL, hostName, 0) + 1;
- hostName2 = malloc(len * sizeof(TCHAR));
+ #else
+ len = mbstowcs(NULL, hostName, MBSTOWCS_QUERY_LENGTH);
+ if (len == (size_t)-1) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_WARN,
+ TEXT("Invalid multibyte sequence in port address \"%s\" : %s"), hostName, getLastErrorText());
+ return;
+ }
+ hostName2 = malloc(sizeof(TCHAR) * (len + 1));
if (!hostName2) {
outOfMemory(TEXT("LHN"), 2);
return;
}
- mbstowcs(hostName2, hostName, len);
-#endif
+ mbstowcs(hostName2, hostName, len + 1);
+ hostName2[len] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
+ #endif
#else
/* No conversion needed. Do an extra malloc here to keep the code simple below. */
- len = _tcslen(hostName) + 1;
- hostName2 = malloc(len * sizeof(TCHAR));
+ len = _tcslen(hostName);
+ hostName2 = malloc(sizeof(TCHAR) * (len + 1));
if (!hostName2) {
outOfMemory(TEXT("LHN"), 3);
return;
}
- _tcsncpy(hostName2, hostName, len);
+ _tcsncpy(hostName2, hostName, len + 1);
#endif
wrapperData->hostName = malloc(sizeof(TCHAR) * (_tcslen(hostName2) + 1));
if (!wrapperData->hostName) {
- outOfMemory(TEXT("LHN"), 2);
+ outOfMemory(TEXT("LHN"), 4);
free(hostName2);
return;
}
@@ -7302,6 +7423,10 @@
/* Get the wrapper command log level. */
wrapperData->commandLogLevel = getLogLevelForName(
getStringProperty(properties, TEXT("wrapper.java.command.loglevel"), TEXT("DEBUG")));
+ if (wrapperData->commandLogLevel >= LEVEL_NONE) {
+ /* Should never be possible to completely disable the java command as this would make it very difficult to support. */
+ wrapperData->commandLogLevel = LEVEL_DEBUG;
+ }
/* Should we detach the JVM on startup. */
if (wrapperData->isConsole) {
@@ -7523,34 +7648,34 @@
/** Get the pid files if any. May be NULL */
if (!wrapperData->configured) {
updateStringValue(&wrapperData->pidFilename, getFileSafeStringProperty(properties, TEXT("wrapper.pidfile"), NULL));
- correctWindowsPath(wrapperData->pidFilename);
+ wrapperCorrectWindowsPath(wrapperData->pidFilename);
}
wrapperData->pidFileStrict = getBooleanProperty(properties, TEXT("wrapper.pidfile.strict"), FALSE);
updateStringValue(&wrapperData->javaPidFilename, getFileSafeStringProperty(properties, TEXT("wrapper.java.pidfile"), NULL));
- correctWindowsPath(wrapperData->javaPidFilename);
+ wrapperCorrectWindowsPath(wrapperData->javaPidFilename);
/** Get the lock file if any. May be NULL */
if (!wrapperData->configured) {
updateStringValue(&wrapperData->lockFilename, getFileSafeStringProperty(properties, TEXT("wrapper.lockfile"), NULL));
- correctWindowsPath(wrapperData->lockFilename);
+ wrapperCorrectWindowsPath(wrapperData->lockFilename);
}
/** Get the java id file. May be NULL */
updateStringValue(&wrapperData->javaIdFilename, getFileSafeStringProperty(properties, TEXT("wrapper.java.idfile"), NULL));
- correctWindowsPath(wrapperData->javaIdFilename);
+ wrapperCorrectWindowsPath(wrapperData->javaIdFilename);
/** Get the status files if any. May be NULL */
if (!wrapperData->configured) {
updateStringValue(&wrapperData->statusFilename, getFileSafeStringProperty(properties, TEXT("wrapper.statusfile"), NULL));
- correctWindowsPath(wrapperData->statusFilename);
+ wrapperCorrectWindowsPath(wrapperData->statusFilename);
}
updateStringValue(&wrapperData->javaStatusFilename, getFileSafeStringProperty(properties, TEXT("wrapper.java.statusfile"), NULL));
- correctWindowsPath(wrapperData->javaStatusFilename);
+ wrapperCorrectWindowsPath(wrapperData->javaStatusFilename);
/** Get the command file if any. May be NULL */
updateStringValue(&wrapperData->commandFilename, getFileSafeStringProperty(properties, TEXT("wrapper.commandfile"), NULL));
- correctWindowsPath(wrapperData->commandFilename);
+ wrapperCorrectWindowsPath(wrapperData->commandFilename);
wrapperData->commandFileTests = getBooleanProperty(properties, TEXT("wrapper.commandfile.enable_tests"), FALSE);
/** Get the interval at which the command file will be polled. */
@@ -7559,7 +7684,7 @@
/** Get the anchor file if any. May be NULL */
if (!wrapperData->configured) {
updateStringValue(&wrapperData->anchorFilename, getFileSafeStringProperty(properties, TEXT("wrapper.anchorfile"), NULL));
- correctWindowsPath(wrapperData->anchorFilename);
+ wrapperCorrectWindowsPath(wrapperData->anchorFilename);
}
/** Get the interval at which the anchor file will be polled. */
@@ -8367,7 +8492,7 @@
}
#ifdef CUNIT
-static void subTestJavaAdditionalParamSuite(int stripQuote, TCHAR *config, TCHAR **strings, int strings_len, int isJVMParam) {
+static void tsJAP_subTestJavaAdditionalParamSuite(int stripQuote, TCHAR *config, TCHAR **strings, int strings_len, int isJVMParam) {
LoadParameterFileCallbackParam param;
int ret;
int i;
@@ -8395,9 +8520,9 @@
}
}
-#define ARRAY_LENGTH(a) (sizeof(a) / sizeof(a[0]))
+#define TSJAP_ARRAY_LENGTH(a) (sizeof(a) / sizeof(a[0]))
-void testJavaAdditionalParamSuite(void) {
+void tsJAP_testJavaAdditionalParamSuite(void) {
int stripQuote;
int i = 0;
int isJVM = TRUE;
@@ -8412,7 +8537,7 @@
TCHAR *config = TEXT("-Dsomething=something");
TCHAR *strings[1];
strings[0] = TEXT("-Dsomething=something");
- subTestJavaAdditionalParamSuite(FALSE, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(FALSE, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Multiple parameters in 1 line. */
@@ -8420,7 +8545,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-Dsomething=something");
strings[1] = TEXT("-Dxxx=xxx");
- subTestJavaAdditionalParamSuite(FALSE, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(FALSE, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Horizontal Tab is not a delimiter. */
@@ -8428,7 +8553,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-Dsomething1=something1\t-Dsomething2=something2");
strings[1] = TEXT("-Dxxx=xxx");
- subTestJavaAdditionalParamSuite(FALSE, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(FALSE, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Horizontal Tab is not a delimiter. */
@@ -8436,7 +8561,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-Dsomething1=something1\t-Dsomething2=something2");
strings[1] = TEXT("-Dxxx=xxx");
- subTestJavaAdditionalParamSuite(FALSE, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(FALSE, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
if (isJVM == TRUE) {
{
@@ -8444,7 +8569,7 @@
TCHAR *config = TEXT("something=something -Dxxx=xxx");
TCHAR *strings[1];
strings[0] = TEXT("-Dxxx=xxx");
- subTestJavaAdditionalParamSuite(FALSE, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(FALSE, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
} else {
{
@@ -8453,7 +8578,7 @@
TCHAR *strings[2];
strings[0] = TEXT("something=something");
strings[1] = TEXT("-Dxxx=xxx");
- subTestJavaAdditionalParamSuite(FALSE, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(FALSE, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
}
@@ -8465,7 +8590,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-DmyApp.x1=\"Hello World.\"");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Quotations #2 */
@@ -8473,7 +8598,7 @@
TCHAR *strings[2];
strings[0] = TEXT("\"-DmyApp.x1=Hello World.\"");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Escaped quotation */
@@ -8481,7 +8606,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-DmyApp.x1=\"Hello \\\"World.\"");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Escaped backslash */
@@ -8489,7 +8614,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-DmyApp.x1=\"Hello World.\\\\\"");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
/* Test set #3 : with stripping double quotations */
stripQuote = TRUE;
@@ -8499,7 +8624,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-DmyApp.x1=Hello World.");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Quotations #2 */
@@ -8507,7 +8632,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-DmyApp.x1=Hello World.");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Escaped quotation */
@@ -8515,7 +8640,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-DmyApp.x1=Hello \"World.");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
{
/* Escaped backslash */
@@ -8523,7 +8648,7 @@
TCHAR *strings[2];
strings[0] = TEXT("-DmyApp.x1=Hello World.\\");
strings[1] = TEXT("-DmyApp.x2=x2");
- subTestJavaAdditionalParamSuite(stripQuote, config, strings, ARRAY_LENGTH(strings), isJVM);
+ tsJAP_subTestJavaAdditionalParamSuite(stripQuote, config, strings, TSJAP_ARRAY_LENGTH(strings), isJVM);
}
}
}
diff -Nru service-wrapper-java-3.5.22/src/c/wrappereventloop.c service-wrapper-java-3.5.25/src/c/wrappereventloop.c
--- service-wrapper-java-3.5.22/src/c/wrappereventloop.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrappereventloop.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -52,9 +52,9 @@
#include
#include
#endif
-#include "wrapper_i18n.h"
#include "wrapper.h"
#include "logger.h"
+#include "wrapper_i18n.h"
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
@@ -1277,8 +1277,17 @@
/* Log a few comments that will explain the JVM behavior. */
if (wrapperData->isDebugging) {
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG,
- TEXT("Ping settings: wrapper.ping.interval=%d, wrapper.ping.interval.logged=%d, wrapper.ping.timeout=%d"),
- wrapperData->pingInterval, wrapperData->pingIntervalLogged, wrapperData->pingTimeout);
+ TEXT("%s wrapper.startup.timeout=%d, wrapper.startup.delay.console=%d, wrapper.startup.delay.service=%d, wrapper.restart.delay=%d"),
+ TEXT("Startup Timeouts:"),
+ wrapperData->startupTimeout, wrapperData->startupDelayConsole, wrapperData->startupDelayService, wrapperData->restartDelay);
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG,
+ TEXT("%s wrapper.ping.interval=%d, wrapper.ping.interval.logged=%d, wrapper.ping.timeout=%d, wrapper.ping.alert.threshold=%d"),
+ TEXT("Ping settings:"),
+ wrapperData->pingInterval, wrapperData->pingIntervalLogged, wrapperData->pingTimeout, wrapperData->pingAlertThreshold);
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG,
+ TEXT("%s wrapper.startup.timeout=%d, wrapper.shutdown.timeout=%d, wrapper.jvm_exit.timeout=%d, wrapper.jvm_cleanup.timeout=%d, wrapper.jvm_terminate.timeout=%d"),
+ TEXT("Shutdown Timeouts:"),
+ wrapperData->shutdownTimeout, wrapperData->jvmExitTimeout, wrapperData->jvmCleanupTimeout, wrapperData->jvmTerminateTimeout);
}
if (wrapperData->jvmRestarts > 0) {
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_file.c service-wrapper-java-3.5.25/src/c/wrapper_file.c
--- service-wrapper-java-3.5.22/src/c/wrapper_file.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_file.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -18,25 +18,26 @@
#include
#include
#ifdef WIN32
-#include
-#include
-#include
+ #include
+ #include
+ #include
#else
-#include
-#include
-#include
-#include
-#include
-#include
-#if defined(IRIX)
-#define PATH_MAX FILENAME_MAX
-#endif
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #if defined(IRIX)
+ #define PATH_MAX FILENAME_MAX
+ #endif
#endif
#include "wrapper_file.h"
#include "logger.h"
#include "wrapper_i18n.h"
#include "wrapper.h"
+#include "property.h"
#define FILES_CHUNK 5
@@ -50,6 +51,19 @@
#define MAX_INCLUDE_DEPTH 10
+/* Structure used by configFileReader to read files. */
+typedef struct ConfigFileReader ConfigFileReader;
+struct ConfigFileReader {
+ ConfigFileReader_Callback callback;
+ void *callbackParam;
+ int enableIncludes;
+ int preload;
+ /* debugIncludes controls whether or not debug output is logged. It is set using directives in the file being read. */
+ int debugIncludes;
+ /* debugProperties controls whether or not debug output is logged. It is set using directives in the file being read. */
+ int debugProperties;
+};
+
/**
* Returns a valid sort mode given a name: "TIMES", "NAMES_ASC", "NAMES_DEC".
* In the event of an invalid value, TIMES will be returned.
@@ -322,7 +336,12 @@
#endif
/* Get the first file. */
+#ifdef _IA64_
+ /* On Itanium, the first parameter is not a "const". If you don't cast it, then you have a warning */
+ if ((handle = _tfindfirst64((TCHAR *)pattern, &fblock)) > 0) {
+#else
if ((handle = _tfindfirst64(pattern, &fblock)) > 0) {
+#endif
if ((_tcscmp(fblock.name, TEXT(".")) != 0) && (_tcscmp(fblock.name, TEXT("..")) != 0)) {
fileLen = _tcslen(fblock.name);
files[cnt] = malloc((_tcslen(dirPart) + _tcslen(fblock.name) + 1) * sizeof(TCHAR));
@@ -668,34 +687,6 @@
/**
- * Call functions in property.c temporarily.
- */
-extern void evaluateEnvironmentVariables(const TCHAR *propertyValue, TCHAR *buffer, int bufferLength, int warnUndefinedVars, void *warnedUndefVarMap, int warnLogLevel);
-#ifdef WIN32
-#define strIgnoreCaseCmp _stricmp
-extern int getEncodingByName(char* encodingMB, int *encoding);
-#else
-#define strIgnoreCaseCmp strcasecmp
-extern int getEncodingByName(char* encodingMB, char** encoding);
-#endif
-
-/**
- * Initialize `reader'
- */
-void configFileReader_Initialize(ConfigFileReader *reader,
- ConfigFileReader_Callback callback,
- void *callbackParam,
- int enableIncludes)
-{
- reader->callback = callback;
- reader->callbackParam = callbackParam;
- reader->enableIncludes = enableIncludes;
- reader->debugIncludes = FALSE;
- reader->debugProperties = FALSE;
- reader->preload = FALSE;
-}
-
-/**
* Read configuration file.
*/
int configFileReader_Read(ConfigFileReader *reader,
@@ -987,7 +978,7 @@
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_STATUS,
TEXT("Found #include file in %s: %s"), filename, c);
}
- evaluateEnvironmentVariables(c, expBuffer, MAX_PROPERTY_NAME_VALUE_LENGTH, FALSE, NULL, LEVEL_WARN);
+ evaluateEnvironmentVariables(c, expBuffer, MAX_PROPERTY_NAME_VALUE_LENGTH, properties->logWarnings, properties->warnedVarMap, properties->logWarningLogLevel);
if (reader->debugIncludes && (_tcscmp(c, expBuffer) != 0)) {
/* Only show this log if there were any environment variables. */
@@ -1027,7 +1018,7 @@
if (!absoluteBuffer) {
outOfMemory(TEXT("RCF"), 2);
} else {
- if (_trealpath(expBuffer, absoluteBuffer) == NULL) {
+ if (_trealpathN(expBuffer, absoluteBuffer, PATH_MAX + 1) == NULL) {
if (reader->debugIncludes || includeRequired) {
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_STATUS,
TEXT("Unable to resolve the full path of included configuration file: %s (%s)\n Referenced from: %s (line %d)\n Current working directory: %s"),
@@ -1112,4 +1103,40 @@
return readResult;
}
+/**
+ * Reads configuration lines from the file `filename' and calls `callback' with the line and
+ * `callbackParam' specified to its arguments.
+ *
+ * @param filename Name of configuration file to read.
+ * @param fileRequired TRUE if the file specified by filename is required, FALSE if a missing
+ * file will silently fail.
+ * @param callback Pointer to a callback funtion which will be called for each line read.
+ * @param callbackParam Pointer to additional user data which will be passed to the callback.
+ * @param enableIncludes If TRUE then includes will be supported.
+ * @param preload TRUE if this is being called in the preload step meaning that all errors
+ * should be suppressed.
+ *
+ * @return CONFIG_FILE_READER_SUCCESS if the file was read successfully,
+ * CONFIG_FILE_READER_FAIL if there were any problems at all, or
+ * CONFIG_FILE_READER_HARD_FAIL if the problem should cascaded all the way up.
+ */
+int configFileReader(const TCHAR *filename,
+ int fileRequired,
+ ConfigFileReader_Callback callback,
+ void *callbackParam,
+ int enableIncludes,
+ int preload) {
+ ConfigFileReader reader;
+
+ /* Initialize the reader. */
+ reader.callback = callback;
+ reader.callbackParam = callbackParam;
+ reader.enableIncludes = enableIncludes;
+ reader.preload = preload;
+ reader.debugIncludes = FALSE;
+ reader.debugProperties = FALSE;
+
+ return configFileReader_Read(&reader, filename, fileRequired, 0, NULL, 0);
+}
+
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_file.h service-wrapper-java-3.5.25/src/c/wrapper_file.h
--- service-wrapper-java-3.5.22/src/c/wrapper_file.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_file.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -64,54 +64,37 @@
#endif
/**
- * Read configuration file.
+ * Callback declaration which can be passed to calls to configFileReader.
*/
typedef int (*ConfigFileReader_Callback)(void *param, const TCHAR *fileName, int lineNumber, TCHAR *config, int debugProperties);
-typedef struct ConfigFileReader ConfigFileReader;
-struct ConfigFileReader {
- ConfigFileReader_Callback callback;
- void *callbackParam;
- int enableIncludes;
- int debugIncludes;
- int debugProperties;
- int preload;
-};
-
-/**
- * Initialize `reader'
- */
-extern void configFileReader_Initialize(ConfigFileReader *reader,
- ConfigFileReader_Callback callback,
- void *callbackParam,
- int enableIncludes);
-
-/**
- * Reads configuration lines from the file `filename' and calls
- * `reader->callback' with the line and `reader->callbackParam'
- * specified to its arguments.
+#define CONFIG_FILE_READER_SUCCESS 101
+#define CONFIG_FILE_READER_FAIL 102
+#define CONFIG_FILE_READER_HARD_FAIL 103
+
+/**
+ * Reads configuration lines from the file `filename' and calls `callback' with the line and
+ * `callbackParam' specified to its arguments.
*
- * @param reader ConfigFileReader instance
- * @param filename Name of configuration file to read
- * @param fileRequired Requires the existence of `filename'
- * @param depth Inclusion depth
- * @param parentFilename Name of the file which includes `filename'
- * @param parentLineNumber
+ * @param filename Name of configuration file to read.
+ * @param fileRequired TRUE if the file specified by filename is required, FALSE if a missing
+ * file will silently fail.
+ * @param callback Pointer to a callback funtion which will be called for each line read.
+ * @param callbackParam Pointer to additional user data which will be passed to the callback.
+ * @param enableIncludes If TRUE then includes will be supported.
+ * @param preload TRUE if this is being called in the preload step meaning that all errors
+ * should be suppressed.
*
* @return CONFIG_FILE_READER_SUCCESS if the file was read successfully,
* CONFIG_FILE_READER_FAIL if there were any problems at all, or
* CONFIG_FILE_READER_HARD_FAIL if the problem should cascaded all the way up.
*/
-#define CONFIG_FILE_READER_SUCCESS 101
-#define CONFIG_FILE_READER_FAIL 102
-#define CONFIG_FILE_READER_HARD_FAIL 103
-
-extern int configFileReader_Read(ConfigFileReader *reader,
- const TCHAR *filename,
- int fileRequired,
- int depth,
- const TCHAR *parentFilename,
- int parentLineNumber);
+extern int configFileReader(const TCHAR *filename,
+ int fileRequired,
+ ConfigFileReader_Callback callback,
+ void *callbackParam,
+ int enableIncludes,
+ int preload);
#endif
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper.h service-wrapper-java-3.5.25/src/c/wrapper.h
--- service-wrapper-java-3.5.22/src/c/wrapper.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -254,8 +254,10 @@
int commandLogLevel; /* The log level to use when logging the java command. */
int printJVMVersion; /* tells the Wrapper to create a temp JVM to query the version, before starting the java application */
#ifdef WIN32
+ TCHAR *jvmVersionCommand; /* Command used to launch the JVM and request its version */
TCHAR *jvmCommand; /* Command used to launch the JVM */
#else /* UNIX */
+ TCHAR **jvmVersionCommand; /* Command used to launch the JVM and request its version */
TCHAR **jvmCommand; /* Command used to launch the JVM */
#endif
int detachStarted; /* TRUE if the JVM process should be detached once it has started. */
@@ -277,7 +279,7 @@
int shutdownTimeout; /* Number of seconds the wrapper will wait for a JVM to shutdown */
int jvmExitTimeout; /* Number of seconds the wrapper will wait for a JVM to process to terminate */
int jvmCleanupTimeout; /* Number of seconds the wrapper will allow for its post JVM shudown cleanup. */
- int jvmTerminateTimeout; /* Number of seconds the wrapper will allow for the JVM to respond to TerminateProcess request. */
+ int jvmTerminateTimeout; /* Number of seconds the wrapper will allow for the JVM to respond to TerminateProcess request. */
#ifdef WIN32
int javaIOBufferSize; /* Size of the pipe buffer to use for java I/O. */
#endif
@@ -754,11 +756,6 @@
#endif
/**
- * Gets the error code for the last operation that failed.
- */
-extern int wrapperGetLastError();
-
-/**
* Execute initialization code to get the wrapper set up.
*/
extern int wrapperInitializeRun();
@@ -1058,6 +1055,6 @@
};
#ifdef CUNIT
-extern void testJavaAdditionalParamSuite(void);
+extern void tsJAP_testJavaAdditionalParamSuite(void);
#endif /* CUNIT */
#endif
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_hashmap.c service-wrapper-java-3.5.25/src/c/wrapper_hashmap.c
--- service-wrapper-java-3.5.22/src/c/wrapper_hashmap.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_hashmap.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_hashmap.h service-wrapper-java-3.5.25/src/c/wrapper_hashmap.h
--- service-wrapper-java-3.5.22/src/c/wrapper_hashmap.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_hashmap.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_i18n.c service-wrapper-java-3.5.25/src/c/wrapper_i18n.c
--- service-wrapper-java-3.5.22/src/c/wrapper_i18n.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_i18n.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -13,7 +13,9 @@
#include
#include
#else
+#ifndef FREEBSD
#include
+#endif
#include
#include
#include
@@ -23,7 +25,11 @@
#include
#include
#include
-#include "wrapper_i18n.h"
+#include "logger_base.h"
+
+#if defined(IRIX)
+ #define PATH_MAX FILENAME_MAX
+#endif
#ifndef TRUE
#define TRUE -1
@@ -33,6 +39,20 @@
#define FALSE 0
#endif
+/**
+ * Dynamically load the symbols for the iconv library
+ */
+#ifdef FREEBSD
+typedef void *iconv_t;
+static iconv_t (*wrapper_iconv_open)(const char *, const char *);
+static size_t (*wrapper_iconv)(iconv_t, const char **, size_t *, char **, size_t *);
+static int (*wrapper_iconv_close)(iconv_t);
+#else
+#define wrapper_iconv_open iconv_open
+#define wrapper_iconv iconv
+#define wrapper_iconv_close iconv_close
+#endif
+
#if defined(UNICODE) && defined(WIN32)
/**
* @param multiByteChars The MultiByte encoded source string.
@@ -139,7 +159,7 @@
/* First we need to convert from the multi-byte string to native. */
/* If the multiByteEncoding and interumEncoding encodings are equal then there is nothing to do. */
if (strcmp(multiByteEncoding, interumEncoding) != 0 && strcmp(interumEncoding, "646") != 0) {
- conv_desc = iconv_open(interumEncoding, multiByteEncoding); /* convert multiByte encoding to interum-encoding*/
+ conv_desc = wrapper_iconv_open(interumEncoding, multiByteEncoding); /* convert multiByte encoding to interum-encoding*/
if (conv_desc == (iconv_t)(-1)) {
/* Initialization failure. */
if (errno == EINVAL) {
@@ -200,7 +220,7 @@
/* Make a copy of the nativeCharLen as this call will replace it with the number of chars used. */
nativeCharLenCopy = nativeCharLen;
nativeCharStartCopy = nativeCharStart;
- iconv_value = iconv(conv_desc, &multiByteCharsStart, &multiByteCharsLenStart, &nativeCharStartCopy, &nativeCharLenCopy);
+ iconv_value = wrapper_iconv(conv_desc, &multiByteCharsStart, &multiByteCharsLenStart, &nativeCharStartCopy, &nativeCharLenCopy);
/* Handle failures. */
if (iconv_value == (size_t)-1) {
/* See "man 3 iconv" for an explanation. */
@@ -251,7 +271,7 @@
} while (redoIConv);
/* finish iconv */
- if (iconv_close(conv_desc)) {
+ if (wrapper_iconv_close(conv_desc)) {
free(nativeCharStart);
errorTemplate = (localizeErrorMessage ? TEXT("Cleanup failure in iconv: %d") : TEXT("Cleanup failure in iconv: %d"));
errorTemplateLen = _tcslen(errorTemplate) + 10 + 1;
@@ -270,7 +290,7 @@
}
/* now store the result into a wchar_t */
- wideCharLen = mbstowcs(NULL, nativeCharStart, 0);
+ wideCharLen = mbstowcs(NULL, nativeCharStart, MBSTOWCS_QUERY_LENGTH);
if (wideCharLen == (size_t)-1) {
if (didIConv) {
free(nativeCharStart);
@@ -299,9 +319,7 @@
return TRUE;
}
mbstowcs(*outputBufferW, nativeCharStart, wideCharLen + 1);
-
- /* for sanity */
- (*outputBufferW)[wideCharLen] = TEXT('\0');
+ (*outputBufferW)[wideCharLen] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
/* free the native char */
if (didIConv) {
@@ -325,7 +343,14 @@
cFullPath = malloc (size);
if (cFullPath) {
req = readlink(cExe, cFullPath, size);
- mbstowcs(fullPath, cFullPath, size);
+ req = mbstowcs(fullPath, cFullPath, size);
+ if (req == (size_t)-1) {
+ free(cFullPath);
+ free(cExe);
+ return (size_t)-1;
+ }
+ fullPath[size - 1] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
+
free(cFullPath);
free(cExe);
return req * sizeof(TCHAR);
@@ -342,11 +367,19 @@
*/
TCHAR* _tgetcwd(TCHAR *buf, size_t size) {
char* cBuf;
+ size_t len;
+
if (buf) {
cBuf = malloc(size);
if (cBuf) {
if (getcwd(cBuf, size) != NULL) {
- mbstowcs(buf, cBuf, size * sizeof(TCHAR));
+ len = mbstowcs(buf, cBuf, size);
+ if (len == (size_t)-1) {
+ /* Failed. */
+ free(cBuf);
+ return NULL;
+ }
+ buf[size - 1] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
free(cBuf);
return buf;
}
@@ -403,11 +436,12 @@
free(cLocale);
if (cReturn) {
- req = mbstowcs(NULL, cReturn, 0);
+ req = mbstowcs(NULL, cReturn, MBSTOWCS_QUERY_LENGTH);
if (req != (size_t)-1) {
tReturn = malloc(sizeof(TCHAR) * (req + 1));
if (tReturn) {
mbstowcs(tReturn, cReturn, req + 1);
+ tReturn[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
return tReturn;
}
}
@@ -520,10 +554,15 @@
char* cPath;
size_t req;
int result;
- req = wcstombs(NULL, path, 0) + 1;
- cPath = malloc(req);
+
+ req = wcstombs(NULL, path, 0);
+ if (req == (size_t)-1) {
+ return -1;
+ }
+
+ cPath = malloc(req + 1);
if (cPath) {
- wcstombs(cPath, path, req);
+ wcstombs(cPath, path, req + 1);
result = remove(cPath);
free(cPath);
return result;
@@ -538,15 +577,24 @@
int ret;
ret = -1;
- req = wcstombs(NULL, path, 0) + 1;
- cPath = malloc(req);
-
+ req = wcstombs(NULL, path, 0);
+ if (req == (size_t)-1) {
+ return ret;
+ }
+
+ cPath = malloc(req + 1);
if (cPath) {
- wcstombs(cPath, path, req);
- req = wcstombs(NULL, to, 0) + 1;
- cTo = malloc(req);
+ wcstombs(cPath, path, req + 1);
+
+ req = wcstombs(NULL, to, 0);
+ if (req == (size_t)-1) {
+ free(cPath);
+ return ret;
+ }
+
+ cTo = malloc(req + 1);
if (cTo) {
- wcstombs(cTo, to, req);
+ wcstombs(cTo, to, req + 1);
ret = rename(cPath, cTo);
free(cTo);
}
@@ -559,10 +607,14 @@
char* cMessage;
size_t req;
- req = wcstombs(NULL, message, 0) + 1;
- cMessage = malloc(req);
+ req = wcstombs(NULL, message, 0);
+ if (req == (size_t)-1) {
+ return;
+ }
+
+ cMessage = malloc(req + 1);
if (cMessage) {
- wcstombs(cMessage, message, req);
+ wcstombs(cMessage, message, req + 1);
syslog(priority, "%s", cMessage);
free(cMessage);
}
@@ -581,20 +633,28 @@
size_t req;
char *cVal;
- req = wcstombs(NULL, name, 0) + 1;
- cName = malloc(req);
+ req = wcstombs(NULL, name, 0);
+ if (req == (size_t)-1) {
+ return NULL;
+ }
+ cName = malloc(sizeof(char) * (req + 1));
if (cName) {
- wcstombs(cName, name, req);
+ wcstombs(cName, name, req + 1);
cVal = getenv(cName);
free(cName);
if (cVal == NULL) {
return NULL;
}
- req = mbstowcs(NULL, cVal, 0) + 1;
- req *= sizeof(TCHAR);
- val = malloc(req);
+
+ req = mbstowcs(NULL, cVal, MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ /* Failed. */
+ return NULL;
+ }
+ val = malloc(sizeof(TCHAR) * (req + 1));
if (val) {
- mbstowcs(val, cVal, req);
+ mbstowcs(val, cVal, req + 1);
+ val[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
return val;
}
}
@@ -607,14 +667,24 @@
char* cMode;
FILE *f = NULL;
- sizeFile = wcstombs(NULL, (wchar_t*)file, 0) + 1;
- cFile= malloc(sizeFile);
+ sizeFile = wcstombs(NULL, (wchar_t*)file, 0);
+ if (sizeFile == (size_t)-1) {
+ return NULL;
+ }
+
+ cFile= malloc(sizeFile + 1);
if (cFile) {
- wcstombs(cFile, (wchar_t*) file, sizeFile);
- sizeMode = wcstombs(NULL, (wchar_t*)mode, 0) + 1;
- cMode= malloc(sizeMode);
+ wcstombs(cFile, (wchar_t*) file, sizeFile + 1);
+
+ sizeMode = wcstombs(NULL, (wchar_t*)mode, 0);
+ if (sizeMode == (size_t)-1) {
+ free(cFile);
+ return NULL;
+ }
+
+ cMode= malloc(sizeMode + 1);
if (cMode) {
- wcstombs(cMode, (wchar_t*) mode, sizeMode);
+ wcstombs(cMode, (wchar_t*) mode, sizeMode + 1);
f = fopen(cFile, cMode);
free(cMode);
}
@@ -627,10 +697,14 @@
int size;
char *cAddress;
- size = wcstombs(NULL, (wchar_t*)address, 0) + 1;
- cAddress= malloc(size);
+ size = wcstombs(NULL, (wchar_t*)address, 0);
+ if (size == (size_t)-1) {
+ return -1;
+ }
+
+ cAddress= malloc(size + 1);
if (cAddress) {
- wcstombs(cAddress, (wchar_t*) address, size);
+ wcstombs(cAddress, (wchar_t*) address, size + 1);
size = unlink(cAddress);
free(cAddress);
return size;
@@ -645,10 +719,14 @@
int r;
r = -1;
- size = wcstombs(NULL, arg, 0) + 1;
- cStr = malloc(size);
+ size = wcstombs(NULL, arg, 0);
+ if (size == (size_t)-1) {
+ return r;
+ }
+
+ cStr = malloc(size + 1);
if (cStr) {
- wcstombs(cStr, arg, size);
+ wcstombs(cStr, arg, size + 1);
r = mkfifo(cStr, mode);
free(cStr);
}
@@ -661,10 +739,14 @@
char *cStr;
r = -1;
- size = wcstombs(NULL, path, 0) + 1;
- cStr = malloc(size);
+ size = wcstombs(NULL, path, 0);
+ if (size == (size_t)-1) {
+ return r;
+ }
+
+ cStr = malloc(size + 1);
if (cStr) {
- wcstombs(cStr, path, size);
+ wcstombs(cStr, path, size + 1);
r = chdir(cStr);
free(cStr);
}
@@ -684,10 +766,19 @@
cCmd = malloc((i + 1) * sizeof *cCmd);
if (cCmd) {
for (i = 0; i < size; i++) {
- req = wcstombs(NULL, cmd[i], 0) + 1;
- cCmd[i] = malloc(req);
+ req = wcstombs(NULL, cmd[i], 0);
+ if (req == (size_t)-1) {
+ i--;
+ for (; i > 0; i--) {
+ free(cCmd[i]);
+ }
+ free(cCmd);
+ return -1;
+ }
+
+ cCmd[i] = malloc(req + 1);
if (cCmd[i]) {
- wcstombs(cCmd[i], cmd[i], req);
+ wcstombs(cCmd[i], cmd[i], req + 1);
} else {
i--;
for (; i > 0; i--) {
@@ -698,10 +789,19 @@
}
}
cCmd[size] = '\0';
- req = wcstombs(NULL, arg, 0) + 1;
- cArg = malloc(req);
+
+ req = wcstombs(NULL, arg, 0);
+ if (req == (size_t)-1) {
+ for (; size >= 0; size--) {
+ free(cCmd[size]);
+ }
+ free(cCmd);
+ return -1;
+ }
+
+ cArg = malloc(req + 1);
if (cArg) {
- wcstombs(cArg, arg, req);
+ wcstombs(cArg, arg, req + 1);
i = execvp(cArg, cCmd);
free(cArg);
} else {
@@ -761,10 +861,19 @@
cCmd = malloc((i + 1) * sizeof *cCmd);
if (cCmd) {
for (i = 0; i < sizeCmd; i++) {
- req = wcstombs(NULL, cmd[i], 0) + 1;
- cCmd[i] = malloc(req);
+ req = wcstombs(NULL, cmd[i], 0);
+ if (req == (size_t)-1) {
+ i--;
+ for (; i > 0; i--) {
+ free(cCmd[i]);
+ }
+ free(cCmd);
+ return -1;
+ }
+
+ cCmd[i] = malloc(req + 1);
if (cCmd[i]) {
- wcstombs(cCmd[i], cmd[i], req);
+ wcstombs(cCmd[i], cmd[i], req + 1);
} else {
i--;
for (; i > 0; i--) {
@@ -788,10 +897,23 @@
return -1;
}
for (i = 0; i < sizeEnv; i++) {
- req = wcstombs(NULL, env[i], 0) + 1;
- cEnv[i] = malloc(req);
+ req = wcstombs(NULL, env[i], 0);
+ if (req == (size_t)-1) {
+ i--;
+ for (; i > 0; i--) {
+ free(cEnv[i]);
+ }
+ free(cEnv);
+ for (; sizeCmd >= 0; sizeCmd--) {
+ free(cCmd[sizeCmd]);
+ }
+ free(cCmd);
+ return -1;
+ }
+
+ cEnv[i] = malloc(req + 1);
if (cEnv[i]) {
- wcstombs(cEnv[i], env[i], req);
+ wcstombs(cEnv[i], env[i], req + 1);
} else {
i--;
for (; i > 0; i--) {
@@ -806,10 +928,23 @@
}
}
cEnv[sizeEnv] = '\0';
- req = wcstombs(NULL, arg, 0) + 1;
- cArg = malloc(req);
+
+ req = wcstombs(NULL, arg, 0);
+ if (req == (size_t)-1) {
+ for (; sizeEnv >= 0; sizeEnv--) {
+ free(cEnv[sizeEnv]);
+ }
+ free(cEnv);
+ for (; sizeCmd >= 0; sizeCmd--) {
+ free(cCmd[sizeCmd]);
+ }
+ free(cCmd);
+ return -1;
+ }
+
+ cArg = malloc(req + 1);
if (cArg) {
- wcstombs(cArg, arg, req);
+ wcstombs(cArg, arg, req + 1);
i = execve(cArg, cCmd, cEnv);
free(cArg);
} else {
@@ -833,10 +968,14 @@
int r;
size_t size;
- size = wcstombs(NULL, path, 0) + 1;
- cPath = malloc(size);
+ size = wcstombs(NULL, path, 0);
+ if (size == (size_t)-1) {
+ return -1;
+ }
+
+ cPath = malloc(size + 1);
if (cPath) {
- wcstombs(cPath, path, size);
+ wcstombs(cPath, path, size + 1);
r = open(cPath, oflag, mode);
free(cPath);
return r;
@@ -853,10 +992,14 @@
size_t size;
char *cStr;
- size = wcstombs(NULL, (wchar_t*)string, 0) + 1;
- cStr = malloc(size);
+ size = wcstombs(NULL, (wchar_t*)string, 0);
+ if (size == (size_t)-1) {
+ return -1;
+ }
+
+ cStr = malloc(size + 1);
if (cStr) {
- wcstombs(cStr, string, size);
+ wcstombs(cStr, string, size + 1);
r = putenv(cStr);
/* Can't free cStr as it becomes part of the environment. */
/* free(cstr); */
@@ -871,21 +1014,30 @@
char *cName;
char *cValue;
- size = wcstombs(NULL, (wchar_t*)name, 0) + 1;
- cName = malloc(size);
+ size = wcstombs(NULL, (wchar_t*)name, 0);
+ if (size == (size_t)-1) {
+ return -1;
+ }
+
+ cName = malloc(size + 1);
if (cName) {
- wcstombs(cName, name, size);
-
- size = wcstombs(NULL, (wchar_t*)value, 0) + 1;
- cValue = malloc(size);
+ wcstombs(cName, name, size + 1);
+
+ size = wcstombs(NULL, (wchar_t*)value, 0);
+ if (size == (size_t)-1) {
+ free(cName);
+ return -1;
+ }
+
+ cValue = malloc(size + 1);
if (cValue) {
- wcstombs(cValue, value, size);
-
+ wcstombs(cValue, value, size + 1);
+
r = setenv(cName, cValue, overwrite);
-
+
free(cValue);
}
-
+
free(cName);
}
return r;
@@ -895,13 +1047,17 @@
size_t size;
char *cName;
- size = wcstombs(NULL, (wchar_t*)name, 0) + 1;
- cName = malloc(size);
+ size = wcstombs(NULL, (wchar_t*)name, 0);
+ if (size == (size_t)-1) {
+ return;
+ }
+
+ cName = malloc(size + 1);
if (cName) {
- wcstombs(cName, name, size);
-
+ wcstombs(cName, name, size + 1);
+
unsetenv(cName);
-
+
free(cName);
}
}
@@ -911,10 +1067,14 @@
int size;
char *cFileName;
- size = wcstombs(NULL, (wchar_t*)filename, 0) + 1;
- cFileName = malloc(size);
+ size = wcstombs(NULL, (wchar_t*)filename, 0);
+ if (size == (size_t)-1) {
+ return -1;
+ }
+
+ cFileName = malloc(size + 1);
if (cFileName) {
- wcstombs(cFileName, (wchar_t*) filename, size);
+ wcstombs(cFileName, (wchar_t*) filename, size + 1);
size = stat(cFileName, buf);
free(cFileName);
}
@@ -922,12 +1082,13 @@
}
/**
- * @param file_name The file name to be resolved.
- * @param resolved_name A buffer large enough to hold MAX_PATH characters (plus a '\0')
+ * @param fileName The file name to be resolved.
+ * @param resolvedName A buffer large enough to hold the expanded path.
+ * @param resolvedNameSize The size of the resolvedName buffer, should usually be PATH_MAX + 1.
*
- * @return resolved_name of success, otherwise NULL.
+ * @return resolvedName if successful, otherwise NULL.
*/
-wchar_t* _trealpath(const wchar_t* fileName, wchar_t *resolvedName) {
+wchar_t* _trealpathN(const wchar_t* fileName, wchar_t *resolvedName, size_t resolvedNameSize) {
char *cFile;
#if defined(IRIX)
char resolved[FILENAME_MAX + 1];
@@ -935,37 +1096,364 @@
char resolved[PATH_MAX + 1];
#endif
int sizeFile;
- int sizeReturn;
+ int req;
char* returnVal;
-
+
/* Initialize the return value. */
resolvedName[0] = TEXT('\0');
- sizeFile = wcstombs(NULL, fileName, 0) + 1;
- cFile = malloc(sizeFile);
+ sizeFile = wcstombs(NULL, fileName, 0);
+ if (sizeFile == (size_t)-1) {
+ return NULL;
+ }
+
+ cFile = malloc(sizeFile + 1);
if (cFile) {
- wcstombs(cFile, fileName, sizeFile);
+ wcstombs(cFile, fileName, sizeFile + 1);
+
+ /* get the canonicalized absolute pathname */
returnVal = realpath(cFile, resolved);
- if (returnVal == NULL) {
- free(cFile);
-
- /* The resolved var contains an error path. Convert it. */
- sizeReturn = mbstowcs(NULL, resolved, 0) + 1;
- sizeReturn *= sizeof(TCHAR);
- mbstowcs(resolvedName, resolved, sizeReturn);
-
+
+ free(cFile);
+
+ /**
+ * In case realpath failed, resolved may contain a part of the path (until the folder that is invalid). So we convert it anyway.
+ * For example cFile is "/home/user/alex/../nina" and in fact "/home/user/nina" doesn't exist.
+ * So realpath will fail and resolved will be "/home/user"
+ */
+ req = mbstowcs(NULL, resolved, MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ resolvedName[0] = TEXT('\0'); /* Terminate the output buffer as it does not contain a path. */
return NULL;
}
- free(cFile);
+ mbstowcs(resolvedName, resolved, resolvedNameSize);
+ resolvedName[resolvedNameSize - 1] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
+
- sizeReturn = mbstowcs(NULL, resolved, 0) + 1;
- sizeReturn *= sizeof(TCHAR);
- mbstowcs(resolvedName, resolved, sizeReturn);
-
- return resolvedName;
+ if (returnVal == NULL) {
+ return NULL;
+ } else {
+ return resolvedName;
+ }
}
return NULL;
}
#endif
+
+/**
+ * Function to get the system encoding name/number for the encoding
+ * of the conf file
+ *
+ * @para String holding the encoding from the conf file
+ *
+ * @return TRUE if not found, FALSE otherwise
+ *
+ */
+#ifdef WIN32
+int getEncodingByName(char* encodingMB, int *encoding) {
+#else
+int getEncodingByName(char* encodingMB, char** encoding) {
+#endif
+ if (strIgnoreCaseCmp(encodingMB, "Shift_JIS") == 0) {
+#if defined(FREEBSD) || defined (AIX) || defined(MACOSX)
+ *encoding = "SJIS";
+#elif defined(WIN32)
+ *encoding = 932;
+#else
+ *encoding = "shiftjis";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "eucJP") == 0) {
+#if defined(AIX)
+ *encoding = "IBM-eucJP";
+#elif defined(WIN32)
+ *encoding = 20932;
+#else
+ *encoding = "eucJP";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "UTF-8") == 0) {
+#if defined(HPUX)
+ *encoding = "utf8";
+#elif defined(WIN32)
+ *encoding = 65001;
+#else
+ *encoding = "UTF-8";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-1") == 0) {
+#if defined(WIN32)
+ *encoding = 28591;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-1";
+#else
+ *encoding = "ISO8859-1";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "CP1252") == 0) {
+#if defined(WIN32)
+ *encoding = 1252;
+#else
+ *encoding = "CP1252";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-2") == 0) {
+#if defined(WIN32)
+ *encoding = 28592;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-2";
+#else
+ *encoding = "ISO8859-2";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-3") == 0) {
+#if defined(WIN32)
+ *encoding = 28593;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-3";
+#else
+ *encoding = "ISO8859-3";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-4") == 0) {
+#if defined(WIN32)
+ *encoding = 28594;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-4";
+#else
+ *encoding = "ISO8859-4";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-5") == 0) {
+#if defined(WIN32)
+ *encoding = 28595;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-5";
+#else
+ *encoding = "ISO8859-5";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-6") == 0) {
+#if defined(WIN32)
+ *encoding = 28596;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-6";
+#else
+ *encoding = "ISO8859-6";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-7") == 0) {
+#if defined(WIN32)
+ *encoding = 28597;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-7";
+#else
+ *encoding = "ISO8859-7";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-8") == 0) {
+#if defined(WIN32)
+ *encoding = 28598;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-8";
+#else
+ *encoding = "ISO8859-8";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-9") == 0) {
+#if defined(WIN32)
+ *encoding = 28599;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-9";
+#else
+ *encoding = "ISO8859-9";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-10") == 0) {
+#if defined(WIN32)
+ *encoding = 28600;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-10";
+#else
+ *encoding = "ISO8859-10";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-11") == 0) {
+#if defined(WIN32)
+ *encoding = 28601;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-11";
+#else
+ *encoding = "ISO8859-11";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-13") == 0) {
+#if defined(WIN32)
+ *encoding = 28603;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-13";
+#else
+ *encoding = "ISO8859-13";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-14") == 0) {
+#if defined(WIN32)
+ *encoding = 28604;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-14";
+#else
+ *encoding = "ISO8859-14";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-15") == 0) {
+#if defined(WIN32)
+ *encoding = 28605;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-15";
+#else
+ *encoding = "ISO8859-15";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "ISO-8859-16") == 0) {
+#if defined(WIN32)
+ *encoding = 28606;
+#elif defined(LINUX)
+ *encoding = "ISO-8859-16";
+#else
+ *encoding = "ISO8859-16";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "CP1250") == 0) {
+#if defined(WIN32)
+ *encoding = 1250;
+#else
+ *encoding = "CP1250";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "CP1251") == 0) {
+#if defined(WIN32)
+ *encoding = 1251;
+#else
+ *encoding = "CP1251";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "KOI8-R") == 0) {
+#if defined(WIN32)
+ *encoding = 20866;
+#else
+ *encoding = "KOI8-R";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "KOI8-U") == 0) {
+#if defined(WIN32)
+ *encoding = 21866;
+#else
+ *encoding = "KOI8-U";
+#endif
+ } else if (strIgnoreCaseCmp(encodingMB, "DEFAULT") == 0) {
+#ifdef WIN32
+ *encoding = GetACP();
+#else
+ *encoding = nl_langinfo(CODESET);
+ #ifdef MACOSX
+ if (strlen(*encoding) == 0) {
+ *encoding = "UTF-8";
+ }
+ #endif
+#endif
+ } else {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * Gets the error code for the last operation that failed.
+ */
+int wrapperGetLastError() {
+#ifdef WIN32
+ return WSAGetLastError();
+#else
+ return errno;
+#endif
+}
+
+/*
+ * Corrects a path in place by replacing all '/' characters with '\'
+ * on Windows platforms. Does nothing on NIX platforms.
+ *
+ * filename - Filename to be modified. Could be null.
+ */
+void wrapperCorrectWindowsPath(TCHAR *filename) {
+#ifdef WIN32
+ TCHAR *c;
+
+ if (filename) {
+ c = (TCHAR *)filename;
+ while((c = _tcschr(c, TEXT('/'))) != NULL) {
+ c[0] = TEXT('\\');
+ }
+ }
+#endif
+}
+
+#ifdef FREEBSD
+/*
+ * Tries to load libiconv and then fallback in FreeBSD.
+ * Unfortunately we can not do any pretty logging here as iconv is
+ * required for all of that to work.
+ *
+ * @return TRUE if there were any problems, FALSE otherwise.
+ */
+int loadIconvLibrary() {
+ void *libHandle;
+ const char *error;
+
+ /* iconv library name present from FreeBSD 7 to 9 */
+ libHandle = dlopen("/usr/local/lib/libiconv.so", RTLD_NOW);
+
+ /* Falling back to libbiconv library in FreeBSD 10 */
+ if (libHandle == NULL) {
+ libHandle = dlopen("/usr/local/lib/libbiconv.so", RTLD_NOW);
+ }
+
+ /* Falling back to libkiconv.4 in FreeBSD 10 */
+ if (libHandle == NULL) {
+ libHandle = dlopen("/lib/libkiconv.so.4", RTLD_NOW);
+ }
+
+ /* No library found, we cannot continue as we need iconv support */
+ if (!libHandle) {
+ /* The string that dlerror is in a static buffer and should not be freed. It must be immediately used or copied. */
+ error = dlerror();
+ printf("Failed to locate the iconv library: %s\n", (error ? error : ""));
+ printf("Unable to continue.\n");
+ return TRUE;
+ }
+
+ /* Look up the required functions. */
+ *(void **)(&wrapper_iconv_open) = dlsym(libHandle, "iconv_open");
+ if (!wrapper_iconv_open) {
+ /* The string that dlerror is in a static buffer and should not be freed. It must be immediately used or copied. */
+ error = dlerror();
+ printf("Failed to locate the %s function from the iconv library: %s\n", "iconv_open", (error ? error : ""));
+ printf("Unable to continue.\n");
+ return TRUE;
+ }
+ *(void **)(&wrapper_iconv) = dlsym(libHandle, "iconv");
+ if (!wrapper_iconv) {
+ /* The string that dlerror is in a static buffer and should not be freed. It must be immediately used or copied. */
+ error = dlerror();
+ printf("Failed to locate the %s function from the iconv library: %s\n", "iconv", (error ? error : ""));
+ printf("Unable to continue.\n");
+ return TRUE;
+ }
+ *(void **)(&wrapper_iconv_close) = dlsym(libHandle,"iconv_close");
+ if (!wrapper_iconv_close) {
+ /* The string that dlerror is in a static buffer and should not be freed. It must be immediately used or copied. */
+ error = dlerror();
+ printf("Failed to locate the %s function from the iconv library: %s\n", "iconv_close", (error ? error : ""));
+ printf("Unable to continue.\n");
+ return TRUE;
+ }
+
+ return FALSE;
+}
+#endif
+
+#ifdef DEBUG_MALLOC
+ /* There can't be any more malloc calls after the malloc2 function in this file. */
+ #undef malloc
+void *malloc2(size_t size, const char *file, int line, const char *func, const char *sizeVar) {
+ void *ptr;
+ #ifdef WIN32
+ wprintf(L"%S:%d:%S malloc(%S) -> malloc(%d)", file, line, func, sizeVar, size);
+ #else
+ wprintf(L"%s:%d:%s malloc(%s) -> malloc(%d)", file, line, func, sizeVar, size);
+ #endif
+ ptr = malloc(size);
+ wprintf(L" -> %p\n", ptr);
+ return ptr;
+}
+#endif
+
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_i18n.h service-wrapper-java-3.5.25/src/c/wrapper_i18n.h
--- service-wrapper-java-3.5.22/src/c/wrapper_i18n.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_i18n.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -13,42 +13,47 @@
#define _LOCALIZE
#include
-
#ifndef WIN32
+
+ #define MBSTOWCS_QUERY_LENGTH 0
#ifdef UNICODE
#include
- #ifdef _sntprintf
- #undef _sntprintf
- #endif
-
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
+ #ifdef _sntprintf
+ #undef _sntprintf
+ #endif
+
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
- #define __max(x,y) (((x) > (y)) ? (x) : (y))
- #define __min(x,y) (((x) < (y)) ? (x) : (y))
+ #define __max(x,y) (((x) > (y)) ? (x) : (y))
+ #define __min(x,y) (((x) < (y)) ? (x) : (y))
+
+ #if defined(SOLARIS) || defined(HPUX)
+ #define WRAPPER_USE_PUTENV
+ #endif
- #if defined(SOLARIS) || defined(HPUX)
- #define WRAPPER_USE_PUTENV
- #endif
+ #ifdef FREEBSD
+ #include
+ #endif
- #if defined(MACOSX) || defined(HPUX) || defined(FREEBSD) || defined(SOLARIS)
- #ifndef wcscasecmp
+ #if defined(MACOSX) || defined(HPUX) || defined(FREEBSD) || defined(SOLARIS)
+ #ifndef wcscasecmp
extern int wcscasecmp(const wchar_t* s1, const wchar_t* s2);
- #define ECSCASECMP
+ #define ECSCASECMP
+ #endif
#endif
- #endif
- #define TEXT(x) L##x
+ #define TEXT(x) L##x
typedef wchar_t TCHAR;
typedef wchar_t _TUCHAR;
@@ -124,7 +129,10 @@
#define _tcsdec _wcsdec
#define _tcsdup _wcsdup
#define _tcsicmp wcscasecmp
-extern wchar_t* _trealpath(const wchar_t* file_name, wchar_t *resolved_name) ;
+/* Intentionally do not allow use of _trealpath because it does not specify a buffer length.
+ * #define _trealpath
+ * Define our own _trealpathN below. */
+extern wchar_t* _trealpathN(const wchar_t* fileName, wchar_t *resolvedName, size_t resolvedNameSize);
#define _tcsicoll _wcsicoll
#define _tcsinc _wcsinc
#define _tcslwr _wcslwr
@@ -325,7 +333,10 @@
#define _tcsicmp strcasecmp
#define _tcsicoll _stricoll
#define _tcsinc _strinc
-#define _trealpath realpath
+/* Intentionally do not allow use of _trealpath because it does not specify a buffer length.
+ * #define _trealpath realpath
+ * Define our own _trealpathN below. */
+#define _trealpathN(fileName, resolvedName, resolvedNameSize) realpath(fileName, resolvedName)
#define _tcslwr _strlwr
#define _tcsnbcnt _strncnt
#define _tcsnccnt _strncnt
@@ -443,4 +454,75 @@
#include
extern int multiByteToWideChar(const char *multiByteChars, int encoding, TCHAR **outputBufferW, int localizeErrorMessage);
#endif
+
+#ifdef FREEBSD
+/*
+ * Tries to load libiconv and then fallback in FreeBSD.
+ * Unfortunately we can not do any pretty logging here as iconv is
+ * required for all of that to work.
+ *
+ * @return TRUE if there were any problems, FALSE otherwise.
+ */
+extern int loadIconvLibrary();
#endif
+
+/**
+ * Define a cross platform way to compare strings while ignoring case.
+ */
+#ifdef WIN32
+#define strIgnoreCaseCmp _stricmp
+#else
+#define strIgnoreCaseCmp strcasecmp
+#endif
+
+/**
+ * Function to get the system encoding name/number for the encoding
+ * of the conf file
+ *
+ * @para String holding the encoding from the conf file
+ *
+ * @return TRUE if not found, FALSE otherwise
+ *
+ */
+#ifdef WIN32
+extern int getEncodingByName(char* encodingMB, int *encoding);
+#else
+extern int getEncodingByName(char* encodingMB, char** encoding);
+#endif
+
+/**
+ * Gets the error code for the last operation that failed.
+ */
+extern int wrapperGetLastError();
+
+/*
+ * Corrects a path in place by replacing all '/' characters with '\'
+ * on Windows platforms. Does nothing on NIX platforms.
+ *
+ * filename - Filename to be modified. Could be null.
+ */
+extern void wrapperCorrectWindowsPath(TCHAR *filename);
+#endif
+
+
+/* Helper defines used to help trace where certain calls are being made. */
+/*#define DEBUG_MBSTOWCS*/
+#ifdef DEBUG_MBSTOWCS
+ #ifdef WIN32
+ #define mbstowcs(x,y,z) mbstowcs(x,y,z); wprintf(L"%S:%d:%S mbstowcs(%S, %S, %S) -> mbstowcs(%p, \"%S\", %d)\n", __FILE__, __LINE__, __FUNCTION__, #x, #y, #z, (void *)x, y, (int)z)
+ #else
+ #define mbstowcs(x,y,z) mbstowcs(x,y,z); wprintf(L"%s:%d:%s mbstowcs(%s, %s, %s) -> mbstowcs(%p, \"%s\", %d)\n", __FILE__, __LINE__, __FUNCTION__, #x, #y, #z, (void *)x, y, (int)z)
+ #endif
+#endif
+
+/*#define DEBUG_MALLOC*/
+#ifdef DEBUG_MALLOC
+ extern void *malloc2(size_t size, const char *file, int line, const char *func, const char *sizeVar);
+ #define malloc(x) malloc2(x, __FILE__, __LINE__, __FUNCTION__, #x)
+ #ifdef WIN32
+ #define free(x) wprintf(L"%S:%d:%S free(%S) -> free(%p)\n", __FILE__, __LINE__, __FUNCTION__, #x, (void *)x); free(x)
+ #else
+ #define free(x) wprintf(L"%s:%d:%s free(%s) -> free(%p)\n", __FILE__, __LINE__, __FUNCTION__, #x, (void *)x); free(x)
+ #endif
+#endif
+
diff -Nru service-wrapper-java-3.5.22/src/c/wrapperinfo.c.in service-wrapper-java-3.5.25/src/c/wrapperinfo.c.in
--- service-wrapper-java-3.5.22/src/c/wrapperinfo.c.in 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapperinfo.c.in 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -11,11 +11,13 @@
-#include "wrapper_i18n.h"
#ifdef WIN32
#include
#include
#endif
+
+#include "wrapper_i18n.h"
+
/**
* wrapperinfo.c is built as part of the build process. Ant creates this
* file by making a copy of wrapperinfo.c.in, replacing tokens as it does
@@ -28,7 +30,7 @@
TCHAR *wrapperBits = TEXT("@bits@");
TCHAR *wrapperArch = TEXT("@dist.arch@");
TCHAR *wrapperOS = TEXT("@dist.os@");
-TCHAR *wrapperReleaseDate = TEXT("20131009");
+TCHAR *wrapperReleaseDate = TEXT("20140612");
TCHAR *wrapperReleaseTime = TEXT("0000");
TCHAR *wrapperBuildDate = TEXT("@build.date@");
TCHAR *wrapperBuildTime = TEXT("@build.time@");
diff -Nru service-wrapper-java-3.5.22/src/c/wrapperinfo.h service-wrapper-java-3.5.25/src/c/wrapperinfo.h
--- service-wrapper-java-3.5.22/src/c/wrapperinfo.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapperinfo.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/c/wrapperjni.c service-wrapper-java-3.5.25/src/c/wrapperjni.c
--- service-wrapper-java-3.5.22/src/c/wrapperjni.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapperjni.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -39,8 +39,9 @@
#define dup2 _dup2
#endif
#include "wrapper_i18n.h"
-#include "wrapperinfo.h"
+#include "loggerjni.h"
#include "wrapperjni.h"
+#include "wrapperinfo.h"
int wrapperJNIDebugging = JNI_FALSE;
@@ -83,6 +84,7 @@
char *utf8SigVrLjavaUtilProperties;
char *utf8MethodGetProperty;
char *utf8SigLjavaLangStringrLjavaLangString;
+char *utf8javaIOIOException; /* "java/io/IOException" */
#ifdef WIN32
#else
@@ -136,68 +138,6 @@
}
/**
- * Create an error message from GetLastError() using the
- * FormatMessage API Call...
- */
-#ifdef WIN32
-TCHAR lastErrBuf[1024];
-TCHAR* getLastErrorText() {
- DWORD dwRet;
- LPTSTR lpszTemp = NULL;
-
- dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
- NULL,
- GetLastError(),
- LANG_NEUTRAL,
- (LPTSTR)&lpszTemp,
- 0,
- NULL);
-
- /* supplied buffer is not long enough */
- if (!dwRet || ((long)1023 < (long)dwRet+14)) {
- lastErrBuf[0] = TEXT('\0');
- } else {
- lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0'); /*remove cr and newline character */
- _sntprintf( lastErrBuf, 1024, TEXT("%s (0x%x)"), lpszTemp, GetLastError());
- }
-
- /* following the documentation of FormatMessage, LocalFree should be called to free the output buffer. */
- if (lpszTemp) {
- LocalFree(lpszTemp);
- }
-
- return lastErrBuf;
-}
-int getLastError() {
- return GetLastError();
-}
-#else
-TCHAR* getLastErrorText() {
-
-#ifdef UNICODE
- char* c;
- TCHAR* t;
- size_t req;
- c = strerror(errno);
- req = mbstowcs(NULL, c, 0);
- t = malloc(req);
- if (!t) {
- return NULL;
- }
- mbstowcs(t, c, req);
- return t;
-
-#else
- return strerror(errno);
-#endif
-}
-int getLastError() {
- return errno;
-}
-#endif
-
-/**
* Create a jstring from a Wide Char string. The jstring must be freed up by caller.
*
* @param env The current JNIEnv.
@@ -224,26 +164,31 @@
size = WideCharToMultiByte(CP_UTF8, 0, strW, -1, NULL, 0, NULL, NULL);
if (size == 0) {
/* Failed. */
- _tprintf(TEXT("WrapperJNI Warn: Failed to convert string \"%s\": %s\n"), strW, GetLastError()); fflush(NULL);
+ _tprintf(TEXT("WrapperJNI Warn: Failed to convert string \"%s\": %s\n"), strW, getLastErrorText()); fflush(NULL);
return NULL;
}
- msgMB = malloc(sizeof(char) * size);
+ msgMB = malloc(sizeof(char) * (size + 1));
if (!msgMB) {
throwOutOfMemoryError(env, TEXT("JNSN1"));
return NULL;
}
- WideCharToMultiByte(CP_UTF8, 0, strW, -1, msgMB, size, NULL, NULL);
+ WideCharToMultiByte(CP_UTF8, 0, strW, -1, msgMB, size + 1, NULL, NULL);
result = (*env)->NewStringUTF(env, msgMB);
free(msgMB);
return result;
#else
- size = wcstombs(NULL, strW, 0) + 1;
- msgMB = malloc(sizeof(char) * size);
+ size = wcstombs(NULL, strW, 0);
+ if (size == (size_t)-1) {
+ _tprintf(TEXT("Invalid multibyte sequence \"%s\": %s\n"), strW, getLastErrorText());
+ return NULL;
+ }
+
+ msgMB = malloc(sizeof(char) * (size + 1));
if (!msgMB) {
throwOutOfMemoryError(env, TEXT("JNSN2"));
return NULL;
}
- wcstombs(msgMB, strW, size);
+ wcstombs(msgMB, strW, size + 1);
#endif
} else {
/* Empty string. */
@@ -369,14 +314,20 @@
free(result);
return tresult;
#else
- size = (mbstowcs(NULL, result, 0) + 1) * sizeof(TCHAR);
- tresult = malloc(size);
+ size = mbstowcs(NULL, result, MBSTOWCS_QUERY_LENGTH);
+ if (size == (size_t)-1) {
+ throwJNIError(env, TEXT("Encoding error."));
+ return NULL;
+ }
+ tresult = malloc(sizeof(TCHAR) * (size + 1));
if (!tresult) {
free(result);
throwOutOfMemoryError(env, TEXT("GSNC3"));
return NULL;
}
- mbstowcs(tresult, result, size);
+ mbstowcs(tresult, result, size + 1);
+ tresult[size] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
+
free(result);
return tresult;
#endif
@@ -461,6 +412,7 @@
utf8SigVrLjavaUtilProperties = getUTF8Chars(env, "()Ljava/util/Properties;");
utf8MethodGetProperty = getUTF8Chars(env, "getProperty");
utf8SigLjavaLangStringrLjavaLangString = getUTF8Chars(env, "(Ljava/lang/String;)Ljava/lang/String;");
+ utf8javaIOIOException = getUTF8Chars(env, "java/io/IOException");
#ifdef WIN32
#else
@@ -469,7 +421,7 @@
utf8MethodAddGroup = getUTF8Chars(env, "addGroup");
utf8SigIIStringStringStringStringrV = getUTF8Chars(env, "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
utf8SigIStringrV = getUTF8Chars(env, "(ILjava/lang/String;)V");
-#endif
+#endif
}
/**
@@ -557,10 +509,16 @@
/**
* Do common initializaion.
+ *
+ * @return TRUE if there were any problems.
*/
-void initCommon(JNIEnv *env, jclass jClassWrapperManager) {
- TCHAR* outfile, *errfile;
- int outfd, errfd, mode, options;
+int initCommon(JNIEnv *env, jclass jClassWrapperManager) {
+ TCHAR* outfile;
+ TCHAR* errfile;
+ int outfd;
+ int errfd;
+ int mode;
+ int options;
#ifdef WIN32
mode = _S_IWRITE;
@@ -573,30 +531,32 @@
if (getSystemProperty(env, TEXT("wrapper.java.errfile"), &errfile, FALSE)) {
/* Failed */
- return;
+ return TRUE;
}
if (errfile) {
_ftprintf(stderr, TEXT("WrapperJNI: Redirecting %s to file %s...\n"), TEXT("StdErr"), errfile); fflush(NULL);
if (((errfd = _topen(errfile, options, mode)) == -1) || (dup2(errfd, STDERR_FILENO) == -1)) {
- _ftprintf(stderr, TEXT("WrapperJNI: Failed to redirect %s to file %s (Err: %s)\n"), TEXT("StdErr"), errfile, getLastErrorText()); fflush(NULL);
- return;
+ throwThrowable(env, utf8javaIOIOException, TEXT("Failed to redirect %s to file %s (Err: %s)"), TEXT("StdErr"), errfile, getLastErrorText());
+ return TRUE;
} else {
redirectedStdErr = TRUE;
}
}
if (getSystemProperty(env, TEXT("wrapper.java.outfile"), &outfile, FALSE)) {
/* Failed */
- return;
+ return TRUE;
}
if (outfile) {
_tprintf(TEXT("WrapperJNI: Redirecting %s to file %s...\n"), TEXT("StdOut"), outfile); fflush(NULL);
if (((outfd = _topen(outfile, options, mode)) == -1) || (dup2(outfd, STDOUT_FILENO) == -1)) {
- _tprintf(TEXT("WrapperJNI: Failed to redirect %s to file %s (Err: %s)\n"), TEXT("StdOut"), errfile, getLastErrorText()); fflush(NULL);
- return;
+ throwThrowable(env, utf8javaIOIOException, TEXT("Failed to redirect %s to file %s (Err: %s)"), TEXT("StdOut"), outfile, getLastErrorText());
+ return TRUE;
} else {
redirectedStdOut = TRUE;
}
}
+
+ return FALSE;
}
void throwThrowable(JNIEnv *env, char *throwableClassName, const TCHAR *lpszFmt, ...) {
diff -Nru service-wrapper-java-3.5.22/src/c/wrapperjni.h service-wrapper-java-3.5.25/src/c/wrapperjni.h
--- service-wrapper-java-3.5.22/src/c/wrapperjni.h 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapperjni.h 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -64,7 +64,6 @@
/** Flag to keep track of whether StdErr has been redirected. */
extern int redirectedStdErr;
-extern TCHAR* getLastErrorText();
extern void throwJNIError(JNIEnv *env, const TCHAR *message);
/* Special symbols that need to be defined manually as part of the bootstrap process. */
@@ -82,6 +81,7 @@
extern char *utf8SigVrLjavaUtilProperties;
extern char *utf8MethodGetProperty;
extern char *utf8SigLjavaLangStringrLjavaLangString;
+extern char *utf8javaIOIOException; /* "java/io/IOException" */
#ifdef WIN32
#else
@@ -98,9 +98,8 @@
extern jstring JNU_NewStringFromNativeChar(JNIEnv *env, const char *str);
#endif
-extern void initCommon();
+extern int initCommon();
-extern int getLastError();
extern void throwOutOfMemoryError(JNIEnv *env, const TCHAR* locationCode);
extern int wrapperSleep(int ms);
diff -Nru service-wrapper-java-3.5.22/src/c/wrapperjni_unix.c service-wrapper-java-3.5.25/src/c/wrapperjni_unix.c
--- service-wrapper-java-3.5.22/src/c/wrapperjni_unix.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapperjni_unix.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -40,7 +40,7 @@
#include
#include
#include
-#include "wrapper_i18n.h"
+#include "loggerjni.h"
#include "wrapperjni.h"
static pid_t wrapperProcessId = -1;
@@ -162,7 +162,10 @@
signal(SIGUSR2, handleUsr2);
*/
- initCommon(env, jClassWrapperManager);
+ if (initCommon(env, jClassWrapperManager)) {
+ /* Failed. An exception will have been thrown. */
+ return;
+ }
/* Store the current process Id */
wrapperProcessId = getpid();
diff -Nru service-wrapper-java-3.5.22/src/c/wrapperjni_win.c service-wrapper-java-3.5.25/src/c/wrapperjni_win.c
--- service-wrapper-java-3.5.22/src/c/wrapperjni_win.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapperjni_win.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -42,7 +42,7 @@
#include
#include
#include
-#include "wrapper_i18n.h"
+#include "loggerjni.h"
#include "wrapperjni.h"
/* MS Visual Studio 8 went and deprecated the POXIX names for functions.
@@ -545,9 +545,8 @@
return wrapperUser;
}
+HMODULE kernel32Mod;
void loadDLLProcs() {
- HMODULE kernel32Mod;
-
if ((kernel32Mod = GetModuleHandle(TEXT("KERNEL32.DLL"))) == NULL) {
_tprintf(TEXT("WrapperJNI Error: Unable to load KERNEL32.DLL: %s\n"), getLastErrorText());
flushall();
@@ -638,7 +637,10 @@
flushall();
}
}
- initCommon(env, jClassWrapperManager);
+ if (initCommon(env, jClassWrapperManager)) {
+ /* Failed. An exception will have been thrown. */
+ return;
+ }
osVer.dwOSVersionInfoSize = sizeof(osVer);
if (GetVersionEx(&osVer)) {
diff -Nru service-wrapper-java-3.5.22/src/c/Wrapper.rc service-wrapper-java-3.5.25/src/c/Wrapper.rc
--- service-wrapper-java-3.5.22/src/c/Wrapper.rc 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/Wrapper.rc 2014-06-30 18:06:59.000000000 +0000
@@ -53,8 +53,8 @@
// http://msdn.microsoft.com/en-us/library/aa381058%28VS.85%29.aspx
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 3,5,22,0
- PRODUCTVERSION 3,5,22,0
+ FILEVERSION 3,5,25,0
+ PRODUCTVERSION 3,5,25,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -70,13 +70,13 @@
BLOCK "000904b0"
BEGIN
VALUE "CompanyName", "Tanuki Software, Ltd."
- VALUE "FileDescription", "Java Service Wrapper Community Edition 3.5.22"
- VALUE "FileVersion", "3, 5, 22, 0"
- VALUE "LegalCopyright", "Copyright (C) 1999, 2013 Tanuki Software, Ltd. All rights reserved."
+ VALUE "FileDescription", "Java Service Wrapper Community Edition 3.5.25"
+ VALUE "FileVersion", "3, 5, 25, 0"
+ VALUE "LegalCopyright", "Copyright (C) 1999, 2014 Tanuki Software, Ltd. All rights reserved."
VALUE "InternalName", "wrapper"
VALUE "OriginalFilename", "wrapper.exe"
VALUE "ProductName", "Java Service Wrapper Community"
- VALUE "ProductVersion", "3, 5, 22, 0"
+ VALUE "ProductVersion", "3, 5, 25, 0"
END
END
BLOCK "VarFileInfo"
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_unix.c service-wrapper-java-3.5.25/src/c/wrapper_unix.c
--- service-wrapper-java-3.5.22/src/c/wrapper_unix.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_unix.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -63,11 +63,11 @@
#include
#if defined(IRIX)
-#define PATH_MAX FILENAME_MAX
+ #define PATH_MAX FILENAME_MAX
#endif
#ifndef USE_USLEEP
-#include
+ #include
#endif
#ifndef getsid
@@ -156,13 +156,6 @@
}
/**
- * Gets the error code for the last operation that failed.
- */
-int wrapperGetLastError() {
- return errno;
-}
-
-/**
* Writes a PID to disk.
*
* filename: File to write to.
@@ -476,13 +469,17 @@
#ifndef UNICODE
uName = pw->pw_name;
#else
- req = mbstowcs(NULL, pw->pw_name, 0) + 1;
- uName = malloc(req * sizeof(TCHAR));
+ req = mbstowcs(NULL, pw->pw_name, MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ return;
+ }
+ uName = malloc(sizeof(TCHAR) * (req + 1));
if (!uName) {
outOfMemory(TEXT("DSCS"), 1);
return;
}
mbstowcs(uName, pw->pw_name, req + 1);
+ uName[req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
#endif
}
@@ -1066,6 +1063,17 @@
int length, i;
/* If this is not the first time through, then dispose the old command array */
+ if (wrapperData->jvmVersionCommand) {
+ i = 0;
+ while(wrapperData->jvmVersionCommand[i] != NULL) {
+ free(wrapperData->jvmVersionCommand[i]);
+ wrapperData->jvmVersionCommand[i] = NULL;
+ i++;
+ }
+
+ free(wrapperData->jvmVersionCommand);
+ wrapperData->jvmVersionCommand = NULL;
+ }
if (wrapperData->jvmCommand) {
i = 0;
while(wrapperData->jvmCommand[i] != NULL) {
@@ -1094,28 +1102,37 @@
return TRUE;
}
- if (wrapperData->commandLogLevel != LEVEL_NONE) {
- for (i = 0; i < length; i++) {
- log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel,
- TEXT("Command[%d] : %s"), i, strings[i]);
- }
-
- if (wrapperData->environmentClasspath) {
- log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel, TEXT(
- "Classpath in Environment : %s"), wrapperData->classpath);
- }
+ /* Allocate memory to hold array of version command strings. The array is itself NULL terminated */
+ wrapperData->jvmVersionCommand = malloc(sizeof(TCHAR *) * (2 + 1));
+ if (!wrapperData->jvmVersionCommand) {
+ outOfMemory(TEXT("WBJC"), 1);
+ return TRUE;
}
-
- if (wrapperData->environmentClasspath) {
- setEnv(TEXT("CLASSPATH"), wrapperData->classpath, ENV_SOURCE_WRAPPER);
+ memset(wrapperData->jvmVersionCommand, 0, sizeof(TCHAR *) * (2 + 1));
+ /* Java Command */
+ wrapperData->jvmVersionCommand[0] = malloc(sizeof(TCHAR) * (_tcslen(strings[0]) + 1));
+ if (!wrapperData->jvmVersionCommand[0]) {
+ outOfMemory(TEXT("WBJC"), 2);
+ return TRUE;
}
-
+ _tcsncpy(wrapperData->jvmVersionCommand[0], strings[0], _tcslen(strings[0]) + 1);
+ /* -version */
+ wrapperData->jvmVersionCommand[1] = malloc(sizeof(TCHAR) * (8 + 1));
+ if (!wrapperData->jvmVersionCommand[1]) {
+ outOfMemory(TEXT("WBJC"), 3);
+ return TRUE;
+ }
+ _tcsncpy(wrapperData->jvmVersionCommand[1], TEXT("-version"), 8 + 1);
+ /* NULL */
+ wrapperData->jvmVersionCommand[2] = NULL;
+
/* Allocate memory to hold array of command strings. The array is itself NULL terminated */
wrapperData->jvmCommand = malloc(sizeof(TCHAR *) * (length + 1));
if (!wrapperData->jvmCommand) {
outOfMemory(TEXT("WBJC"), 1);
return TRUE;
}
+ memset(wrapperData->jvmCommand, 0, sizeof(TCHAR *) * (length + 1));
/* number of arguments + 1 for a NULL pointer at the end */
for (i = 0; i <= length; i++) {
if (i < length) {
@@ -1140,6 +1157,7 @@
* Launches a JVM process and stores it internally.
*/
void wrapperExecute() {
+ int i;
pid_t proc;
/* Create the pipe. */
@@ -1148,6 +1166,38 @@
TEXT("Could not init pipe: %s"), getLastErrorText());
return;
}
+
+ /* Log the Java commands. */
+
+ /* If the JVM version printout is requested then log its command line first. */
+ if (wrapperData->printJVMVersion) {
+ if (wrapperData->isDebugging) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Java Command Line (Query Java Version):"));
+ for (i = 0; wrapperData->jvmVersionCommand[i] != NULL; i++) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG,
+ TEXT(" Command[%d] : %s"), i, wrapperData->jvmVersionCommand[i]);
+ }
+ }
+ }
+
+ /* Log ghe application java command line */
+ if (wrapperData->commandLogLevel != LEVEL_NONE) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel, TEXT("Java Command Line:"));
+ for (i = 0; wrapperData->jvmCommand[i] != NULL; i++) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel,
+ TEXT(" Command[%d] : %s"), i, wrapperData->jvmCommand[i]);
+ }
+
+ if (wrapperData->environmentClasspath) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel,
+ TEXT(" Classpath in Environment : %s"), wrapperData->classpath);
+ }
+ }
+
+ /* Update the CLASSPATH in the environment if requested so the JVM can access it. */
+ if (wrapperData->environmentClasspath) {
+ setEnv(TEXT("CLASSPATH"), wrapperData->classpath, ENV_SOURCE_WRAPPER);
+ }
/* Make sure the log file is closed before the Java process is created. Failure to do
* so will give the Java process a copy of the open file. This means that this process
@@ -1691,27 +1741,42 @@
#ifdef UNICODE
size_t req;
TCHAR **argv;
+
+#ifdef FREEBSD
+ /* In the case of FreeBSD, we need to dynamically load and initialize the iconv library to work with all versions of FreeBSD. */
+ if (loadIconvLibrary()) {
+ /* Already reported. */
+ /* Don't call appExit here as we are not far enough along. */
+ return 1;
+ }
+#endif
/* Create UNICODE versions of the argv array for internal use. */
- argv = malloc(argc * sizeof *argv );
+ argv = malloc(argc * sizeof * argv);
if(!argv) {
_tprintf(TEXT("Out of Memory in Main\n"));
appExit(1, 0, NULL);
return 1;
}
for (i = 0; i < argc; i++) {
- req = mbstowcs(NULL, cargv[i], 0);
- argv[i] = malloc((int)(req + 1) * sizeof(TCHAR));
+ req = mbstowcs(NULL, cargv[i], MBSTOWCS_QUERY_LENGTH);
+ if (req == (size_t)-1) {
+ _tprintf(TEXT("Encoding problem with arguments in Main\n"));
+ appExit(1, 0, NULL);
+ return 1;
+ }
+ argv[i] = malloc(sizeof(TCHAR) * (req + 1));
if (!argv[i]) {
_tprintf(TEXT("Out of Memory in Main\n"));
- while(--i > 0) {
+ while (--i > 0) {
free(argv[i]);
}
free(argv);
appExit(1, 0, argv);
return 1;
}
- mbstowcs(argv[i], cargv[i], (req + 1) * sizeof(TCHAR));
+ mbstowcs(argv[i], cargv[i], req + 1);
+ argv[i][req] = TEXT('\0'); /* Avoid bufferflows caused by badly encoded characters. */
}
#endif
diff -Nru service-wrapper-java-3.5.22/src/c/wrapper_win.c service-wrapper-java-3.5.25/src/c/wrapper_win.c
--- service-wrapper-java-3.5.22/src/c/wrapper_win.c 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/c/wrapper_win.c 2014-06-30 18:06:59.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -307,12 +307,12 @@
int initInvocationMutex() {
TCHAR *mutexName;
if (wrapperData->isSingleInvocation) {
- mutexName = malloc(sizeof(TCHAR) * (23 + _tcslen(wrapperData->serviceName) + 1));
+ mutexName = malloc(sizeof(TCHAR) * (30 + _tcslen(wrapperData->serviceName) + 1));
if (!mutexName) {
outOfMemory(TEXT("IIM"), 1);
return 1;
}
- _sntprintf(mutexName, 23 + _tcslen(wrapperData->serviceName) + 1, TEXT("Java Service Wrapper - %s"), wrapperData->serviceName);
+ _sntprintf(mutexName, 30 + _tcslen(wrapperData->serviceName) + 1, TEXT("Global\\Java Service Wrapper - %s"), wrapperData->serviceName);
if (!(invocationMutexHandle = CreateMutex(NULL, FALSE, mutexName))) {
free(mutexName);
@@ -397,13 +397,6 @@
exit(exitCode);
}
-/**
- * Gets the error code for the last operation that failed.
- */
-int wrapperGetLastError() {
- return WSAGetLastError();
-}
-
/**
* Writes the specified Id or PID to disk.
@@ -609,6 +602,21 @@
log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("%d : %s"), i, strings[i]);
}
#endif
+
+ /* Build a single string from the array that will be used to request the Java version.
+ * The first element of the command array will always be the java binary. */
+ /* Calculate the length */
+ commandLen = _tcslen(strings[0]);
+ commandLen += 1; /* Space */
+ commandLen += _tcslen(TEXT("-version"));
+ commandLen++; /* '\0' */
+ /* Build the actual command */
+ wrapperData->jvmVersionCommand = malloc(sizeof(TCHAR) * commandLen);
+ if (!wrapperData->jvmVersionCommand) {
+ outOfMemory(TEXT("WBJC"), 1);
+ return TRUE;
+ }
+ _sntprintf(wrapperData->jvmVersionCommand, commandLen, TEXT("%s -version"), strings[0]);
/* Build a single string from the array */
/* Calculate the length */
@@ -622,9 +630,9 @@
commandLen++; /* '\0' */
commandLen2 = commandLen;
/* Build the actual command */
- wrapperData->jvmCommand = malloc(sizeof(TCHAR) * commandLen);
+ wrapperData->jvmCommand = malloc(sizeof(TCHAR) * commandLen2);
if (!wrapperData->jvmCommand) {
- outOfMemory(TEXT("WBJC"), 1);
+ outOfMemory(TEXT("WBJC"), 2);
return TRUE;
}
commandLen = 0;
@@ -1634,18 +1642,29 @@
/* Add the priority class of the new process to the processflags */
processflags = processflags | wrapperData->ntServicePriorityClass;
- /* Setup the command line */
+ /* Log the Java commands. */
+
+ /* If the JVM version printout is requested then log its command line first. */
+ if (wrapperData->printJVMVersion) {
+ if (wrapperData->isDebugging) {
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT("Java Command Line (Query Java Version):"));
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_DEBUG, TEXT(" Command: %s"), wrapperData->jvmVersionCommand);
+ }
+ }
+
+ /* Log ghe application java command line */
commandline = wrapperData->jvmCommand;
if (wrapperData->commandLogLevel != LEVEL_NONE) {
- log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel,
- TEXT("Command: %s"), commandline);
+ log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel, TEXT("Java Command Line:"));
+ log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel, TEXT(" Command: %s"), commandline);
if (wrapperData->environmentClasspath) {
log_printf(WRAPPER_SOURCE_WRAPPER, wrapperData->commandLogLevel,
- TEXT("Classpath in Environment : %s"), wrapperData->classpath);
+ TEXT(" Classpath in Environment : %s"), wrapperData->classpath);
}
}
+ /* Update the CLASSPATH in the environment if requested so the JVM can access it. */
if (wrapperData->environmentClasspath) {
setEnv(TEXT("CLASSPATH"), wrapperData->classpath, ENV_SOURCE_WRAPPER);
}
@@ -1768,10 +1787,8 @@
/* If set, this will launch a second JVM before the actual one to quickly print out the JVM version information.
* This will appear to come from the same JVM instance in the logs. */
if (wrapperData->printJVMVersion) {
- TCHAR versionCmd[MAX_PATH + 9];
- _sntprintf(versionCmd, MAX_PATH + 9, TEXT("%s -version"), getStringProperty(properties, TEXT("wrapper.java.command"), TEXT("java")));
if (CreateProcess(NULL,
- versionCmd, /* the command line to start */
+ wrapperData->jvmVersionCommand, /* the command line to start */
NULL, /* process security attributes */
NULL, /* primary thread security attributes */
TRUE, /* handles are inherited */
@@ -5609,7 +5626,7 @@
for (i = 0; i < 2; i++) {
for (n = 0; n < dwData; n++) {
if (serialNr) {
- _sntprintf(serialNr + (n * 3) , serialNrLength, TEXT("%02x "), pCertContext->pCertInfo->SerialNumber.pbData[dwData - (n + 1)]);
+ _sntprintf(serialNr + (n * 3) , serialNrLength - (n * 3), TEXT("%02x "), pCertContext->pCertInfo->SerialNumber.pbData[dwData - (n + 1)]);
} else {
serialNrLength += 3;
}
@@ -6832,20 +6849,19 @@
returnValue = WaitForSingleObject(shex.hProcess, 1000);
if (returnValue == WAIT_OBJECT_0) {
if (!GetExitCodeProcess(shex.hProcess, &ret)) {
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("WaitThread for Backend-Process: %s failed!\n"), TEXT("GetExitCodeProcess"));
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("WaitThread for Backend-Process: %s failed! (%d): %s"), TEXT("GetExitCodeProcess"), GetLastError(), getLastErrorText());
ret = TRUE;
}
} else {
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("The elevated process is still alive. Trying to kill it."), GetLastError(), getLastErrorText());
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("The elevated Wrapper process is still alive. Trying to kill it. (%d): %s"), GetLastError(), getLastErrorText());
if (TerminateProcess(shex.hProcess, 1) == 0) {
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("Couldn't kill it."), GetLastError(), getLastErrorText());
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("Failed to kill the elevated Wrapper process. (%d): %s"), GetLastError(), getLastErrorText());
}
ret = TRUE;
}
}
-
} else {
- log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("Elevation failed. Wrapper will exit."), GetLastError(), getLastErrorText());
+ log_printf(WRAPPER_SOURCE_WRAPPER, LEVEL_FATAL, TEXT("Failed to obtain elevated status. (%d): %s"), GetLastError(), getLastErrorText());
ret = TRUE;
}
CloseHandle(hNamedPipeErr);
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/AboutDialog.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/AboutDialog.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/AboutDialog.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/AboutDialog.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.demo;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/CustomizeDialog.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/CustomizeDialog.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/CustomizeDialog.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/CustomizeDialog.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.demo;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/DeadLock.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/DeadLock.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/DeadLock.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/DeadLock.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.demo;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/DemoApp.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/DemoApp.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/DemoApp.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/DemoApp.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.demo;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/DemoAppMainFrame.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/DemoAppMainFrame.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/DemoAppMainFrame.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/DemoAppMainFrame.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.demo;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/ExtensionFilter.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/ExtensionFilter.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/ExtensionFilter.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/ExtensionFilter.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.demo;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/MailDialog.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/MailDialog.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/demo/MailDialog.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/demo/MailDialog.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.demo;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperControlEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperControlEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperControlEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperControlEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperCoreEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperCoreEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperCoreEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperCoreEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperEventListener.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperEventListener.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperEventListener.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperEventListener.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperLogFileChangedEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperLogFileChangedEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperLogFileChangedEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperLogFileChangedEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperLoggingEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperLoggingEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperLoggingEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperLoggingEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperPingEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperPingEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperPingEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperPingEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceActionEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceActionEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceActionEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceActionEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceControlEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceControlEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceControlEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceControlEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServicePauseEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServicePauseEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServicePauseEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServicePauseEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceResumeEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceResumeEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperServiceResumeEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperServiceResumeEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperTickEvent.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperTickEvent.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/event/WrapperTickEvent.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/event/WrapperTickEvent.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.event;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManager.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManager.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManager.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManager.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.jmx;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerMBean.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerMBean.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerMBean.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerMBean.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.jmx;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTesting.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTesting.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTesting.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTesting.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.jmx;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTestingMBean.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTestingMBean.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTestingMBean.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/jmx/WrapperManagerTestingMBean.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.jmx;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperEventPermission.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperEventPermission.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperEventPermission.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperEventPermission.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.security;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperPermission.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperPermission.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperPermission.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperPermission.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.security;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperServicePermission.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperServicePermission.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperServicePermission.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperServicePermission.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.security;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperUserEventPermission.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperUserEventPermission.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/security/WrapperUserEventPermission.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/security/WrapperUserEventPermission.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.security;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/AbstractActionApp.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/AbstractActionApp.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/AbstractActionApp.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/AbstractActionApp.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -30,6 +30,7 @@
*/
import java.io.BufferedReader;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Enumeration;
@@ -50,6 +51,8 @@
public abstract class AbstractActionApp
implements WrapperEventListener
{
+ private static String c_encoding;
+
private DeadlockPrintStream m_out;
private DeadlockPrintStream m_err;
@@ -70,6 +73,25 @@
private boolean m_childDetached = true;
/*---------------------------------------------------------------
+ * Static Methods
+ *-------------------------------------------------------------*/
+ static
+ {
+ // In order to read the output from some processes correctly we need to get the correct encoding.
+ // On some systems, the underlying system encoding is different than the file encoding.
+ c_encoding = System.getProperty( "sun.jnu.encoding" );
+ if ( c_encoding == null )
+ {
+ c_encoding = System.getProperty( "file.encoding" );
+ if ( c_encoding == null )
+ {
+ // Default to Latin1
+ c_encoding = "Cp1252";
+ }
+ }
+ }
+
+ /*---------------------------------------------------------------
* Constructors
*-------------------------------------------------------------*/
protected AbstractActionApp() {
@@ -515,78 +537,8 @@
}
else if ( action.equals( "child_exec" ) )
{
- Thread childRunner = new Thread()
- {
- public void run()
- {
- try
- {
- WrapperProcessConfig wpConfig = new WrapperProcessConfig();
- wpConfig.setDetached( m_childDetached );
- final WrapperProcess wProcess = WrapperManager.exec( m_childCommand, wpConfig );
- System.out.println( Main.getRes().getString( "Launched child process with PID={0} : {1}", new Integer( wProcess.getPID() ), m_childCommand ) );
-
- Thread outRunner = new Thread()
- {
- public void run()
- {
- try
- {
- BufferedReader br = new BufferedReader( new InputStreamReader( wProcess.getInputStream() ) );
- String line;
- while( ( line = br.readLine( ) ) != null )
- {
- System.out.println( wProcess.getPID() + " out: " + line );
- }
- br.close();
- System.out.println( wProcess.getPID() + Main.getRes().getString( " out EOF" ) );
- }
- catch ( IOException e )
- {
- System.out.println( wProcess.getPID() + Main.getRes().getString( " read stdout failed:" ) );
- e.printStackTrace();
- }
- }
- };
- Thread errRunner = new Thread()
- {
- public void run()
- {
- try
- {
- BufferedReader br = new BufferedReader( new InputStreamReader( wProcess.getErrorStream() ) );
- String line;
- while( ( line = br.readLine( ) ) != null )
- {
- System.out.println( wProcess.getPID() + " err: " + line );
- }
- br.close();
- System.out.println( wProcess.getPID() + Main.getRes().getString( " err EOF" ) );
- }
- catch ( IOException e )
- {
- System.out.println( wProcess.getPID() + Main.getRes().getString( " read stderr failed:" ) );
- e.printStackTrace();
- }
- }
- };
-
- outRunner.start();
- errRunner.start();
-
- // Wait for the stdout and stderr reader threads to complete before we say the process completed to avoid confusion.
- outRunner.join();
- errRunner.join();
-
- System.out.println( Main.getRes().getString( "Child with PID={0} terminated with exitCode={1} : {2} ", new Integer( wProcess.getPID() ), new Integer( wProcess.waitFor() ), m_childCommand ) );
- }
- catch ( Throwable t )
- {
- t.printStackTrace();
- }
- }
- };
- childRunner.start();
+ // This command is really meant only to be used by the GUI but can also be called from the console if known.
+ doExec( m_childCommand, m_childDetached );
}
else if ( action.equals( "gc" ) )
{
@@ -602,6 +554,16 @@
{
System.out.println( Main.getRes().getString( "Standard Edition: " ) + WrapperManager.isStandardEdition() );
}
+ else if ( action.startsWith( "exec " ) && ( action.length() > 5 ) )
+ {
+ String command = action.substring( 5 );
+ doExec( command, false );
+ }
+ else if ( action.startsWith( "exec_detached " ) && ( action.length() > 14 ) )
+ {
+ String command = action.substring( 14 );
+ doExec( command, true );
+ }
else
{
// Unknown action
@@ -612,6 +574,125 @@
return true;
}
+
+ private static Thread handleInputStream( final InputStream is, final String encoding, String pid, String pipeName )
+ {
+ final String label = Main.getRes().getString( " Process #{0} {1}", pid, pipeName );
+
+ Thread runner = new Thread( "exec_runner_" + pipeName + "_" + pid )
+ {
+ public void run()
+ {
+ BufferedReader br;
+ String line;
+
+ try
+ {
+ br = new BufferedReader( new InputStreamReader( is, encoding ) );
+ try
+ {
+ while ( ( line = br.readLine() ) != null )
+ {
+ System.out.println( label + ": " + line );
+ }
+ }
+ finally
+ {
+ br.close();
+ }
+ }
+ catch ( IOException e )
+ {
+ e.printStackTrace();
+ }
+ }
+ };
+ runner.start();
+
+ return runner;
+ }
+
+ private void doExec( String command, boolean detached )
+ {
+ try
+ {
+ WrapperProcessConfig processConfig = new WrapperProcessConfig();
+ processConfig.setDetached( detached );
+
+ String type;
+ if ( command.startsWith( "FORK_EXEC " ) )
+ {
+ processConfig.setStartType( WrapperProcessConfig.FORK_EXEC );
+ type = "FORK_EXEC";
+ command.substring( 10 );
+ }
+ else if ( command.startsWith( "POSIX_SPAWN " ) )
+ {
+ processConfig.setStartType( WrapperProcessConfig.POSIX_SPAWN );
+ type = "POSIX_SPAWN";
+ command.substring( 12 );
+ }
+ else if ( command.startsWith( "VFORK_EXEC " ) )
+ {
+ processConfig.setStartType( WrapperProcessConfig.VFORK_EXEC );
+ type = "VFORK_EXEC";
+ command.substring( 11 );
+ }
+ else if ( command.startsWith( "DYNAMIC " ) )
+ {
+ processConfig.setStartType( WrapperProcessConfig.DYNAMIC );
+ type = "DYNAMIC";
+ command.substring( 8 );
+ }
+ else
+ {
+ type = "DYNAMIC";
+ }
+
+ if ( detached )
+ {
+ System.out.println( Main.getRes().getString( "Execute Detached Child Process with type {0}: {1}", type, command ) );
+ }
+ else
+ {
+ System.out.println( Main.getRes().getString( "Execute Managed Child Process: with type {0}: {1}", type, command ) );
+ }
+
+ final WrapperProcess process = WrapperManager.exec( command, processConfig );
+ final String pid = Integer.toString( process.getPID() );
+ System.out.println( Main.getRes().getString( " Process #{0} launched.", pid ) );
+
+ final Thread outRunner = handleInputStream( process.getInputStream(), c_encoding, pid, "stdout" );
+ final Thread errRunner = handleInputStream( process.getErrorStream(), c_encoding, pid, "stderr" );
+
+ Thread runner = new Thread( "exec_runner_process_" + pid )
+ {
+ public void run()
+ {
+ try
+ {
+ // Wait for the stdout and stderr reader threads to complete before we say the process completed to avoid confusion.
+ outRunner.join();
+ errRunner.join();
+
+ System.out.println( Main.getRes().getString( " Process #{0} terminated with exitCode={1}", pid, Integer.toString( process.waitFor() ) ) );
+ }
+ catch ( Throwable t )
+ {
+ System.out.println( Main.getRes().getString( " Process #{0} unexpected error: {1} ", pid, t.getMessage() ) );
+ t.printStackTrace();
+ }
+ }
+ };
+ runner.start();
+ }
+ catch ( Throwable t )
+ {
+ System.out.println( Main.getRes().getString( "Failed to launch child process: {0}", t.getMessage() ) );
+ t.printStackTrace();
+ }
+ }
+
/*---------------------------------------------------------------
* Static Methods
*-------------------------------------------------------------*/
@@ -648,6 +729,13 @@
System.err.println( Main.getRes().getString( " properties : Dump all System Properties to the console." ) );
System.err.println( Main.getRes().getString( " configuration : Dump all Wrapper Configuration Properties to the console." ) );
System.err.println( Main.getRes().getString( " gc : Perform a GC sweep." ) );
+ System.err.println( Main.getRes().getString( " is_professional : Displays whether or not this is a Professional Edition Wrapper." ) );
+ System.err.println( Main.getRes().getString( " is_standard : Displays whether or not this is at least a Standard Edition Wrapper." ) );
+ if ( WrapperManager.isProfessionalEdition() )
+ {
+ System.err.println( Main.getRes().getString( " exec : Executes a managed child process." ) );
+ System.err.println( Main.getRes().getString( " exec_detached : Executes a detached child process." ) );
+ }
System.err.println( "" );
}
}
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/BackgroundThreads.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/BackgroundThreads.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/BackgroundThreads.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/BackgroundThreads.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ChildWrapper.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ChildWrapper.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ChildWrapper.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ChildWrapper.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DaemonThreads.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DaemonThreads.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DaemonThreads.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DaemonThreads.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockBase.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockBase.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockBase.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockBase.java 2014-06-30 18:06:59.000000000 +0000
@@ -3,7 +3,7 @@
import java.lang.reflect.InvocationTargetException;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockMixed.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockMixed.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockMixed.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockMixed.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockObject.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockObject.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockObject.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockObject.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadlockPrintStream.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadlockPrintStream.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadlockPrintStream.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadlockPrintStream.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockReentrantLock.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockReentrantLock.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DeadLockReentrantLock.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DeadLockReentrantLock.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DelayedIORestarter.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DelayedIORestarter.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/DelayedIORestarter.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/DelayedIORestarter.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/EnvironmentVariables.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/EnvironmentVariables.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/EnvironmentVariables.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/EnvironmentVariables.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ExecThrasher.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ExecThrasher.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ExecThrasher.java 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ExecThrasher.java 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,232 @@
+package org.tanukisoftware.wrapper.test;
+
+/*
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+import org.tanukisoftware.wrapper.WrapperJNIError;
+import org.tanukisoftware.wrapper.WrapperLicenseError;
+import org.tanukisoftware.wrapper.WrapperManager;
+import org.tanukisoftware.wrapper.WrapperProcess;
+import org.tanukisoftware.wrapper.WrapperProcessConfig;
+import org.tanukisoftware.wrapper.WrapperSystemPropertyUtil;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.Random;
+
+/**
+ *
+ *
+ * @author Leif Mortenson
+ */
+public class ExecThrasher
+{
+ private static String c_simplewaiter;
+ private static String c_encoding;
+ private static String c_startTypeS;
+ private static int c_startType;
+ private static int c_threadCount;
+
+ /*---------------------------------------------------------------
+ * Static Methods
+ *-------------------------------------------------------------*/
+ static
+ {
+ if ( WrapperManager.isWindows() )
+ {
+ c_simplewaiter = "../test/simplewaiter.exe";
+ }
+ else
+ {
+ c_simplewaiter = "../test/simplewaiter";
+ }
+
+ // In order to read the output from some processes correctly we need to get the correct encoding.
+ // On some systems, the underlying system encoding is different than the file encoding.
+ c_encoding = System.getProperty( "sun.jnu.encoding" );
+ if ( c_encoding == null )
+ {
+ c_encoding = System.getProperty( "file.encoding" );
+ if ( c_encoding == null )
+ {
+ // Default to Latin1
+ c_encoding = "Cp1252";
+ }
+ }
+
+ // Resolve the start type.
+ c_startTypeS = WrapperSystemPropertyUtil.getStringProperty( ExecThrasher.class.getName() + ".startType", "" );
+ if ( c_startTypeS.equals( "POSIX_SPAWN" ) )
+ {
+ c_startType = WrapperProcessConfig.POSIX_SPAWN;
+ }
+ else if ( c_startTypeS.equals( "FORK_EXEC" ) )
+ {
+ c_startType = WrapperProcessConfig.FORK_EXEC;
+ }
+ else if ( c_startTypeS.equals( "VFORK_EXEC" ) )
+ {
+ c_startType = WrapperProcessConfig.VFORK_EXEC;
+ }
+ else
+ {
+ c_startType = WrapperProcessConfig.DYNAMIC;
+ c_startTypeS = "DYNAMIC";
+ }
+
+ // Resolve the thread count.
+ c_threadCount = WrapperSystemPropertyUtil.getIntProperty( ExecThrasher.class.getName() + ".threadCount", 100 );
+ }
+
+ private static void handleInputStream( final InputStream is, final String encoding, final String label )
+ {
+ Thread runner = new Thread()
+ {
+ public void run()
+ {
+ BufferedReader br;
+ String line;
+
+ try
+ {
+ br = new BufferedReader( new InputStreamReader( is, encoding ) );
+ try
+ {
+ while ( ( line = br.readLine() ) != null )
+ {
+ System.out.println( label + ": " + line );
+ }
+ }
+ finally
+ {
+ br.close();
+ }
+ }
+ catch ( IOException e )
+ {
+ e.printStackTrace();
+ }
+ System.out.println( label + " EOF" );
+ }
+ };
+ runner.start();
+ }
+
+ private static void handleWrapperProcessInner( WrapperProcess process, long timeoutMS, int threadId, int processId )
+ throws IOException
+ {
+ try
+ {
+ handleInputStream( process.getInputStream(), c_encoding, "Thrasher Thread #" + threadId + " Process #" + processId + " stdout" );
+ handleInputStream( process.getErrorStream(), c_encoding, "Thrasher Thread #" + threadId + " Process #" + processId + " stderr" );
+
+ if ( timeoutMS > 0 )
+ {
+ long start = System.currentTimeMillis();
+ while ( process.isAlive() && ( System.currentTimeMillis() - start < timeoutMS ) )
+ {
+ try
+ {
+ Thread.sleep( 100 );
+ }
+ catch ( InterruptedException e )
+ {
+ }
+ }
+ if ( process.isAlive() )
+ {
+ System.out.println( "Thrasher Thread #" + threadId + " Process #" + processId + " Timed out waiting for child. Destroying." );
+ process.destroy();
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ int exitCode = process.waitFor();
+ System.out.println( "Thrasher Thread #" + threadId + " Process #" + processId + " exitCode: " + exitCode );
+ }
+ catch ( InterruptedException e )
+ {
+ System.out.println( "Thrasher Thread #" + threadId + " Process #" + processId + " Timed out waiting for process to complete." );
+ }
+ }
+ }
+
+ private static void handleWrapperProcess( String command, long timeoutMS, int threadId, int processId )
+ throws IOException
+ {
+ WrapperProcessConfig processConfig = new WrapperProcessConfig();
+ processConfig.setStartType( c_startType );
+
+ WrapperProcess process = WrapperManager.exec( command, processConfig );
+
+ handleWrapperProcessInner( process, timeoutMS, threadId, processId );
+ }
+
+ private static void thrasher( int threadId )
+ {
+ // We want to work in a repeatable way.
+ Random rand = new Random( threadId );
+
+ System.out.println( "Thrasher Thread #" + threadId + " Begin" );
+ try
+ {
+ for ( int processId = 0; processId < 1000; processId++ )
+ {
+ int seconds = rand.nextInt( 10 );
+ String command = c_simplewaiter + " 0 " + seconds;
+ System.out.println( "Thrasher Thread #" + threadId + " Process #" + processId + " Launch (" + seconds + " seconds)" );
+ try
+ {
+ handleWrapperProcess( command, ( seconds + 5 ) * 1000, threadId, processId );
+ }
+ catch ( IOException e )
+ {
+ System.out.println( "Thrasher Thread #" + threadId + " Process #" + processId + " Launch Failed." );
+ e.printStackTrace();
+ }
+ }
+ }
+ finally
+ {
+ System.out.println( "Thrasher Thread #" + threadId + " End" );
+ }
+ }
+
+ /*---------------------------------------------------------------
+ * Main Method
+ *-------------------------------------------------------------*/
+ public static void main( String[] args )
+ {
+ System.out.println( "Communicate with child processes using encoding: " + c_encoding );
+
+ System.out.println( "Using start type '" + c_startTypeS + "'." );
+
+ System.out.println( "Launching " + c_threadCount + " threads..." );
+ for ( int i = 0; i < c_threadCount; i++ )
+ {
+ final int threadId = i;
+ Thread thread = new Thread( "ExecThrasher-" + i )
+ {
+ public void run()
+ {
+ thrasher( threadId );
+ }
+ };
+ thread.start();
+ }
+ }
+}
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Filter.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Filter.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Filter.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Filter.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/GrowingLogOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/GrowingLogOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/GrowingLogOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/GrowingLogOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/HugeLogOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/HugeLogOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/HugeLogOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/HugeLogOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/JarMain.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/JarMain.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/JarMain.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/JarMain.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedGCOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedGCOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedGCOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedGCOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedLogOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedLogOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedLogOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedLogOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedSplitOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedSplitOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedSplitOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedSplitOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedWrapperListener.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedWrapperListener.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LoadedWrapperListener.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LoadedWrapperListener.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LogOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LogOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LogOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LogOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LogStdoutStderr.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LogStdoutStderr.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LogStdoutStderr.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LogStdoutStderr.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LongRunningBackgroundThreads.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LongRunningBackgroundThreads.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/LongRunningBackgroundThreads.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/LongRunningBackgroundThreads.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Main.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Main.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Main.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Main.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Memory.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Memory.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Memory.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Memory.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/NestedWrapperListener.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/NestedWrapperListener.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/NestedWrapperListener.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/NestedWrapperListener.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/NoReturn.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/NoReturn.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/NoReturn.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/NoReturn.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/OnExit.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/OnExit.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/OnExit.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/OnExit.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/OutputLoader.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/OutputLoader.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/OutputLoader.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/OutputLoader.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/PercentOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/PercentOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/PercentOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/PercentOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Performance.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Performance.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Performance.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Performance.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/PostShutdownGC.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/PostShutdownGC.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/PostShutdownGC.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/PostShutdownGC.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/QuickComplete.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/QuickComplete.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/QuickComplete.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/QuickComplete.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Restarter.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Restarter.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/Restarter.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/Restarter.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/RuntimeExec.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/RuntimeExec.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/RuntimeExec.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/RuntimeExec.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -174,19 +174,7 @@
simplewaiter = "../test/simplewaiter";
}
- // In order to read the output from some processes correctly we need to get the correct encoding.
- // On some systems, the underlying system encoding is different than the file encoding.
- String encoding = System.getProperty( "sun.jnu.encoding" );
- if ( encoding == null )
- {
- encoding = System.getProperty( "file.encoding" );
- if ( encoding == null )
- {
- // Default to Latin1
- encoding = "Cp1252";
- }
- }
- System.out.println( "Communicate with child processes using encoding: " + encoding );
+ System.out.println( "Communicate with child processes using encoding: " + c_encoding );
Random rand = new Random();
System.out.println( Main.getRes().getString( "Is DYNAMIC supported? A:" ) + WrapperProcessConfig.isSupported( WrapperProcessConfig.DYNAMIC ) );
@@ -295,7 +283,7 @@
p = WrapperManager.exec( simplewaiter + " 0 15" );
}
// System.out.println(i + " " + p.toString() + " exit " + p.waitFor());
- BufferedReader br = new BufferedReader( new InputStreamReader( p.getInputStream(), encoding ) );
+ BufferedReader br = new BufferedReader( new InputStreamReader( p.getInputStream(), c_encoding ) );
try
{
String line = "";
@@ -330,7 +318,7 @@
proc.getOutputStream().close();
System.out.println( i + Main.getRes().getString( " small child process {0} is alive {1}" , new Object[]{ Integer.toString( proc.getPID() ), Boolean.toString( proc.isAlive() ) } ) );
- BufferedReader br = new BufferedReader( new InputStreamReader( proc.getInputStream(), encoding ) );
+ BufferedReader br = new BufferedReader( new InputStreamReader( proc.getInputStream(), c_encoding ) );
try
{
String line = "";
@@ -344,7 +332,7 @@
br.close();
}
- br = new BufferedReader( new InputStreamReader( proc.getErrorStream(), encoding ) );
+ br = new BufferedReader( new InputStreamReader( proc.getErrorStream(), c_encoding ) );
try
{
String line = "";
@@ -396,7 +384,7 @@
System.out.println( i + Main.getRes().getString( " child process (PID= {0}) finished with code " , Integer.toString( proc.getPID() ) ) + proc.waitFor() );
System.out.println( i + Main.getRes().getString( " now read the output" ) );
- BufferedReader br = new BufferedReader( new InputStreamReader( proc.getInputStream(), encoding ) );
+ BufferedReader br = new BufferedReader( new InputStreamReader( proc.getInputStream(), c_encoding ) );
try
{
String line = "";
@@ -430,7 +418,7 @@
proc.getOutputStream().close();
System.out.println( i + Main.getRes().getString( " small child process {0} is alive {1}" , new Object[]{ Integer.toString( proc.getPID() ), Boolean.toString( proc.isAlive() ) } ) );
// System.out.println(i + " Main.getRes (PID= " + proc.getPID() + " ) finished with code " + proc.waitFor() );
- BufferedReader br = new BufferedReader( new InputStreamReader( proc.getInputStream(), encoding ) );
+ BufferedReader br = new BufferedReader( new InputStreamReader( proc.getInputStream(), c_encoding ) );
try
{
String line = "";
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ShutdownHook.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ShutdownHook.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ShutdownHook.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ShutdownHook.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ShutdownLock.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ShutdownLock.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/ShutdownLock.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/ShutdownLock.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/SimpleWrapperListener.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/SimpleWrapperListener.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/SimpleWrapperListener.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/SimpleWrapperListener.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/SlowStop.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/SlowStop.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/SlowStop.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/SlowStop.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/StopWhileStarting.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/StopWhileStarting.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/StopWhileStarting.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/StopWhileStarting.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/SystemProperty.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/SystemProperty.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/SystemProperty.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/SystemProperty.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/TestUtils.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/TestUtils.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/TestUtils.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/TestUtils.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/TimedLogOutput.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/TimedLogOutput.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/TimedLogOutput.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/TimedLogOutput.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/WrapperPrintArgs.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/WrapperPrintArgs.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test/WrapperPrintArgs.java 1970-01-01 00:00:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test/WrapperPrintArgs.java 2014-06-30 18:06:59.000000000 +0000
@@ -0,0 +1,25 @@
+package org.tanukisoftware.wrapper.test;
+
+/*
+ * Copyright (c) 1999, 2012 Tanuki Software, Ltd.
+ * http://www.tanukisoftware.com
+ * All rights reserved.
+ *
+ * This software is the proprietary information of Tanuki Software.
+ * You shall use it only in accordance with the terms of the
+ * license agreement you entered into with Tanuki Software.
+ * http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html
+ */
+
+public class WrapperPrintArgs
+{
+ public static void main( String[] args )
+ {
+ System.out.println( "Dump all Application Arguments:" );
+ System.out.println( " argv=" + args.length );
+ for ( int i = 0; i < args.length; i++ )
+ {
+ System.out.println( " args[" + i + "]=" + args[i] );
+ }
+ }
+}
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test2/Jar2Main.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test2/Jar2Main.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/test2/Jar2Main.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/test2/Jar2Main.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper.test2;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperActionServer.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperActionServer.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperActionServer.java 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperActionServer.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperGroup.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperGroup.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperGroup.java 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperGroup.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperInfo.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperInfo.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperInfo.java 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperInfo.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -43,7 +43,7 @@
final class WrapperInfo
{
/** Version of the Wrapper. */
- private static final String m_version = "3.5.22";
+ private static final String m_version = "3.5.25";
/** Date that the Wrapper was built. */
private static final Calendar m_build = Calendar.getInstance();
@@ -56,8 +56,8 @@
Calendar buildTime = Calendar.getInstance();
try
{
- buildDate.setTime( new SimpleDateFormat( "yyyyMMdd" ).parse( "20131008" ) );
- buildTime.setTime( new SimpleDateFormat( "HHmm" ).parse( "1519" ) );
+ buildDate.setTime( new SimpleDateFormat( "yyyyMMdd" ).parse( "20140613" ) );
+ buildTime.setTime( new SimpleDateFormat( "HHmm" ).parse( "1332" ) );
m_build.set( buildDate.get( Calendar.YEAR ),
buildDate.get( Calendar.MONTH ),
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperInfo.java.in service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperInfo.java.in
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperInfo.java.in 2013-10-08 06:19:51.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperInfo.java.in 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperJarApp.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperJarApp.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperJarApp.java 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperJarApp.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperJNIError.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperJNIError.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperJNIError.java 2013-10-08 06:19:58.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperJNIError.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperLicenseError.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperLicenseError.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperLicenseError.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperLicenseError.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperListener.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperListener.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperListener.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperListener.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -143,7 +143,7 @@
* public void controlEvent( int event )
* {
* if ( ( event == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT )
- * && ( WrapperManager.isLaunchedAsService() || WrapperManager.isIgnoreConsoleLogouts() ) )
+ * && ( WrapperManager.isLaunchedAsService() || WrapperManager.isIgnoreUserLogoffs() ) )
* {
* // Ignore
* }
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperManager.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperManager.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperManager.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperManager.java 2014-06-30 18:06:59.000000000 +0000
@@ -315,6 +315,9 @@
/** Tracks the total number of outstanding shutdown locks. */
private static int m_shutdownLocks = 0;
+ /** Tracks the number of threads which are attempting to launch child processes. */
+ private static int m_runningExecs = 0;
+
private static String[] m_args;
private static int m_backendType = BACKEND_TYPE_UNKNOWN;
private static boolean m_backendConnected = false;
@@ -599,14 +602,16 @@
if ( m_debug )
{
- m_outDebug.println( getRes().getString( "WrapperManager class initialized by thread: {0} Using classloader: {1}", Thread.currentThread().getName(), WrapperManager.class.getClassLoader().toString() ) );
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "WrapperManager class initialized by thread: " + Thread.currentThread().getName() + " Using classloader: " + WrapperManager.class.getClassLoader().toString() );
}
// The copyright banner was moved into the wrapper binary. In order to
// aid in the debugging of user integrations, some kind of a known message
// needs to be displayed on startup so it is obvious whether or not the
// WrapperManager class is being initialized.
- m_outInfo.println( getRes().getString( "Initializing..." ) );
+ // This message is logged when localization is not yet initialized.
+ m_outInfo.println( "Initializing..." );
// We need to get the key before the version can be verified.
m_key = System.getProperty( "wrapper.key" );
@@ -621,6 +626,7 @@
m_jvmId = WrapperSystemPropertyUtil.getIntProperty( "wrapper.jvmid", 1 );
if ( m_debug )
{
+ // This message is logged when localization is not yet initialized.
m_outDebug.println( "JVM #" + m_jvmId );
}
@@ -634,11 +640,13 @@
{
if ( m_jvmBits > 0 )
{
- m_outDebug.println( getRes().getString( "Running a {0}-bit JVM.", new Integer( m_jvmBits ) ) );
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "Running a " + m_jvmBits + "-bit JVM." );
}
else
{
- m_outDebug.println( getRes().getString( "The bit depth of this JVM could not be determined." ) );
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "The bit depth of this JVM could not be determined." );
}
}
@@ -681,7 +689,8 @@
{
if ( m_debug )
{
- m_outDebug.println( getRes().getString( "Registering shutdown hook" ) );
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "Registering shutdown hook" );
}
m_hook = new Thread( "Wrapper-Shutdown-Hook" )
{
@@ -736,7 +745,8 @@
{
if ( m_debug )
{
- m_outDebug.println( getRes().getString( "Not using wrapper. (key not specified)" ) );
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "Not using wrapper. (key not specified)" );
}
// The wrapper will not be used, so other values will not be used.
@@ -776,7 +786,8 @@
String sPort;
if ( ( sPort = System.getProperty( "wrapper.port" ) ) == null )
{
- String msg = getRes().getString( "The 'wrapper.port' system property was not set." );
+ // This message is logged when localization is not yet initialized.
+ String msg = "The 'wrapper.port' system property was not set.";
m_outError.println( msg );
throw new ExceptionInInitializerError( msg );
}
@@ -786,7 +797,8 @@
}
catch ( NumberFormatException e )
{
- String msg = getRes().getString( "''{0}'' is not a valid value for ''wrapper.port''.", sPort );
+ // This message is logged when localization is not yet initialized.
+ String msg = "'" + sPort + "' is not a valid value for 'wrapper.port'.";
m_outError.println( msg );
throw new ExceptionInInitializerError( msg );
}
@@ -820,7 +832,8 @@
}
catch ( NumberFormatException e )
{
- String msg = getRes().getString( "''{0}'' is not a valid value for ''wrapper.cpu.timeout''.", sCPUTimeout );
+ // This message is logged when localization is not yet initialized.
+ String msg = "'" + sCPUTimeout + "' is not a valid value for 'wrapper.cpu.timeout'.";
m_outError.println( msg );
throw new ExceptionInInitializerError( msg );
}
@@ -862,35 +875,6 @@
m_outDebug.println( getRes().getString( "Call to nativeGetJavaPID() failed: {0}", e ) );
}
}
-
- // Cache the values of the professional and standard edition flags.
- try
- {
- m_professionalEdition = nativeIsProfessionalEdition();
- }
- catch ( Throwable e )
- {
- if ( m_debug )
- {
- m_outDebug.println( getRes().getString(
- "Call to nativeIsProfessionalEdition() failed: {0}" , e ) );
- }
- m_professionalEdition = false;
- }
- try
- {
- m_standardEdition = nativeIsStandardEdition();
- }
- catch ( Throwable e )
- {
- if ( m_debug )
- {
- m_outDebug.println( getRes().getString(
- "Call to nativeIsStandardEdition() failed: {0}" , e ) );
- }
- m_standardEdition = false;
- }
-
}
// Start a thread which looks for control events sent to the
@@ -1456,8 +1440,9 @@
if ( baseName == null )
{
// This should only happen if an old version of the Wrapper binary is being used.
- m_outInfo.println( getRes().getString( "WARNING - The wrapper.native_library system property was not" ) );
- m_outInfo.println( getRes().getString( " set. Using the default value, 'wrapper'." ) );
+ // This message is logged when localization is not yet initialized.
+ m_outInfo.println( "WARNING - The wrapper.native_library system property was not" );
+ m_outInfo.println( " set. Using the default value, 'wrapper'." );
baseName = "wrapper";
}
String[] detailedNames = new String[4];
@@ -1488,8 +1473,8 @@
// the brief name.
if ( m_debug )
{
- m_outDebug.println( getRes().getString(
- "Load native library. There are multiple possible file names and the first to be found will be used. Errors loading non-existing files is normal and is only a problem if they all fail." ) );
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "Load native library. There are multiple possible file names and the first to be found will be used. Errors loading non-existing files is normal and is only a problem if they all fail." );
}
m_libraryOK = false;
for ( int i = 0; i < detailedNames.length; i++ )
@@ -1512,7 +1497,36 @@
{
if ( m_debug )
{
- m_outDebug.println( getRes().getString( " Successfully loaded native library." ) );
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( " Successfully loaded native library." );
+ }
+
+ // Cache the values of the professional and standard edition flags.
+ try
+ {
+ m_professionalEdition = nativeIsProfessionalEdition();
+ }
+ catch ( Throwable e )
+ {
+ if ( m_debug )
+ {
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "Call to nativeIsProfessionalEdition() failed: " + e );
+ }
+ m_professionalEdition = false;
+ }
+ try
+ {
+ m_standardEdition = nativeIsStandardEdition();
+ }
+ catch ( Throwable e )
+ {
+ if ( m_debug )
+ {
+ // This message is logged when localization is not yet initialized.
+ m_outDebug.println( "Call to nativeIsStandardEdition() failed: " + e );
+ }
+ m_standardEdition = false;
}
// Try reloading the resources once the library is initialized so we get actual localized content.
@@ -1549,14 +1563,11 @@
if ( libPath.equals( "" ) )
{
// No library path
- m_outInfo.println( getRes().getString(
- "WARNING - Unable to load the Wrapper's native library because the\n" ) );
- m_outInfo.println( getRes().getString(
- " java.library.path was set to ''. Please see the" ) );
- m_outInfo.println( getRes().getString(
- " documentation for the wrapper.java.library.path " ) );
- m_outInfo.println( getRes().getString(
- " configuration property." ) );
+ // This message is logged when localization is unavailable.
+ m_outInfo.println( "WARNING - Unable to load the Wrapper's native library because the" );
+ m_outInfo.println( " java.library.path was set to ''. Please see the" );
+ m_outInfo.println( " documentation for the wrapper.java.library.path" );
+ m_outInfo.println( " configuration property." );
}
else
{
@@ -1586,22 +1597,18 @@
if ( libFile == null )
{
// The library could not be located on the library path.
- m_outInfo.println( getRes().getString(
- "WARNING - Unable to load the Wrapper's native library because none of the" ) );
- m_outInfo.println( getRes().getString(
- " following files:" ) );
+ // This message is logged when localization is unavailable.
+ m_outInfo.println( "WARNING - Unable to load the Wrapper's native library because none of the" );
+ m_outInfo.println( " following files:" );
for ( int i = 0; i < detailedNames.length; i++ )
{
if ( detailedFiles[i] != null )
{
- m_outInfo.println(
- " " + detailedFiles[i] );
+ m_outInfo.println( " " + detailedFiles[i] );
}
}
- m_outInfo.println(
- " " + file );
- m_outInfo.println( getRes().getString(
- " could be located on the following java.library.path:" ) );
+ m_outInfo.println( " " + file );
+ m_outInfo.println( " could be located on the following java.library.path:" );
String pathSep = System.getProperty( "path.separator" );
StringTokenizer st = new StringTokenizer( libPath, pathSep );
@@ -1610,48 +1617,35 @@
File pathElement = new File( st.nextToken() );
m_outInfo.println( " " + pathElement.getAbsolutePath() );
}
- m_outInfo.println( getRes().getString(
- " Please see the documentation for the wrapper.java.library.path" ) );
- m_outInfo.println(getRes().getString(
- " configuration property." ) );
+ m_outInfo.println( " Please see the documentation for the wrapper.java.library.path" );
+ m_outInfo.println( " configuration property." );
}
else
{
// The library file was found but could not be loaded for some reason.
- m_outInfo.println( getRes().getString(
- "WARNING - Unable to load the Wrapper''s native library ''{0}''.", libFile.getName() ) );
- m_outInfo.println( getRes().getString(
- " The file is located on the path at the following location but" ) );
- m_outInfo.println( getRes().getString(
- " could not be loaded:" ) );
- m_outInfo.println(
- " " + libFile.getAbsolutePath() );
- m_outInfo.println(getRes().getString(
- " Please verify that the file is both readable and executable by the" ) );
- m_outInfo.println(getRes().getString(
- " current user and that the file has not been corrupted in any way." ) );
- m_outInfo.println(getRes().getString(
- " One common cause of this problem is running a 32-bit version" ) );
- m_outInfo.println(getRes().getString(
- " of the Wrapper with a 64-bit version of Java, or vica versa." ) );
+ // This message is logged when localization is unavailable.
+ m_outInfo.println( "WARNING - Unable to load the Wrapper''s native library '" + libFile.getName() + "'." );
+ m_outInfo.println( " The file is located on the path at the following location but" );
+ m_outInfo.println( " could not be loaded:" );
+ m_outInfo.println( " " + libFile.getAbsolutePath() );
+ m_outInfo.println( " Please verify that the file is both readable and executable by the" );
+ m_outInfo.println( " current user and that the file has not been corrupted in any way." );
+ m_outInfo.println( " One common cause of this problem is running a 32-bit version" );
+ m_outInfo.println( " of the Wrapper with a 64-bit version of Java, or vica versa." );
if ( m_jvmBits > 0 )
{
- m_outInfo.println( getRes().getString(
- " This is a {0}-bit JVM.", new Integer( m_jvmBits ) ) );
+ m_outInfo.println( " This is a " + m_jvmBits + "-bit JVM." );
}
else
{
- m_outInfo.println( getRes().getString(
- " The bit depth of this JVM could not be determined." ) );
+ m_outInfo.println( " The bit depth of this JVM could not be determined." );
}
- m_outInfo.println( getRes().getString(
- " Reported cause:" ) );
- m_outInfo.println(
- " " + error );
+ m_outInfo.println( " Reported cause:" );
+ m_outInfo.println( " " + error );
}
}
- m_outInfo.println( getRes().getString(
- " System signals will not be handled correctly." ) );
+ // This message is logged when localization is unavailable.
+ m_outInfo.println( " System signals will not be handled correctly." );
m_outInfo.println();
}
}
@@ -1687,19 +1681,13 @@
if ( !WrapperInfo.getVersion().equals( wrapperVersion ) )
{
- m_outInfo.println(getRes().getString(
- "WARNING - The Wrapper jar file currently in use is version \"{0}\"" ,
- WrapperInfo.getVersion() ) );
- m_outInfo.println(getRes().getString(
- " while the version of the Wrapper which launched this JVM is " ) );
- m_outInfo.println(
- " \"" + wrapperVersion + "\"." );
- m_outInfo.println( getRes().getString(
- " The Wrapper may appear to work correctly but some features may" ) );
- m_outInfo.println( getRes().getString(
- " not function correctly. This configuration has not been tested" ) );
- m_outInfo.println( getRes().getString(
- " and is not supported." ) );
+ // This message is logged when localization is not yet initialized.
+ m_outInfo.println( "WARNING - The Wrapper jar file currently in use is version \"" + WrapperInfo.getVersion() + "\"" );
+ m_outInfo.println( " while the version of the Wrapper which launched this JVM is" );
+ m_outInfo.println( " \"" + wrapperVersion + "\"." );
+ m_outInfo.println( " The Wrapper may appear to work correctly but some features may" );
+ m_outInfo.println( " not function correctly. This configuration has not been tested" );
+ m_outInfo.println( " and is not supported." );
m_outInfo.println();
}
}
@@ -1737,16 +1725,9 @@
if ( !wrapperVersion.equals( jniVersion ) )
{
m_outInfo.println( getRes().getString(
- "WARNING - The version of the Wrapper which launched this JVM is " ) );
- m_outInfo.println( getRes().getString(
- " \"{0}\" while the version of the native library ", wrapperVersion ) );
- m_outInfo.println(getRes().getString( " is \"{0}\"." ,jniVersion ) );
+ "WARNING - The version of the Wrapper which launched this JVM is\n \"{0}\" while the version of the native library\n is \"{1}\".", wrapperVersion, jniVersion ) );
m_outInfo.println(getRes().getString(
- " The Wrapper may appear to work correctly but some features may" ) );
- m_outInfo.println( getRes().getString(
- " not function correctly. This configuration has not been tested" ) );
- m_outInfo.println( getRes().getString(
- " and is not supported." ) );
+ " The Wrapper may appear to work correctly but some features may\n not function correctly. This configuration has not been tested\n and is not supported." ) );
m_outInfo.println();
}
}
@@ -1998,9 +1979,11 @@
* @throws SecurityException If a SecurityManager is present and its
* checkExec method doesn't allow creation of a
* subprocess.
- * @throws WrapperJNIError If the native library has not been loaded.
+ * @throws WrapperJNIError If the native library has not been loaded or is in the
+ * process of shutting down.
* @throws WrapperLicenseError If the function is called other than in
- * the Professional Edition or from a Standalone JVM.
+ * the Professional Edition or if the native
+ * library has not been loaded.
* @throws UnsatisfiedLinkError If the posix_spawn function couldn't be found
*
* @see #isProfessionalEdition()
@@ -2051,9 +2034,11 @@
* @throws SecurityException If a SecurityManager is present and its
* checkExec method doesn't allow creation of a
* subprocess.
- * @throws WrapperJNIError If the native library has not been loaded.
+ * @throws WrapperJNIError If the native library has not been loaded or is in the
+ * process of shutting down.
* @throws WrapperLicenseError If the function is called other than in
- * the Professional Edition or from a Standalone JVM.
+ * the Professional Edition or if the native
+ * library has not been loaded.
* @throws UnsatisfiedLinkError If the posix_spawn function couldn't be found
*
* @see #isProfessionalEdition()
@@ -2102,9 +2087,11 @@
* subprocess.
* @throws IllegalArgumentException If there are any problems with the
* WrapperProcessConfig object.
- * @throws WrapperJNIError If the native library has not been loaded.
+ * @throws WrapperJNIError If the native library has not been loaded or is in the
+ * process of shutting down.
* @throws WrapperLicenseError If the function is called other than in
- * the Professional Edition or from a Standalone JVM.
+ * the Professional Edition or if the native
+ * library has not been loaded.
* @throws UnsatisfiedLinkError If the posix_spawn function couldn't be found
*
* @see #isProfessionalEdition()
@@ -2159,9 +2146,11 @@
* subprocess.
* @throws IllegalArgumentException If there are any problems with the
* WrapperProcessConfig object.
- * @throws WrapperJNIError If the native library has not been loaded.
+ * @throws WrapperJNIError If the native library has not been loaded or is in the
+ * process of shutting down.
* @throws WrapperLicenseError If the function is called other than in
- * the Professional Edition or from a Standalone JVM.
+ * the Professional Edition or if the native
+ * library has not been loaded.
* @throws UnsatisfiedLinkError If the posix_spawn function couldn't be found
*
* @see #isProfessionalEdition()
@@ -2170,7 +2159,7 @@
public static WrapperProcess exec( String[] cmdArray, WrapperProcessConfig config )
throws SecurityException, IOException, NullPointerException, IndexOutOfBoundsException, IllegalArgumentException, WrapperJNIError, WrapperLicenseError, UnsatisfiedLinkError
{
- return exec( cmdArray, null, config );
+ return exec( cmdArray, null, config );
}
/**
@@ -2183,10 +2172,7 @@
// Then both the cmdArray and cmdLine will be passed off to the native code.
// The cmdLine may be null.
- if ( !isProfessionalEdition() )
- {
- throw new WrapperLicenseError( getRes().getString( "Requires the Professional Edition." ) );
- }
+ assertProfessionalEdition();
if ( ( cmdArray == null ) && ( cmdLine == null ) )
{
@@ -2214,60 +2200,85 @@
sm.checkExec( cmdArray[0] );
}
- if ( isNativeLibraryOk() )
+ // Keep track of how many threads are trying to execute child processes.
+ // This is critical to avoid notification failures on shutdown.
+ synchronized( WrapperManager.class )
{
- for ( int i = 0; i < cmdArray.length; i++ )
- {
- if ( cmdArray[i] == null )
- {
- throw new NullPointerException( getRes().getString( "cmdarray[{0}]: Invalid element (isNull).",
- new Integer( i) ) );
- }
- }
-
- // On UNIX platforms, we want to try and make sure the command is
- // valid before we run it to avoid problems later. Not necessary
- // on Windows.
- if ( !m_windows )
+ m_runningExecs++;
+ }
+ try
+ {
+ if ( isNativeLibraryOk() )
{
- if ( !new File( cmdArray[0] ).exists() )
+ for ( int i = 0; i < cmdArray.length; i++ )
{
- boolean found = false;
- String path = nativeWrapperGetEnv( "PATH" );
- if ( path != null )
+ if ( cmdArray[i] == null )
{
- String[] paths = path.split( File.pathSeparator );
-
- for ( int i = 0; i < paths.length; i++ )
+ throw new NullPointerException( getRes().getString( "cmdarray[{0}]: Invalid element (isNull).",
+ new Integer( i) ) );
+ }
+ }
+
+ // On UNIX platforms, we want to try and make sure the command is
+ // valid before we run it to avoid problems later. Not necessary
+ // on Windows.
+ if ( !m_windows )
+ {
+ if ( !new File( cmdArray[0] ).exists() )
+ {
+ boolean found = false;
+ String path = nativeWrapperGetEnv( "PATH" );
+ if ( path != null )
{
- File file = new File( paths[i] + File.separator + cmdArray[0] );
- // m_outInfo.println( blu.getPath() );
- if ( file.exists() )
+ String[] paths = path.split( File.pathSeparator );
+
+ for ( int i = 0; i < paths.length; i++ )
{
- cmdArray[0] = file.getPath();
- found = true;
- break;
+ File file = new File( paths[i] + File.separator + cmdArray[0] );
+ // m_outInfo.println( blu.getPath() );
+ if ( file.exists() )
+ {
+ cmdArray[0] = file.getPath();
+ found = true;
+ break;
+ }
}
}
+ if ( !found )
+ {
+ throw new IOException(getRes().getString( "''{0}'' not found." , cmdArray[0] ) );
+ }
}
- if ( !found )
+ }
+ if ( m_debug )
+ {
+ for ( int j = 0; j < cmdArray.length; j++ )
{
- throw new IOException(getRes().getString( "''{0}'' not found." , cmdArray[0] ) );
+ m_outDebug.println( "args[" + j + "] = " + cmdArray[j] );
}
}
+ return nativeExec( cmdArray, cmdLine, config.setEnvironment( config.getEnvironment() ), WrapperSystemPropertyUtil.getBooleanProperty( "wrapper.child.allowCWDOnSpawn", false ) );
+ } else {
+ if ( m_stopped ) {
+ // This message is logged when localization is no longer available.
+ throw new WrapperJNIError( "Wrapper native library shutting down." );
+ } else {
+ // This message is logged when localization is not available.
+ throw new WrapperJNIError( "Wrapper native library not loaded." );
+ }
}
- if ( m_debug )
+ }
+ finally
+ {
+ synchronized( WrapperManager.class )
{
- for ( int j = 0; j < cmdArray.length; j++ )
+ m_runningExecs--;
+ if ( m_runningExecs <= 0 )
{
- m_outDebug.println( "args[" + j+ "] = " + cmdArray[j] );
+ WrapperManager.class.notifyAll();
}
}
- return nativeExec( cmdArray, cmdLine, config.setEnvironment( config.getEnvironment() ), WrapperSystemPropertyUtil.getBooleanProperty( "wrapper.child.allowCWDOnSpawn", false ) );
- } else {
- throw new WrapperJNIError( getRes().getString( "Wrapper native library not loaded." ) );
}
-
}
/**
@@ -2283,6 +2294,31 @@
}
/**
+ * Asserts that the Professional Edition of the Wrapper is being used and
+ * that the native library is available.
+ *
+ * @throws WrapperLicenseError If the function is called other than in
+ * the Professional Edition or if the native
+ * library has not been loaded.
+ */
+ static void assertProfessionalEdition()
+ throws WrapperLicenseError
+ {
+ if ( !m_libraryOK )
+ {
+ throw new WrapperLicenseError( getRes().getString( "Requires that the Professional Edition native library be loaded. Please check for errors earlier in the log." ) );
+ }
+ else if ( m_stopped )
+ {
+ throw new WrapperLicenseError( getRes().getString( "Requires that the Professional Edition native library be loaded, but it has already been unloaded as part of the shutdown process." ) );
+ }
+ else if ( !isProfessionalEdition() )
+ {
+ throw new WrapperLicenseError( getRes().getString( "Requires the Professional Edition." ) );
+ }
+ }
+
+ /**
* Returns true if the current JVM is Windows.
*
* @return True if this is Windows.
@@ -2310,6 +2346,8 @@
* Returns true if the current Wrapper edition has support for Professional
* Edition features.
*
+ * False will also be returned if the native library has not been initialized correctly.
+ *
* @return True if professional features are supported.
*/
public static boolean isProfessionalEdition()
@@ -2322,6 +2360,8 @@
* Returns true if the current Wrapper edition has support for Standard
* Edition features.
*
+ * False will also be returned if the native library has not been initialized correctly.
+ *
* @return True if standard features are supported.
*/
public static boolean isStandardEdition()
@@ -2331,14 +2371,15 @@
}
/**
- * Fires a user event user_n specified in the conf file
+ * Fires a user event user_n specified in the conf file
*
- * @throws SecurityException If a SecurityManager is present and the
+ * @throws SecurityException If a SecurityManager is present and the
* calling thread does not have the
* WrapperPermission("fireUserEvent")
* permission.
- * @throws WrapperLicenseError If the function is called other than in
- * the Professional Edition or from a Standalone JVM.
+ * @throws WrapperLicenseError If the function is called other than in
+ * the Professional Edition or if the native
+ * library has not been loaded.
*/
public static void fireUserEvent( int eventNr )
{
@@ -2350,10 +2391,8 @@
if ( eventNr <= 0 || eventNr > 32767 ) {
throw new java.lang.IllegalArgumentException( getRes().getString( "The user-event number must be in the range of 1-32767." ) );
}
- if ( !isProfessionalEdition() )
- {
- throw new WrapperLicenseError( getRes().getString( "Requires the Professional Edition." ) );
- }
+ assertProfessionalEdition();
+
sendCommand( WRAPPER_MSG_FIRE_USER_EVENT, String.valueOf( eventNr ) );
}
@@ -4579,13 +4618,21 @@
}
fireWrapperEvent( controlEvent );
- if ( !controlEvent.isConsumed() )
+ if ( ignore )
{
- if ( ignore )
+ // Event will always be consumed.
+ if ( m_debug )
+ {
+ m_outDebug.println( getRes().getString( "Ignoring control event({0})", eventName ) );
+ }
+ }
+ else
+ {
+ if ( controlEvent.isConsumed() )
{
if ( m_debug )
{
- m_outDebug.println( getRes().getString( "Ignoring control event({0})", eventName ) );
+ m_outDebug.println(getRes().getString( "Control event({0}) was consumed by user listener.", eventName ) );
}
}
else
@@ -4948,6 +4995,30 @@
{
m_outDebug.println( getRes().getString( "Closing backend connection." ) );
}
+
+ // To avoid the case where a child process is launched by we fail to notify the Wrapper,
+ // we need to wait until there are no longer any child processes in the process of being launched.
+ long start = System.currentTimeMillis();
+ while ( m_runningExecs > 0 )
+ {
+ if ( m_debug )
+ {
+ m_outDebug.println( getRes().getString( "Waiting for {0} threads to fininish launching child processes...", new Integer( m_runningExecs ) ) );
+ }
+ try
+ {
+ WrapperManager.class.wait( 1000 );
+ }
+ catch ( InterruptedException e )
+ {
+ }
+ if ( System.currentTimeMillis() - start > 30000 )
+ {
+ m_outError.println( getRes().getString( "Timed out waiting for {0} threads to fininish launching child processes.", new Integer( m_runningExecs ) ) );
+ break;
+ }
+ }
+
// Clear the connected flag first so other threads will recognize that we
// are closing correctly.
m_backendConnected = false;
@@ -5149,6 +5220,12 @@
return name;
}
+ /**
+ * Send a command to the Wrapper.
+ *
+ * @param code Command to send.
+ * @param message Message to send with the command.
+ */
private static synchronized void sendCommand( byte code, String message )
{
if ( m_debug )
@@ -5177,6 +5254,7 @@
}
}
+ boolean sentCommand = false;
if ( m_appearHung )
{
// The WrapperManager is attempting to make the JVM appear hung, so do nothing
@@ -5214,6 +5292,8 @@
m_backendOS.write( m_commandBuffer, 0, len );
m_backendOS.flush();
+
+ sentCommand = true;
}
catch ( IOException e )
{
@@ -5223,6 +5303,27 @@
}
}
}
+
+ if ( !sentCommand )
+ {
+ // We failed to send a command. Some commands require that we log it as it could cause later problems.
+ switch ( code )
+ {
+ case WRAPPER_MSG_CHILD_LAUNCH:
+ m_outError.println( getRes().getString( "Failed to notify the Wrapper process that child with PID={0} was launched. The Wrapper will not be able to make sure it is terminated when the Java process exits.", message ) );
+ break;
+
+ case WRAPPER_MSG_CHILD_TERM:
+ if ( m_debug )
+ {
+ m_outDebug.println( getRes().getString( "Failed to notify the Wrapper process that child with PID={0} completed. The Wrapper will recover on its own.", message ) );
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
}
/**
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperPrintStream.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperPrintStream.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperPrintStream.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperPrintStream.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -48,7 +48,25 @@
*/
public void println( String x )
{
- super.println( m_header + x );
+ if ( x.indexOf( "\n" ) >= 0 )
+ {
+ String[] lines = x.split( "[\n]", -1 );
+ StringBuffer sb = new StringBuffer();
+ for ( int i = 0; i < lines.length; i++ )
+ {
+ if ( i > 0 )
+ {
+ sb.append( "\n" );
+ }
+ sb.append( m_header );
+ sb.append( lines[i] );
+ }
+ super.println( sb.toString() );
+ }
+ else
+ {
+ super.println( m_header + x );
+ }
}
/**
@@ -60,6 +78,13 @@
*/
public void println( Object x )
{
- super.println( m_header + x );
+ if ( x == null )
+ {
+ println( "null" );
+ }
+ else
+ {
+ println( x.toString() );
+ }
}
}
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcessConfig.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcessConfig.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcessConfig.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcessConfig.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -58,15 +58,13 @@
/**
* Creates a default configuration.
*
- * @throws WrapperLicenseError If the Professional Edition of the Wrapper
- * is not being used.
+ * @throws WrapperLicenseError If the function is called other than in
+ * the Professional Edition or if the native
+ * library has not been loaded.
*/
public WrapperProcessConfig()
{
- if ( !WrapperManager.isProfessionalEdition() )
- {
- throw new WrapperLicenseError( "Requires the Professional Edition." );
- }
+ WrapperManager.assertProfessionalEdition();
m_isDetached = false;
m_defdir = null;
@@ -89,16 +87,15 @@
* true.
*
* @throws WrapperLicenseError If the function is called other than in
- * the Professional Edition or from a Standalone JVM.
+ * the Professional Edition or if the native
+ * library has not been loaded.
* @throws IllegalArgumentException If the startType is invalid.
*/
public static boolean isSupported( int startType )
throws WrapperLicenseError, IllegalArgumentException
{
- if ( !WrapperManager.isProfessionalEdition() )
- {
- throw new WrapperLicenseError( WrapperManager.getRes().getString( "Requires the Professional Edition." ) );
- }
+ WrapperManager.assertProfessionalEdition();
+
verifyStartType( startType );
if ( WrapperManager.isNativeLibraryOk() )
{
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcessInputStream.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcessInputStream.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcessInputStream.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcessInputStream.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -28,6 +28,7 @@
private long m_ptr;
private boolean m_closed;
private ByteArrayInputStream m_bais;
+ private volatile boolean m_read;
/*---------------------------------------------------------------
* Constructors
@@ -70,20 +71,34 @@
}
}
}
+
+ /**
+ * Tests if this input stream supports the mark and reset methods.
+ *
+ * The markSupported method of InputStream returns false.
+ *
+ * @return false.
+ */
public boolean markSupported()
{
return false;
}
+ /**
+ *
+ */
public boolean ready()
{
- if ( !m_closed || (m_bais != null && m_bais.available() > 0 ))
- {
- return true;
- }
- else
+ synchronized( this )
{
- return false;
+ if ( !m_closed || ( ( m_bais != null ) && ( m_bais.available() > 0 ) ) )
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
}
}
@@ -99,19 +114,23 @@
public int read()
throws IOException
{
- if ( ( !m_closed ) && WrapperManager.isNativeLibraryOk() )
- {
- return nativeRead( true );
- }
- else
+ synchronized( this )
{
- if ( m_bais != null )
+ m_read = true;
+ if ( ( !m_closed ) && WrapperManager.isNativeLibraryOk() )
{
- return m_bais.read();
+ return nativeRead( true );
}
else
{
- throw new IOException(WrapperManager.getRes().getString( "Stream is closed." ) );
+ if ( m_bais != null )
+ {
+ return m_bais.read();
+ }
+ else
+ {
+ throw new IOException( WrapperManager.getRes().getString( "Stream is closed." ) );
+ }
}
}
}
@@ -150,7 +169,7 @@
{
return read( b, 0, b.length );
}
-
+
/**
* Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made
* to read as many as len bytes, but a smaller number may be read. The number of bytes actually
@@ -173,7 +192,7 @@
*
* @param b The buffer into which the data is read.
* @param off The start offset in array b from which the data is read.
- * @param leb The maximum number of bytes to read.
+ * @param len The maximum number of bytes to read.
*
* @return The total number of bytes read into the buffer, or -1 is there is no more data because
* the end of the stream has been reached.
@@ -205,19 +224,27 @@
{
return -1;
}
+ m_read = true;
if ( ( !m_closed ) && WrapperManager.isNativeLibraryOk() )
{
// Attempt to read output in blocking mode.
c = nativeRead2( b, off, len, true );
if ( c == -1 ) // a process can terminate only once
{
- // And end of file was encountered. This can happen
+ // And end of file was encountered. This can happen
c = nativeRead2( b, off, len, false );
}
}
else
{
- c = m_bais.read( b, off, len );
+ if ( m_bais != null )
+ {
+ c = m_bais.read( b, off, len );
+ }
+ else
+ {
+ throw new IOException(WrapperManager.getRes().getString( "Stream is closed." ) );
+ }
}
return c == 0 ? -1 : c;
}
@@ -227,16 +254,22 @@
* Private Methods
*-------------------------------------------------------------*/
/**
- * This method gets called when a spawned Process has terminated
+ * This method gets called when a spawned Process has terminated
* and the pipe buffer gets read and stored in an byte array.
- * This way we can close the Filedescriptor and keep the number
+ * This way we can close the Filedescriptor and keep the number
* of open FDs as small as possible.
*/
private void readAndCloseOpenFDs()
{
+ if ( m_read )
+ {
+ // Another thread is reading from the stream so we can trust that thread to complete the reads and close on its own.
+ return;
+ }
+
synchronized( this )
{
- int i;
+ int count;
int msg;
if ( m_closed || ( !WrapperManager.isNativeLibraryOk() ) )
{
@@ -244,18 +277,20 @@
}
try
{
- byte[] buffer = new byte[0];
- i = 0;
+ byte[] buffer = new byte[1024];
+ count = 0;
while ( ( msg = nativeRead( false ) ) != -1 )
{
- int newSize = buffer.length + 1;
- byte[] temp = new byte[newSize];
- System.arraycopy( buffer, 0, temp, 0, buffer.length );
- buffer = temp;
- buffer[i++] = (byte) msg;
+ if ( count >= buffer.length )
+ {
+ byte[] temp = new byte[buffer.length + 1024];
+ System.arraycopy( buffer, 0, temp, 0, buffer.length );
+ buffer = temp;
+ }
+ buffer[count++] = (byte)msg;
}
- m_bais = new ByteArrayInputStream( buffer );
- close();
+ m_bais = new ByteArrayInputStream( buffer, 0, count );
+ close();
}
catch( IOException ioe )
{
@@ -266,4 +301,3 @@
}
}
-
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcess.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcess.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcess.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcess.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -161,14 +161,12 @@
public int waitFor()
throws InterruptedException
{
- synchronized( this )
+ if ( m_exitcode == Integer.MIN_VALUE )
{
- if ( m_exitcode == Integer.MIN_VALUE )
- {
- nativeWaitFor();
- }
- return m_exitcode;
+ nativeWaitFor();
}
+
+ return m_exitcode;
}
/**
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcessOutputStream.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcessOutputStream.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProcessOutputStream.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProcessOutputStream.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -83,13 +83,16 @@
public void close()
throws IOException
{
- if ( !m_closed )
+ synchronized( this )
{
- if ( WrapperManager.isNativeLibraryOk() )
+ if ( !m_closed )
{
- nativeClose();
+ if ( WrapperManager.isNativeLibraryOk() )
+ {
+ nativeClose();
+ }
+ m_closed = true;
}
- m_closed = true;
}
}
}
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProperties.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProperties.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperProperties.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperProperties.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperPropertyUtil.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperPropertyUtil.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperPropertyUtil.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperPropertyUtil.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperResources.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperResources.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperResources.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperResources.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperServiceException.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperServiceException.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperServiceException.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperServiceException.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperShuttingDownException.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperShuttingDownException.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperShuttingDownException.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperShuttingDownException.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperSimpleApp.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperSimpleApp.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperSimpleApp.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperSimpleApp.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperStartStopApp.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperStartStopApp.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperStartStopApp.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperStartStopApp.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperSystemPropertyUtil.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperSystemPropertyUtil.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperSystemPropertyUtil.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperSystemPropertyUtil.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperUNIXGroup.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperUNIXGroup.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperUNIXGroup.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperUNIXGroup.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
@@ -48,7 +48,12 @@
public String toString()
{
- return WrapperManager.getRes().getString( "WrapperUNIXGroup[{0}, {1}]", new Integer( getGID() ), getGroup() );
+ StringBuffer sb = new StringBuffer();
+ sb.append( "WrapperUNIXGroup[" );
+ sb.append( getGID() );
+ sb.append( getGroup() );
+ sb.append( "]" );
+ return sb.toString();
}
}
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperUNIXUser.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperUNIXUser.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperUNIXUser.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperUNIXUser.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperUser.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperUser.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperUser.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperUser.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperWin32Group.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperWin32Group.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperWin32Group.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperWin32Group.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperWin32Service.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperWin32Service.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperWin32Service.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperWin32Service.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperWin32User.java service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperWin32User.java
--- service-wrapper-java-3.5.22/src/java/org/tanukisoftware/wrapper/WrapperWin32User.java 2013-10-08 06:19:59.000000000 +0000
+++ service-wrapper-java-3.5.25/src/java/org/tanukisoftware/wrapper/WrapperWin32User.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*
diff -Nru service-wrapper-java-3.5.22/src/test/org/tanukisoftware/wrapper/WrapperManagerSystemTimeTestCase.java service-wrapper-java-3.5.25/src/test/org/tanukisoftware/wrapper/WrapperManagerSystemTimeTestCase.java
--- service-wrapper-java-3.5.22/src/test/org/tanukisoftware/wrapper/WrapperManagerSystemTimeTestCase.java 2013-10-08 06:20:00.000000000 +0000
+++ service-wrapper-java-3.5.25/src/test/org/tanukisoftware/wrapper/WrapperManagerSystemTimeTestCase.java 2014-06-30 18:06:59.000000000 +0000
@@ -1,7 +1,7 @@
package org.tanukisoftware.wrapper;
/*
- * Copyright (c) 1999, 2013 Tanuki Software, Ltd.
+ * Copyright (c) 1999, 2014 Tanuki Software, Ltd.
* http://www.tanukisoftware.com
* All rights reserved.
*