xref: /csrg-svn/sys/kern/kern_subr.c (revision 40810)
123375Smckusick /*
229095Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
323375Smckusick  * All rights reserved.  The Berkeley software License Agreement
423375Smckusick  * specifies the terms and conditions for redistribution.
523375Smckusick  *
6*40810Smarc  *	@(#)kern_subr.c	7.3 (Berkeley) 04/05/90
723375Smckusick  */
812792Ssam 
917093Sbloom #include "param.h"
1017093Sbloom #include "systm.h"
1117093Sbloom #include "user.h"
1212792Ssam 
1337728Smckusick uiomove(cp, n, uio)
1412792Ssam 	register caddr_t cp;
1512792Ssam 	register int n;
1612792Ssam 	register struct uio *uio;
1712792Ssam {
1812792Ssam 	register struct iovec *iov;
1912792Ssam 	u_int cnt;
2012792Ssam 	int error = 0;
2112792Ssam 
2237728Smckusick 	if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE)
2337728Smckusick 		panic("uiomove: mode");
2412792Ssam 	while (n > 0 && uio->uio_resid) {
2512792Ssam 		iov = uio->uio_iov;
2612792Ssam 		cnt = iov->iov_len;
2712792Ssam 		if (cnt == 0) {
2812792Ssam 			uio->uio_iov++;
2912792Ssam 			uio->uio_iovcnt--;
3012792Ssam 			continue;
3112792Ssam 		}
3212792Ssam 		if (cnt > n)
3312792Ssam 			cnt = n;
3412792Ssam 		switch (uio->uio_segflg) {
3512792Ssam 
3616704Smckusick 		case UIO_USERSPACE:
3716704Smckusick 		case UIO_USERISPACE:
3837728Smckusick 			if (uio->uio_rw == UIO_READ)
3912792Ssam 				error = copyout(cp, iov->iov_base, cnt);
4012792Ssam 			else
4112792Ssam 				error = copyin(iov->iov_base, cp, cnt);
4212792Ssam 			if (error)
4312792Ssam 				return (error);
4412792Ssam 			break;
4512792Ssam 
4616704Smckusick 		case UIO_SYSSPACE:
4737728Smckusick 			if (uio->uio_rw == UIO_READ)
4812792Ssam 				bcopy((caddr_t)cp, iov->iov_base, cnt);
4912792Ssam 			else
5012792Ssam 				bcopy(iov->iov_base, (caddr_t)cp, cnt);
5112792Ssam 			break;
5212792Ssam 		}
5312792Ssam 		iov->iov_base += cnt;
5412792Ssam 		iov->iov_len -= cnt;
5512792Ssam 		uio->uio_resid -= cnt;
5612792Ssam 		uio->uio_offset += cnt;
5712792Ssam 		cp += cnt;
5812792Ssam 		n -= cnt;
5912792Ssam 	}
6012792Ssam 	return (error);
6112792Ssam }
6212792Ssam 
6312792Ssam /*
6412792Ssam  * Give next character to user as result of read.
6512792Ssam  */
6612792Ssam ureadc(c, uio)
6712792Ssam 	register int c;
6812792Ssam 	register struct uio *uio;
6912792Ssam {
7012792Ssam 	register struct iovec *iov;
7112792Ssam 
7212792Ssam again:
7312792Ssam 	if (uio->uio_iovcnt == 0)
7412792Ssam 		panic("ureadc");
7512792Ssam 	iov = uio->uio_iov;
7612792Ssam 	if (iov->iov_len <= 0 || uio->uio_resid <= 0) {
7712792Ssam 		uio->uio_iovcnt--;
7812792Ssam 		uio->uio_iov++;
7912792Ssam 		goto again;
8012792Ssam 	}
8112792Ssam 	switch (uio->uio_segflg) {
8212792Ssam 
8316704Smckusick 	case UIO_USERSPACE:
8412792Ssam 		if (subyte(iov->iov_base, c) < 0)
8512792Ssam 			return (EFAULT);
8612792Ssam 		break;
8712792Ssam 
8816704Smckusick 	case UIO_SYSSPACE:
8912792Ssam 		*iov->iov_base = c;
9012792Ssam 		break;
9112792Ssam 
9216704Smckusick 	case UIO_USERISPACE:
9312792Ssam 		if (suibyte(iov->iov_base, c) < 0)
9412792Ssam 			return (EFAULT);
9512792Ssam 		break;
9612792Ssam 	}
9712792Ssam 	iov->iov_base++;
9812792Ssam 	iov->iov_len--;
9912792Ssam 	uio->uio_resid--;
10012792Ssam 	uio->uio_offset++;
10112792Ssam 	return (0);
10212792Ssam }
10312792Ssam 
104*40810Smarc strcat(src, append)
105*40810Smarc 	register char *src, *append;
106*40810Smarc {
107*40810Smarc 
108*40810Smarc 	for (; *src; ++src)
109*40810Smarc 		/* void */;
110*40810Smarc 	while (*src++ = *append++)
111*40810Smarc 		/* void */;
112*40810Smarc }
113*40810Smarc 
114*40810Smarc strcpy(to, from)
115*40810Smarc 	register char *to, *from;
116*40810Smarc {
117*40810Smarc 
118*40810Smarc 	for (; *from = *to; ++from, ++to)
119*40810Smarc 		/* void */;
120*40810Smarc }
121*40810Smarc 
122*40810Smarc strncpy(to, from, cnt)
123*40810Smarc 	register char *to, *from;
124*40810Smarc 	register int cnt;
125*40810Smarc {
126*40810Smarc 
127*40810Smarc 	for (; cnt && (*to = *from); --cnt, ++from, ++to)
128*40810Smarc 		/* void */;
129*40810Smarc 	*to = '\0';
130*40810Smarc }
131*40810Smarc 
132*40810Smarc #ifdef notdef	/* unused */
13312792Ssam /*
13412792Ssam  * Get next character written in by user from uio.
13512792Ssam  */
13612792Ssam uwritec(uio)
13712792Ssam 	struct uio *uio;
13812792Ssam {
13912792Ssam 	register struct iovec *iov;
14012792Ssam 	register int c;
14112792Ssam 
14227235Skarels 	if (uio->uio_resid <= 0)
14327235Skarels 		return (-1);
14412792Ssam again:
14527235Skarels 	if (uio->uio_iovcnt <= 0)
14612792Ssam 		panic("uwritec");
14712792Ssam 	iov = uio->uio_iov;
14812792Ssam 	if (iov->iov_len == 0) {
14912792Ssam 		uio->uio_iov++;
15027235Skarels 		if (--uio->uio_iovcnt == 0)
15127235Skarels 			return (-1);
15212792Ssam 		goto again;
15312792Ssam 	}
15412792Ssam 	switch (uio->uio_segflg) {
15512792Ssam 
15616704Smckusick 	case UIO_USERSPACE:
15712792Ssam 		c = fubyte(iov->iov_base);
15812792Ssam 		break;
15912792Ssam 
16016704Smckusick 	case UIO_SYSSPACE:
16112792Ssam 		c = *iov->iov_base & 0377;
16212792Ssam 		break;
16312792Ssam 
16416704Smckusick 	case UIO_USERISPACE:
16512792Ssam 		c = fuibyte(iov->iov_base);
16612792Ssam 		break;
16712792Ssam 	}
16812792Ssam 	if (c < 0)
16912792Ssam 		return (-1);
17012792Ssam 	iov->iov_base++;
17112792Ssam 	iov->iov_len--;
17212792Ssam 	uio->uio_resid--;
17312792Ssam 	uio->uio_offset++;
17412792Ssam 	return (c & 0377);
17512792Ssam }
176*40810Smarc #endif /* notdef */
177