summaryrefslogtreecommitdiff
path: root/examples/passthrough.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--examples/passthrough.rs40
1 files changed, 28 insertions, 12 deletions
diff --git a/examples/passthrough.rs b/examples/passthrough.rs
index 7115fb1..2837d81 100644
--- a/examples/passthrough.rs
+++ b/examples/passthrough.rs
@@ -12,7 +12,7 @@ use std::{
};
use blown_fuse::{
- io::{Attrs, Entry, EntryType, Gid, Known, Mode, OpenFlags, Stat, Uid},
+ io::{Attrs, Entry, EntryType, FsyncFlags, Gid, Known, Mode, OpenFlags, Stat, Uid},
mount::mount_sync,
ops,
session::{Dispatch, Start},
@@ -135,6 +135,16 @@ impl Passthrough {
reply.blob(&target)
}
+ async fn symlink<'o>(&mut self, (request, reply): Op<'o, ops::Symlink>) -> Done<'o> {
+ let (reply, inode) = reply.and_then(self.known(request.ino()))?;
+ let path = inode.path.join(request.name());
+
+ let (reply, ()) = reply.and_then(fs::symlink(request.target(), &path).await)?;
+ let (reply, metadata) = reply.and_then(fs::symlink_metadata(&path).await)?;
+
+ reply.known(New(&mut self.known, Inode::new(path, metadata)), Ttl::MAX)
+ }
+
async fn mkdir<'o>(&mut self, (request, reply): Op<'o, ops::Mkdir>) -> Done<'o> {
let (reply, inode) = reply.and_then(self.known(request.ino()))?;
let path = inode.path.join(request.name());
@@ -161,16 +171,6 @@ impl Passthrough {
reply.ok()
}
- async fn symlink<'o>(&mut self, (request, reply): Op<'o, ops::Symlink>) -> Done<'o> {
- let (reply, inode) = reply.and_then(self.known(request.ino()))?;
- let path = inode.path.join(request.name());
-
- let (reply, ()) = reply.and_then(fs::symlink(request.target(), &path).await)?;
- let (reply, metadata) = reply.and_then(fs::symlink_metadata(&path).await)?;
-
- reply.known(New(&mut self.known, Inode::new(path, metadata)), Ttl::MAX)
- }
-
async fn open<'o>(&mut self, (request, reply): Op<'o, ops::Open>) -> Done<'o> {
let (reply, inode) = reply.and_then(self.known(request.ino()))?;
let options = {
@@ -230,6 +230,21 @@ impl Passthrough {
reply.ok()
}
+ async fn fsync<'o>(&mut self, (request, reply): Op<'o, ops::Fsync>) -> Done<'o> {
+ let (reply, file) = reply.and_then(self.open_files.get(request.handle()))?;
+ let (reply, ()) = {
+ let result = if request.flags().contains(FsyncFlags::FDATASYNC) {
+ file.handle.sync_data().await
+ } else {
+ file.handle.sync_all().await
+ };
+
+ reply.and_then(result)?
+ };
+
+ reply.ok()
+ }
+
async fn opendir<'o>(&mut self, (request, reply): Op<'o, ops::Opendir>) -> Done<'o> {
let (reply, inode) = reply.and_then(self.known(request.ino()))?;
let (mut reply, mut stream) = reply.and_then(fs::read_dir(&inode.path).await)?;
@@ -375,15 +390,16 @@ async fn main_loop(session: Start, mut fs: Passthrough) -> FuseResult<()> {
Forget(forget) => fs.forget(forget.op()?),
Getattr(getattr) => fs.getattr(getattr.op()?),
Readlink(readlink) => fs.readlink(readlink.op()?).await,
+ Symlink(symlink) => fs.symlink(symlink.op()?).await,
Mkdir(mkdir) => fs.mkdir(mkdir.op()?).await,
Unlink(unlink) => fs.unlink(unlink.op()?).await,
Rmdir(rmdir) => fs.rmdir(rmdir.op()?).await,
- Symlink(symlink) => fs.symlink(symlink.op()?).await,
//TODO: Link
Open(open) => fs.open(open.op()?).await,
Read(read) => fs.read(read.op()?).await,
Write(write) => fs.write(write.op()?).await,
Release(release) => fs.release(release.op()?),
+ Fsync(fsync) => fs.fsync(fsync.op()?).await,
Opendir(opendir) => fs.opendir(opendir.op()?).await,
Readdir(readdir) => fs.readdir(readdir.op()?).await,
Releasedir(releasedir) => fs.releasedir(releasedir.op()?),