diff options
author | David Barksdale <amatus.amongus@gmail.com> | 2012-04-30 19:37:22 -0500 |
---|---|---|
committer | David Barksdale <amatus.amongus@gmail.com> | 2012-04-30 19:37:22 -0500 |
commit | 1d8f1ff78b9c53a960b55f8a0e9a73aac145bd31 (patch) | |
tree | 79b7e07465ab6af449a4b99d65302d707623bb04 /src | |
parent | 876070d4f8f4d51509dc01058d1b439c0c312f65 (diff) |
Implemented op-rmdir.
Diffstat (limited to 'src')
-rw-r--r-- | src/clojure/foofs/filesystem.clj | 2 | ||||
-rw-r--r-- | src/clojure/foofs/filesystembackend.clj | 2 | ||||
-rw-r--r-- | src/clojure/foofs/fuse/filesystem.clj | 1 | ||||
-rw-r--r-- | src/clojure/foofs/fuse/jna.clj | 1 | ||||
-rw-r--r-- | src/clojure/foofs/fuse/protocol.clj | 9 | ||||
-rw-r--r-- | src/clojure/foofs/memorybackend.clj | 41 |
6 files changed, 52 insertions, 4 deletions
diff --git a/src/clojure/foofs/filesystem.clj b/src/clojure/foofs/filesystem.clj index 29f6d41..c858d6d 100644 --- a/src/clojure/foofs/filesystem.clj +++ b/src/clojure/foofs/filesystem.clj @@ -77,6 +77,8 @@ (continuation! (fill-entry attr)))))))) (unlink [this request continuation!] (.unlink backend (:nodeid request) (:arg request) continuation!)) + (rmdir [this request continuation!] + (.rmdir backend (:nodeid request) (:arg request) continuation!)) (link [this request continuation!] (let [arg (:arg request)] (.link diff --git a/src/clojure/foofs/filesystembackend.clj b/src/clojure/foofs/filesystembackend.clj index 6ba3afc..6e0048d 100644 --- a/src/clojure/foofs/filesystembackend.clj +++ b/src/clojure/foofs/filesystembackend.clj @@ -35,5 +35,7 @@ "Create a hardlink and return the target's attributes.") (unlink [this inode filename continuation!] "Unlink a file.") + (rmdir [this inode filename continuation!] + "Remove an empty directory.") ;; and so on ) diff --git a/src/clojure/foofs/fuse/filesystem.clj b/src/clojure/foofs/fuse/filesystem.clj index 102c78c..78507d0 100644 --- a/src/clojure/foofs/fuse/filesystem.clj +++ b/src/clojure/foofs/fuse/filesystem.clj @@ -23,6 +23,7 @@ (mknod [this request continuation!] "Create node.") (mkdir [this request continuation!] "Create directory.") (unlink [this request continuation!] "Unlink a file.") + (rmdir [this request continuation!] "Remove an empty directory.") (link [this request continuation!] "Create hardlink.") (open [this request continuation!] "Open file.") (readfile [this request continuation!] "Read file.") diff --git a/src/clojure/foofs/fuse/jna.clj b/src/clojure/foofs/fuse/jna.clj index ba800d9..3e699ac 100644 --- a/src/clojure/foofs/fuse/jna.clj +++ b/src/clojure/foofs/fuse/jna.clj @@ -145,6 +145,7 @@ (def errno-isdir 21) (def errno-inval 22) (def errno-nosys 38) + (def errno-notempty 39) (def errno-proto 71) (def pf-unix 1) (def sock-stream 1) diff --git a/src/clojure/foofs/fuse/protocol.clj b/src/clojure/foofs/fuse/protocol.clj index 4aa72ba..9008a91 100644 --- a/src/clojure/foofs/fuse/protocol.clj +++ b/src/clojure/foofs/fuse/protocol.clj @@ -241,6 +241,13 @@ request (partial reply-error! fuse request))) +(defn process-rmdir! + [fuse request] + (.rmdir + (:filesystem fuse) + request + (partial reply-error! fuse request))) + (def parse-link-in (domonad parser-m @@ -514,6 +521,8 @@ :processor! process-mkdir!} op-unlink {:arg-parser parse-utf8 :processor! process-unlink!} + op-rmdir {:arg-parser parse-utf8 + :processor! process-rmdir!} op-link {:arg-parser parse-link-in :processor! process-link!} op-open {:arg-parser parse-open-in diff --git a/src/clojure/foofs/memorybackend.clj b/src/clojure/foofs/memorybackend.clj index f08a4bd..9878d3b 100644 --- a/src/clojure/foofs/memorybackend.clj +++ b/src/clojure/foofs/memorybackend.clj @@ -160,12 +160,11 @@ (do (continuation! errno-notdir) state) (if (nil? child-inode) (do (continuation! errno-noent) state) - (let [child-attr (get attr-table child-inode) - nlink (dec (:nlink child-attr))] + (let [child-attr (get attr-table child-inode)] (if (= stat-type-directory (bit-and stat-type-mask (:mode child-attr))) (do (continuation! errno-isdir) state) - (do + (let [nlink (dec (:nlink child-attr))] (continuation! 0) (assoc state :lookup-table (assoc lookup-table inode @@ -175,4 +174,38 @@ (assoc attr-table child-inode (assoc child-attr - :nlink nlink)))))))))))))) + :nlink nlink))))))))))))) + (rmdir [this inode filename continuation!] + (send + state-agent + (fn [state] + (let [lookup-table (:lookup-table state) + attr-table (:attr-table state) + children (get lookup-table inode) + child-inode (get children filename) + dir-attr (get attr-table inode)] + (if (not (= stat-type-directory + (bit-and stat-type-mask (:mode dir-attr)))) + (do (continuation! errno-notdir) state) + (if (nil? child-inode) + (do (continuation! errno-noent) state) + (let [child-attr (get attr-table child-inode) + child-children (get lookup-table child-inode)] + (if (not (= stat-type-directory + (bit-and stat-type-mask (:mode child-attr)))) + (do (continuation! errno-notdir) state) + (if (not (empty? (dissoc child-children "." ".."))) + (do (continuation! errno-notempty) state) + (let [nlink (- (:nlink child-attr) 3)] + (continuation! 0) + (assoc state + :lookup-table (dissoc + (assoc lookup-table inode + (dissoc children filename)) + child-inode) + :attr-table (if (zero? nlink) + (dissoc attr-table child-inode) + (assoc + attr-table child-inode + (assoc child-attr + :nlink nlink))))))))))))))) |