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