aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Barksdale <amatus.amongus@gmail.com>2012-04-30 19:37:22 -0500
committerDavid Barksdale <amatus.amongus@gmail.com>2012-04-30 19:37:22 -0500
commit1d8f1ff78b9c53a960b55f8a0e9a73aac145bd31 (patch)
tree79b7e07465ab6af449a4b99d65302d707623bb04 /src
parent876070d4f8f4d51509dc01058d1b439c0c312f65 (diff)
Implemented op-rmdir.
Diffstat (limited to 'src')
-rw-r--r--src/clojure/foofs/filesystem.clj2
-rw-r--r--src/clojure/foofs/filesystembackend.clj2
-rw-r--r--src/clojure/foofs/fuse/filesystem.clj1
-rw-r--r--src/clojure/foofs/fuse/jna.clj1
-rw-r--r--src/clojure/foofs/fuse/protocol.clj9
-rw-r--r--src/clojure/foofs/memorybackend.clj41
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)))))))))))))))