summaryrefslogtreecommitdiff
path: root/Source/Kernel/TaskManager
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-10-23 17:28:25 +0200
committerAlexis211 <alexis211@gmail.com>2009-10-23 17:28:25 +0200
commitf0556ed7f051fb101dc68752526696365bf79a11 (patch)
tree61345fbadbf76c6f12b36b48a9dfadd744f6cbbd /Source/Kernel/TaskManager
parentdf179c18baab4b5d85a283924fb23dfee7ea7fdb (diff)
downloadMelon-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.cpp24
-rw-r--r--Source/Kernel/TaskManager/Process.class.h5
-rw-r--r--Source/Kernel/TaskManager/Thread.class.cpp5
-rw-r--r--Source/Kernel/TaskManager/Thread.class.h1
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);