You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
FairEmail/app/src/main/java/com/sun/mail/mbox/UNIXFile.java

133 lines
3.8 KiB

/*
* 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<FileDescriptor> 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);
}