This source file includes following definitions.
- compat_43_sys_accept
- compat_43_sys_getpeername
- compat_43_sys_getsockname
- compat_43_sys_recv
- compat_43_sys_recvfrom
- compat_43_sys_recvmsg
- compat_43_sys_send
- compat_43_sys_sendmsg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/filedesc.h>
38 #include <sys/kernel.h>
39 #include <sys/proc.h>
40 #include <sys/file.h>
41 #include <sys/socket.h>
42 #include <sys/socketvar.h>
43 #include <sys/stat.h>
44 #include <sys/ioctl.h>
45 #include <sys/fcntl.h>
46 #include <sys/malloc.h>
47 #include <sys/syslog.h>
48 #include <sys/unistd.h>
49 #include <sys/resourcevar.h>
50
51 #include <sys/mount.h>
52 #include <sys/syscallargs.h>
53
54 int
55 compat_43_sys_accept(p, v, retval)
56 struct proc *p;
57 void *v;
58 register_t *retval;
59 {
60 struct sys_accept_args
61
62
63
64 *uap = v;
65 int error;
66
67 if ((error = sys_accept(p, uap, retval)) != 0)
68 return error;
69
70 if (SCARG(uap, name)) {
71 struct sockaddr sa;
72
73 if ((error = copyin(SCARG(uap, name), &sa, sizeof(sa))) != 0)
74 return error;
75
76 ((struct osockaddr*) &sa)->sa_family = sa.sa_family;
77
78 if ((error = copyout(&sa, SCARG(uap, name), sizeof(sa))) != 0)
79 return error;
80 }
81 return 0;
82 }
83
84
85 int
86 compat_43_sys_getpeername(p, v, retval)
87 struct proc *p;
88 void *v;
89 register_t *retval;
90 {
91 struct sys_getpeername_args
92
93
94
95 *uap = v;
96 struct sockaddr sa;
97
98 int error;
99
100 if ((error = sys_getpeername(p, uap, retval)) != 0)
101 return error;
102
103 if ((error = copyin(SCARG(uap, asa), &sa, sizeof(sa))) != 0)
104 return error;
105
106 ((struct osockaddr*) &sa)->sa_family = sa.sa_family;
107
108 if ((error = copyout(&sa, SCARG(uap, asa), sizeof(sa))) != 0)
109 return error;
110
111 return 0;
112 }
113
114
115 int
116 compat_43_sys_getsockname(p, v, retval)
117 struct proc *p;
118 void *v;
119 register_t *retval;
120 {
121 struct sys_getsockname_args
122
123
124
125 *uap = v;
126 struct sockaddr sa;
127 int error;
128
129 if ((error = sys_getsockname(p, uap, retval)) != 0)
130 return error;
131
132 if ((error = copyin(SCARG(uap, asa), &sa, sizeof(sa))) != 0)
133 return error;
134
135 ((struct osockaddr*) &sa)->sa_family = sa.sa_family;
136
137 if ((error = copyout(&sa, SCARG(uap, asa), sizeof(sa))) != 0)
138 return error;
139
140 return 0;
141 }
142
143
144 int
145 compat_43_sys_recv(p, v, retval)
146 struct proc *p;
147 void *v;
148 register_t *retval;
149 {
150 register struct compat_43_sys_recv_args
151
152
153
154
155 *uap = v;
156 struct msghdr msg;
157 struct iovec aiov;
158
159 msg.msg_name = 0;
160 msg.msg_namelen = 0;
161 msg.msg_iov = &aiov;
162 msg.msg_iovlen = 1;
163 aiov.iov_base = SCARG(uap, buf);
164 aiov.iov_len = SCARG(uap, len);
165 msg.msg_control = 0;
166 msg.msg_flags = SCARG(uap, flags);
167 return (recvit(p, SCARG(uap, s), &msg, (caddr_t)0, retval));
168 }
169
170
171 #ifdef MSG_COMPAT
172 int
173 compat_43_sys_recvfrom(p, v, retval)
174 struct proc *p;
175 void *v;
176 register_t *retval;
177 {
178 struct sys_recvfrom_args
179
180
181
182
183
184
185 *uap = v;
186
187 SCARG(uap, flags) |= MSG_COMPAT;
188 return (sys_recvfrom(p, uap, retval));
189 }
190 #endif
191
192
193 #ifdef MSG_COMPAT
194
195
196
197
198
199 int
200 compat_43_sys_recvmsg(p, v, retval)
201 struct proc *p;
202 void *v;
203 register_t *retval;
204 {
205 register struct compat_43_sys_recvmsg_args
206
207
208
209 *uap = v;
210 struct msghdr msg;
211 struct iovec aiov[UIO_SMALLIOV], *iov;
212 int error;
213
214 error = copyin((caddr_t)SCARG(uap, msg), (caddr_t)&msg,
215 sizeof (struct omsghdr));
216 if (error)
217 return (error);
218 if (msg.msg_iovlen <= 0 || msg.msg_iovlen > IOV_MAX)
219 return (EMSGSIZE);
220 if (msg.msg_iovlen > UIO_SMALLIOV)
221 MALLOC(iov, struct iovec *,
222 sizeof(struct iovec) * msg.msg_iovlen, M_IOV, M_WAITOK);
223 else
224 iov = aiov;
225 msg.msg_flags = SCARG(uap, flags) | MSG_COMPAT;
226 error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
227 (unsigned)(msg.msg_iovlen * sizeof (struct iovec)));
228 if (error)
229 goto done;
230 msg.msg_iov = iov;
231 error = recvit(p, SCARG(uap, s), &msg,
232 (caddr_t)&SCARG(uap, msg)->msg_namelen, retval);
233
234 if (msg.msg_controllen && error == 0)
235 error = copyout((caddr_t)&msg.msg_controllen,
236 (caddr_t)&SCARG(uap, msg)->msg_accrightslen, sizeof (int));
237 done:
238 if (iov != aiov)
239 FREE(iov, M_IOV);
240 return (error);
241 }
242 #endif
243
244 int
245 compat_43_sys_send(p, v, retval)
246 struct proc *p;
247 void *v;
248 register_t *retval;
249 {
250 register struct compat_43_sys_send_args
251
252
253
254
255 *uap = v;
256 struct msghdr msg;
257 struct iovec aiov;
258
259 msg.msg_name = 0;
260 msg.msg_namelen = 0;
261 msg.msg_iov = &aiov;
262 msg.msg_iovlen = 1;
263 aiov.iov_base = SCARG(uap, buf);
264 aiov.iov_len = SCARG(uap, len);
265 msg.msg_control = 0;
266 msg.msg_flags = 0;
267 return (sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval));
268 }
269
270 #ifdef MSG_COMPAT
271 int
272 compat_43_sys_sendmsg(p, v, retval)
273 struct proc *p;
274 void *v;
275 register_t *retval;
276 {
277 register struct compat_43_sys_sendmsg_args
278
279
280
281 *uap = v;
282 struct msghdr msg;
283 struct iovec aiov[UIO_SMALLIOV], *iov;
284 int error;
285
286 error = copyin(SCARG(uap, msg), (caddr_t)&msg,
287 sizeof (struct omsghdr));
288 if (error)
289 return (error);
290 if (msg.msg_iovlen <= 0 || msg.msg_iovlen > IOV_MAX)
291 return (EMSGSIZE);
292 if (msg.msg_iovlen > UIO_SMALLIOV)
293 MALLOC(iov, struct iovec *,
294 sizeof(struct iovec) * msg.msg_iovlen, M_IOV, M_WAITOK);
295 else
296 iov = aiov;
297 error = copyin((caddr_t)msg.msg_iov, (caddr_t)iov,
298 (unsigned)(msg.msg_iovlen * sizeof (struct iovec)));
299 if (error)
300 goto done;
301 msg.msg_flags = MSG_COMPAT;
302 msg.msg_iov = iov;
303 error = sendit(p, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
304 done:
305 if (iov != aiov)
306 FREE(iov, M_IOV);
307 return (error);
308 }
309 #endif