This patch makes nfs mounting and unmounting use the rpcproxyd interface.
Index: util-linux-2.12p/mount/nfsmount.c
===================================================================
--- util-linux-2.12p.orig/mount/nfsmount.c 2005-03-03 18:58:40.000000000 -0500
+++ util-linux-2.12p/mount/nfsmount.c 2005-03-07 15:21:17.625410280 -0500
@@ -26,6 +26,9 @@
*
* Modified by Olaf Kirch and Trond Myklebust for new NFS code,
* plus NFSv3 stuff.
+ *
+ * 2005-03-02 Mike Waychison <[EMAIL PROTECTED]>
+ * - Use the clnt_proxy interface when talking to mountd.
*/
/*
@@ -65,6 +68,8 @@
#include "nls.h"
+#include "clnt_proxy.h"
+
#ifndef NFS_PORT
#define NFS_PORT 2049
#endif
@@ -135,7 +140,9 @@
long unsigned port,
int nfs_mount_version)
{
- struct pmaplist *pmap;
+ CLIENT *clnt;
+ struct pmaplist *pmap = NULL;
+ struct timeval tv = {10, 0};
static struct pmap p = {0, 0, 0, 0};
if (version > MAX_NFSPROT)
@@ -147,8 +154,26 @@
p.pm_prot = proto;
p.pm_port = port;
- server_addr->sin_port = PMAPPORT;
- pmap = pmap_getmaps(server_addr);
+ server_addr->sin_port = htons(PMAPPORT);
+
+ clnt = clntproxy_create(server_addr->sin_family,
+ SOCK_STREAM,
+ (struct sockaddr *)server_addr,
+ sizeof(*server_addr),
+ PMAPPROG,
+ PMAPVERS);
+ if (!clnt)
+ clnt = clntproxy_create(server_addr->sin_family,
+ SOCK_DGRAM,
+ (struct sockaddr *)server_addr,
+ sizeof(*server_addr),
+ PMAPPROG,
+ PMAPVERS);
+ if (clnt)
+ clnt_call(clnt, PMAPPROC_DUMP,
+ (xdrproc_t) xdr_void, (caddr_t) NULL,
+ (xdrproc_t) xdr_pmaplist, (caddr_t) &pmap,
+ tv);
while (pmap) {
if (pmap->pml_map.pm_prog != prog)
@@ -167,6 +192,10 @@
next:
pmap = pmap->pml_next;
}
+
+ if (clnt)
+ clnt_destroy(clnt);
+
if (!p.pm_vers)
p.pm_vers = MOUNTVERS;
if (!p.pm_prot)
@@ -207,7 +236,7 @@
struct sockaddr_in server_addr;
struct sockaddr_in mount_server_addr;
struct pmap *pm_mnt;
- int msock, fsock;
+ int fsock;
struct timeval retry_timeout;
union {
struct fhstatus nfsv2;
@@ -231,7 +260,7 @@
nfs_mount_version = *nfs_mount_vers;
retval = EX_FAIL;
- msock = fsock = -1;
+ fsock = -1;
mclient = NULL;
if (strlen(spec) >= sizeof(hostdir)) {
fprintf(stderr, _("mount: "
@@ -583,29 +612,15 @@
/* contact the mount daemon via TCP */
mount_server_addr.sin_port = htons(pm_mnt->pm_port);
- msock = RPC_ANYSOCK;
- switch (pm_mnt->pm_prot) {
- case IPPROTO_UDP:
- mclient = clntudp_create(&mount_server_addr,
- pm_mnt->pm_prog,
- pm_mnt->pm_vers,
- retry_timeout,
- &msock);
- if (mclient)
- break;
- mount_server_addr.sin_port =
- htons(pm_mnt->pm_port);
- msock = RPC_ANYSOCK;
- case IPPROTO_TCP:
- mclient = clnttcp_create(&mount_server_addr,
- pm_mnt->pm_prog,
- pm_mnt->pm_vers,
- &msock, 0, 0);
- break;
- default:
- mclient = 0;
- }
+ mclient = clntproxy_create(
+ mount_server_addr.sin_family,
+ pm_mnt->pm_prot == IPPROTO_TCP ?
+ SOCK_STREAM : SOCK_DGRAM,
+ (struct sockaddr *)&mount_server_addr,
+ sizeof(mount_server_addr),
+ pm_mnt->pm_prog,
+ pm_mnt->pm_vers);
if (mclient) {
/* try to mount hostname:dirname */
@@ -648,7 +663,6 @@
auth_destroy(mclient->cl_auth);
clnt_destroy(mclient);
mclient = 0;
- close(msock);
} else {
if (!running_bg && prevt == 0)
clnt_pcreateerror("mount");
@@ -728,9 +742,34 @@
goto fail;
}
if (port == 0) {
- server_addr.sin_port = PMAPPORT;
- port = pmap_getport(&server_addr, nfsprog, nfsvers,
- tcp ? IPPROTO_TCP : IPPROTO_UDP);
+ CLIENT *clnt;
+
+ server_addr.sin_port = htons(PMAPPORT);
+ clnt = clntproxy_create(server_addr.sin_family,
+ SOCK_STREAM,
+ (struct sockaddr *)&server_addr,
+ sizeof(server_addr),
+ PMAPPROG,
+ PMAPVERS);
+ if (!clnt)
+ clnt = clntproxy_create(server_addr.sin_family,
+ SOCK_DGRAM,
+ (struct sockaddr *)&server_addr,
+ sizeof(server_addr),
+ PMAPPROG,
+ PMAPVERS);
+ if (clnt) {
+ struct pmap pmap = {0};
+ struct timeval tv = {10, 0};
+ pmap.pm_prog = nfsprog;
+ pmap.pm_vers = nfsvers;
+ pmap.pm_prot = tcp ? IPPROTO_TCP : IPPROTO_UDP;
+ clnt_call(clnt, PMAPPROC_GETPORT,
+ (xdrproc_t) xdr_pmap, (caddr_t) &pmap,
+ (xdrproc_t) xdr_u_long, (caddr_t) &port,
+ tv);
+ clnt_destroy(clnt);
+ }
#if 1
/* Here we check to see if user is mounting with the
* tcp option. If so, and if the portmap returns a
@@ -776,19 +815,11 @@
auth_destroy(mclient->cl_auth);
clnt_destroy(mclient);
- close(msock);
return 0;
/* abort */
fail:
- if (msock != -1) {
- if (mclient) {
- auth_destroy(mclient->cl_auth);
- clnt_destroy(mclient);
- }
- close(msock);
- }
if (fsock != -1)
close(fsock);
return retval;
Index: util-linux-2.12p/mount/Makefile
===================================================================
--- util-linux-2.12p.orig/mount/Makefile 2005-03-03 18:58:40.000000000 -0500
+++ util-linux-2.12p/mount/Makefile 2005-03-07 15:21:17.654405872 -0500
@@ -30,7 +30,7 @@
MAYBE = pivot_root swapoff
LO_OBJS = lomount.o $(LIB)/xstrncpy.o
-NFS_OBJS = nfsmount.o nfsmount_xdr.o nfsmount_clnt.o
+NFS_OBJS = nfsmount.o nfsmount_xdr.o nfsmount_clnt.o $(LIB)/clnt_proxy.o
GEN_FILES = nfsmount.h nfsmount_xdr.c nfsmount_clnt.c
all: $(PROGS)
@@ -54,7 +54,7 @@
umount: umount.o fstab.o sundries.o xmalloc.o realpath.o mntent.o \
getusername.o get_label_uuid.o mount_by_label.o mount_blkid.o \
- version.o $(LIB)/env.o $(LO_OBJS)
+ version.o $(LIB)/env.o $(LIB)/clnt_proxy.o $(LO_OBJS)
$(LINK) $^ -o $@ $(BLKID_LIB)
swapon: swapon.o version.o xmalloc.o \
Index: util-linux-2.12p/mount/umount.c
===================================================================
--- util-linux-2.12p.orig/mount/umount.c 2005-03-03 18:58:40.000000000 -0500
+++ util-linux-2.12p/mount/umount.c 2005-03-07 15:21:17.656405568 -0500
@@ -31,6 +31,8 @@
#include <arpa/inet.h>
#endif
+#include <clnt_proxy.h>
+
#if defined(MNT_FORCE) && !defined(__sparc__) && !defined(__arm__)
/* Interesting ... it seems libc knows about MNT_FORCE and presumably
about umount2 as well -- need not do anything */
@@ -159,8 +161,8 @@
struct sockaddr_in saddr;
struct timeval pertry, try;
enum clnt_stat clnt_stat;
+ int socket_type;
int port = 0;
- int so = RPC_ANYSOCK;
struct hostent *hostp;
char *hostname;
char *dirname;
@@ -209,18 +211,21 @@
if (opts && (p = strstr(opts, "tcp"))) {
/* possibly: make sure option is not "notcp"
possibly: try udp if tcp fails */
- if ((clp = clnttcp_create(&saddr, MOUNTPROG, MOUNTVERS,
- &so, 0, 0)) == NULL) {
- clnt_pcreateerror("Cannot MOUNTPROG RPC (tcp)");
- return 1;
- }
+ socket_type = SOCK_STREAM;
} else {
- if ((clp = clntudp_create(&saddr, MOUNTPROG, MOUNTVERS,
- pertry, &so)) == NULL) {
- clnt_pcreateerror("Cannot MOUNTPROG RPC");
- return 1;
- }
+ socket_type = SOCK_DGRAM;
+ }
+ clp = clntproxy_create(saddr.sin_family,
+ socket_type,
+ (struct sockaddr *)&saddr,
+ sizeof(saddr),
+ MOUNTPROG,
+ MOUNTVERS);
+ if (!clp) {
+ clnt_pcreateerror("Cannot MOUNTPROG RPC");
+ return 1;
}
+
clp->cl_auth = authunix_create_default();
try.tv_sec = 20;
try.tv_usec = 0;
_______________________________________________
autofs mailing list
autofs@linux.kernel.org
http://linux.kernel.org/mailman/listinfo/autofs