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