package ru.serce.jnrfuse; import com.kenai.jffi.MemoryIO; import jnr.ffi.*; import jnr.ffi.Runtime; 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 ru.serce.jnrfuse.struct.FileStat; import ru.serce.jnrfuse.struct.Flock; import ru.serce.jnrfuse.struct.FuseBuf; import ru.serce.jnrfuse.flags.FuseBufFlags; import ru.serce.jnrfuse.struct.FuseBufvec; import ru.serce.jnrfuse.struct.FuseFileInfo; import ru.serce.jnrfuse.struct.FusePollhandle; import ru.serce.jnrfuse.struct.Statvfs; import ru.serce.jnrfuse.struct.Timespec; public class FuseStubFS extends AbstractFuseFS { @Override @NotImplemented public int getattr(String path, FileStat stat) { return 0; } @Override @NotImplemented public int readlink(String path, Pointer buf, @size_t long size) { return 0; } @Override @NotImplemented public int mknod(String path, @mode_t long mode, @dev_t long rdev) { return create(path, mode, null); } @Override @NotImplemented public int mkdir(String path, @mode_t long mode) { return 0; } @Override @NotImplemented public int unlink(String path) { return 0; } @Override @NotImplemented public int rmdir(String path) { return 0; } @Override @NotImplemented public int symlink(String oldpath, String newpath) { return 0; } @Override @NotImplemented public int rename(String oldpath, String newpath) { return 0; } @Override @NotImplemented public int link(String oldpath, String newpath) { return 0; } @Override @NotImplemented public int chmod(String path, @mode_t long mode) { return 0; } @Override @NotImplemented public int chown(String path, @uid_t long uid, @gid_t long gid) { return 0; } @Override @NotImplemented public int truncate(String path, @off_t long size) { return 0; } @Override @NotImplemented public int open(String path, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int read(String path, Pointer buf, @size_t long size, @off_t long offset, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int write(String path, Pointer buf, @size_t long size, @off_t long offset, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int statfs(String path, Statvfs stbuf) { return 0; } @Override @NotImplemented public int flush(String path, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int release(String path, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int fsync(String path, int isdatasync, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int setxattr(String path, String name, Pointer value, @size_t long size, int flags) { return 0; } @Override @NotImplemented public int getxattr(String path, String name, Pointer value, @size_t long size) { return 0; } @Override @NotImplemented public int listxattr(String path, Pointer list, @size_t long size) { return 0; } @Override @NotImplemented public int removexattr(String path, String name) { return 0; } @Override @NotImplemented public int opendir(String path, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int readdir(String path, Pointer buf, FuseFillDir filter, @off_t long offset, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int releasedir(String path, FuseFileInfo fi) { return 0; } @Override @NotImplemented public int fsyncdir(String path, FuseFileInfo fi) { return 0; } @Override @NotImplemented public Pointer init(Pointer conn) { return null; } @Override @NotImplemented public void destroy(Pointer initResult) { } @Override @NotImplemented public int access(String path, int mask) { return 0; } @Override @NotImplemented public int create(String path, @mode_t long mode, FuseFileInfo fi) { return -ErrorCodes.ENOSYS(); } @Override @NotImplemented public int ftruncate(String path, @off_t long size, FuseFileInfo fi) { return truncate(path, size); } @Override @NotImplemented public int fgetattr(String path, FileStat stbuf, FuseFileInfo fi) { return getattr(path, stbuf); } @Override @NotImplemented public int lock(String path, FuseFileInfo fi, int cmd, Flock flock) { return -ErrorCodes.ENOSYS(); } @Override @NotImplemented public int utimens(String path, Timespec[] timespec) { return -ErrorCodes.ENOSYS(); } @Override @NotImplemented public int bmap(String path, @size_t long blocksize, long idx) { return 0; } @Override @NotImplemented public int ioctl(String path, int cmd, Pointer arg, FuseFileInfo fi, @u_int32_t long flags, Pointer data) { return -ErrorCodes.ENOSYS(); } @Override @NotImplemented public int poll(String path, FuseFileInfo fi, FusePollhandle ph, Pointer reventsp) { return -ErrorCodes.ENOSYS(); } @Override @NotImplemented public int write_buf(String path, FuseBufvec buf, @off_t long off, FuseFileInfo fi) { // TODO. // Some problem in implementation, but it not enabling by default int res; int size = (int) libFuse.fuse_buf_size(buf); FuseBuf flatbuf; FuseBufvec tmp = new FuseBufvec(Runtime.getSystemRuntime()); long adr = MemoryIO.getInstance().allocateMemory(Struct.size(tmp), false); tmp.useMemory(Pointer.wrap(Runtime.getSystemRuntime(), adr)); FuseBufvec.init(tmp, size); long mem = 0; if (buf.count.get() == 1 && buf.buf.flags.get() == FuseBufFlags.FUSE_BUF_IS_FD) { flatbuf = buf.buf; } else { res = -ErrorCodes.ENOMEM(); mem = MemoryIO.getInstance().allocateMemory(size, false); if (mem == 0) { MemoryIO.getInstance().freeMemory(adr); return res; } tmp.buf.mem.set(mem); res = (int) libFuse.fuse_buf_copy(tmp, buf, 0); if (res <= 0) { MemoryIO.getInstance().freeMemory(adr); MemoryIO.getInstance().freeMemory(mem); return res; } tmp.buf.size.set(res); flatbuf = tmp.buf; } res = write(path, flatbuf.mem.get(), flatbuf.size.get(), off, fi); if (mem != 0) { MemoryIO.getInstance().freeMemory(adr); MemoryIO.getInstance().freeMemory(mem); } return res; } @Override @NotImplemented public int read_buf(String path, Pointer bufp, @size_t long size, @off_t long off, FuseFileInfo fi) { // should be implemented or null long vecmem = MemoryIO.getInstance().allocateMemory(Struct.size(new FuseBufvec(Runtime.getSystemRuntime())), false); if (vecmem == 0) { return -ErrorCodes.ENOMEM(); } Pointer src = Pointer.wrap(Runtime.getSystemRuntime(), vecmem); long memAdr = MemoryIO.getInstance().allocateMemory(size, false); if (memAdr == 0) { MemoryIO.getInstance().freeMemory(vecmem); return -ErrorCodes.ENOMEM(); } Pointer mem = Pointer.wrap(Runtime.getSystemRuntime(), memAdr); FuseBufvec buf = FuseBufvec.of(src); FuseBufvec.init(buf, size); buf.buf.mem.set(mem); bufp.putAddress(0, src.address()); int res = read(path, mem, size, off, fi); if (res >= 0) buf.buf.size.set(res); return res; } @Override @NotImplemented public int flock(String path, FuseFileInfo fi, int op) { return -ErrorCodes.ENOSYS(); } @Override @NotImplemented public int fallocate(String path, int mode, @off_t long off, @off_t long length, FuseFileInfo fi) { return -ErrorCodes.ENOSYS(); } }