diff --git a/Makefile.am b/Makefile.am index a3f2f2c1e6655249867b8f8801083069399815ac..33390d34bbf3ed82f0ef5f3d0cd8ef71943d311b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -61,10 +61,14 @@ ACLOCAL_AMFLAGS = -I m4 if CPPUNIT UNIT_TESTS=unit_tests endif + if X_JNI - JNI=bindings/java/jni + JAVA_BINDINGS=bindings/java/jni bindings/java +else + JAVA_BINDINGS= endif -SUBDIRS = tsk tools tests samples man $(UNIT_TESTS) $(JNI) + +SUBDIRS = tsk tools tests samples man $(UNIT_TESTS) $(JAVA_BINDINGS) nobase_include_HEADERS = tsk/libtsk.h tsk/tsk_incs.h \ tsk/base/tsk_base.h tsk/base/tsk_os.h \ diff --git a/bindings/java/Makefile.am b/bindings/java/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..fa70d5ca8236a1b6e1c426022d1b5c7dbfd5db9d --- /dev/null +++ b/bindings/java/Makefile.am @@ -0,0 +1,24 @@ +Z_PATH=@Z_PATH@ +EWF_PATH=@EWF_PATH@ +ANT_PROPS= + +if X_ZLIB + ANT_PROPS+=-Dlib.z.path=$(Z_PATH) +endif + +if X_LIBEWF + ANT_PROPS+=-Dlib.ewf.path=$(EWF_PATH) +endif + +tsk_jar = $(top_builddir)/bindings/java/dist/Tsk_DataModel.jar +jardir = $(prefix)/share/java +jar_DATA = $(tsk_jar) + + +$(tsk_jar): + ant dist $(ANT_PROPS) + +CLEANFILES = $(tsk_jar) + +clean-local: + ant clean diff --git a/bindings/java/build-unix.xml b/bindings/java/build-unix.xml index f1451406e997aa20fa597b9ae4fc8433ead1f7ac..81edd272efaf026818a45c2597e07c798e7624e0 100644 --- a/bindings/java/build-unix.xml +++ b/bindings/java/build-unix.xml @@ -30,6 +30,9 @@ <available file="./jni/.libs/libtsk_jni.so" property="tsk_so.present"/> <available file="./jni/.libs/libtsk_jni.a" property="present"/> <fail unless="present" message="Run make install on The Sleuthkit."/> + <!-- Default location to find zlib and libewf. Overwritten by properties in makefile --> + <property name="lib.z.path" value="/usr/lib"/> + <property name="lib.ewf.path" value="/usr/local/lib"/> </target> <!-- OS X --> @@ -42,16 +45,16 @@ <property environment="env"/> <property name="jni.dylib" location="${basedir}/jni/.libs/libtsk_jni.dylib" /> <property name="jni.jnilib" value="libtsk_jni.jnilib" /> - <property name="zlib.jni" location="/usr/lib/libz.dylib"/> - <property name="libewf.jni" location="/usr/local/lib/libewf.dylib"/> + <property name="zlib.jni" location="${lib.z.path}/libz.dylib"/> + <property name="libewf.jni" location="${lib.ewf.path}/libewf.dylib"/> <!-- x86_64 --> <copy file="${jni.dylib}" tofile="${x86_64}/mac/${jni.jnilib}"/> <copy file="${zlib.jni}" tofile="${x86_64}/mac/zlib.dylib"/> <copy file="${libewf.jni}" tofile="${x86_64}/mac/libewf.dylib"/> <!-- amd64 --> <copy file="${jni.dylib}" tofile="${amd64}/mac/${jni.jnilib}"/> - <copy file="${zlib.jni}" tofile="${x86_64}/mac/zlib.dylib"/> - <copy file="${libewf.jni}" tofile="${x86_64}/mac/libewf.dylib"/> + <copy file="${zlib.jni}" tofile="${amd64}/mac/zlib.dylib"/> + <copy file="${libewf.jni}" tofile="${amd64}/mac/libewf.dylib"/> </target> <!-- Non-OS X --> @@ -63,18 +66,32 @@ <target name="copyLinuxLibs" depends="testTSKLibs" if="tsk_so.present"> <property environment="env"/> <property name="jni.so" location="${basedir}/jni/.libs/libtsk_jni.so" /> + <property name="zlib.so" location="${lib.z.path}/libz.so"/> + <property name="libewf.so" location="${lib.ewf.path}/libewf.so"/> <!-- x86_64 --> <copy file="${jni.so}" tofile="${x86_64}/linux/libtsk_jni.so"/> + <copy file="${zlib.so}" tofile="${x86_64}/linux/libz.so"/> + <copy file="${libewf.so}" tofile="${x86_64}/linux/libewf.so"/> <!-- amd64 --> <copy file="${jni.so}" tofile="${amd64}/linux/libtsk_jni.so"/> + <copy file="${zlib.so}" tofile="${amd64}/linux/libz.so"/> + <copy file="${libewf.so}" tofile="${amd64}/linux/libewf.so"/> <!-- x86 --> <copy file="${jni.so}" tofile="${x86}/linux/libtsk_jni.so"/> + <copy file="${zlib.so}" tofile="${x86}/linux/libz.so"/> + <copy file="${libewf.so}" tofile="${x86}/linux/libewf.so"/> <!-- i386 --> <copy file="${jni.so}" tofile="${i386}/linux/libtsk_jni.so"/> + <copy file="${zlib.so}" tofile="${i386}/linux/libz.so"/> + <copy file="${libewf.so}" tofile="${i386}/linux/libewf.so"/> <!-- i586 --> <copy file="${jni.so}" tofile="${i586}/linux/libtsk_jni.so"/> + <copy file="${zlib.so}" tofile="${i586}/linux/libz.so"/> + <copy file="${libewf.so}" tofile="${i586}/linux/libewf.so"/> <!-- i686 --> <copy file="${jni.so}" tofile="${i686}/linux/libtsk_jni.so"/> + <copy file="${zlib.so}" tofile="${i686}/linux/libz.so"/> + <copy file="${libewf.so}" tofile="${i686}/linux/libewf.so"/> </target> <target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" /> diff --git a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java index 1821f767aaca54f5e675d9ebd704fa96876f23cd..ad2bd6fa6f779608e494363cf0b68c55086e2ef1 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java +++ b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java @@ -619,7 +619,7 @@ public String getMetaFlagsAsString() { String str = ""; if (metaFlags.contains(TSK_FS_META_FLAG_ENUM.ALLOC)) { str = TSK_FS_META_FLAG_ENUM.ALLOC.toString(); - } else if (metaFlags.contains(TSK_FS_META_FLAG_ENUM.ALLOC)) { + } else if (metaFlags.contains(TSK_FS_META_FLAG_ENUM.UNALLOC)) { str = TSK_FS_META_FLAG_ENUM.UNALLOC.toString(); } return str; diff --git a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java index dd7e506dfec352291f7cbccc0c340a4988a84831..d56ae1b52309e6d3ebd60d6c1baddf6627de180b 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java +++ b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java @@ -77,34 +77,40 @@ public static boolean loadAuxilliaryLibs() { if (LibraryUtils.isWindows()) { loaded = LibraryUtils.loadCRTLibs(); } - - if (! LibraryUtils.isLinux()) { - - for(LibraryUtils.Lib lib : LibraryUtils.getLibs()) { - loaded = LibraryUtils.loadLibFromJar(lib); - if (!loaded) { - System.out.println("SleuthkitJNI: failed to load " + lib.getLibName()); - } else { - System.out.println("SleuthkitJNI: loaded " + lib.getLibName()); - } + + // Always try to load from jar first. + for(Lib lib : LibraryUtils.getLibs()) { + // Always try to load from jar first. + loaded = LibraryUtils.loadLibFromJar(lib); + if (!loaded) { + // if that fails, try to load from system + loaded = loadLibFromSystem(lib); } - } else { - System.out.println("In unix path."); - // Unix platform - for (Lib lib : LibraryUtils.getLibs()) { - try { - System.out.println("Lib name: " + lib.getUnixName()); - System.loadLibrary(lib.getUnixName()); - System.out.println("SleuthkitJNI: loaded " + lib.getLibName()); - } catch (UnsatisfiedLinkError e) { - loaded = false; - System.out.println("SleuthkitJNI: failed to load " + lib.getLibName()); - } + if (!loaded) { + System.out.println("SleuthkitJNI: failed to load " + lib.getLibName()); + } else { + System.out.println("SleuthkitJNI: loaded " + lib.getLibName()); } } return loaded; } + /** + * Try to load the given Library from the System path. + * + * @param lib + * @return + */ + private static boolean loadLibFromSystem(Lib lib) { + String libName = (isWindows() ? lib.getLibName() : lib.getUnixName()); + try { + System.loadLibrary(libName); + } catch (UnsatisfiedLinkError e) { + return false; + } + return true; + } + /** * Load the Sleuthkit JNI. * @@ -167,6 +173,8 @@ private static String getPlatform() { os = "win"; } else if(LibraryUtils.isMac()) { os = "mac"; + } else if(LibraryUtils.isLinux()) { + os = "linux"; } // os.arch represents the architecture of the JVM, not the os String arch = System.getProperty("os.arch"); @@ -232,7 +240,7 @@ private static boolean loadLibFromJar(Lib library) { // copy library to temp folder and load it try { - java.io.File libTemp = new java.io.File(System.getProperty("java.io.tmpdir") + libName + libExt); + java.io.File libTemp = new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator + libName + libExt); if(libTemp.exists()) { // Delete old file diff --git a/bindings/java/src/org/sleuthkit/datamodel/TskData.java b/bindings/java/src/org/sleuthkit/datamodel/TskData.java index 971e3de0682dc46e5a307f59e6d62150c2c5bd14..7c214dbf50a6f428882035d7b28377bfac4d6bb4 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/TskData.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TskData.java @@ -413,8 +413,8 @@ public enum TSK_FS_TYPE_ENUM { TSK_FS_TYPE_HFS (0x00001000), ///< HFS file system TSK_FS_TYPE_HFS_DETECT (0x00001000), ///< HFS auto detection TSK_FS_TYPE_EXT4 (0x00002000), ///< Ext4 file system - TSK_FS_TYPE_YAFFS2(0x00003000), ///< YAFFS2 file system - TSK_FS_TYPE_YAFFS2_DETECT(0x00003000), ///< YAFFS2 auto detection + TSK_FS_TYPE_YAFFS2(0x00004000), ///< YAFFS2 file system + TSK_FS_TYPE_YAFFS2_DETECT(0x00004000), ///< YAFFS2 auto detection TSK_FS_TYPE_UNSUPP (0xffffffff); ///< Unsupported file system private int value; diff --git a/configure.ac b/configure.ac index 64ba753c7ff04a52c939b01d1913632ad6c06531..f1d6d10d26ca73f50215d3beb1ff70eb8c576668 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,8 @@ m4_include([m4/cppunit.m4]) m4_include([m4/ax_jni_include_dir.m4]) m4_include([m4/ac_prog_javac_works.m4]) m4_include([m4/ac_prog_javac.m4]) - +m4_include([m4/ac_prog_java_works.m4]) +m4_include([m4/ac_prog_java.m4]) AC_CONFIG_SRCDIR([tsk/base/tsk_base.h]) AC_CONFIG_HEADERS([tsk/tsk_config.h]) @@ -87,6 +88,10 @@ if test -d /usr/local/include; then LDFLAGS="$LDFLAGS -L/usr/local/lib" fi +dnl Add enable/disable option +AC_ARG_ENABLE([java], + [AS_HELP_STRING([--disable-java], [Do not build the java bindings or jar file])]) + dnl Checks for libraries. @@ -173,6 +178,13 @@ AS_IF( ) AS_IF([test "x$ac_cv_lib_z_inflate" = "xyes"], [ax_zlib=yes], [ax_zlib=no]) +AM_CONDITIONAL([X_ZLIB],[test "x$with_zlib" != "xno" && test "x$with_zlib" != "xyes"]) +AS_IF([test "x$with_zlib" != "xno"], + [Z_PATH="${with_zlib}/lib"], + [AC_MSG_NOTICE([failed to make Z_PATH])] +) +AC_SUBST(Z_PATH, $Z_PATH) + dnl needed for sqllite AC_CHECK_LIB(dl, dlopen) @@ -198,25 +210,41 @@ AS_IF([test "x$with_libewf" != "xno"], )] dnl Check for the header file first to make sure they have the dev install [AC_CHECK_HEADERS([libewf.h], - [AC_CHECK_LIB([ewf], [libewf_get_version])] + [AC_CHECK_LIB([ewf], [libewf_get_version], [], [NO_LIBEWF=true])] )] ) AS_IF([test "x$ac_cv_lib_ewf_libewf_get_version" = "xyes"], [ax_libewf=yes], [ax_libewf=no]) +AM_CONDITIONAL([X_LIBEWF],[test "x$with_libewf" != "xno" && test "x$with_libewf" != "xyes"]) +AS_IF([test "x$with_libewf" != "xno"], + [EWF_PATH="${with_libewf}/lib"], +) +AC_SUBST(EWF_PATH, $EWF_PATH) + +dnl sqlite requires pthread libraries - this was copied from its configure.ac +dnl AC_SEARCH_LIBS(pthread_create, pthread) +AC_SEARCH_LIBS(dlopen, dl) + dnl Test for java/jni so that we can compile the java bindings -AC_PROG_JAVAC -if test "x$JAVAC" != x; then - AX_JNI_INCLUDE_DIR - for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS - do - JNI_CPPFLAGS="$JNI_CPPFLAGS -I$JNI_INCLUDE_DIR" - done - dnl Export the paths so that the makefile gets them - AC_SUBST(JNI_CPPFLAGS, $JNI_CPPFLAGS) -fi -AM_CONDITIONAL([X_JNI],[test "x$JNI_CPPFLAGS" != x]) +AS_IF([test "x$enable_java" != "xno"], [ + AC_PROG_JAVAC + if test "x$JAVAC" != x; then + AX_JNI_INCLUDE_DIR + for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS + do + JNI_CPPFLAGS="$JNI_CPPFLAGS -I$JNI_INCLUDE_DIR" + done + dnl Export the paths so that the makefile gets them + AC_SUBST(JNI_CPPFLAGS, $JNI_CPPFLAGS) + fi + AC_PROG_JAVA +]) dnl test enable_java + +dnl Test is ant is available +AC_PATH_PROG([ANT_FOUND], [ant], []) +AM_CONDITIONAL([X_JNI],[test "x$JNI_CPPFLAGS" != x && test "x$ANT_FOUND" != x && test "x$JAVA" != x]) -AS_IF([test "x$JNI_CPPFLAGS" != x], [ax_java_support=yes], [ax_java_support=no]) +AS_IF([test "x$JNI_CPPFLAGS" != x && test "x$ANT_FOUND" != x && test "x$JAVA" != x], [ax_java_support=yes], [ax_java_support=no]) AC_CONFIG_COMMANDS([tsk/tsk_incs.h], [echo "#ifndef _TSK_INCS_H" > tsk/tsk_incs.h @@ -274,6 +302,7 @@ AC_CONFIG_FILES([ tests/Makefile samples/Makefile man/Makefile + bindings/java/Makefile bindings/java/jni/Makefile unit_tests/Makefile unit_tests/base/Makefile]) diff --git a/m4/ac_prog_java.m4 b/m4/ac_prog_java.m4 new file mode 100644 index 0000000000000000000000000000000000000000..1ba1688702ae9dbe97edfe5cc40a9412d24df64b --- /dev/null +++ b/m4/ac_prog_java.m4 @@ -0,0 +1,83 @@ +dnl @synopsis AC_PROG_JAVA +dnl +dnl Here is a summary of the main macros: +dnl +dnl AC_PROG_JAVAC: finds a Java compiler. +dnl +dnl AC_PROG_JAVA: finds a Java virtual machine. +dnl +dnl AC_CHECK_CLASS: finds if we have the given class (beware of +dnl CLASSPATH!). +dnl +dnl AC_CHECK_RQRD_CLASS: finds if we have the given class and stops +dnl otherwise. +dnl +dnl AC_TRY_COMPILE_JAVA: attempt to compile user given source. +dnl +dnl AC_TRY_RUN_JAVA: attempt to compile and run user given source. +dnl +dnl AC_JAVA_OPTIONS: adds Java configure options. +dnl +dnl AC_PROG_JAVA tests an existing Java virtual machine. It uses the +dnl environment variable JAVA then tests in sequence various common +dnl Java virtual machines. For political reasons, it starts with the +dnl free ones. You *must* call [AC_PROG_JAVAC] before. +dnl +dnl If you want to force a specific VM: +dnl +dnl - at the configure.in level, set JAVA=yourvm before calling +dnl AC_PROG_JAVA +dnl +dnl (but after AC_INIT) +dnl +dnl - at the configure level, setenv JAVA +dnl +dnl You can use the JAVA variable in your Makefile.in, with @JAVA@. +dnl +dnl *Warning*: its success or failure can depend on a proper setting of +dnl the CLASSPATH env. variable. +dnl +dnl TODO: allow to exclude virtual machines (rationale: most Java +dnl programs cannot run with some VM like kaffe). +dnl +dnl Note: This is part of the set of autoconf M4 macros for Java +dnl programs. It is VERY IMPORTANT that you download the whole set, +dnl some macros depend on other. Unfortunately, the autoconf archive +dnl does not support the concept of set of macros, so I had to break it +dnl for submission. +dnl +dnl A Web page, with a link to the latest CVS snapshot is at +dnl <http://www.internatif.org/bortzmeyer/autoconf-Java/>. +dnl +dnl This is a sample configure.in Process this file with autoconf to +dnl produce a configure script. +dnl +dnl AC_INIT(UnTag.java) +dnl +dnl dnl Checks for programs. +dnl AC_CHECK_CLASSPATH +dnl AC_PROG_JAVAC +dnl AC_PROG_JAVA +dnl +dnl dnl Checks for classes +dnl AC_CHECK_RQRD_CLASS(org.xml.sax.Parser) +dnl AC_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver) +dnl +dnl AC_OUTPUT(Makefile) +dnl +dnl @category Java +dnl @author Stephane Bortzmeyer <bortzmeyer@pasteur.fr> +dnl @version 2000-07-19 +dnl @license GPLWithACException + +AC_DEFUN([AC_PROG_JAVA],[ +AC_REQUIRE([AC_EXEEXT])dnl +if test x$JAVAPREFIX = x; then + test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe$EXEEXT java$EXEEXT) +else + test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe$EXEEXT java$EXEEXT, $JAVAPREFIX) +fi +test x$JAVA = x && AC_MSG_WARN([no acceptable Java virtual machine found in \$PATH]) +AC_PROG_JAVA_WORKS +AC_PROVIDE([$0])dnl +]) diff --git a/m4/ac_prog_java_works.m4 b/m4/ac_prog_java_works.m4 new file mode 100644 index 0000000000000000000000000000000000000000..cc71eb2866f39219183436a4814ac7ab9bf11051 --- /dev/null +++ b/m4/ac_prog_java_works.m4 @@ -0,0 +1,101 @@ +dnl @synopsis AC_PROG_JAVA_WORKS +dnl +dnl Internal use ONLY. +dnl +dnl Note: This is part of the set of autoconf M4 macros for Java +dnl programs. It is VERY IMPORTANT that you download the whole set, +dnl some macros depend on other. Unfortunately, the autoconf archive +dnl does not support the concept of set of macros, so I had to break it +dnl for submission. The general documentation, as well as the sample +dnl configure.in, is included in the AC_PROG_JAVA macro. +dnl +dnl @category Java +dnl @author Stephane Bortzmeyer <bortzmeyer@pasteur.fr> +dnl @version 2000-07-19 +dnl @license GPLWithACException + +AC_DEFUN([AC_PROG_JAVA_WORKS], [ +AC_CHECK_PROG(uudecode, uudecode$EXEEXT, yes) +if test x$JAVA != x; then +if test x$uudecode = xyes; then +AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [ +dnl /** +dnl * Test.java: used to test if java compiler works. +dnl */ +dnl public class Test +dnl { +dnl +dnl public static void +dnl main( String[] argv ) +dnl { +dnl System.exit (0); +dnl } +dnl +dnl } +cat << \EOF > Test.uue +begin-base64 644 Test.class +yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE +bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51 +bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s +YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG +aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB +AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB +AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ= +==== +EOF +if uudecode$EXEEXT Test.uue; then + ac_cv_prog_uudecode_base64=yes +else + echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AC_FD_CC + echo "configure: failed file was:" >&AC_FD_CC + cat Test.uue >&AC_FD_CC + ac_cv_prog_uudecode_base64=no +fi +rm -f Test.uue]) +fi +if test x$ac_cv_prog_uudecode_base64 != xyes; then + rm -f Test.class + AC_MSG_WARN([I have to compile Test.class from scratch]) + if test x$ac_cv_prog_javac_works = xno; then + AC_MSG_ERROR([Cannot compile java source. $JAVAC does not work properly]) + fi + if test x$ac_cv_prog_javac_works = x; then + AC_PROG_JAVAC + fi +fi +AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [ +JAVA_TEST=Test.java +CLASS_TEST=Test.class +TEST=Test +changequote(, )dnl +cat << \EOF > $JAVA_TEST +/* [#]line __oline__ "configure" */ +public class +Test { +public static void main (String args[]) { + System.exit(0); +} } +EOF +changequote([, ])dnl +if test x$ac_cv_prog_uudecode_base64 != xyes; then + if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then + : + else + echo "configure: failed program was:" >&AC_FD_CC + cat $JAVA_TEST >&AC_FD_CC + AC_MSG_ERROR(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)) + fi +fi + if AC_TRY_COMMAND($JAVA $JAVAFLAGS $TEST) >/dev/null 2>&1; then + ac_cv_prog_java_works=yes +else + echo "configure: failed program was:" >&AC_FD_CC + cat $JAVA_TEST >&AC_FD_CC + AC_MSG_ERROR(The Java VM $JAVA failed (see config.log, check the CLASSPATH?)) +fi +rm -fr $JAVA_TEST $CLASS_TEST Test.uue]) +AC_PROVIDE([$0])dnl +fi +] +) +