package co.paralleluniverse.fuse; import jnr.ffi.NativeType; import jnr.ffi.Struct; import co.paralleluniverse.fuse.StructFuseOperationsIfaces.*; import static jnr.ffi.provider.jffi.ClosureHelper.toNative; class StructFuseOperations extends Struct { private final Function<_getattr> getattr = function(_getattr.class); private final Function<_readlink> readlink = function(_readlink.class); private final Pointer getdir = new Pointer(); private final Function<_mknod> mknod = function(_mknod.class); private final Function<_mkdir> mkdir = function(_mkdir.class); private final Function<_unlink> unlink = function(_unlink.class); private final Function<_rmdir> rmdir = function(_rmdir.class); private final Function<_symlink> symlink = function(_symlink.class); private final Function<_rename> rename = function(_rename.class); private final Function<_link> link = function(_link.class); private final Function<_chmod> chmod = function(_chmod.class); private final Function<_chown> chown = function(_chown.class); private final Function<_truncate> truncate = function(_truncate.class); private final Pointer utime = new Pointer(); private final Function<_open> open = function(_open.class); private final Function<_read> read = function(_read.class); private final Function<_write> write = function(_write.class); private final Function<_statfs> statfs = function(_statfs.class); private final Function<_flush> flush = function(_flush.class); private final Function<_release> release = function(_release.class); private final Function<_fsync> fsync = function(_fsync.class); private final Pointer setxattr = new Pointer(); private final Pointer getxattr = new Pointer(); private final Function<_listxattr> listxattr = function(_listxattr.class); private final Function<_removexattr> removexattr = function(_removexattr.class); private final Function<_opendir> opendir = function(_opendir.class); private final Function<_readdir> readdir = function(_readdir.class); private final Function<_releasedir> releasedir = function(_releasedir.class); private final Function<_fsyncdir> fsyncdir = function(_fsyncdir.class); private final Function<_init> init = function(_init.class); private final Function<_destroy> destroy = function(_destroy.class); private final Function<_access> access = function(_access.class); private final Function<_create> create = function(_create.class); private final Function<_ftruncate> ftruncate = function(_ftruncate.class); private final Function<_fgetattr> fgetattr = function(_fgetattr.class); private final Function<_lock> lock = function(_lock.class); private final Function<_utimens> utimens = function(_utimens.class); private final Function<_bmap> bmap = function(_bmap.class); /** * Flag indicating that the filesystem can accept a NULL path * as the first argument for the following operations: * * read, write, flush, release, fsync, readdir, releasedir, * fsyncdir, ftruncate, fgetattr, lock, ioctl and poll * * If this flag is set these operations continue to work on * unlinked files even if "-ohard_remove" option was specified. */ private final Padding flag_nullpath_ok = new Padding(NativeType.UCHAR, 1); /** * Flag indicating that the path need not be calculated for * the following operations: * * read, write, flush, release, fsync, readdir, releasedir, * fsyncdir, ftruncate, fgetattr, lock, ioctl and poll * * Closely related to flag_nullpath_ok, but if this flag is * set then the path will not be calculaged even if the file * wasn't unlinked. However the path can still be non-NULL if * it needs to be calculated for some other reason. */ private final Padding flag_nopath = new Padding(NativeType.UCHAR, 1); /** * Flag indicating that the filesystem accepts special * UTIME_NOW and UTIME_OMIT values in its utimens operation. */ private final Padding flag_utime_omit_ok = new Padding(NativeType.UCHAR, 1); /** * Reserved flags, don't set */ private final Padding flag_reserved = new Padding(NativeType.UCHAR, 1); private final Function<_ioctl> ioctl = function(_ioctl.class); private final Function<_poll> poll = function(_poll.class); private final Pointer write_buf = new Pointer(); private final Pointer read_buf = new Pointer(); private final Function<_flock> flock = function(_flock.class); private final Function<_fallocate> fallocate = function(_fallocate.class); @SuppressWarnings("unused") public StructFuseOperations(jnr.ffi.Runtime runtime, FuseFilesystem fs) { super(runtime); final Filesystem filesystem = new Filesystem(fs); getattr.set(filesystem); readlink.set(filesystem); mknod.set(filesystem); mkdir.set(filesystem); unlink.set(filesystem); rmdir.set(filesystem); symlink.set(filesystem); rename.set(filesystem); link.set(filesystem); chmod.set(filesystem); chown.set(filesystem); truncate.set(filesystem); utime.set((jnr.ffi.Pointer) null); open.set(filesystem); read.set(filesystem); write.set(filesystem); statfs.set(filesystem); flush.set(filesystem); release.set(filesystem); fsync.set(filesystem); switch (Platform.platform()) { case MAC: case MAC_MACFUSE: setxattr.set(toNative(_setxattr_MAC.class, filesystem)); getxattr.set(toNative(_getxattr_MAC.class, filesystem)); break; default: setxattr.set(toNative(_setxattr_NOT_MAC.class, filesystem)); getxattr.set(toNative(_getxattr_NOT_MAC.class, filesystem)); } listxattr.set(filesystem); removexattr.set(filesystem); opendir.set(filesystem); readdir.set(filesystem); releasedir.set(filesystem); fsyncdir.set(filesystem); init.set(filesystem); destroy.set(filesystem); access.set(filesystem); create.set(filesystem); ftruncate.set(filesystem); fgetattr.set(filesystem); lock.set(filesystem); utimens.set(filesystem); bmap.set(filesystem); ioctl.set(filesystem); poll.set(filesystem); flock.set(filesystem); fallocate.set(filesystem); } }