Home | History | Annotate | Line # | Download | only in netbsd32
netbsd32_compat_43.c revision 1.47
      1 /*	$NetBSD: netbsd32_compat_43.c,v 1.47 2007/12/20 23:03:01 dsl Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1998, 2001 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/cdefs.h>
     32 __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_43.c,v 1.47 2007/12/20 23:03:01 dsl Exp $");
     33 
     34 #if defined(_KERNEL_OPT)
     35 #include "opt_compat_43.h"
     36 #endif
     37 
     38 #include <sys/param.h>
     39 #include <sys/systm.h>
     40 #include <sys/fcntl.h>
     41 #include <sys/filedesc.h>
     42 #include <sys/malloc.h>
     43 #include <sys/mbuf.h>
     44 #include <sys/mount.h>
     45 #include <sys/namei.h>
     46 #include <sys/socket.h>
     47 #include <sys/proc.h>
     48 #include <sys/socket.h>
     49 #include <sys/socketvar.h>
     50 #include <sys/stat.h>
     51 #include <sys/syscallargs.h>
     52 #include <sys/time.h>
     53 #include <sys/ucred.h>
     54 #include <sys/vfs_syscalls.h>
     55 #include <uvm/uvm_extern.h>
     56 #include <sys/sysctl.h>
     57 #include <sys/swap.h>
     58 
     59 #include <compat/netbsd32/netbsd32.h>
     60 #include <compat/netbsd32/netbsd32_syscallargs.h>
     61 
     62 #include <compat/sys/stat.h>
     63 #include <compat/sys/signal.h>
     64 #include <compat/sys/signalvar.h>
     65 #include <compat/sys/socket.h>
     66 
     67 #define SYS_DEF(foo) struct foo##_args; \
     68     int foo(struct lwp *, const struct foo##_args *, register_t *)
     69 
     70 SYS_DEF(compat_43_netbsd32_sethostid);
     71 SYS_DEF(compat_43_netbsd32_killpg);
     72 SYS_DEF(compat_43_netbsd32_sigblock);
     73 SYS_DEF(compat_43_netbsd32_sigblock);
     74 SYS_DEF(compat_43_netbsd32_sigsetmask);
     75 #undef SYS_DEF
     76 
     77 static void
     78 netbsd32_from_stat(const struct stat *sb, struct netbsd32_stat43 *sp32)
     79 {
     80 
     81 	sp32->st_dev = sb->st_dev;
     82 	sp32->st_ino = sb->st_ino;
     83 	sp32->st_mode = sb->st_mode;
     84 	sp32->st_nlink = sb->st_nlink;
     85 	sp32->st_uid = sb->st_uid;
     86 	sp32->st_gid = sb->st_gid;
     87 	sp32->st_rdev = sb->st_rdev;
     88 	sp32->st_size = sb->st_size < (quad_t)1 << 32 ? sb->st_size : -2;
     89 	sp32->st_atimespec.tv_sec = sb->st_atimespec.tv_sec;
     90 	sp32->st_atimespec.tv_nsec = sb->st_atimespec.tv_nsec;
     91 	sp32->st_mtimespec.tv_sec = sb->st_mtimespec.tv_sec;
     92 	sp32->st_mtimespec.tv_nsec = sb->st_mtimespec.tv_nsec;
     93 	sp32->st_ctimespec.tv_sec = sb->st_ctimespec.tv_sec;
     94 	sp32->st_ctimespec.tv_nsec = sb->st_ctimespec.tv_nsec;
     95 	sp32->st_blksize = sb->st_blksize;
     96 	sp32->st_blocks = sb->st_blocks;
     97 	sp32->st_flags = sb->st_flags;
     98 	sp32->st_gen = sb->st_gen;
     99 }
    100 
    101 /* file system syscalls */
    102 int
    103 compat_43_netbsd32_ocreat(struct lwp *l, const struct compat_43_netbsd32_ocreat_args *uap, register_t *retval)
    104 {
    105 	/* {
    106 		syscallarg(const netbsd32_charp) path;
    107 		syscallarg(mode_t) mode;
    108 	} */
    109 	struct sys_open_args  ua;
    110 
    111 	NETBSD32TOP_UAP(path, const char);
    112 	NETBSD32TO64_UAP(mode);
    113 	SCARG(&ua, flags) = O_WRONLY | O_CREAT | O_TRUNC;
    114 
    115 	return (sys_open(l, &ua, retval));
    116 }
    117 
    118 int
    119 compat_43_netbsd32_olseek(struct lwp *l, const struct compat_43_netbsd32_olseek_args *uap, register_t *retval)
    120 {
    121 	/* {
    122 		syscallarg(int) fd;
    123 		syscallarg(netbsd32_long) offset;
    124 		syscallarg(int) whence;
    125 	} */
    126 	struct sys_lseek_args ua;
    127 	int rv;
    128 	off_t rt;
    129 
    130 	SCARG(&ua, fd) = SCARG(uap, fd);
    131 	NETBSD32TOX_UAP(offset, long);
    132 	NETBSD32TO64_UAP(whence);
    133 	rv = sys_lseek(l, &ua, (register_t *)&rt);
    134 	*retval = rt;
    135 
    136 	return (rv);
    137 }
    138 
    139 int
    140 compat_43_netbsd32_stat43(struct lwp *l, const struct compat_43_netbsd32_stat43_args *uap, register_t *retval)
    141 {
    142 	/* {
    143 		syscallarg(const netbsd32_charp) path;
    144 		syscallarg(netbsd32_stat43p_t) ub;
    145 	} */
    146 	struct stat sb;
    147 	struct netbsd32_stat43 sb32;
    148 	int error;
    149 
    150 	error = do_sys_stat(l, SCARG_P32(uap, path), FOLLOW, &sb);
    151 	if (error == 0) {
    152 		netbsd32_from_stat(&sb, &sb32);
    153 		error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32));
    154 	}
    155 	return error;
    156 }
    157 
    158 int
    159 compat_43_netbsd32_lstat43(struct lwp *l, const struct compat_43_netbsd32_lstat43_args *uap, register_t *retval)
    160 {
    161 	/* {
    162 		syscallarg(const netbsd32_charp) path;
    163 		syscallarg(netbsd32_stat43p_t) ub;
    164 	} */
    165 	struct stat sb;
    166 	struct netbsd32_stat43 sb32;
    167 	int error;
    168 
    169 	error = do_sys_stat(l, SCARG_P32(uap, path), NOFOLLOW, &sb);
    170 	if (error == 0) {
    171 		netbsd32_from_stat(&sb, &sb32);
    172 		error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32));
    173 	}
    174 	return error;
    175 }
    176 
    177 int
    178 compat_43_netbsd32_fstat43(struct lwp *l, const struct compat_43_netbsd32_fstat43_args *uap, register_t *retval)
    179 {
    180 	/* {
    181 		syscallarg(int) fd;
    182 		syscallarg(netbsd32_stat43p_t) sb;
    183 	} */
    184 	struct stat sb;
    185 	struct netbsd32_stat43 sb32;
    186 	int error;
    187 
    188 	error = do_sys_fstat(l, SCARG(uap, fd), &sb);
    189 	if (error == 0) {
    190 		netbsd32_from_stat(&sb, &sb32);
    191 		error = copyout(&sb32, SCARG_P32(uap, sb), sizeof(sb32));
    192 	}
    193 	return error;
    194 }
    195 
    196 int
    197 compat_43_netbsd32_otruncate(struct lwp *l, const struct compat_43_netbsd32_otruncate_args *uap, register_t *retval)
    198 {
    199 	/* {
    200 		syscallarg(const netbsd32_charp) path;
    201 		syscallarg(netbsd32_long) length;
    202 	} */
    203 	struct sys_truncate_args ua;
    204 
    205 	NETBSD32TOP_UAP(path, const char);
    206 	NETBSD32TO64_UAP(length);
    207 	return (sys_truncate(l, &ua, retval));
    208 }
    209 
    210 int
    211 compat_43_netbsd32_oftruncate(struct lwp *l, const struct compat_43_netbsd32_oftruncate_args *uap, register_t *retval)
    212 {
    213 	/* {
    214 		syscallarg(int) fd;
    215 		syscallarg(netbsd32_long) length;
    216 	} */
    217 	struct sys_ftruncate_args ua;
    218 
    219 	NETBSD32TO64_UAP(fd);
    220 	NETBSD32TO64_UAP(length);
    221 	return (sys_ftruncate(l, &ua, retval));
    222 }
    223 
    224 int
    225 compat_43_netbsd32_ogetdirentries(struct lwp *l, const struct compat_43_netbsd32_ogetdirentries_args *uap, register_t *retval)
    226 {
    227 	/* {
    228 		syscallarg(int) fd;
    229 		syscallarg(netbsd32_charp) buf;
    230 		syscallarg(u_int) count;
    231 		syscallarg(netbsd32_longp) basep;
    232 	} */
    233 	struct compat_43_sys_getdirentries_args ua;
    234 
    235 	NETBSD32TO64_UAP(fd);
    236 	NETBSD32TOP_UAP(buf, char);
    237 	NETBSD32TO64_UAP(count);
    238 	NETBSD32TOP_UAP(basep, long);
    239 	return (compat_43_sys_getdirentries(l, &ua, retval));
    240 }
    241 
    242 /* kernel syscalls */
    243 int
    244 compat_43_netbsd32_ogetkerninfo(struct lwp *l, const struct compat_43_netbsd32_ogetkerninfo_args *uap, register_t *retval)
    245 {
    246 	/* {
    247 		syscallarg(int) op;
    248 		syscallarg(netbsd32_charp) where;
    249 		syscallarg(netbsd32_intp) size;
    250 		syscallarg(int) arg;
    251 	} */
    252 	struct compat_43_sys_getkerninfo_args ua;
    253 
    254 	NETBSD32TO64_UAP(op);
    255 	NETBSD32TOP_UAP(where, char);
    256 	NETBSD32TOP_UAP(size, int);
    257 	NETBSD32TO64_UAP(arg);
    258 	return (compat_43_sys_getkerninfo(l, &ua, retval));
    259 }
    260 
    261 int
    262 compat_43_netbsd32_ogethostname(struct lwp *l, const struct compat_43_netbsd32_ogethostname_args *uap, register_t *retval)
    263 {
    264 	/* {
    265 		syscallarg(netbsd32_charp) hostname;
    266 		syscallarg(u_int) len;
    267 	} */
    268 	int name[2];
    269 	size_t sz;
    270 
    271 	name[0] = CTL_KERN;
    272 	name[1] = KERN_HOSTNAME;
    273 	sz = SCARG(uap, len);
    274 	return (old_sysctl(&name[0], 2,
    275 	    SCARG_P32(uap, hostname), &sz, 0, 0, l));
    276 }
    277 
    278 int
    279 compat_43_netbsd32_osethostname(struct lwp *l, const struct compat_43_netbsd32_osethostname_args *uap, register_t *retval)
    280 {
    281 	/* {
    282 		syscallarg(netbsd32_charp) hostname;
    283 		syscallarg(u_int) len;
    284 	} */
    285 	int name[2];
    286 
    287 	name[0] = CTL_KERN;
    288 	name[1] = KERN_HOSTNAME;
    289 	return old_sysctl(&name[0], 2, 0, 0, (char *)SCARG_P32(uap,
    290 	    hostname), SCARG(uap, len), l);
    291 }
    292 
    293 int
    294 compat_43_netbsd32_sethostid(struct lwp *l, const struct compat_43_netbsd32_sethostid_args *uap, register_t *retval)
    295 {
    296 	/* {
    297 		syscallarg(int32_t) hostid;
    298 	} */
    299 	struct compat_43_sys_sethostid_args ua;
    300 
    301 	NETBSD32TO64_UAP(hostid);
    302 	return (compat_43_sys_sethostid(l, &ua, retval));
    303 }
    304 
    305 int
    306 compat_43_netbsd32_ogetrlimit(struct lwp *l, const struct compat_43_netbsd32_ogetrlimit_args *uap, register_t *retval)
    307 {
    308 	/* {
    309 		syscallarg(int) which;
    310 		syscallarg(netbsd32_orlimitp_t) rlp;
    311 	} */
    312 	struct compat_43_sys_getrlimit_args ua;
    313 
    314 	NETBSD32TO64_UAP(which);
    315 	NETBSD32TOP_UAP(rlp, struct orlimit);
    316 	return (compat_43_sys_getrlimit(l, &ua, retval));
    317 }
    318 
    319 int
    320 compat_43_netbsd32_osetrlimit(struct lwp *l, const struct compat_43_netbsd32_osetrlimit_args *uap, register_t *retval)
    321 {
    322 	/* {
    323 		syscallarg(int) which;
    324 		syscallarg(netbsd32_orlimitp_t) rlp;
    325 	} */
    326 	struct compat_43_sys_setrlimit_args ua;
    327 
    328 	NETBSD32TO64_UAP(which);
    329 	NETBSD32TOP_UAP(rlp, struct orlimit);
    330 	return (compat_43_sys_setrlimit(l, &ua, retval));
    331 }
    332 
    333 int
    334 compat_43_netbsd32_killpg(struct lwp *l, const struct compat_43_netbsd32_killpg_args *uap, register_t *retval)
    335 {
    336 	/* {
    337 		syscallarg(int) pgid;
    338 		syscallarg(int) signum;
    339 	} */
    340 	struct compat_43_sys_killpg_args ua;
    341 
    342 	NETBSD32TO64_UAP(pgid);
    343 	NETBSD32TO64_UAP(signum);
    344 	return (compat_43_sys_killpg(l, &ua, retval));
    345 }
    346 
    347 /* virtual memory syscalls */
    348 int
    349 compat_43_netbsd32_ommap(struct lwp *l, const struct compat_43_netbsd32_ommap_args *uap, register_t *retval)
    350 {
    351 	/* {
    352 		syscallarg(netbsd32_caddr_t) addr;
    353 		syscallarg(netbsd32_size_t) len;
    354 		syscallarg(int) prot;
    355 		syscallarg(int) flags;
    356 		syscallarg(int) fd;
    357 		syscallarg(netbsd32_long) pos;
    358 	} */
    359 	struct compat_43_sys_mmap_args ua;
    360 
    361 	NETBSD32TOP_UAP(addr, void *);
    362 	NETBSD32TOX_UAP(len, size_t);
    363 	NETBSD32TO64_UAP(prot);
    364 	NETBSD32TO64_UAP(flags);
    365 	NETBSD32TO64_UAP(fd);
    366 	NETBSD32TOX_UAP(pos, long);
    367 	return (compat_43_sys_mmap(l, &ua, retval));
    368 }
    369 
    370 /* network syscalls */
    371 int
    372 compat_43_netbsd32_oaccept(struct lwp *l, const struct compat_43_netbsd32_oaccept_args *uap, register_t *retval)
    373 {
    374 	/* {
    375 		syscallarg(int) s;
    376 		syscallarg(netbsd32_caddr_t) name;
    377 		syscallarg(netbsd32_intp) anamelen;
    378 	} */
    379 	struct compat_43_sys_accept_args ua;
    380 
    381 	NETBSD32TOX_UAP(s, int);
    382 	NETBSD32TOP_UAP(name, void *);
    383 	NETBSD32TOP_UAP(anamelen, int);
    384 	return (compat_43_sys_accept(l, &ua, retval));
    385 }
    386 
    387 int
    388 compat_43_netbsd32_osend(struct lwp *l, const struct compat_43_netbsd32_osend_args *uap, register_t *retval)
    389 {
    390 	/* {
    391 		syscallarg(int) s;
    392 		syscallarg(netbsd32_caddr_t) buf;
    393 		syscallarg(int) len;
    394 		syscallarg(int) flags;
    395 	} */
    396 	struct compat_43_sys_send_args ua;
    397 
    398 	NETBSD32TO64_UAP(s);
    399 	NETBSD32TOP_UAP(buf, void *);
    400 	NETBSD32TO64_UAP(len);
    401 	NETBSD32TO64_UAP(flags);
    402 	return (compat_43_sys_send(l, &ua, retval));
    403 }
    404 
    405 int
    406 compat_43_netbsd32_orecv(struct lwp *l, const struct compat_43_netbsd32_orecv_args *uap, register_t *retval)
    407 {
    408 	/* {
    409 		syscallarg(int) s;
    410 		syscallarg(netbsd32_caddr_t) buf;
    411 		syscallarg(int) len;
    412 		syscallarg(int) flags;
    413 	} */
    414 	struct compat_43_sys_recv_args ua;
    415 
    416 	NETBSD32TO64_UAP(s);
    417 	NETBSD32TOP_UAP(buf, void *);
    418 	NETBSD32TO64_UAP(len);
    419 	NETBSD32TO64_UAP(flags);
    420 	return (compat_43_sys_recv(l, &ua, retval));
    421 }
    422 
    423 /*
    424  * This is a brutal clone of compat_43_sys_recvmsg().
    425  */
    426 int
    427 compat_43_netbsd32_orecvmsg(struct lwp *l, const struct compat_43_netbsd32_orecvmsg_args *uap, register_t *retval)
    428 {
    429 	/* {
    430 		syscallarg(int) s;
    431 		syscallarg(netbsd32_omsghdrp_t) msg;
    432 		syscallarg(int) flags;
    433 	} */
    434 	struct netbsd32_omsghdr omsg;
    435 	struct msghdr msg;
    436 	struct mbuf *from, *control;
    437 	struct iovec *iov, aiov[UIO_SMALLIOV];
    438 	int error;
    439 
    440 	error = copyin(SCARG_P32(uap, msg), &omsg, sizeof (struct omsghdr));
    441 	if (error)
    442 		return (error);
    443 
    444 	if (NETBSD32PTR64(omsg.msg_accrights) == NULL)
    445 		omsg.msg_accrightslen = 0;
    446 	/* it was this way in 4.4BSD */
    447 	if (omsg.msg_accrightslen > MLEN)
    448 		return EINVAL;
    449 
    450 	iov = netbsd32_get_iov(NETBSD32PTR64(omsg.msg_iov), omsg.msg_iovlen,
    451 	    aiov, __arraycount(aiov));
    452 	if (iov == NULL)
    453 		return EFAULT;
    454 
    455 	msg.msg_name	= NETBSD32PTR64(omsg.msg_name);
    456 	msg.msg_namelen = omsg.msg_namelen;
    457 	msg.msg_iovlen	= omsg.msg_iovlen;
    458 	msg.msg_iov	= iov;
    459 	msg.msg_flags	= SCARG(uap, flags) & MSG_USERFLAGS;
    460 
    461 	error = do_sys_recvmsg(l, SCARG(uap, s), &msg, &from,
    462 	    NETBSD32PTR64(omsg.msg_accrights) != NULL ? &control : NULL,
    463 	    retval);
    464 	if (error != 0)
    465 		return error;
    466 
    467 	/*
    468 	 * If there is any control information and it's SCM_RIGHTS,
    469 	 * pass it back to the program.
    470 	 * XXX: maybe there can be more than one chunk of control data?
    471 	 */
    472 	if (NETBSD32PTR64(omsg.msg_accrights) != NULL && control != NULL) {
    473 		struct cmsghdr *cmsg = mtod(control, void *);
    474 
    475 		if (cmsg->cmsg_level == SOL_SOCKET
    476 		    && cmsg->cmsg_type == SCM_RIGHTS
    477 		    && cmsg->cmsg_len < omsg.msg_accrightslen
    478 		    && copyout(CMSG_DATA(cmsg),
    479 			    NETBSD32PTR64(omsg.msg_accrights),
    480 			    cmsg->cmsg_len) == 0) {
    481 			omsg.msg_accrightslen = cmsg->cmsg_len;
    482 			free_control_mbuf(l, control, control->m_next);
    483 		} else {
    484 			omsg.msg_accrightslen = 0;
    485 			free_control_mbuf(l, control, control);
    486 		}
    487 	} else
    488 		omsg.msg_accrightslen = 0;
    489 
    490 	if (from != NULL)
    491 		/* convert from sockaddr sa_family to osockaddr one here */
    492 		mtod(from, struct osockaddr *)->sa_family =
    493 				    mtod(from, struct sockaddr *)->sa_family;
    494 
    495 	error = copyout_sockname(NETBSD32PTR64(omsg.msg_name),
    496 	    &omsg.msg_namelen, 0, from);
    497 	if (from != NULL)
    498 		m_free(from);
    499 
    500 	if (error != 0)
    501 		 error = copyout(&omsg, SCARG_P32(uap, msg), sizeof(omsg));
    502 
    503 	return error;
    504 }
    505 
    506 int
    507 compat_43_netbsd32_osendmsg(struct lwp *l, const struct compat_43_netbsd32_osendmsg_args *uap, register_t *retval)
    508 {
    509 	/* {
    510 		syscallarg(int) s;
    511 		syscallarg(netbsd32_caddr_t) msg;
    512 		syscallarg(int) flags;
    513 	} */
    514 	struct iovec *iov, aiov[UIO_SMALLIOV];
    515 	struct netbsd32_omsghdr omsg;
    516 	struct msghdr msg;
    517 	int error;
    518 	struct mbuf *nam;
    519 	struct osockaddr *osa;
    520 	struct sockaddr *sa;
    521 
    522 	error = copyin(SCARG_P32(uap, msg), &omsg, sizeof (struct omsghdr));
    523 	if (error != 0)
    524 		return (error);
    525 
    526 	iov = netbsd32_get_iov(NETBSD32PTR64(omsg.msg_iov), omsg.msg_iovlen,
    527 	    aiov, __arraycount(aiov));
    528 	if (iov == NULL)
    529 		return EFAULT;
    530 
    531 	msg.msg_iovlen = omsg.msg_iovlen;
    532 	msg.msg_iov = iov;
    533 	msg.msg_flags = MSG_NAMEMBUF;
    534 
    535 	error = sockargs(&nam, NETBSD32PTR64(omsg.msg_name), omsg.msg_namelen,
    536 	    MT_SONAME);
    537 	if (error != 0)
    538 		goto out;
    539 
    540 	sa = mtod(nam, void *);
    541 	osa = mtod(nam, void *);
    542 	sa->sa_family = osa->sa_family;
    543 	sa->sa_len = omsg.msg_namelen;
    544 
    545 	msg.msg_name = nam;
    546 	msg.msg_namelen = omsg.msg_namelen;
    547 	error = compat43_set_accrights(&msg, NETBSD32PTR64(omsg.msg_accrights),
    548 	    omsg.msg_accrightslen);
    549 	if (error != 0) {
    550 		m_free(nam);
    551 		goto out;
    552 	}
    553 
    554 	error = do_sys_sendmsg(l, SCARG(uap, s), &msg, SCARG(uap, flags), retval);
    555 
    556     out:
    557 	if (iov != aiov)
    558 		free(iov, M_TEMP);
    559 	return (error);
    560 }
    561 
    562 int
    563 compat_43_netbsd32_orecvfrom(struct lwp *l, const struct compat_43_netbsd32_orecvfrom_args *uap, register_t *retval)
    564 {
    565 	/* {
    566 		syscallarg(int) s;
    567 		syscallarg(netbsd32_caddr_t) buf;
    568 		syscallarg(netbsd32_size_t) len;
    569 		syscallarg(int) flags;
    570 		syscallarg(netbsd32_caddr_t) from;
    571 		syscallarg(netbsd32_intp) fromlenaddr;
    572 	} */
    573 	struct compat_43_sys_recvfrom_args ua;
    574 
    575 	NETBSD32TO64_UAP(s);
    576 	NETBSD32TOP_UAP(buf, void *);
    577 	NETBSD32TOX_UAP(len, size_t);
    578 	NETBSD32TO64_UAP(flags);
    579 	NETBSD32TOP_UAP(from, void *);
    580 	NETBSD32TOP_UAP(fromlenaddr, int);
    581 	return (compat_43_sys_recvfrom(l, &ua, retval));
    582 }
    583 
    584 int
    585 compat_43_netbsd32_ogetsockname(struct lwp *l, const struct compat_43_netbsd32_ogetsockname_args *uap, register_t *retval)
    586 {
    587 	/* {
    588 		syscallarg(int) fdec;
    589 		syscallarg(netbsd32_caddr_t) asa;
    590 		syscallarg(netbsd32_intp) alen;
    591 	} */
    592 	struct compat_43_sys_getsockname_args ua;
    593 
    594 	NETBSD32TO64_UAP(fdec);
    595 	NETBSD32TOP_UAP(asa, void *);
    596 	NETBSD32TOP_UAP(alen, int *);
    597 	return (compat_43_sys_getsockname(l, &ua, retval));
    598 }
    599 
    600 int
    601 compat_43_netbsd32_ogetpeername(struct lwp *l, const struct compat_43_netbsd32_ogetpeername_args *uap, register_t *retval)
    602 {
    603 	/* {
    604 		syscallarg(int) fdes;
    605 		syscallarg(netbsd32_caddr_t) asa;
    606 		syscallarg(netbsd32_intp) alen;
    607 	} */
    608 	struct compat_43_sys_getpeername_args ua;
    609 
    610 	NETBSD32TO64_UAP(fdes);
    611 	NETBSD32TOP_UAP(asa, void *);
    612 	NETBSD32TOP_UAP(alen, int *);
    613 	return (compat_43_sys_getpeername(l, &ua, retval));
    614 }
    615 
    616 /* signal syscalls */
    617 int
    618 compat_43_netbsd32_osigvec(struct lwp *l, const struct compat_43_netbsd32_osigvec_args *uap, register_t *retval)
    619 {
    620 	/* {
    621 		syscallarg(int) signum;
    622 		syscallarg(netbsd32_sigvecp_t) nsv;
    623 		syscallarg(netbsd32_sigvecp_t) osv;
    624 	} */
    625 	struct netbsd32_sigvec sv32;
    626 	struct sigaction nsa, osa;
    627 	int error;
    628 
    629 	if (SCARG(uap, signum) >= 32)
    630 		return EINVAL;
    631 
    632 	if (SCARG_P32(uap, nsv)) {
    633 		error = copyin(SCARG_P32(uap, nsv), &sv32, sizeof(sv32));
    634 		if (error)
    635 			return error;
    636 		nsa.sa_handler = NETBSD32PTR64(sv32.sv_handler);
    637 		nsa.sa_mask.__bits[0] = sv32.sv_mask;
    638 		nsa.sa_mask.__bits[1] = 0;
    639 		nsa.sa_mask.__bits[2] = 0;
    640 		nsa.sa_mask.__bits[3] = 0;
    641 		nsa.sa_flags = sv32.sv_flags ^ SA_RESTART;
    642 		error = sigaction1(l, SCARG(uap, signum), &nsa, &osa, NULL, 0);
    643 	} else
    644 		error = sigaction1(l, SCARG(uap, signum), NULL, &osa, NULL, 0);
    645 	if (error)
    646 		return error;
    647 
    648 	if (SCARG_P32(uap, osv)) {
    649 		NETBSD32PTR32(sv32.sv_handler, osa.sa_handler);
    650 		sv32.sv_mask = osa.sa_mask.__bits[0];
    651 		sv32.sv_flags = osa.sa_flags ^ SA_RESTART;
    652 		error = copyout(&sv32, SCARG_P32(uap, osv), sizeof(sv32));
    653 	}
    654 
    655 	return error;
    656 }
    657 
    658 int
    659 compat_43_netbsd32_sigblock(struct lwp *l, const struct compat_43_netbsd32_sigblock_args *uap, register_t *retval)
    660 {
    661 	/* {
    662 		syscallarg(int) mask;
    663 	} */
    664 	struct compat_43_sys_sigblock_args ua;
    665 
    666 	NETBSD32TO64_UAP(mask);
    667 	return (compat_43_sys_sigblock(l, &ua, retval));
    668 }
    669 
    670 int
    671 compat_43_netbsd32_sigsetmask(struct lwp *l, const struct compat_43_netbsd32_sigsetmask_args *uap, register_t *retval)
    672 {
    673 	/* {
    674 		syscallarg(int) mask;
    675 	} */
    676 	struct compat_43_sys_sigsetmask_args ua;
    677 
    678 	NETBSD32TO64_UAP(mask);
    679 	return (compat_43_sys_sigsetmask(l, &ua, retval));
    680 }
    681 
    682 int
    683 compat_43_netbsd32_osigstack(struct lwp *l, const struct compat_43_netbsd32_osigstack_args *uap, register_t *retval)
    684 {
    685 	/* {
    686 		syscallarg(netbsd32_sigstackp_t) nss;
    687 		syscallarg(netbsd32_sigstackp_t) oss;
    688 	} */
    689 	struct netbsd32_sigstack ss32;
    690 	struct sigaltstack nsa, osa;
    691 	int error;
    692 
    693 	if (SCARG_P32(uap, nss)) {
    694 		error = copyin(SCARG_P32(uap, nss), &ss32, sizeof(ss32));
    695 		if (error)
    696 			return error;
    697 		nsa.ss_sp = NETBSD32PTR64(ss32.ss_sp);
    698 		nsa.ss_size = SIGSTKSZ; /* Use the recommended size */
    699 		nsa.ss_flags = ss32.ss_onstack ? SS_ONSTACK : 0;
    700 		error = sigaltstack1(l, &nsa, &osa);
    701 	} else
    702 		error = sigaltstack1(l, NULL, &osa);
    703 	if (error)
    704 		return error;
    705 
    706 	if (SCARG_P32(uap, oss)) {
    707 		NETBSD32PTR32(ss32.ss_sp, osa.ss_sp);
    708 		ss32.ss_onstack = (osa.ss_flags & SS_ONSTACK) != 0;
    709 		error = copyout(&ss32, SCARG_P32(uap, oss), sizeof(ss32));
    710 	}
    711 
    712 	return error;
    713 }
    714