mirror of https://github.com/M66B/FairEmail.git
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.
133 lines
3.8 KiB
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);
|
|
}
|