blob: 8c0a048ade85ae864e28296e48c46d6a59319964 [file] [log] [blame]
package jnr.posix;
import jnr.posix.util.WindowsHelpers;
import jnr.posix.windows.CommonFileInformation;
public class WindowsRawFileStat extends AbstractJavaFileStat implements NanosecondFileStat {
private int st_atime;
private long st_atimensec;
private long st_mtimensec;
private long st_ctimensec;
private int st_rdev;
private int st_dev;
private int st_nlink;
private int st_mode;
private long st_size;
private int st_ctime;
private int st_mtime;
public WindowsRawFileStat(POSIX posix, POSIXHandler handler) {
super(posix, handler);
}
public void setup(String path, CommonFileInformation fileInfo) {
st_mode = fileInfo.getMode(path);
setup(fileInfo);
if (WindowsHelpers.isDriveLetterPath(path)) {
int letterAsNumber = Character.toUpperCase(path.charAt(0)) - 'A';
st_rdev = letterAsNumber;
st_dev = letterAsNumber;
}
}
public void setup(CommonFileInformation fileInfo) {
long atime = fileInfo.getLastAccessTimeNanoseconds();
st_atimensec = atime % CommonFileInformation.NANOSECONDS;
st_atime = (int) (atime / CommonFileInformation.NANOSECONDS);
long mtime = fileInfo.getLastWriteTimeNanoseconds();
st_mtimensec = mtime % CommonFileInformation.NANOSECONDS;
st_mtime = (int) (mtime / CommonFileInformation.NANOSECONDS);
long ctime = fileInfo.getCreationTimeNanoseconds();
st_ctimensec = ctime % CommonFileInformation.NANOSECONDS;
st_ctime = (int) (ctime / CommonFileInformation.NANOSECONDS);
st_size = isDirectory() ? 0 : fileInfo.getFileSize();
st_nlink = 1;
st_mode &= ~(S_IWGRP | S_IWOTH);
}
public int mode() {
return st_mode;
}
@Override
public long mtime() {
return st_mtime;
}
public long atime() {
return st_atime;
}
@Override
public long aTimeNanoSecs() {
return st_atimensec;
}
@Override
public long cTimeNanoSecs() {
return st_ctimensec;
}
@Override
public long mTimeNanoSecs() {
return st_mtimensec;
}
public long dev() {
return st_dev;
}
public int nlink() {
return st_nlink;
}
public long rdev() {
return st_rdev;
}
@Override
public long st_size() {
return st_size;
}
@Override
public long ctime() {
return st_ctime;
}
public boolean isDirectory() {
return (mode() & S_IFMT) == S_IFDIR;
}
public boolean isEmpty() {
return st_size() == 0;
}
@Override
public boolean isExecutable() {
if (isOwned()) return (mode() & S_IXUSR) != 0;
if (isGroupOwned()) return (mode() & S_IXGRP) != 0;
if ((mode() & S_IXOTH) != 0) return false;
return true;
}
@Override
public boolean isExecutableReal() {
if (isROwned()) return (mode() & S_IXUSR) != 0;
if (groupMember(gid())) return (mode() & S_IXGRP) != 0;
if ((mode() & S_IXOTH) != 0) return false;
return true;
}
public boolean isFile() {
return (mode() & S_IFMT) == S_IFREG;
}
public boolean isFifo() {
return (mode() & S_IFMT) == S_IFIFO;
}
public boolean isGroupOwned() {
return groupMember(gid());
}
public boolean isIdentical(FileStat other) {
return dev() == other.dev() && ino() == other.ino();
}
public boolean isNamedPipe() {
return (mode() & S_IFIFO) != 0;
}
// FIXME: Implement
@Override
public boolean isOwned() {
return true;
}
// FIXME: Implement
@Override
public boolean isROwned() {
return true;
}
@Override
public boolean isReadable() {
if (isOwned()) return (mode() & S_IRUSR) != 0;
if (isGroupOwned()) return (mode() & S_IRGRP) != 0;
if ((mode() & S_IROTH) != 0) return false;
return true;
}
@Override
public boolean isReadableReal() {
if (isROwned()) return (mode() & S_IRUSR) != 0;
if (groupMember(gid())) return (mode() & S_IRGRP) != 0;
if ((mode() & S_IROTH) != 0) return false;
return true;
}
public boolean isSetgid() {
return (mode() & S_ISGID) != 0;
}
public boolean isSetuid() {
return (mode() & S_ISUID) != 0;
}
public boolean isSocket() {
return (mode() & S_IFMT) == S_IFSOCK;
}
public boolean isSticky() {
return (mode() & S_ISVTX) != 0;
}
public boolean isSymlink() {
return (mode() & S_IFMT) == S_IFLNK;
}
@Override
public boolean isWritable() {
if (isOwned()) return (mode() & S_IWUSR) != 0;
if (isGroupOwned()) return (mode() & S_IWGRP) != 0;
if ((mode() & S_IWOTH) != 0) return false;
return true;
}
@Override
public boolean isWritableReal() {
if (isROwned()) return (mode() & S_IWUSR) != 0;
if (groupMember(gid())) return (mode() & S_IWGRP) != 0;
if ((mode() & S_IWOTH) != 0) return false;
return true;
}
}