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