example/passthrough_ll: added write support
authorNikolaus Rath <Nikolaus@rath.org>
Mon, 5 Jun 2017 10:57:36 +0000 (06:57 -0400)
committerNikolaus Rath <Nikolaus@rath.org>
Mon, 5 Jun 2017 10:57:36 +0000 (06:57 -0400)
ChangeLog.rst
example/passthrough_ll.c
test/test_examples.py

index 560ad98e2c0ffd2944bc7476ae227498801b79c0..ca166f95bc66006afd8d9262b3b328c68aedd08d 100644 (file)
@@ -1,6 +1,8 @@
 Unreleased Changes
 ==================
 
+* The `example/passthrough_ll` filesystem now supports writing
+  to files.
 * `fuse_main()` / `fuse_remove_signal_handlers()`: do not reset
   `SIGPIPE` handler to `SIG_DFL` it was not set by us.
 * Documented the `RENAME_EXCHANGE` and `RENAME_NOREPLACE` flags that
index 772a822562c86e1375ebe1685cb864460809c6cb..dd3166a24bedb1a807b1117b154dc8d20a73e067 100644 (file)
@@ -453,7 +453,7 @@ static void lo_release(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi
 }
 
 static void lo_read(fuse_req_t req, fuse_ino_t ino, size_t size,
-                         off_t offset, struct fuse_file_info *fi)
+                   off_t offset, struct fuse_file_info *fi)
 {
        struct fuse_bufvec buf = FUSE_BUFVEC_INIT(size);
 
@@ -466,6 +466,25 @@ static void lo_read(fuse_req_t req, fuse_ino_t ino, size_t size,
        fuse_reply_data(req, &buf, FUSE_BUF_SPLICE_MOVE);
 }
 
+static void lo_write_buf(fuse_req_t req, fuse_ino_t ino,
+                        struct fuse_bufvec *in_buf, off_t off,
+                        struct fuse_file_info *fi)
+{
+       (void) ino;
+       ssize_t res;
+       struct fuse_bufvec out_buf = FUSE_BUFVEC_INIT(fuse_buf_size(in_buf));
+
+       out_buf.buf[0].flags = FUSE_BUF_IS_FD | FUSE_BUF_FD_SEEK;
+       out_buf.buf[0].fd = fi->fh;
+       out_buf.buf[0].pos = off;
+
+       res = fuse_buf_copy(&out_buf, in_buf, 0);
+       if(res < 0)
+               fuse_reply_err(req, -res);
+       else
+               fuse_reply_write(req, (size_t) res);
+}
+
 static struct fuse_lowlevel_ops lo_oper = {
        .init           = lo_init,
        .lookup         = lo_lookup,
@@ -479,6 +498,7 @@ static struct fuse_lowlevel_ops lo_oper = {
        .open           = lo_open,
        .release        = lo_release,
        .read           = lo_read,
+       .write_buf      = lo_write_buf
 };
 
 int main(int argc, char *argv[])
index 953eeecdd89d8f2f957d1e1e722d37f6cebf18a8..401f074cd5b0b64b2ea50bc8fa9af37751845fb2 100755 (executable)
@@ -86,11 +86,11 @@ def test_passthrough(tmpdir, name, debug, capfd):
         tst_statvfs(work_dir)
         tst_readdir(src_dir, work_dir)
         tst_open_read(src_dir, work_dir)
+        tst_open_write(src_dir, work_dir)
         if not is_ll:
             tst_mkdir(work_dir)
             tst_rmdir(src_dir, work_dir)
             tst_create(work_dir)
-            tst_open_write(src_dir, work_dir)
             tst_unlink(src_dir, work_dir)
             tst_symlink(work_dir)
             if os.getuid() == 0: