/* * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at * http://www.eclipse.org/legal/epl-2.0. * * This Source Code may also be made available under the following Secondary * Licenses when the conditions for such availability set forth in the * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, * version 2 with the GNU Classpath Exception, which is available at * https://www.gnu.org/software/classpath/license.html. * * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ package com.sun.mail.mbox; import java.io.File; import java.io.FileDescriptor; import java.util.StringTokenizer; public class UNIXFile extends File { protected static final boolean loaded; protected static final int lockType; private static final long serialVersionUID = -7972156315284146651L; public UNIXFile(String name) { super(name); } // lock type enum protected static final int NONE = 0; protected static final int NATIVE = 1; protected static final int JAVA = 2; static { String lt = System.getProperty("mail.mbox.locktype", "native"); int type = NATIVE; if (lt.equalsIgnoreCase("none")) type = NONE; else if (lt.equalsIgnoreCase("java")) type = JAVA; lockType = type; boolean lloaded = false; if (lockType == NATIVE) { try { System.loadLibrary("mbox"); lloaded = true; } catch (UnsatisfiedLinkError e) { String classpath = System.getProperty("java.class.path"); String sep = System.getProperty("path.separator"); String arch = System.getProperty("os.arch"); StringTokenizer st = new StringTokenizer(classpath, sep); while (st.hasMoreTokens()) { String path = st.nextToken(); if (path.endsWith("/classes") || path.endsWith("/mail.jar") || path.endsWith("/javax.mail.jar")) { int i = path.lastIndexOf('/'); String libdir = path.substring(0, i + 1) + "lib/"; String lib = libdir + arch + "/libmbox.so"; try { System.load(lib); lloaded = true; break; } catch (UnsatisfiedLinkError e2) { lib = libdir + "libmbox.so"; try { System.load(lib); lloaded = true; break; } catch (UnsatisfiedLinkError e3) { continue; } } } } } } loaded = lloaded; if (loaded) initIDs(FileDescriptor.class, FileDescriptor.in); } /** * Return the access time of the file. */ public static long lastAccessed(File file) { return lastAccessed0(file.getPath()); } public long lastAccessed() { return lastAccessed0(getPath()); } private static native void initIDs(Class fdClass, FileDescriptor stdin); /** * Lock the file referred to by fd. The string mode is "r" * for a read lock or "rw" for a write lock. Don't block * if lock can't be acquired. */ public static boolean lock(FileDescriptor fd, String mode) { return lock(fd, mode, false); } /** * Lock the file referred to by fd. The string mode is "r" * for a read lock or "rw" for a write lock. If block is set, * block waiting for the lock if necessary. */ private static boolean lock(FileDescriptor fd, String mode, boolean block) { //return loaded && lock0(fd, mode); if (loaded) { boolean ret; //System.out.println("UNIXFile.lock(" + fd + ", " + mode + ")"); ret = lock0(fd, mode, block); //System.out.println("UNIXFile.lock returns " + ret); return ret; } return false; } private static native boolean lock0(FileDescriptor fd, String mode, boolean block); public static native long lastAccessed0(String name); }