package co.paralleluniverse.fuse; import jnr.ffi.provider.jffi.ClosureHelper; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import jnr.ffi.Pointer; import jnr.ffi.annotations.In; import jnr.ffi.annotations.Out; import jnr.ffi.types.dev_t; import jnr.ffi.types.gid_t; import jnr.ffi.types.mode_t; import jnr.ffi.types.off_t; import jnr.ffi.types.size_t; import jnr.ffi.types.u_int32_t; import jnr.ffi.types.uid_t; import static co.paralleluniverse.fuse.JNRUtil.toByteBuffer; import co.paralleluniverse.fuse.StructFuseOperationsIfaces.*; class Filesystem implements _readlink, _mknod, _mkdir, _unlink, _rmdir, _symlink, _rename, _link, _chmod, _chown, _truncate, _open, _read, _write, _flush, _release, _fsync, _statfs, _lock, _getattr, _fgetattr, _setxattr_MAC, _setxattr_NOT_MAC, _getxattr_MAC, _getxattr_NOT_MAC, _listxattr, _removexattr, _opendir, _readdir, _releasedir, _fsyncdir, _init, _destroy, _access, _create, _ftruncate, _utimens, _bmap, _ioctl, _poll, _write_buf, _read_buf, _flock, _fallocate { private final FuseFilesystem fs; public Filesystem(FuseFilesystem fs) { this.fs = fs; } @Override public final int _getattr(String path, Pointer stat) { return fs.getattr(path, fs.defaultStat(new StructStat(stat, path))); } @Override public final int _readlink(String path, Pointer buffer, @size_t long size) { final ByteBuffer buf = toByteBuffer(buffer, size); final int result = fs.readlink(path, buf, size); if (result == 0) { try { buf.put((byte) 0); } catch (final BufferOverflowException e) { ((ByteBuffer) buf.position(buf.limit() - 1)).put((byte) 0); } } return result; } @Override public final int _mknod(String path, @mode_t long mode, @dev_t long dev) { return fs.mknod(path, mode, dev); } @Override public final int _mkdir(String path, @mode_t long mode) { return fs.mkdir(path, mode); } @Override public final int _unlink(String path) { return fs.unlink(path); } @Override public final int _rmdir(String path) { return fs.rmdir(path); } @Override public final int _symlink(String path, String target) { return fs.symlink(path, target); } @Override public final int _rename(String path, String newName) { return fs.rename(path, newName); } @Override public final int _link(String path, String target) { return fs.link(path, target); } @Override public final int _chmod(String path, @mode_t long mode) { return fs.chmod(path, mode); } @Override public final int _chown(String path, @uid_t long uid, @gid_t long gid) { return fs.chown(path, uid, gid); } @Override public final int _truncate(String path, @off_t long offset) { return fs.truncate(path, offset); } @Override public final int _open(String path, Pointer info) { return fs.open(path, new StructFuseFileInfo(info, path)); } @Override public final int _read(String path, @Out Pointer buffer, @size_t long size, @off_t long offset, Pointer info) { final ByteBuffer buf = toByteBuffer(buffer, size); return fs.read(path, buf, size, offset, new StructFuseFileInfo(info, path)); } @Override public final int _write(String path, @In Pointer buffer, @size_t long size, @off_t long offset, Pointer info) { final ByteBuffer buf = toByteBuffer(buffer, size); return fs.write(path, buf, size, offset, new StructFuseFileInfo(info, path)); } @Override public final int _statfs(String path, Pointer statsvfs) { return fs.statfs(path, new StructStatvfs(statsvfs, path)); } @Override public final int _flush(String path, Pointer info) { return fs.flush(path, new StructFuseFileInfo(info, path)); } @Override public final int _release(String path, Pointer info) { return fs.release(path, new StructFuseFileInfo(info, path)); } @Override public final int _fsync(String path, int datasync, @In Pointer info) { return fs.fsync(path, datasync, new StructFuseFileInfo(info, path)); } @Override public final int _setxattr(String path, String xattr, Pointer value, @size_t long size, int flags) { return _setxattr(path, xattr, value, size, flags, 0); } @Override public final int _setxattr(String path, String xattr, Pointer value, @size_t long size, int flags, int position) { final ByteBuffer val = toByteBuffer(value, size); return fs.setxattr(path, xattr, val, size, flags, position); } @Override public final int _getxattr(String path, String xattr, Pointer buffer, @size_t long size) { return _getxattr(path, xattr, buffer, size, 0); } @Override public final int _getxattr(String path, String xattr, Pointer buffer, @size_t long size, @u_int32_t long position) { final XattrFiller filler = new XattrFiller(buffer == null ? null : toByteBuffer(buffer, size), size, (int) position); final int result = fs.getxattr(path, xattr, filler, size, position); return result < 0 ? result : (int) filler.getSize(); } @Override public final int _listxattr(String path, Pointer buffer, @size_t long size) { final XattrListFiller filler = new XattrListFiller(buffer == null ? null : toByteBuffer(buffer, size), size); final int result = fs.listxattr(path, filler); return result < 0 ? result : (int) filler.requiredSize(); } @Override public final int _removexattr(String path, String xattr) { return fs.removexattr(path, xattr); } @Override public final int _opendir(String path, Pointer info) { return fs.opendir(path, new StructFuseFileInfo(info, path)); } @Override public final int _readdir(String path, Pointer buf, Pointer fillFunction, @off_t long offset, @In Pointer info) { return fs.readdir(path, new StructFuseFileInfo(info, path), new DirectoryFillerImpl(buf, ClosureHelper.getInstance().fromNative(fillFunction, DirectoryFillerImpl.fuse_fill_dir_t.class))); } @Override public final int _releasedir(String path, Pointer info) { return fs.releasedir(path, new StructFuseFileInfo(info, path)); } @Override public final int _fsyncdir(String path, int datasync, @In Pointer info) { return fs.fsyncdir(path, datasync, new StructFuseFileInfo(info, path)); } @Override public final void _init(Pointer conn) { fs.init(); } @Override public final void _destroy() { fs.destroy(); fs._destroy(); } @Override public final int _access(String path, int access) { return fs.access(path, access); } @Override public final int _create(String path, @mode_t long mode, Pointer info) { return fs.create(path, mode, new StructFuseFileInfo(info, path)); } @Override public final int _ftruncate(String path, @off_t long offset, @In Pointer info) { return fs.ftruncate(path, offset, new StructFuseFileInfo(info, path)); } @Override public final int _fgetattr(String path, Pointer stat, Pointer info) { return fs.fgetattr(path, fs.defaultStat(new StructStat(stat, path)), new StructFuseFileInfo(info, path)); } @Override public final int _lock(String path, Pointer info, int cmd, Pointer flock) { final StructFuseFileInfo fileWrapper = new StructFuseFileInfo(info, path); final StructFlock flockWrapper = new StructFlock(flock, path); final int result = fs.lock(path, fileWrapper, cmd, flockWrapper); return result; } @Override public final int _utimens(String path, Pointer timebuffer) { return fs.utimens(path, new StructTimeBuffer(timebuffer)); } @Override public final int _bmap(String path, Pointer info) { return fs.bmap(path, new StructFuseFileInfo(info, path)); } @Override public void _ioctl(String path, int cmd, Pointer arg, Pointer fi, long flags, Pointer data) { fs.ioctl(path, cmd, arg, new StructFuseFileInfo(fi, path), flags, data); } @Override public void _poll(String path, Pointer fi, Pointer ph, Pointer reventsp) { fs.poll(path, new StructFuseFileInfo(fi, path), new StructFusePollHandle(ph), reventsp); } @Override public void _write_buf(String path, Pointer buf, long off, Pointer fi) { fs.write_buf(path, new StructFuseBufvec(buf), off, new StructFuseFileInfo(fi, path)); } @Override public void _read_buf(String path, Pointer bufp, long size, long off, Pointer fi) { fs.read_buf(path, bufp, size, off, new StructFuseFileInfo(fi, path)); } @Override public void _flock(String path, Pointer fi, int op) { fs.flock(path, new StructFuseFileInfo(fi, path), op); } @Override public void _fallocate(String path, int mode, long off, long length, Pointer fi) { fs.fallocate(path, mode, off, length, new StructFuseFileInfo(fi, path)); } }