From 2a4e5e0f615cb6d686bd5bcdca6c165cf0bf4186 Mon Sep 17 00:00:00 2001 From: ozaki-r Date: Thu, 6 Aug 2015 14:45:54 +0000 Subject: [PATCH] Introduce rump.ping6 We use ping6 frequently in ATF tests so let's have rump-ified one. --- distrib/sets/lists/base/mi | 3 +- distrib/sets/lists/debug/mi | 3 +- sbin/ping6/Makefile | 28 +++++++---- sbin/ping6/ping6.c | 94 ++++++++++++++++++++----------------- sbin/ping6/ping6_hostops.c | 55 ++++++++++++++++++++++ sbin/ping6/ping6_rumpops.c | 60 +++++++++++++++++++++++ sbin/ping6/prog_ops.h | 86 +++++++++++++++++++++++++++++++++ 7 files changed, 273 insertions(+), 56 deletions(-) create mode 100644 sbin/ping6/ping6_hostops.c create mode 100644 sbin/ping6/ping6_rumpops.c create mode 100644 sbin/ping6/prog_ops.h diff --git a/distrib/sets/lists/base/mi b/distrib/sets/lists/base/mi index 5959419cc33f..749f0dc24151 100644 --- a/distrib/sets/lists/base/mi +++ b/distrib/sets/lists/base/mi @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1107 2015/08/03 09:51:40 ozaki-r Exp $ +# $NetBSD: mi,v 1.1108 2015/08/06 14:45:54 ozaki-r Exp $ # # Note: Don't delete entries from here - mark them as "obsolete" instead, # unless otherwise stated below. @@ -549,6 +549,7 @@ ./sbin/rump.modstat base-sysutil-root rump ./sbin/rump.modunload base-sysutil-root rump ./sbin/rump.ping base-netutil-root rump +./sbin/rump.ping6 base-netutil-root inet6,rump ./sbin/rump.raidctl base-sysutil-root rump ./sbin/rump.route base-netutil-root rump ./sbin/rump.sysctl base-sysutil-root rump diff --git a/distrib/sets/lists/debug/mi b/distrib/sets/lists/debug/mi index 8f788c0918d8..42eaed6f31a8 100644 --- a/distrib/sets/lists/debug/mi +++ b/distrib/sets/lists/debug/mi @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.123 2015/08/03 09:51:40 ozaki-r Exp $ +# $NetBSD: mi,v 1.124 2015/08/06 14:45:54 ozaki-r Exp $ ./etc/mtree/set.debug comp-sys-root ./usr/lib comp-sys-usr compatdir @@ -396,6 +396,7 @@ ./usr/libdata/debug/sbin/rump.modstat.debug comp-sysutil-debug debug,rump ./usr/libdata/debug/sbin/rump.modunload.debug comp-sysutil-debug debug,rump ./usr/libdata/debug/sbin/rump.ping.debug comp-netutil-debug debug,rump +./usr/libdata/debug/sbin/rump.ping6.debug comp-netutil-debug inet6,debug,rump ./usr/libdata/debug/sbin/rump.raidctl.debug comp-sysutil-debug debug,rump ./usr/libdata/debug/sbin/rump.route.debug comp-netutil-debug debug,rump ./usr/libdata/debug/sbin/rump.sysctl.debug comp-sysutil-debug debug,rump diff --git a/sbin/ping6/Makefile b/sbin/ping6/Makefile index 394953c3bdce..894c80c153f4 100644 --- a/sbin/ping6/Makefile +++ b/sbin/ping6/Makefile @@ -1,16 +1,24 @@ -# $NetBSD: Makefile,v 1.14 2011/08/14 12:09:35 christos Exp $ +# $NetBSD: Makefile,v 1.15 2015/08/06 14:45:54 ozaki-r Exp $ -USE_FORT?= yes # setuid -PROG= ping6 -MAN= ping6.8 +.include -BINOWN= root -BINMODE=4555 +USE_FORT?= yes # setuid +RUMPPRG= ping6 +MAN= ping6.8 -CPPFLAGS+=-DINET6 -CPPFLAGS+=-DIPSEC +BINOWN= root +BINMODE= 4555 -LDADD+= -lipsec -lm -DPADD+= ${LIBIPSEC} ${LIBM} +CPPFLAGS+= -DINET6 +CPPFLAGS+= -DIPSEC + +LDADD+= -lipsec -lm +DPADD+= ${LIBIPSEC} ${LIBM} + +.PATH: ${.CURDIR}/../../lib/libc/net +RUMPSRCS= getnameinfo.c +.if (${MKRUMP} != "no") +CPPFLAGS+= -DRUMP_ACTION +.endif .include diff --git a/sbin/ping6/ping6.c b/sbin/ping6/ping6.c index b28d3b16a9c6..2f3be91df450 100644 --- a/sbin/ping6/ping6.c +++ b/sbin/ping6/ping6.c @@ -1,4 +1,4 @@ -/* $NetBSD: ping6.c,v 1.87 2015/05/15 08:02:39 kefren Exp $ */ +/* $NetBSD: ping6.c,v 1.88 2015/08/06 14:45:54 ozaki-r Exp $ */ /* $KAME: ping6.c,v 1.164 2002/11/16 14:05:37 itojun Exp $ */ /* @@ -77,7 +77,7 @@ static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93"; #else #include #ifndef lint -__RCSID("$NetBSD: ping6.c,v 1.87 2015/05/15 08:02:39 kefren Exp $"); +__RCSID("$NetBSD: ping6.c,v 1.88 2015/08/06 14:45:54 ozaki-r Exp $"); #endif #endif @@ -139,6 +139,8 @@ __RCSID("$NetBSD: ping6.c,v 1.87 2015/05/15 08:02:39 kefren Exp $"); #include +#include "prog_ops.h" + struct tv32 { u_int32_t tv32_sec; u_int32_t tv32_usec; @@ -332,6 +334,10 @@ main(int argc, char *argv[]) #define ADDOPTS "AE" #endif /*IPSEC_POLICY_IPSEC*/ #endif + + if (prog_init && prog_init() == -1) + err(EXIT_FAILURE, "init failed"); + while ((ch = getopt(argc, argv, "a:b:c:dfHg:h:I:i:l:mnNop:qRS:s:tvwWx:X:" ADDOPTS)) != -1) { #undef ADDOPTS @@ -403,7 +409,7 @@ main(int argc, char *argv[]) options |= F_SO_DEBUG; break; case 'f': - if (getuid()) { + if (prog_getuid()) { errno = EPERM; errx(1, "Must be superuser to flood ping"); } @@ -435,7 +441,7 @@ main(int argc, char *argv[]) intval = strtod(optarg, &e); if (*optarg == '\0' || *e != '\0') errx(1, "illegal timing interval %s", optarg); - if (intval < 1 && getuid()) { + if (intval < 1 && prog_getuid()) { errx(1, "%s: only root may use interval < 1s", strerror(EPERM)); } @@ -452,7 +458,7 @@ main(int argc, char *argv[]) options |= F_INTERVAL; break; case 'l': - if (getuid()) { + if (prog_getuid()) { errno = EPERM; errx(1, "Must be superuser to preload"); } @@ -624,7 +630,7 @@ main(int argc, char *argv[]) (void)memcpy(&dst, res->ai_addr, res->ai_addrlen); - if ((s = socket(res->ai_family, res->ai_socktype, + if ((s = prog_socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) err(1, "socket"); @@ -652,7 +658,7 @@ main(int argc, char *argv[]) if (gres->ai_next && (options & F_VERBOSE)) warnx("gateway resolves to multiple addresses"); - if (setsockopt(s, IPPROTO_IPV6, IPV6_NEXTHOP, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_NEXTHOP, gres->ai_addr, gres->ai_addrlen)) { err(1, "setsockopt(IPV6_NEXTHOP)"); } @@ -668,33 +674,33 @@ main(int argc, char *argv[]) int opton = 1; #ifdef IPV6_RECVHOPOPTS - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPOPTS, &opton, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPOPTS, &opton, sizeof(opton))) err(1, "setsockopt(IPV6_RECVHOPOPTS)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPOPTS, &opton, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_HOPOPTS, &opton, sizeof(opton))) err(1, "setsockopt(IPV6_HOPOPTS)"); #endif #ifdef IPV6_RECVDSTOPTS - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVDSTOPTS, &opton, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RECVDSTOPTS, &opton, sizeof(opton))) err(1, "setsockopt(IPV6_RECVDSTOPTS)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_DSTOPTS, &opton, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_DSTOPTS, &opton, sizeof(opton))) err(1, "setsockopt(IPV6_DSTOPTS)"); #endif #ifdef IPV6_RECVRTHDRDSTOPTS - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDRDSTOPTS, &opton, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDRDSTOPTS, &opton, sizeof(opton))) err(1, "setsockopt(IPV6_RECVRTHDRDSTOPTS)"); #endif } /* revoke root privilege */ - seteuid(getuid()); - setuid(getuid()); + prog_seteuid(prog_getuid()); + prog_setuid(prog_getuid()); if ((options & F_FLOOD) && (options & F_INTERVAL)) errx(1, "-f and -i incompatible options"); @@ -733,25 +739,25 @@ main(int argc, char *argv[]) hold = 1; if (options & F_SO_DEBUG) - (void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&hold, + (void)prog_setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&hold, sizeof(hold)); optval = IPV6_DEFHLIM; if (IN6_IS_ADDR_MULTICAST(&dst.sin6_addr)) - if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &optval, sizeof(optval)) == -1) err(1, "IPV6_MULTICAST_HOPS"); #ifdef IPV6_USE_MIN_MTU if (mflag != 1) { optval = mflag > 1 ? 0 : 1; - if (setsockopt(s, IPPROTO_IPV6, IPV6_USE_MIN_MTU, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_USE_MIN_MTU, &optval, sizeof(optval)) == -1) err(1, "setsockopt(IPV6_USE_MIN_MTU)"); } #ifdef IPV6_RECVPATHMTU else { optval = 1; - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVPATHMTU, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RECVPATHMTU, &optval, sizeof(optval)) == -1) err(1, "setsockopt(IPV6_RECVPATHMTU)"); } @@ -770,18 +776,18 @@ main(int argc, char *argv[]) if (options & F_AUTHHDR) { optval = IPSEC_LEVEL_REQUIRE; #ifdef IPV6_AUTH_TRANS_LEVEL - if (setsockopt(s, IPPROTO_IPV6, IPV6_AUTH_TRANS_LEVEL, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_AUTH_TRANS_LEVEL, &optval, sizeof(optval)) == -1) err(1, "setsockopt(IPV6_AUTH_TRANS_LEVEL)"); #else /* old def */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_AUTH_LEVEL, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_AUTH_LEVEL, &optval, sizeof(optval)) == -1) err(1, "setsockopt(IPV6_AUTH_LEVEL)"); #endif } if (options & F_ENCRYPT) { optval = IPSEC_LEVEL_REQUIRE; - if (setsockopt(s, IPPROTO_IPV6, IPV6_ESP_TRANS_LEVEL, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_ESP_TRANS_LEVEL, &optval, sizeof(optval)) == -1) err(1, "setsockopt(IPV6_ESP_TRANS_LEVEL)"); } @@ -801,7 +807,7 @@ main(int argc, char *argv[]) } else { ICMP6_FILTER_SETPASSALL(&filt); } - if (setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER, &filt, + if (prog_setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER, &filt, sizeof(filt)) < 0) err(1, "setsockopt(ICMP6_FILTER)"); } @@ -812,11 +818,11 @@ main(int argc, char *argv[]) int opton = 1; #ifdef IPV6_RECVRTHDR - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDR, &opton, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDR, &opton, sizeof(opton))) err(1, "setsockopt(IPV6_RECVRTHDR)"); #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_RTHDR, &opton, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RTHDR, &opton, sizeof(opton))) err(1, "setsockopt(IPV6_RTHDR)"); #endif @@ -825,7 +831,7 @@ main(int argc, char *argv[]) /* optval = 1; if (IN6_IS_ADDR_MULTICAST(&dst.sin6_addr)) - if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &optval, sizeof(optval)) == -1) err(1, "IPV6_MULTICAST_LOOP"); */ @@ -929,7 +935,7 @@ main(int argc, char *argv[]) int dummy; socklen_t len = sizeof(src); - if ((dummy = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) + if ((dummy = prog_socket(AF_INET6, SOCK_DGRAM, 0)) < 0) err(1, "UDP socket"); src.sin6_family = AF_INET6; @@ -938,42 +944,42 @@ main(int argc, char *argv[]) src.sin6_scope_id = dst.sin6_scope_id; if (pktinfo && - setsockopt(dummy, IPPROTO_IPV6, IPV6_PKTINFO, + prog_setsockopt(dummy, IPPROTO_IPV6, IPV6_PKTINFO, (void *)pktinfo, sizeof(*pktinfo))) err(1, "UDP setsockopt(IPV6_PKTINFO)"); if (hoplimit != -1 && - setsockopt(dummy, IPPROTO_IPV6, IPV6_UNICAST_HOPS, + prog_setsockopt(dummy, IPPROTO_IPV6, IPV6_UNICAST_HOPS, (void *)&hoplimit, sizeof(hoplimit))) err(1, "UDP setsockopt(IPV6_UNICAST_HOPS)"); if (hoplimit != -1 && - setsockopt(dummy, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, + prog_setsockopt(dummy, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (void *)&hoplimit, sizeof(hoplimit))) err(1, "UDP setsockopt(IPV6_MULTICAST_HOPS)"); if (rthdr && - setsockopt(dummy, IPPROTO_IPV6, IPV6_RTHDR, + prog_setsockopt(dummy, IPPROTO_IPV6, IPV6_RTHDR, (void *)rthdr, (rthdr->ip6r_len + 1) << 3)) err(1, "UDP setsockopt(IPV6_RTHDR)"); - if (connect(dummy, (struct sockaddr *)&src, len) < 0) + if (prog_connect(dummy, (struct sockaddr *)&src, len) < 0) err(1, "UDP connect"); - if (getsockname(dummy, (struct sockaddr *)&src, &len) < 0) + if (prog_getsockname(dummy, (struct sockaddr *)&src, &len) < 0) err(1, "getsockname"); - close(dummy); + prog_close(dummy); } #if defined(SO_SNDBUF) && defined(SO_RCVBUF) if (sockbufsize) { if (datalen > sockbufsize) warnx("you need -b to increase socket buffer size"); - if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sockbufsize, + if (prog_setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sockbufsize, sizeof(sockbufsize)) < 0) err(1, "setsockopt(SO_SNDBUF)"); - if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &sockbufsize, + if (prog_setsockopt(s, SOL_SOCKET, SO_RCVBUF, &sockbufsize, sizeof(sockbufsize)) < 0) err(1, "setsockopt(SO_RCVBUF)"); } @@ -987,7 +993,7 @@ main(int argc, char *argv[]) * to get some stuff for /etc/ethers. */ hold = 48 * 1024; - setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&hold, + prog_setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&hold, sizeof(hold)); } #endif @@ -995,21 +1001,21 @@ main(int argc, char *argv[]) optval = 1; #ifndef USE_SIN6_SCOPE_ID #ifdef IPV6_RECVPKTINFO - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &optval, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &optval, sizeof(optval)) < 0) warn("setsockopt(IPV6_RECVPKTINFO)"); /* XXX err? */ #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, &optval, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, &optval, sizeof(optval)) < 0) warn("setsockopt(IPV6_PKTINFO)"); /* XXX err? */ #endif #endif /* USE_SIN6_SCOPE_ID */ #ifdef IPV6_RECVHOPLIMIT - if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &optval, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &optval, sizeof(optval)) < 0) warn("setsockopt(IPV6_RECVHOPLIMIT)"); /* XXX err? */ #else /* old adv. API */ - if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPLIMIT, &optval, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_HOPLIMIT, &optval, sizeof(optval)) < 0) warn("setsockopt(IPV6_HOPLIMIT)"); /* XXX err? */ #endif @@ -1086,7 +1092,7 @@ main(int argc, char *argv[]) } fdmaskp[0].fd = s; fdmaskp[0].events = POLLIN; - cc = poll(fdmaskp, 1, timeout); + cc = prog_poll(fdmaskp, 1, timeout); if (cc < 0) { if (errno != EINTR) { warn("poll"); @@ -1106,7 +1112,7 @@ main(int argc, char *argv[]) m.msg_control = (caddr_t)buf; m.msg_controllen = sizeof(buf); - cc = recvmsg(s, &m, 0); + cc = prog_recvmsg(s, &m, 0); if (cc < 0) { if (errno != EINTR) { warn("recvmsg"); @@ -1309,7 +1315,7 @@ pinger(void) smsghdr.msg_iov = iov; smsghdr.msg_iovlen = 1; - i = sendmsg(s, &smsghdr, 0); + i = prog_sendmsg(s, &smsghdr, 0); if (i < 0 || i != cc) { if (i < 0) @@ -2569,7 +2575,7 @@ setpolicy(int so, char *policy) buf = ipsec_set_policy(policy, strlen(policy)); if (buf == NULL) errx(1, "%s", ipsec_strerror()); - if (setsockopt(s, IPPROTO_IPV6, IPV6_IPSEC_POLICY, buf, + if (prog_setsockopt(s, IPPROTO_IPV6, IPV6_IPSEC_POLICY, buf, ipsec_get_policylen(buf)) < 0) warnx("Unable to set IPsec policy"); free(buf); diff --git a/sbin/ping6/ping6_hostops.c b/sbin/ping6/ping6_hostops.c new file mode 100644 index 000000000000..4c1d1c25e0b8 --- /dev/null +++ b/sbin/ping6/ping6_hostops.c @@ -0,0 +1,55 @@ +/* $NetBSD: ping6_hostops.c,v 1.1 2015/08/06 14:45:54 ozaki-r Exp $ */ + +/* + * Copyright (c) 2015 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#ifndef lint +__RCSID("$NetBSD: ping6_hostops.c,v 1.1 2015/08/06 14:45:54 ozaki-r Exp $"); +#endif /* !lint */ + +#include +#include +#include + +#include +#include + +#include "prog_ops.h" + +const struct prog_ops prog_ops = { + .op_socket = socket, + .op_setsockopt = setsockopt, + .op_getsockname = getsockname, + .op_poll = poll, + .op_recvmsg = recvmsg, + .op_sendmsg = sendmsg, + .op_connect = connect, + .op_close = close, + .op_getuid = getuid, + .op_setuid = setuid, + .op_seteuid = seteuid, +}; diff --git a/sbin/ping6/ping6_rumpops.c b/sbin/ping6/ping6_rumpops.c new file mode 100644 index 000000000000..672135aef459 --- /dev/null +++ b/sbin/ping6/ping6_rumpops.c @@ -0,0 +1,60 @@ +/* $NetBSD: ping6_rumpops.c,v 1.1 2015/08/06 14:45:54 ozaki-r Exp $ */ + +/* + * Copyright (c) 2015 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#ifndef lint +__RCSID("$NetBSD: ping6_rumpops.c,v 1.1 2015/08/06 14:45:54 ozaki-r Exp $"); +#endif /* !lint */ + +#include +#include + +#include +#include + +#include +#include +#include + +#include "prog_ops.h" + +const struct prog_ops prog_ops = { + .op_init = rumpclient_init, + + .op_socket = rump_sys_socket, + .op_setsockopt= rump_sys_setsockopt, + .op_getsockname=rump_sys_getsockname, + .op_poll = rump_sys_poll, + .op_sendmsg = rump_sys_sendmsg, + .op_recvmsg = rump_sys_recvmsg, + .op_connect = rump_sys_connect, + .op_close = rump_sys_close, + .op_getuid = rump_sys_getuid, + .op_setuid = rump_sys_setuid, + .op_seteuid = rump_sys_seteuid, +}; diff --git a/sbin/ping6/prog_ops.h b/sbin/ping6/prog_ops.h new file mode 100644 index 000000000000..144e9d10bbff --- /dev/null +++ b/sbin/ping6/prog_ops.h @@ -0,0 +1,86 @@ +/* $NetBSD: prog_ops.h,v 1.1 2015/08/06 14:45:54 ozaki-r Exp $ */ + +/* + * Copyright (c) 2015 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _PROG_OPS_H_ +#define _PROG_OPS_H_ + +#include + +#ifndef CRUNCHOPS +struct prog_ops { + int (*op_init)(void); + + int (*op_socket)(int, int, int); + int (*op_setsockopt)(int, int, int, const void *, socklen_t); + int (*op_getsockname)(int, struct sockaddr * restrict, + socklen_t * restrict); + + int (*op_poll)(struct pollfd *, nfds_t, int); + + ssize_t (*op_recvmsg)(int, struct msghdr *, int); + ssize_t (*op_sendmsg)(int, const struct msghdr *, int); + + int (*op_connect)(int, const struct sockaddr *, socklen_t); + int (*op_close)(int); + + uid_t (*op_getuid)(void); + int (*op_setuid)(uid_t); + int (*op_seteuid)(uid_t); +}; +extern const struct prog_ops prog_ops; + +#define prog_init prog_ops.op_init +#define prog_socket prog_ops.op_socket +#define prog_setsockopt prog_ops.op_setsockopt +#define prog_getsockname prog_ops.op_getsockname +#define prog_shutdown prog_ops.op_shutdown +#define prog_poll prog_ops.op_poll +#define prog_recvmsg prog_ops.op_recvmsg +#define prog_sendmsg prog_ops.op_sendmsg +#define prog_connect prog_ops.op_connect +#define prog_close prog_ops.op_close +#define prog_getuid prog_ops.op_getuid +#define prog_setuid prog_ops.op_setuid +#define prog_seteuid prog_ops.op_seteuid +#else +#define prog_init ((int (*)(void))NULL) +#define prog_socket socket +#define prog_setsockopt setsockopt +#define prog_getsockname getsockname +#define prog_shutdown shutdown +#define prog_poll poll +#define prog_recvmsg recvmsg +#define prog_sendmsg sendmsg +#define prog_connect connect +#define prog_close close +#define prog_getuid getuid +#define prog_setuid setuid +#define prog_seteuid seteuid +#endif + +#endif /* _PROG_OPS_H_ */