1*16704Smckusick /* kern_subr.c 6.2 84/07/08 */ 212792Ssam 312792Ssam #include "../h/param.h" 412792Ssam #include "../h/systm.h" 512792Ssam #include "../h/dir.h" 612792Ssam #include "../h/user.h" 712792Ssam #include "../h/uio.h" 812792Ssam 912792Ssam uiomove(cp, n, rw, uio) 1012792Ssam register caddr_t cp; 1112792Ssam register int n; 1212792Ssam enum uio_rw rw; 1312792Ssam register struct uio *uio; 1412792Ssam { 1512792Ssam register struct iovec *iov; 1612792Ssam u_int cnt; 1712792Ssam int error = 0; 1812792Ssam 1912792Ssam while (n > 0 && uio->uio_resid) { 2012792Ssam iov = uio->uio_iov; 2112792Ssam cnt = iov->iov_len; 2212792Ssam if (cnt == 0) { 2312792Ssam uio->uio_iov++; 2412792Ssam uio->uio_iovcnt--; 2512792Ssam continue; 2612792Ssam } 2712792Ssam if (cnt > n) 2812792Ssam cnt = n; 2912792Ssam switch (uio->uio_segflg) { 3012792Ssam 31*16704Smckusick case UIO_USERSPACE: 32*16704Smckusick case UIO_USERISPACE: 3312792Ssam if (rw == UIO_READ) 3412792Ssam error = copyout(cp, iov->iov_base, cnt); 3512792Ssam else 3612792Ssam error = copyin(iov->iov_base, cp, cnt); 3712792Ssam if (error) 3812792Ssam return (error); 3912792Ssam break; 4012792Ssam 41*16704Smckusick case UIO_SYSSPACE: 4212792Ssam if (rw == UIO_READ) 4312792Ssam bcopy((caddr_t)cp, iov->iov_base, cnt); 4412792Ssam else 4512792Ssam bcopy(iov->iov_base, (caddr_t)cp, cnt); 4612792Ssam break; 4712792Ssam } 4812792Ssam iov->iov_base += cnt; 4912792Ssam iov->iov_len -= cnt; 5012792Ssam uio->uio_resid -= cnt; 5112792Ssam uio->uio_offset += cnt; 5212792Ssam cp += cnt; 5312792Ssam n -= cnt; 5412792Ssam } 5512792Ssam return (error); 5612792Ssam } 5712792Ssam 5812792Ssam /* 5912792Ssam * Give next character to user as result of read. 6012792Ssam */ 6112792Ssam ureadc(c, uio) 6212792Ssam register int c; 6312792Ssam register struct uio *uio; 6412792Ssam { 6512792Ssam register struct iovec *iov; 6612792Ssam 6712792Ssam again: 6812792Ssam if (uio->uio_iovcnt == 0) 6912792Ssam panic("ureadc"); 7012792Ssam iov = uio->uio_iov; 7112792Ssam if (iov->iov_len <= 0 || uio->uio_resid <= 0) { 7212792Ssam uio->uio_iovcnt--; 7312792Ssam uio->uio_iov++; 7412792Ssam goto again; 7512792Ssam } 7612792Ssam switch (uio->uio_segflg) { 7712792Ssam 78*16704Smckusick case UIO_USERSPACE: 7912792Ssam if (subyte(iov->iov_base, c) < 0) 8012792Ssam return (EFAULT); 8112792Ssam break; 8212792Ssam 83*16704Smckusick case UIO_SYSSPACE: 8412792Ssam *iov->iov_base = c; 8512792Ssam break; 8612792Ssam 87*16704Smckusick case UIO_USERISPACE: 8812792Ssam if (suibyte(iov->iov_base, c) < 0) 8912792Ssam return (EFAULT); 9012792Ssam break; 9112792Ssam } 9212792Ssam iov->iov_base++; 9312792Ssam iov->iov_len--; 9412792Ssam uio->uio_resid--; 9512792Ssam uio->uio_offset++; 9612792Ssam return (0); 9712792Ssam } 9812792Ssam 9912792Ssam #ifdef notdef 10012792Ssam /* 10112792Ssam * Get next character written in by user from uio. 10212792Ssam */ 10312792Ssam uwritec(uio) 10412792Ssam struct uio *uio; 10512792Ssam { 10612792Ssam register struct iovec *iov; 10712792Ssam register int c; 10812792Ssam 10912792Ssam again: 11012792Ssam if (uio->uio_iovcnt <= 0 || uio->uio_resid <= 0) 11112792Ssam panic("uwritec"); 11212792Ssam iov = uio->uio_iov; 11312792Ssam if (iov->iov_len == 0) { 11412792Ssam uio->uio_iovcnt--; 11512792Ssam uio->uio_iov++; 11612792Ssam goto again; 11712792Ssam } 11812792Ssam switch (uio->uio_segflg) { 11912792Ssam 120*16704Smckusick case UIO_USERSPACE: 12112792Ssam c = fubyte(iov->iov_base); 12212792Ssam break; 12312792Ssam 124*16704Smckusick case UIO_SYSSPACE: 12512792Ssam c = *iov->iov_base & 0377; 12612792Ssam break; 12712792Ssam 128*16704Smckusick case UIO_USERISPACE: 12912792Ssam c = fuibyte(iov->iov_base); 13012792Ssam break; 13112792Ssam } 13212792Ssam if (c < 0) 13312792Ssam return (-1); 13412792Ssam iov->iov_base++; 13512792Ssam iov->iov_len--; 13612792Ssam uio->uio_resid--; 13712792Ssam uio->uio_offset++; 13812792Ssam return (c & 0377); 13912792Ssam } 14012792Ssam #endif 141