xref: /csrg-svn/sys/kern/kern_subr.c (revision 12792)
1*12792Ssam /*	kern_subr.c	4.1	83/05/27	*/
2*12792Ssam 
3*12792Ssam #include "../h/param.h"
4*12792Ssam #include "../h/systm.h"
5*12792Ssam #include "../h/dir.h"
6*12792Ssam #include "../h/user.h"
7*12792Ssam #include "../h/uio.h"
8*12792Ssam 
9*12792Ssam uiomove(cp, n, rw, uio)
10*12792Ssam 	register caddr_t cp;
11*12792Ssam 	register int n;
12*12792Ssam 	enum uio_rw rw;
13*12792Ssam 	register struct uio *uio;
14*12792Ssam {
15*12792Ssam 	register struct iovec *iov;
16*12792Ssam 	u_int cnt;
17*12792Ssam 	int error = 0;
18*12792Ssam 
19*12792Ssam 	while (n > 0 && uio->uio_resid) {
20*12792Ssam 		iov = uio->uio_iov;
21*12792Ssam 		cnt = iov->iov_len;
22*12792Ssam 		if (cnt == 0) {
23*12792Ssam 			uio->uio_iov++;
24*12792Ssam 			uio->uio_iovcnt--;
25*12792Ssam 			continue;
26*12792Ssam 		}
27*12792Ssam 		if (cnt > n)
28*12792Ssam 			cnt = n;
29*12792Ssam 		switch (uio->uio_segflg) {
30*12792Ssam 
31*12792Ssam 		case 0:
32*12792Ssam 		case 2:
33*12792Ssam 			if (rw == UIO_READ)
34*12792Ssam 				error = copyout(cp, iov->iov_base, cnt);
35*12792Ssam 			else
36*12792Ssam 				error = copyin(iov->iov_base, cp, cnt);
37*12792Ssam 			if (error)
38*12792Ssam 				return (error);
39*12792Ssam 			break;
40*12792Ssam 
41*12792Ssam 		case 1:
42*12792Ssam 			if (rw == UIO_READ)
43*12792Ssam 				bcopy((caddr_t)cp, iov->iov_base, cnt);
44*12792Ssam 			else
45*12792Ssam 				bcopy(iov->iov_base, (caddr_t)cp, cnt);
46*12792Ssam 			break;
47*12792Ssam 		}
48*12792Ssam 		iov->iov_base += cnt;
49*12792Ssam 		iov->iov_len -= cnt;
50*12792Ssam 		uio->uio_resid -= cnt;
51*12792Ssam 		uio->uio_offset += cnt;
52*12792Ssam 		cp += cnt;
53*12792Ssam 		n -= cnt;
54*12792Ssam 	}
55*12792Ssam 	return (error);
56*12792Ssam }
57*12792Ssam 
58*12792Ssam /*
59*12792Ssam  * Give next character to user as result of read.
60*12792Ssam  */
61*12792Ssam ureadc(c, uio)
62*12792Ssam 	register int c;
63*12792Ssam 	register struct uio *uio;
64*12792Ssam {
65*12792Ssam 	register struct iovec *iov;
66*12792Ssam 
67*12792Ssam again:
68*12792Ssam 	if (uio->uio_iovcnt == 0)
69*12792Ssam 		panic("ureadc");
70*12792Ssam 	iov = uio->uio_iov;
71*12792Ssam 	if (iov->iov_len <= 0 || uio->uio_resid <= 0) {
72*12792Ssam 		uio->uio_iovcnt--;
73*12792Ssam 		uio->uio_iov++;
74*12792Ssam 		goto again;
75*12792Ssam 	}
76*12792Ssam 	switch (uio->uio_segflg) {
77*12792Ssam 
78*12792Ssam 	case 0:
79*12792Ssam 		if (subyte(iov->iov_base, c) < 0)
80*12792Ssam 			return (EFAULT);
81*12792Ssam 		break;
82*12792Ssam 
83*12792Ssam 	case 1:
84*12792Ssam 		*iov->iov_base = c;
85*12792Ssam 		break;
86*12792Ssam 
87*12792Ssam 	case 2:
88*12792Ssam 		if (suibyte(iov->iov_base, c) < 0)
89*12792Ssam 			return (EFAULT);
90*12792Ssam 		break;
91*12792Ssam 	}
92*12792Ssam 	iov->iov_base++;
93*12792Ssam 	iov->iov_len--;
94*12792Ssam 	uio->uio_resid--;
95*12792Ssam 	uio->uio_offset++;
96*12792Ssam 	return (0);
97*12792Ssam }
98*12792Ssam 
99*12792Ssam #ifdef notdef
100*12792Ssam /*
101*12792Ssam  * Get next character written in by user from uio.
102*12792Ssam  */
103*12792Ssam uwritec(uio)
104*12792Ssam 	struct uio *uio;
105*12792Ssam {
106*12792Ssam 	register struct iovec *iov;
107*12792Ssam 	register int c;
108*12792Ssam 
109*12792Ssam again:
110*12792Ssam 	if (uio->uio_iovcnt <= 0 || uio->uio_resid <= 0)
111*12792Ssam 		panic("uwritec");
112*12792Ssam 	iov = uio->uio_iov;
113*12792Ssam 	if (iov->iov_len == 0) {
114*12792Ssam 		uio->uio_iovcnt--;
115*12792Ssam 		uio->uio_iov++;
116*12792Ssam 		goto again;
117*12792Ssam 	}
118*12792Ssam 	switch (uio->uio_segflg) {
119*12792Ssam 
120*12792Ssam 	case 0:
121*12792Ssam 		c = fubyte(iov->iov_base);
122*12792Ssam 		break;
123*12792Ssam 
124*12792Ssam 	case 1:
125*12792Ssam 		c = *iov->iov_base & 0377;
126*12792Ssam 		break;
127*12792Ssam 
128*12792Ssam 	case 2:
129*12792Ssam 		c = fuibyte(iov->iov_base);
130*12792Ssam 		break;
131*12792Ssam 	}
132*12792Ssam 	if (c < 0)
133*12792Ssam 		return (-1);
134*12792Ssam 	iov->iov_base++;
135*12792Ssam 	iov->iov_len--;
136*12792Ssam 	uio->uio_resid--;
137*12792Ssam 	uio->uio_offset++;
138*12792Ssam 	return (c & 0377);
139*12792Ssam }
140*12792Ssam #endif
141