summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/include/sys/filedesc.h6
-rw-r--r--sys/kern/kern_descrip.c36
-rw-r--r--sys/kern/kern_proc.c2
-rw-r--r--sys/kern/kern_socket.c4
-rw-r--r--sys/vm/vm_map.c2
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;