From 66630e4154b7c1c47d6223fe5a8607cd269446a0 Mon Sep 17 00:00:00 2001 From: Alexis211 Date: Fri, 23 Oct 2009 20:43:48 +0200 Subject: Some changes, and implemented rm in userland shell. --- Source/Applications/SampleApps/cxxdemo.cpp | 1 + Source/Applications/Shell/Shell-fs.ns.cpp | 22 ++++++++++--- Source/Applications/Shell/Shell.ns.cpp | 3 +- Source/Applications/Shell/Shell.ns.h | 1 + Source/Kernel/Shell/KernelShell-fs.class.cpp | 4 +-- Source/Kernel/VFS/DirectoryNode.class.cpp | 2 ++ Source/Kernel/VFS/FSNode-sc.proto.cpp | 12 +++++-- Source/Kernel/VFS/FSNode.proto.h | 3 +- Source/Kernel/VFS/VFS.ns.cpp | 10 ++++-- Source/Kernel/VFS/VFS.ns.h | 1 + Source/Library/Interface/FSNode.iface.h | 1 + Source/Library/Userland/Binding/FSNode.class.h | 37 +++++++++++++++------- Source/Library/Userland/Binding/Process.class.h | 5 +++ Source/Library/Userland/Binding/Thread.class.h | 5 +++ .../Userland/Binding/VirtualTerminal.class.h | 5 +++ 15 files changed, 87 insertions(+), 25 deletions(-) (limited to 'Source') diff --git a/Source/Applications/SampleApps/cxxdemo.cpp b/Source/Applications/SampleApps/cxxdemo.cpp index cf297ec..b9439ce 100644 --- a/Source/Applications/SampleApps/cxxdemo.cpp +++ b/Source/Applications/SampleApps/cxxdemo.cpp @@ -4,6 +4,7 @@ #include int main() { + outvt << "Enter some text plz : "; String s = invt.readLine(); outvt << s; Thread t = Thread::get(); diff --git a/Source/Applications/Shell/Shell-fs.ns.cpp b/Source/Applications/Shell/Shell-fs.ns.cpp index 33bc94e..5e6ae4f 100644 --- a/Source/Applications/Shell/Shell-fs.ns.cpp +++ b/Source/Applications/Shell/Shell-fs.ns.cpp @@ -5,7 +5,7 @@ namespace Shell { void ls(Vector& args) { FSNode d = cwd; if (args.size() == 2) { - FSNode n = cwd.findFrom(args[1]); + FSNode n = FS::find(args[1], cwd); d = FSNode(0); if (!n.valid()) outvt << "No such directory : " << args[1] << "\n"; @@ -17,12 +17,17 @@ void ls(Vector& args) { if (d.valid()) outvt << "Contents of directory " << d.path() << " :\n"; for (u32int i = 0; i < d.getLength(); i++) { FSNode n = d.getChild(i); + String perm = "rwxrwxrwx"; + u32int p = n.getPerm(); + for (u32int i = 0; i < 9; i++) { + if (((p >> i) & 1) == 0) perm[9 - i] = "-"; + } if (n.type() == NT_FILE) { - outvt << " - FILE\t" << n.getName(); + outvt << " FILE " << perm << " " << n.getName(); outvt.setCsrCol(30); outvt << (s32int)n.getLength() << " bytes.\n"; } else if (n.type() == NT_DIRECTORY) { - outvt << " - DIR\t" << n.getName() << "/"; + outvt << " DIR " << perm << " " << n.getName() << "/"; outvt.setCsrCol(30); outvt << (s32int)n.getLength() << " items.\n"; } @@ -33,7 +38,7 @@ void cd(Vector& args) { if (args.size() != 2) { outvt << "Invalid argument count.\n"; } else { - FSNode ncwd = cwd.findFrom(args[1]); + FSNode ncwd = FS::find(args[1], cwd); if (!ncwd.valid()) { outvt << "No such directory : " << args[1] << "\n"; } else if (ncwd.type() == NT_DIRECTORY) { @@ -49,4 +54,13 @@ void pwd(Vector& args) { outvt << "Current directory : " << cwd.path() << "\n"; } +void rm(Vector& args) { + if (args.size() == 1) outvt << "No file to remove.\n"; + for (u32int i = 1; i < args.size(); i++) { + if (!FS::find(args[i], cwd).remove()) { + outvt << "Error while removing file " << args[i] << "\n"; + } + } +} + } diff --git a/Source/Applications/Shell/Shell.ns.cpp b/Source/Applications/Shell/Shell.ns.cpp index 4afc6b7..1f8acae 100644 --- a/Source/Applications/Shell/Shell.ns.cpp +++ b/Source/Applications/Shell/Shell.ns.cpp @@ -14,10 +14,11 @@ u32int run() { {"ls", ls}, {"cd", cd}, {"pwd", pwd}, + {"rm", rm}, {"", 0} }; - cwd = FSNode::getCwd(); + cwd = FS::cwdNode(); while (1) { outvt << "{" << cwd.getName() << "}: "; String s = invt.readLine(); diff --git a/Source/Applications/Shell/Shell.ns.h b/Source/Applications/Shell/Shell.ns.h index 8d7067a..5cf4509 100644 --- a/Source/Applications/Shell/Shell.ns.h +++ b/Source/Applications/Shell/Shell.ns.h @@ -10,4 +10,5 @@ namespace Shell { extern void ls(Vector& args); extern void cd(Vector& args); extern void pwd(Vector& args); + extern void rm(Vector& args); } diff --git a/Source/Kernel/Shell/KernelShell-fs.class.cpp b/Source/Kernel/Shell/KernelShell-fs.class.cpp index a13ae6e..f013f1b 100644 --- a/Source/Kernel/Shell/KernelShell-fs.class.cpp +++ b/Source/Kernel/Shell/KernelShell-fs.class.cpp @@ -81,8 +81,8 @@ void KernelShell::rm(Vector& args) { if (args.size() == 1) *m_vt << "Error : no argument specified.\n"; for (u32int i = 1; i < args.size(); i++) { if (!VFS::remove(args[i], m_cwd)) { - *m_vt << "Error while removing file " << args[i] << "\n"; - } + *m_vt << "Error while removing file " << args[i] << "\n"; + } } } diff --git a/Source/Kernel/VFS/DirectoryNode.class.cpp b/Source/Kernel/VFS/DirectoryNode.class.cpp index 381ff49..74c1ff8 100644 --- a/Source/Kernel/VFS/DirectoryNode.class.cpp +++ b/Source/Kernel/VFS/DirectoryNode.class.cpp @@ -7,12 +7,14 @@ call_t DirectoryNode::m_callTable[] = { }; u32int DirectoryNode::getIdxChildSC(u32int idx) { + if (!runnable()) return (u32int) - 1; FSNode* n = getChild(idx); if (n != NULL) return n->resId(); return (u32int) - 1; } u32int DirectoryNode::getNameChildSC(u32int name) { + if (!runnable()) return (u32int) - 1; String* w = (String*)name; FSNode* n = getChild(*w); if (n != NULL) return n->resId(); diff --git a/Source/Kernel/VFS/FSNode-sc.proto.cpp b/Source/Kernel/VFS/FSNode-sc.proto.cpp index 1e0c4c1..e3f11db 100644 --- a/Source/Kernel/VFS/FSNode-sc.proto.cpp +++ b/Source/Kernel/VFS/FSNode-sc.proto.cpp @@ -14,6 +14,7 @@ call_t FSNode::m_callTable[] = { CALL0(FNIF_GETPERM, &FSNode::getPermissions), CALL0(FNIF_GETPATH, &FSNode::getPathSC), CALL0(FNIF_SETCWD, &FSNode::setCwdSC), + CALL0(FNIF_REMOVE, &FSNode::removeSC), CALL0(0, 0) }; @@ -22,11 +23,13 @@ u32int FSNode::scall(u8int wat, u32int a, u32int b, u32int c, u32int d) { if (wat == FNIF_SGETCWD) return Task::currProcess()->getCwd()->resId(); if (wat == FNIF_SFIND) { String* path = (String*)a; + FSNode* n; if (b == 0) { - return VFS::find(*path)->resId(); + n = VFS::find(*path); } else { - return VFS::find(*path, Res::get(b, FNIF_OBJTYPE))->resId(); + n = VFS::find(*path, Res::get(b, FNIF_OBJTYPE)); } + if (n != 0) return n->resId(); } return (u32int) - 1; } @@ -61,6 +64,11 @@ u32int FSNode::setCwdSC() { return 0; } +u32int FSNode::removeSC() { + if (!writable()) return 0; + return (VFS::remove(this) ? 1 : 0); +} + bool FSNode::readable(User* user) { if (user == 0) user = Usr::user(); if (user->getUid() == m_uid) diff --git a/Source/Kernel/VFS/FSNode.proto.h b/Source/Kernel/VFS/FSNode.proto.h index 6536e21..0aafc8a 100644 --- a/Source/Kernel/VFS/FSNode.proto.h +++ b/Source/Kernel/VFS/FSNode.proto.h @@ -17,7 +17,7 @@ class FSNode : public Ressource { u64int m_length; u32int m_permissions, m_uid, m_gid; FileSystem *m_fs; - FSNode *m_parent; + FSNode *m_parent; //Syscall related static call_t m_callTable[]; @@ -27,6 +27,7 @@ class FSNode : public Ressource { u32int getParentSC(); u32int getPathSC(); u32int setCwdSC(); + u32int removeSC(); bool accessible(); public: diff --git a/Source/Kernel/VFS/VFS.ns.cpp b/Source/Kernel/VFS/VFS.ns.cpp index 30ad2d7..2333a36 100644 --- a/Source/Kernel/VFS/VFS.ns.cpp +++ b/Source/Kernel/VFS/VFS.ns.cpp @@ -103,9 +103,7 @@ FSNode* createDirectory(const String& path, FSNode* start) { } } -bool remove(const String& path, FSNode* start) { - FSNode* node = find(path, start); - if (node == NULL) return false; +bool remove(FSNode* node) { FSNode* parent = node->getParent(); if (parent == NULL) return false; @@ -116,6 +114,12 @@ bool remove(const String& path, FSNode* start) { } } +bool remove(const String& path, FSNode* start) { + FSNode* node = find(path, start); + if (node == NULL) return false; + return remove(node); +} + String path(FSNode* node) { String path; diff --git a/Source/Kernel/VFS/VFS.ns.h b/Source/Kernel/VFS/VFS.ns.h index 94ddad9..72b8c44 100644 --- a/Source/Kernel/VFS/VFS.ns.h +++ b/Source/Kernel/VFS/VFS.ns.h @@ -15,6 +15,7 @@ namespace VFS { FSNode* find(const String& path, FSNode* start = 0); FSNode* createFile(const String& path, FSNode* start = 0); FSNode* createDirectory(const String& path, FSNode* start = 0); + bool remove(FSNode* node); bool remove(const String& path, FSNode* start = 0); //Returns false for non-empty directories String path(FSNode* node); //Returns complete path for a node } diff --git a/Source/Library/Interface/FSNode.iface.h b/Source/Library/Interface/FSNode.iface.h index cba4621..3a5dfad 100644 --- a/Source/Library/Interface/FSNode.iface.h +++ b/Source/Library/Interface/FSNode.iface.h @@ -24,6 +24,7 @@ enum { #define FNIF_GETPERM 0x16 #define FNIF_GETPATH 0x17 #define FNIF_SETCWD 0x18 //Sets node as current working directory +#define FNIF_REMOVE 0x19 #define FNIF_GETIDXCHILD 0x20 //Get child node from index #define FNIF_GETNAMECHILD 0x21 //Get child node from name diff --git a/Source/Library/Userland/Binding/FSNode.class.h b/Source/Library/Userland/Binding/FSNode.class.h index 61ac991..1fdc7ef 100644 --- a/Source/Library/Userland/Binding/FSNode.class.h +++ b/Source/Library/Userland/Binding/FSNode.class.h @@ -1,17 +1,11 @@ +#ifndef DEF_FSNODE_CLASS_H +#define DEF_FSNODE_CLASS_H + #include #include class FSNode : public RessourceCaller { public: - static FSNode getRoot() { - return FSNode(sCall(FNIF_OBJTYPE, FNIF_SGETRFN)); - } - static FSNode getCwd() { - return FSNode(sCall(FNIF_OBJTYPE, FNIF_SGETCWD)); - } - static FSNode find(String path) { //Finds a node starting from root node - return FSNode(sCall(FNIF_OBJTYPE, FNIF_SFIND, (u32int)&path, 0)); - } FSNode(u32int id) : RessourceCaller(id, FNIF_OBJTYPE) {} String getName() { @@ -41,13 +35,32 @@ class FSNode : public RessourceCaller { void setCwd() { doCall(FNIF_SETCWD); } + bool remove() { + return doCall(FNIF_REMOVE) != 0; + } FSNode getChild(u32int idx) { return FSNode(doCall(FNIF_GETIDXCHILD, idx)); } FSNode getChild(String name) { return FSNode(doCall(FNIF_GETNAMECHILD, (u32int)&name)); } - FSNode findFrom(String path) { //Search a filesystem node starting from here - return FSNode(sCall(FNIF_OBJTYPE, FNIF_SFIND, (u32int)&path, resId())); - } }; + +namespace FS { + +inline FSNode rootNode() { + return FSNode(RessourceCaller::sCall(FNIF_OBJTYPE, FNIF_SGETRFN)); +} + +inline FSNode cwdNode() { + return FSNode(RessourceCaller::sCall(FNIF_OBJTYPE, FNIF_SGETCWD)); +} + +inline FSNode find(String name, FSNode cwd = FSNode(0)) { + if (!cwd.valid()) cwd = rootNode(); + return FSNode(RessourceCaller::sCall(FNIF_OBJTYPE, FNIF_SFIND, (u32int)&name, cwd.resId())); +} + +} + +#endif diff --git a/Source/Library/Userland/Binding/Process.class.h b/Source/Library/Userland/Binding/Process.class.h index 935bb39..ddca6be 100644 --- a/Source/Library/Userland/Binding/Process.class.h +++ b/Source/Library/Userland/Binding/Process.class.h @@ -1,3 +1,6 @@ +#ifndef DEF_PROCESS_CLASS_H +#define DEF_PROCESS_CLASS_H + #include #include @@ -30,3 +33,5 @@ class Process : public RessourceCaller { return String::unserialize(doCall(PRIF_GETCMDLINE)); } }; + +#endif diff --git a/Source/Library/Userland/Binding/Thread.class.h b/Source/Library/Userland/Binding/Thread.class.h index a19c256..1588d8c 100644 --- a/Source/Library/Userland/Binding/Thread.class.h +++ b/Source/Library/Userland/Binding/Thread.class.h @@ -1,3 +1,6 @@ +#ifndef DEF_THREAD_CLASS_H +#define DEF_THREAD_CLASS_H + #include #include @@ -17,3 +20,5 @@ class Thread : public RessourceCaller { doCall(THIF_FINISH, errcode); } }; + +#endif diff --git a/Source/Library/Userland/Binding/VirtualTerminal.class.h b/Source/Library/Userland/Binding/VirtualTerminal.class.h index 06a8dd7..1bfce85 100644 --- a/Source/Library/Userland/Binding/VirtualTerminal.class.h +++ b/Source/Library/Userland/Binding/VirtualTerminal.class.h @@ -1,3 +1,6 @@ +#ifndef DEF_VIRTUALTERMINAL_CLASS_H +#define DEF_VIRTUALTERMINAL_CLASS_H + #include #include @@ -52,3 +55,5 @@ class VirtualTerminal : public RessourceCaller { }; extern VirtualTerminal invt, outvt; + +#endif -- cgit v1.2.3