package jnr.posix;
import jnr.ffi.
StructLayout;
// http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx
// This layout is meant to be used with stat64() family so _USE_32BIT_TIME_T is not in play.
public class
WindowsFileStat extends
BaseFileStat {
private static final class
Layout extends
StructLayout {
private
Layout(jnr.ffi.
Runtime runtime) {
super(
runtime);
}
public final
Signed32 st_dev = new
Signed32();
public final
Signed16 st_ino = new
Signed16();
public final
Signed16 st_mode = new
Signed16();
public final
Signed16 st_nlink = new
Signed16();
public final
Signed16 st_uid = new
Signed16();
public final
Signed16 st_gid = new
Signed16();
public final
Signed32 st_rdev = new
Signed32();
public final
Signed64 st_size = new
Signed64();
public final
Signed64 st_atime = new
Signed64();
public final
Signed64 st_mtime = new
Signed64();
public final
Signed64 st_ctime = new
Signed64();
}
private static final
Layout layout = new
Layout(jnr.ffi.
Runtime.
getSystemRuntime());
public
WindowsFileStat(
NativePOSIX posix) {
super(
posix,
layout);
}
public long
atime() {
return
layout.
st_atime.
get(
memory);
}
public long
blockSize() {
return 512;
}
public long
blocks() {
return (
layout.
st_size.
get(
memory) + 512 - 1) / 512;
}
public long
ctime() {
return
layout.
st_ctime.
get(
memory);
}
public long
dev() {
return
layout.
st_dev.
get(
memory);
}
public int
gid() {
return
layout.
st_gid.
get(
memory);
}
public long
ino() {
return
layout.
st_ino.
get(
memory);
}
public int
mode() {
return
layout.
st_mode.
get(
memory) & ~(
S_IWGRP |
S_IWOTH) & 0xffff;
}
public long
mtime() {
return
layout.
st_mtime.
get(
memory);
}
public int
nlink() {
return
layout.
st_nlink.
get(
memory);
}
public long
rdev() {
return
layout.
st_rdev.
get(
memory);
}
public long
st_size() {
return
layout.
st_size.
get(
memory);
}
public int
uid() {
return
layout.
st_uid.
get(
memory);
}
// FIXME: Implement
@
Override
public boolean
groupMember(int
gid) {
return true;
}
@
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;
}
// 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;
}
@
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;
}
@
Override
public java.lang.
String toString() {
return "st_dev: " +
layout.
st_dev.
get(
memory) +
", st_mode: " +
Integer.
toOctalString(
mode()) +
", layout.st_nlink: " +
layout.
st_nlink.
get(
memory) +
", layout.st_rdev: " +
layout.
st_rdev.
get(
memory) +
", layout.st_size: " +
layout.
st_size.
get(
memory) +
", layout.st_uid: " +
layout.
st_uid.
get(
memory) +
", layout.st_gid: " +
layout.
st_gid.
get(
memory) +
", layout.st_atime: " +
layout.
st_atime.
get(
memory) +
", layout.st_ctime: " +
layout.
st_ctime.
get(
memory) +
", layout.st_mtime: " +
layout.
st_mtime.
get(
memory) +
", layout.st_ino: " +
layout.
st_ino.
get(
memory);
}
}