123375Smckusick /* 247540Skarels * Copyright (c) 1982, 1986, 1991 Regents of the University of California. 3*52497Storek * All rights reserved. 423375Smckusick * 547540Skarels * %sccs.include.redist.c% 647540Skarels * 7*52497Storek * @(#)kern_subr.c 7.8 (Berkeley) 02/14/92 823375Smckusick */ 912792Ssam 1017093Sbloom #include "param.h" 1117093Sbloom #include "systm.h" 1248016Smckusick #include "proc.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 2348016Smckusick #ifdef DIAGNOSTIC 2437728Smckusick if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE) 2537728Smckusick panic("uiomove: mode"); 2648016Smckusick if (uio->uio_segflg == UIO_USERSPACE && uio->uio_procp != curproc) 2748016Smckusick panic("uiomove proc"); 2848016Smckusick #endif 2912792Ssam while (n > 0 && uio->uio_resid) { 3012792Ssam iov = uio->uio_iov; 3112792Ssam cnt = iov->iov_len; 3212792Ssam if (cnt == 0) { 3312792Ssam uio->uio_iov++; 3412792Ssam uio->uio_iovcnt--; 3512792Ssam continue; 3612792Ssam } 3712792Ssam if (cnt > n) 3812792Ssam cnt = n; 3912792Ssam switch (uio->uio_segflg) { 4012792Ssam 4116704Smckusick case UIO_USERSPACE: 4216704Smckusick case UIO_USERISPACE: 4337728Smckusick if (uio->uio_rw == UIO_READ) 4412792Ssam error = copyout(cp, iov->iov_base, cnt); 4512792Ssam else 4612792Ssam error = copyin(iov->iov_base, cp, cnt); 4712792Ssam if (error) 4812792Ssam return (error); 4912792Ssam break; 5012792Ssam 5116704Smckusick case UIO_SYSSPACE: 5237728Smckusick if (uio->uio_rw == UIO_READ) 5312792Ssam bcopy((caddr_t)cp, iov->iov_base, cnt); 5412792Ssam else 5512792Ssam bcopy(iov->iov_base, (caddr_t)cp, cnt); 5612792Ssam break; 5712792Ssam } 5812792Ssam iov->iov_base += cnt; 5912792Ssam iov->iov_len -= cnt; 6012792Ssam uio->uio_resid -= cnt; 6112792Ssam uio->uio_offset += cnt; 6212792Ssam cp += cnt; 6312792Ssam n -= cnt; 6412792Ssam } 6512792Ssam return (error); 6612792Ssam } 6712792Ssam 6812792Ssam /* 6912792Ssam * Give next character to user as result of read. 7012792Ssam */ 7112792Ssam ureadc(c, uio) 7212792Ssam register int c; 7312792Ssam register struct uio *uio; 7412792Ssam { 7512792Ssam register struct iovec *iov; 7612792Ssam 7712792Ssam again: 7812792Ssam if (uio->uio_iovcnt == 0) 7912792Ssam panic("ureadc"); 8012792Ssam iov = uio->uio_iov; 8112792Ssam if (iov->iov_len <= 0 || uio->uio_resid <= 0) { 8212792Ssam uio->uio_iovcnt--; 8312792Ssam uio->uio_iov++; 8412792Ssam goto again; 8512792Ssam } 8612792Ssam switch (uio->uio_segflg) { 8712792Ssam 8816704Smckusick case UIO_USERSPACE: 8912792Ssam if (subyte(iov->iov_base, c) < 0) 9012792Ssam return (EFAULT); 9112792Ssam break; 9212792Ssam 9316704Smckusick case UIO_SYSSPACE: 9412792Ssam *iov->iov_base = c; 9512792Ssam break; 9612792Ssam 9716704Smckusick case UIO_USERISPACE: 9812792Ssam if (suibyte(iov->iov_base, c) < 0) 9912792Ssam return (EFAULT); 10012792Ssam break; 10112792Ssam } 10212792Ssam iov->iov_base++; 10312792Ssam iov->iov_len--; 10412792Ssam uio->uio_resid--; 10512792Ssam uio->uio_offset++; 10612792Ssam return (0); 10712792Ssam } 10812792Ssam 10940810Smarc strcat(src, append) 11040810Smarc register char *src, *append; 11140810Smarc { 11240810Smarc 11340810Smarc for (; *src; ++src) 114*52497Storek continue; 11540810Smarc while (*src++ = *append++) 116*52497Storek continue; 11740810Smarc } 11840810Smarc 11940810Smarc strcpy(to, from) 12040810Smarc register char *to, *from; 12140810Smarc { 12240810Smarc 123*52497Storek for (; *to = *from; ++from, ++to) 124*52497Storek continue; 12540810Smarc } 12640810Smarc 12740810Smarc strncpy(to, from, cnt) 12840810Smarc register char *to, *from; 12940810Smarc register int cnt; 13040810Smarc { 13140810Smarc 13240810Smarc for (; cnt && (*to = *from); --cnt, ++from, ++to) 133*52497Storek continue; 13440810Smarc *to = '\0'; 13540810Smarc } 13640810Smarc 137*52497Storek #ifdef vax /* unused except by ct.c, other oddities XXX */ 13812792Ssam /* 13912792Ssam * Get next character written in by user from uio. 14012792Ssam */ 14112792Ssam uwritec(uio) 14212792Ssam struct uio *uio; 14312792Ssam { 14412792Ssam register struct iovec *iov; 14512792Ssam register int c; 14612792Ssam 14727235Skarels if (uio->uio_resid <= 0) 14827235Skarels return (-1); 14912792Ssam again: 15027235Skarels if (uio->uio_iovcnt <= 0) 15112792Ssam panic("uwritec"); 15212792Ssam iov = uio->uio_iov; 15312792Ssam if (iov->iov_len == 0) { 15412792Ssam uio->uio_iov++; 15527235Skarels if (--uio->uio_iovcnt == 0) 15627235Skarels return (-1); 15712792Ssam goto again; 15812792Ssam } 15912792Ssam switch (uio->uio_segflg) { 16012792Ssam 16116704Smckusick case UIO_USERSPACE: 16212792Ssam c = fubyte(iov->iov_base); 16312792Ssam break; 16412792Ssam 16516704Smckusick case UIO_SYSSPACE: 16647540Skarels c = *(u_char *) iov->iov_base; 16712792Ssam break; 16812792Ssam 16916704Smckusick case UIO_USERISPACE: 17012792Ssam c = fuibyte(iov->iov_base); 17112792Ssam break; 17212792Ssam } 17312792Ssam if (c < 0) 17412792Ssam return (-1); 17512792Ssam iov->iov_base++; 17612792Ssam iov->iov_len--; 17712792Ssam uio->uio_resid--; 17812792Ssam uio->uio_offset++; 17947540Skarels return (c); 18012792Ssam } 181*52497Storek #endif /* vax */ 182