[SSI] openssi/nfs-utils/support/nfs rpcmisc.c, 1.1.15.1, 1.1.15.1.4.1

Roger Tsang <[email protected]> Thu, 15 Jul 2010 03:47:19 +0000
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/nfs-utils/support/nfs
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv13321/support/nfs

Modified Files:
      Tag: OPENSSI-CENTOS
	rpcmisc.c 
Log Message:
OpenSSI changes for nfs-utils-1.0.6-93.EL4 CentOS 4


Index: rpcmisc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/nfs-utils/support/nfs/Attic/rpcmisc.c,v
retrieving revision 1.1.15.1
retrieving revision 1.1.15.1.4.1
diff -u -d -r1.1.15.1 -r1.1.15.1.4.1
--- rpcmisc.c	4 Jul 2010 22:21:51 -0000	1.1.15.1
+++ rpcmisc.c	15 Jul 2010 03:47:17 -0000	1.1.15.1.4.1
@@ -31,9 +31,17 @@
 #include <unistd.h>
 #include <time.h>
 #include "nfslib.h"
+/* This should be the high-order bit for whatever size u_long is */
+#include <limits.h>
+#define	CVIP_PROG_BIT	(LONG_MIN)
+
+/* These are in rpcmisc.h, but not included here */
+#define REGULAR 1
+#define CVIP 2
 
 static void	closedown(int sig);
 int	makesock(int port, int proto);
+int	makesock_addr(int port, int proto, unsigned long addr);
 
 #define _RPCSVC_CLOSEDOWN	120
 int	_rpcpmstart = 0;
@@ -41,7 +49,8 @@
 int	_rpcsvcdirty = 0;
 
 void
-rpc_init(char *name, int prog, int vers, void (*dispatch)(), int defport)
+rpc_init_addr(char *name, int prog, int vers, void (*dispatch)(), int defport,
+	unsigned long addr, int cvip)
 {
 	struct sockaddr_in saddr;
 	SVCXPRT	*transp;
@@ -66,7 +75,10 @@
 		}
 	}
 	if (!_rpcpmstart) {
-		pmap_unset(prog, vers);
+		if (cvip & CVIP)  
+			pmap_unset(prog|CVIP_PROG_BIT, vers);
+		if (cvip & REGULAR)  
+			pmap_unset(prog, vers);
 		sock = RPC_ANYSOCK;
 	}
 
@@ -75,16 +87,17 @@
  
 		if (_rpcpmstart == 0) {
 			if (last_transp
+			    && (addr == INADDR_ANY)
 			    && (!defport || defport == last_transp->xp_port)) {
 				transp = last_transp;
 				goto udp_transport;
 			}
 			if (defport == 0)
 				sock = RPC_ANYSOCK;
-			else if ((sock = makesock(defport, IPPROTO_UDP)) < 0) {
+			else if ((sock = makesock_addr(defport, IPPROTO_UDP,
+						addr)) < 0)
 				xlog(L_FATAL, "%s: cannot make a UDP socket\n",
 						name);
-			}
 		}
 		if (sock == RPC_ANYSOCK)
 			sock = svcudp_socket (prog, 1);
@@ -93,10 +106,15 @@
 			xlog(L_FATAL, "cannot create udp service.");
 		}
       udp_transport:
-		if (!svc_register(transp, prog, vers, dispatch, IPPROTO_UDP)) {
+		if (!svc_register(transp, prog, vers, dispatch, 0)) {
 			xlog(L_FATAL, "unable to register (%s, %d, udp).",
 					name, vers);
 		}
+		/* XXX: Didn't check error return */
+		if (cvip & CVIP)
+			pmap_set(prog|CVIP_PROG_BIT, vers, IPPROTO_UDP, transp->xp_port );
+		if (cvip & REGULAR)  
+			pmap_set(prog, vers, IPPROTO_UDP, transp->xp_port);
 		last_transp = transp;
 	}
 
@@ -105,16 +123,17 @@
 
 		if (_rpcpmstart == 0) {
 			if (last_transp
+			    && (addr == INADDR_ANY)
 			    && (!defport || defport == last_transp->xp_port)) {
 				transp = last_transp;
 				goto tcp_transport;
 			}
 			if (defport == 0)
 				sock = RPC_ANYSOCK;
-			else if ((sock = makesock(defport, IPPROTO_TCP)) < 0) {
+			else if ((sock = makesock_addr(defport, IPPROTO_TCP,
+					addr)) < 0)
 				xlog(L_FATAL, "%s: cannot make a TCP socket\n",
 						name);
-			}
 		}
 		if (sock == RPC_ANYSOCK)
 			sock = svctcp_socket (prog, 1);
@@ -123,10 +142,15 @@
 			xlog(L_FATAL, "cannot create tcp service.");
 		}
       tcp_transport:
-		if (!svc_register(transp, prog, vers, dispatch, IPPROTO_TCP)) {
+		if (!svc_register(transp, prog, vers, dispatch, 0)) {
 			xlog(L_FATAL, "unable to register (%s, %d, tcp).",
 					name, vers);
 		}
+		/* XXX: Didn't check error return */
+		if (cvip & CVIP) 
+			pmap_set(prog|CVIP_PROG_BIT, vers, IPPROTO_TCP, transp->xp_port);
+		if (cvip & REGULAR)  
+			pmap_set(prog, vers, IPPROTO_TCP, transp->xp_port);
 		last_transp = transp;
 	}
 
@@ -136,6 +160,12 @@
 	}
 }
 
+void
+rpc_init(char *name, int prog, int vers, void (*dispatch)(), int defport)
+{
+	rpc_init_addr(name, prog, vers, dispatch, defport, INADDR_ANY, REGULAR);
+}
+
 static void closedown(sig)
 int sig;
 {
@@ -158,7 +188,7 @@
 	(void) alarm(_RPCSVC_CLOSEDOWN);
 }
 
-int makesock(int port, int proto)
+int makesock_addr(int port, int proto, unsigned long addr)
 {
 	struct sockaddr_in sin;
 	int	s;
@@ -174,7 +204,7 @@
 	}
 	memset((char *) &sin, 0, sizeof(sin));
 	sin.sin_family = AF_INET;
-	sin.sin_addr.s_addr = INADDR_ANY;
+	sin.sin_addr.s_addr = addr;
 	sin.sin_port = htons(port);
 
 	val = 1;
@@ -205,6 +235,10 @@
 	return (s);
 }
 
+int makesock(int port, int proto)
+{
+	return makesock_addr(port, proto, INADDR_ANY);
+}
 
 /* Log an incoming call. */
 void


------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first