diff options
author | Alexis211 <alexis211@gmail.com> | 2009-10-23 17:28:25 +0200 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-10-23 17:28:25 +0200 |
commit | f0556ed7f051fb101dc68752526696365bf79a11 (patch) | |
tree | 61345fbadbf76c6f12b36b48a9dfadd744f6cbbd /Source/Kernel/TaskManager | |
parent | df179c18baab4b5d85a283924fb23dfee7ea7fdb (diff) | |
download | Melon-f0556ed7f051fb101dc68752526696365bf79a11.tar.gz Melon-f0556ed7f051fb101dc68752526696365bf79a11.zip |
More work on syscalls and shell
Diffstat (limited to 'Source/Kernel/TaskManager')
-rw-r--r-- | Source/Kernel/TaskManager/Process.class.cpp | 24 | ||||
-rw-r--r-- | Source/Kernel/TaskManager/Process.class.h | 5 | ||||
-rw-r--r-- | Source/Kernel/TaskManager/Thread.class.cpp | 5 | ||||
-rw-r--r-- | Source/Kernel/TaskManager/Thread.class.h | 1 |
4 files changed, 28 insertions, 7 deletions
diff --git a/Source/Kernel/TaskManager/Process.class.cpp b/Source/Kernel/TaskManager/Process.class.cpp index 5b777ed..ce0a1d7 100644 --- a/Source/Kernel/TaskManager/Process.class.cpp +++ b/Source/Kernel/TaskManager/Process.class.cpp @@ -32,7 +32,7 @@ Process* Process::createKernel(String cmdline, VirtualTerminal *vt) { Process* p = new Process(); p->m_pid = 0; p->m_ppid = 0; - p->m_cmdline = cmdline; + p->m_arguments = cmdline.split(" "); p->m_retval = 0; p->m_state = P_RUNNING; p->m_pagedir = kernelPageDirectory; @@ -71,10 +71,10 @@ Process* Process::run(String filename, FSNode* cwd, u32int uid) { } } -Process::Process(String cmdline, u32int uid) : Ressource(PRIF_OBJTYPE, m_callTable) { +Process::Process(String binfile, u32int uid) : Ressource(PRIF_OBJTYPE, m_callTable), m_arguments() { m_pid = Task::nextPid(); m_ppid = Task::currProcess()->getPid(); - m_cmdline = cmdline; + m_arguments.push(binfile); m_retval = 0; m_state = P_STARTING; m_uid = uid; @@ -177,7 +177,20 @@ u32int Process::allocPageSC(u32int pos) { } u32int Process::getCmdlineSC() { - if (Task::currProcess()->getUid() == m_uid or Usr::uid() == 0) return m_cmdline.serialize(); + if (Usr::uid() == m_uid or ISROOT) { + String cmdline; + for (u32int i = 0; i < m_arguments.size(); i++) { + if (i != 0) cmdline += " "; + if (m_arguments[i].contains(" ")) { + cmdline += "'"; + cmdline += m_arguments[i]; + cmdline += "'"; + } else { + cmdline += m_arguments[i]; + } + } + return cmdline.serialize(); + } return (u32int) - 1; } @@ -188,3 +201,6 @@ u32int Process::freePageSC(u32int pos) { m_pagedir->freeFrame(pos); return 0; } +bool Process::accessible() { + return (m_uid == Usr::uid()); +} diff --git a/Source/Kernel/TaskManager/Process.class.h b/Source/Kernel/TaskManager/Process.class.h index d5fe454..24df783 100644 --- a/Source/Kernel/TaskManager/Process.class.h +++ b/Source/Kernel/TaskManager/Process.class.h @@ -36,7 +36,7 @@ class Process : public Ressource { u32int m_pid; //Process IDentifier u32int m_ppid; //Parent PID - String m_cmdline; + Vector<String> m_arguments; s32int m_retval; //Can be either a standard return value or an E_* (see #defines above) u8int m_state; //Is one of P_* defined above PageDirectory* m_pagedir; @@ -54,13 +54,14 @@ class Process : public Ressource { u32int getCmdlineSC(); u32int allocPageSC(u32int); u32int freePageSC(u32int); + bool accessible(); public: static u32int scall(u8int, u32int, u32int, u32int, u32int); static Process* createKernel(String cmdline, VirtualTerminal *vt); //Also creates a Thread for what's curently happening static Process* run(String filename, FSNode* cwd, u32int uid); - Process(String cmdline, u32int uid); + Process(String binfile, u32int uid); ~Process(); Heap& heap() { return *m_userHeap; } diff --git a/Source/Kernel/TaskManager/Thread.class.cpp b/Source/Kernel/TaskManager/Thread.class.cpp index a9c53ed..ba3612d 100644 --- a/Source/Kernel/TaskManager/Thread.class.cpp +++ b/Source/Kernel/TaskManager/Thread.class.cpp @@ -3,6 +3,7 @@ #include <MemoryManager/PageAlloc.ns.h> #include <DeviceManager/Time.ns.h> #include <MemoryManager/GDT.ns.h> +#include <UserManager/Usr.ns.h> #include <Thread.iface.h> @@ -239,4 +240,6 @@ u32int Thread::finishSC(u32int errcode) { return 0; } - +bool Thread::accessible() { + return (Usr::uid() == m_process->m_uid); +} diff --git a/Source/Kernel/TaskManager/Thread.class.h b/Source/Kernel/TaskManager/Thread.class.h index 35a9fd6..6d37350 100644 --- a/Source/Kernel/TaskManager/Thread.class.h +++ b/Source/Kernel/TaskManager/Thread.class.h @@ -41,6 +41,7 @@ class Thread : public Ressource { static call_t m_callTable[]; u32int sleepSC(u32int msecs); u32int finishSC(u32int errcode); + bool accessible(); public: static u32int scall(u8int, u32int, u32int, u32int, u32int); |