diff options
Diffstat (limited to 'src/sys')
-rw-r--r-- | src/sys/include/compat/unix/syscall.h | 5 | ||||
-rw-r--r-- | src/sys/include/os/filedesc.h | 11 | ||||
-rw-r--r-- | src/sys/include/sys/syscall.h | 1 | ||||
-rw-r--r-- | src/sys/os/os_filedes.c | 66 |
4 files changed, 82 insertions, 1 deletions
diff --git a/src/sys/include/compat/unix/syscall.h b/src/sys/include/compat/unix/syscall.h index 5339d47..14088f4 100644 --- a/src/sys/include/compat/unix/syscall.h +++ b/src/sys/include/compat/unix/syscall.h @@ -55,6 +55,11 @@ scret_t sys_cross(struct syscall_args *scargs); */ scret_t sys_query(struct syscall_args *scargs); +/* + * Open a file + */ +scret_t sys_open(struct syscall_args *scargs); + #ifdef _NEED_UNIX_SCTAB scret_t(*g_unix_sctab[])(struct syscall_args *) = { [SYS_none] = NULL, diff --git a/src/sys/include/os/filedesc.h b/src/sys/include/os/filedesc.h index 87bf242..c339ed6 100644 --- a/src/sys/include/os/filedesc.h +++ b/src/sys/include/os/filedesc.h @@ -60,6 +60,17 @@ struct filedesc { int fdtab_init(struct proc *procp); /* + * Open a file + * + * @path: Path to file in which we wish to open + * @mode: Mode of our desired file + * + * Returns the file descriptor on success, + * otherwise a less than zero value on failure. + */ +int fd_open(const char *path, mode_t mode); + +/* * 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 4121d54..181f734 100644 --- a/src/sys/include/sys/syscall.h +++ b/src/sys/include/sys/syscall.h @@ -50,6 +50,7 @@ #define SYS_query 0x05 /* query a border (mandatory) */ #define SYS_spawn 0x06 /* spawn a process */ #define SYS_mount 0x07 /* mount a filesystem */ +#define SYS_open 0x08 /* open 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 e7cc83a..3353a5f 100644 --- a/src/sys/os/os_filedes.c +++ b/src/sys/os/os_filedes.c @@ -31,10 +31,13 @@ #include <sys/syslog.h> #include <sys/errno.h> #include <sys/limits.h> +#include <sys/proc.h> +#include <sys/namei.h> #include <os/filedesc.h> #include <os/kalloc.h> +#include <os/systm.h> #include <io/cons/cons.h> -#include <sys/proc.h> +#include <compat/unix/syscall.h> #include <string.h> #define STDOUT_FILENO 1 @@ -86,6 +89,47 @@ fd_alloc(struct proc *procp, struct filedesc **fd_res) return -EMFILE; } +int +fd_open(const char *path, mode_t mode) +{ + struct filedesc *fd; + struct nameidata nd; + struct proc *self = proc_self(); + struct vnode *vp; + int error; + + /* We need the current proc */ + if (self == NULL) { + return -ESRCH; + } + + if (path == NULL) { + return -ESRCH; + } + + /* Allocate a new file descriptor */ + error = fd_alloc(self, &fd); + if (error < 0) { + return error; + } + + /* + * Now we try to do the lookup, we'll need + * the vnode for file references to be + * useful + */ + nd.path = path; + nd.flags = 0; + nd.vp_res = &vp; + error = namei(&nd); + if (error < 0) { + return error; + } + + fd->vp = vp; + return fd->fdno; +} + /* * Initialize file descriptor table */ @@ -138,3 +182,23 @@ write(int fd, const void *buf, size_t count) return count; } + +/* + * ARG0: Path + * ARG1: Mode + */ +scret_t +sys_open(struct syscall_args *scargs) +{ + const char *u_path = SCARG(scargs, const char *, 0); + mode_t mode = SCARG(scargs, mode_t, 1); + char pathbuf[PATH_MAX]; + int error; + + error = copyinstr(u_path, pathbuf, sizeof(PATH_MAX)); + if (error < 0) { + return error; + } + + return fd_open(pathbuf, mode); +} |