/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.util.jna; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.core.internal.wc.SVNMethodCallLogger; import org.tmatesoft.svn.util.SVNDebugLog; import org.tmatesoft.svn.util.SVNLogType; import com.sun.jna.Native; /** * @version 1.3 * @author TMate Software Ltd. */ class JNALibraryLoader { private static final String GLIB_LIBRARY = "glib-2.0"; private static final String GNOME_KEYRING_LIBRARY = "gnome-keyring"; private static ISVNWinCryptLibrary ourWinCryptLibrary; private static ISVNKernel32Library ourKenrelLibrary; private static ISVNSecurityLibrary ourSecurityLibrary; private static ISVNCLibrary ourCLibrary; private static ISVNWin32Library ourWin32Library; private static ISVNMacOsSecurityLibrary ourMacOsSecurityLibrary; private static ISVNMacOsCFLibrary ourMacOsCFLibrary; private static ISVNGnomeKeyringLibrary ourGnomeKeyringLibrary; private static ISVNGLibrary ourGLibrary; private static volatile int ourUID = -1; private static volatile int ourGID = -1; static { // load win32 libraries. if (SVNFileUtil.isWindows && !SVNFileUtil.isOS2) { try { ourWinCryptLibrary = (ISVNWinCryptLibrary) Native.loadLibrary("Crypt32", ISVNWinCryptLibrary.class); ourWinCryptLibrary = SVNFileUtil.logNativeCalls && ourWinCryptLibrary != null ? new DebugProxyISVNWinCryptLibrary(ourWinCryptLibrary, SVNDebugLog.getDefaultLog()) : ourWinCryptLibrary; ourKenrelLibrary = (ISVNKernel32Library) Native.loadLibrary("Kernel32", ISVNKernel32Library.class); ourKenrelLibrary = SVNFileUtil.logNativeCalls && ourKenrelLibrary != null ? new DebugProxyISVNKernel32Library(ourKenrelLibrary, SVNDebugLog.getDefaultLog()) : ourKenrelLibrary; String securityLibraryName = getSecurityLibraryName(); ourSecurityLibrary = securityLibraryName != null ? (ISVNSecurityLibrary) Native.loadLibrary(securityLibraryName, ISVNSecurityLibrary.class) : null; ourSecurityLibrary = SVNFileUtil.logNativeCalls && ourSecurityLibrary != null ? new DebugProxyISVNSecurityLibrary(ourSecurityLibrary, SVNDebugLog.getDefaultLog()) : ourSecurityLibrary; ourWin32Library = (ISVNWin32Library) Native.loadLibrary("Shell32", ISVNWin32Library.class); ourWin32Library = SVNFileUtil.logNativeCalls && ourWin32Library != null ? new DebugProxyISVNWin32Library(ourWin32Library, SVNDebugLog.getDefaultLog()) : ourWin32Library; } catch (Throwable th) { SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, th); ourWinCryptLibrary = null; ourKenrelLibrary = null; ourSecurityLibrary = null; ourWin32Library = null; } } if (SVNFileUtil.isOSX || SVNFileUtil.isLinux || SVNFileUtil.isBSD || SVNFileUtil.isSolaris) { try { ISVNCLibrary isvncLibrary = (ISVNCLibrary) Native.loadLibrary("c", ISVNCLibrary.class); ourCLibrary = SVNFileUtil.logNativeCalls && isvncLibrary != null ? new DebugProxyISVNCLibrary(isvncLibrary, SVNDebugLog.getDefaultLog()) : isvncLibrary; SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, "C Library loaded with JNA: " + isvncLibrary); try { ourUID = ourCLibrary.getuid(); } catch (Throwable th) { SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, th); ourUID = -1; } try { ourGID = ourCLibrary.getgid(); } catch (Throwable th) { SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, th); ourGID = -1; } } catch (Throwable th) { SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, th); ourCLibrary = null; } } if (SVNFileUtil.isLinux || SVNFileUtil.isBSD || SVNFileUtil.isSolaris) { try { ISVNGnomeKeyringLibrary gnomeKeyringLibrary = (ISVNGnomeKeyringLibrary) Native.loadLibrary(getGnomeKeyringLibraryName(), ISVNGnomeKeyringLibrary.class); ISVNGLibrary gLibrary = (ISVNGLibrary) Native.loadLibrary(getGLibraryName(), ISVNGLibrary.class); Class<?>[] callSites = new Class[]{SVNGnomeKeyring.class, JNALibraryLoader.class}; if (gnomeKeyringLibrary != null) { ourGnomeKeyringLibrary = (ISVNGnomeKeyringLibrary) SVNMethodCallLogger.newInstance(gnomeKeyringLibrary, callSites); ourGnomeKeyringLibrary = SVNFileUtil.logNativeCalls && ourGnomeKeyringLibrary != null ? new DebugProxyISVNGnomeKeyringLibrary(ourGnomeKeyringLibrary, SVNDebugLog.getDefaultLog()) : ourGnomeKeyringLibrary; } else { ourGnomeKeyringLibrary = null; } if (gLibrary != null) { ourGLibrary = (ISVNGLibrary) SVNMethodCallLogger.newInstance(gLibrary, callSites); ourGLibrary = SVNFileUtil.logNativeCalls && ourGLibrary != null? new DebugProxyISVNGLibrary(ourGLibrary, SVNDebugLog.getDefaultLog()) : ourGLibrary; } else { ourGLibrary = null; } SVNGnomeKeyring.initialize(); } catch (Throwable th) { SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, th); ourGnomeKeyringLibrary = null; ourGLibrary = null; } } if (SVNFileUtil.isOSX) { try { ourMacOsSecurityLibrary = (ISVNMacOsSecurityLibrary) Native.loadLibrary("Security", ISVNMacOsSecurityLibrary.class); ourMacOsSecurityLibrary = SVNFileUtil.logNativeCalls && ourMacOsSecurityLibrary != null? new DebugProxyISVNMacOsSecurityLibrary(ourMacOsSecurityLibrary, SVNDebugLog.getDefaultLog()) : ourMacOsSecurityLibrary; ourMacOsCFLibrary = (ISVNMacOsCFLibrary) Native.loadLibrary("CoreFoundation", ISVNMacOsCFLibrary.class); ourMacOsCFLibrary = SVNFileUtil.logNativeCalls && ourMacOsCFLibrary != null? new DebugProxyISVNMacOsCFLibrary(ourMacOsCFLibrary, SVNDebugLog.getDefaultLog()) : ourMacOsCFLibrary; } catch (Throwable th) { SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, th); ourMacOsSecurityLibrary = null; ourMacOsCFLibrary = null; } } } private static String getGLibraryName() { return System.getProperty("svnkit.library.glib", GLIB_LIBRARY); } private static String getGnomeKeyringLibraryName() { return System.getProperty("svnkit.library.gnome-keyring", GNOME_KEYRING_LIBRARY); } public static int getUID() { return ourUID; } public static int getGID() { return ourGID; } public static synchronized ISVNWinCryptLibrary getWinCryptLibrary() { return ourWinCryptLibrary; } public static synchronized ISVNWin32Library getWin32Library() { return ourWin32Library; } public static synchronized ISVNKernel32Library getKernelLibrary() { return ourKenrelLibrary; } public static synchronized ISVNSecurityLibrary getSecurityLibrary() { return ourSecurityLibrary; } public static synchronized ISVNCLibrary getCLibrary() { return ourCLibrary; } public static synchronized ISVNMacOsSecurityLibrary getMacOsSecurityLibrary() { return ourMacOsSecurityLibrary; } public static synchronized ISVNMacOsCFLibrary getMacOsCFLibrary() { return ourMacOsCFLibrary; } public static synchronized ISVNGnomeKeyringLibrary getGnomeKeyringLibrary() { return ourGnomeKeyringLibrary; } public static synchronized ISVNGLibrary getGLibrary() { return ourGLibrary; } private static String getSecurityLibraryName() { ISVNKernel32Library library = getKernelLibrary(); if (library == null) { return null; } ISVNKernel32Library.OSVERSIONINFO osInfo = null; synchronized (library) { try { osInfo = new ISVNKernel32Library.OSVERSIONINFO(); osInfo.write(); int rc = library.GetVersionExW(osInfo.getPointer()); osInfo.read(); if (rc == 0) { return null; } } catch (Throwable th) { SVNDebugLog.getDefaultLog().logFine(SVNLogType.DEFAULT, th); return null; } } if (osInfo.dwPlatformId.intValue() == ISVNKernel32Library.VER_PLATFORM_WIN32_NT) { return "Security"; } else if (osInfo.dwPlatformId.intValue() == ISVNKernel32Library.VER_PLATFORM_WIN32_WINDOWS) { return "Secur32"; } return null; } }