aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/unix/ErrnoFileStatus.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/unix/ErrnoFileStatus.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/unix/ErrnoFileStatus.java94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/unix/ErrnoFileStatus.java b/src/main/java/com/google/devtools/build/lib/unix/ErrnoFileStatus.java
new file mode 100644
index 0000000000..fa0c3a7b61
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/unix/ErrnoFileStatus.java
@@ -0,0 +1,94 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.unix;
+
+import com.google.devtools.build.lib.UnixJniLoader;
+
+
+/**
+ * A subsclass of FileStatus which contains an errno.
+ * If there is an error, all other data fields are undefined.
+ */
+public class ErrnoFileStatus extends FileStatus {
+
+ private final int errno;
+
+ // These constants are passed in from JNI via ErrnoConstants.
+ public static final int ENOENT;
+ public static final int EACCES;
+ public static final int ELOOP;
+ public static final int ENOTDIR;
+ public static final int ENAMETOOLONG;
+
+ static {
+ ErrnoConstants constants = ErrnoConstants.getErrnoConstants();
+ ENOENT = constants.ENOENT;
+ EACCES = constants.EACCES;
+ ELOOP = constants.ELOOP;
+ ENOTDIR = constants.ENOTDIR;
+ ENAMETOOLONG = constants.ENAMETOOLONG;
+ }
+
+ /**
+ * Constructs a ErrnoFileSatus instance. (Called only from JNI code.)
+ */
+ private ErrnoFileStatus(int st_mode, int st_atime, int st_atimensec, int st_mtime,
+ int st_mtimensec, int st_ctime, int st_ctimensec, long st_size,
+ int st_dev, long st_ino) {
+ super(st_mode, st_atime, st_atimensec, st_mtime, st_mtimensec, st_ctime, st_ctimensec, st_size,
+ st_dev, st_ino);
+ this.errno = 0;
+ }
+
+ /**
+ * Constructs a ErrnoFileSatus instance. (Called only from JNI code.)
+ */
+ private ErrnoFileStatus(int errno) {
+ super(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ this.errno = errno;
+ }
+
+ public int getErrno() {
+ return errno;
+ }
+
+ public boolean hasError() {
+ // errno = 0 means the operation succeeded.
+ return errno != 0;
+ }
+
+ // Used to transfer the constants from native to java code.
+ private static class ErrnoConstants {
+
+ // These are set in JNI.
+ private int ENOENT;
+ private int EACCES;
+ private int ELOOP;
+ private int ENOTDIR;
+ private int ENAMETOOLONG;
+
+ public static ErrnoConstants getErrnoConstants() {
+ ErrnoConstants constants = new ErrnoConstants();
+ constants.initErrnoConstants();
+ return constants;
+ }
+
+ static {
+ UnixJniLoader.loadJni();
+ }
+
+ private native void initErrnoConstants();
+ }
+}