summaryrefslogtreecommitdiffstats
path: root/contrib/netbsd-tests
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2017-02-09 11:26:48 -0200
committerRenato Botelho <renato@netgate.com>2017-02-09 11:26:48 -0200
commit4a05f5440acda223e6a0ec5157bc32ecc0f09ff9 (patch)
tree4c2ece480e5d4155ed35bec62996de40eb179f18 /contrib/netbsd-tests
parent681a482d8fc4bfc14a24f7a9d75cca6337f2a520 (diff)
parenta1e52233c91fd46e666297270ab655f1abff8535 (diff)
downloadFreeBSD-src-4a05f5440acda223e6a0ec5157bc32ecc0f09ff9.zip
FreeBSD-src-4a05f5440acda223e6a0ec5157bc32ecc0f09ff9.tar.gz
Merge remote-tracking branch 'origin/stable/10' into devel
Diffstat (limited to 'contrib/netbsd-tests')
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/check_bound.c231
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/pmap_svc.c366
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_stat.c206
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc.c232
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_4.c455
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_com.c1460
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.8127
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.c613
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.h146
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/security.c282
-rw-r--r--contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/util.c401
-rw-r--r--contrib/netbsd-tests/lib/libc/gen/t_dir.c31
-rw-r--r--contrib/netbsd-tests/lib/libc/gen/t_raise.c6
-rw-r--r--contrib/netbsd-tests/lib/libc/gen/t_setdomainname.c2
-rw-r--r--contrib/netbsd-tests/lib/libc/gen/t_sethostname.c2
-rw-r--r--contrib/netbsd-tests/lib/libc/regex/debug.c2
-rw-r--r--contrib/netbsd-tests/lib/libc/sys/t_select.c6
-rw-r--r--contrib/netbsd-tests/lib/libc/sys/t_unlink.c7
-rw-r--r--contrib/netbsd-tests/lib/libc/ttyio/t_ttyio.c8
-rw-r--r--contrib/netbsd-tests/lib/libpthread/t_condwait.c7
-rw-r--r--contrib/netbsd-tests/lib/libpthread/t_fpu.c23
21 files changed, 82 insertions, 4531 deletions
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/check_bound.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/check_bound.c
deleted file mode 100644
index 2ea7c31..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/check_bound.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/* $NetBSD: check_bound.c,v 1.1 2010/07/26 15:53:00 pooka Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)check_bound.c 1.15 93/07/05 SMI" */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)check_bound.c 1.11 89/04/21 Copyr 1989 Sun Micro";
-#endif
-#endif
-
-/*
- * check_bound.c
- * Checks to see whether the program is still bound to the
- * claimed address and returns the univeral merged address
- *
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <rpc/rpc.h>
-#include <stdio.h>
-#include <netconfig.h>
-#include <syslog.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-#include <rump/rump.h>
-#include <rump/rump_syscalls.h>
-
-#include "rpcbind.h"
-
-struct fdlist {
- int fd;
- struct netconfig *nconf;
- struct fdlist *next;
- int check_binding;
-};
-
-static struct fdlist *fdhead; /* Link list of the check fd's */
-static struct fdlist *fdtail;
-static const char emptystring[] = "";
-
-static bool_t check_bound(struct fdlist *, const char *uaddr);
-
-/*
- * Returns 1 if the given address is bound for the given addr & transport
- * For all error cases, we assume that the address is bound
- * Returns 0 for success.
- */
-static bool_t
-check_bound(struct fdlist *fdl, const char *uaddr)
-{
- int fd;
- struct netbuf *na;
- int ans;
-
- if (fdl->check_binding == FALSE)
- return (TRUE);
-
- na = uaddr2taddr(fdl->nconf, uaddr);
- if (!na)
- return (TRUE); /* punt, should never happen */
-
- fd = __rpc_nconf2fd(fdl->nconf);
- if (fd < 0) {
- free(na);
- return (TRUE);
- }
-
- ans = bind(fd, (struct sockaddr *)na->buf, na->len);
-
- rump_sys_close(fd);
- free(na);
-
- return (ans == 0 ? FALSE : TRUE);
-}
-
-int
-add_bndlist(struct netconfig *nconf, struct netbuf *baddr)
-{
- struct fdlist *fdl;
- struct netconfig *newnconf;
-
- newnconf = getnetconfigent(nconf->nc_netid);
- if (newnconf == NULL)
- return (-1);
- fdl = (struct fdlist *)malloc((u_int)sizeof (struct fdlist));
- if (fdl == NULL) {
- freenetconfigent(newnconf);
- syslog(LOG_ERR, "no memory!");
- return (-1);
- }
- fdl->nconf = newnconf;
- fdl->next = NULL;
- if (fdhead == NULL) {
- fdhead = fdl;
- fdtail = fdl;
- } else {
- fdtail->next = fdl;
- fdtail = fdl;
- }
- /* XXX no bound checking for now */
- fdl->check_binding = FALSE;
-
- return 0;
-}
-
-bool_t
-is_bound(const char *netid, const char *uaddr)
-{
- struct fdlist *fdl;
-
- for (fdl = fdhead; fdl; fdl = fdl->next)
- if (strcmp(fdl->nconf->nc_netid, netid) == 0)
- break;
- if (fdl == NULL)
- return (TRUE);
- return (check_bound(fdl, uaddr));
-}
-
-/*
- * Returns NULL if there was some system error.
- * Returns "" if the address was not bound, i.e the server crashed.
- * Returns the merged address otherwise.
- */
-char *
-mergeaddr(SVCXPRT *xprt, char *netid, char *uaddr, char *saddr)
-{
- struct fdlist *fdl;
- char *c_uaddr, *s_uaddr, *m_uaddr, *allocated_uaddr = NULL;
-
- for (fdl = fdhead; fdl; fdl = fdl->next)
- if (strcmp(fdl->nconf->nc_netid, netid) == 0)
- break;
- if (fdl == NULL)
- return (NULL);
- if (check_bound(fdl, uaddr) == FALSE)
- /* that server died */
- return strdup(emptystring);
- /*
- * If saddr is not NULL, the remote client may have included the
- * address by which it contacted us. Use that for the "client" uaddr,
- * otherwise use the info from the SVCXPRT.
- */
- if (saddr != NULL) {
- c_uaddr = saddr;
- } else {
- c_uaddr = taddr2uaddr(fdl->nconf, svc_getrpccaller(xprt));
- if (c_uaddr == NULL) {
- syslog(LOG_ERR, "taddr2uaddr failed for %s",
- fdl->nconf->nc_netid);
- return (NULL);
- }
- allocated_uaddr = c_uaddr;
- }
-
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- if (saddr == NULL) {
- fprintf(stderr, "mergeaddr: client uaddr = %s\n",
- c_uaddr);
- } else {
- fprintf(stderr, "mergeaddr: contact uaddr = %s\n",
- c_uaddr);
- }
- }
-#endif
- s_uaddr = uaddr;
- /*
- * This is all we should need for IP 4 and 6
- */
- m_uaddr = addrmerge(svc_getrpccaller(xprt), s_uaddr, c_uaddr, netid);
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "mergeaddr: uaddr = %s, merged uaddr = %s\n",
- uaddr, m_uaddr);
-#endif
- if (allocated_uaddr != NULL)
- free(allocated_uaddr);
- return (m_uaddr);
-}
-
-/*
- * Returns a netconf structure from its internal list. This
- * structure should not be freed.
- */
-struct netconfig *
-rpcbind_get_conf(const char *netid)
-{
- struct fdlist *fdl;
-
- for (fdl = fdhead; fdl; fdl = fdl->next)
- if (strcmp(fdl->nconf->nc_netid, netid) == 0)
- break;
- if (fdl == NULL)
- return (NULL);
- return (fdl->nconf);
-}
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/pmap_svc.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/pmap_svc.c
deleted file mode 100644
index 3f9eb47..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/pmap_svc.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/* $NetBSD: pmap_svc.c,v 1.2 2013/10/19 17:45:00 christos Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1984 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)pmap_svc.c 1.14 93/07/05 SMI" */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)pmap_svc.c 1.23 89/04/05 Copyr 1984 Sun Micro";
-#endif
-#endif
-
-/*
- * pmap_svc.c
- * The server procedure for the version 2 portmapper.
- * All the portmapper related interface from the portmap side.
- */
-
-#ifdef PORTMAP
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <rpc/rpc.h>
-#include <rpc/pmap_prot.h>
-#include <rpc/rpcb_prot.h>
-#ifdef RPCBIND_DEBUG
-#include <stdlib.h>
-#endif
-#include "rpcbind.h"
-
-static struct pmaplist *find_service_pmap(rpcprog_t, rpcvers_t, rpcprot_t);
-static bool_t pmapproc_change(struct svc_req *, SVCXPRT *, u_long);
-static bool_t pmapproc_getport(struct svc_req *, SVCXPRT *);
-static bool_t pmapproc_dump(struct svc_req *, SVCXPRT *);
-
-/*
- * Called for all the version 2 inquiries.
- */
-void
-pmap_service(struct svc_req *rqstp, SVCXPRT *xprt)
-{
- rpcbs_procinfo(RPCBVERS_2_STAT, rqstp->rq_proc);
- switch (rqstp->rq_proc) {
- case PMAPPROC_NULL:
- /*
- * Null proc call
- */
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "PMAPPROC_NULL\n");
-#endif
- check_access(xprt, rqstp->rq_proc, NULL, PMAPVERS);
- if ((!svc_sendreply(xprt, (xdrproc_t) xdr_void, NULL)) &&
- debugging) {
- if (doabort) {
- rpcbind_abort();
- }
- }
- break;
-
- case PMAPPROC_SET:
- /*
- * Set a program, version to port mapping
- */
- pmapproc_change(rqstp, xprt, rqstp->rq_proc);
- break;
-
- case PMAPPROC_UNSET:
- /*
- * Remove a program, version to port mapping.
- */
- pmapproc_change(rqstp, xprt, rqstp->rq_proc);
- break;
-
- case PMAPPROC_GETPORT:
- /*
- * Lookup the mapping for a program, version and return its
- * port number.
- */
- pmapproc_getport(rqstp, xprt);
- break;
-
- case PMAPPROC_DUMP:
- /*
- * Return the current set of mapped program, version
- */
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "PMAPPROC_DUMP\n");
-#endif
- pmapproc_dump(rqstp, xprt);
- break;
-
- case PMAPPROC_CALLIT:
- /*
- * Calls a procedure on the local machine. If the requested
- * procedure is not registered this procedure does not return
- * error information!!
- * This procedure is only supported on rpc/udp and calls via
- * rpc/udp. It passes null authentication parameters.
- */
- rpcbproc_callit_com(rqstp, xprt, PMAPPROC_CALLIT, PMAPVERS);
- break;
-
- default:
- svcerr_noproc(xprt);
- break;
- }
-}
-
-/*
- * returns the item with the given program, version number. If that version
- * number is not found, it returns the item with that program number, so that
- * the port number is now returned to the caller. The caller when makes a
- * call to this program, version number, the call will fail and it will
- * return with PROGVERS_MISMATCH. The user can then determine the highest
- * and the lowest version number for this program using clnt_geterr() and
- * use those program version numbers.
- */
-static struct pmaplist *
-find_service_pmap(rpcprog_t prog, rpcvers_t vers, rpcprot_t prot)
-{
- register struct pmaplist *hit = NULL;
- register struct pmaplist *pml;
-
- for (pml = list_pml; pml != NULL; pml = pml->pml_next) {
- if ((pml->pml_map.pm_prog != prog) ||
- (pml->pml_map.pm_prot != prot))
- continue;
- hit = pml;
- if (pml->pml_map.pm_vers == vers)
- break;
- }
- return (hit);
-}
-
-static bool_t
-pmapproc_change(struct svc_req *rqstp, SVCXPRT *xprt, unsigned long op)
-{
- struct pmap reg;
- RPCB rpcbreg;
- long ans;
- struct sockcred *sc;
- char uidbuf[32];
-
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "%s request for (%lu, %lu) : ",
- op == PMAPPROC_SET ? "PMAP_SET" : "PMAP_UNSET",
- reg.pm_prog, reg.pm_vers);
-#endif
-
- if (!svc_getargs(xprt, (xdrproc_t) xdr_pmap, (char *)&reg)) {
- svcerr_decode(xprt);
- return (FALSE);
- }
-
- if (!check_access(xprt, op, &reg, PMAPVERS)) {
- svcerr_weakauth(xprt);
- return FALSE;
- }
-
- (void)svc_getcaller(xprt);
- sc = __svc_getcallercreds(xprt);
-
- /*
- * Can't use getpwnam here. We might end up calling ourselves
- * and looping.
- */
- if (sc == NULL)
- rpcbreg.r_owner = __UNCONST(rpcbind_unknown);
- else if (sc->sc_uid == 0)
- rpcbreg.r_owner = __UNCONST(rpcbind_superuser);
- else {
- /* r_owner will be strdup-ed later */
- snprintf(uidbuf, sizeof uidbuf, "%d", sc->sc_uid);
- rpcbreg.r_owner = uidbuf;
- }
-
- rpcbreg.r_prog = reg.pm_prog;
- rpcbreg.r_vers = reg.pm_vers;
-
- if (op == PMAPPROC_SET) {
- char buf[32];
-
- snprintf(buf, sizeof(buf), "0.0.0.0.%d.%d",
- (int)((reg.pm_port >> 8) & 0xff),
- (int)(reg.pm_port & 0xff));
- rpcbreg.r_addr = buf;
- if (reg.pm_prot == IPPROTO_UDP) {
- rpcbreg.r_netid = __UNCONST(udptrans);
- } else if (reg.pm_prot == IPPROTO_TCP) {
- rpcbreg.r_netid = __UNCONST(tcptrans);
- } else {
- ans = FALSE;
- goto done_change;
- }
- ans = map_set(&rpcbreg, rpcbreg.r_owner);
- } else if (op == PMAPPROC_UNSET) {
- bool_t ans1, ans2;
-
- rpcbreg.r_addr = NULL;
- rpcbreg.r_netid = __UNCONST(tcptrans);
- ans1 = map_unset(&rpcbreg, rpcbreg.r_owner);
- rpcbreg.r_netid = __UNCONST(udptrans);
- ans2 = map_unset(&rpcbreg, rpcbreg.r_owner);
- ans = ans1 || ans2;
- } else {
- ans = FALSE;
- }
-done_change:
- if ((!svc_sendreply(xprt, (xdrproc_t) xdr_long, (caddr_t) &ans)) &&
- debugging) {
- fprintf(stderr, "portmap: svc_sendreply\n");
- if (doabort) {
- rpcbind_abort();
- }
- }
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "%s\n", ans == TRUE ? "succeeded" : "failed");
-#endif
- if (op == PMAPPROC_SET)
- rpcbs_set(RPCBVERS_2_STAT, ans);
- else
- rpcbs_unset(RPCBVERS_2_STAT, ans);
- return (TRUE);
-}
-
-/* ARGSUSED */
-static bool_t
-pmapproc_getport(struct svc_req *rqstp, SVCXPRT *xprt)
-{
- struct pmap reg;
- long lport;
- int port = 0;
- struct pmaplist *fnd;
-#ifdef RPCBIND_DEBUG
- char *uaddr;
-#endif
-
- if (!svc_getargs(xprt, (xdrproc_t) xdr_pmap, (char *)&reg)) {
- svcerr_decode(xprt);
- return (FALSE);
- }
-
- if (!check_access(xprt, PMAPPROC_GETPORT, &reg, PMAPVERS)) {
- svcerr_weakauth(xprt);
- return FALSE;
- }
-
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- uaddr = taddr2uaddr(rpcbind_get_conf(xprt->xp_netid),
- svc_getrpccaller(xprt));
- fprintf(stderr, "PMAP_GETPORT req for (%lu, %lu, %s) from %s :",
- reg.pm_prog, reg.pm_vers,
- reg.pm_prot == IPPROTO_UDP ? "udp" : "tcp", uaddr);
- free(uaddr);
- }
-#endif
- fnd = find_service_pmap(reg.pm_prog, reg.pm_vers, reg.pm_prot);
- if (fnd) {
- char serveuaddr[32];
- int h1, h2, h3, h4, p1, p2;
- const char *netid, *ua;
-
- if (reg.pm_prot == IPPROTO_UDP) {
- ua = udp_uaddr;
- netid = udptrans;
- } else {
- ua = tcp_uaddr; /* To get the len */
- netid = tcptrans;
- }
- if (ua == NULL) {
- goto sendreply;
- }
- if (sscanf(ua, "%d.%d.%d.%d.%d.%d", &h1, &h2, &h3,
- &h4, &p1, &p2) == 6) {
- p1 = (fnd->pml_map.pm_port >> 8) & 0xff;
- p2 = (fnd->pml_map.pm_port) & 0xff;
- snprintf(serveuaddr, sizeof(serveuaddr),
- "%d.%d.%d.%d.%d.%d", h1, h2, h3, h4, p1, p2);
- if (is_bound(netid, serveuaddr)) {
- port = fnd->pml_map.pm_port;
- } else { /* this service is dead; delete it */
- delete_prog(reg.pm_prog);
- }
- }
- }
-sendreply:
- lport = port;
- if ((!svc_sendreply(xprt, (xdrproc_t) xdr_long, (caddr_t)&lport)) &&
- debugging) {
- (void) fprintf(stderr, "portmap: svc_sendreply\n");
- if (doabort) {
- rpcbind_abort();
- }
- }
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "port = %d\n", port);
-#endif
- rpcbs_getaddr(RPCBVERS_2_STAT, reg.pm_prog, reg.pm_vers,
- reg.pm_prot == IPPROTO_UDP ? udptrans : tcptrans,
- port ? udptrans : "");
-
- return (TRUE);
-}
-
-/* ARGSUSED */
-static bool_t
-pmapproc_dump(struct svc_req *rqstp, SVCXPRT *xprt)
-{
- if (!svc_getargs(xprt, (xdrproc_t)xdr_void, NULL)) {
- svcerr_decode(xprt);
- return (FALSE);
- }
-
- if (!check_access(xprt, PMAPPROC_DUMP, NULL, PMAPVERS)) {
- svcerr_weakauth(xprt);
- return FALSE;
- }
-
- if ((!svc_sendreply(xprt, (xdrproc_t) xdr_pmaplist_ptr,
- (caddr_t)&list_pml)) && debugging) {
- if (debugging)
- (void) fprintf(stderr, "portmap: svc_sendreply\n");
- if (doabort) {
- rpcbind_abort();
- }
- }
- return (TRUE);
-}
-
-#endif /* PORTMAP */
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_stat.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_stat.c
deleted file mode 100644
index 5bc5a0f..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_stat.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* $NetBSD: rpcb_stat.c,v 1.1 2010/07/26 15:53:00 pooka Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/* #pragma ident "@(#)rpcb_stat.c 1.7 94/04/25 SMI" */
-
-/*
- * rpcb_stat.c
- * Allows for gathering of statistics
- *
- * Copyright (c) 1990 by Sun Microsystems, Inc.
- */
-
-#include <stdio.h>
-#include <netconfig.h>
-#include <rpc/rpc.h>
-#include <rpc/rpcb_prot.h>
-#include <sys/stat.h>
-#ifdef PORTMAP
-#include <rpc/pmap_prot.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include "rpcbind.h"
-
-static rpcb_stat_byvers inf;
-
-void
-rpcbs_init(void)
-{
-
-}
-
-void
-rpcbs_procinfo(rpcvers_t rtype, rpcproc_t proc)
-{
- switch (rtype + 2) {
-#ifdef PORTMAP
- case PMAPVERS: /* version 2 */
- if (proc > rpcb_highproc_2)
- return;
- break;
-#endif
- case RPCBVERS: /* version 3 */
- if (proc > rpcb_highproc_3)
- return;
- break;
- case RPCBVERS4: /* version 4 */
- if (proc > rpcb_highproc_4)
- return;
- break;
- default: return;
- }
- inf[rtype].info[proc]++;
- return;
-}
-
-void
-rpcbs_set(rpcvers_t rtype, bool_t success)
-{
- if ((rtype >= RPCBVERS_STAT) || (success == FALSE))
- return;
- inf[rtype].setinfo++;
- return;
-}
-
-void
-rpcbs_unset(rpcvers_t rtype, bool_t success)
-{
- if ((rtype >= RPCBVERS_STAT) || (success == FALSE))
- return;
- inf[rtype].unsetinfo++;
- return;
-}
-
-void
-rpcbs_getaddr(rpcvers_t rtype, rpcprog_t prog, rpcvers_t vers,
- const char *netid, const char *uaddr)
-{
- rpcbs_addrlist *al;
- struct netconfig *nconf;
-
- if (rtype >= RPCBVERS_STAT)
- return;
- for (al = inf[rtype].addrinfo; al; al = al->next) {
-
- if(al->netid == NULL)
- return;
- if ((al->prog == prog) && (al->vers == vers) &&
- (strcmp(al->netid, netid) == 0)) {
- if ((uaddr == NULL) || (uaddr[0] == 0))
- al->failure++;
- else
- al->success++;
- return;
- }
- }
- nconf = rpcbind_get_conf(netid);
- if (nconf == NULL) {
- return;
- }
- al = (rpcbs_addrlist *) malloc(sizeof (rpcbs_addrlist));
- if (al == NULL) {
- return;
- }
- al->prog = prog;
- al->vers = vers;
- al->netid = nconf->nc_netid;
- if ((uaddr == NULL) || (uaddr[0] == 0)) {
- al->failure = 1;
- al->success = 0;
- } else {
- al->failure = 0;
- al->success = 1;
- }
- al->next = inf[rtype].addrinfo;
- inf[rtype].addrinfo = al;
-}
-
-void
-rpcbs_rmtcall(rpcvers_t rtype, rpcproc_t rpcbproc, rpcprog_t prog,
- rpcvers_t vers, rpcproc_t proc, char *netid, rpcblist_ptr rbl)
-{
- rpcbs_rmtcalllist *rl;
- struct netconfig *nconf;
-
- if (rtype >= RPCBVERS_STAT)
- return;
- for (rl = inf[rtype].rmtinfo; rl; rl = rl->next) {
-
- if(rl->netid == NULL)
- return;
-
- if ((rl->prog == prog) && (rl->vers == vers) &&
- (rl->proc == proc) &&
- (strcmp(rl->netid, netid) == 0)) {
- if ((rbl == NULL) ||
- (rbl->rpcb_map.r_vers != vers))
- rl->failure++;
- else
- rl->success++;
- if (rpcbproc == RPCBPROC_INDIRECT)
- rl->indirect++;
- return;
- }
- }
- nconf = rpcbind_get_conf(netid);
- if (nconf == NULL) {
- return;
- }
- rl = (rpcbs_rmtcalllist *) malloc(sizeof (rpcbs_rmtcalllist));
- if (rl == NULL) {
- return;
- }
- rl->prog = prog;
- rl->vers = vers;
- rl->proc = proc;
- rl->netid = nconf->nc_netid;
- if ((rbl == NULL) ||
- (rbl->rpcb_map.r_vers != vers)) {
- rl->failure = 1;
- rl->success = 0;
- } else {
- rl->failure = 0;
- rl->success = 1;
- }
- rl->indirect = 1;
- rl->next = inf[rtype].rmtinfo;
- inf[rtype].rmtinfo = rl;
- return;
-}
-
-/*
- */
-void *
-rpcbproc_getstat(void *arg, struct svc_req *req, SVCXPRT *xprt,
- rpcvers_t versnum)
-{
- return (void *)&inf;
-}
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc.c
deleted file mode 100644
index 16c86f6..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/* $NetBSD: rpcb_svc.c,v 1.2 2011/09/16 16:13:18 plunky Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)rpcb_svc.c 1.16 93/07/05 SMI" */
-
-/*
- * rpcb_svc.c
- * The server procedure for the version 3 rpcbind (TLI).
- *
- * It maintains a separate list of all the registered services with the
- * version 3 of rpcbind.
- */
-#include <sys/types.h>
-#include <rpc/rpc.h>
-#include <rpc/rpcb_prot.h>
-#include <netconfig.h>
-#include <syslog.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "rpcbind.h"
-
-static void *rpcbproc_getaddr_3_local(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-static void *rpcbproc_dump_3_local(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-
-/*
- * Called by svc_getreqset. There is a separate server handle for
- * every transport that it waits on.
- */
-void
-rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp)
-{
- union {
- RPCB rpcbproc_set_3_arg;
- RPCB rpcbproc_unset_3_arg;
- RPCB rpcbproc_getaddr_3_local_arg;
- struct rpcb_rmtcallargs rpcbproc_callit_3_arg;
- char *rpcbproc_uaddr2taddr_3_arg;
- struct netbuf rpcbproc_taddr2uaddr_3_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- void *(*local)(void *, struct svc_req *, SVCXPRT *, rpcvers_t);
-
- rpcbs_procinfo(RPCBVERS_3_STAT, rqstp->rq_proc);
-
- switch (rqstp->rq_proc) {
- case NULLPROC:
- /*
- * Null proc call
- */
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_NULL\n");
-#endif
- /* This call just logs, no actual checks */
- check_access(transp, rqstp->rq_proc, NULL, RPCBVERS);
- (void) svc_sendreply(transp, (xdrproc_t)xdr_void, NULL);
- return;
-
- case RPCBPROC_SET:
- xdr_argument = (xdrproc_t )xdr_rpcb;
- xdr_result = (xdrproc_t )xdr_bool;
- local = rpcbproc_set_com;
- break;
-
- case RPCBPROC_UNSET:
- xdr_argument = (xdrproc_t)xdr_rpcb;
- xdr_result = (xdrproc_t)xdr_bool;
- local = rpcbproc_unset_com;
- break;
-
- case RPCBPROC_GETADDR:
- xdr_argument = (xdrproc_t)xdr_rpcb;
- xdr_result = (xdrproc_t)xdr_wrapstring;
- local = rpcbproc_getaddr_3_local;
- break;
-
- case RPCBPROC_DUMP:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_DUMP\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_void;
- xdr_result = (xdrproc_t)xdr_rpcblist_ptr;
- local = rpcbproc_dump_3_local;
- break;
-
- case RPCBPROC_CALLIT:
- rpcbproc_callit_com(rqstp, transp, rqstp->rq_proc, RPCBVERS);
- return;
-
- case RPCBPROC_GETTIME:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_GETTIME\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_void;
- xdr_result = (xdrproc_t)xdr_u_long;
- local = rpcbproc_gettime_com;
- break;
-
- case RPCBPROC_UADDR2TADDR:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_UADDR2TADDR\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_wrapstring;
- xdr_result = (xdrproc_t)xdr_netbuf;
- local = rpcbproc_uaddr2taddr_com;
- break;
-
- case RPCBPROC_TADDR2UADDR:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_TADDR2UADDR\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_netbuf;
- xdr_result = (xdrproc_t)xdr_wrapstring;
- local = rpcbproc_taddr2uaddr_com;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
- (void) memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, (xdrproc_t) xdr_argument,
- (char *) &argument)) {
- svcerr_decode(transp);
- if (debugging)
- (void) fprintf(stderr, "rpcbind: could not decode\n");
- return;
- }
- if (!check_access(transp, rqstp->rq_proc, &argument, RPCBVERS)) {
- svcerr_weakauth(transp);
- goto done;
- }
- result = (*local)(&argument, rqstp, transp, RPCBVERS);
- if (result != NULL && !svc_sendreply(transp, (xdrproc_t)xdr_result,
- result)) {
- svcerr_systemerr(transp);
- if (debugging) {
- (void) fprintf(stderr, "rpcbind: svc_sendreply\n");
- if (doabort) {
- rpcbind_abort();
- }
- }
- }
-done:
- if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *)
- &argument)) {
- if (debugging) {
- (void) fprintf(stderr, "unable to free arguments\n");
- if (doabort) {
- rpcbind_abort();
- }
- }
- }
-}
-
-/*
- * Lookup the mapping for a program, version and return its
- * address. Assuming that the caller wants the address of the
- * server running on the transport on which the request came.
- *
- * We also try to resolve the universal address in terms of
- * address of the caller.
- */
-/* ARGSUSED */
-static void *
-rpcbproc_getaddr_3_local(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t versnum)
-{
- RPCB *regp = (RPCB *)arg;
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- char *uaddr;
-
- uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid),
- svc_getrpccaller(transp));
- fprintf(stderr, "RPCB_GETADDR req for (%lu, %lu, %s) from %s: ",
- (unsigned long)regp->r_prog, (unsigned long)regp->r_vers,
- regp->r_netid, uaddr);
- free(uaddr);
- }
-#endif
- return (rpcbproc_getaddr_com(regp, rqstp, transp, RPCBVERS,
- RPCB_ALLVERS));
-}
-
-/* ARGSUSED */
-static void *
-rpcbproc_dump_3_local(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t versnum)
-{
- return ((void *)&list_rbl);
-}
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_4.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_4.c
deleted file mode 100644
index c4e8edb..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_4.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/* $NetBSD: rpcb_svc_4.c,v 1.2 2011/09/16 16:13:18 plunky Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)rpcb_svc_4.c 1.8 93/07/05 SMI" */
-
-/*
- * rpcb_svc_4.c
- * The server procedure for the version 4 rpcbind.
- *
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <rpc/rpc.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <netconfig.h>
-#include <syslog.h>
-#include <string.h>
-#include <stdlib.h>
-#include "rpcbind.h"
-
-static void *rpcbproc_getaddr_4_local(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-static void *rpcbproc_getversaddr_4_local(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-static void *rpcbproc_getaddrlist_4_local(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-static void free_rpcb_entry_list(rpcb_entry_list_ptr *);
-static void *rpcbproc_dump_4_local(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-
-/*
- * Called by svc_getreqset. There is a separate server handle for
- * every transport that it waits on.
- */
-void
-rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp)
-{
- union {
- rpcb rpcbproc_set_4_arg;
- rpcb rpcbproc_unset_4_arg;
- rpcb rpcbproc_getaddr_4_local_arg;
- char *rpcbproc_uaddr2taddr_4_arg;
- struct netbuf rpcbproc_taddr2uaddr_4_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- void *(*local)(void *, struct svc_req *, SVCXPRT *, rpcvers_t);
-
- rpcbs_procinfo(RPCBVERS_4_STAT, rqstp->rq_proc);
-
- switch (rqstp->rq_proc) {
- case NULLPROC:
- /*
- * Null proc call
- */
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_NULL\n");
-#endif
- check_access(transp, rqstp->rq_proc, NULL, RPCBVERS4);
- (void) svc_sendreply(transp, (xdrproc_t) xdr_void, NULL);
- return;
-
- case RPCBPROC_SET:
- /*
- * Check to see whether the message came from
- * loopback transports (for security reasons)
- */
- xdr_argument = (xdrproc_t)xdr_rpcb;
- xdr_result = (xdrproc_t)xdr_bool;
- local = rpcbproc_set_com;
- break;
-
- case RPCBPROC_UNSET:
- /*
- * Check to see whether the message came from
- * loopback transports (for security reasons)
- */
- xdr_argument = (xdrproc_t)xdr_rpcb;
- xdr_result = (xdrproc_t)xdr_bool;
- local = rpcbproc_unset_com;
- break;
-
- case RPCBPROC_GETADDR:
- xdr_argument = (xdrproc_t)xdr_rpcb;
- xdr_result = (xdrproc_t)xdr_wrapstring;
- local = rpcbproc_getaddr_4_local;
- break;
-
- case RPCBPROC_GETVERSADDR:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_GETVERSADDR\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_rpcb;
- xdr_result = (xdrproc_t)xdr_wrapstring;
- local = rpcbproc_getversaddr_4_local;
- break;
-
- case RPCBPROC_DUMP:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_DUMP\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_void;
- xdr_result = (xdrproc_t)xdr_rpcblist_ptr;
- local = rpcbproc_dump_4_local;
- break;
-
- case RPCBPROC_INDIRECT:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_INDIRECT\n");
-#endif
- rpcbproc_callit_com(rqstp, transp, rqstp->rq_proc, RPCBVERS4);
- return;
-
-/* case RPCBPROC_CALLIT: */
- case RPCBPROC_BCAST:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_BCAST\n");
-#endif
- rpcbproc_callit_com(rqstp, transp, rqstp->rq_proc, RPCBVERS4);
- return;
-
- case RPCBPROC_GETTIME:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_GETTIME\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_void;
- xdr_result = (xdrproc_t)xdr_u_long;
- local = rpcbproc_gettime_com;
- break;
-
- case RPCBPROC_UADDR2TADDR:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_UADDR2TADDR\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_wrapstring;
- xdr_result = (xdrproc_t)xdr_netbuf;
- local = rpcbproc_uaddr2taddr_com;
- break;
-
- case RPCBPROC_TADDR2UADDR:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_TADDR2UADDR\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_netbuf;
- xdr_result = (xdrproc_t)xdr_wrapstring;
- local = rpcbproc_taddr2uaddr_com;
- break;
-
- case RPCBPROC_GETADDRLIST:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_GETADDRLIST\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_rpcb;
- xdr_result = (xdrproc_t)xdr_rpcb_entry_list_ptr;
- local = rpcbproc_getaddrlist_4_local;
- break;
-
- case RPCBPROC_GETSTAT:
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCBPROC_GETSTAT\n");
-#endif
- xdr_argument = (xdrproc_t)xdr_void;
- xdr_result = (xdrproc_t)xdr_rpcb_stat_byvers;
- local = rpcbproc_getstat;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
- memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, (xdrproc_t) xdr_argument,
- (char *)&argument)) {
- svcerr_decode(transp);
- if (debugging)
- (void) fprintf(stderr, "rpcbind: could not decode\n");
- return;
- }
- if (!check_access(transp, rqstp->rq_proc, &argument, RPCBVERS4)) {
- svcerr_weakauth(transp);
- goto done;
- }
- result = (*local)(&argument, rqstp, transp, RPCBVERS4);
- if (result != NULL && !svc_sendreply(transp, (xdrproc_t) xdr_result,
- result)) {
- svcerr_systemerr(transp);
- if (debugging) {
- (void) fprintf(stderr, "rpcbind: svc_sendreply\n");
- if (doabort) {
- rpcbind_abort();
- }
- }
- }
-done:
- if (!svc_freeargs(transp, (xdrproc_t) xdr_argument,
- (char *)&argument)) {
- if (debugging) {
- (void) fprintf(stderr, "unable to free arguments\n");
- if (doabort) {
- rpcbind_abort();
- }
- }
- }
- return;
-}
-
-/*
- * Lookup the mapping for a program, version and return its
- * address. Assuming that the caller wants the address of the
- * server running on the transport on which the request came.
- * Even if a service with a different version number is available,
- * it will return that address. The client should check with an
- * clnt_call to verify whether the service is the one that is desired.
- * We also try to resolve the universal address in terms of
- * address of the caller.
- */
-/* ARGSUSED */
-static void *
-rpcbproc_getaddr_4_local(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t rpcbversnum)
-{
- RPCB *regp = (RPCB *)arg;
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- char *uaddr;
-
- uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid),
- svc_getrpccaller(transp));
- fprintf(stderr, "RPCB_GETADDR req for (%lu, %lu, %s) from %s: ",
- (unsigned long)regp->r_prog, (unsigned long)regp->r_vers,
- regp->r_netid, uaddr);
- free(uaddr);
- }
-#endif
- return (rpcbproc_getaddr_com(regp, rqstp, transp, RPCBVERS4,
- RPCB_ALLVERS));
-}
-
-/*
- * Lookup the mapping for a program, version and return its
- * address. Assuming that the caller wants the address of the
- * server running on the transport on which the request came.
- *
- * We also try to resolve the universal address in terms of
- * address of the caller.
- */
-/* ARGSUSED */
-static void *
-rpcbproc_getversaddr_4_local(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t versnum)
-{
- RPCB *regp = (RPCB *)arg;
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- char *uaddr;
-
- uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid),
- svc_getrpccaller(transp));
- fprintf(stderr, "RPCB_GETVERSADDR rqst for (%lu, %lu, %s)"
- " from %s : ",
- (unsigned long)regp->r_prog, (unsigned long)regp->r_vers,
- regp->r_netid, uaddr);
- free(uaddr);
- }
-#endif
- return (rpcbproc_getaddr_com(regp, rqstp, transp, RPCBVERS4,
- RPCB_ONEVERS));
-}
-
-/*
- * Lookup the mapping for a program, version and return the
- * addresses for all transports in the current transport family.
- * We return a merged address.
- */
-/* ARGSUSED */
-static void *
-rpcbproc_getaddrlist_4_local(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t versnum)
-{
- RPCB *regp = (RPCB *)arg;
- static rpcb_entry_list_ptr rlist;
- register rpcblist_ptr rbl;
- rpcb_entry_list_ptr rp, tail = NULL;
- rpcprog_t prog;
- rpcvers_t vers;
- rpcb_entry *a;
- struct netconfig *nconf;
- struct netconfig *reg_nconf;
- char *saddr, *maddr = NULL;
-
- free_rpcb_entry_list(&rlist);
- prog = regp->r_prog;
- vers = regp->r_vers;
- reg_nconf = rpcbind_get_conf(transp->xp_netid);
- if (reg_nconf == NULL)
- return (NULL);
- if (*(regp->r_addr) != '\0') {
- saddr = regp->r_addr;
- } else {
- saddr = NULL;
- }
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- fprintf(stderr, "r_addr: %s r_netid: %s nc_protofmly: %s\n",
- regp->r_addr, regp->r_netid, reg_nconf->nc_protofmly);
- }
-#endif
- for (rbl = list_rbl; rbl != NULL; rbl = rbl->rpcb_next) {
- if ((rbl->rpcb_map.r_prog == prog) &&
- (rbl->rpcb_map.r_vers == vers)) {
- nconf = rpcbind_get_conf(rbl->rpcb_map.r_netid);
- if (nconf == NULL)
- goto fail;
- if (strcmp(nconf->nc_protofmly, reg_nconf->nc_protofmly)
- != 0) {
- continue; /* not same proto family */
- }
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "\tmerge with: %s\n", rbl->rpcb_map.r_addr);
-#endif
- if ((maddr = mergeaddr(transp, rbl->rpcb_map.r_netid,
- rbl->rpcb_map.r_addr, saddr)) == NULL) {
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, " FAILED\n");
-#endif
- continue;
- } else if (!maddr[0]) {
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, " SUCCEEDED, but port died - maddr: nullstring\n");
-#endif
- /* The server died. Unset this combination */
- delete_prog(regp->r_prog);
- free(maddr);
- continue;
- }
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, " SUCCEEDED maddr: %s\n", maddr);
-#endif
- /*
- * Add it to rlist.
- */
- rp = (rpcb_entry_list_ptr)
- malloc((u_int)sizeof (rpcb_entry_list));
- if (rp == NULL) {
- free(maddr);
- goto fail;
- }
- a = &rp->rpcb_entry_map;
- a->r_maddr = maddr;
- a->r_nc_netid = nconf->nc_netid;
- a->r_nc_semantics = nconf->nc_semantics;
- a->r_nc_protofmly = nconf->nc_protofmly;
- a->r_nc_proto = nconf->nc_proto;
- rp->rpcb_entry_next = NULL;
- if (rlist == NULL) {
- rlist = rp;
- tail = rp;
- } else if (tail) {
- tail->rpcb_entry_next = rp;
- tail = rp;
- }
- rp = NULL;
- }
- }
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- for (rp = rlist; rp; rp = rp->rpcb_entry_next) {
- fprintf(stderr, "\t%s %s\n", rp->rpcb_entry_map.r_maddr,
- rp->rpcb_entry_map.r_nc_proto);
- }
- }
-#endif
- /*
- * XXX: getaddrlist info is also being stuffed into getaddr.
- * Perhaps wrong, but better than it not getting counted at all.
- */
- rpcbs_getaddr(RPCBVERS4 - 2, prog, vers, transp->xp_netid, maddr);
- return (void *)&rlist;
-
-fail: free_rpcb_entry_list(&rlist);
- return (NULL);
-}
-
-/*
- * Free only the allocated structure, rest is all a pointer to some
- * other data somewhere else.
- */
-static void
-free_rpcb_entry_list(rpcb_entry_list_ptr *rlistp)
-{
- register rpcb_entry_list_ptr rbl, tmp;
-
- for (rbl = *rlistp; rbl != NULL; ) {
- tmp = rbl;
- rbl = rbl->rpcb_entry_next;
- free((char *)tmp->rpcb_entry_map.r_maddr);
- free((char *)tmp);
- }
- *rlistp = NULL;
-}
-
-/* ARGSUSED */
-static void *
-rpcbproc_dump_4_local(void *arg, struct svc_req *req, SVCXPRT *xprt,
- rpcvers_t versnum)
-{
- return ((void *)&list_rbl);
-}
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_com.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_com.c
deleted file mode 100644
index d7ac0db..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcb_svc_com.c
+++ /dev/null
@@ -1,1460 +0,0 @@
-/* $NetBSD: rpcb_svc_com.c,v 1.2 2011/09/16 16:13:18 plunky Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)rpcb_svc_com.c 1.18 94/05/02 SMI" */
-
-/*
- * rpcb_svc_com.c
- * The commom server procedure for the rpcbind.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <rpc/rpc.h>
-#include <rpc/rpcb_prot.h>
-#include <netconfig.h>
-#include <errno.h>
-#include <syslog.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <poll.h>
-#ifdef PORTMAP
-#include <netinet/in.h>
-#include <rpc/pmap_prot.h>
-#endif /* PORTMAP */
-#include <string.h>
-#include <stdlib.h>
-
-#include <rump/rump.h>
-#include <rump/rump_syscalls.h>
-
-#include "rpcbind.h"
-#include "svc_dg.h"
-#include "svc_fdset.h"
-
-#define RPC_BUF_MAX 65536 /* can be raised if required */
-
-static char emptystring[] = "";
-static int rpcb_rmtcalls;
-
-struct rmtcallfd_list {
- int fd;
- SVCXPRT *xprt;
- char *netid;
- struct rmtcallfd_list *next;
-};
-
-#define NFORWARD 64
-#define MAXTIME_OFF 300 /* 5 minutes */
-
-struct finfo {
- int flag;
-#define FINFO_ACTIVE 0x1
- u_int32_t caller_xid;
- struct netbuf *caller_addr;
- u_int32_t forward_xid;
- int forward_fd;
- char *uaddr;
- rpcproc_t reply_type;
- rpcvers_t versnum;
- time_t time;
-};
-static struct finfo FINFO[NFORWARD];
-
-
-static bool_t xdr_encap_parms(XDR *, struct encap_parms *);
-static bool_t xdr_rmtcall_args(XDR *, struct r_rmtcall_args *);
-static bool_t xdr_rmtcall_result(XDR *, struct r_rmtcall_args *);
-static bool_t xdr_opaque_parms(XDR *, struct r_rmtcall_args *);
-static int find_rmtcallfd_by_netid(char *);
-static SVCXPRT *find_rmtcallxprt_by_fd(int);
-static u_int32_t forward_register(u_int32_t, struct netbuf *, int, char *,
- rpcproc_t, rpcvers_t);
-static struct finfo *forward_find(u_int32_t);
-static int free_slot_by_xid(u_int32_t);
-static int free_slot_by_index(int);
-static int netbufcmp(struct netbuf *, struct netbuf *);
-static struct netbuf *netbufdup(struct netbuf *);
-static void netbuffree(struct netbuf *);
-static int check_rmtcalls(struct pollfd *, int);
-static void xprt_set_caller(SVCXPRT *, struct finfo *);
-static void send_svcsyserr(SVCXPRT *, struct finfo *);
-static void handle_reply(int, SVCXPRT *);
-static void find_versions(rpcprog_t, char *, rpcvers_t *, rpcvers_t *);
-static rpcblist_ptr find_service(rpcprog_t, rpcvers_t, char *);
-static char *getowner(SVCXPRT *, char *, size_t);
-static int add_pmaplist(RPCB *);
-static int del_pmaplist(RPCB *);
-
-/*
- * Set a mapping of program, version, netid
- */
-/* ARGSUSED */
-void *
-rpcbproc_set_com(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t rpcbversnum)
-{
- RPCB *regp = (RPCB *)arg;
- static bool_t ans;
- char owner[64];
-
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCB_SET request for (%lu, %lu, %s, %s) : ",
- (unsigned long)regp->r_prog, (unsigned long)regp->r_vers,
- regp->r_netid, regp->r_addr);
-#endif
- ans = map_set(regp, getowner(transp, owner, sizeof owner));
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "%s\n", ans == TRUE ? "succeeded" : "failed");
-#endif
- /* XXX: should have used some defined constant here */
- rpcbs_set(rpcbversnum - 2, ans);
- return (void *)&ans;
-}
-
-bool_t
-map_set(RPCB *regp, char *owner)
-{
- RPCB reg, *a;
- rpcblist_ptr rbl, fnd;
-
- reg = *regp;
- /*
- * check to see if already used
- * find_service returns a hit even if
- * the versions don't match, so check for it
- */
- fnd = find_service(reg.r_prog, reg.r_vers, reg.r_netid);
- if (fnd && (fnd->rpcb_map.r_vers == reg.r_vers)) {
- if (!strcmp(fnd->rpcb_map.r_addr, reg.r_addr))
- /*
- * if these match then it is already
- * registered so just say "OK".
- */
- return (TRUE);
- else
- return (FALSE);
- }
- /*
- * add to the end of the list
- */
- rbl = (rpcblist_ptr) malloc((u_int)sizeof (RPCBLIST));
- if (rbl == NULL) {
- return (FALSE);
- }
- a = &(rbl->rpcb_map);
- a->r_prog = reg.r_prog;
- a->r_vers = reg.r_vers;
- a->r_netid = strdup(reg.r_netid);
- a->r_addr = strdup(reg.r_addr);
- a->r_owner = strdup(owner);
- if (!a->r_addr || !a->r_netid || !a->r_owner) {
- if (a->r_netid)
- free((void *) a->r_netid);
- if (a->r_addr)
- free((void *) a->r_addr);
- if (a->r_owner)
- free((void *) a->r_owner);
- free((void *)rbl);
- return (FALSE);
- }
- rbl->rpcb_next = NULL;
- if (list_rbl == NULL) {
- list_rbl = rbl;
- } else {
- for (fnd = list_rbl; fnd->rpcb_next;
- fnd = fnd->rpcb_next)
- ;
- fnd->rpcb_next = rbl;
- }
-#ifdef PORTMAP
- (void) add_pmaplist(regp);
-#endif
- return (TRUE);
-}
-
-/*
- * Unset a mapping of program, version, netid
- */
-/* ARGSUSED */
-void *
-rpcbproc_unset_com(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t rpcbversnum)
-{
- RPCB *regp = (RPCB *)arg;
- static bool_t ans;
- char owner[64];
-
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "RPCB_UNSET request for (%lu, %lu, %s) : ",
- (unsigned long)regp->r_prog, (unsigned long)regp->r_vers,
- regp->r_netid);
-#endif
- ans = map_unset(regp, getowner(transp, owner, sizeof owner));
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "%s\n", ans == TRUE ? "succeeded" : "failed");
-#endif
- /* XXX: should have used some defined constant here */
- rpcbs_unset(rpcbversnum - 2, ans);
- return (void *)&ans;
-}
-
-bool_t
-map_unset(RPCB *regp, const char *owner)
-{
- int ans = 0;
- rpcblist_ptr rbl, prev, tmp;
-
- if (owner == NULL)
- return (0);
-
- for (prev = NULL, rbl = list_rbl; rbl; /* cstyle */) {
- if ((rbl->rpcb_map.r_prog != regp->r_prog) ||
- (rbl->rpcb_map.r_vers != regp->r_vers) ||
- (regp->r_netid[0] && strcasecmp(regp->r_netid,
- rbl->rpcb_map.r_netid))) {
- /* both rbl & prev move forwards */
- prev = rbl;
- rbl = rbl->rpcb_next;
- continue;
- }
- /*
- * Check whether appropriate uid. Unset only
- * if superuser or the owner itself.
- */
- if (strcmp(owner, rpcbind_superuser) &&
- strcmp(rbl->rpcb_map.r_owner, owner))
- return (0);
- /* found it; rbl moves forward, prev stays */
- ans = 1;
- tmp = rbl;
- rbl = rbl->rpcb_next;
- if (prev == NULL)
- list_rbl = rbl;
- else
- prev->rpcb_next = rbl;
- free((void *) tmp->rpcb_map.r_addr);
- free((void *) tmp->rpcb_map.r_netid);
- free((void *) tmp->rpcb_map.r_owner);
- free((void *) tmp);
- }
-#ifdef PORTMAP
- if (ans)
- (void) del_pmaplist(regp);
-#endif
- /*
- * We return 1 either when the entry was not there or it
- * was able to unset it. It can come to this point only if
- * atleast one of the conditions is true.
- */
- return (1);
-}
-
-void
-delete_prog(int prog)
-{
- RPCB reg;
- register rpcblist_ptr rbl;
-
- for (rbl = list_rbl; rbl != NULL; rbl = rbl->rpcb_next) {
- if ((rbl->rpcb_map.r_prog != prog))
- continue;
- if (is_bound(rbl->rpcb_map.r_netid, rbl->rpcb_map.r_addr))
- continue;
- reg.r_prog = rbl->rpcb_map.r_prog;
- reg.r_vers = rbl->rpcb_map.r_vers;
- reg.r_netid = strdup(rbl->rpcb_map.r_netid);
- (void)map_unset(&reg, rpcbind_superuser);
- free(reg.r_netid);
- }
-}
-
-void *
-rpcbproc_getaddr_com(RPCB *regp, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t rpcbversnum, rpcvers_t verstype)
-{
- static char *uaddr;
- char *saddr = NULL;
- rpcblist_ptr fnd;
-
- if (uaddr && uaddr[0])
- free((void *) uaddr);
- fnd = find_service(regp->r_prog, regp->r_vers, transp->xp_netid);
- if (fnd && ((verstype == RPCB_ALLVERS) ||
- (regp->r_vers == fnd->rpcb_map.r_vers))) {
- if (*(regp->r_addr) != '\0') { /* may contain a hint about */
- saddr = regp->r_addr; /* the interface that we */
- } /* should use */
- if (!(uaddr = mergeaddr(transp, transp->xp_netid,
- fnd->rpcb_map.r_addr, saddr))) {
- /* Try whatever we have */
- uaddr = strdup(fnd->rpcb_map.r_addr);
- } else if (!uaddr[0]) {
- /*
- * The server died. Unset all versions of this prog.
- */
- delete_prog(regp->r_prog);
- uaddr = emptystring;
- }
- } else {
- uaddr = emptystring;
- }
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "getaddr: %s\n", uaddr);
-#endif
- /* XXX: should have used some defined constant here */
- rpcbs_getaddr(rpcbversnum - 2, regp->r_prog, regp->r_vers,
- transp->xp_netid, uaddr);
- return (void *)&uaddr;
-}
-
-/* ARGSUSED */
-void *
-rpcbproc_gettime_com(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t rpcbversnum)
-{
- static time_t curtime;
-
- (void) time(&curtime);
- return (void *)&curtime;
-}
-
-/*
- * Convert uaddr to taddr. Should be used only by
- * local servers/clients. (kernel level stuff only)
- */
-/* ARGSUSED */
-void *
-rpcbproc_uaddr2taddr_com(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t rpcbversnum)
-{
- char **uaddrp = (char **)arg;
- struct netconfig *nconf;
- static struct netbuf nbuf;
- static struct netbuf *taddr;
-
- if (taddr) {
- free((void *) taddr->buf);
- free((void *) taddr);
- }
- if (((nconf = rpcbind_get_conf(transp->xp_netid)) == NULL) ||
- ((taddr = uaddr2taddr(nconf, *uaddrp)) == NULL)) {
- (void) memset((char *)&nbuf, 0, sizeof (struct netbuf));
- return (void *)&nbuf;
- }
- return (void *)taddr;
-}
-
-/*
- * Convert taddr to uaddr. Should be used only by
- * local servers/clients. (kernel level stuff only)
- */
-/* ARGSUSED */
-void *
-rpcbproc_taddr2uaddr_com(void *arg, struct svc_req *rqstp, SVCXPRT *transp,
- rpcvers_t rpcbversnum)
-{
- struct netbuf *taddr = (struct netbuf *)arg;
- static char *uaddr;
- struct netconfig *nconf;
-
- if (uaddr && !uaddr[0])
- free((void *) uaddr);
- if (((nconf = rpcbind_get_conf(transp->xp_netid)) == NULL) ||
- ((uaddr = taddr2uaddr(nconf, taddr)) == NULL)) {
- uaddr = emptystring;
- }
- return (void *)&uaddr;
-}
-
-
-static bool_t
-xdr_encap_parms(XDR *xdrs, struct encap_parms *epp)
-{
- return (xdr_bytes(xdrs, &(epp->args), (u_int *) &(epp->arglen), ~0));
-}
-
-/*
- * XDR remote call arguments. It ignores the address part.
- * written for XDR_DECODE direction only
- */
-static bool_t
-xdr_rmtcall_args(XDR *xdrs, struct r_rmtcall_args *cap)
-{
- /* does not get the address or the arguments */
- if (xdr_u_int32_t(xdrs, &(cap->rmt_prog)) &&
- xdr_u_int32_t(xdrs, &(cap->rmt_vers)) &&
- xdr_u_int32_t(xdrs, &(cap->rmt_proc))) {
- return (xdr_encap_parms(xdrs, &(cap->rmt_args)));
- }
- return (FALSE);
-}
-
-/*
- * XDR remote call results along with the address. Ignore
- * program number, version number and proc number.
- * Written for XDR_ENCODE direction only.
- */
-static bool_t
-xdr_rmtcall_result(XDR *xdrs, struct r_rmtcall_args *cap)
-{
- bool_t result;
-
-#ifdef PORTMAP
- if (cap->rmt_localvers == PMAPVERS) {
- int h1, h2, h3, h4, p1, p2;
- u_long port;
-
- /* interpret the universal address for TCP/IP */
- if (sscanf(cap->rmt_uaddr, "%d.%d.%d.%d.%d.%d",
- &h1, &h2, &h3, &h4, &p1, &p2) != 6)
- return (FALSE);
- port = ((p1 & 0xff) << 8) + (p2 & 0xff);
- result = xdr_u_long(xdrs, &port);
- } else
-#endif
- if ((cap->rmt_localvers == RPCBVERS) ||
- (cap->rmt_localvers == RPCBVERS4)) {
- result = xdr_wrapstring(xdrs, &(cap->rmt_uaddr));
- } else {
- return (FALSE);
- }
- if (result == TRUE)
- return (xdr_encap_parms(xdrs, &(cap->rmt_args)));
- return (FALSE);
-}
-
-/*
- * only worries about the struct encap_parms part of struct r_rmtcall_args.
- * The arglen must already be set!!
- */
-static bool_t
-xdr_opaque_parms(XDR *xdrs, struct r_rmtcall_args *cap)
-{
- return (xdr_opaque(xdrs, cap->rmt_args.args, cap->rmt_args.arglen));
-}
-
-static struct rmtcallfd_list *rmthead;
-static struct rmtcallfd_list *rmttail;
-
-int
-create_rmtcall_fd(struct netconfig *nconf)
-{
- int fd;
- struct rmtcallfd_list *rmt;
- SVCXPRT *xprt;
-
- if ((fd = __rpc_nconf2fd(nconf)) == -1) {
- if (debugging)
- fprintf(stderr,
- "create_rmtcall_fd: couldn't open \"%s\" (errno %d)\n",
- nconf->nc_device, errno);
- return (-1);
- }
- xprt = svc_tli_create(fd, 0, (struct t_bind *) 0, 0, 0);
- if (xprt == NULL) {
- if (debugging)
- fprintf(stderr,
- "create_rmtcall_fd: svc_tli_create failed\n");
- return (-1);
- }
- rmt = (struct rmtcallfd_list *)malloc((u_int)
- sizeof (struct rmtcallfd_list));
- if (rmt == NULL) {
- syslog(LOG_ERR, "create_rmtcall_fd: no memory!");
- return (-1);
- }
- rmt->xprt = xprt;
- rmt->netid = strdup(nconf->nc_netid);
- xprt->xp_netid = rmt->netid;
- rmt->fd = fd;
- rmt->next = NULL;
- if (rmthead == NULL) {
- rmthead = rmt;
- rmttail = rmt;
- } else {
- rmttail->next = rmt;
- rmttail = rmt;
- }
- /* XXX not threadsafe */
- if (fd > *get_fdsetmax())
- *get_fdsetmax() = fd;
- FD_SET(fd, get_fdset());
- return (fd);
-}
-
-static int
-find_rmtcallfd_by_netid(char *netid)
-{
- struct rmtcallfd_list *rmt;
-
- for (rmt = rmthead; rmt != NULL; rmt = rmt->next) {
- if (strcmp(netid, rmt->netid) == 0) {
- return (rmt->fd);
- }
- }
- return (-1);
-}
-
-static SVCXPRT *
-find_rmtcallxprt_by_fd(int fd)
-{
- struct rmtcallfd_list *rmt;
-
- for (rmt = rmthead; rmt != NULL; rmt = rmt->next) {
- if (fd == rmt->fd) {
- return (rmt->xprt);
- }
- }
- return (NULL);
-}
-
-
-/*
- * Call a remote procedure service. This procedure is very quiet when things
- * go wrong. The proc is written to support broadcast rpc. In the broadcast
- * case, a machine should shut-up instead of complain, lest the requestor be
- * overrun with complaints at the expense of not hearing a valid reply.
- * When receiving a request and verifying that the service exists, we
- *
- * receive the request
- *
- * open a new TLI endpoint on the same transport on which we received
- * the original request
- *
- * remember the original request's XID (which requires knowing the format
- * of the svc_dg_data structure)
- *
- * forward the request, with a new XID, to the requested service,
- * remembering the XID used to send this request (for later use in
- * reassociating the answer with the original request), the requestor's
- * address, the file descriptor on which the forwarded request is
- * made and the service's address.
- *
- * mark the file descriptor on which we anticipate receiving a reply from
- * the service and one to select for in our private svc_run procedure
- *
- * At some time in the future, a reply will be received from the service to
- * which we forwarded the request. At that time, we detect that the socket
- * used was for forwarding (by looking through the finfo structures to see
- * whether the fd corresponds to one of those) and call handle_reply() to
- *
- * receive the reply
- *
- * bundle the reply, along with the service's universal address
- *
- * create a SVCXPRT structure and use a version of svc_sendreply
- * that allows us to specify the reply XID and destination, send the reply
- * to the original requestor.
- */
-
-void
-rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp,
- rpcproc_t reply_type, rpcvers_t versnum)
-{
- register rpcblist_ptr rbl;
- struct netconfig *nconf;
- struct netbuf *caller;
- struct r_rmtcall_args a;
- char *buf_alloc = NULL, *outbufp;
- char *outbuf_alloc = NULL;
- char buf[RPC_BUF_MAX], outbuf[RPC_BUF_MAX];
- struct netbuf *na = NULL;
- struct rpc_msg call_msg;
- int outlen;
- u_int sendsz;
- XDR outxdr;
- AUTH *auth;
- int fd = -1;
- char *uaddr, *m_uaddr, *local_uaddr = NULL;
- u_int32_t *xidp;
- struct __rpc_sockinfo si;
- struct sockaddr *localsa;
- struct netbuf tbuf;
-
- if (!__rpc_fd2sockinfo(transp->xp_fd, &si)) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- return;
- }
- if (si.si_socktype != SOCK_DGRAM)
- return; /* Only datagram type accepted */
- sendsz = __rpc_get_t_size(si.si_af, si.si_proto, UDPMSGSIZE);
- if (sendsz == 0) { /* data transfer not supported */
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- return;
- }
- /*
- * Should be multiple of 4 for XDR.
- */
- sendsz = ((sendsz + 3) / 4) * 4;
- if (sendsz > RPC_BUF_MAX) {
-#ifdef notyet
- buf_alloc = alloca(sendsz); /* not in IDR2? */
-#else
- buf_alloc = malloc(sendsz);
-#endif /* notyet */
- if (buf_alloc == NULL) {
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: No Memory!\n");
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- return;
- }
- a.rmt_args.args = buf_alloc;
- } else {
- a.rmt_args.args = buf;
- }
-
- call_msg.rm_xid = 0; /* For error checking purposes */
- if (!svc_getargs(transp, (xdrproc_t) xdr_rmtcall_args, (char *) &a)) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_decode(transp);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: svc_getargs failed\n");
- goto error;
- }
-
- if (!check_callit(transp, &a, versnum)) {
- svcerr_weakauth(transp);
- goto error;
- }
-
- caller = svc_getrpccaller(transp);
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid), caller);
- fprintf(stderr, "%s %s req for (%lu, %lu, %lu, %s) from %s : ",
- versnum == PMAPVERS ? "pmap_rmtcall" :
- versnum == RPCBVERS ? "rpcb_rmtcall" :
- versnum == RPCBVERS4 ? "rpcb_indirect" :
- rpcbind_unknown,
- reply_type == RPCBPROC_INDIRECT ? "indirect" : "callit",
- (unsigned long)a.rmt_prog, (unsigned long)a.rmt_vers,
- (unsigned long)a.rmt_proc, transp->xp_netid,
- uaddr ? uaddr : rpcbind_unknown);
- if (uaddr)
- free((void *) uaddr);
- }
-#endif
-
- rbl = find_service(a.rmt_prog, a.rmt_vers, transp->xp_netid);
-
- rpcbs_rmtcall(versnum - 2, reply_type, a.rmt_prog, a.rmt_vers,
- a.rmt_proc, transp->xp_netid, rbl);
-
- if (rbl == NULL) {
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "not found\n");
-#endif
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_noprog(transp);
- goto error;
- }
- if (rbl->rpcb_map.r_vers != a.rmt_vers) {
- if (reply_type == RPCBPROC_INDIRECT) {
- rpcvers_t vers_low, vers_high;
-
- find_versions(a.rmt_prog, transp->xp_netid,
- &vers_low, &vers_high);
- svcerr_progvers(transp, vers_low, vers_high);
- }
- goto error;
- }
-
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "found at uaddr %s\n", rbl->rpcb_map.r_addr);
-#endif
- /*
- * Check whether this entry is valid and a server is present
- * Mergeaddr() returns NULL if no such entry is present, and
- * returns "" if the entry was present but the server is not
- * present (i.e., it crashed).
- */
- if (reply_type == RPCBPROC_INDIRECT) {
- uaddr = mergeaddr(transp, transp->xp_netid,
- rbl->rpcb_map.r_addr, NULL);
- if (uaddr == NULL || uaddr[0] == '\0') {
- svcerr_noprog(transp);
- if (uaddr != NULL) {
- free((void *) uaddr);
- }
- goto error;
- }
- if (uaddr != NULL) {
- free((void *) uaddr);
- }
- }
- nconf = rpcbind_get_conf(transp->xp_netid);
- if (nconf == NULL) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: rpcbind_get_conf failed\n");
- goto error;
- }
- localsa = local_sa(((struct sockaddr *)caller->buf)->sa_family);
- if (localsa == NULL) {
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: no local address\n");
- goto error;
- }
- tbuf.len = tbuf.maxlen = localsa->sa_len;
- tbuf.buf = localsa;
- local_uaddr =
- addrmerge(&tbuf, rbl->rpcb_map.r_addr, NULL, nconf->nc_netid);
- m_uaddr = addrmerge(caller, rbl->rpcb_map.r_addr, NULL,
- nconf->nc_netid);
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "merged uaddr %s\n", m_uaddr);
-#endif
- if ((fd = find_rmtcallfd_by_netid(nconf->nc_netid)) == -1) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- free((void *) m_uaddr);
- goto error;
- }
- xidp = __rpcb_get_dg_xidp(transp);
- call_msg.rm_xid = forward_register(*xidp,
- caller, fd, m_uaddr, reply_type, versnum);
- if (call_msg.rm_xid == 0) {
- /*
- * A duplicate request for the slow server. Let's not
- * beat on it any more.
- */
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: duplicate request\n");
- free((void *) m_uaddr);
- goto error;
- } else if (call_msg.rm_xid == -1) {
- /* forward_register failed. Perhaps no memory. */
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: forward_register failed\n");
- free((void *) m_uaddr);
- goto error;
- }
-
-#ifdef DEBUG_RMTCALL
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: original XID %x, new XID %x\n",
- *xidp, call_msg.rm_xid);
-#endif
- call_msg.rm_direction = CALL;
- call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
- call_msg.rm_call.cb_prog = a.rmt_prog;
- call_msg.rm_call.cb_vers = a.rmt_vers;
- if (sendsz > RPC_BUF_MAX) {
-#ifdef notyet
- outbuf_alloc = alloca(sendsz); /* not in IDR2? */
-#else
- outbuf_alloc = malloc(sendsz);
-#endif /* notyet */
- if (outbuf_alloc == NULL) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: No memory!\n");
- goto error;
- }
- xdrmem_create(&outxdr, outbuf_alloc, sendsz, XDR_ENCODE);
- } else {
- xdrmem_create(&outxdr, outbuf, sendsz, XDR_ENCODE);
- }
- if (!xdr_callhdr(&outxdr, &call_msg)) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: xdr_callhdr failed\n");
- goto error;
- }
- if (!xdr_u_int32_t(&outxdr, &(a.rmt_proc))) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: xdr_u_long failed\n");
- goto error;
- }
-
- if (rqstp->rq_cred.oa_flavor == AUTH_NULL) {
- auth = authnone_create();
- } else if (rqstp->rq_cred.oa_flavor == AUTH_SYS) {
- struct authunix_parms *au;
-
- au = (struct authunix_parms *)rqstp->rq_clntcred;
- auth = authunix_create(au->aup_machname,
- au->aup_uid, au->aup_gid,
- au->aup_len, au->aup_gids);
- if (auth == NULL) /* fall back */
- auth = authnone_create();
- } else {
- /* we do not support any other authentication scheme */
- if (debugging)
- fprintf(stderr,
-"rpcbproc_callit_com: oa_flavor != AUTH_NONE and oa_flavor != AUTH_SYS\n");
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_weakauth(transp); /* XXX too strong.. */
- goto error;
- }
- if (auth == NULL) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: authwhatever_create returned NULL\n");
- goto error;
- }
- if (!AUTH_MARSHALL(auth, &outxdr)) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- AUTH_DESTROY(auth);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: AUTH_MARSHALL failed\n");
- goto error;
- }
- AUTH_DESTROY(auth);
- if (!xdr_opaque_parms(&outxdr, &a)) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: xdr_opaque_parms failed\n");
- goto error;
- }
- outlen = (int) XDR_GETPOS(&outxdr);
- if (outbuf_alloc)
- outbufp = outbuf_alloc;
- else
- outbufp = outbuf;
-
- na = uaddr2taddr(nconf, local_uaddr);
- if (!na) {
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- goto error;
- }
-
- if (sendto(fd, outbufp, outlen, 0, (struct sockaddr *)na->buf, na->len)
- != outlen) {
- if (debugging)
- fprintf(stderr,
- "rpcbproc_callit_com: sendto failed: errno %d\n", errno);
- if (reply_type == RPCBPROC_INDIRECT)
- svcerr_systemerr(transp);
- goto error;
- }
- goto out;
-
-error:
- if (call_msg.rm_xid != 0)
- (void) free_slot_by_xid(call_msg.rm_xid);
-out:
- if (local_uaddr)
- free(local_uaddr);
- if (buf_alloc)
- free((void *) buf_alloc);
- if (outbuf_alloc)
- free((void *) outbuf_alloc);
- if (na) {
- free(na->buf);
- free(na);
- }
-}
-
-/*
- * Makes an entry into the FIFO for the given request.
- * If duplicate request, returns a 0, else returns the xid of its call.
- */
-static u_int32_t
-forward_register(u_int32_t caller_xid, struct netbuf *caller_addr,
- int forward_fd, char *uaddr, rpcproc_t reply_type,
- rpcvers_t versnum)
-{
- int i;
- int j = 0;
- time_t min_time, time_now;
- static u_int32_t lastxid;
- int entry = -1;
-
- min_time = FINFO[0].time;
- time_now = time((time_t *)0);
- /* initialization */
- if (lastxid == 0)
- lastxid = time_now * NFORWARD;
-
- /*
- * Check if it is an duplicate entry. Then,
- * try to find an empty slot. If not available, then
- * use the slot with the earliest time.
- */
- for (i = 0; i < NFORWARD; i++) {
- if (FINFO[i].flag & FINFO_ACTIVE) {
- if ((FINFO[i].caller_xid == caller_xid) &&
- (FINFO[i].reply_type == reply_type) &&
- (FINFO[i].versnum == versnum) &&
- (!netbufcmp(FINFO[i].caller_addr,
- caller_addr))) {
- FINFO[i].time = time((time_t *)0);
- return (0); /* Duplicate entry */
- } else {
- /* Should we wait any longer */
- if ((time_now - FINFO[i].time) > MAXTIME_OFF)
- (void) free_slot_by_index(i);
- }
- }
- if (entry == -1) {
- if ((FINFO[i].flag & FINFO_ACTIVE) == 0) {
- entry = i;
- } else if (FINFO[i].time < min_time) {
- j = i;
- min_time = FINFO[i].time;
- }
- }
- }
- if (entry != -1) {
- /* use this empty slot */
- j = entry;
- } else {
- (void) free_slot_by_index(j);
- }
- if ((FINFO[j].caller_addr = netbufdup(caller_addr)) == NULL) {
- return (-1);
- }
- rpcb_rmtcalls++; /* no of pending calls */
- FINFO[j].flag = FINFO_ACTIVE;
- FINFO[j].reply_type = reply_type;
- FINFO[j].versnum = versnum;
- FINFO[j].time = time_now;
- FINFO[j].caller_xid = caller_xid;
- FINFO[j].forward_fd = forward_fd;
- /*
- * Though uaddr is not allocated here, it will still be freed
- * from free_slot_*().
- */
- FINFO[j].uaddr = uaddr;
- lastxid = lastxid + NFORWARD;
- FINFO[j].forward_xid = lastxid + j; /* encode slot */
- return (FINFO[j].forward_xid); /* forward on this xid */
-}
-
-static struct finfo *
-forward_find(u_int32_t reply_xid)
-{
- int i;
-
- i = reply_xid % NFORWARD;
- if (i < 0)
- i += NFORWARD;
- if ((FINFO[i].flag & FINFO_ACTIVE) &&
- (FINFO[i].forward_xid == reply_xid)) {
- return (&FINFO[i]);
- }
- return (NULL);
-}
-
-static int
-free_slot_by_xid(u_int32_t xid)
-{
- int entry;
-
- entry = xid % NFORWARD;
- if (entry < 0)
- entry += NFORWARD;
- return (free_slot_by_index(entry));
-}
-
-static int
-free_slot_by_index(int idx)
-{
- struct finfo *fi;
-
- fi = &FINFO[idx];
- if (fi->flag & FINFO_ACTIVE) {
- netbuffree(fi->caller_addr);
- /* XXX may be too big, but can't access xprt array here */
- if (fi->forward_fd >= *get_fdsetmax())
- (*get_fdsetmax())--;
- free((void *) fi->uaddr);
- fi->flag &= ~FINFO_ACTIVE;
- rpcb_rmtcalls--;
- return (1);
- }
- return (0);
-}
-
-static int
-netbufcmp(struct netbuf *n1, struct netbuf *n2)
-{
- return ((n1->len != n2->len) || memcmp(n1->buf, n2->buf, n1->len));
-}
-
-static struct netbuf *
-netbufdup(struct netbuf *ap)
-{
- struct netbuf *np;
-
- np = (struct netbuf *) malloc(sizeof (struct netbuf) + ap->len);
- if (np) {
- np->maxlen = np->len = ap->len;
- np->buf = ((char *) np) + sizeof (struct netbuf);
- (void) memcpy(np->buf, ap->buf, ap->len);
- }
- return (np);
-}
-
-static void
-netbuffree(struct netbuf *ap)
-{
- free((void *) ap);
-}
-
-
-#define MASKVAL (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND)
-extern bool_t __svc_clean_idle(fd_set *, int, bool_t);
-
-void
-my_svc_run()
-{
- size_t nfds;
- struct pollfd pollfds[FD_SETSIZE];
- int poll_ret, check_ret;
- int n;
-#ifdef SVC_RUN_DEBUG
- int i;
-#endif
- register struct pollfd *p;
- fd_set cleanfds;
-
- for (;;) {
- p = pollfds;
- for (n = 0; n <= *get_fdsetmax(); n++) {
- if (FD_ISSET(n, get_fdset())) {
- p->fd = n;
- p->events = MASKVAL;
- p++;
- }
- }
- nfds = p - pollfds;
- poll_ret = 0;
-#ifdef SVC_RUN_DEBUG
- if (debugging) {
- fprintf(stderr, "polling for read on fd < ");
- for (i = 0, p = pollfds; i < nfds; i++, p++)
- if (p->events)
- fprintf(stderr, "%d ", p->fd);
- fprintf(stderr, ">\n");
- }
-#endif
- poll_ret = rump_sys_poll(pollfds, nfds, 30 * 1000);
- //printf("rpcbind poll got %d\n", poll_ret);
- switch (poll_ret) {
- case -1:
- /*
- * We ignore all errors, continuing with the assumption
- * that it was set by the signal handlers (or any
- * other outside event) and not caused by poll().
- */
- case 0:
- cleanfds = *get_fdset();
- __svc_clean_idle(&cleanfds, 30, FALSE);
- continue;
- default:
-#ifdef SVC_RUN_DEBUG
- if (debugging) {
- fprintf(stderr, "poll returned read fds < ");
- for (i = 0, p = pollfds; i < nfds; i++, p++)
- if (p->revents)
- fprintf(stderr, "%d (0x%x) ", p->fd, p->revents);
- fprintf(stderr, ">\n");
- }
-#endif
- /*
- * If we found as many replies on callback fds
- * as the number of descriptors selectable which
- * poll() returned, there can be no more so we
- * don't call svc_getreq_poll. Otherwise, there
- * must be another so we must call svc_getreq_poll.
- */
- if ((check_ret = check_rmtcalls(pollfds, nfds)) ==
- poll_ret)
- continue;
- svc_getreq_poll(pollfds, poll_ret-check_ret);
- }
-#ifdef SVC_RUN_DEBUG
- if (debugging) {
- fprintf(stderr, "svc_maxfd now %u\n", *get_fdsetmax());
- }
-#endif
- }
-}
-
-static int
-check_rmtcalls(struct pollfd *pfds, int nfds)
-{
- int j, ncallbacks_found = 0, rmtcalls_pending;
- SVCXPRT *xprt;
-
- if (rpcb_rmtcalls == 0)
- return (0);
-
- rmtcalls_pending = rpcb_rmtcalls;
- for (j = 0; j < nfds; j++) {
- if ((xprt = find_rmtcallxprt_by_fd(pfds[j].fd)) != NULL) {
- if (pfds[j].revents) {
- ncallbacks_found++;
-#ifdef DEBUG_RMTCALL
- if (debugging)
- fprintf(stderr,
-"my_svc_run: polled on forwarding fd %d, netid %s - calling handle_reply\n",
- pfds[j].fd, xprt->xp_netid);
-#endif
- handle_reply(pfds[j].fd, xprt);
- pfds[j].revents = 0;
- if (ncallbacks_found >= rmtcalls_pending) {
- break;
- }
- }
- }
- }
- return (ncallbacks_found);
-}
-
-static void
-xprt_set_caller(SVCXPRT *xprt, struct finfo *fi)
-{
- u_int32_t *xidp;
-
- *(svc_getrpccaller(xprt)) = *(fi->caller_addr);
- xidp = __rpcb_get_dg_xidp(xprt);
- *xidp = fi->caller_xid;
-}
-
-/*
- * Call svcerr_systemerr() only if RPCBVERS4
- */
-static void
-send_svcsyserr(SVCXPRT *xprt, struct finfo *fi)
-{
- if (fi->reply_type == RPCBPROC_INDIRECT) {
- xprt_set_caller(xprt, fi);
- svcerr_systemerr(xprt);
- }
- return;
-}
-
-static void
-handle_reply(int fd, SVCXPRT *xprt)
-{
- XDR reply_xdrs;
- struct rpc_msg reply_msg;
- struct rpc_err reply_error;
- char *buffer;
- struct finfo *fi;
- int inlen, pos, len;
- struct r_rmtcall_args a;
- struct sockaddr_storage ss;
- socklen_t fromlen;
-#ifdef SVC_RUN_DEBUG
- char *uaddr;
-#endif
-
- buffer = malloc(RPC_BUF_MAX);
- if (buffer == NULL)
- goto done;
-
- do {
- fromlen = sizeof ss;
- inlen = recvfrom(fd, buffer, RPC_BUF_MAX, 0,
- (struct sockaddr *)&ss, &fromlen);
- } while (inlen < 0 && errno == EINTR);
- if (inlen < 0) {
- if (debugging)
- fprintf(stderr,
- "handle_reply: recvfrom returned %d, errno %d\n", inlen, errno);
- goto done;
- }
-
- reply_msg.acpted_rply.ar_verf = _null_auth;
- reply_msg.acpted_rply.ar_results.where = 0;
- reply_msg.acpted_rply.ar_results.proc = (xdrproc_t) xdr_void;
-
- xdrmem_create(&reply_xdrs, buffer, (u_int)inlen, XDR_DECODE);
- if (!xdr_replymsg(&reply_xdrs, &reply_msg)) {
- if (debugging)
- (void) fprintf(stderr,
- "handle_reply: xdr_replymsg failed\n");
- goto done;
- }
- fi = forward_find(reply_msg.rm_xid);
-#ifdef SVC_RUN_DEBUG
- if (debugging) {
- fprintf(stderr, "handle_reply: reply xid: %d fi addr: %p\n",
- reply_msg.rm_xid, fi);
- }
-#endif
- if (fi == NULL) {
- goto done;
- }
- _seterr_reply(&reply_msg, &reply_error);
- if (reply_error.re_status != RPC_SUCCESS) {
- if (debugging)
- (void) fprintf(stderr, "handle_reply: %s\n",
- clnt_sperrno(reply_error.re_status));
- send_svcsyserr(xprt, fi);
- goto done;
- }
- pos = XDR_GETPOS(&reply_xdrs);
- len = inlen - pos;
- a.rmt_args.args = &buffer[pos];
- a.rmt_args.arglen = len;
- a.rmt_uaddr = fi->uaddr;
- a.rmt_localvers = fi->versnum;
-
- xprt_set_caller(xprt, fi);
-#ifdef SVC_RUN_DEBUG
- uaddr = taddr2uaddr(rpcbind_get_conf("udp"),
- svc_getrpccaller(xprt));
- if (debugging) {
- fprintf(stderr, "handle_reply: forwarding address %s to %s\n",
- a.rmt_uaddr, uaddr ? uaddr : rpcbind_unknown);
- }
- if (uaddr)
- free((void *) uaddr);
-#endif
- svc_sendreply(xprt, (xdrproc_t) xdr_rmtcall_result, (char *) &a);
-done:
- if (buffer)
- free(buffer);
-
- if (reply_msg.rm_xid == 0) {
-#ifdef SVC_RUN_DEBUG
- if (debugging) {
- fprintf(stderr, "handle_reply: NULL xid on exit!\n");
- }
-#endif
- } else
- (void) free_slot_by_xid(reply_msg.rm_xid);
- return;
-}
-
-static void
-find_versions(rpcprog_t prog, char *netid, rpcvers_t *lowvp, rpcvers_t *highvp)
-{
- register rpcblist_ptr rbl;
- int lowv = 0;
- int highv = 0;
-
- for (rbl = list_rbl; rbl != NULL; rbl = rbl->rpcb_next) {
- if ((rbl->rpcb_map.r_prog != prog) ||
- ((rbl->rpcb_map.r_netid != NULL) &&
- (strcasecmp(rbl->rpcb_map.r_netid, netid) != 0)))
- continue;
- if (lowv == 0) {
- highv = rbl->rpcb_map.r_vers;
- lowv = highv;
- } else if (rbl->rpcb_map.r_vers < lowv) {
- lowv = rbl->rpcb_map.r_vers;
- } else if (rbl->rpcb_map.r_vers > highv) {
- highv = rbl->rpcb_map.r_vers;
- }
- }
- *lowvp = lowv;
- *highvp = highv;
- return;
-}
-
-/*
- * returns the item with the given program, version number and netid.
- * If that version number is not found, it returns the item with that
- * program number, so that address is now returned to the caller. The
- * caller when makes a call to this program, version number, the call
- * will fail and it will return with PROGVERS_MISMATCH. The user can
- * then determine the highest and the lowest version number for this
- * program using clnt_geterr() and use those program version numbers.
- *
- * Returns the RPCBLIST for the given prog, vers and netid
- */
-static rpcblist_ptr
-find_service(rpcprog_t prog, rpcvers_t vers, char *netid)
-{
- register rpcblist_ptr hit = NULL;
- register rpcblist_ptr rbl;
-
- for (rbl = list_rbl; rbl != NULL; rbl = rbl->rpcb_next) {
- if ((rbl->rpcb_map.r_prog != prog) ||
- ((rbl->rpcb_map.r_netid != NULL) &&
- (strcasecmp(rbl->rpcb_map.r_netid, netid) != 0)))
- continue;
- hit = rbl;
- if (rbl->rpcb_map.r_vers == vers)
- break;
- }
- return (hit);
-}
-
-/*
- * Copies the name associated with the uid of the caller and returns
- * a pointer to it. Similar to getwd().
- */
-static char *
-getowner(SVCXPRT *transp, char *owner, size_t ownersize)
-{
- struct sockcred *sc;
-
- sc = __svc_getcallercreds(transp);
- if (sc == NULL)
- strlcpy(owner, rpcbind_unknown, ownersize);
- else if (sc->sc_uid == 0)
- strlcpy(owner, rpcbind_superuser, ownersize);
- else
- snprintf(owner, ownersize, "%d", sc->sc_uid);
-
- return owner;
-}
-
-#ifdef PORTMAP
-/*
- * Add this to the pmap list only if it is UDP or TCP.
- */
-static int
-add_pmaplist(RPCB *arg)
-{
- struct pmap pmap;
- struct pmaplist *pml;
- int h1, h2, h3, h4, p1, p2;
-
- if (strcmp(arg->r_netid, udptrans) == 0) {
- /* It is UDP! */
- pmap.pm_prot = IPPROTO_UDP;
- } else if (strcmp(arg->r_netid, tcptrans) == 0) {
- /* It is TCP */
- pmap.pm_prot = IPPROTO_TCP;
- } else
- /* Not a IP protocol */
- return (0);
-
- /* interpret the universal address for TCP/IP */
- if (sscanf(arg->r_addr, "%d.%d.%d.%d.%d.%d",
- &h1, &h2, &h3, &h4, &p1, &p2) != 6)
- return (0);
- pmap.pm_port = ((p1 & 0xff) << 8) + (p2 & 0xff);
- pmap.pm_prog = arg->r_prog;
- pmap.pm_vers = arg->r_vers;
- /*
- * add to END of list
- */
- pml = (struct pmaplist *) malloc((u_int)sizeof (struct pmaplist));
- if (pml == NULL) {
- (void) syslog(LOG_ERR, "rpcbind: no memory!\n");
- return (1);
- }
- pml->pml_map = pmap;
- pml->pml_next = NULL;
- if (list_pml == NULL) {
- list_pml = pml;
- } else {
- struct pmaplist *fnd;
-
- /* Attach to the end of the list */
- for (fnd = list_pml; fnd->pml_next; fnd = fnd->pml_next)
- ;
- fnd->pml_next = pml;
- }
- return (0);
-}
-
-/*
- * Delete this from the pmap list only if it is UDP or TCP.
- */
-static int
-del_pmaplist(RPCB *arg)
-{
- struct pmaplist *pml;
- struct pmaplist *prevpml, *fnd;
- long prot;
-
- if (strcmp(arg->r_netid, udptrans) == 0) {
- /* It is UDP! */
- prot = IPPROTO_UDP;
- } else if (strcmp(arg->r_netid, tcptrans) == 0) {
- /* It is TCP */
- prot = IPPROTO_TCP;
- } else if (arg->r_netid[0] == 0) {
- prot = 0; /* Remove all occurrences */
- } else {
- /* Not a IP protocol */
- return (0);
- }
- for (prevpml = NULL, pml = list_pml; pml; /* cstyle */) {
- if ((pml->pml_map.pm_prog != arg->r_prog) ||
- (pml->pml_map.pm_vers != arg->r_vers) ||
- (prot && (pml->pml_map.pm_prot != prot))) {
- /* both pml & prevpml move forwards */
- prevpml = pml;
- pml = pml->pml_next;
- continue;
- }
- /* found it; pml moves forward, prevpml stays */
- fnd = pml;
- pml = pml->pml_next;
- if (prevpml == NULL)
- list_pml = pml;
- else
- prevpml->pml_next = pml;
- free((void *) fnd);
- }
- return (0);
-}
-#endif /* PORTMAP */
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.8 b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.8
deleted file mode 100644
index c77f1d5..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.8
+++ /dev/null
@@ -1,127 +0,0 @@
-.\" $NetBSD: rpcbind.8,v 1.1 2010/07/26 15:53:00 pooka Exp $
-.\" @(#)rpcbind.1m 1.19 92/09/14 SMI; from SVr4
-.\" Copyright 1989 AT&T
-.\" Copyright 1991 Sun Microsystems, Inc.
-.Dd October 19, 2008
-.Dt RPCBIND 8
-.Sh NAME
-.Nm rpcbind
-.Nd universal addresses to RPC program number mapper
-.Sh SYNOPSIS
-.Nm
-.Op Fl dilLs
-.Sh DESCRIPTION
-.Nm
-is a server that converts
-.Tn RPC
-program numbers into
-universal addresses.
-It must be running on the host to be able to make
-.Tn RPC
-calls
-on a server on that machine.
-.Pp
-When an
-.Tn RPC
-service is started,
-it tells
-.Nm
-the address at which it is listening,
-and the
-.Tn RPC
-program numbers it is prepared to serve.
-When a client wishes to make an
-.Tn RPC
-call to a given program number,
-it first contacts
-.Nm
-on the server machine to determine
-the address where
-.Tn RPC
-requests should be sent.
-.Pp
-.Nm
-should be started before any other RPC service.
-Normally, standard
-.Tn RPC
-servers are started by port monitors, so
-.Nm
-must be started before port monitors are invoked.
-.Pp
-When
-.Nm
-is started, it checks that certain name-to-address
-translation-calls function correctly.
-If they fail, the network configuration databases may be corrupt.
-Since
-.Tn RPC
-services cannot function correctly in this situation,
-.Nm
-reports the condition and terminates.
-.Pp
-.Nm
-can only be started by the super-user.
-.Pp
-Access control is provided by
-.Pa /etc/hosts.allow
-and
-.Pa /etc/hosts.deny ,
-as described in
-.Xr hosts_access 5
-with daemon name
-.Nm .
-.Sh OPTIONS
-.Bl -tag -width Ds
-.It Fl d
-Run in debug mode.
-In this mode,
-.Nm
-will not fork when it starts, will print additional information
-during operation, and will abort on certain errors.
-With this option, the name-to-address translation consistency
-checks are shown in detail.
-.It Fl i
-.Dq insecure
-mode.
-Allows calls to SET and UNSET from any host.
-Normally
-.Nm
-accepts these requests only from the loopback interface for security reasons.
-This change is necessary for programs that were compiled with earlier
-versions of the rpc library and do not make those requests using the
-loopback interface.
-.It Fl l
-Turns on libwrap connection logging.
-.It Fl s
-Causes
-.Nm
-to change to the user daemon as soon as possible.
-This causes
-.Nm
-to use non-privileged ports for outgoing connections, preventing non-privileged
-clients from using
-.Nm
-to connect to services from a privileged port.
-.It Fl L
-Allow old-style local connections over the loopback interface.
-Without this flag, local connections are only allowed over a local socket,
-.Pa /var/run/rpcbind.sock
-.El
-.Sh NOTES
-All RPC servers must be restarted if
-.Nm
-is restarted.
-.Sh FILES
-.Bl -tag -width "/var/run/rpcbind.sock" -compact
-.It Pa /var/run/rpcbind.sock
-.It Pa /etc/hosts.allow
-explicit remote host access list.
-.It Pa /etc/hosts.deny
-explicit remote host denial of service list.
-.El
-.Sh SEE ALSO
-.Xr rpcbind 3 ,
-.Xr hosts_access 5 ,
-.Xr hosts_options 5 ,
-.Xr netconfig 5 ,
-.Xr rpcinfo 8
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.c
deleted file mode 100644
index 492b0b6..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.c
+++ /dev/null
@@ -1,613 +0,0 @@
-/* $NetBSD: rpcbind.c,v 1.4 2013/10/19 17:45:00 christos Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1984 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)rpcbind.c 1.19 94/04/25 SMI" */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)rpcbind.c 1.35 89/04/21 Copyr 1984 Sun Micro";
-#endif
-#endif
-
-/*
- * rpcbind.c
- * Implements the program, version to address mapping for rpc.
- *
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/errno.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-#include <sys/signal.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <rpc/rpc.h>
-#ifdef PORTMAP
-#include <netinet/in.h>
-#endif
-#include <netdb.h>
-#include <stdio.h>
-#include <netconfig.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <err.h>
-#include <util.h>
-#include <pwd.h>
-#include <semaphore.h>
-#include <string.h>
-#include <errno.h>
-#include "rpcbind.h"
-
-#include <rump/rump.h>
-#include <rump/rump_syscalls.h>
-
-/* Global variables */
-int debugging = 1; /* Tell me what's going on */
-int doabort = 0; /* When debugging, do an abort on errors */
-rpcblist_ptr list_rbl; /* A list of version 3/4 rpcbind services */
-
-#include "svc_fdset.h"
-
-/* who to suid to if -s is given */
-#define RUN_AS "daemon"
-
-int runasdaemon = 0;
-int insecure = 0;
-int oldstyle_local = 0;
-int verboselog = 0;
-
-#ifdef WARMSTART
-/* Local Variable */
-static int warmstart = 0; /* Grab a old copy of registrations */
-#endif
-
-#ifdef PORTMAP
-struct pmaplist *list_pml; /* A list of version 2 rpcbind services */
-const char *udptrans; /* Name of UDP transport */
-const char *tcptrans; /* Name of TCP transport */
-const char *udp_uaddr; /* Universal UDP address */
-const char *tcp_uaddr; /* Universal TCP address */
-#endif
-static const char servname[] = "sunrpc";
-
-const char rpcbind_superuser[] = "superuser";
-const char rpcbind_unknown[] = "unknown";
-
-static int init_transport(struct netconfig *);
-static void rbllist_add(rpcprog_t, rpcvers_t, struct netconfig *,
- struct netbuf *);
-static void terminate(int);
-#if 0
-static void parseargs(int, char *[]);
-#endif
-
-int rpcbind_main(void *);
-int
-rpcbind_main(void *arg)
-{
- struct netconfig *nconf;
- void *nc_handle; /* Net config handle */
- struct rlimit rl;
- int maxrec = RPC_MAXDATASIZE;
- extern sem_t gensem;
-
-#if 0
- parseargs(argc, argv);
-#endif
-
- alloc_fdset();
-
- getrlimit(RLIMIT_NOFILE, &rl);
- if (rl.rlim_cur < 128) {
- if (rl.rlim_max <= 128)
- rl.rlim_cur = rl.rlim_max;
- else
- rl.rlim_cur = 128;
- setrlimit(RLIMIT_NOFILE, &rl);
- }
-#if 0
- if (geteuid()) /* This command allowed only to root */
- errx(1, "Sorry. You are not superuser");
-#endif
- nc_handle = setnetconfig(); /* open netconfig file */
- if (nc_handle == NULL)
- errx(1, "could not read /etc/netconfig");
-#ifdef PORTMAP
- udptrans = "";
- tcptrans = "";
-#endif
-
- nconf = getnetconfigent("local");
- if (nconf == NULL)
- errx(1, "can't find local transport");
-
- rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec);
-
- init_transport(nconf);
-
- while ((nconf = getnetconfig(nc_handle))) {
- if (nconf->nc_flag & NC_VISIBLE)
- init_transport(nconf);
- }
- endnetconfig(nc_handle);
-
- /* catch the usual termination signals for graceful exit */
- (void) signal(SIGCHLD, reap);
- (void) signal(SIGINT, terminate);
- (void) signal(SIGTERM, terminate);
- (void) signal(SIGQUIT, terminate);
- /* ignore others that could get sent */
- (void) signal(SIGPIPE, SIG_IGN);
- //(void) signal(SIGHUP, SIG_IGN); used by mountd
- (void) signal(SIGUSR1, SIG_IGN);
- (void) signal(SIGUSR2, SIG_IGN);
-#ifdef WARMSTART
- if (warmstart) {
- read_warmstart();
- }
-#endif
- if (debugging) {
- printf("rpcbind debugging enabled.");
- if (doabort) {
- printf(" Will abort on errors!\n");
- } else {
- printf("\n");
- }
- } else {
- if (daemon(0, 0))
- err(1, "fork failed");
- }
-
- openlog("rpcbind", 0, LOG_DAEMON);
- pidfile(NULL);
-
- if (runasdaemon) {
- struct passwd *p;
-
- if((p = getpwnam(RUN_AS)) == NULL) {
- syslog(LOG_ERR, "cannot get uid of daemon: %m");
- exit(1);
- }
- if (setuid(p->pw_uid) == -1) {
- syslog(LOG_ERR, "setuid to daemon failed: %m");
- exit(1);
- }
- }
-
- network_init();
-
- sem_post(&gensem);
- my_svc_run();
- syslog(LOG_ERR, "svc_run returned unexpectedly");
- rpcbind_abort();
- /* NOTREACHED */
-
- return 0;
-}
-
-/*
- * Adds the entry into the rpcbind database.
- * If PORTMAP, then for UDP and TCP, it adds the entries for version 2 also
- * Returns 0 if succeeds, else fails
- */
-static int
-init_transport(struct netconfig *nconf)
-{
- int fd;
- struct t_bind taddr;
- struct addrinfo hints, *res = NULL;
- struct __rpc_sockinfo si;
- SVCXPRT *my_xprt;
- int aicode, status, addrlen;
- struct sockaddr *sa;
- struct sockaddr_un sun;
- const int one = 1;
-
- if ((nconf->nc_semantics != NC_TPI_CLTS) &&
- (nconf->nc_semantics != NC_TPI_COTS) &&
- (nconf->nc_semantics != NC_TPI_COTS_ORD))
- return 1; /* not my type */
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- int i;
- char **s;
-
- (void)fprintf(stderr, "%s: %ld lookup routines :\n",
- nconf->nc_netid, nconf->nc_nlookups);
- for (i = 0, s = nconf->nc_lookups; i < nconf->nc_nlookups;
- i++, s++)
- (void)fprintf(stderr, "[%d] - %s\n", i, *s);
- }
-#endif
-
- /*
- * XXX - using RPC library internal functions.
- */
- if ((fd = __rpc_nconf2fd(nconf)) < 0) {
- if (errno == EAFNOSUPPORT)
- return 1;
- warn("Cannot create socket for `%s'", nconf->nc_netid);
- return 1;
- }
-
- if (!__rpc_nconf2sockinfo(nconf, &si)) {
- warnx("Cannot get information for `%s'", nconf->nc_netid);
- return 1;
- }
-
- if (si.si_af == AF_INET6) {
- /*
- * We're doing host-based access checks here, so don't allow
- * v4-in-v6 to confuse things.
- */
- if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &one,
- sizeof one) < 0) {
- warn("Can't make socket ipv6 only");
- return 1;
- }
- }
-
-
- if (!strcmp(nconf->nc_netid, "local")) {
- (void)memset(&sun, 0, sizeof sun);
- sun.sun_family = AF_LOCAL;
- (void)rump_sys_unlink(_PATH_RPCBINDSOCK);
- (void)strlcpy(sun.sun_path, _PATH_RPCBINDSOCK,
- sizeof(sun.sun_path));
- sun.sun_len = SUN_LEN(&sun);
- addrlen = sizeof(struct sockaddr_un);
- sa = (struct sockaddr *)&sun;
- } else {
- /* Get rpcbind's address on this transport */
-
- (void)memset(&hints, 0, sizeof hints);
- hints.ai_flags = AI_PASSIVE;
- hints.ai_family = si.si_af;
- hints.ai_socktype = si.si_socktype;
- hints.ai_protocol = si.si_proto;
- if ((aicode = getaddrinfo(NULL, servname, &hints, &res)) != 0) {
- warnx("Cannot get local address for `%s' (%s)",
- nconf->nc_netid, gai_strerror(aicode));
- return 1;
- }
- addrlen = res->ai_addrlen;
- sa = (struct sockaddr *)res->ai_addr;
- }
-
- if (bind(fd, sa, addrlen) < 0) {
- warn("Cannot bind `%s'", nconf->nc_netid);
- if (res != NULL)
- freeaddrinfo(res);
- return 1;
- }
-#if 0
- if (sa->sa_family == AF_LOCAL)
- if (rump_sys_chmod(sun.sun_path, S_IRWXU|S_IRWXG|S_IRWXO) == -1)
- warn("Cannot chmod `%s'", sun.sun_path);
-#endif
-
- /* Copy the address */
- taddr.addr.len = taddr.addr.maxlen = addrlen;
- taddr.addr.buf = malloc(addrlen);
- if (taddr.addr.buf == NULL) {
- warn("Cannot allocate memory for `%s' address",
- nconf->nc_netid);
- if (res != NULL)
- freeaddrinfo(res);
- return 1;
- }
- (void)memcpy(taddr.addr.buf, sa, addrlen);
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- /* for debugging print out our universal address */
- char *uaddr;
- struct netbuf nb;
-
- nb.buf = sa;
- nb.len = nb.maxlen = sa->sa_len;
- uaddr = taddr2uaddr(nconf, &nb);
- (void)fprintf(stderr, "rpcbind: my address is %s\n", uaddr);
- (void)free(uaddr);
- }
-#endif
-
- if (res != NULL)
- freeaddrinfo(res);
-
- if (nconf->nc_semantics != NC_TPI_CLTS)
- listen(fd, SOMAXCONN);
-
- my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE,
- RPC_MAXDATASIZE);
- if (my_xprt == NULL) {
- warnx("Could not create service for `%s'", nconf->nc_netid);
- goto error;
- }
-
-#ifdef PORTMAP
- /*
- * Register both the versions for tcp/ip, udp/ip and local.
- */
- if ((strcmp(nconf->nc_protofmly, NC_INET) == 0 &&
- (strcmp(nconf->nc_proto, NC_TCP) == 0 ||
- strcmp(nconf->nc_proto, NC_UDP) == 0)) ||
- strcmp(nconf->nc_netid, "local") == 0) {
- struct pmaplist *pml;
-
- if (!svc_register(my_xprt, PMAPPROG, PMAPVERS,
- pmap_service, 0)) {
- warn("Could not register on `%s'", nconf->nc_netid);
- goto error;
- }
- pml = malloc(sizeof (struct pmaplist));
- if (pml == NULL) {
- warn("Cannot allocate memory");
- goto error;
- }
- pml->pml_map.pm_prog = PMAPPROG;
- pml->pml_map.pm_vers = PMAPVERS;
- pml->pml_map.pm_port = PMAPPORT;
- if (strcmp(nconf->nc_proto, NC_TCP) == 0) {
- if (tcptrans[0]) {
- warnx(
- "Cannot have more than one TCP transport");
- free(pml);
- goto error;
- }
- tcptrans = strdup(nconf->nc_netid);
- if (tcptrans == NULL) {
- free(pml);
- warn("Cannot allocate memory");
- goto error;
- }
- pml->pml_map.pm_prot = IPPROTO_TCP;
-
- /* Let's snarf the universal address */
- /* "h1.h2.h3.h4.p1.p2" */
- tcp_uaddr = taddr2uaddr(nconf, &taddr.addr);
- } else if (strcmp(nconf->nc_proto, NC_UDP) == 0) {
- if (udptrans[0]) {
- free(pml);
- warnx(
- "Cannot have more than one UDP transport");
- goto error;
- }
- udptrans = strdup(nconf->nc_netid);
- if (udptrans == NULL) {
- free(pml);
- warn("Cannot allocate memory");
- goto error;
- }
- pml->pml_map.pm_prot = IPPROTO_UDP;
-
- /* Let's snarf the universal address */
- /* "h1.h2.h3.h4.p1.p2" */
- udp_uaddr = taddr2uaddr(nconf, &taddr.addr);
- }
- pml->pml_next = list_pml;
- list_pml = pml;
-
- /* Add version 3 information */
- pml = malloc(sizeof (struct pmaplist));
- if (pml == NULL) {
- warn("Cannot allocate memory");
- goto error;
- }
- pml->pml_map = list_pml->pml_map;
- pml->pml_map.pm_vers = RPCBVERS;
- pml->pml_next = list_pml;
- list_pml = pml;
-
- /* Add version 4 information */
- pml = malloc(sizeof (struct pmaplist));
- if (pml == NULL) {
- warn("Cannot allocate memory");
- goto error;
- }
- pml->pml_map = list_pml->pml_map;
- pml->pml_map.pm_vers = RPCBVERS4;
- pml->pml_next = list_pml;
- list_pml = pml;
-
- /* Also add version 2 stuff to rpcbind list */
- rbllist_add(PMAPPROG, PMAPVERS, nconf, &taddr.addr);
- }
-#endif
-
- /* version 3 registration */
- if (!svc_reg(my_xprt, RPCBPROG, RPCBVERS, rpcb_service_3, NULL)) {
- warn("Could not register %s version 3", nconf->nc_netid);
- goto error;
- }
- rbllist_add(RPCBPROG, RPCBVERS, nconf, &taddr.addr);
-
- /* version 4 registration */
- if (!svc_reg(my_xprt, RPCBPROG, RPCBVERS4, rpcb_service_4, NULL)) {
- warn("Could not register %s version 4", nconf->nc_netid);
- goto error;
- }
- rbllist_add(RPCBPROG, RPCBVERS4, nconf, &taddr.addr);
-
- /* decide if bound checking works for this transport */
- status = add_bndlist(nconf, &taddr.addr);
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- if (status < 0) {
- fprintf(stderr, "Error in finding bind status for %s\n",
- nconf->nc_netid);
- } else if (status == 0) {
- fprintf(stderr, "check binding for %s\n",
- nconf->nc_netid);
- } else if (status > 0) {
- fprintf(stderr, "No check binding for %s\n",
- nconf->nc_netid);
- }
- }
-#else
- __USE(status);
-#endif
- /*
- * rmtcall only supported on CLTS transports for now.
- */
- if (nconf->nc_semantics == NC_TPI_CLTS) {
- status = create_rmtcall_fd(nconf);
-
-#ifdef RPCBIND_DEBUG
- if (debugging) {
- if (status < 0) {
- fprintf(stderr,
- "Could not create rmtcall fd for %s\n",
- nconf->nc_netid);
- } else {
- fprintf(stderr, "rmtcall fd for %s is %d\n",
- nconf->nc_netid, status);
- }
- }
-#endif
- }
- return (0);
-error:
- (void)rump_sys_close(fd);
- return (1);
-}
-
-static void
-rbllist_add(rpcprog_t prog, rpcvers_t vers, struct netconfig *nconf,
- struct netbuf *addr)
-{
- rpcblist_ptr rbl;
-
- rbl = malloc(sizeof(rpcblist));
- if (rbl == NULL) {
- warn("Out of memory");
- return;
- }
-
- rbl->rpcb_map.r_prog = prog;
- rbl->rpcb_map.r_vers = vers;
- rbl->rpcb_map.r_netid = strdup(nconf->nc_netid);
- rbl->rpcb_map.r_addr = taddr2uaddr(nconf, addr);
- rbl->rpcb_map.r_owner = strdup(rpcbind_superuser);
- rbl->rpcb_next = list_rbl; /* Attach to global list */
- list_rbl = rbl;
-}
-
-/*
- * Catch the signal and die
- */
-static void
-terminate(int dummy)
-{
-#ifdef WARMSTART
- syslog(LOG_ERR,
- "rpcbind terminating on signal. Restart with \"rpcbind -w\"");
- write_warmstart(); /* Dump yourself */
-#endif
- exit(2);
-}
-
-void
-rpcbind_abort()
-{
-#ifdef WARMSTART
- write_warmstart(); /* Dump yourself */
-#endif
- abort();
-}
-
-#if 0
-/* get command line options */
-static void
-parseargs(int argc, char *argv[])
-{
- int c;
-
- while ((c = getopt(argc, argv, "dwailLs")) != -1) {
- switch (c) {
- case 'a':
- doabort = 1; /* when debugging, do an abort on */
- break; /* errors; for rpcbind developers */
- /* only! */
- case 'd':
- debugging = 1;
- break;
- case 'i':
- insecure = 1;
- break;
- case 'L':
- oldstyle_local = 1;
- break;
- case 'l':
- verboselog = 1;
- break;
- case 's':
- runasdaemon = 1;
- break;
-#ifdef WARMSTART
- case 'w':
- warmstart = 1;
- break;
-#endif
- default: /* error */
- fprintf(stderr, "usage: rpcbind [-Idwils]\n");
- exit (1);
- }
- }
- if (doabort && !debugging) {
- fprintf(stderr,
- "-a (abort) specified without -d (debugging) -- ignored.\n");
- doabort = 0;
- }
-}
-#endif
-
-void
-reap(int dummy)
-{
- int save_errno = errno;
-
- while (wait3(NULL, WNOHANG, NULL) > 0)
- ;
- errno = save_errno;
-}
-
-void
-toggle_verboselog(int dummy)
-{
- verboselog = !verboselog;
-}
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.h b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.h
deleted file mode 100644
index 1717e31..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/rpcbind.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* $NetBSD: rpcbind.h,v 1.1 2010/07/26 15:53:00 pooka Exp $ */
-
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/* #ident "@(#)rpcbind.h 1.4 90/04/12 SMI" */
-
-/*
- * rpcbind.h
- * The common header declarations
- */
-
-#ifndef rpcbind_h
-#define rpcbind_h
-
-#ifdef PORTMAP
-#include <rpc/pmap_prot.h>
-#endif
-#include <rpc/rpcb_prot.h>
-
-/*
- * Stuff for the rmtcall service
- */
-struct encap_parms {
- u_int32_t arglen;
- char *args;
-};
-
-struct r_rmtcall_args {
- u_int32_t rmt_prog;
- u_int32_t rmt_vers;
- u_int32_t rmt_proc;
- int rmt_localvers; /* whether to send port # or uaddr */
- char *rmt_uaddr;
- struct encap_parms rmt_args;
-};
-
-extern int debugging;
-extern int doabort;
-extern int verboselog;
-extern int insecure;
-extern int oldstyle_local;
-extern rpcblist_ptr list_rbl; /* A list of version 3 & 4 rpcbind services */
-
-#ifdef PORTMAP
-extern struct pmaplist *list_pml; /* A list of version 2 rpcbind services */
-extern const char *udptrans; /* Name of UDP transport */
-extern const char *tcptrans; /* Name of TCP transport */
-extern const char *udp_uaddr; /* Universal UDP address */
-extern const char *tcp_uaddr; /* Universal TCP address */
-#endif
-
-extern const char rpcbind_superuser[];
-extern const char rpcbind_unknown[];
-
-int add_bndlist(struct netconfig *, struct netbuf *);
-bool_t is_bound(const char *, const char *);
-char *mergeaddr(SVCXPRT *, char *, char *, char *);
-struct netconfig *rpcbind_get_conf(const char *);
-
-void rpcbs_init(void);
-void rpcbs_procinfo(rpcvers_t, rpcproc_t);
-void rpcbs_set(rpcvers_t, bool_t);
-void rpcbs_unset(rpcvers_t, bool_t);
-void rpcbs_getaddr(rpcvers_t, rpcprog_t, rpcvers_t, const char *, const char *);
-void rpcbs_rmtcall(rpcvers_t, rpcproc_t, rpcprog_t, rpcvers_t, rpcproc_t,
- char *, rpcblist_ptr);
-void *rpcbproc_getstat(void *, struct svc_req *, SVCXPRT *, rpcvers_t);
-
-void rpcb_service_3(struct svc_req *, SVCXPRT *);
-void rpcb_service_4(struct svc_req *, SVCXPRT *);
-
-/* Common functions shared between versions */
-void *rpcbproc_set_com(void *, struct svc_req *, SVCXPRT *, rpcvers_t);
-void *rpcbproc_unset_com(void *, struct svc_req *, SVCXPRT *, rpcvers_t);
-bool_t map_set(RPCB *, char *);
-bool_t map_unset(RPCB *, const char *);
-void delete_prog(int);
-void *rpcbproc_getaddr_com(RPCB *, struct svc_req *, SVCXPRT *, rpcvers_t,
- rpcvers_t);
-void *rpcbproc_gettime_com(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-void *rpcbproc_uaddr2taddr_com(void *, struct svc_req *,
- SVCXPRT *, rpcvers_t);
-void *rpcbproc_taddr2uaddr_com(void *, struct svc_req *, SVCXPRT *,
- rpcvers_t);
-int create_rmtcall_fd(struct netconfig *);
-void rpcbproc_callit_com(struct svc_req *, SVCXPRT *, rpcvers_t,
- rpcvers_t);
-void my_svc_run(void);
-
-void rpcbind_abort(void);
-void reap(int);
-void toggle_verboselog(int);
-
-int check_access(SVCXPRT *, rpcproc_t, void *, int);
-int check_callit(SVCXPRT *, struct r_rmtcall_args *, int);
-void logit(int, struct sockaddr *, rpcproc_t, rpcprog_t, const char *);
-int is_loopback(struct netbuf *);
-
-#ifdef PORTMAP
-extern void pmap_service(struct svc_req *, SVCXPRT *);
-#endif
-
-void write_warmstart(void);
-void read_warmstart(void);
-
-char *addrmerge(struct netbuf *caller, char *serv_uaddr, char *clnt_uaddr,
- char *netid);
-void network_init(void);
-struct sockaddr *local_sa(int);
-
-/* For different getaddr semantics */
-#define RPCB_ALLVERS 0
-#define RPCB_ONEVERS 1
-
-#endif /* rpcbind_h */
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/security.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/security.c
deleted file mode 100644
index 755c0d3..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/security.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/* $NetBSD: security.c,v 1.1 2010/07/26 15:53:01 pooka Exp $ */
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <rpc/rpc.h>
-#include <rpc/rpcb_prot.h>
-#include <rpc/pmap_prot.h>
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <util.h>
-#include <syslog.h>
-#include <netdb.h>
-
-/*
- * XXX for special case checks in check_callit.
- */
-#include <rpcsvc/mount.h>
-#include <rpcsvc/rquota.h>
-#include <rpcsvc/nfs_prot.h>
-#include <rpcsvc/yp.h>
-#include <rpcsvc/ypclnt.h>
-#include <rpcsvc/yppasswd.h>
-
-#include "rpcbind.h"
-
-#ifdef LIBWRAP
-# include <tcpd.h>
-#ifndef LIBWRAP_ALLOW_FACILITY
-# define LIBWRAP_ALLOW_FACILITY LOG_AUTH
-#endif
-#ifndef LIBWRAP_ALLOW_SEVERITY
-# define LIBWRAP_ALLOW_SEVERITY LOG_INFO
-#endif
-#ifndef LIBWRAP_DENY_FACILITY
-# define LIBWRAP_DENY_FACILITY LOG_AUTH
-#endif
-#ifndef LIBWRAP_DENY_SEVERITY
-# define LIBWRAP_DENY_SEVERITY LOG_WARNING
-#endif
-int allow_severity = LIBWRAP_ALLOW_FACILITY|LIBWRAP_ALLOW_SEVERITY;
-int deny_severity = LIBWRAP_DENY_FACILITY|LIBWRAP_DENY_SEVERITY;
-#endif
-
-#ifndef PORTMAP_LOG_FACILITY
-# define PORTMAP_LOG_FACILITY LOG_AUTH
-#endif
-#ifndef PORTMAP_LOG_SEVERITY
-# define PORTMAP_LOG_SEVERITY LOG_INFO
-#endif
-int log_severity = PORTMAP_LOG_FACILITY|PORTMAP_LOG_SEVERITY;
-
-extern int verboselog;
-
-int
-check_access(SVCXPRT *xprt, rpcproc_t proc, void *args, int rpcbvers)
-{
- struct netbuf *caller = svc_getrpccaller(xprt);
- struct sockaddr *addr = (struct sockaddr *)caller->buf;
-#ifdef LIBWRAP
- struct request_info req;
-#endif
- rpcprog_t prog = 0;
- rpcb *rpcbp;
- struct pmap *pmap;
-
- /*
- * The older PMAP_* equivalents have the same numbers, so
- * they are accounted for here as well.
- */
- switch (proc) {
- case RPCBPROC_GETADDR:
- case RPCBPROC_SET:
- case RPCBPROC_UNSET:
- if (rpcbvers > PMAPVERS) {
- rpcbp = (rpcb *)args;
- prog = rpcbp->r_prog;
- } else {
- pmap = (struct pmap *)args;
- prog = pmap->pm_prog;
- }
- if (proc == RPCBPROC_GETADDR)
- break;
- if (!insecure && !is_loopback(caller)) {
- if (verboselog)
- logit(log_severity, addr, proc, prog,
- " declined (non-loopback sender)");
- return 0;
- }
- break;
- case RPCBPROC_CALLIT:
- case RPCBPROC_INDIRECT:
- case RPCBPROC_DUMP:
- case RPCBPROC_GETTIME:
- case RPCBPROC_UADDR2TADDR:
- case RPCBPROC_TADDR2UADDR:
- case RPCBPROC_GETVERSADDR:
- case RPCBPROC_GETADDRLIST:
- case RPCBPROC_GETSTAT:
- default:
- break;
- }
-
-#ifdef LIBWRAP
- if (addr->sa_family == AF_LOCAL)
- return 1;
- request_init(&req, RQ_DAEMON, "rpcbind", RQ_CLIENT_SIN, addr, 0);
- sock_methods(&req);
- if(!hosts_access(&req)) {
- logit(deny_severity, addr, proc, prog, ": request from unauthorized host");
- return 0;
- }
-#endif
- if (verboselog)
- logit(log_severity, addr, proc, prog, "");
- return 1;
-}
-
-int
-is_loopback(struct netbuf *nbuf)
-{
- struct sockaddr *addr = (struct sockaddr *)nbuf->buf;
- struct sockaddr_in *sin;
-#ifdef INET6
- struct sockaddr_in6 *sin6;
-#endif
-
- switch (addr->sa_family) {
- case AF_INET:
- if (!oldstyle_local)
- return 0;
- sin = (struct sockaddr_in *)addr;
- return ((sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) &&
- (ntohs(sin->sin_port) < IPPORT_RESERVED));
-#ifdef INET6
- case AF_INET6:
- if (!oldstyle_local)
- return 0;
- sin6 = (struct sockaddr_in6 *)addr;
- return (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr) &&
- (ntohs(sin6->sin6_port) < IPV6PORT_RESERVED));
-#endif
- case AF_LOCAL:
- return 1;
- default:
- break;
- }
-
- return 0;
-}
-
-
-/* logit - report events of interest via the syslog daemon */
-void
-logit(int severity, struct sockaddr *addr, rpcproc_t procnum, rpcprog_t prognum,
- const char *text)
-{
- const char *procname;
- char procbuf[32];
- char *progname;
- char progbuf[32];
- char fromname[NI_MAXHOST];
- struct rpcent *rpc;
- static const char *procmap[] = {
- /* RPCBPROC_NULL */ "null",
- /* RPCBPROC_SET */ "set",
- /* RPCBPROC_UNSET */ "unset",
- /* RPCBPROC_GETADDR */ "getport/addr",
- /* RPCBPROC_DUMP */ "dump",
- /* RPCBPROC_CALLIT */ "callit",
- /* RPCBPROC_GETTIME */ "gettime",
- /* RPCBPROC_UADDR2TADDR */ "uaddr2taddr",
- /* RPCBPROC_TADDR2UADDR */ "taddr2uaddr",
- /* RPCBPROC_GETVERSADDR */ "getversaddr",
- /* RPCBPROC_INDIRECT */ "indirect",
- /* RPCBPROC_GETADDRLIST */ "getaddrlist",
- /* RPCBPROC_GETSTAT */ "getstat"
- };
-
- /*
- * Fork off a process or the portmap daemon might hang while
- * getrpcbynumber() or syslog() does its thing.
- */
-
- if (fork() == 0) {
- setproctitle("logit");
-
- /* Try to map program number to name. */
-
- if (prognum == 0) {
- progname = __UNCONST("");
- } else if ((rpc = getrpcbynumber((int) prognum))) {
- progname = rpc->r_name;
- } else {
- snprintf(progname = progbuf, sizeof(progbuf), "%u",
- (unsigned)prognum);
- }
-
- /* Try to map procedure number to name. */
-
- if (procnum >= (sizeof procmap / sizeof (char *))) {
- snprintf(procbuf, sizeof procbuf, "%u",
- (unsigned)procnum);
- procname = procbuf;
- } else
- procname = procmap[procnum];
-
- /* Write syslog record. */
-
- if (addr->sa_family == AF_LOCAL)
- strlcpy(fromname, "local", sizeof(fromname));
- else
- getnameinfo(addr, addr->sa_len, fromname,
- sizeof fromname, NULL, 0, NI_NUMERICHOST);
-
- syslog(severity, "connect from %s to %s(%s)%s",
- fromname, procname, progname, text);
- _exit(0);
- }
-}
-
-int
-check_callit(SVCXPRT *xprt, struct r_rmtcall_args *args, int versnum)
-{
- struct sockaddr *sa = (struct sockaddr *)svc_getrpccaller(xprt)->buf;
-
- /*
- * Always allow calling NULLPROC
- */
- if (args->rmt_proc == 0)
- return 1;
-
- /*
- * XXX - this special casing sucks.
- */
- switch (args->rmt_prog) {
- case RPCBPROG:
- /*
- * Allow indirect calls to ourselves in insecure mode.
- * The is_loopback checks aren't useful then anyway.
- */
- if (!insecure)
- goto deny;
- break;
- case MOUNTPROG:
- if (args->rmt_proc != MOUNTPROC_MNT &&
- args->rmt_proc != MOUNTPROC_UMNT)
- break;
- goto deny;
- case YPBINDPROG:
- if (args->rmt_proc != YPBINDPROC_SETDOM)
- break;
- /* FALLTHROUGH */
- case YPPASSWDPROG:
- case NFS_PROGRAM:
- case RQUOTAPROG:
- goto deny;
- case YPPROG:
- switch (args->rmt_proc) {
- case YPPROC_ALL:
- case YPPROC_MATCH:
- case YPPROC_FIRST:
- case YPPROC_NEXT:
- goto deny;
- default:
- break;
- }
- default:
- break;
- }
-
- return 1;
-deny:
- logit(deny_severity, sa, args->rmt_proc, args->rmt_prog,
- ": indirect call not allowed");
-
- return 0;
-}
diff --git a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/util.c b/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/util.c
deleted file mode 100644
index f67e98d..0000000
--- a/contrib/netbsd-tests/fs/nfs/nfsservice/rpcbind/util.c
+++ /dev/null
@@ -1,401 +0,0 @@
-/* $NetBSD: util.c,v 1.2 2011/06/11 18:03:17 christos Exp $ */
-
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Frank van der Linden.
- *
- * 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 <sys/types.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <assert.h>
-#include <ifaddrs.h>
-#include <poll.h>
-#include <rpc/rpc.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <netconfig.h>
-#include <stdio.h>
-#include <arpa/inet.h>
-
-#include <rump/rump.h>
-#include <rump/rump_syscalls.h>
-
-#include "rpcbind.h"
-
-static struct sockaddr_in *local_in4;
-#ifdef INET6
-static struct sockaddr_in6 *local_in6;
-#endif
-
-static int bitmaskcmp(void *, void *, void *, int);
-#ifdef INET6
-static void in6_fillscopeid(struct sockaddr_in6 *);
-#endif
-
-/*
- * For all bits set in "mask", compare the corresponding bits in
- * "dst" and "src", and see if they match.
- */
-static int
-bitmaskcmp(void *dst, void *src, void *mask, int bytelen)
-{
- int i, j;
- u_int8_t *p1 = dst, *p2 = src, *netmask = mask;
- u_int8_t bitmask;
-
- for (i = 0; i < bytelen; i++) {
- for (j = 0; j < 8; j++) {
- bitmask = 1 << j;
- if (!(netmask[i] & bitmask))
- continue;
- if ((p1[i] & bitmask) != (p2[i] & bitmask))
- return 1;
- }
- }
-
- return 0;
-}
-
-/*
- * Taken from ifconfig.c
- */
-#ifdef INET6
-static void
-in6_fillscopeid(struct sockaddr_in6 *sin6)
-{
- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
- sin6->sin6_scope_id =
- ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
- sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
- }
-}
-#endif
-
-char *
-addrmerge(struct netbuf *caller, char *serv_uaddr, char *clnt_uaddr,
- char *netid)
-{
- struct ifaddrs *ifap, *ifp, *bestif;
-#ifdef INET6
- struct sockaddr_in6 *servsin6, *sin6mask, *clntsin6, *ifsin6, *realsin6;
- struct sockaddr_in6 *newsin6;
-#endif
- struct sockaddr_in *servsin, *sinmask, *clntsin, *newsin, *ifsin;
- struct netbuf *serv_nbp, *clnt_nbp = NULL, tbuf;
- struct sockaddr *serv_sa;
- struct sockaddr *clnt_sa;
- struct sockaddr_storage ss;
- struct netconfig *nconf;
- struct sockaddr *clnt = caller->buf;
- char *ret = NULL;
-
-#ifdef INET6
- servsin6 = ifsin6 = newsin6 = NULL; /* XXXGCC -Wuninitialized */
-#endif
- servsin = newsin = NULL; /* XXXGCC -Wuninitialized */
-
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "addrmerge(caller, %s, %s, %s\n", serv_uaddr,
- clnt_uaddr, netid);
-#endif
- nconf = getnetconfigent(netid);
- if (nconf == NULL)
- return NULL;
-
- /*
- * Local merge, just return a duplicate.
- */
- if (clnt_uaddr != NULL && strncmp(clnt_uaddr, "0.0.0.0.", 8) == 0)
- return strdup(clnt_uaddr);
-
- serv_nbp = uaddr2taddr(nconf, serv_uaddr);
- if (serv_nbp == NULL)
- return NULL;
-
- serv_sa = (struct sockaddr *)serv_nbp->buf;
- if (clnt_uaddr != NULL) {
- clnt_nbp = uaddr2taddr(nconf, clnt_uaddr);
- if (clnt_nbp == NULL) {
- free(serv_nbp);
- return NULL;
- }
- clnt_sa = (struct sockaddr *)clnt_nbp->buf;
- if (clnt_sa->sa_family == AF_LOCAL) {
- free(serv_nbp);
- free(clnt_nbp);
- free(clnt_sa);
- return strdup(serv_uaddr);
- }
- } else {
- clnt_sa = (struct sockaddr *)
- malloc(sizeof (struct sockaddr_storage));
- memcpy(clnt_sa, clnt, clnt->sa_len);
- }
-
- if (getifaddrs(&ifp) < 0) {
- free(serv_nbp);
- free(clnt_sa);
- if (clnt_nbp != NULL)
- free(clnt_nbp);
- return 0;
- }
-
- /*
- * Loop through all interfaces. For each interface, see if the
- * network portion of its address is equal to that of the client.
- * If so, we have found the interface that we want to use.
- */
- for (ifap = ifp; ifap != NULL; ifap = ifap->ifa_next) {
- if (ifap->ifa_addr->sa_family != clnt->sa_family ||
- !(ifap->ifa_flags & IFF_UP))
- continue;
-
- switch (clnt->sa_family) {
- case AF_INET:
- /*
- * realsin: address that recvfrom gave us.
- * ifsin: address of interface being examined.
- * clntsin: address that client want us to contact
- * it on
- * servsin: local address of RPC service.
- * sinmask: netmask of this interface
- * newsin: initially a copy of clntsin, eventually
- * the merged address
- */
- servsin = (struct sockaddr_in *)serv_sa;
- clntsin = (struct sockaddr_in *)clnt_sa;
- sinmask = (struct sockaddr_in *)ifap->ifa_netmask;
- newsin = (struct sockaddr_in *)&ss;
- ifsin = (struct sockaddr_in *)ifap->ifa_addr;
- if (!bitmaskcmp(&ifsin->sin_addr, &clntsin->sin_addr,
- &sinmask->sin_addr, sizeof (struct in_addr))) {
- goto found;
- }
- break;
-#ifdef INET6
- case AF_INET6:
- /*
- * realsin6: address that recvfrom gave us.
- * ifsin6: address of interface being examined.
- * clntsin6: address that client want us to contact
- * it on
- * servsin6: local address of RPC service.
- * sin6mask: netmask of this interface
- * newsin6: initially a copy of clntsin, eventually
- * the merged address
- *
- * For v6 link local addresses, if the client contacted
- * us via a link-local address, and wants us to reply
- * to one, use the scope id to see which one.
- */
- realsin6 = (struct sockaddr_in6 *)clnt;
- ifsin6 = (struct sockaddr_in6 *)ifap->ifa_addr;
- in6_fillscopeid(ifsin6);
- clntsin6 = (struct sockaddr_in6 *)clnt_sa;
- servsin6 = (struct sockaddr_in6 *)serv_sa;
- sin6mask = (struct sockaddr_in6 *)ifap->ifa_netmask;
- newsin6 = (struct sockaddr_in6 *)&ss;
- if (IN6_IS_ADDR_LINKLOCAL(&ifsin6->sin6_addr) &&
- IN6_IS_ADDR_LINKLOCAL(&realsin6->sin6_addr) &&
- IN6_IS_ADDR_LINKLOCAL(&clntsin6->sin6_addr)) {
- if (ifsin6->sin6_scope_id !=
- realsin6->sin6_scope_id)
- continue;
- goto found;
- }
- if (!bitmaskcmp(&ifsin6->sin6_addr,
- &clntsin6->sin6_addr, &sin6mask->sin6_addr,
- sizeof (struct in6_addr)))
- goto found;
- break;
-#endif
- default:
- goto freeit;
- }
- }
- /*
- * Didn't find anything. Get the first possibly useful interface,
- * preferring "normal" interfaces to point-to-point and loopback
- * ones.
- */
- bestif = NULL;
- for (ifap = ifp; ifap != NULL; ifap = ifap->ifa_next) {
- if (ifap->ifa_addr->sa_family != clnt->sa_family ||
- !(ifap->ifa_flags & IFF_UP))
- continue;
- if (!(ifap->ifa_flags & IFF_LOOPBACK) &&
- !(ifap->ifa_flags & IFF_POINTOPOINT)) {
- bestif = ifap;
- break;
- }
- if (bestif == NULL)
- bestif = ifap;
- else if ((bestif->ifa_flags & IFF_LOOPBACK) &&
- !(ifap->ifa_flags & IFF_LOOPBACK))
- bestif = ifap;
- }
- ifap = bestif;
-found:
- switch (clnt->sa_family) {
- case AF_INET:
- memcpy(newsin, ifap->ifa_addr, clnt_sa->sa_len);
- newsin->sin_port = servsin->sin_port;
- tbuf.len = clnt_sa->sa_len;
- tbuf.maxlen = sizeof (struct sockaddr_storage);
- tbuf.buf = newsin;
- break;
-#ifdef INET6
- case AF_INET6:
- assert(newsin6);
- memcpy(newsin6, ifsin6, clnt_sa->sa_len);
- newsin6->sin6_port = servsin6->sin6_port;
- tbuf.maxlen = sizeof (struct sockaddr_storage);
- tbuf.len = clnt_sa->sa_len;
- tbuf.buf = newsin6;
- break;
-#endif
- default:
- goto freeit;
- }
- if (ifap != NULL)
- ret = taddr2uaddr(nconf, &tbuf);
-freeit:
- freenetconfigent(nconf);
- free(serv_sa);
- free(serv_nbp);
- if (clnt_sa != NULL)
- free(clnt_sa);
- if (clnt_nbp != NULL)
- free(clnt_nbp);
- freeifaddrs(ifp);
-
-#ifdef RPCBIND_DEBUG
- if (debugging)
- fprintf(stderr, "addrmerge: returning %s\n", ret);
-#endif
- return ret;
-}
-
-void
-network_init()
-{
-#ifdef INET6
- struct ifaddrs *ifap, *ifp;
- struct ipv6_mreq mreq6;
- int ifindex, s;
-#endif
- int ecode;
- struct addrinfo hints, *res;
-
- memset(&hints, 0, sizeof hints);
- hints.ai_family = AF_INET;
- if ((ecode = getaddrinfo(NULL, "sunrpc", &hints, &res))) {
- if (debugging)
- fprintf(stderr, "can't get local ip4 address: %s\n",
- gai_strerror(ecode));
- } else {
- local_in4 = (struct sockaddr_in *)malloc(sizeof *local_in4);
- if (local_in4 == NULL) {
- if (debugging)
- fprintf(stderr, "can't alloc local ip4 addr\n");
- }
- memcpy(local_in4, res->ai_addr, sizeof *local_in4);
- }
-
-#ifdef INET6
- hints.ai_family = AF_INET6;
- if ((ecode = getaddrinfo(NULL, "sunrpc", &hints, &res))) {
- if (debugging)
- fprintf(stderr, "can't get local ip6 address: %s\n",
- gai_strerror(ecode));
- } else {
- local_in6 = (struct sockaddr_in6 *)malloc(sizeof *local_in6);
- if (local_in6 == NULL) {
- if (debugging)
- fprintf(stderr, "can't alloc local ip6 addr\n");
- }
- memcpy(local_in6, res->ai_addr, sizeof *local_in6);
- }
-
- /*
- * Now join the RPC ipv6 multicast group on all interfaces.
- */
- if (getifaddrs(&ifp) < 0)
- return;
-
- mreq6.ipv6mr_interface = 0;
- inet_pton(AF_INET6, RPCB_MULTICAST_ADDR, &mreq6.ipv6mr_multiaddr);
-
- s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
-
- /*
- * Loop through all interfaces. For each interface, see if the
- * network portion of its address is equal to that of the client.
- * If so, we have found the interface that we want to use.
- */
- for (ifap = ifp; ifap != NULL; ifap = ifap->ifa_next) {
- if (ifap->ifa_addr->sa_family != AF_INET6 ||
- !(ifap->ifa_flags & IFF_MULTICAST))
- continue;
- ifindex = if_nametoindex(ifap->ifa_name);
- if (ifindex == mreq6.ipv6mr_interface)
- /*
- * Already did this one.
- */
- continue;
- mreq6.ipv6mr_interface = ifindex;
- if (setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq6,
- sizeof mreq6) < 0)
- if (debugging)
- warn("setsockopt v6 multicast");
- }
-#endif
-
- /* close(s); */
-}
-
-struct sockaddr *
-local_sa(int af)
-{
- switch (af) {
- case AF_INET:
- return (struct sockaddr *)local_in4;
-#ifdef INET6
- case AF_INET6:
- return (struct sockaddr *)local_in6;
-#endif
- default:
- return NULL;
- }
-}
diff --git a/contrib/netbsd-tests/lib/libc/gen/t_dir.c b/contrib/netbsd-tests/lib/libc/gen/t_dir.c
index 81412c1..b37d89d 100644
--- a/contrib/netbsd-tests/lib/libc/gen/t_dir.c
+++ b/contrib/netbsd-tests/lib/libc/gen/t_dir.c
@@ -39,6 +39,10 @@
#include <sys/stat.h>
+#ifdef __FreeBSD__
+#include <errno.h>
+#endif
+
ATF_TC(seekdir_basic);
ATF_TC_HEAD(seekdir_basic, tc)
{
@@ -54,10 +58,26 @@ ATF_TC_BODY(seekdir_basic, tc)
struct dirent *entry;
long here;
+#ifdef __FreeBSD__
+#define CREAT(x, m) do { \
+ int _creat_fd; \
+ ATF_REQUIRE_MSG((_creat_fd = creat((x), (m))) != -1, \
+ "creat(%s, %x) failed: %s", (x), (m), \
+ strerror(errno)); \
+ (void)close(_creat_fd); \
+ } while(0);
+
+ ATF_REQUIRE_MSG(mkdir("t", 0755) == 0,
+ "mkdir failed: %s", strerror(errno));
+ CREAT("t/a", 0600);
+ CREAT("t/b", 0600);
+ CREAT("t/c", 0600);
+#else
mkdir("t", 0755);
creat("t/a", 0600);
creat("t/b", 0600);
creat("t/c", 0600);
+#endif
dp = opendir("t");
if ( dp == NULL)
@@ -70,9 +90,17 @@ ATF_TC_BODY(seekdir_basic, tc)
/* get first entry */
entry = readdir(dp);
here = telldir(dp);
+#ifdef __FreeBSD__
+ ATF_REQUIRE_MSG(here != -1,
+ "telldir failed: %s", strerror(errno));
+#endif
/* get second entry */
entry = readdir(dp);
+#ifdef __FreeBSD__
+ ATF_REQUIRE_MSG(entry != NULL,
+ "readdir failed: %s", strerror(errno));
+#endif
wasname = strdup(entry->d_name);
if (wasname == NULL)
atf_tc_fail("cannot allocate memory");
@@ -109,6 +137,9 @@ ATF_TC_BODY(seekdir_basic, tc)
atf_tc_fail("3rd seekdir found wrong name");
closedir(dp);
+#ifdef __FreeBSD__
+ free(wasname);
+#endif
}
ATF_TC(telldir_leak);
diff --git a/contrib/netbsd-tests/lib/libc/gen/t_raise.c b/contrib/netbsd-tests/lib/libc/gen/t_raise.c
index d6f888f..91a8c37 100644
--- a/contrib/netbsd-tests/lib/libc/gen/t_raise.c
+++ b/contrib/netbsd-tests/lib/libc/gen/t_raise.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_raise.c,v 1.5 2011/05/10 12:43:42 jruoho Exp $ */
+/* $NetBSD: t_raise.c,v 1.6 2016/11/03 22:08:31 kamil Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_raise.c,v 1.5 2011/05/10 12:43:42 jruoho Exp $");
+__RCSID("$NetBSD: t_raise.c,v 1.6 2016/11/03 22:08:31 kamil Exp $");
#include <atf-c.h>
@@ -180,7 +180,7 @@ ATF_TC_BODY(raise_stress, tc)
(void)raise(SIGUSR1);
if (count != maxiter)
- atf_tc_fail("not all signals were catched");
+ atf_tc_fail("not all signals were caught");
}
ATF_TP_ADD_TCS(tp)
diff --git a/contrib/netbsd-tests/lib/libc/gen/t_setdomainname.c b/contrib/netbsd-tests/lib/libc/gen/t_setdomainname.c
index f51eb2a..02dd176 100644
--- a/contrib/netbsd-tests/lib/libc/gen/t_setdomainname.c
+++ b/contrib/netbsd-tests/lib/libc/gen/t_setdomainname.c
@@ -64,7 +64,7 @@ ATF_TC_BODY(setdomainname_basic, tc)
(void)memset(name, 0, sizeof(name));
#ifdef __FreeBSD__
- /*
+ /*
* Sanity checks to ensure that the wrong invariant isn't being
* tested for per PR # 181127
*/
diff --git a/contrib/netbsd-tests/lib/libc/gen/t_sethostname.c b/contrib/netbsd-tests/lib/libc/gen/t_sethostname.c
index 1972f7d..136fa7c 100644
--- a/contrib/netbsd-tests/lib/libc/gen/t_sethostname.c
+++ b/contrib/netbsd-tests/lib/libc/gen/t_sethostname.c
@@ -66,7 +66,7 @@ ATF_TC_BODY(sethostname_basic, tc)
(void)memset(name, 0, sizeof(name));
#ifdef __FreeBSD__
- /*
+ /*
* Sanity checks to ensure that the wrong invariant isn't being
* tested for per PR # 181127
*/
diff --git a/contrib/netbsd-tests/lib/libc/regex/debug.c b/contrib/netbsd-tests/lib/libc/regex/debug.c
index 3fc6d5b..22f0b90 100644
--- a/contrib/netbsd-tests/lib/libc/regex/debug.c
+++ b/contrib/netbsd-tests/lib/libc/regex/debug.c
@@ -48,9 +48,7 @@
#ifdef __NetBSD__
static void s_print(struct re_guts *, FILE *);
static char *regchar(int);
-#endif
-#ifdef __NetBSD__
/*
* regprint - print a regexp for debugging
*/
diff --git a/contrib/netbsd-tests/lib/libc/sys/t_select.c b/contrib/netbsd-tests/lib/libc/sys/t_select.c
index 7af725a..437b67b 100644
--- a/contrib/netbsd-tests/lib/libc/sys/t_select.c
+++ b/contrib/netbsd-tests/lib/libc/sys/t_select.c
@@ -135,6 +135,9 @@ child(const struct timespec *ts)
"after timeout %s != %s",
prmask(&nset, nbuf, sizeof(nbuf)),
prmask(&oset, obuf, sizeof(obuf)));
+#ifdef __FreeBSD__
+ _exit(0);
+#endif
}
ATF_TC(pselect_sigmask);
@@ -154,6 +157,9 @@ ATF_TC_BODY(pselect_sigmask, tc)
switch (pid = fork()) {
case 0:
child(NULL);
+#ifdef __FreeBSD__
+ break;
+#endif
case -1:
err(1, "fork");
default:
diff --git a/contrib/netbsd-tests/lib/libc/sys/t_unlink.c b/contrib/netbsd-tests/lib/libc/sys/t_unlink.c
index 8d94668..b504bb0 100644
--- a/contrib/netbsd-tests/lib/libc/sys/t_unlink.c
+++ b/contrib/netbsd-tests/lib/libc/sys/t_unlink.c
@@ -111,8 +111,15 @@ ATF_TC_HEAD(unlink_fifo, tc)
ATF_TC_BODY(unlink_fifo, tc)
{
+#ifdef __FreeBSD__
+ int fd;
+ ATF_REQUIRE_MSG((fd = mkfifo(path, 0666)) == 0,
+ "mkfifo failed: %s", strerror(errno));
+ (void)close(fd);
+#else
ATF_REQUIRE(mkfifo(path, 0666) == 0);
+#endif
ATF_REQUIRE(unlink(path) == 0);
errno = 0;
diff --git a/contrib/netbsd-tests/lib/libc/ttyio/t_ttyio.c b/contrib/netbsd-tests/lib/libc/ttyio/t_ttyio.c
index 1e42536..7f60d78 100644
--- a/contrib/netbsd-tests/lib/libc/ttyio/t_ttyio.c
+++ b/contrib/netbsd-tests/lib/libc/ttyio/t_ttyio.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ttyio.c,v 1.2 2011/04/19 20:07:53 martin Exp $ */
+/* $NetBSD: t_ttyio.c,v 1.3 2017/01/10 01:31:40 christos Exp $ */
/*
* Copyright (c) 2001, 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_ttyio.c,v 1.2 2011/04/19 20:07:53 martin Exp $");
+__RCSID("$NetBSD: t_ttyio.c,v 1.3 2017/01/10 01:31:40 christos Exp $");
#include <sys/types.h>
#include <sys/wait.h>
@@ -150,11 +150,9 @@ ATF_TC_BODY(ioctl, tc)
/* wait for last child */
sa.sa_handler = SIG_DFL;
REQUIRE_ERRNO(sigaction(SIGCHLD, &sa, NULL), -1);
- (void) wait(NULL);
+ (void)wait(NULL);
-#ifdef __FreeBSD__
(void)close(s);
-#endif
ATF_REQUIRE_EQ(rc, 0);
}
diff --git a/contrib/netbsd-tests/lib/libpthread/t_condwait.c b/contrib/netbsd-tests/lib/libpthread/t_condwait.c
index 17bbb89..99793d0 100644
--- a/contrib/netbsd-tests/lib/libpthread/t_condwait.c
+++ b/contrib/netbsd-tests/lib/libpthread/t_condwait.c
@@ -42,6 +42,8 @@ __RCSID("$NetBSD: t_condwait.c,v 1.4 2013/04/12 17:18:11 christos Exp $");
#ifdef __FreeBSD__
#include <sys/time.h>
+
+#include "h_common.h"
#endif
#define WAITTIME 2 /* Timeout wait secound */
@@ -60,8 +62,13 @@ run(void *param)
clck = *(clockid_t *)param;
+#ifdef __FreeBSD__
+ PTHREAD_REQUIRE(pthread_condattr_init(&attr));
+ PTHREAD_REQUIRE(pthread_condattr_setclock(&attr, clck));
+#else
pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, clck); /* MONOTONIC or MONOTONIC */
+#endif
pthread_cond_init(&cond, &attr);
ATF_REQUIRE_EQ((ret = pthread_mutex_lock(&m)), 0);
diff --git a/contrib/netbsd-tests/lib/libpthread/t_fpu.c b/contrib/netbsd-tests/lib/libpthread/t_fpu.c
index 4047b1f..6a385d9 100644
--- a/contrib/netbsd-tests/lib/libpthread/t_fpu.c
+++ b/contrib/netbsd-tests/lib/libpthread/t_fpu.c
@@ -58,6 +58,11 @@ __RCSID("$NetBSD: t_fpu.c,v 1.2 2013/01/27 14:47:37 mbalmer Exp $");
#include <atf-c.h>
+#ifdef __FreeBSD__
+#include <errno.h>
+#include <string.h>
+#endif
+
#include "h_common.h"
#define N_RECURSE 10
@@ -77,14 +82,24 @@ stir(void *p)
for (;;) {
x = sin ((y = cos (x + y + .4)) - (z = cos (x + z + .6)));
+#ifdef __FreeBSD__
+ ATF_REQUIRE_MSG(sched_yield() == 0,
+ "sched_yield failed: %s", strerror(errno));
+#else
PTHREAD_REQUIRE(sched_yield());
+#endif
}
}
static double
mul3(double x, double y, double z)
{
+#ifdef __FreeBSD__
+ ATF_REQUIRE_MSG(sched_yield() == 0,
+ "sched_yield failed: %s", strerror(errno));
+#else
PTHREAD_REQUIRE(sched_yield());
+#endif
return x * y * z;
}
@@ -114,7 +129,11 @@ bar(void *p)
static void
recurse(void) {
pthread_t s2;
+#ifdef __FreeBSD__
+ PTHREAD_REQUIRE(pthread_create(&s2, 0, bar, 0));
+#else
pthread_create(&s2, 0, bar, 0);
+#endif
sleep(20); /* XXX must be long enough for our slowest machine */
}
@@ -134,7 +153,11 @@ ATF_TC_BODY(fpu, tc)
PTHREAD_REQUIRE(pthread_mutex_init(&recursion_depth_lock, 0));
+#ifdef __FreeBSD__
+ PTHREAD_REQUIRE(pthread_create(&s5, 0, stir, stirseed));
+#else
pthread_create(&s5, 0, stir, stirseed);
+#endif
recurse();
atf_tc_fail("exiting from main");
OpenPOWER on IntegriCloud