#include #include #include #include #include #include #include #include #include #include /* 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; }