git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix: symlink resolve.
[lunaix-os.git]
/
lunaix-os
/
kernel
/
process.c
diff --git
a/lunaix-os/kernel/process.c
b/lunaix-os/kernel/process.c
index a783efe13987a6a2b1c46fd932d67b863314b594..086a5e3105a184ca3ccf784f3f8fb7cba46445f9 100644
(file)
--- a/
lunaix-os/kernel/process.c
+++ b/
lunaix-os/kernel/process.c
@@
-3,6
+3,7
@@
#include <lunaix/common.h>
#include <lunaix/mm/pmm.h>
#include <lunaix/mm/region.h>
#include <lunaix/common.h>
#include <lunaix/mm/pmm.h>
#include <lunaix/mm/region.h>
+#include <lunaix/mm/valloc.h>
#include <lunaix/mm/vmm.h>
#include <lunaix/process.h>
#include <lunaix/spike.h>
#include <lunaix/mm/vmm.h>
#include <lunaix/process.h>
#include <lunaix/spike.h>
@@
-114,7
+115,7
@@
__DEFINE_LXSYSCALL2(int, setpgid, pid_t, pid, pid_t, pgid)
struct proc_info* proc = pid ? get_process(pid) : __current;
if (!proc) {
struct proc_info* proc = pid ? get_process(pid) : __current;
if (!proc) {
- __current->k_status =
LXINV
L;
+ __current->k_status =
EINVA
L;
return -1;
}
return -1;
}
@@
-123,7
+124,7
@@
__DEFINE_LXSYSCALL2(int, setpgid, pid_t, pid, pid_t, pgid)
struct proc_info* gruppenfuhrer = get_process(pgid);
if (!gruppenfuhrer || proc->pgid == proc->pid) {
struct proc_info* gruppenfuhrer = get_process(pgid);
if (!gruppenfuhrer || proc->pgid == proc->pid) {
- __current->k_status =
LXINV
L;
+ __current->k_status =
EINVA
L;
return -1;
}
return -1;
}
@@
-176,6
+177,17
@@
__mark_region(uintptr_t start_vpn, uintptr_t end_vpn, int attr)
}
}
}
}
+void
+__copy_fdtable(struct proc_info* pcb)
+{
+ for (size_t i = 0; i < VFS_MAX_FD; i++) {
+ struct v_fd* fd = __current->fdtable->fds[i];
+ if (!fd)
+ continue;
+ vfs_dup_fd(fd, &pcb->fdtable->fds[i]);
+ }
+}
+
pid_t
dup_proc()
{
pid_t
dup_proc()
{
@@
-184,6
+196,7
@@
dup_proc()
pcb->intr_ctx = __current->intr_ctx;
pcb->parent = __current;
pcb->intr_ctx = __current->intr_ctx;
pcb->parent = __current;
+ __copy_fdtable(pcb);
region_copy(&__current->mm.regions, &pcb->mm.regions);
setup_proc_mem(pcb, PD_REFERENCED);
region_copy(&__current->mm.regions, &pcb->mm.regions);
setup_proc_mem(pcb, PD_REFERENCED);