summaryrefslogtreecommitdiffstats
path: root/support/nfs
diff options
context:
space:
mode:
authorchip <chip>2000-03-13 22:23:26 +0000
committerchip <chip>2000-03-13 22:23:26 +0000
commit6a66bb69d8fdb43f0abb58fd74566461f0e96633 (patch)
treecb22e204e8e3df90348cc2e24f97b922a19ca941 /support/nfs
parentb2d2786e339b812103f6f514e343a633e6c6c922 (diff)
downloadnfs-utils-6a66bb69d8fdb43f0abb58fd74566461f0e96633.tar.gz
nfs-utils-6a66bb69d8fdb43f0abb58fd74566461f0e96633.tar.xz
nfs-utils-6a66bb69d8fdb43f0abb58fd74566461f0e96633.zip
Conserve sockets: Reuse RPC transports.
Diffstat (limited to 'support/nfs')
-rw-r--r--support/nfs/rpcmisc.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/support/nfs/rpcmisc.c b/support/nfs/rpcmisc.c
index 7b182fd..b994fb1 100644
--- a/support/nfs/rpcmisc.c
+++ b/support/nfs/rpcmisc.c
@@ -65,35 +65,53 @@ rpc_init(char *name, int prog, int vers, void (*dispatch)(), int defport,
}
if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_DGRAM)) {
- if (_rpcfdtype == 0 && defport != 0 &&
- ((sock = makesock(defport, IPPROTO_UDP, bufsiz)) < 0)) {
- xlog(L_FATAL, "%s: could not make a UDP socket\n",
- name);
+ static SVCXPRT *last_transp = NULL;
+
+ if (_rpcfdtype == 0 && defport != 0) {
+ if (last_transp && last_transp->xp_port == defport) {
+ transp = last_transp;
+ goto udp_transport;
+ }
+ if ((sock = makesock(defport, IPPROTO_UDP, bufsiz)) < 0) {
+ xlog(L_FATAL, "%s: cannot make a UDP socket\n",
+ name);
+ }
}
transp = svcudp_create(sock);
if (transp == NULL) {
xlog(L_FATAL, "cannot create udp service.");
}
+ udp_transport:
if (!svc_register(transp, prog, vers, dispatch, IPPROTO_UDP)) {
xlog(L_FATAL, "unable to register (%s, %d, udp).",
name, vers);
}
+ last_transp = transp;
}
if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_STREAM)) {
- if (_rpcfdtype == 0 && defport != 0 &&
- ((sock = makesock(defport, IPPROTO_TCP, bufsiz)) < 0)) {
- xlog(L_FATAL, "%s: could not make a TCP socket\n",
- name);
+ static SVCXPRT *last_transp = NULL;
+
+ if (_rpcfdtype == 0 && defport != 0) {
+ if (last_transp && last_transp->xp_port == defport) {
+ transp = last_transp;
+ goto tcp_transport;
+ }
+ if ((sock = makesock(defport, IPPROTO_TCP, bufsiz)) < 0) {
+ xlog(L_FATAL, "%s: cannot make a TCP socket\n",
+ name);
+ }
}
transp = svctcp_create(sock, 0, 0);
if (transp == NULL) {
xlog(L_FATAL, "cannot create tcp service.");
}
+ tcp_transport:
if (!svc_register(transp, prog, vers, dispatch, IPPROTO_TCP)) {
xlog(L_FATAL, "unable to register (%s, %d, tcp).",
name, vers);
}
+ last_transp = transp;
}
if (_rpcpmstart) {