123375Smckusick /* 2*47540Skarels * Copyright (c) 1982, 1986, 1991 Regents of the University of California. 3*47540Skarels * All rights reserved. 423375Smckusick * 5*47540Skarels * %sccs.include.redist.c% 6*47540Skarels * 7*47540Skarels * @(#)kern_subr.c 7.5 (Berkeley) 03/17/91 823375Smckusick */ 912792Ssam 1017093Sbloom #include "param.h" 1117093Sbloom #include "systm.h" 1217093Sbloom #include "user.h" 1312792Ssam 1437728Smckusick uiomove(cp, n, uio) 1512792Ssam register caddr_t cp; 1612792Ssam register int n; 1712792Ssam register struct uio *uio; 1812792Ssam { 1912792Ssam register struct iovec *iov; 2012792Ssam u_int cnt; 2112792Ssam int error = 0; 2212792Ssam 2337728Smckusick if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE) 2437728Smckusick panic("uiomove: mode"); 2512792Ssam while (n > 0 && uio->uio_resid) { 2612792Ssam iov = uio->uio_iov; 2712792Ssam cnt = iov->iov_len; 2812792Ssam if (cnt == 0) { 2912792Ssam uio->uio_iov++; 3012792Ssam uio->uio_iovcnt--; 3112792Ssam continue; 3212792Ssam } 3312792Ssam if (cnt > n) 3412792Ssam cnt = n; 3512792Ssam switch (uio->uio_segflg) { 3612792Ssam 3716704Smckusick case UIO_USERSPACE: 3816704Smckusick case UIO_USERISPACE: 3937728Smckusick if (uio->uio_rw == UIO_READ) 4012792Ssam error = copyout(cp, iov->iov_base, cnt); 4112792Ssam else 4212792Ssam error = copyin(iov->iov_base, cp, cnt); 4312792Ssam if (error) 4412792Ssam return (error); 4512792Ssam break; 4612792Ssam 4716704Smckusick case UIO_SYSSPACE: 4837728Smckusick if (uio->uio_rw == UIO_READ) 4912792Ssam bcopy((caddr_t)cp, iov->iov_base, cnt); 5012792Ssam else 5112792Ssam bcopy(iov->iov_base, (caddr_t)cp, cnt); 5212792Ssam break; 5312792Ssam } 5412792Ssam iov->iov_base += cnt; 5512792Ssam iov->iov_len -= cnt; 5612792Ssam uio->uio_resid -= cnt; 5712792Ssam uio->uio_offset += cnt; 5812792Ssam cp += cnt; 5912792Ssam n -= cnt; 6012792Ssam } 6112792Ssam return (error); 6212792Ssam } 6312792Ssam 6412792Ssam /* 6512792Ssam * Give next character to user as result of read. 6612792Ssam */ 6712792Ssam ureadc(c, uio) 6812792Ssam register int c; 6912792Ssam register struct uio *uio; 7012792Ssam { 7112792Ssam register struct iovec *iov; 7212792Ssam 7312792Ssam again: 7412792Ssam if (uio->uio_iovcnt == 0) 7512792Ssam panic("ureadc"); 7612792Ssam iov = uio->uio_iov; 7712792Ssam if (iov->iov_len <= 0 || uio->uio_resid <= 0) { 7812792Ssam uio->uio_iovcnt--; 7912792Ssam uio->uio_iov++; 8012792Ssam goto again; 8112792Ssam } 8212792Ssam switch (uio->uio_segflg) { 8312792Ssam 8416704Smckusick case UIO_USERSPACE: 8512792Ssam if (subyte(iov->iov_base, c) < 0) 8612792Ssam return (EFAULT); 8712792Ssam break; 8812792Ssam 8916704Smckusick case UIO_SYSSPACE: 9012792Ssam *iov->iov_base = c; 9112792Ssam break; 9212792Ssam 9316704Smckusick case UIO_USERISPACE: 9412792Ssam if (suibyte(iov->iov_base, c) < 0) 9512792Ssam return (EFAULT); 9612792Ssam break; 9712792Ssam } 9812792Ssam iov->iov_base++; 9912792Ssam iov->iov_len--; 10012792Ssam uio->uio_resid--; 10112792Ssam uio->uio_offset++; 10212792Ssam return (0); 10312792Ssam } 10412792Ssam 10540810Smarc strcat(src, append) 10640810Smarc register char *src, *append; 10740810Smarc { 10840810Smarc 10940810Smarc for (; *src; ++src) 110*47540Skarels ; 11140810Smarc while (*src++ = *append++) 112*47540Skarels ; 11340810Smarc } 11440810Smarc 11540810Smarc strcpy(to, from) 11640810Smarc register char *to, *from; 11740810Smarc { 11840810Smarc 11940810Smarc for (; *from = *to; ++from, ++to) 120*47540Skarels ; 12140810Smarc } 12240810Smarc 12340810Smarc strncpy(to, from, cnt) 12440810Smarc register char *to, *from; 12540810Smarc register int cnt; 12640810Smarc { 12740810Smarc 12840810Smarc for (; cnt && (*to = *from); --cnt, ++from, ++to) 129*47540Skarels ; 13040810Smarc *to = '\0'; 13140810Smarc } 13240810Smarc 133*47540Skarels #ifndef lint /* unused except by ct.c, other oddities XXX */ 13412792Ssam /* 13512792Ssam * Get next character written in by user from uio. 13612792Ssam */ 13712792Ssam uwritec(uio) 13812792Ssam struct uio *uio; 13912792Ssam { 14012792Ssam register struct iovec *iov; 14112792Ssam register int c; 14212792Ssam 14327235Skarels if (uio->uio_resid <= 0) 14427235Skarels return (-1); 14512792Ssam again: 14627235Skarels if (uio->uio_iovcnt <= 0) 14712792Ssam panic("uwritec"); 14812792Ssam iov = uio->uio_iov; 14912792Ssam if (iov->iov_len == 0) { 15012792Ssam uio->uio_iov++; 15127235Skarels if (--uio->uio_iovcnt == 0) 15227235Skarels return (-1); 15312792Ssam goto again; 15412792Ssam } 15512792Ssam switch (uio->uio_segflg) { 15612792Ssam 15716704Smckusick case UIO_USERSPACE: 15812792Ssam c = fubyte(iov->iov_base); 15912792Ssam break; 16012792Ssam 16116704Smckusick case UIO_SYSSPACE: 162*47540Skarels c = *(u_char *) iov->iov_base; 16312792Ssam break; 16412792Ssam 16516704Smckusick case UIO_USERISPACE: 16612792Ssam c = fuibyte(iov->iov_base); 16712792Ssam break; 16812792Ssam } 16912792Ssam if (c < 0) 17012792Ssam return (-1); 17112792Ssam iov->iov_base++; 17212792Ssam iov->iov_len--; 17312792Ssam uio->uio_resid--; 17412792Ssam uio->uio_offset++; 175*47540Skarels return (c); 17612792Ssam } 17740810Smarc #endif /* notdef */ 178