From bcb53b16068cf226b69d1af946341d2dafd23c97 Mon Sep 17 00:00:00 2001 From: Martin Blapp Date: Thu, 16 Jan 2003 07:27:30 +0000 Subject: [PATCH] Implement nonblocking tpc-connections. rpcgen -m does still produce backcompatible code. Reviewed by: rwatson Obtained from: NetBSD MFC after: 1 day --- usr.bin/rpcgen/rpc_main.c | 2 ++ usr.bin/rpcgen/rpc_svcout.c | 36 +++++++++++++++++++++---- usr.sbin/mountd/mountd.c | 9 +++++-- usr.sbin/rpc.lockd/lockd.c | 7 ++++- usr.sbin/rpc.statd/statd.c | 4 +++ usr.sbin/rpc.yppasswdd/yppasswdd_main.c | 4 +++ usr.sbin/rpcbind/rpcb_svc_com.c | 8 ++++-- usr.sbin/rpcbind/rpcbind.c | 11 +++++--- 8 files changed, 68 insertions(+), 13 deletions(-) diff --git a/usr.bin/rpcgen/rpc_main.c b/usr.bin/rpcgen/rpc_main.c index 6321735e4bb5..35a0f71cc725 100644 --- a/usr.bin/rpcgen/rpc_main.c +++ b/usr.bin/rpcgen/rpc_main.c @@ -636,6 +636,8 @@ s_output(argc, argv, infile, define, extend, outfile, nomain, netflag) "#include /* for pmap_unset */\n"); f_print (fout, "#include /* strcmp */\n"); } + if (tirpcflag) + f_print(fout, "#include \n"); if (strcmp(svcclosetime, "-1") == 0) indefinitewait = 1; else if (strcmp(svcclosetime, "0") == 0) diff --git a/usr.bin/rpcgen/rpc_svcout.c b/usr.bin/rpcgen/rpc_svcout.c index fbaf3983f4f0..9e9fb8682c62 100644 --- a/usr.bin/rpcgen/rpc_svcout.c +++ b/usr.bin/rpcgen/rpc_svcout.c @@ -147,6 +147,11 @@ serviced */\n"); f_print(fout, "\nint\n"); f_print(fout, "main()\n"); f_print(fout, "{\n"); + if (tirpcflag) { + if (!inetdflag) + f_print(fout, "\t"); + f_print(fout, "\tint maxrec = RPC_MAXDATASIZE;\n"); + } if (inetdflag) { write_inetmost(infile); /* Includes call to write_rpc_svc_fg() */ @@ -212,8 +217,15 @@ write_netid_register(transp) print_err_message(tmpbuf); f_print(fout, "%s\t\texit(1);\n", sp); f_print(fout, "%s\t}\n", sp); - f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n", - sp, TRANSP); + if (tirpcflag) { + f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, ", + sp, TRANSP); + f_print(fout,"nconf, 0, RPC_MAXDATASIZE, RPC_MAXDATASIZE);\n"); + } else { + f_print(fout, + "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n", + sp, TRANSP); + } f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP); (void) sprintf(_errbuf, "cannot create %s service.", transp); print_err_message(tmpbuf); @@ -261,6 +273,10 @@ write_nettype_register(transp) if (def->def_kind != DEF_PROGRAM) { continue; } + if (tirpcflag) { + f_print(fout, + "\trpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec);\n"); + } for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { f_print(fout, "\tif (!svc_create("); pvname(def->def_name, vp->vers_num); @@ -937,10 +953,18 @@ getenv(\"NLSPROVIDER\")) == NULL) {\n"); f_print(fout, "\t\t\t}\n"); f_print(fout, "\t\t}\n"); } - f_print(fout, - "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) \ -== NULL) {\n", + if (tirpcflag) { + f_print(fout, + "\t\tif ((%s = svc_tli_create(0, nconf, NULL, \ + RPC_MAXDATASIZE, RPC_MAXDATASIZE)) \ + == NULL) {\n", TRANSP); + } else { + f_print(fout, + "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) \ + == NULL) {\n", + TRANSP); + } sprintf(_errbuf, "cannot create server handle"); print_err_message("\t\t\t"); f_print(fout, "\t\t\texit(1);\n"); @@ -1079,6 +1103,8 @@ write_inetd_register(transp) "\tif ((_rpcfdtype == 0) || (_rpcfdtype == %s)) {\n", isudp ? "SOCK_DGRAM" : "SOCK_STREAM"); } + if (tirpcflag) + f_print(fout, "\t\trpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec);\n"); f_print(fout, "%s\t%s = svc%s_create(%s", sp, TRANSP, transp, inetdflag? "sock": "RPC_ANYSOCK"); if (!isudp) diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c index d24c2a83d7b1..2fff366c7c9b 100644 --- a/usr.sbin/mountd/mountd.c +++ b/usr.sbin/mountd/mountd.c @@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -273,6 +274,7 @@ main(argc, argv) struct netconfig *udpconf, *tcpconf, *udp6conf, *tcp6conf; int udpsock, tcpsock, udp6sock, tcp6sock; int xcreated = 0, s; + int maxrec = RPC_MAXDATASIZE; int one = 1; int c; @@ -354,6 +356,9 @@ main(argc, argv) tcpsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); udpconf = getnetconfigent("udp"); tcpconf = getnetconfigent("tcp"); + + rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec); + if (!have_v6) goto skip_v6; udp6sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); @@ -408,7 +413,7 @@ skip_v6: if (tcpsock != -1 && tcpconf != NULL) { bindresvport(tcpsock, NULL); listen(tcpsock, SOMAXCONN); - tcptransp = svc_vc_create(tcpsock, 0, 0); + tcptransp = svc_vc_create(tcpsock, RPC_MAXDATASIZE, RPC_MAXDATASIZE); if (tcptransp != NULL) { if (!svc_reg(tcptransp, RPCPROG_MNT, RPCMNT_VER1, mntsrv, tcpconf)) @@ -449,7 +454,7 @@ skip_v6: if (have_v6 && tcp6sock != -1 && tcp6conf != NULL) { bindresvport(tcp6sock, NULL); listen(tcp6sock, SOMAXCONN); - tcp6transp = svc_vc_create(tcp6sock, 0, 0); + tcp6transp = svc_vc_create(tcp6sock, RPC_MAXDATASIZE, RPC_MAXDATASIZE); if (tcp6transp != NULL) { if (!svc_reg(tcp6transp, RPCPROG_MNT, RPCMNT_VER1, mntsrv, tcp6conf)) diff --git a/usr.sbin/rpc.lockd/lockd.c b/usr.sbin/rpc.lockd/lockd.c index 2f56aba5b51a..db8b669ce1a1 100644 --- a/usr.sbin/rpc.lockd/lockd.c +++ b/usr.sbin/rpc.lockd/lockd.c @@ -61,6 +61,7 @@ __RCSID("$NetBSD: lockd.c,v 1.7 2000/08/12 18:08:44 thorpej Exp $"); #include #include +#include #include #include "lockd.h" @@ -95,6 +96,7 @@ main(argc, argv) struct sigaction sigalarm; int grace_period = 30; struct netconfig *nconf; + int maxrec = RPC_MAXDATASIZE; while ((ch = getopt(argc, argv, "d:g:")) != (-1)) { switch (ch) { @@ -139,13 +141,16 @@ main(argc, argv) maxindex = 4; } + rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec); + for (i = 0; i < maxindex; i++) { nconf = getnetconfigent(transports[i]); if (nconf == NULL) errx(1, "cannot get %s netconf: %s.", transports[i], nc_sperror()); - transp = svc_tli_create(RPC_ANYFD, nconf, NULL, 0, 0); + transp = svc_tli_create(RPC_ANYFD, nconf, NULL, + RPC_MAXDATASIZE, RPC_MAXDATASIZE); if (transp == NULL) { errx(1, "cannot create %s service.", transports[i]); /* NOTREACHED */ diff --git a/usr.sbin/rpc.statd/statd.c b/usr.sbin/rpc.statd/statd.c index b77e9bbbd077..6e517814c980 100644 --- a/usr.sbin/rpc.statd/statd.c +++ b/usr.sbin/rpc.statd/statd.c @@ -44,6 +44,7 @@ static const char rcsid[] = #include #include #include +#include #include #include #include @@ -61,6 +62,7 @@ int main(int argc, char **argv) { struct sigaction sa; + int maxrec = RPC_MAXDATASIZE; if (argc > 1) { @@ -71,6 +73,8 @@ main(int argc, char **argv) (void)rpcb_unset(SM_PROG, SM_VERS, NULL); + rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec); + if (!svc_create(sm_prog_1, SM_PROG, SM_VERS, "udp")) errx(1, "cannot create udp service"); if (!svc_create(sm_prog_1, SM_PROG, SM_VERS, "tcp")) diff --git a/usr.sbin/rpc.yppasswdd/yppasswdd_main.c b/usr.sbin/rpc.yppasswdd/yppasswdd_main.c index 2f7e1e25c401..7c9b011fb5b3 100644 --- a/usr.sbin/rpc.yppasswdd/yppasswdd_main.c +++ b/usr.sbin/rpc.yppasswdd/yppasswdd_main.c @@ -56,6 +56,7 @@ static const char rcsid[] = #include #include +#include #include /* for pmap_unset */ #include struct dom_binding {}; @@ -171,6 +172,7 @@ main(int argc, char *argv[]) int ch; char *mastername; char myname[MAXHOSTNAMELEN + 2]; + int maxrec = RPC_MAXDATASIZE; extern int debug; @@ -273,6 +275,8 @@ the %s domain -- aborting", yppasswd_domain); rpcb_unset(YPPASSWDPROG, YPPASSWDVERS, NULL); rpcb_unset(MASTER_YPPASSWDPROG, MASTER_YPPASSWDVERS, NULL); + rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec); + if (svc_create(yppasswdprog_1, YPPASSWDPROG, YPPASSWDVERS, "netpath") == 0) { yp_error("cannot create yppasswd service."); exit(1); diff --git a/usr.sbin/rpcbind/rpcb_svc_com.c b/usr.sbin/rpcbind/rpcb_svc_com.c index 541d168e25b1..dbe312e00b79 100644 --- a/usr.sbin/rpcbind/rpcb_svc_com.c +++ b/usr.sbin/rpcbind/rpcb_svc_com.c @@ -1,4 +1,4 @@ -/* $NetBSD: rpcb_svc_com.c,v 1.6 2000/08/03 00:07:22 fvdl Exp $ */ +/* $NetBSD: rpcb_svc_com.c,v 1.9 2002/11/08 00:16:39 fvdl Exp $ */ /* $FreeBSD$ */ /* @@ -1073,6 +1073,7 @@ netbuffree(struct netbuf *ap) #define MASKVAL (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND) +extern bool_t __svc_clean_idle(fd_set *, int, bool_t); void my_svc_run() @@ -1085,6 +1086,7 @@ my_svc_run() int i; #endif register struct pollfd *p; + fd_set cleanfds; for (;;) { p = pollfds; @@ -1106,7 +1108,7 @@ my_svc_run() fprintf(stderr, ">\n"); } #endif - switch (poll_ret = poll(pollfds, nfds, INFTIM)) { + switch (poll_ret = poll(pollfds, nfds, 30 * 1000)) { case -1: /* * We ignore all errors, continuing with the assumption @@ -1114,6 +1116,8 @@ my_svc_run() * other outside event) and not caused by poll(). */ case 0: + cleanfds = svc_fdset; + __svc_clean_idle(&cleanfds, 30, FALSE); continue; default: #ifdef SVC_RUN_DEBUG diff --git a/usr.sbin/rpcbind/rpcbind.c b/usr.sbin/rpcbind/rpcbind.c index 21c19b088e00..ccfd15309321 100644 --- a/usr.sbin/rpcbind/rpcbind.c +++ b/usr.sbin/rpcbind/rpcbind.c @@ -1,4 +1,4 @@ -/* $NetBSD: rpcbind.c,v 1.1 2000/06/02 23:15:42 fvdl Exp $ */ +/* $NetBSD: rpcbind.c,v 1.3 2002/11/08 00:16:40 fvdl Exp $ */ /* $FreeBSD$ */ /* @@ -57,6 +57,7 @@ static char sccsid[] = "@(#)rpcbind.c 1.35 89/04/21 Copyr 1984 Sun Micro"; #include #include #include +#include #ifdef PORTMAP #include #endif @@ -124,6 +125,7 @@ main(int argc, char *argv[]) struct netconfig *nconf; void *nc_handle; /* Net config handle */ struct rlimit rl; + int maxrec = RPC_MAXDATASIZE; parseargs(argc, argv); @@ -165,6 +167,9 @@ main(int argc, char *argv[]) syslog(LOG_ERR, "%s: can't find local transport\n", argv[0]); exit(1); } + + rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec); + init_transport(nconf); while ((nconf = getnetconfig(nc_handle))) { @@ -431,7 +436,7 @@ init_transport(struct netconfig *nconf) listen(fd, SOMAXCONN); my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, - 0, 0); + RPC_MAXDATASIZE, RPC_MAXDATASIZE); if (my_xprt == (SVCXPRT *)NULL) { syslog(LOG_ERR, "%s: could not create service", nconf->nc_netid); @@ -491,7 +496,7 @@ init_transport(struct netconfig *nconf) if (nconf->nc_semantics != NC_TPI_CLTS) listen(fd, SOMAXCONN); - my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, 0, 0); + my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE); if (my_xprt == (SVCXPRT *)NULL) { syslog(LOG_ERR, "%s: could not create service", nconf->nc_netid);