xref: /csrg-svn/sys/kern/kern_subr.c (revision 52497)
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