diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-31 06:16:22 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-31 06:16:22 -0400 |
commit | 7e8ff80fadd2066f8fa9a058efe23aa301325433 (patch) | |
tree | 15ceceea43cf54092bf7e006d49bfe3514d1eeda /sys | |
parent | cd929e7209f3fd67e1fab257ea76994bbb3fc64f (diff) |
kernel: descrip: Add 'td' parameter to fd routines
Update the signature of 'fd_get()', 'fd_alloc()' and 'fd_dup()' to
include a pointer to the process to target. This improves the
flexibility of the file descriptor API.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/include/sys/filedesc.h | 6 | ||||
-rw-r--r-- | sys/kern/kern_descrip.c | 36 | ||||
-rw-r--r-- | sys/kern/kern_proc.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_socket.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_map.c | 2 |
5 files changed, 32 insertions, 18 deletions
diff --git a/sys/include/sys/filedesc.h b/sys/include/sys/filedesc.h index 4ce2db2..adbcfa8 100644 --- a/sys/include/sys/filedesc.h +++ b/sys/include/sys/filedesc.h @@ -55,12 +55,12 @@ int fd_close(unsigned int fd); int fd_read(unsigned int fd, void *buf, size_t count); int fd_write(unsigned int fd, void *buf, size_t count); -int fd_alloc(struct filedesc **fd_out); +int fd_alloc(struct proc *td, struct filedesc **fd_out); int fd_open(const char *pathname, int flags); off_t fd_seek(int fildes, off_t offset, int whence); -int fd_dup(int fd); -struct filedesc *fd_get(unsigned int fdno); +int fd_dup(struct proc *td, int fd); +struct filedesc *fd_get(struct proc *td, unsigned int fdno); scret_t sys_lseek(struct syscall_args *scargs); diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 57beaf6..c8f8357 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -41,6 +41,7 @@ /* * Allocate a file descriptor. * + * @td: Process to allocate from (null for CURRENT) * @fd_out: Pointer to allocated file descriptor output. * * This routine will create a new file descriptor @@ -49,10 +50,13 @@ * Returns 0 on success. */ int -fd_alloc(struct filedesc **fd_out) +fd_alloc(struct proc *td, struct filedesc **fd_out) { struct filedesc *fd; - struct proc *td = this_td(); + + if (td == NULL) { + td = this_td(); + } /* Find free fd table entry */ for (size_t i = 3; i < PROC_MAX_FILEDES; ++i) { @@ -85,12 +89,15 @@ fd_alloc(struct filedesc **fd_out) * Fetch a file descriptor from a file descriptor * number. * + * @td: Process to get fd from (NULL for current) * @fdno: File descriptor to fetch */ struct filedesc * -fd_get(unsigned int fdno) +fd_get(struct proc *td, unsigned int fdno) { - struct proc *td = this_td(); + if (td == NULL) { + td = this_td(); + } if (fdno > PROC_MAX_FILEDES) { return NULL; @@ -111,7 +118,7 @@ fd_close(unsigned int fd) struct filedesc *filedes; struct proc *td; - if ((filedes = fd_get(fd)) == NULL) { + if ((filedes = fd_get(NULL, fd)) == NULL) { return -EBADF; } @@ -163,7 +170,7 @@ fd_rw(unsigned int fd, void *buf, size_t count, uint8_t write) goto done; } - filedes = fd_get(fd); + filedes = fd_get(NULL, fd); seal = filedes->flags; /* Check the seal */ @@ -300,7 +307,7 @@ fd_open(const char *pathname, int flags) return error; } - if ((error = fd_alloc(&filedes)) != 0) { + if ((error = fd_alloc(NULL, &filedes)) != 0) { vfs_release_vnode(nd.vp); return error; } @@ -321,18 +328,25 @@ fd_open(const char *pathname, int flags) /* * Duplicate a file descriptor. New file descriptor * points to the same vnode. + * + * @td: Process of fd to dup (NULL for current) + * @fd: File descriptor to dup */ int -fd_dup(int fd) +fd_dup(struct proc *td, int fd) { int error; struct filedesc *new_desc, *tmp; - tmp = fd_get(fd); + if (td == NULL) { + td = this_td(); + } + + tmp = fd_get(td, fd); if (tmp == NULL) return -EBADF; - if ((error = fd_alloc(&new_desc)) != 0) + if ((error = fd_alloc(td, &new_desc)) != 0) return error; /* Ref that vnode before we point to it */ @@ -348,7 +362,7 @@ fd_seek(int fildes, off_t offset, int whence) struct vattr attr; struct vop_getattr_args getattr_args; - tmp = fd_get(fildes); + tmp = fd_get(NULL, fildes); if (tmp == NULL) { return -EBADF; } diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 16cd4b2..87dcc74 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -89,7 +89,7 @@ proc_coredump(struct proc *td, uintptr_t fault_addr) memcpy(&core.tf, &td->tf, sizeof(td->tf)); core.checksum = crc32(&core, sizeof(core) - sizeof(core.checksum)); - vp = fd_get(fd)->vp; + vp = fd_get(NULL, fd)->vp; sio.buf = &core; sio.len = sizeof(core); diff --git a/sys/kern/kern_socket.c b/sys/kern/kern_socket.c index 8be5031..77041cd 100644 --- a/sys/kern/kern_socket.c +++ b/sys/kern/kern_socket.c @@ -64,7 +64,7 @@ get_ksock(int sockfd, struct ksocket **res) } /* Grab the file descriptor */ - fdesc = fd_get(sockfd); + fdesc = fd_get(NULL, sockfd); if (fdesc == NULL) { return -EBADF; } @@ -247,7 +247,7 @@ socket(int domain, int type, int protocol) struct sockbuf *sbuf = NULL; int fd, error = -1; - if ((error = fd_alloc(&fdesc)) < 0) { + if ((error = fd_alloc(NULL, &fdesc)) < 0) { return error; } diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 26effdb..bb9df83 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -192,7 +192,7 @@ mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) * is shared. */ if (ISSET(flags, MAP_SHARED)) { - fdp = fd_get(fildes); + fdp = fd_get(NULL, fildes); if (fdp == NULL) { pr_error("mmap: no such fd (fd=%d)\n", fildes); return NULL; |