Module Name: src
Committed By: christos
Date: Sun Nov 8 16:36:28 UTC 2015
Modified Files:
src/usr.sbin/rpcbind: check_bound.c pmap_svc.c rpcb_svc_com.c rpcbind.c
util.c
Log Message:
merge RUMP changes.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/usr.sbin/rpcbind/check_bound.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/rpcbind/pmap_svc.c
cvs rdiff -u -r1.16 -r1.17 src/usr.sbin/rpcbind/rpcb_svc_com.c
cvs rdiff -u -r1.22 -r1.23 src/usr.sbin/rpcbind/rpcbind.c
cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/rpcbind/util.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/rpcbind/check_bound.c
diff -u src/usr.sbin/rpcbind/check_bound.c:1.5 src/usr.sbin/rpcbind/check_bound.c:1.6
--- src/usr.sbin/rpcbind/check_bound.c:1.5 Mon Aug 27 15:53:33 2007
+++ src/usr.sbin/rpcbind/check_bound.c Sun Nov 8 11:36:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: check_bound.c,v 1.5 2007/08/27 19:53:33 dsl Exp $ */
+/* $NetBSD: check_bound.c,v 1.6 2015/11/08 16:36:28 christos Exp $ */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
@@ -57,6 +57,11 @@ static char sccsid[] = "@(#)check_bound.
#include <unistd.h>
#include <stdlib.h>
+#ifdef RPCBIND_RUMP
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+#endif
+
#include "rpcbind.h"
struct fdlist {
@@ -99,7 +104,11 @@ check_bound(struct fdlist *fdl, const ch
ans = bind(fd, (struct sockaddr *)na->buf, na->len);
+#ifdef RPCBIND_RUMP
+ rump_sys_close(fd);
+#else
close(fd);
+#endif
free(na);
return (ans == 0 ? FALSE : TRUE);
Index: src/usr.sbin/rpcbind/pmap_svc.c
diff -u src/usr.sbin/rpcbind/pmap_svc.c:1.7 src/usr.sbin/rpcbind/pmap_svc.c:1.8
--- src/usr.sbin/rpcbind/pmap_svc.c:1.7 Sat Oct 19 13:16:38 2013
+++ src/usr.sbin/rpcbind/pmap_svc.c Sun Nov 8 11:36:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_svc.c,v 1.7 2013/10/19 17:16:38 christos Exp $ */
+/* $NetBSD: pmap_svc.c,v 1.8 2015/11/08 16:36:28 christos Exp $ */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
@@ -173,6 +173,11 @@ pmapproc_change(struct svc_req *rqstp, S
struct sockcred *sc;
char uidbuf[32];
+ if (!svc_getargs(xprt, (xdrproc_t) xdr_pmap, (char *)®)) {
+ svcerr_decode(xprt);
+ return (FALSE);
+ }
+
#ifdef RPCBIND_DEBUG
if (debugging)
fprintf(stderr, "%s request for (%lu, %lu) : ",
@@ -180,11 +185,6 @@ pmapproc_change(struct svc_req *rqstp, S
reg.pm_prog, reg.pm_vers);
#endif
- if (!svc_getargs(xprt, (xdrproc_t) xdr_pmap, (char *)®)) {
- svcerr_decode(xprt);
- return (FALSE);
- }
-
if (!check_access(xprt, op, ®, PMAPVERS)) {
svcerr_weakauth(xprt);
return FALSE;
Index: src/usr.sbin/rpcbind/rpcb_svc_com.c
diff -u src/usr.sbin/rpcbind/rpcb_svc_com.c:1.16 src/usr.sbin/rpcbind/rpcb_svc_com.c:1.17
--- src/usr.sbin/rpcbind/rpcb_svc_com.c:1.16 Wed Aug 31 12:25:00 2011
+++ src/usr.sbin/rpcbind/rpcb_svc_com.c Sun Nov 8 11:36:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rpcb_svc_com.c,v 1.16 2011/08/31 16:25:00 plunky Exp $ */
+/* $NetBSD: rpcb_svc_com.c,v 1.17 2015/11/08 16:36:28 christos Exp $ */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
@@ -58,8 +58,16 @@
#include <string.h>
#include <stdlib.h>
+#ifdef RPCBIND_RUMP
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+#endif
+
#include "rpcbind.h"
#include "svc_dg.h"
+#ifdef RPCBIND_RUMP
+#include "svc_fdset.h"
+#endif
#define RPC_BUF_MAX 65536 /* can be raised if required */
@@ -287,7 +295,7 @@ void
delete_prog(rpcprog_t prog)
{
RPCB reg;
- register rpcblist_ptr rbl;
+ rpcblist_ptr rbl;
for (rbl = list_rbl; rbl != NULL; rbl = rbl->rpcb_next) {
if ((rbl->rpcb_map.r_prog != prog))
@@ -518,10 +526,7 @@ create_rmtcall_fd(struct netconfig *ncon
rmttail->next = rmt;
rmttail = rmt;
}
- /* XXX not threadsafe */
- if (fd > svc_maxfd)
- svc_maxfd = fd;
- FD_SET(fd, &svc_fdset);
+ svc_fdset_set(fd);
return (fd);
}
@@ -594,7 +599,7 @@ void
rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp,
rpcproc_t reply_type, rpcvers_t versnum)
{
- register rpcblist_ptr rbl;
+ rpcblist_ptr rbl;
struct netconfig *nconf;
struct netbuf *caller;
struct r_rmtcall_args a;
@@ -1028,8 +1033,8 @@ free_slot_by_index(int 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 >= svc_maxfd)
- svc_maxfd--;
+ if (fi->forward_fd >= *svc_fdset_getmax())
+ (*svc_fdset_getmax())--;
free((void *) fi->uaddr);
fi->flag &= ~FINFO_ACTIVE;
rpcb_rmtcalls--;
@@ -1072,19 +1077,27 @@ void
my_svc_run(void)
{
size_t nfds;
- struct pollfd pollfds[FD_SETSIZE];
+ struct pollfd *pollfds;
+ int npollfds;
int poll_ret, check_ret;
- int n;
+ int n, m;
#ifdef SVC_RUN_DEBUG
int i;
#endif
- register struct pollfd *p;
- fd_set cleanfds;
+ struct pollfd *p;
+
+ pollfds = NULL;
+ npollfds = 0;
for (;;) {
+ if (svc_fdset_getsize(0) != npollfds) {
+ npollfds = svc_fdset_getsize(0);
+ pollfds = realloc(pollfds, npollfds * sizeof(*pollfds));
+ }
p = pollfds;
- for (n = 0; n <= svc_maxfd; n++) {
- if (FD_ISSET(n, &svc_fdset)) {
+ m = *svc_fdset_getmax();
+ for (n = 0; n <= m; n++) {
+ if (svc_fdset_isset(n)) {
p->fd = n;
p->events = MASKVAL;
p++;
@@ -1101,16 +1114,26 @@ my_svc_run(void)
fprintf(stderr, ">\n");
}
#endif
- switch (poll_ret = poll(pollfds, nfds, 30 * 1000)) {
+#ifdef RPCBIND_RUMP
+ poll_ret = rump_sys_poll(pollfds, nfds, 30 * 1000);
+#else
+ poll_ret = poll(pollfds, nfds, 30 * 1000);
+#endif
+ 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().
*/
+#ifdef SVC_RUN_DEBUG
+ if (debugging) {
+ fprintf(stderr, "poll returned %d (%s)\n",
+ poll_ret, strerror(errno));
+ }
+#endif
case 0:
- cleanfds = svc_fdset;
- __svc_clean_idle(&cleanfds, 30, FALSE);
+ __svc_clean_idle(NULL, 30, FALSE);
continue;
default:
#ifdef SVC_RUN_DEBUG
@@ -1118,7 +1141,8 @@ my_svc_run(void)
fprintf(stderr, "poll returned read fds < ");
for (i = 0, p = pollfds; i < nfds; i++, p++)
if (p->revents)
- fprintf(stderr, "%d ", p->fd);
+ fprintf(stderr, "%d (0x%x)",
+ p->fd, p->revents);
fprintf(stderr, ">\n");
}
#endif
@@ -1136,7 +1160,8 @@ my_svc_run(void)
}
#ifdef SVC_RUN_DEBUG
if (debugging) {
- fprintf(stderr, "svc_maxfd now %u\n", svc_maxfd);
+ fprintf(stderr, "svc_maxfd now %u\n",
+ *svc_fdset_getmax());
}
#endif
}
@@ -1294,7 +1319,7 @@ done:
static void
find_versions(rpcprog_t prog, char *netid, rpcvers_t *lowvp, rpcvers_t *highvp)
{
- register rpcblist_ptr rbl;
+ rpcblist_ptr rbl;
rpcvers_t lowv = 0;
rpcvers_t highv = 0;
@@ -1331,8 +1356,8 @@ find_versions(rpcprog_t prog, char *neti
static rpcblist_ptr
find_service(rpcprog_t prog, rpcvers_t vers, char *netid)
{
- register rpcblist_ptr hit = NULL;
- register rpcblist_ptr rbl;
+ rpcblist_ptr hit = NULL;
+ rpcblist_ptr rbl;
for (rbl = list_rbl; rbl != NULL; rbl = rbl->rpcb_next) {
if ((rbl->rpcb_map.r_prog != prog) ||
Index: src/usr.sbin/rpcbind/rpcbind.c
diff -u src/usr.sbin/rpcbind/rpcbind.c:1.22 src/usr.sbin/rpcbind/rpcbind.c:1.23
--- src/usr.sbin/rpcbind/rpcbind.c:1.22 Sat May 9 17:22:18 2015
+++ src/usr.sbin/rpcbind/rpcbind.c Sun Nov 8 11:36:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rpcbind.c,v 1.22 2015/05/09 21:22:18 christos Exp $ */
+/* $NetBSD: rpcbind.c,v 1.23 2015/11/08 16:36:28 christos Exp $ */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
@@ -72,8 +72,22 @@ static char sccsid[] = "@(#)rpcbind.c 1.
#include <errno.h>
#include "rpcbind.h"
+#ifdef RPCBIND_RUMP
+#include <semaphore.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include "svc_fdset.h"
+
+extern sem_t gensem;
+#define DEBUGGING 1
+#else
+#define DEBUGGING 0
+#endif
+
/* Global variables */
-int debugging = 0; /* Tell me what's going on */
+int debugging = DEBUGGING; /* 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 */
@@ -106,17 +120,27 @@ static int init_transport(struct netconf
static void rbllist_add(rpcprog_t, rpcvers_t, struct netconfig *,
struct netbuf *);
__dead static void terminate(int);
+#ifndef RPCBIND_RUMP
static void parseargs(int, char *[]);
int
main(int argc, char *argv[])
+#else
+int rpcbind_main(void *);
+int
+rpcbind_main(void *arg)
+#endif
{
struct netconfig *nconf;
void *nc_handle; /* Net config handle */
struct rlimit rl;
int maxrec = RPC_MAXDATASIZE;
+#ifdef RPCBIND_RUMP
+ svc_fdset_init(SVC_FDSET_MT);
+#else
parseargs(argc, argv);
+#endif
if (getrlimit(RLIMIT_NOFILE, &rl) == -1)
err(EXIT_FAILURE, "getrlimit(RLIMIT_NOFILE)");
@@ -158,7 +182,9 @@ main(int argc, char *argv[])
(void) signal(SIGQUIT, terminate);
/* ignore others that could get sent */
(void) signal(SIGPIPE, SIG_IGN);
+#ifndef RPCBIND_RUMP
(void) signal(SIGHUP, SIG_IGN);
+#endif
(void) signal(SIGUSR1, SIG_IGN);
(void) signal(SIGUSR2, SIG_IGN);
#ifdef WARMSTART
@@ -196,6 +222,9 @@ main(int argc, char *argv[])
network_init();
+#ifdef RPCBIND_RUMP
+ sem_post(&gensem);
+#endif
my_svc_run();
syslog(LOG_ERR, "svc_run returned unexpectedly");
rpcbind_abort();
@@ -272,7 +301,11 @@ init_transport(struct netconfig *nconf)
if (!strcmp(nconf->nc_netid, "local")) {
(void)memset(&sun, 0, sizeof sun);
sun.sun_family = AF_LOCAL;
+#ifdef RPCBIND_RUMP
+ (void)rump_sys_unlink(_PATH_RPCBINDSOCK);
+#else
(void)unlink(_PATH_RPCBINDSOCK);
+#endif
(void)strlcpy(sun.sun_path, _PATH_RPCBINDSOCK,
sizeof(sun.sun_path));
sun.sun_len = SUN_LEN(&sun);
@@ -301,9 +334,11 @@ init_transport(struct netconfig *nconf)
freeaddrinfo(res);
return 1;
}
+#ifndef RPCBIND_RUMP
if (sa->sa_family == AF_LOCAL)
if (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;
@@ -325,7 +360,8 @@ init_transport(struct netconfig *nconf)
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)fprintf(stderr, "rpcbind: my address is %s fd=%d\n",
+ uaddr, fd);
(void)free(uaddr);
}
#endif
@@ -486,7 +522,11 @@ init_transport(struct netconfig *nconf)
}
return (0);
error:
+#ifdef RPCBIND_RUMP
+ (void)rump_sys_close(fd);
+#else
(void)close(fd);
+#endif
return (1);
}
@@ -522,7 +562,11 @@ terminate(int dummy)
"rpcbind terminating on signal. Restart with \"rpcbind -w\"");
write_warmstart(); /* Dump yourself */
#endif
+#ifdef RPCBIND_RUMP
+ exit(2);
+#else
exit(EXIT_FAILURE);
+#endif
}
void
@@ -534,6 +578,7 @@ rpcbind_abort()
abort();
}
+#ifndef RPCBIND_RUMP
/* get command line options */
static void
parseargs(int argc, char *argv[])
@@ -577,6 +622,7 @@ parseargs(int argc, char *argv[])
doabort = 0;
}
}
+#endif
void
reap(int dummy)
Index: src/usr.sbin/rpcbind/util.c
diff -u src/usr.sbin/rpcbind/util.c:1.19 src/usr.sbin/rpcbind/util.c:1.20
--- src/usr.sbin/rpcbind/util.c:1.19 Sat May 9 14:32:04 2015
+++ src/usr.sbin/rpcbind/util.c Sun Nov 8 11:36:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: util.c,v 1.19 2015/05/09 18:32:04 dholland Exp $ */
+/* $NetBSD: util.c,v 1.20 2015/11/08 16:36:28 christos Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -48,6 +48,11 @@
#include <arpa/inet.h>
#include <err.h>
+#ifdef RPCBIND_RUMP
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+#endif
+
#include "rpcbind.h"
static struct sockaddr_in *local_in4;