diff options
Diffstat (limited to 'src/sys')
-rw-r--r-- | src/sys/compat/unix/os/os_filedesc.c | 11 | ||||
-rw-r--r-- | src/sys/include/compat/unix/syscall.h | 8 | ||||
-rw-r--r-- | src/sys/include/os/filedesc.h | 10 | ||||
-rw-r--r-- | src/sys/include/sys/syscall.h | 1 | ||||
-rw-r--r-- | src/sys/os/os_filedes.c | 26 |
5 files changed, 55 insertions, 1 deletions
diff --git a/src/sys/compat/unix/os/os_filedesc.c b/src/sys/compat/unix/os/os_filedesc.c index 673701f..952f022 100644 --- a/src/sys/compat/unix/os/os_filedesc.c +++ b/src/sys/compat/unix/os/os_filedesc.c @@ -138,3 +138,14 @@ sys_read(struct syscall_args *scargs) kfree(kbuf); return (error == 0) ? retval : error; } + +/* + * ARG0: FD + */ +scret_t +sys_close(struct syscall_args *scargs) +{ + int fd = SCARG(scargs, int, 0); + + return fd_close(fd); +} diff --git a/src/sys/include/compat/unix/syscall.h b/src/sys/include/compat/unix/syscall.h index be351e8..a031872 100644 --- a/src/sys/include/compat/unix/syscall.h +++ b/src/sys/include/compat/unix/syscall.h @@ -68,6 +68,11 @@ scret_t sys_open(struct syscall_args *scargs); */ scret_t sys_read(struct syscall_args *scargs); +/* + * Close a file + */ +scret_t sys_close(struct syscall_args *scargs); + #ifdef _NEED_UNIX_SCTAB scret_t(*g_unix_sctab[])(struct syscall_args *) = { [SYS_none] = NULL, @@ -83,7 +88,8 @@ scret_t(*g_unix_sctab[])(struct syscall_args *) = { [SYS_reboot] = sys_reboot, [SYS_waitpid] = sys_waitpid, [SYS_dmsio] = sys_dmsio, - [SYS_read] = sys_read + [SYS_read] = sys_read, + [SYS_close] = sys_close }; #endif /* !_NEED_UNIX_SCTAB */ diff --git a/src/sys/include/os/filedesc.h b/src/sys/include/os/filedesc.h index fb899cf..a6a2ac5 100644 --- a/src/sys/include/os/filedesc.h +++ b/src/sys/include/os/filedesc.h @@ -84,6 +84,16 @@ int fdtab_init(struct proc *procp); int fd_open(const char *path, mode_t mode); /* + * Close a file + * + * @fd: File descriptor to close + * + * Returns zero on success, otherwise a less than + * zero value on failure + */ +int fd_close(int fd); + +/* * Write to a file descriptor * * @fd: File descriptor to write to diff --git a/src/sys/include/sys/syscall.h b/src/sys/include/sys/syscall.h index 1138029..77b7505 100644 --- a/src/sys/include/sys/syscall.h +++ b/src/sys/include/sys/syscall.h @@ -57,6 +57,7 @@ #define SYS_waitpid 0x0C /* wait for child to exit */ #define SYS_dmsio 0x0D /* DMS I/O */ #define SYS_read 0x0E /* read a file descriptor */ +#define SYS_close 0x0F /* close a file */ typedef __ssize_t scret_t; typedef __ssize_t scarg_t; diff --git a/src/sys/os/os_filedes.c b/src/sys/os/os_filedes.c index 948bad2..95452af 100644 --- a/src/sys/os/os_filedes.c +++ b/src/sys/os/os_filedes.c @@ -197,6 +197,32 @@ fd_open(const char *path, mode_t mode) return fd->fdno; } +int +fd_close(int fd) +{ + struct filedesc *fdp; + struct proc *proc = proc_self(); + struct vnode *vp; + + if (fd < 0) { + return -EBADF; + } + + if (proc == NULL) { + return -EIO; + } + + if ((fdp = fd_get(proc, fd)) == NULL) { + return -EIO; + } + + vp = fdp->vp; + proc->fdtab[fdp->fdno] = NULL; + + kfree(fdp); + return vop_reclaim(vp, 0); +} + /* * Initialize file descriptor table */ |