summaryrefslogtreecommitdiff
path: root/Source/Kernel/VFS
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Kernel/VFS')
-rw-r--r--Source/Kernel/VFS/DirectoryNode.class.cpp12
-rw-r--r--Source/Kernel/VFS/DirectoryNode.class.h9
-rw-r--r--Source/Kernel/VFS/File.class.h7
-rw-r--r--Source/Kernel/VFS/FileNode.class.h1
-rw-r--r--Source/Kernel/VFS/FileSystem.proto.h2
5 files changed, 29 insertions, 2 deletions
diff --git a/Source/Kernel/VFS/DirectoryNode.class.cpp b/Source/Kernel/VFS/DirectoryNode.class.cpp
index 415899c..0c58ca1 100644
--- a/Source/Kernel/VFS/DirectoryNode.class.cpp
+++ b/Source/Kernel/VFS/DirectoryNode.class.cpp
@@ -7,6 +7,18 @@ bool DirectoryNode::removable() {
return m_children.empty();
}
+bool DirectoryNode::unmountable() {
+ if (!m_contentLoaded) return true;
+ for (u32int i = 0; i < m_children.size(); i++) {
+ if (m_children[i]->type() == NT_DIRECTORY) {
+ if (!((DirectoryNode*)m_children[i])->unmountable()) return false;
+ } else {
+ if (!m_children[i]->removable()) return false;
+ }
+ }
+ return true;
+}
+
bool DirectoryNode::loadContent() {
if (m_contentLoaded) return true;
bool b = m_fs->loadContents(this);
diff --git a/Source/Kernel/VFS/DirectoryNode.class.h b/Source/Kernel/VFS/DirectoryNode.class.h
index 5de523e..2130458 100644
--- a/Source/Kernel/VFS/DirectoryNode.class.h
+++ b/Source/Kernel/VFS/DirectoryNode.class.h
@@ -13,12 +13,19 @@ class DirectoryNode : public FSNode {
DirectoryNode(String name, FileSystem* fs, FSNode* parent, u32int permissions = 0777,
u32int uid = 0, u32int gid = 0) :
FSNode(name, fs, parent, 0, permissions, uid, gid), m_children(), m_contentLoaded(false) {}
- virtual ~DirectoryNode() {}
+ virtual ~DirectoryNode() {
+ if (m_contentLoaded) {
+ for (u32int i = 0; i < m_children.size(); i++) {
+ delete m_children[i];
+ }
+ }
+ }
Vector<FSNode*> &getChildren() { return m_children; } //MUST BE USED ONLY BY FILESYSTEMS
u8int type() { return NT_DIRECTORY; }
bool removable();
+ bool unmountable();
bool loadContent();
FSNode* getChild(u32int index);
diff --git a/Source/Kernel/VFS/File.class.h b/Source/Kernel/VFS/File.class.h
index ef82a70..7831fb5 100644
--- a/Source/Kernel/VFS/File.class.h
+++ b/Source/Kernel/VFS/File.class.h
@@ -38,6 +38,13 @@ class File {
u32int read(ByteArray &data); //Fills ByteArray at its current length or shrinks it if we can't read enough
bool write(ByteArray &data);
+ template <typename T> bool read(T* elem) {
+ return (read(sizeof(T), (u8int*)elem) == sizeof(T));
+ }
+ template <typename T> bool write(T* elem) {
+ return write(sizeof(T), (u8int*)elem);
+ }
+
bool seek(u64int count, u8int mode);
u64int position() { return m_position; }
u64int length() { return m_file->getLength(); }
diff --git a/Source/Kernel/VFS/FileNode.class.h b/Source/Kernel/VFS/FileNode.class.h
index ac170ae..7ab617f 100644
--- a/Source/Kernel/VFS/FileNode.class.h
+++ b/Source/Kernel/VFS/FileNode.class.h
@@ -21,7 +21,6 @@ class FileNode : public FSNode {
bool used() { return (m_readers != 0 or m_writers != 0); }
bool writable() { return m_fs->isWritable(); }
- //protected:
u32int read(u64int position, u32int max_length, u8int *data) {
return m_fs->read(this, position, max_length, data);
}
diff --git a/Source/Kernel/VFS/FileSystem.proto.h b/Source/Kernel/VFS/FileSystem.proto.h
index 2f768a7..5aec434 100644
--- a/Source/Kernel/VFS/FileSystem.proto.h
+++ b/Source/Kernel/VFS/FileSystem.proto.h
@@ -13,6 +13,8 @@ class FileSystem {
DirectoryNode* m_rootNode;
public:
+ bool unmount();
+
bool isWritable() { return m_isWritable; }
DirectoryNode* getRootNode() { return m_rootNode; }