package ru.serce.jnrfuse.struct;
import jnr.ffi.Runtime;
import jnr.ffi.Struct;
import jnr.posix.util.Platform;
import static jnr.posix.util.Platform.IS_32_BIT;
import static jnr.posix.util.Platform.IS_64_BIT;
/**
* stat data structure
*
* @author Sergey Tselovalnikov
* @since 31.05.15
*/
public class FileStat extends Struct {
public static final int S_IFIFO = 0010000; // named pipe (fifo)
public static final int S_IFCHR = 0020000; // character special
public static final int S_IFDIR = 0040000; // directory
public static final int S_IFBLK = 0060000; // block special
public static final int S_IFREG = 0100000; // regular
public static final int S_IFLNK = 0120000; // symbolic link
public static final int S_IFSOCK = 0140000; // socket
public static final int S_IFMT = 0170000; // file mask for type checks
public static final int S_ISUID = 0004000; // set user id on execution
public static final int S_ISGID = 0002000; // set group id on execution
public static final int S_ISVTX = 0001000; // save swapped text even after use
public static final int S_IRUSR = 0000400; // read permission, owner
public static final int S_IWUSR = 0000200; // write permission, owner
public static final int S_IXUSR = 0000100; // execute/search permission, owner
public static final int S_IRGRP = 0000040; // read permission, group
public static final int S_IWGRP = 0000020; // write permission, group
public static final int S_IXGRP = 0000010; // execute/search permission, group
public static final int S_IROTH = 0000004; // read permission, other
public static final int S_IWOTH = 0000002; // write permission, other
public static final int S_IXOTH = 0000001; // execute permission, other
public static final int ALL_READ = S_IRUSR | S_IRGRP | S_IROTH;
public static final int ALL_WRITE = S_IWUSR | S_IWGRP | S_IWOTH;
public static final int S_IXUGO = S_IXUSR | S_IXGRP | S_IXOTH;
public static boolean S_ISTYPE(int mode, int mask) {
return (mode & S_IFMT) == mask;
}
public static boolean S_ISDIR(int mode) {
return S_ISTYPE(mode, S_IFDIR);
}
public static boolean S_ISCHR(int mode) {
return S_ISTYPE(mode, S_IFCHR);
}
public static boolean S_ISBLK(int mode) {
return S_ISTYPE(mode, S_IFBLK);
}
public static boolean S_ISREG(int mode) {
return S_ISTYPE(mode, S_IFREG);
}
public static boolean S_ISFIFO(int mode) {
return S_ISTYPE(mode, S_IFIFO);
}
public static boolean S_ISLNK(int mode) {
return S_ISTYPE(mode, S_IFLNK);
}
public FileStat(Runtime runtime) {
super(runtime);
if(Platform.IS_MAC) {
// typedef __uint64_t __darwin_ino64_t; /* [???] Used for 64 bit inodes */
// #define __DARWIN_STRUCT_STAT64 { \
// dev_t st_dev; /* [XSI] ID of device containing file */ \
// mode_t st_mode; /* [XSI] Mode of file (see below) */ \
// nlink_t st_nlink; /* [XSI] Number of hard links */ \
// __darwin_ino64_t st_ino; /* [XSI] File serial number */ \
// uid_t st_uid; /* [XSI] User ID of the file */ \
// gid_t st_gid; /* [XSI] Group ID of the file */ \
// dev_t st_rdev; /* [XSI] Device ID */ \
// __DARWIN_STRUCT_STAT64_TIMES \
// off_t st_size; /* [XSI] file size, in bytes */ \
// blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ \
// blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ \
// __uint32_t st_flags; /* user defined flags for file */ \
// __uint32_t st_gen; /* file generation number */ \
// __int32_t st_lspare; /* RESERVED: DO NOT USE! */ \
// __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ \
// }
// #define __DARWIN_STRUCT_STAT64_TIMES \
// struct timespec st_atimespec; /* time of last access */ \
// struct timespec st_mtimespec; /* time of last data modification */ \
// struct timespec st_ctimespec; /* time of last status change */ \
// struct timespec st_birthtime; /* time of file creation(birth) */
st_dev = new dev_t();
st_mode = new mode_t();
st_nlink = new nlink_t();
st_ino = new u_int64_t();
st_uid = new uid_t();
st_gid = new gid_t();
st_rdev = new dev_t();
st_atim = inner(new Timespec(getRuntime()));
st_mtim = inner(new Timespec(getRuntime()));
st_ctim = inner(new Timespec(getRuntime()));
st_birthtime = inner(new Timespec(getRuntime()));
st_size = new off_t();
st_blocks = new blkcnt_t();
st_blksize = new blksize_t();
st_flags = new u_int32_t();
st_gen = new u_int32_t();
new int32_t();
new int64_t();
new int64_t();
//graveyard
pad1 = null;
pad2 = null;
__unused4 = null;
__unused5 = null;
__unused6 = null;
} else {
st_dev = new dev_t();
pad1 = IS_32_BIT ? new Unsigned16() : null;
st_ino = new UnsignedLong();
if (IS_32_BIT) {
st_mode = new mode_t();
st_nlink = new nlink_t();
} else {
st_nlink = new nlink_t();
st_mode = new mode_t();
}
st_uid = new uid_t();
st_gid = new gid_t();
st_rdev = new dev_t();
pad2 = IS_32_BIT ? new Unsigned16() : null;
st_size = new SignedLong();
st_blksize = new blksize_t();
st_blocks = new blkcnt_t();
st_atim = inner(new Timespec(getRuntime()));
st_mtim = inner(new Timespec(getRuntime()));
st_ctim = inner(new Timespec(getRuntime()));
__unused4 = IS_64_BIT ? new Signed64() : null;
__unused5 = IS_64_BIT ? new Signed64() : null;
__unused6 = new Signed64();
//graveyard
st_birthtime = null;
st_flags = null;
st_gen = null;
}
}
public final dev_t st_dev; /* Device. */
private final Unsigned16 pad1;
public final NumberField st_ino; /* File serial number. */
public final nlink_t st_nlink; /* Link count. */
public final mode_t st_mode; /* File mode. */
public final uid_t st_uid; /* User ID of the file's owner. */
public final gid_t st_gid; /* Group ID of the file's group.*/
public final dev_t st_rdev; /* Device number, if device. */
private final Unsigned16 pad2;
public final NumberField st_size; /* Size of file, in bytes. */
public final blksize_t st_blksize; /* Optimal block size for I/O. */
public final blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
public final Timespec st_atim; /* Time of last access. */
public final Timespec st_mtim; /* Time of last modification. */
public final Timespec st_ctim; /* Time of last status change. */
public final Signed64 __unused4;
public final Signed64 __unused5;
public final Signed64 __unused6;
/** MacOS specific */
public final Timespec st_birthtime; /* time of file creation(birth) */
public final u_int32_t st_flags;
public final u_int32_t st_gen;
public static FileStat of(jnr.ffi.Pointer memory) {
FileStat stat = new FileStat(Runtime.getSystemRuntime());
stat.useMemory(memory);
return stat;
}
}