Introduce mbox support
[gpl/argeo-slc.git] / ext / javax.mail.mbox / src / com / sun / mail / mbox / UNIXFile.java
diff --git a/ext/javax.mail.mbox/src/com/sun/mail/mbox/UNIXFile.java b/ext/javax.mail.mbox/src/com/sun/mail/mbox/UNIXFile.java
new file mode 100644 (file)
index 0000000..ab1579e
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * 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);
+}