xref: /netbsd-src/sys/rump/net/lib/libsockin/sockin_user.c (revision e0888b5db503563672b46c6c42066b880d4c1460)
1*e0888b5dSbad /*	$NetBSD: sockin_user.c,v 1.4 2019/03/26 08:56:17 bad Exp $	*/
200328592Spooka 
300328592Spooka /*
400328592Spooka  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
500328592Spooka  *
600328592Spooka  * Redistribution and use in source and binary forms, with or without
700328592Spooka  * modification, are permitted provided that the following conditions
800328592Spooka  * are met:
900328592Spooka  * 1. Redistributions of source code must retain the above copyright
1000328592Spooka  *    notice, this list of conditions and the following disclaimer.
1100328592Spooka  * 2. Redistributions in binary form must reproduce the above copyright
1200328592Spooka  *    notice, this list of conditions and the following disclaimer in the
1300328592Spooka  *    documentation and/or other materials provided with the distribution.
1400328592Spooka  *
1500328592Spooka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
1600328592Spooka  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1700328592Spooka  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1800328592Spooka  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1900328592Spooka  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2000328592Spooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2100328592Spooka  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2200328592Spooka  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2300328592Spooka  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2400328592Spooka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2500328592Spooka  * SUCH DAMAGE.
2600328592Spooka  */
2700328592Spooka 
28a57097d0Salnsn #include <sys/cdefs.h>
29*e0888b5dSbad #ifdef __KERNEL_RCSID
30*e0888b5dSbad __KERNEL_RCSID(0, "$NetBSD: sockin_user.c,v 1.4 2019/03/26 08:56:17 bad Exp $");
31*e0888b5dSbad #endif
32a57097d0Salnsn 
3300328592Spooka /* for struct msghdr content visibility */
3400328592Spooka #define _XOPEN_SOURCE 4
3500328592Spooka #define _XOPEN_SOURCE_EXTENDED 1
3600328592Spooka 
3700328592Spooka #ifndef _KERNEL
3800328592Spooka #include <sys/types.h>
3900328592Spooka #include <sys/socket.h>
4000328592Spooka 
4100328592Spooka #include <errno.h>
4200328592Spooka #include <poll.h>
4300328592Spooka #include <stdlib.h>
4400328592Spooka #include <string.h>
4500328592Spooka #include <stdint.h>
4600328592Spooka 
4700328592Spooka #include <rump/rumpuser_component.h>
4800328592Spooka #include <rump/rumpdefs.h>
4900328592Spooka 
5000328592Spooka #include "sockin_user.h"
5100328592Spooka 
5200328592Spooka #define seterror(_v_) if ((_v_) == -1) rv = errno; else rv = 0;
5300328592Spooka 
5400328592Spooka #ifndef __arraycount
5500328592Spooka #define __arraycount(a) (sizeof(a) / sizeof(*a))
5600328592Spooka #endif
5700328592Spooka 
5800328592Spooka #ifndef __UNCONST
5900328592Spooka #define __UNCONST(a) ((void*)(const void*)a)
6000328592Spooka #endif
6100328592Spooka 
6200328592Spooka #include <netinet/in.h>
6300328592Spooka #include <netinet/tcp.h>
6400328592Spooka #include <netinet/udp.h>
6500328592Spooka 
6600328592Spooka 
6700328592Spooka static int translate_so_sockopt(int);
6800328592Spooka static int translate_ip_sockopt(int);
6900328592Spooka static int translate_tcp_sockopt(int);
7000328592Spooka static int translate_domain(int);
7100328592Spooka 
7200328592Spooka #define translate(_a_) case RUMP_##_a_: return _a_
7300328592Spooka static int
translate_so_sockopt(int lopt)7400328592Spooka translate_so_sockopt(int lopt)
7500328592Spooka {
7600328592Spooka 
7700328592Spooka 	switch (lopt) {
7800328592Spooka 	translate(SO_DEBUG);
7900328592Spooka #ifndef SO_REUSEPORT
8000328592Spooka 	case RUMP_SO_REUSEPORT: return SO_REUSEADDR;
8100328592Spooka #else
8200328592Spooka 	translate(SO_REUSEPORT);
8300328592Spooka #endif
8400328592Spooka 	translate(SO_TYPE);
8500328592Spooka 	translate(SO_ERROR);
8600328592Spooka 	translate(SO_DONTROUTE);
8700328592Spooka 	translate(SO_BROADCAST);
8800328592Spooka 	translate(SO_SNDBUF);
8900328592Spooka 	translate(SO_RCVBUF);
9000328592Spooka 	translate(SO_KEEPALIVE);
9100328592Spooka 	translate(SO_OOBINLINE);
9200328592Spooka 	translate(SO_LINGER);
9300328592Spooka 	default: return -1;
9400328592Spooka 	}
9500328592Spooka }
9600328592Spooka 
9700328592Spooka static int
translate_ip_sockopt(int lopt)9800328592Spooka translate_ip_sockopt(int lopt)
9900328592Spooka {
10000328592Spooka 
10100328592Spooka 	switch (lopt) {
10200328592Spooka 	translate(IP_TOS);
10300328592Spooka 	translate(IP_TTL);
10400328592Spooka 	translate(IP_HDRINCL);
10500328592Spooka 	translate(IP_MULTICAST_TTL);
10600328592Spooka 	translate(IP_MULTICAST_LOOP);
10700328592Spooka 	translate(IP_MULTICAST_IF);
10800328592Spooka 	translate(IP_ADD_MEMBERSHIP);
10900328592Spooka 	translate(IP_DROP_MEMBERSHIP);
11000328592Spooka 	default: return -1;
11100328592Spooka 	}
11200328592Spooka }
11300328592Spooka 
11400328592Spooka static int
translate_tcp_sockopt(int lopt)11500328592Spooka translate_tcp_sockopt(int lopt)
11600328592Spooka {
11700328592Spooka 
11800328592Spooka 	switch (lopt) {
11900328592Spooka 	translate(TCP_NODELAY);
12000328592Spooka 	translate(TCP_MAXSEG);
12100328592Spooka 	default: return -1;
12200328592Spooka 	}
12300328592Spooka }
12400328592Spooka 
12500328592Spooka static int
translate_domain(int domain)12600328592Spooka translate_domain(int domain)
12700328592Spooka {
12800328592Spooka 
12900328592Spooka 	switch (domain) {
13000328592Spooka 	translate(AF_INET);
13100328592Spooka 	translate(AF_INET6);
13200328592Spooka 	default: return AF_UNSPEC;
13300328592Spooka 	}
13400328592Spooka }
13500328592Spooka 
13600328592Spooka #undef translate
13700328592Spooka 
13800328592Spooka static void
translate_sockopt(int * levelp,int * namep)13900328592Spooka translate_sockopt(int *levelp, int *namep)
14000328592Spooka {
14100328592Spooka 	int level, name;
14200328592Spooka 
14300328592Spooka 	level = *levelp;
14400328592Spooka 	name = *namep;
14500328592Spooka 
14600328592Spooka 	switch (level) {
14700328592Spooka 	case RUMP_SOL_SOCKET:
14800328592Spooka 		level = SOL_SOCKET;
14900328592Spooka 		name = translate_so_sockopt(name);
15000328592Spooka 		break;
15100328592Spooka 	case RUMP_IPPROTO_IP:
15200328592Spooka #ifdef SOL_IP
15300328592Spooka 		level = SOL_IP;
15400328592Spooka #else
15500328592Spooka 		level = IPPROTO_IP;
15600328592Spooka #endif
15700328592Spooka 		name = translate_ip_sockopt(name);
15800328592Spooka 		break;
15900328592Spooka 	case RUMP_IPPROTO_TCP:
16000328592Spooka #ifdef SOL_TCP
16100328592Spooka 		level = SOL_TCP;
16200328592Spooka #else
16300328592Spooka 		level = IPPROTO_TCP;
16400328592Spooka #endif
16500328592Spooka 		name = translate_tcp_sockopt(name);
16600328592Spooka 		break;
16700328592Spooka 	case RUMP_IPPROTO_UDP:
16800328592Spooka #ifdef SOL_UDP
16900328592Spooka 		level = SOL_UDP;
17000328592Spooka #else
17100328592Spooka 		level = IPPROTO_UDP;
17200328592Spooka #endif
17300328592Spooka 		name = -1;
17400328592Spooka 		break;
17500328592Spooka 	default:
17600328592Spooka 		level = -1;
17700328592Spooka 	}
17800328592Spooka 	*levelp = level;
17900328592Spooka 	*namep = name;
18000328592Spooka }
18100328592Spooka 
18200328592Spooka #ifndef __NetBSD__
18300328592Spooka static const struct {
18400328592Spooka 	int bfl;
18500328592Spooka 	int lfl;
18600328592Spooka } bsd_to_native_msg_flags_[] = {
18700328592Spooka 	{RUMP_MSG_OOB,		MSG_OOB},
18800328592Spooka 	{RUMP_MSG_PEEK,		MSG_PEEK},
18900328592Spooka 	{RUMP_MSG_DONTROUTE,	MSG_DONTROUTE},
19000328592Spooka 	{RUMP_MSG_EOR,		MSG_EOR},
19100328592Spooka 	{RUMP_MSG_TRUNC,	MSG_TRUNC},
19200328592Spooka 	{RUMP_MSG_CTRUNC,	MSG_CTRUNC},
19300328592Spooka 	{RUMP_MSG_WAITALL,	MSG_WAITALL},
19400328592Spooka 	{RUMP_MSG_DONTWAIT,	MSG_DONTWAIT},
19500328592Spooka 
19600328592Spooka 	/* might be better to always set NOSIGNAL ... */
19700328592Spooka #ifdef MSG_NOSIGNAL
19800328592Spooka 	{RUMP_MSG_NOSIGNAL,	MSG_NOSIGNAL},
19900328592Spooka #endif
20000328592Spooka };
20100328592Spooka 
20200328592Spooka static int native_to_bsd_msg_flags(int);
20300328592Spooka 
20400328592Spooka static int
native_to_bsd_msg_flags(int lflag)20500328592Spooka native_to_bsd_msg_flags(int lflag)
20600328592Spooka {
20700328592Spooka 	unsigned int i;
20800328592Spooka 	int bfl, lfl;
20900328592Spooka 	int bflag = 0;
21000328592Spooka 
21100328592Spooka 	if (lflag == 0)
21200328592Spooka 		return (0);
21300328592Spooka 
21400328592Spooka 	for(i = 0; i < __arraycount(bsd_to_native_msg_flags_); i++) {
21500328592Spooka 		bfl = bsd_to_native_msg_flags_[i].bfl;
21600328592Spooka 		lfl = bsd_to_native_msg_flags_[i].lfl;
21700328592Spooka 
21800328592Spooka 		if (lflag & lfl) {
21900328592Spooka 			lflag ^= lfl;
22000328592Spooka 			bflag |= bfl;
22100328592Spooka 		}
22200328592Spooka 	}
22300328592Spooka 	if (lflag != 0)
22400328592Spooka 		return (-1);
22500328592Spooka 
22600328592Spooka 	return (bflag);
22700328592Spooka }
22800328592Spooka 
22900328592Spooka static int
bsd_to_native_msg_flags(int bflag)23000328592Spooka bsd_to_native_msg_flags(int bflag)
23100328592Spooka {
23200328592Spooka 	unsigned int i;
23300328592Spooka 	int lflag = 0;
23400328592Spooka 
23500328592Spooka 	if (bflag == 0)
23600328592Spooka 		return (0);
23700328592Spooka 
23800328592Spooka 	for(i = 0; i < __arraycount(bsd_to_native_msg_flags_); i++) {
23900328592Spooka 		if (bflag & bsd_to_native_msg_flags_[i].bfl)
24000328592Spooka 			lflag |= bsd_to_native_msg_flags_[i].lfl;
24100328592Spooka 	}
24200328592Spooka 
24300328592Spooka 	return (lflag);
24400328592Spooka }
24500328592Spooka #endif
24600328592Spooka 
24700328592Spooka struct rump_sockaddr {
24800328592Spooka 	uint8_t	sa_len;	    /* total length */
24900328592Spooka 	uint8_t	sa_family;	/* address family */
25000328592Spooka 	char	sa_data[14];	/* actually longer; address value */
25100328592Spooka };
25200328592Spooka 
25300328592Spooka struct rump_msghdr {
25400328592Spooka 	void		*msg_name;	/* optional address */
25500328592Spooka 	uint32_t	msg_namelen;	/* size of address */
25600328592Spooka 	struct iovec	*msg_iov;	/* scatter/gather array */
25700328592Spooka 	int		msg_iovlen;	/* # elements in msg_iov */
25800328592Spooka 	void		*msg_control;	/* ancillary data, see below */
25900328592Spooka 	uint32_t	msg_controllen;	/* ancillary data buffer len */
26000328592Spooka 	int		msg_flags;	/* flags on received message */
26100328592Spooka };
26200328592Spooka 
26300328592Spooka static struct sockaddr *translate_sockaddr(const struct sockaddr *,
26400328592Spooka 		uint32_t);
26500328592Spooka static void translate_sockaddr_back(const struct sockaddr *,
26600328592Spooka 		struct rump_sockaddr *, uint32_t len);
26700328592Spooka static struct msghdr *translate_msghdr(const struct rump_msghdr *, int *);
26800328592Spooka static void translate_msghdr_back(const struct msghdr *, struct rump_msghdr *);
26900328592Spooka 
27000328592Spooka #if defined(__NetBSD__)
27100328592Spooka static struct sockaddr *
translate_sockaddr(const struct sockaddr * addr,uint32_t len)27200328592Spooka translate_sockaddr(const struct sockaddr *addr, uint32_t len)
27300328592Spooka {
27400328592Spooka 
27500328592Spooka 	return (struct sockaddr *)__UNCONST(addr);
27600328592Spooka }
27700328592Spooka 
27800328592Spooka static void
translate_sockaddr_back(const struct sockaddr * laddr,struct rump_sockaddr * baddr,uint32_t len)27900328592Spooka translate_sockaddr_back(const struct sockaddr *laddr,
28000328592Spooka 		struct rump_sockaddr *baddr, uint32_t len)
28100328592Spooka {
28200328592Spooka 
28300328592Spooka 	return;
28400328592Spooka }
28500328592Spooka 
28600328592Spooka static struct msghdr *
translate_msghdr(const struct rump_msghdr * bmsg,int * flags)28700328592Spooka translate_msghdr(const struct rump_msghdr *bmsg, int *flags)
28800328592Spooka {
28900328592Spooka 
29000328592Spooka 	return (struct msghdr *)__UNCONST(bmsg);
29100328592Spooka }
29200328592Spooka 
29300328592Spooka static void
translate_msghdr_back(const struct msghdr * lmsg,struct rump_msghdr * bmsg)29400328592Spooka translate_msghdr_back(const struct msghdr *lmsg, struct rump_msghdr *bmsg)
29500328592Spooka {
29600328592Spooka 
29700328592Spooka 	return;
29800328592Spooka }
29900328592Spooka 
30000328592Spooka #else
30100328592Spooka static struct sockaddr *
translate_sockaddr(const struct sockaddr * addr,uint32_t len)30200328592Spooka translate_sockaddr(const struct sockaddr *addr, uint32_t len)
30300328592Spooka {
30400328592Spooka 	struct sockaddr *laddr;
30500328592Spooka 	const struct rump_sockaddr *baddr;
30600328592Spooka 
30700328592Spooka 	baddr = (const struct rump_sockaddr *)addr;
30800328592Spooka 	laddr = malloc(len);
30900328592Spooka 	if (laddr == NULL)
31000328592Spooka 		return NULL;
31100328592Spooka 	memcpy(laddr, baddr, len);
31200328592Spooka 	laddr->sa_family = translate_domain(baddr->sa_family);
31300328592Spooka 	/* No sa_len for Linux and SunOS */
31400328592Spooka #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__)
31500328592Spooka 	laddr->sa_len = len;
31600328592Spooka #endif
31700328592Spooka 	return laddr;
31800328592Spooka }
31900328592Spooka 
32000328592Spooka #define translate_back(_a_) case _a_: return RUMP_##_a_
32100328592Spooka static int translate_domain_back(int);
32200328592Spooka static int
translate_domain_back(int domain)32300328592Spooka translate_domain_back(int domain)
32400328592Spooka {
32500328592Spooka 
32600328592Spooka 	switch (domain) {
32700328592Spooka 	translate_back(AF_INET);
32800328592Spooka 	translate_back(AF_INET6);
32900328592Spooka 	default: return RUMP_AF_UNSPEC;
33000328592Spooka 	}
33100328592Spooka }
33200328592Spooka #undef translate_back
33300328592Spooka 
33400328592Spooka static void
translate_sockaddr_back(const struct sockaddr * laddr,struct rump_sockaddr * baddr,uint32_t len)33500328592Spooka translate_sockaddr_back(const struct sockaddr *laddr,
33600328592Spooka 		struct rump_sockaddr *baddr,
33700328592Spooka 		uint32_t len)
33800328592Spooka {
33900328592Spooka 
34000328592Spooka 	if (baddr != NULL) {
34100328592Spooka 		memcpy(baddr, laddr, len);
34200328592Spooka 		baddr->sa_family = translate_domain_back(laddr->sa_family);
34300328592Spooka 		baddr->sa_len = len;
34400328592Spooka 	}
34500328592Spooka 	free(__UNCONST(laddr));
34600328592Spooka }
34700328592Spooka 
34800328592Spooka static struct msghdr *
translate_msghdr(const struct rump_msghdr * bmsg,int * flags)34900328592Spooka translate_msghdr(const struct rump_msghdr *bmsg, int *flags)
35000328592Spooka {
35100328592Spooka 	struct msghdr *rv;
35200328592Spooka 
35300328592Spooka 	*flags = bsd_to_native_msg_flags(*flags);
35400328592Spooka 	if (*flags < 0)
35500328592Spooka 		*flags = 0;
35600328592Spooka 
35700328592Spooka 	rv = malloc(sizeof(*rv));
35800328592Spooka 	rv->msg_namelen = bmsg->msg_namelen;
35900328592Spooka 	rv->msg_iov = bmsg->msg_iov;
36000328592Spooka 	rv->msg_iovlen = bmsg->msg_iovlen;
36100328592Spooka 	rv->msg_control = bmsg->msg_control;
36200328592Spooka 	rv->msg_controllen = bmsg->msg_controllen;
36300328592Spooka 	rv->msg_flags = 0;
36400328592Spooka 
36500328592Spooka 	if (bmsg->msg_name != NULL) {
36600328592Spooka 		rv->msg_name = translate_sockaddr(bmsg->msg_name,
36700328592Spooka 				bmsg->msg_namelen);
36800328592Spooka 		if (rv->msg_name == NULL) {
36900328592Spooka 			free(rv);
37000328592Spooka 			return NULL;
37100328592Spooka 		}
37200328592Spooka 	} else
37300328592Spooka 		rv->msg_name = NULL;
37400328592Spooka 	return rv;
37500328592Spooka }
37600328592Spooka 
37700328592Spooka static void
translate_msghdr_back(const struct msghdr * lmsg,struct rump_msghdr * bmsg)37800328592Spooka translate_msghdr_back(const struct msghdr *lmsg, struct rump_msghdr *bmsg)
37900328592Spooka {
38000328592Spooka 
38100328592Spooka 	if (bmsg == NULL) {
38200328592Spooka 		if (lmsg->msg_name != NULL)
38300328592Spooka 			free(lmsg->msg_name);
38400328592Spooka 		free(__UNCONST(lmsg));
38500328592Spooka 		return;
38600328592Spooka 	}
38700328592Spooka 	bmsg->msg_namelen = lmsg->msg_namelen;
38800328592Spooka 	bmsg->msg_iov = lmsg->msg_iov;
38900328592Spooka 	bmsg->msg_iovlen = lmsg->msg_iovlen;
39000328592Spooka 	bmsg->msg_control = lmsg->msg_control;
39100328592Spooka 	bmsg->msg_controllen = lmsg->msg_controllen;
39200328592Spooka 	bmsg->msg_flags = native_to_bsd_msg_flags(lmsg->msg_flags);
39300328592Spooka 
39400328592Spooka 	if (lmsg->msg_name != NULL)
39500328592Spooka 		translate_sockaddr_back(lmsg->msg_name, bmsg->msg_name,
39600328592Spooka 				bmsg->msg_namelen);
39700328592Spooka 	else
39800328592Spooka 		bmsg->msg_name = NULL;
39900328592Spooka 
40000328592Spooka 	free(__UNCONST(lmsg));
40100328592Spooka }
40200328592Spooka #endif
40300328592Spooka 
40400328592Spooka int
rumpcomp_sockin_socket(int domain,int type,int proto,int * s)40500328592Spooka rumpcomp_sockin_socket(int domain, int type, int proto, int *s)
40600328592Spooka {
40700328592Spooka 	void *cookie;
40800328592Spooka 	int rv;
40900328592Spooka 
41000328592Spooka 	domain = translate_domain(domain);
41100328592Spooka 
41200328592Spooka 	cookie = rumpuser_component_unschedule();
41300328592Spooka 	*s = socket(domain, type, proto);
41400328592Spooka 	seterror(*s);
41500328592Spooka 	rumpuser_component_schedule(cookie);
41600328592Spooka 
41700328592Spooka 	return rumpuser_component_errtrans(rv);
41800328592Spooka }
41900328592Spooka 
42000328592Spooka int
rumpcomp_sockin_sendmsg(int s,const struct msghdr * msg,int flags,size_t * snd)42100328592Spooka rumpcomp_sockin_sendmsg(int s, const struct msghdr *msg, int flags, size_t *snd)
42200328592Spooka {
42300328592Spooka 	void *cookie;
42400328592Spooka 	ssize_t nn;
42500328592Spooka 	int rv;
42600328592Spooka 
42700328592Spooka 	msg = translate_msghdr((struct rump_msghdr *)msg, &flags);
42800328592Spooka 
42900328592Spooka 	cookie = rumpuser_component_unschedule();
43000328592Spooka 	nn = sendmsg(s, msg, flags);
43100328592Spooka 	seterror(nn);
43200328592Spooka 	*snd = (size_t)nn;
43300328592Spooka 	rumpuser_component_schedule(cookie);
43400328592Spooka 
43500328592Spooka 	translate_msghdr_back(msg, NULL);
43600328592Spooka 
43700328592Spooka 	return rumpuser_component_errtrans(rv);
43800328592Spooka }
43900328592Spooka 
44000328592Spooka int
rumpcomp_sockin_recvmsg(int s,struct msghdr * msg,int flags,size_t * rcv)44100328592Spooka rumpcomp_sockin_recvmsg(int s, struct msghdr *msg, int flags, size_t *rcv)
44200328592Spooka {
44300328592Spooka 	void *cookie;
44400328592Spooka 	ssize_t nn;
44500328592Spooka 	int rv;
44600328592Spooka 	struct rump_msghdr *saveptr;
44700328592Spooka 
44800328592Spooka 	saveptr = (struct rump_msghdr *)msg;
44900328592Spooka 	msg = translate_msghdr(saveptr, &flags);
45000328592Spooka 
45100328592Spooka 	cookie = rumpuser_component_unschedule();
45200328592Spooka 	nn = recvmsg(s, msg, flags);
45300328592Spooka 	seterror(nn);
45400328592Spooka 	*rcv = (size_t)nn;
45500328592Spooka 	rumpuser_component_schedule(cookie);
45600328592Spooka 
45700328592Spooka 	translate_msghdr_back(msg, saveptr);
45800328592Spooka 
45900328592Spooka 	return rumpuser_component_errtrans(rv);
46000328592Spooka }
46100328592Spooka 
46200328592Spooka int
rumpcomp_sockin_connect(int s,const struct sockaddr * name,int len)46300328592Spooka rumpcomp_sockin_connect(int s, const struct sockaddr *name, int len)
46400328592Spooka {
46500328592Spooka 	void *cookie;
46600328592Spooka 	int rv;
46700328592Spooka 
46800328592Spooka 	name = translate_sockaddr(name, len);
46900328592Spooka 
47000328592Spooka 	cookie = rumpuser_component_unschedule();
47100328592Spooka 	rv = connect(s, name, (socklen_t)len);
47200328592Spooka 	seterror(rv);
47300328592Spooka 	rumpuser_component_schedule(cookie);
47400328592Spooka 
47500328592Spooka 	translate_sockaddr_back(name, NULL, len);
47600328592Spooka 
47700328592Spooka 	return rumpuser_component_errtrans(rv);
47800328592Spooka }
47900328592Spooka 
48000328592Spooka int
rumpcomp_sockin_bind(int s,const struct sockaddr * name,int len)48100328592Spooka rumpcomp_sockin_bind(int s, const struct sockaddr *name, int len)
48200328592Spooka {
48300328592Spooka 	void *cookie;
48400328592Spooka 	int rv;
48500328592Spooka 
48600328592Spooka 	name = translate_sockaddr(name, len);
48700328592Spooka 
48800328592Spooka 	cookie = rumpuser_component_unschedule();
48900328592Spooka 	rv = bind(s, name, (socklen_t)len);
49000328592Spooka 	seterror(rv);
49100328592Spooka 	rumpuser_component_schedule(cookie);
49200328592Spooka 
49300328592Spooka 	translate_sockaddr_back(name, NULL, len);
49400328592Spooka 
49500328592Spooka 	return rumpuser_component_errtrans(rv);
49600328592Spooka }
49700328592Spooka 
49800328592Spooka int
rumpcomp_sockin_accept(int s,struct sockaddr * name,int * lenp,int * s2)49900328592Spooka rumpcomp_sockin_accept(int s, struct sockaddr *name, int *lenp, int *s2)
50000328592Spooka {
50100328592Spooka 	void *cookie;
50200328592Spooka 	int rv;
50300328592Spooka 	struct rump_sockaddr *saveptr;
50400328592Spooka 
50500328592Spooka 	saveptr = (struct rump_sockaddr *)name;
50600328592Spooka 	name = translate_sockaddr(name, *lenp);
50700328592Spooka 
50800328592Spooka 	cookie = rumpuser_component_unschedule();
50900328592Spooka 	*s2 = accept(s, name, (socklen_t *)lenp);
51000328592Spooka 	seterror(*s2);
51100328592Spooka 	rumpuser_component_schedule(cookie);
51200328592Spooka 
51300328592Spooka 	translate_sockaddr_back(name, saveptr, *lenp);
51400328592Spooka 
51500328592Spooka 	return rumpuser_component_errtrans(rv);
51600328592Spooka }
51700328592Spooka 
51800328592Spooka int
rumpcomp_sockin_listen(int s,int backlog)51900328592Spooka rumpcomp_sockin_listen(int s, int backlog)
52000328592Spooka {
52100328592Spooka 	void *cookie;
52200328592Spooka 	int rv;
52300328592Spooka 
52400328592Spooka 	cookie = rumpuser_component_unschedule();
52500328592Spooka 	rv = listen(s, backlog);
52600328592Spooka 	seterror(rv);
52700328592Spooka 	rumpuser_component_schedule(cookie);
52800328592Spooka 
52900328592Spooka 	return rumpuser_component_errtrans(rv);
53000328592Spooka }
53100328592Spooka 
53200328592Spooka int
rumpcomp_sockin_getname(int s,struct sockaddr * so,int * lenp,enum rumpcomp_sockin_getnametype which)53300328592Spooka rumpcomp_sockin_getname(int s, struct sockaddr *so, int *lenp,
53400328592Spooka 	enum rumpcomp_sockin_getnametype which)
53500328592Spooka {
53600328592Spooka 	socklen_t slen = *lenp;
53700328592Spooka 	int rv;
53800328592Spooka 	struct rump_sockaddr *saveptr;
53900328592Spooka 
54000328592Spooka 	saveptr = (struct rump_sockaddr *)so;
54100328592Spooka 	so = translate_sockaddr(so, *lenp);
54200328592Spooka 
54300328592Spooka 	if (which == RUMPCOMP_SOCKIN_SOCKNAME)
54400328592Spooka 		rv = getsockname(s, so, &slen);
54500328592Spooka 	else
54600328592Spooka 		rv = getpeername(s, so, &slen);
54700328592Spooka 
54800328592Spooka 	seterror(rv);
54900328592Spooka 	translate_sockaddr_back(so, saveptr, *lenp);
55000328592Spooka 
55100328592Spooka 	*lenp = slen;
55200328592Spooka 
55300328592Spooka 	return rumpuser_component_errtrans(rv);
55400328592Spooka }
55500328592Spooka 
55600328592Spooka int
rumpcomp_sockin_setsockopt(int s,int level,int name,const void * data,int dlen)55700328592Spooka rumpcomp_sockin_setsockopt(int s, int level, int name,
55800328592Spooka 	const void *data, int dlen)
55900328592Spooka {
56000328592Spooka 	socklen_t slen = dlen;
56100328592Spooka 	int rv;
56200328592Spooka 
56300328592Spooka 	translate_sockopt(&level, &name);
56400328592Spooka 	if (level == -1 || name == -1) {
56500328592Spooka #ifdef SETSOCKOPT_STRICT
56600328592Spooka 		errno = EINVAL;
56700328592Spooka 		rv = -1;
56800328592Spooka #else
56900328592Spooka 		rv = 0;
57000328592Spooka #endif
57100328592Spooka 	} else
57200328592Spooka 		rv = setsockopt(s, level, name, data, slen);
57300328592Spooka 
57400328592Spooka 	seterror(rv);
57500328592Spooka 
57600328592Spooka 	return rumpuser_component_errtrans(rv);
57700328592Spooka }
57800328592Spooka 
57900328592Spooka int
rumpcomp_sockin_poll(struct pollfd * fds,int nfds,int timeout,int * nready)58000328592Spooka rumpcomp_sockin_poll(struct pollfd *fds, int nfds, int timeout, int *nready)
58100328592Spooka {
58200328592Spooka 	void *cookie;
58300328592Spooka 	int rv;
58400328592Spooka 
58500328592Spooka 	cookie = rumpuser_component_unschedule();
58600328592Spooka 	*nready = poll(fds, (nfds_t)nfds, timeout);
58700328592Spooka 	seterror(*nready);
58800328592Spooka 	rumpuser_component_schedule(cookie);
58900328592Spooka 
59000328592Spooka 	return rumpuser_component_errtrans(rv);
59100328592Spooka }
59200328592Spooka #endif
593