summaryrefslogtreecommitdiff
path: root/src/kernel/proc.c
diff options
context:
space:
mode:
authordzwdz2023-06-10 17:47:16 +0200
committerdzwdz2023-06-10 17:47:16 +0200
commit17fe7bc9c8311f7e192385e47550607e61874528 (patch)
tree2e64187a886fa88c652e5df5e6b8e36e34609f7e /src/kernel/proc.c
parentede58f88397ad32f4d573d17811279735e2e386a (diff)
kernel: implement DUP_SEARCH (like unix's F_DUPFD)
Diffstat (limited to 'src/kernel/proc.c')
-rw-r--r--src/kernel/proc.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/kernel/proc.c b/src/kernel/proc.c
index 108a006..ecbd839 100644
--- a/src/kernel/proc.c
+++ b/src/kernel/proc.c
@@ -484,6 +484,9 @@ Proc *proc_next(Proc *p, Proc *root) {
}
hid_t proc_find_free_handle(Proc *proc, hid_t start_at) {
+ if (start_at < 0) {
+ start_at = 0;
+ }
for (hid_t hid = start_at; hid < HANDLE_MAX; hid++) {
if (proc->_handles[hid] == NULL)
return hid;
@@ -526,11 +529,11 @@ hid_t proc_handle_init(Proc *p, enum handle_type type, Handle **hs) {
return hid;
}
-hid_t proc_handle_dup(Proc *p, hid_t from, hid_t to) {
+hid_t proc_handle_dup(Proc *p, hid_t from, hid_t to, int flags) {
Handle *fromh, **toh;
- if (to < 0) {
- to = proc_find_free_handle(p, 0);
+ if (to < 0 || (flags & DUP_SEARCH)) {
+ to = proc_find_free_handle(p, to);
if (to < 0) return -EMFILE;
} else if (to >= HANDLE_MAX) {
return -EBADF;