]> git.proxmox.com Git - proxmox-backup.git/commitdiff
src/pxar/fuse.rs: impl read callback for fuse
authorChristian Ebner <c.ebner@proxmox.com>
Mon, 9 Sep 2019 16:27:28 +0000 (18:27 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 10 Sep 2019 09:34:55 +0000 (11:34 +0200)
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
src/pxar/fuse.rs

index 24de0f3c4bcb7dfd441126c1f984fbb2cba3ddec..8cbe7a994eeeb8dde8faef3cd1c248180da0df66 100644 (file)
@@ -53,6 +53,7 @@ type Request = *mut c_void;
 type MutPtr = *mut c_void;
 type ConstPtr = *const c_void;
 type StrPtr = *const c_char;
+type MutStrPtr = *mut c_char;
 
 #[rustfmt::skip]
 #[link(name = "fuse3")]
@@ -69,6 +70,7 @@ extern "C" {
     fn fuse_reply_attr(req: Request, attr: Option<&libc::stat>, timeout: f64) -> c_int;
     fn fuse_reply_err(req: Request, errno: c_int) -> c_int;
     fn fuse_reply_open(req: Request, fileinfo: ConstPtr) -> c_int;
+    fn fuse_reply_buf(req: Request, buf: MutStrPtr, size: size_t) -> c_int;
     fn fuse_reply_entry(req: Request, entry: Option<&EntryParam>) -> c_int;
     fn fuse_req_userdata(req: Request) -> MutPtr;
 }
@@ -435,11 +437,19 @@ extern "C" fn open(req: Request, inode: u64, fileinfo: MutPtr) {
     });
 }
 
-extern "C" fn read(req: Request, inode: u64, _size: size_t, _offset: c_int, _fileinfo: MutPtr) {
-    run_in_context(req, inode, |_decoder, _ino_offset| {
-        // code goes here
+extern "C" fn read(req: Request, inode: u64, size: size_t, offset: c_int, _fileinfo: MutPtr) {
+    run_in_context(req, inode, |decoder, ino_offset| {
+        let mut data = decoder
+            .read(ino_offset, size, offset as u64)
+            .map_err(|_| libc::EIO)?;
 
-        Err(libc::ENOENT)
+        let _res = unsafe {
+            let len = data.len();
+            let dptr = data.as_mut_ptr() as *mut c_char;
+            fuse_reply_buf(req, dptr, len)
+        };
+
+        Ok(())
     });
 }