rpc.umntall timeout
Jeremie Le Hen
jeremie at le-hen.org
Fri May 20 12:50:18 PDT 2005
Hi,
I used to connect to multiple networks with my laptop. The problem is
that rpc.umntall(8) automatically tries to send a RPCMNT_UMOUNT to all
old entries in /var/db/mounttab. I always need to hit ^C because it
takes too long to timeout.
I watched at the code to see if I couldn't set a timeout on the sending
socket to shorten the amount of time it tries to contact the NFS server
of each deprecated mount.
It looks there is already a hard-coded timeout of three seconds on the
call of clnt_call(3), but I added some printf(3)s and this is
obviously the preceding clnt_create(3) call which takes so much time.
I looked at the code of this function, and this is not much than a simple
wrapper to clnt_create_timed(3) function. So I changed rpc.umntall(3)
code to use this function and the same timeout as clnt_call(3) instead of
using the non-timed version. This is what this small patch does. It may
be worth creating an option for this, I don't know if waiting a big amount
of time is relevant in specific some cases.
Regards,
--
Jeremie Le Hen
< jeremie at le-hen dot org >< ttz at chchile dot org >
-------------- next part --------------
Index: rpc.umntall.c
===================================================================
RCS file: /nfs/donald/repo/FreeBSD/src/usr.sbin/rpc.umntall/rpc.umntall.c,v
retrieving revision 1.12
diff -u -p -r1.12 rpc.umntall.c
--- rpc.umntall.c 26 Oct 2003 06:14:10 -0000 1.12
+++ rpc.umntall.c 20 May 2005 17:59:45 -0000
@@ -174,14 +174,15 @@ do_umntall(char *hostname) {
struct timeval try;
CLIENT *clp;
- clp = clnt_create(hostname, RPCPROG_MNT, RPCMNT_VER1, "udp");
+ try.tv_sec = 3;
+ try.tv_usec = 0;
+ clp = clnt_create_timed(hostname, RPCPROG_MNT, RPCMNT_VER1, "udp",
+ &try);
if (clp == NULL) {
warnx("%s: %s", hostname, clnt_spcreateerror("RPCPROG_MNT"));
return (0);
}
clp->cl_auth = authunix_create_default();
- try.tv_sec = 3;
- try.tv_usec = 0;
clnt_stat = clnt_call(clp, RPCMNT_UMNTALL,
(xdrproc_t)xdr_void, (caddr_t)0,
(xdrproc_t)xdr_void, (caddr_t)0, try);
@@ -201,14 +202,15 @@ do_umount(char *hostname, char *dirp) {
struct timeval try;
CLIENT *clp;
- clp = clnt_create(hostname, RPCPROG_MNT, RPCMNT_VER1, "udp");
+ try.tv_sec = 3;
+ try.tv_usec = 0;
+ clp = clnt_create_timed(hostname, RPCPROG_MNT, RPCMNT_VER1, "udp",
+ &try);
if (clp == NULL) {
warnx("%s: %s", hostname, clnt_spcreateerror("RPCPROG_MNT"));
return (0);
}
clp->cl_auth = authsys_create_default();
- try.tv_sec = 3;
- try.tv_usec = 0;
clnt_stat = clnt_call(clp, RPCMNT_UMOUNT, (xdrproc_t)xdr_dir, dirp,
(xdrproc_t)xdr_void, (caddr_t)0, try);
if (clnt_stat != RPC_SUCCESS)
More information about the freebsd-current
mailing list