# HG changeset patch # User bpb # Date 1469654866 25200 # Node ID 292bdb61fccc76a09893d4d294c3a2995e1cab9c # Parent f3b397a6efe2b249f5db0f2a3c7d40cb8f2745f8 8162624: (fs) Remove FileTypeDetectors based on libgio and libmagic Summary: Remove GioFileTypeDetector and MagicFileTypeDetector. Reviewed-by: alanb diff -r f3b397a6efe2 -r 292bdb61fccc jdk/make/mapfiles/libnio/mapfile-linux --- a/jdk/make/mapfiles/libnio/mapfile-linux Tue Jul 26 13:48:29 2016 +0530 +++ b/jdk/make/mapfiles/libnio/mapfile-linux Wed Jul 27 14:27:46 2016 -0700 @@ -136,10 +136,6 @@ Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_accept0; Java_sun_nio_ch_UnixAsynchronousServerSocketChannelImpl_initIDs; Java_sun_nio_ch_UnixAsynchronousSocketChannelImpl_checkConnect; - Java_sun_nio_fs_GioFileTypeDetector_initializeGio; - Java_sun_nio_fs_GioFileTypeDetector_probeGio; - Java_sun_nio_fs_MagicFileTypeDetector_initialize0; - Java_sun_nio_fs_MagicFileTypeDetector_probe0; Java_sun_nio_fs_LinuxWatchService_eventSize; Java_sun_nio_fs_LinuxWatchService_eventOffsets; Java_sun_nio_fs_LinuxWatchService_inotifyInit; diff -r f3b397a6efe2 -r 292bdb61fccc jdk/src/java.base/linux/classes/sun/nio/fs/GioFileTypeDetector.java --- a/jdk/src/java.base/linux/classes/sun/nio/fs/GioFileTypeDetector.java Tue Jul 26 13:48:29 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.nio.fs; - -import java.nio.file.Path; -import java.io.IOException; -import java.security.AccessController; -import java.security.PrivilegedAction; - -/** - * File type detector that uses the GNOME I/O library to guess the - * MIME type of a file. - */ - -public class GioFileTypeDetector - extends AbstractFileTypeDetector -{ - // true if GIO is available - private final boolean gioAvailable; - - public GioFileTypeDetector() { - gioAvailable = initializeGio(); - } - - @Override - public String implProbeContentType(Path obj) throws IOException { - if (!gioAvailable) - return null; - if (!(obj instanceof UnixPath)) - return null; - - UnixPath path = (UnixPath)obj; - NativeBuffer buffer = NativeBuffers.asNativeBuffer(path.getByteArrayForSysCalls()); - try { - // GIO may access file so need permission check - path.checkRead(); - byte[] type = probeGio(buffer.address()); - return (type == null) ? null : Util.toString(type); - } finally { - buffer.release(); - } - - } - - // GIO - private static native boolean initializeGio(); - // - // The probeGIO() method is synchronized to avert potential problems - // such as crashes due to a suspected lack of thread safety in GIO. - // - private static synchronized native byte[] probeGio(long pathAddress); - - static { - AccessController.doPrivileged(new PrivilegedAction<>() { - public Void run() { - System.loadLibrary("nio"); - return null; - }}); - } -} diff -r f3b397a6efe2 -r 292bdb61fccc jdk/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java --- a/jdk/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java Tue Jul 26 13:48:29 2016 +0530 +++ b/jdk/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java Wed Jul 27 14:27:46 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -106,9 +106,7 @@ Path userMimeTypes = Paths.get(userHome, ".mime.types"); Path etcMimeTypes = Paths.get("/etc/mime.types"); - return chain(new GioFileTypeDetector(), - new MimeTypesFileTypeDetector(userMimeTypes), - new MimeTypesFileTypeDetector(etcMimeTypes), - new MagicFileTypeDetector()); + return chain(new MimeTypesFileTypeDetector(userMimeTypes), + new MimeTypesFileTypeDetector(etcMimeTypes)); } } diff -r f3b397a6efe2 -r 292bdb61fccc jdk/src/java.base/linux/classes/sun/nio/fs/MagicFileTypeDetector.java --- a/jdk/src/java.base/linux/classes/sun/nio/fs/MagicFileTypeDetector.java Tue Jul 26 13:48:29 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.nio.fs; - -import java.io.IOException; -import java.nio.file.Path; -import java.security.AccessController; -import java.security.PrivilegedAction; - -/** - * File type detector that uses the libmagic to guess the MIME type of a file. - */ - -class MagicFileTypeDetector extends AbstractFileTypeDetector { - - private static final String UNKNOWN_MIME_TYPE = "application/octet-stream"; - - // true if libmagic is available and successfully loaded - private final boolean libmagicAvailable; - - public MagicFileTypeDetector() { - libmagicAvailable = initialize0(); - } - - @Override - protected String implProbeContentType(Path obj) throws IOException { - if (!libmagicAvailable || !(obj instanceof UnixPath)) - return null; - - UnixPath path = (UnixPath) obj; - path.checkRead(); - - NativeBuffer buffer = NativeBuffers.asNativeBuffer(path.getByteArrayForSysCalls()); - try { - byte[] type = probe0(buffer.address()); - String mimeType = (type == null) ? null : new String(type); - return UNKNOWN_MIME_TYPE.equals(mimeType) ? null : mimeType; - } finally { - buffer.release(); - } - } - - private static native boolean initialize0(); - - private static native byte[] probe0(long pathAddress); - - static { - AccessController.doPrivileged(new PrivilegedAction<>() { - @Override - public Void run() { - System.loadLibrary("nio"); - return null; - } - }); - } -} diff -r f3b397a6efe2 -r 292bdb61fccc jdk/src/java.base/linux/native/libnio/fs/GioFileTypeDetector.c --- a/jdk/src/java.base/linux/native/libnio/fs/GioFileTypeDetector.c Tue Jul 26 13:48:29 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include "jni.h" -#include "jni_util.h" -#include "jvm.h" -#include "jlong.h" - -#include -#include - -#ifdef __solaris__ -#include -#endif - -#if defined(__linux__) -#include -#endif - -/* - * For reference see for example the GFileInfo section at - * https://developer.gnome.org/gio/unstable/. - */ - -/* Definitions for GIO */ - -#define G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "standard::content-type" - -typedef void* gpointer; -typedef struct _GFile GFile; -typedef struct _GFileInfo GFileInfo; -typedef struct _GCancellable GCancellable; -typedef struct _GError GError; - -typedef enum { - G_FILE_QUERY_INFO_NONE = 0 -} GFileQueryInfoFlags; - -typedef void (*g_type_init_func)(void); -typedef void (*g_object_unref_func)(gpointer object); -typedef GFile* (*g_file_new_for_path_func)(const char* path); -typedef GFileInfo* (*g_file_query_info_func)(GFile *file, - const char *attributes, GFileQueryInfoFlags flags, - GCancellable *cancellable, GError **error); -typedef char* (*g_file_info_get_content_type_func)(GFileInfo *info); - -static g_type_init_func g_type_init; -static g_object_unref_func g_object_unref; -static g_file_new_for_path_func g_file_new_for_path; -static g_file_query_info_func g_file_query_info; -static g_file_info_get_content_type_func g_file_info_get_content_type; - - -#include "sun_nio_fs_GioFileTypeDetector.h" - - -JNIEXPORT jboolean JNICALL -Java_sun_nio_fs_GioFileTypeDetector_initializeGio - (JNIEnv* env, jclass this) -{ - void* gio_handle; - - gio_handle = dlopen("libgio-2.0.so", RTLD_LAZY); - if (gio_handle == NULL) { - gio_handle = dlopen("libgio-2.0.so.0", RTLD_LAZY); - if (gio_handle == NULL) { - return JNI_FALSE; - } - } - - g_type_init = (g_type_init_func)dlsym(gio_handle, "g_type_init"); - - g_object_unref = (g_object_unref_func)dlsym(gio_handle, "g_object_unref"); - - g_file_new_for_path = - (g_file_new_for_path_func)dlsym(gio_handle, "g_file_new_for_path"); - - g_file_query_info = - (g_file_query_info_func)dlsym(gio_handle, "g_file_query_info"); - - g_file_info_get_content_type = (g_file_info_get_content_type_func) - dlsym(gio_handle, "g_file_info_get_content_type"); - - if (g_object_unref == NULL || - g_file_new_for_path == NULL || - g_file_query_info == NULL || - g_file_info_get_content_type == NULL) - { - dlclose(gio_handle); - return JNI_FALSE; - } - - if (g_type_init != NULL) { - (*g_type_init)(); - } - - return JNI_TRUE; -} - -JNIEXPORT jbyteArray JNICALL -Java_sun_nio_fs_GioFileTypeDetector_probeGio - (JNIEnv* env, jclass this, jlong pathAddress) -{ - char* path = (char*)jlong_to_ptr(pathAddress); - GFile* gfile; - GFileInfo* gfileinfo; - jbyteArray result = NULL; - - gfile = (*g_file_new_for_path)(path); - gfileinfo = (*g_file_query_info)(gfile, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, - G_FILE_QUERY_INFO_NONE, NULL, NULL); - if (gfileinfo != NULL) { - const char* mime = (*g_file_info_get_content_type)(gfileinfo); - if (mime != NULL) { - jsize len = strlen(mime); - result = (*env)->NewByteArray(env, len); - if (result != NULL) { - (*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)mime); - } - } - (*g_object_unref)(gfileinfo); - } - (*g_object_unref)(gfile); - - return result; -} diff -r f3b397a6efe2 -r 292bdb61fccc jdk/src/java.base/linux/native/libnio/fs/MagicFileTypeDetector.c --- a/jdk/src/java.base/linux/native/libnio/fs/MagicFileTypeDetector.c Tue Jul 26 13:48:29 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include "jni.h" -#include "jni_util.h" -#include "jvm.h" -#include "jlong.h" - -#include -#include - -#define MAGIC_MIME_TYPE 0x000010 /* Return the MIME type */ - -typedef struct magic_set magic_t; - -typedef magic_t* (*magic_open_func)(int flags); -typedef int (*magic_load_func)(magic_t* cookie, const char* filename); -typedef const char* (*magic_file_func)(magic_t* cookie, const char* filename); -typedef void (*magic_close_func)(magic_t* cookie); - -static void* magic_handle; -static magic_open_func magic_open; -static magic_load_func magic_load; -static magic_file_func magic_file; -static magic_close_func magic_close; - -#include "sun_nio_fs_MagicFileTypeDetector.h" - -JNIEXPORT jboolean JNICALL -Java_sun_nio_fs_MagicFileTypeDetector_initialize0 - (JNIEnv* env, jclass this) -{ - magic_handle = dlopen("libmagic.so", RTLD_LAZY); - if (magic_handle == NULL) { - magic_handle = dlopen("libmagic.so.1", RTLD_LAZY); - if (magic_handle == NULL) { - return JNI_FALSE; - } - } - - magic_open = (magic_open_func)dlsym(magic_handle, "magic_open"); - - magic_load = (magic_load_func)dlsym(magic_handle, "magic_load"); - - magic_file = (magic_file_func)dlsym(magic_handle, "magic_file"); - - magic_close = (magic_close_func)dlsym(magic_handle, "magic_close"); - - if (magic_open == NULL || - magic_load == NULL || - magic_file == NULL || - magic_close == NULL) - { - dlclose(magic_handle); - return JNI_FALSE; - } - - return JNI_TRUE; -} - -JNIEXPORT jbyteArray JNICALL -Java_sun_nio_fs_MagicFileTypeDetector_probe0 - (JNIEnv* env, jclass this, jlong pathAddress) -{ - char* path = (char*)jlong_to_ptr(pathAddress); - magic_t* cookie; - jbyteArray result = NULL; - - cookie = (*magic_open)(MAGIC_MIME_TYPE); - - if (cookie != NULL) { - if ((*magic_load)(cookie, NULL) != -1) { - const char* type = (*magic_file)(cookie, path); - if (type != NULL) { - jsize len = strlen(type); - result = (*env)->NewByteArray(env, len); - if (result != NULL) { - (*env)->SetByteArrayRegion(env, result, 0, len, (jbyte*)type); - } - } - } - (*magic_close)(cookie); - } - - return result; -} diff -r f3b397a6efe2 -r 292bdb61fccc jdk/test/java/nio/file/Files/probeContentType/Basic.java --- a/jdk/test/java/nio/file/Files/probeContentType/Basic.java Tue Jul 26 13:48:29 2016 +0530 +++ b/jdk/test/java/nio/file/Files/probeContentType/Basic.java Wed Jul 27 14:27:46 2016 -0700 @@ -22,7 +22,7 @@ */ /* @test - * @bug 4313887 8129632 8129633 + * @bug 4313887 8129632 8129633 8162624 * @summary Unit test for probeContentType method * @library ../.. * @build Basic SimpleFileTypeDetector