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