123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #include <types.h>
- #include <kern/errno.h>
- #include <kern/unistd.h>
- #include <lib.h>
- #include <uio.h>
- #include <syscall.h>
- #include <vnode.h>
- #include <vfs.h>
- #include <current.h>
- #include <proc.h>
- /* handler for write() system call */
- /*
- * n.b.
- * This implementation handles only writes to standard output
- * and standard error, both of which go to the console.
- * Also, it does not provide any synchronization, so writes
- * are not atomic.
- *
- * You will need to improve this implementation
- */
- int
- sys_write(int fdesc,userptr_t ubuf,unsigned int nbytes,int *retval)
- {
- struct iovec iov;
- struct uio u;
- int res;
- DEBUG(DB_SYSCALL,"Syscall: write(%d,%x,%d)\n",fdesc,(unsigned int)ubuf,nbytes);
-
- /* only stdout and stderr writes are currently implemented */
- if (!((fdesc==STDOUT_FILENO)||(fdesc==STDERR_FILENO))) {
- return EUNIMP;
- }
- KASSERT(curproc != NULL);
- KASSERT(curproc->console != NULL);
- KASSERT(curproc->p_addrspace != NULL);
- /* set up a uio structure to refer to the user program's buffer (ubuf) */
- iov.iov_ubase = ubuf;
- iov.iov_len = nbytes;
- u.uio_iov = &iov;
- u.uio_iovcnt = 1;
- u.uio_offset = 0; /* not needed for the console */
- u.uio_resid = nbytes;
- u.uio_segflg = UIO_USERSPACE;
- u.uio_rw = UIO_WRITE;
- u.uio_space = curproc->p_addrspace;
- res = VOP_WRITE(curproc->console,&u);
- if (res) {
- return res;
- }
- /* pass back the number of bytes actually written */
- *retval = nbytes - u.uio_resid;
- KASSERT(*retval >= 0);
- return 0;
- }
|