Skip to content

Commit 5714abe

Browse files
committed
refine README.md with usage examples
Signed-off-by: Liu Jiang <[email protected]>
1 parent 4d03d82 commit 5714abe

File tree

3 files changed

+54
-29
lines changed

3 files changed

+54
-29
lines changed

.github/workflows/rust.yml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,8 @@ jobs:
1919
- name: clippy and format
2020
run: |
2121
cargo clippy --features "fusedev" -- -Dclippy::all
22-
# cargo clippy --features "virtiofs" -- -Dclippy::all
23-
# cargo clippy --features "vhost-user-fs" -- -Dclippy::all
2422
cargo fmt -- --check
2523
- name: Build fusedev
2624
run: cargo build --verbose --features "fusedev"
27-
# - name: Build virtiofs
28-
# run: cargo build --verbose --features "virtiofs"
29-
# - name: Build vhost-user-fs
30-
# run: cargo build --verbose --features "vhost-user-fs"
3125
- name: Run tests fusedev
3226
run: cargo test --verbose --features "fusedev"
33-
# - name: Run tests virtiofs
34-
# run: cargo test --verbose --features "virtiofs"
35-
# - name: Run tests vhost-user-fs
36-
# run: cargo test --verbose --features "vhost-user-fs"

README.md

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# Fuse-rs
1+
# Fuse-backend-rs
22

33
## Design
44

5-
The Fuse-rs crate is an rust library to implement Fuse daemons based on the
5+
The fuse-backend-rs crate is an rust library to implement Fuse daemons based on the
66
[Linux FUSE device (/dev/fuse)](https://www.kernel.org/doc/html/latest/filesystems/fuse.html)
77
or the [virtiofs](https://stefanha.github.io/virtio/virtio-fs.html#x1-41500011) draft specification.
88

@@ -23,16 +23,55 @@ So the fuse-rs crate is a library to communicate with the Linux FUSE clients, wh
2323

2424
## Usage
2525

26-
TODO: This section describes how the crate is used.
26+
Please refer to [dragonflyoss/image-service](https://github.com/dragonflyoss/image-service/blob/master/src/bin/nydusd/fusedev.rs)
27+
for an example to use the fusedev framework.
2728

2829
## Examples
2930

30-
TODO: Usage examples.
31-
3231
```rust
33-
use fuse_rs;
32+
use fuse_backend_rs::api::{server::Server, Vfs, VfsOptions};
33+
use fuse_backend_rs::transport::fusedev::{FuseSession, FuseChannel};
34+
35+
struct FuseServer {
36+
server: Arc<Server<Arc<Vfs>>>,
37+
ch: FuseChannel,
38+
}
39+
40+
impl FuseServer {
41+
fn svc_loop(&self) -> Result<()> {
42+
let mut buf = vec![0x0u8; 1024 * 1024];
3443

35-
...
44+
// Given error EBADF, it means kernel has shut down this session.
45+
let _ebadf = std::io::Error::from_raw_os_error(libc::EBADF);
46+
loop {
47+
if let Some(reader) = self
48+
.ch
49+
.get_reader(&mut buf)
50+
.map_err(|_| std::io::Error::from_raw_os_error(libc::EINVAL))?
51+
{
52+
let writer = self
53+
.ch
54+
.get_writer()
55+
.map_err(|_| std::io::Error::from_raw_os_error(libc::EINVAL))?;
56+
if let Err(e) = self.server.handle_message(reader, writer, None, None) {
57+
match e {
58+
fuse_backend_rs::Error::EncodeMessage(_ebadf) => {
59+
break;
60+
}
61+
_ => {
62+
error!("Handling fuse message failed");
63+
continue;
64+
}
65+
}
66+
}
67+
} else {
68+
info!("fuse server exits");
69+
break;
70+
}
71+
}
72+
Ok(())
73+
}
74+
}
3675
```
3776

3877
## License

tests/example/passthroughfs.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@ use std::thread;
99

1010
use vmm_sys_util::eventfd::EventFd;
1111

12-
use fuse_rs::api::{server::Server, Vfs, VfsOptions};
13-
use fuse_rs::passthrough::{Config, PassthroughFs};
14-
use fuse_rs::transport::fusedev;
12+
use fuse_backend_rs::api::{server::Server, Vfs, VfsOptions};
13+
use fuse_backend_rs::passthrough::{Config, PassthroughFs};
14+
use fuse_backend_rs::transport::fusedev::{FuseChannel, FuseSession};
1515

1616
/// A fusedev daemon example
1717
pub struct Daemon {
1818
mountpoint: String,
1919
server: Arc<Server<Arc<Vfs>>>,
2020
thread_cnt: u32,
2121
event_fd: EventFd,
22-
session: Option<fusedev::FuseSession>,
22+
session: Option<FuseSession>,
2323
}
2424

2525
impl Daemon {
@@ -54,8 +54,7 @@ impl Daemon {
5454
/// Mounts a fusedev daemon to the mountpoint, then start service threads to handle
5555
/// FUSE requests.
5656
pub fn mount(&mut self) -> Result<()> {
57-
let mut se =
58-
fusedev::FuseSession::new(Path::new(&self.mountpoint), "passthru_example", "").unwrap();
57+
let mut se = FuseSession::new(Path::new(&self.mountpoint), "passthru_example", "").unwrap();
5958
se.mount().unwrap();
6059
for _ in 0..self.thread_cnt {
6160
let server = FuseServer {
@@ -93,15 +92,12 @@ impl Drop for Daemon {
9392

9493
struct FuseServer {
9594
server: Arc<Server<Arc<Vfs>>>,
96-
ch: fusedev::FuseChannel,
95+
ch: FuseChannel,
9796
}
9897

9998
impl FuseServer {
10099
fn svc_loop(&self) -> Result<()> {
101-
let mut buf = Vec::with_capacity(1024 * 1024);
102-
unsafe {
103-
buf.set_len(1024 * 1024);
104-
}
100+
let mut buf = vec![0x0u8; 1024 * 1024];
105101

106102
// Given error EBADF, it means kernel has shut down this session.
107103
let _ebadf = std::io::Error::from_raw_os_error(libc::EBADF);
@@ -117,7 +113,7 @@ impl FuseServer {
117113
.map_err(|_| std::io::Error::from_raw_os_error(libc::EINVAL))?;
118114
if let Err(e) = self.server.handle_message(reader, writer, None, None) {
119115
match e {
120-
fuse_rs::Error::EncodeMessage(_ebadf) => {
116+
fuse_backend_rs::Error::EncodeMessage(_ebadf) => {
121117
break;
122118
}
123119
_ => {

0 commit comments

Comments
 (0)