package co.paralleluniverse.fuse; import jnr.ffi.Pointer; import jnr.ffi.Runtime; import jnr.ffi.StructLayout; public class StructFuseFileInfo { private static final class Layout extends StructLayout { private Layout(Runtime runtime) { super(runtime); } public final Signed32 flags = new Signed32(); public final SignedLong fh_old = new SignedLong(); public final Signed32 writepage = new Signed32(); public final Signed32 flags_bitfield = new Signed32(); public final Unsigned64 fh = new Unsigned64(); public final Unsigned64 lock_owner = new Unsigned64(); } private static final Layout layout = new Layout(Runtime.getSystemRuntime()); private final Pointer p; private final String path; StructFuseFileInfo(Pointer p, String path) { this.p = p; this.path = path; } @Override public final java.lang.String toString() { if (path != null) return path + "\n" + JNRUtil.toString(layout, p); return JNRUtil.toString(layout, p); } // FuseFileInfo(final FuseFileInfo fileinfo) { // this(null, fileinfo); // } public final boolean append() { return (layout.flags.intValue(p) & O_APPEND) != 0; } public final StructFuseFileInfo append(boolean append) { layout.flags.set(p, (layout.flags.get(p) & ~O_APPEND) | (append ? O_APPEND : 0)); return this; } public final boolean create() { return (layout.flags.get(p) & O_CREAT) != 0; } public final StructFuseFileInfo create(boolean create) { layout.flags.set(p, (layout.flags.get(p) & ~O_CREAT) | (create ? O_CREAT : 0)); return this; } public final boolean noblock() { return (layout.flags.get(p) & O_NONBLOCK) != 0; } public final StructFuseFileInfo noblock(boolean value) { layout.flags.set(p, (layout.flags.get(p) & ~O_NONBLOCK) | (value ? O_NONBLOCK : 0)); return this; } public final boolean direct_io() { return (layout.flags_bitfield.get(p) & BIT_DIRECT_IO) != 0; } public final StructFuseFileInfo direct_io(boolean direct_io) { if (direct_io) layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) | BIT_DIRECT_IO); else layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) & ~BIT_DIRECT_IO); return this; } public final long fh() { return layout.fh.get(p); } public final StructFuseFileInfo fh(long fh) { layout.fh.set(p, fh); return this; } public final long fh_old() { return layout.fh_old.get(p); } public final StructFuseFileInfo fh_old(long fh_old) { layout.fh_old.set(p, fh_old); return this; } public final int flags() { return layout.flags.intValue(p); } public final StructFuseFileInfo flags(int flags) { layout.flags.set(p, flags); return this; } public final boolean flockrelease() { return (layout.flags_bitfield.get(p) & BIT_FLOCKRELEASE) != 0; } public final StructFuseFileInfo flockrelease(boolean flockrelease) { if (flockrelease) layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) | BIT_FLOCKRELEASE); else layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) & ~BIT_FLOCKRELEASE); return this; } public final boolean flush() { return (layout.flags_bitfield.get(p) & BIT_FLUSH) != 0; } public final StructFuseFileInfo flush(boolean flush) { if (flush) layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) | BIT_FLUSH); else layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) & ~BIT_FLUSH); return this; } public final boolean keep_cache() { return (layout.flags_bitfield.get(p) & BIT_KEEP_CACHE) != 0; } public final StructFuseFileInfo keep_cache(boolean keep_cache) { if (keep_cache) layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) | BIT_KEEP_CACHE); else layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) & ~BIT_KEEP_CACHE); return this; } public final long lock_owner() { return layout.lock_owner.longValue(p); } public final StructFuseFileInfo lock_owner(long lock_owner) { layout.lock_owner.set(p, lock_owner); return this; } public final boolean nonseekable() { return (layout.flags_bitfield.get(p) & BIT_NONSEEKABLE) != 0; } public final StructFuseFileInfo nonseekable(boolean nonseekable) { if (nonseekable) layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) | BIT_NONSEEKABLE); else layout.flags_bitfield.set(p, layout.flags_bitfield.get(p) & ~BIT_NONSEEKABLE); return this; } public final int openMode() { return layout.flags.intValue(p) & openMask; } public final StructFuseFileInfo openMode(int openMode) { layout.flags.set(p, (layout.flags.get(p) & ~openMask) | openMode); return this; } public final boolean truncate() { return (layout.flags.get(p) & O_TRUNC) != 0; } public final StructFuseFileInfo truncate(boolean truncate) { layout.flags.set(p, (layout.flags.get(p) & ~O_TRUNC) | (truncate ? O_TRUNC : 0)); return this; } public final boolean writepage() { return layout.writepage.get(p) != 0; } public final StructFuseFileInfo writepage(boolean writepage) { layout.writepage.set(p, writepage ? 1 : 0); return this; } public static final int openMask = 03; public static final int O_RDONLY = 00; public static final int O_WRONLY = 01; public static final int O_RDWR = 02; public static final int O_CREAT = 0100; public static final int O_EXCL = 0200; public static final int O_NOCTTY = 0400; public static final int O_TRUNC = 01000; public static final int O_APPEND = 02000; public static final int O_NONBLOCK = 04000; public static final int O_NDELAY = O_NONBLOCK; public static final int O_SYNC = 010000; public static final int O_ASYNC = 020000; public static final int O_DIRECT = 040000; public static final int O_DIRECTORY = 0200000; public static final int O_NOFOLLOW = 0400000; public static final int O_NOATIME = 01000000; public static final int O_CLOEXEC = 02000000; private static final int BIT_DIRECT_IO = 1 << 0; private static final int BIT_KEEP_CACHE = 1 << 1; private static final int BIT_FLUSH = 1 << 2; private static final int BIT_NONSEEKABLE = 1 << 3; private static final int BIT_FLOCKRELEASE = 1 << 4; }