xref: /netbsd-src/sys/compat/netbsd32/netbsd32_compat_43.c (revision 4472dbe5e3bd91ef2540bada7a7ca7384627ff9b)
1 /*	$NetBSD: netbsd32_compat_43.c,v 1.9 1999/12/30 15:40:45 eeh Exp $	*/
2 
3 /*
4  * Copyright (c) 1998 Matthew R. Green
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  */
30 
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/fcntl.h>
34 #include <sys/malloc.h>
35 #include <sys/mount.h>
36 #include <sys/proc.h>
37 #include <sys/stat.h>
38 #include <sys/syscallargs.h>
39 #include <sys/time.h>
40 #include <sys/ucred.h>
41 #include <vm/vm.h>	/* XXX for <sys/sysctl.h> */
42 #include <sys/sysctl.h>
43 #include <sys/swap.h>
44 
45 #include <compat/netbsd32/netbsd32.h>
46 #include <compat/netbsd32/netbsd32_syscallargs.h>
47 
48 static void netbsd32_from_stat43 __P((struct stat43 *, struct netbsd32_stat43 *));
49 int compat_43_netbsd32_sethostid __P((struct proc *, void *, register_t *));
50 int compat_43_netbsd32_killpg __P((struct proc *, void *, register_t *retval));
51 int compat_43_netbsd32_sigblock __P((struct proc *, void *, register_t *retval));
52 int compat_43_netbsd32_sigblock __P((struct proc *, void *, register_t *retval));
53 
54 static void
55 netbsd32_from_stat43(sp43, sp32)
56 	struct stat43 *sp43;
57 	struct netbsd32_stat43 *sp32;
58 {
59 
60 	sp32->st_dev = sp43->st_dev;
61 	sp32->st_ino = sp43->st_ino;
62 	sp32->st_mode = sp43->st_mode;
63 	sp32->st_nlink = sp43->st_nlink;
64 	sp32->st_uid = sp43->st_uid;
65 	sp32->st_gid = sp43->st_gid;
66 	sp32->st_rdev = sp43->st_rdev;
67 	sp32->st_size = sp43->st_size;
68 	sp32->st_atimespec.tv_sec = sp43->st_atimespec.tv_sec;
69 	sp32->st_atimespec.tv_nsec = sp43->st_atimespec.tv_nsec;
70 	sp32->st_mtimespec.tv_sec = sp43->st_mtimespec.tv_sec;
71 	sp32->st_mtimespec.tv_nsec = sp43->st_mtimespec.tv_nsec;
72 	sp32->st_ctimespec.tv_sec = sp43->st_ctimespec.tv_sec;
73 	sp32->st_ctimespec.tv_nsec = sp43->st_ctimespec.tv_nsec;
74 	sp32->st_blksize = sp43->st_blksize;
75 	sp32->st_blocks = sp43->st_blocks;
76 	sp32->st_flags = sp43->st_flags;
77 	sp32->st_gen = sp43->st_gen;
78 }
79 
80 /* file system syscalls */
81 int
82 compat_43_netbsd32_ocreat(p, v, retval)
83 	struct proc *p;
84 	void *v;
85 	register_t *retval;
86 {
87 	struct compat_43_netbsd32_ocreat_args /* {
88 		syscallarg(const netbsd32_charp) path;
89 		syscallarg(mode_t) mode;
90 	} */ *uap = v;
91 	struct sys_open_args  ua;
92 	caddr_t sg;
93 
94 	NETBSD32TOP_UAP(path, const char);
95 	NETBSD32TO64_UAP(mode);
96 	SCARG(&ua, flags) = O_WRONLY | O_CREAT | O_TRUNC;
97 	sg = stackgap_init(p->p_emul);
98 	NETBSD32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
99 
100 	return (sys_open(p, &ua, retval));
101 }
102 
103 int
104 compat_43_netbsd32_olseek(p, v, retval)
105 	struct proc *p;
106 	void *v;
107 	register_t *retval;
108 {
109 	struct compat_43_netbsd32_olseek_args /* {
110 		syscallarg(int) fd;
111 		syscallarg(netbsd32_long) offset;
112 		syscallarg(int) whence;
113 	} */ *uap = v;
114 	struct sys_lseek_args ua;
115 	int rv;
116 	off_t rt;
117 
118 	SCARG(&ua, fd) = SCARG(uap, fd);
119 	NETBSD32TOX_UAP(offset, long);
120 	NETBSD32TO64_UAP(whence);
121 	rv = sys_lseek(p, &ua, (register_t *)&rt);
122 	*(netbsd32_long *)retval = rt;
123 
124 	return (rv);
125 }
126 
127 int
128 compat_43_netbsd32_stat43(p, v, retval)
129 	struct proc *p;
130 	void *v;
131 	register_t *retval;
132 {
133 	struct compat_43_netbsd32_stat43_args /* {
134 		syscallarg(const netbsd32_charp) path;
135 		syscallarg(netbsd32_stat43p_t) ub;
136 	} */ *uap = v;
137 	struct netbsd32_stat43 *sp32;
138 	struct stat43 sb43;
139 	struct stat43 *sp43 = &sb43;
140 	struct compat_43_sys_stat_args ua;
141 	caddr_t sg;
142 	int rv;
143 
144 	NETBSD32TOP_UAP(path, const char);
145 	SCARG(&ua, ub) = &sb43;
146 	sg = stackgap_init(p->p_emul);
147 	NETBSD32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
148 
149 	rv = compat_43_sys_stat(p, &ua, retval);
150 
151 	sp32 = (struct netbsd32_stat43 *)(u_long)SCARG(uap, ub);
152 	netbsd32_from_stat43(sp43, sp32);
153 
154 	return (rv);
155 }
156 
157 int
158 compat_43_netbsd32_lstat43(p, v, retval)
159 	struct proc *p;
160 	void *v;
161 	register_t *retval;
162 {
163 	struct compat_43_netbsd32_lstat43_args /* {
164 		syscallarg(const netbsd32_charp) path;
165 		syscallarg(netbsd32_stat43p_t) ub;
166 	} */ *uap = v;
167 	struct netbsd32_stat43 *sp32;
168 	struct stat43 sb43;
169 	struct stat43 *sp43 = &sb43;
170 	struct compat_43_sys_lstat_args ua;
171 	caddr_t sg;
172 	int rv;
173 
174 	NETBSD32TOP_UAP(path, const char);
175 	SCARG(&ua, ub) = &sb43;
176 	sg = stackgap_init(p->p_emul);
177 	NETBSD32_CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
178 
179 	rv = compat_43_sys_stat(p, &ua, retval);
180 
181 	sp32 = (struct netbsd32_stat43 *)(u_long)SCARG(uap, ub);
182 	netbsd32_from_stat43(sp43, sp32);
183 
184 	return (rv);
185 }
186 
187 int
188 compat_43_netbsd32_fstat43(p, v, retval)
189 	struct proc *p;
190 	void *v;
191 	register_t *retval;
192 {
193 	struct compat_43_netbsd32_fstat43_args /* {
194 		syscallarg(int) fd;
195 		syscallarg(netbsd32_stat43p_t) sb;
196 	} */ *uap = v;
197 	struct netbsd32_stat43 *sp32;
198 	struct stat43 sb43;
199 	struct stat43 *sp43 = &sb43;
200 	struct compat_43_sys_fstat_args ua;
201 	int rv;
202 
203 	NETBSD32TO64_UAP(fd);
204 	SCARG(&ua, sb) = &sb43;
205 	rv = compat_43_sys_fstat(p, &ua, retval);
206 
207 	sp32 = (struct netbsd32_stat43 *)(u_long)SCARG(uap, sb);
208 	netbsd32_from_stat43(sp43, sp32);
209 
210 	return (rv);
211 }
212 
213 int
214 compat_43_netbsd32_otruncate(p, v, retval)
215 	struct proc *p;
216 	void *v;
217 	register_t *retval;
218 {
219 	struct compat_43_netbsd32_otruncate_args /* {
220 		syscallarg(const netbsd32_charp) path;
221 		syscallarg(netbsd32_long) length;
222 	} */ *uap = v;
223 	struct sys_truncate_args ua;
224 
225 	NETBSD32TOP_UAP(path, const char);
226 	NETBSD32TO64_UAP(length);
227 	return (sys_ftruncate(p, &ua, retval));
228 }
229 
230 int
231 compat_43_netbsd32_oftruncate(p, v, retval)
232 	struct proc *p;
233 	void *v;
234 	register_t *retval;
235 {
236 	struct compat_43_netbsd32_oftruncate_args /* {
237 		syscallarg(int) fd;
238 		syscallarg(netbsd32_long) length;
239 	} */ *uap = v;
240 	struct sys_ftruncate_args ua;
241 
242 	NETBSD32TO64_UAP(fd);
243 	NETBSD32TO64_UAP(length);
244 	return (sys_ftruncate(p, &ua, retval));
245 }
246 
247 int
248 compat_43_netbsd32_ogetdirentries(p, v, retval)
249 	struct proc *p;
250 	void *v;
251 	register_t *retval;
252 {
253 	struct compat_43_netbsd32_ogetdirentries_args /* {
254 		syscallarg(int) fd;
255 		syscallarg(netbsd32_charp) buf;
256 		syscallarg(u_int) count;
257 		syscallarg(netbsd32_longp) basep;
258 	} */ *uap = v;
259 	struct compat_43_sys_getdirentries_args ua;
260 
261 	NETBSD32TO64_UAP(fd);
262 	NETBSD32TOP_UAP(buf, char);
263 	NETBSD32TO64_UAP(count);
264 	NETBSD32TOP_UAP(basep, long);
265 	return (compat_43_sys_getdirentries(p, &ua, retval));
266 }
267 
268 /* kernel syscalls */
269 int
270 compat_43_netbsd32_ogetkerninfo(p, v, retval)
271 	struct proc *p;
272 	void *v;
273 	register_t *retval;
274 {
275 	struct compat_43_netbsd32_ogetkerninfo_args /* {
276 		syscallarg(int) op;
277 		syscallarg(netbsd32_charp) where;
278 		syscallarg(netbsd32_intp) size;
279 		syscallarg(int) arg;
280 	} */ *uap = v;
281 	struct compat_43_sys_getkerninfo_args ua;
282 
283 	NETBSD32TO64_UAP(op);
284 	NETBSD32TOP_UAP(where, char);
285 	NETBSD32TOP_UAP(size, int);
286 	NETBSD32TO64_UAP(arg);
287 	return (compat_43_sys_getkerninfo(p, &ua, retval));
288 }
289 
290 int
291 compat_43_netbsd32_ogethostname(p, v, retval)
292 	struct proc *p;
293 	void *v;
294 	register_t *retval;
295 {
296 	struct compat_43_netbsd32_ogethostname_args /* {
297 		syscallarg(netbsd32_charp) hostname;
298 		syscallarg(u_int) len;
299 	} */ *uap = v;
300 	int name;
301 	size_t sz;
302 
303 	name = KERN_HOSTNAME;
304 	sz = SCARG(uap, len);
305 	return (kern_sysctl(&name, 1, (char *)(u_long)SCARG(uap, hostname),
306 	    &sz, 0, 0, p));
307 }
308 
309 int
310 compat_43_netbsd32_osethostname(p, v, retval)
311 	struct proc *p;
312 	void *v;
313 	register_t *retval;
314 {
315 	struct compat_43_netbsd32_osethostname_args /* {
316 		syscallarg(netbsd32_charp) hostname;
317 		syscallarg(u_int) len;
318 	} */ *uap = v;
319 	int name;
320 	int error;
321 
322 	if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
323 		return (error);
324 	name = KERN_HOSTNAME;
325 	return (kern_sysctl(&name, 1, 0, 0, (char *)(u_long)SCARG(uap,
326 	    hostname), SCARG(uap, len), p));
327 }
328 
329 int
330 compat_43_netbsd32_sethostid(p, v, retval)
331 	struct proc *p;
332 	void *v;
333 	register_t *retval;
334 {
335 	struct compat_43_netbsd32_sethostid_args /* {
336 		syscallarg(int32_t) hostid;
337 	} */ *uap = v;
338 	struct compat_43_sys_sethostid_args ua;
339 
340 	NETBSD32TO64_UAP(hostid);
341 	return (compat_43_sys_sethostid(p, &ua, retval));
342 }
343 
344 int
345 compat_43_netbsd32_ogetrlimit(p, v, retval)
346 	struct proc *p;
347 	void *v;
348 	register_t *retval;
349 {
350 	struct compat_43_netbsd32_ogetrlimit_args /* {
351 		syscallarg(int) which;
352 		syscallarg(netbsd32_orlimitp_t) rlp;
353 	} */ *uap = v;
354 	struct compat_43_sys_getrlimit_args ua;
355 
356 	NETBSD32TO64_UAP(which);
357 	NETBSD32TOP_UAP(rlp, struct orlimit);
358 	return (compat_43_sys_getrlimit(p, &ua, retval));
359 }
360 
361 int
362 compat_43_netbsd32_osetrlimit(p, v, retval)
363 	struct proc *p;
364 	void *v;
365 	register_t *retval;
366 {
367 	struct compat_43_netbsd32_osetrlimit_args /* {
368 		syscallarg(int) which;
369 		syscallarg(netbsd32_orlimitp_t) rlp;
370 	} */ *uap = v;
371 	struct compat_43_sys_setrlimit_args ua;
372 
373 	NETBSD32TO64_UAP(which);
374 	NETBSD32TOP_UAP(rlp, struct orlimit);
375 	return (compat_43_sys_setrlimit(p, &ua, retval));
376 }
377 
378 int
379 compat_43_netbsd32_killpg(p, v, retval)
380 	struct proc *p;
381 	void *v;
382 	register_t *retval;
383 {
384 	struct compat_43_netbsd32_killpg_args /* {
385 		syscallarg(int) pgid;
386 		syscallarg(int) signum;
387 	} */ *uap = v;
388 	struct compat_43_sys_killpg_args ua;
389 
390 	NETBSD32TO64_UAP(pgid);
391 	NETBSD32TO64_UAP(signum);
392 	return (compat_43_sys_killpg(p, &ua, retval));
393 }
394 
395 /* virtual memory syscalls */
396 int
397 compat_43_netbsd32_ommap(p, v, retval)
398 	struct proc *p;
399 	void *v;
400 	register_t *retval;
401 {
402 	struct compat_43_netbsd32_ommap_args /* {
403 		syscallarg(netbsd32_caddr_t) addr;
404 		syscallarg(netbsd32_size_t) len;
405 		syscallarg(int) prot;
406 		syscallarg(int) flags;
407 		syscallarg(int) fd;
408 		syscallarg(netbsd32_long) pos;
409 	} */ *uap = v;
410 	struct compat_43_sys_mmap_args ua;
411 
412 	NETBSD32TOX64_UAP(addr, caddr_t);
413 	NETBSD32TOX_UAP(len, size_t);
414 	NETBSD32TO64_UAP(prot);
415 	NETBSD32TO64_UAP(flags);
416 	NETBSD32TO64_UAP(fd);
417 	NETBSD32TOX_UAP(pos, long);
418 	return (compat_43_sys_mmap(p, &ua, retval));
419 }
420 
421 /* virtual memory syscalls */
422 int
423 netbsd32_ovadvise(p, v, retval)
424 	struct proc *p;
425 	void *v;
426 	register_t *retval;
427 {
428 	struct netbsd32_ovadvise_args /* {
429 		syscallarg(int) anom;
430 	} */ *uap = v;
431 	struct sys_ovadvise_args ua;
432 
433 	NETBSD32TO64_UAP(anom);
434 	return (sys_ovadvise(p, &ua, retval));
435 }
436 
437 /* network syscalls */
438 int
439 compat_43_netbsd32_oaccept(p, v, retval)
440 	struct proc *p;
441 	void *v;
442 	register_t *retval;
443 {
444 	struct compat_43_netbsd32_oaccept_args /* {
445 		syscallarg(int) s;
446 		syscallarg(netbsd32_caddr_t) name;
447 		syscallarg(netbsd32_intp) anamelen;
448 	} */ *uap = v;
449 	struct compat_43_sys_accept_args ua;
450 
451 	NETBSD32TOX_UAP(s, int);
452 	NETBSD32TOX64_UAP(name, caddr_t);
453 	NETBSD32TOP_UAP(anamelen, int);
454 	return (compat_43_sys_accept(p, &ua, retval));
455 }
456 
457 int
458 compat_43_netbsd32_osend(p, v, retval)
459 	struct proc *p;
460 	void *v;
461 	register_t *retval;
462 {
463 	struct compat_43_netbsd32_osend_args /* {
464 		syscallarg(int) s;
465 		syscallarg(netbsd32_caddr_t) buf;
466 		syscallarg(int) len;
467 		syscallarg(int) flags;
468 	} */ *uap = v;
469 	struct compat_43_sys_send_args ua;
470 
471 	NETBSD32TO64_UAP(s);
472 	NETBSD32TOX64_UAP(buf, caddr_t);
473 	NETBSD32TO64_UAP(len);
474 	NETBSD32TO64_UAP(flags);
475 	return (compat_43_sys_send(p, &ua, retval));
476 }
477 
478 int
479 compat_43_netbsd32_orecv(p, v, retval)
480 	struct proc *p;
481 	void *v;
482 	register_t *retval;
483 {
484 	struct compat_43_netbsd32_orecv_args /* {
485 		syscallarg(int) s;
486 		syscallarg(netbsd32_caddr_t) buf;
487 		syscallarg(int) len;
488 		syscallarg(int) flags;
489 	} */ *uap = v;
490 	struct compat_43_sys_recv_args ua;
491 
492 	NETBSD32TO64_UAP(s);
493 	NETBSD32TOX64_UAP(buf, caddr_t);
494 	NETBSD32TO64_UAP(len);
495 	NETBSD32TO64_UAP(flags);
496 	return (compat_43_sys_recv(p, &ua, retval));
497 }
498 
499 /*
500  * XXX convert these to use a common iovec code to the native
501  * netbsd call.
502  */
503 int
504 compat_43_netbsd32_orecvmsg(p, v, retval)
505 	struct proc *p;
506 	void *v;
507 	register_t *retval;
508 {
509 	struct compat_43_netbsd32_orecvmsg_args /* {
510 		syscallarg(int) s;
511 		syscallarg(netbsd32_omsghdrp_t) msg;
512 		syscallarg(int) flags;
513 	} */ *uap = v;
514 	struct compat_43_sys_recvmsg_args ua;
515 	struct omsghdr omh;
516 	struct omsghdr *omhp = &omh;
517 	struct netbsd32_omsghdr *omhp32;
518 	struct iovec *iovec43p;
519 	struct netbsd32_iovec *iovec32p;
520 	int i;
521 
522 	NETBSD32TO64_UAP(s);
523 	NETBSD32TO64_UAP(flags);
524 
525 	SCARG(&ua, msg) = omhp;
526 	omhp32 = (struct netbsd32_omsghdr *)(u_long)SCARG(uap, msg);
527 	omhp->msg_name = (caddr_t)(u_long)omhp32->msg_name;
528 	omhp->msg_namelen = omhp32->msg_namelen;
529 	omhp->msg_iovlen = (size_t)omhp32->msg_iovlen;
530 	MALLOC(omhp->msg_iov, struct iovec *, sizeof(struct iovec) * omhp->msg_iovlen, M_TEMP, M_WAITOK);
531 	iovec43p = omhp->msg_iov;
532 	iovec32p = (struct netbsd32_iovec *)(u_long)omhp32->msg_iov;
533 	for (i = 0; i < omhp->msg_iovlen; i++, iovec43p++, iovec32p++) {
534 		iovec43p->iov_base = (struct iovec *)(u_long)iovec32p->iov_base;
535 		iovec43p->iov_len = (size_t)iovec32p->iov_len;
536 	}
537 
538 	omhp->msg_accrights = (caddr_t)(u_long)omhp32->msg_accrights;
539 	omhp->msg_accrightslen = omhp32->msg_accrightslen;
540 
541 	return (compat_43_sys_recvmsg(p, &ua, retval));
542 }
543 
544 int
545 compat_43_netbsd32_osendmsg(p, v, retval)
546 	struct proc *p;
547 	void *v;
548 	register_t *retval;
549 {
550 	struct compat_43_netbsd32_osendmsg_args /* {
551 		syscallarg(int) s;
552 		syscallarg(netbsd32_caddr_t) msg;
553 		syscallarg(int) flags;
554 	} */ *uap = v;
555 	struct compat_43_sys_sendmsg_args ua;
556 	struct omsghdr omh;
557 	struct omsghdr *omhp = &omh;
558 	struct netbsd32_omsghdr *omhp32;
559 	struct iovec *iovec43p;
560 	struct netbsd32_iovec *iovec32p;
561 	int i;
562 
563 	NETBSD32TO64_UAP(s);
564 	NETBSD32TO64_UAP(flags);
565 
566 	SCARG(&ua, msg) = (caddr_t)(u_long)omhp;
567 	omhp32 = (struct netbsd32_omsghdr *)(u_long)SCARG(uap, msg);
568 	omhp->msg_name = (caddr_t)(u_long)omhp32->msg_name;
569 	omhp->msg_namelen = omhp32->msg_namelen;
570 	omhp->msg_iovlen = (size_t)omhp32->msg_iovlen;
571 	MALLOC(omhp->msg_iov, struct iovec *, sizeof(struct iovec) * omhp->msg_iovlen, M_TEMP, M_WAITOK);
572 	iovec43p = omhp->msg_iov;
573 	iovec32p = (struct netbsd32_iovec *)(u_long)omhp32->msg_iov;
574 	for (i = 0; i < omhp->msg_iovlen; i++, iovec43p++, iovec32p++) {
575 		iovec43p->iov_base = (void *)(u_long)iovec32p->iov_base;
576 		iovec43p->iov_len = (size_t)iovec32p->iov_len;
577 	}
578 
579 	omhp->msg_accrights = (caddr_t)(u_long)omhp32->msg_accrights;
580 	omhp->msg_accrightslen = omhp32->msg_accrightslen;
581 
582 	return (compat_43_sys_sendmsg(p, &ua, retval));
583 }
584 
585 int
586 compat_43_netbsd32_orecvfrom(p, v, retval)
587 	struct proc *p;
588 	void *v;
589 	register_t *retval;
590 {
591 	struct compat_43_netbsd32_orecvfrom_args /* {
592 		syscallarg(int) s;
593 		syscallarg(netbsd32_caddr_t) buf;
594 		syscallarg(netbsd32_size_t) len;
595 		syscallarg(int) flags;
596 		syscallarg(netbsd32_caddr_t) from;
597 		syscallarg(netbsd32_intp) fromlenaddr;
598 	} */ *uap = v;
599 	struct compat_43_sys_recvfrom_args ua;
600 
601 	NETBSD32TO64_UAP(s);
602 	NETBSD32TOX64_UAP(buf, caddr_t);
603 	NETBSD32TOX_UAP(len, size_t);
604 	NETBSD32TO64_UAP(flags);
605 	NETBSD32TOX64_UAP(from, caddr_t);
606 	NETBSD32TOP_UAP(fromlenaddr, int);
607 	return (compat_43_sys_recvfrom(p, &ua, retval));
608 }
609 
610 int
611 compat_43_netbsd32_ogetsockname(p, v, retval)
612 	struct proc *p;
613 	void *v;
614 	register_t *retval;
615 {
616 	struct compat_43_netbsd32_ogetsockname_args /* {
617 		syscallarg(int) fdec;
618 		syscallarg(netbsd32_caddr_t) asa;
619 		syscallarg(netbsd32_intp) alen;
620 	} */ *uap = v;
621 	struct compat_43_sys_getsockname_args ua;
622 
623 	NETBSD32TO64_UAP(fdec);
624 	NETBSD32TOX64_UAP(asa, caddr_t);
625 	NETBSD32TOP_UAP(alen, int);
626 	return (compat_43_sys_getsockname(p, &ua, retval));
627 }
628 
629 int
630 compat_43_netbsd32_ogetpeername(p, v, retval)
631 	struct proc *p;
632 	void *v;
633 	register_t *retval;
634 {
635 	struct compat_43_netbsd32_ogetpeername_args /* {
636 		syscallarg(int) fdes;
637 		syscallarg(netbsd32_caddr_t) asa;
638 		syscallarg(netbsd32_intp) alen;
639 	} */ *uap = v;
640 	struct compat_43_sys_getpeername_args ua;
641 
642 	NETBSD32TO64_UAP(fdes);
643 	NETBSD32TOX64_UAP(asa, caddr_t);
644 	NETBSD32TOP_UAP(alen, int);
645 	return (compat_43_sys_getpeername(p, &ua, retval));
646 }
647 
648 /* signal syscalls */
649 int
650 compat_43_netbsd32_osigvec(p, v, retval)
651 	struct proc *p;
652 	void *v;
653 	register_t *retval;
654 {
655 	struct compat_43_netbsd32_osigvec_args /* {
656 		syscallarg(int) signum;
657 		syscallarg(netbsd32_sigvecp_t) nsv;
658 		syscallarg(netbsd32_sigvecp_t) osv;
659 	} */ *uap = v;
660 	struct compat_43_sys_sigvec_args ua;
661 	struct netbsd32_sigvec *sv32p;
662 	struct sigvec nsv, osv;
663 	int rv;
664 
665 	NETBSD32TO64_UAP(signum);
666 	if (SCARG(uap, osv))
667 		SCARG(&ua, osv) = &osv;
668 	else
669 		SCARG(&ua, osv) = NULL;
670 	if (SCARG(uap, nsv)) {
671 		SCARG(&ua, nsv) = &nsv;
672 		sv32p = (struct netbsd32_sigvec *)(u_long)SCARG(uap, nsv);
673 		nsv.sv_handler = (void *)(u_long)sv32p->sv_handler;
674 		nsv.sv_mask = sv32p->sv_mask;
675 		nsv.sv_flags = sv32p->sv_flags;
676 	} else
677 		SCARG(&ua, nsv) = NULL;
678 	rv = compat_43_sys_sigvec(p, &ua, retval);
679 	if (rv)
680 		return (rv);
681 
682 	if (SCARG(uap, osv)) {
683 		sv32p = (struct netbsd32_sigvec *)(u_long)SCARG(uap, osv);
684 		sv32p->sv_handler = (netbsd32_sigvecp_t)(u_long)osv.sv_handler;
685 		sv32p->sv_mask = osv.sv_mask;
686 		sv32p->sv_flags = osv.sv_flags;
687 	}
688 
689 	return (0);
690 }
691 
692 int
693 compat_43_netbsd32_sigblock(p, v, retval)
694 	struct proc *p;
695 	void *v;
696 	register_t *retval;
697 {
698 	struct compat_43_netbsd32_sigblock_args /* {
699 		syscallarg(int) mask;
700 	} */ *uap = v;
701 	struct compat_43_sys_sigblock_args ua;
702 
703 	NETBSD32TO64_UAP(mask);
704 	return (compat_43_sys_sigblock(p, &ua, retval));
705 }
706 
707 int
708 compat_43_netbsd32_sigsetmask(p, v, retval)
709 	struct proc *p;
710 	void *v;
711 	register_t *retval;
712 {
713 	struct compat_43_netbsd32_sigsetmask_args /* {
714 		syscallarg(int) mask;
715 	} */ *uap = v;
716 	struct compat_43_sys_sigsetmask_args ua;
717 
718 	NETBSD32TO64_UAP(mask);
719 	return (compat_43_sys_sigsetmask(p, &ua, retval));
720 }
721 
722 int
723 compat_43_netbsd32_osigstack(p, v, retval)
724 	struct proc *p;
725 	void *v;
726 	register_t *retval;
727 {
728 	struct compat_43_netbsd32_osigstack_args /* {
729 		syscallarg(netbsd32_sigstackp_t) nss;
730 		syscallarg(netbsd32_sigstackp_t) oss;
731 	} */ *uap = v;
732 	struct compat_43_sys_sigstack_args ua;
733 	struct netbsd32_sigstack *ss32p;
734 	struct sigstack nss, oss;
735 	int rv;
736 
737 	if (SCARG(uap, oss))
738 		SCARG(&ua, oss) = &oss;
739 	else
740 		SCARG(&ua, oss) = NULL;
741 	if (SCARG(uap, nss)) {
742 		SCARG(&ua, nss) = &nss;
743 		ss32p = (struct netbsd32_sigstack *)(u_long)SCARG(uap, nss);
744 		nss.ss_sp = (void *)(u_long)ss32p->ss_sp;
745 		nss.ss_onstack = ss32p->ss_onstack;
746 	} else
747 		SCARG(&ua, nss) = NULL;
748 
749 	rv = compat_43_sys_sigstack(p, &ua, retval);
750 	if (rv)
751 		return (rv);
752 
753 	if (SCARG(uap, oss)) {
754 		ss32p = (struct netbsd32_sigstack *)(u_long)SCARG(uap, oss);
755 		ss32p->ss_sp = (netbsd32_sigstackp_t)(u_long)oss.ss_sp;
756 		ss32p->ss_onstack = oss.ss_onstack;
757 	}
758 
759 	return (0);
760 }
761