From 675d3a4816ecfd4e0cdd77bd41f68ebdf28ea1fc Mon Sep 17 00:00:00 2001 From: David Barksdale Date: Tue, 24 Apr 2012 17:11:17 -0500 Subject: Added foofs.filesystembackend.FilesystemBackend/readfile. --- src/clojure/foofs/filesystem.clj | 10 +++++++++- src/clojure/foofs/filesystembackend.clj | 2 ++ src/clojure/foofs/fuse/protocol.clj | 2 +- src/clojure/foofs/memorybackend.clj | 9 +++++++-- 4 files changed, 19 insertions(+), 4 deletions(-) (limited to 'src/clojure') diff --git a/src/clojure/foofs/filesystem.clj b/src/clojure/foofs/filesystem.clj index 7a94984..e5fc7f7 100644 --- a/src/clojure/foofs/filesystem.clj +++ b/src/clojure/foofs/filesystem.clj @@ -61,7 +61,15 @@ (continuation! {:handle 0 :flags 0}))))) (readfile [this request continuation!] - (continuation! [])) + (let [arg (:arg request) + offset (:offset arg) + size (:size arg)] + (.readfile + backend (:nodeid request) offset size + (fn [buffer] + (if (nil? buffer) + (continuation! errno-noent) + (continuation! buffer)))))) (statfs [this request continuation!] (continuation! {:blocks 0 diff --git a/src/clojure/foofs/filesystembackend.clj b/src/clojure/foofs/filesystembackend.clj index 4e0dc30..f7a9814 100644 --- a/src/clojure/foofs/filesystembackend.clj +++ b/src/clojure/foofs/filesystembackend.clj @@ -27,5 +27,7 @@ "Decrement link count of an inode.") (clonedir [this inode continuation!] "Return a lazy sequence of directory entries.") + (readfile [this inode offset size continuation!] + "Return a ByteBuffer or sequence of bytes.") ;; and so on ) diff --git a/src/clojure/foofs/fuse/protocol.clj b/src/clojure/foofs/fuse/protocol.clj index 1f1ed4c..3fb4ad8 100644 --- a/src/clojure/foofs/fuse/protocol.clj +++ b/src/clojure/foofs/fuse/protocol.clj @@ -244,7 +244,7 @@ (defn process-read! [fuse request] - (.read + (.readfile (:filesystem fuse) request (fn [result] diff --git a/src/clojure/foofs/memorybackend.clj b/src/clojure/foofs/memorybackend.clj index d260f7a..886eb08 100644 --- a/src/clojure/foofs/memorybackend.clj +++ b/src/clojure/foofs/memorybackend.clj @@ -73,5 +73,10 @@ {:name name :nodeid inode :type (:mode attr)})) - children))))) - + children)))) + (readfile [this inode offset size continuation!] + (let [state (deref state-agent) + file (get (:file-table state) inode)] + (if (nil? file) + (continuation! nil) + (continuation! (take size (drop offset file))))))) -- cgit v1.2.3-70-g09d2