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:03:21.000000000 +0000 +++ service-wrapper-java-3.5.25/debian/changelog 2014-07-26 23:40:04.000000000 +0000 @@ -1,8 +1,36 @@ -service-wrapper-java (3.5.22-1~saucy1) saucy; urgency=low +service-wrapper-java (3.5.25-1ubuntu1) trusty; urgency=medium * Upload to PPA - -- Kill Your TV Wed, 06 Nov 2013 01:03:09 +0000 + -- 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 + + -- Kill Your TV Wed, 06 Nov 2013 01:08:52 +0000 service-wrapper-java (3.5.22-1) unstable; urgency=low @@ -17,36 +45,18 @@ -- Kill Your TV Sat, 12 Oct 2013 00:47:36 +0000 -service-wrapper-java (3.5.20-1+saucy1) saucy; urgency=low - - * Upload to PPA - - -- Kill Your TV Thu, 26 Sep 2013 18:00:32 +0000 - service-wrapper-java (3.5.20-1) unstable; urgency=low * Imported Upstream version 3.5.20 -- Kill Your TV Sat, 10 Aug 2013 23:10:48 +0000 -service-wrapper-java (3.5.19-1+saucy1) saucy; urgency=low - - * Upload to PPA - - -- Kill Your TV Fri, 05 Jul 2013 21:39:00 +0000 - service-wrapper-java (3.5.19-1) unstable; urgency=low * Imported Upstream version 3.5.19 -- Kill Your TV Mon, 17 Jun 2013 00:54:14 +0000 -service-wrapper-java (3.5.17-3~saucy1) saucy; urgency=low - - * Upload to PPA - - -- Kill Your TV Fri, 17 May 2013 21:08:18 +0000 - service-wrapper-java (3.5.17-3) unstable; urgency=low * Re-depend on (>= ${source:Version}) 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:03:21.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/gbp.conf service-wrapper-java-3.5.25/debian/gbp.conf --- service-wrapper-java-3.5.22/debian/gbp.conf 2013-11-06 01:03:21.000000000 +0000 +++ service-wrapper-java-3.5.25/debian/gbp.conf 2014-07-26 23:40:04.000000000 +0000 @@ -8,7 +8,7 @@ # the default branch for upstream sources: #upstream-branch = upstream # the default branch for the debian patch: -debian-branch = ubuntu/saucy +debian-branch = ubuntu/trusty # the default tag formats used: #upstream-tag = upstream/%(version)s #debian-tag = debian/%(version)s 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:03:21.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:03:21.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:03:21.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:03:21.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:03:21.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. *