[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