summaryrefslogtreecommitdiff
path: root/Source/Kernel/TaskManager
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Kernel/TaskManager')
-rw-r--r--Source/Kernel/TaskManager/Process-sc.class.cpp143
-rw-r--r--Source/Kernel/TaskManager/Process.class.cpp113
-rw-r--r--Source/Kernel/TaskManager/Process.class.h2
3 files changed, 145 insertions, 113 deletions
diff --git a/Source/Kernel/TaskManager/Process-sc.class.cpp b/Source/Kernel/TaskManager/Process-sc.class.cpp
new file mode 100644
index 0000000..5a94c81
--- /dev/null
+++ b/Source/Kernel/TaskManager/Process-sc.class.cpp
@@ -0,0 +1,143 @@
+#include "Process.class.h"
+#include <TaskManager/Task.ns.h>
+#include <Process.iface.h>
+#include <UserManager/Usr.ns.h>
+#include <VirtualTerminal.iface.h>
+#include <SyscallManager/Res.ns.h>
+
+#define ISPARENT Task::currProcess()->getPid() == m_ppid
+
+call_t Process::m_callTable[] = {
+ CALL0(PRIF_EXIT, &Process::exitSC),
+ CALL1(PRIF_ALLOCPAGE, &Process::allocPageSC),
+ CALL1(PRIF_FREEPAGE, &Process::freePageSC),
+ CALL0(PRIF_GETPID, &Process::getPid),
+ CALL0(PRIF_GETPPID, &Process::getPpid),
+ CALL0(PRIF_ARGC, &Process::argcSC),
+ CALL1(PRIF_ARGV, &Process::argvSC),
+ CALL0(PRIF_START, &Process::startSC),
+ CALL1(PRIF_AUTODELETE, &Process::autoDeleteSC),
+ CALL1(PRIF_PUSHARG, &Process::pushArgSC),
+ CALL1(PRIF_SETOUTVT, &Process::setOutVTSC),
+ CALL1(PRIF_SETINVT, &Process::setInVTSC),
+ CALL2(PRIF_AUTHPW, &Process::authPWSC),
+ CALL1(PRIF_AUTHNOPW, &Process::authNoPWSC),
+ CALL0(0, 0)
+};
+
+u32int Process::scall(u8int wat, u32int a, u32int b, u32int c, u32int d) {
+ if (wat == PRIF_SGETCPR) return Task::currProcess()->resId();
+ if (wat == PRIF_SRUN) {
+ String* e = (String*)a;
+ Process* p = Process::run(*e, Usr::uid());
+ if (p != 0) return p->resId();
+ }
+ if (wat == PRIF_SWAIT) {
+ Process* p = Res::get<Process>(a, PRIF_OBJTYPE);
+ if (Task::currProcess()->getPid() != p->m_ppid) return 0;
+ while (p->m_state != P_FINISHED and !p->m_autodelete) Task::currThread()->sleep(20);
+ if (p->m_autodelete) return E_AUTODELETE;
+ s32int ret = p->m_retval;
+ delete p;
+ return ret;
+ }
+ return (u32int) - 1;
+}
+
+u32int Process::exitSC() {
+ if (Task::currProcess() != this) return 1;
+ Task::currentThreadExits(E_EXIT);
+ return 0;
+}
+
+u32int Process::allocPageSC(u32int pos) {
+ if (Task::currProcess() != this) return 1;
+ if ((pos & 0x00000FFF) != 0) pos = (pos & 0xFFFFF000) + 0x1000;
+ if (pos >= 0xC0000000) return 1;
+ m_pagedir->allocFrame(pos, true, true);
+ return 0;
+}
+
+u32int Process::argcSC() {
+ if (Usr::uid() == m_uid or ISROOT or ISPARENT) {
+ return (m_arguments.size());
+ }
+ return (u32int) - 1;
+}
+
+u32int Process::argvSC(u32int idx) {
+ if (idx >= m_arguments.size()) return (u32int) - 1;
+ if (Usr::uid() == m_uid or ISROOT or ISPARENT) {
+ return m_arguments[idx].serialize();
+ }
+ return (u32int) - 1;
+}
+
+u32int Process::freePageSC(u32int pos) {
+ if (Task::currProcess() != this) return 1;
+ if ((pos & 0x00000FFF) != 0) pos = (pos & 0xFFFFF000) + 0x1000;
+ if (pos >= 0xC0000000) return 1;
+ m_pagedir->freeFrame(pos);
+ return 0;
+}
+
+u32int Process::startSC() {
+ if (Task::currProcess()->getPid() == m_ppid) {
+ start();
+ return 1;
+ }
+ return 0;
+}
+
+u32int Process::autoDeleteSC(u32int d) {
+ if (Task::currProcess()->getPid() != m_ppid) return 2;
+ m_autodelete = (d != 0);
+ return (m_autodelete ? 1 : 0);
+}
+
+u32int Process::pushArgSC(u32int arg) {
+ String* a = (String*)arg;
+ m_arguments.push(*a);
+ return 0;
+}
+
+u32int Process::setInVTSC(u32int vtid) {
+ if (Task::currProcess()->getPid() != m_ppid) return 0;
+ VirtualTerminal* vt = Res::get<VirtualTerminal>(vtid, VTIF_OBJTYPE);
+ if (vt != 0) setInVT(vt);
+ return 1;
+}
+
+u32int Process::setOutVTSC(u32int vtid) {
+ if (Task::currProcess()->getPid() != m_ppid) return 0;
+ VirtualTerminal* vt = Res::get<VirtualTerminal>(vtid, VTIF_OBJTYPE);
+ if (vt != 0) setOutVT(vt);
+ return 1;
+}
+
+u32int Process::authPWSC(u32int user, u32int pw) {
+ if (Task::currProcess() != this) return 0;
+ String* u = (String*)user;
+ String* p = (String*)pw;
+ User* usr = Usr::user(*u);
+ if (usr == 0) return 0;
+ if (usr->vrfyPassword(*p)) {
+ m_uid = usr->getUid();
+ return 1;
+ }
+ return 0;
+}
+
+u32int Process::authNoPWSC(u32int user) {
+ if (Task::currProcess() != this) return 0;
+ if (!ISROOT) return 0;
+ String* u = (String*)user;
+ User* usr = Usr::user(*u);
+ if (usr == 0) return 0;
+ m_uid = usr->getUid();
+ return 1;
+}
+
+bool Process::accessible() {
+ return (m_uid == Usr::uid());
+}
diff --git a/Source/Kernel/TaskManager/Process.class.cpp b/Source/Kernel/TaskManager/Process.class.cpp
index eec28d8..bca5f1c 100644
--- a/Source/Kernel/TaskManager/Process.class.cpp
+++ b/Source/Kernel/TaskManager/Process.class.cpp
@@ -8,47 +8,10 @@
#include <VirtualTerminal.iface.h>
#include <SyscallManager/Res.ns.h>
-#define ISPARENT Task::currProcess()->getPid() == m_ppid
-
namespace Mem {
extern Heap kheap;
}
-call_t Process::m_callTable[] = {
- CALL0(PRIF_EXIT, &Process::exitSC),
- CALL1(PRIF_ALLOCPAGE, &Process::allocPageSC),
- CALL1(PRIF_FREEPAGE, &Process::freePageSC),
- CALL0(PRIF_GETPID, &Process::getPid),
- CALL0(PRIF_GETPPID, &Process::getPpid),
- CALL0(PRIF_ARGC, &Process::argcSC),
- CALL1(PRIF_ARGV, &Process::argvSC),
- CALL0(PRIF_START, &Process::startSC),
- CALL1(PRIF_AUTODELETE, &Process::autoDeleteSC),
- CALL1(PRIF_PUSHARG, &Process::pushArgSC),
- CALL1(PRIF_SETOUTVT, &Process::setOutVTSC),
- CALL1(PRIF_SETINVT, &Process::setInVTSC),
- CALL0(0, 0)
-};
-
-u32int Process::scall(u8int wat, u32int a, u32int b, u32int c, u32int d) {
- if (wat == PRIF_SGETCPR) return Task::currProcess()->resId();
- if (wat == PRIF_SRUN) {
- String* e = (String*)a;
- Process* p = Process::run(*e, Usr::uid());
- if (p != 0) return p->resId();
- }
- if (wat == PRIF_SWAIT) {
- Process* p = Res::get<Process>(a, PRIF_OBJTYPE);
- if (Task::currProcess()->getPid() != p->m_ppid) return 0;
- while (p->m_state != P_FINISHED and !p->m_autodelete) Task::currThread()->sleep(20);
- if (p->m_autodelete) return E_AUTODELETE;
- s32int ret = p->m_retval;
- delete p;
- return ret;
- }
- return (u32int) - 1;
-}
-
Process::Process() : Ressource(PRIF_OBJTYPE, m_callTable) { //Private constructor, does nothing
}
@@ -196,79 +159,3 @@ void Process::setInVT(VirtualTerminal* vt) {
void Process::setOutVT(VirtualTerminal* vt) {
m_outVT = vt;
}
-
-u32int Process::exitSC() {
- if (Task::currProcess() != this) return 1;
- Task::currentThreadExits(E_EXIT);
- return 0;
-}
-
-u32int Process::allocPageSC(u32int pos) {
- if (Task::currProcess() != this) return 1;
- if ((pos & 0x00000FFF) != 0) pos = (pos & 0xFFFFF000) + 0x1000;
- if (pos >= 0xC0000000) return 1;
- m_pagedir->allocFrame(pos, true, true);
- return 0;
-}
-
-u32int Process::argcSC() {
- if (Usr::uid() == m_uid or ISROOT or ISPARENT) {
- return (m_arguments.size());
- }
- return (u32int) - 1;
-}
-
-u32int Process::argvSC(u32int idx) {
- if (idx >= m_arguments.size()) return (u32int) - 1;
- if (Usr::uid() == m_uid or ISROOT or ISPARENT) {
- return m_arguments[idx].serialize();
- }
- return (u32int) - 1;
-}
-
-u32int Process::freePageSC(u32int pos) {
- if (Task::currProcess() != this) return 1;
- if ((pos & 0x00000FFF) != 0) pos = (pos & 0xFFFFF000) + 0x1000;
- if (pos >= 0xC0000000) return 1;
- m_pagedir->freeFrame(pos);
- return 0;
-}
-
-u32int Process::startSC() {
- if (Task::currProcess()->getPid() == m_ppid) {
- start();
- return 1;
- }
- return 0;
-}
-
-u32int Process::autoDeleteSC(u32int d) {
- if (Task::currProcess()->getPid() != m_ppid) return 2;
- m_autodelete = (d != 0);
- return (m_autodelete ? 1 : 0);
-}
-
-u32int Process::pushArgSC(u32int arg) {
- String* a = (String*)arg;
- m_arguments.push(*a);
- return 0;
-}
-
-u32int Process::setInVTSC(u32int vtid) {
- if (Task::currProcess()->getPid() != m_ppid) return 0;
- VirtualTerminal* vt = Res::get<VirtualTerminal>(vtid, VTIF_OBJTYPE);
- if (vt != 0) setInVT(vt);
- return 1;
-}
-
-u32int Process::setOutVTSC(u32int vtid) {
- if (Task::currProcess()->getPid() != m_ppid) return 0;
- VirtualTerminal* vt = Res::get<VirtualTerminal>(vtid, VTIF_OBJTYPE);
- if (vt != 0) setOutVT(vt);
- return 1;
-}
-
-
-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 11da57b..053a640 100644
--- a/Source/Kernel/TaskManager/Process.class.h
+++ b/Source/Kernel/TaskManager/Process.class.h
@@ -64,6 +64,8 @@ class Process : public Ressource {
u32int pushArgSC(u32int);
u32int setOutVTSC(u32int);
u32int setInVTSC(u32int);
+ u32int authPWSC(u32int, u32int);
+ u32int authNoPWSC(u32int);
bool accessible();
public: