extern int nfs_gethostbyname(const char *, struct sockaddr_in *);
static inline enum clnt_stat
-nfs3_umount(dirpath *argp, CLIENT *clnt)
+nfs_umount(dirpath *argp, CLIENT *clnt)
{
- static char clnt_res;
- memset (&clnt_res, 0, sizeof(clnt_res));
return clnt_call(clnt, MOUNTPROC_UMNT,
(xdrproc_t) xdr_dirpath, (caddr_t)argp,
- (xdrproc_t) xdr_void, (caddr_t) &clnt_res,
- TIMEOUT);
-}
-
-static inline enum clnt_stat
-nfs2_umount(dirpath *argp, CLIENT *clnt)
-{
- static char clnt_res;
- memset (&clnt_res, 0, sizeof(clnt_res));
- return clnt_call(clnt, MOUNTPROC_UMNT,
- (xdrproc_t) xdr_dirpath, (caddr_t)argp,
- (xdrproc_t) xdr_void, (caddr_t) &clnt_res,
+ (xdrproc_t) xdr_void, NULL,
TIMEOUT);
}
enum clnt_stat res = 0;
int msock;
- clnt = mnt_openclnt(mnt_server, &msock);
- if (!clnt)
- goto out_bad;
switch (mnt_server->pmap.pm_vers) {
case 3:
- res = nfs3_umount(argp, clnt);
- break;
case 2:
case 1:
- res = nfs2_umount(argp, clnt);
+ if (!probe_mntport(mnt_server))
+ goto out_bad;
+ clnt = mnt_openclnt(mnt_server, &msock);
+ if (!clnt)
+ goto out_bad;
+ res = nfs_umount(argp, clnt);
+ mnt_closeclnt(clnt, msock);
+ if (res == RPC_SUCCESS)
+ return 1;
break;
default:
+ res = 1;
break;
}
- mnt_closeclnt(clnt, msock);
- if (res == RPC_SUCCESS)
- return 1;
out_bad:
- return 0;
+ return res;
}
u_int get_mntproto(const char *);
char *hostname;
char *dirname;
clnt_addr_t mnt_server = { &hostname, };
+ struct mntent mnt = { .mnt_opts = opts };
struct pmap *pmap = &mnt_server.pmap;
char *p;
}
pmap->pm_prog = MOUNTPROG;
- pmap->pm_vers = MOUNTVERS;
+ pmap->pm_vers = MOUNTVERS_NFSV3;
pmap->pm_prot = get_mntproto(spec);
if (opts && (p = strstr(opts, "mountprog=")) && isdigit(*(p+10)))
pmap->pm_prog = atoi(p+10);
if (opts && (p = strstr(opts, "mountport=")) && isdigit(*(p+10)))
pmap->pm_port = atoi(p+10);
- if (opts && (p = strstr(opts, "nfsvers=")) && isdigit(*(p+8)))
- pmap->pm_vers = nfsvers_to_mnt(atoi(p+8));
+ if (opts && hasmntopt(&mnt, "v2"))
+ pmap->pm_vers = nfsvers_to_mnt(2);
+ if (opts && hasmntopt(&mnt, "v3"))
+ pmap->pm_vers = nfsvers_to_mnt(3);
+ if (opts && hasmntopt(&mnt, "v4"))
+ pmap->pm_vers = nfsvers_to_mnt(4);
+ if (opts && (p = strstr(opts, "vers=")) && isdigit(*(p+5)))
+ pmap->pm_vers = nfsvers_to_mnt(atoi(p+5));
if (opts && (p = strstr(opts, "mountvers=")) && isdigit(*(p+10)))
pmap->pm_vers = atoi(p+10);
if (!nfs_gethostbyname(hostname, &mnt_server.saddr))
goto out_bad;
- if (!probe_mntport(&mnt_server))
- goto out_bad;
return nfs_call_umount(&mnt_server, &dirname);
out_bad:
printf("%s: %s: not found or not mounted\n", progname, spec);