diff options
Diffstat (limited to 'src/sys/os')
-rw-r--r-- | src/sys/os/os_filedes.c | 47 | ||||
-rw-r--r-- | src/sys/os/os_init.c | 5 | ||||
-rw-r--r-- | src/sys/os/os_omar.c | 6 | ||||
-rw-r--r-- | src/sys/os/os_proc.c | 30 | ||||
-rw-r--r-- | src/sys/os/vfs_subr.c | 27 |
5 files changed, 107 insertions, 8 deletions
diff --git a/src/sys/os/os_filedes.c b/src/sys/os/os_filedes.c index 9ba0c63..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 */ @@ -227,8 +253,9 @@ write(int fd, const void *buf, size_t count) { struct proc *self = proc_self(); struct filedesc *fdp; - int error; + ssize_t retval; char kbuf[1024]; + int error; if (self == NULL) { return -ESRCH; @@ -267,7 +294,13 @@ write(int fd, const void *buf, size_t count) if (fdp->vp == NULL) { return -EIO; } - return vop_write(fdp->vp, kbuf, count); + retval = vop_write(fdp->vp, kbuf, fdp->off, count); + if (retval <= 0) { + return retval; + } + + /* Move away from where we wrote */ + fdp->off += count; } return count; @@ -278,6 +311,7 @@ read(int fd, void *buf, size_t count) { struct proc *self = proc_self(); struct filedesc *fdp; + ssize_t retval; int error; if (buf == NULL) { @@ -304,7 +338,14 @@ read(int fd, void *buf, size_t count) return -EIO; } - return vop_read(fdp->vp, buf, count); + /* Read the file */ + retval = vop_read(fdp->vp, buf, fdp->off, count); + if (retval <= 0) { + return retval; + } + + fdp->off += count; + return retval; } /* diff --git a/src/sys/os/os_init.c b/src/sys/os/os_init.c index 43468b3..8287f1a 100644 --- a/src/sys/os/os_init.c +++ b/src/sys/os/os_init.c @@ -73,14 +73,15 @@ main(void) vm_init(); cpu_init(&g_bsp); - bsp_ap_startup(); vfs_init(); ns_init(); + sched_init(); + bsp_ap_startup(); + /* Initialize generic modules */ __MODULES_INIT(MODTYPE_GENERIC); - sched_init(); core = this_core(); proc_init(&g_rootproc, 0); core->curproc = &g_rootproc; diff --git a/src/sys/os/os_omar.c b/src/sys/os/os_omar.c index 9ad3739..8e63ae7 100644 --- a/src/sys/os/os_omar.c +++ b/src/sys/os/os_omar.c @@ -258,7 +258,11 @@ initrd_read(struct vop_rw_data *data) len = MIN(data->len, np->size); for (int i = 0; i < len; ++i) { - dest[i] = src[i]; + if ((i + data->off) >= np->size) { + /* End of file */ + return 0; + } + dest[i] = src[data->off + i]; } return len; diff --git a/src/sys/os/os_proc.c b/src/sys/os/os_proc.c index 582c077..a8f49d7 100644 --- a/src/sys/os/os_proc.c +++ b/src/sys/os/os_proc.c @@ -393,6 +393,36 @@ proc_spawn(const char *path, struct penv_blk *envbp) return proc->pid; } +int +proc_ktd(struct proc **procp_res, void(*fn)(void *)) +{ + struct proc *proc; + struct pcore *core; + + if (procp_res == NULL || fn == NULL) { + return -EINVAL; + } + + proc = kalloc(sizeof(*proc)); + if (proc == NULL) { + return -ENOMEM; + } + + core = cpu_sched(); + if (core == NULL) { + kfree(proc); + return -EIO; + } + + proc_init(proc, SPAWN_KTD); + md_set_ip(proc, (uintptr_t)fn); + sched_enq(&core->scq, proc); + + *procp_res = proc; + TAILQ_INSERT_TAIL(&procq, proc, lup_link); + return 0; +} + /* * ARG0: Pathname to spawn * ARG1: Process environment block diff --git a/src/sys/os/vfs_subr.c b/src/sys/os/vfs_subr.c index 47ed468..6cb7767 100644 --- a/src/sys/os/vfs_subr.c +++ b/src/sys/os/vfs_subr.c @@ -145,7 +145,7 @@ vfs_cmp_cnt(const char *path) } ssize_t -vop_write(struct vnode *vp, char *data, size_t len) +vop_write(struct vnode *vp, char *data, off_t off, size_t len) { struct vop_rw_data rwdata; struct vop *vops; @@ -170,11 +170,12 @@ vop_write(struct vnode *vp, char *data, size_t len) rwdata.data = data; rwdata.len = len; rwdata.vp = vp; + rwdata.off = off; return vops->write(&rwdata); } ssize_t -vop_read(struct vnode *vp, char *data, size_t len) +vop_read(struct vnode *vp, char *data, off_t off, size_t len) { struct vop_rw_data rwdata; struct vop *vops; @@ -199,5 +200,27 @@ vop_read(struct vnode *vp, char *data, size_t len) rwdata.data = data; rwdata.len = len; rwdata.vp = vp; + rwdata.off = off; return vops->read(&rwdata); } + +int +vop_reclaim(struct vnode *vp, int flags) +{ + struct vop *vops; + + if (vp == NULL) { + return -EINVAL; + } + + /* Grab the virtual operations */ + if ((vops = vp->vops) == NULL) { + return -EIO; + } + + if (vops->reclaim == NULL) { + return -ENOTSUP; + } + + return vops->reclaim(vp, flags); +} |