diff options
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.java | 94 |
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(); + } +} |