saddr->sin_family = AF_INET;
if (!inet_aton(hostname, &saddr->sin_addr)) {
if ((hp = gethostbyname(hostname)) == NULL) {
- nfs_error(_("mount: can't get address for %s\n"),
- hostname);
+ nfs_error(_("%s: can't get address for %s\n"),
+ progname, hostname);
return 0;
} else {
if (hp->h_length > sizeof(*saddr)) {
- nfs_error(_("mount: got bad hp->h_length\n"));
+ nfs_error(_("%s: got bad hp->h_length\n"),
+ progname);
hp->h_length = sizeof(*saddr);
}
memcpy(&saddr->sin_addr, hp->h_addr, hp->h_length);
return 1;
}
-int probe_nfsport(clnt_addr_t *nfs_server)
+static int probe_nfsport(clnt_addr_t *nfs_server)
{
struct pmap *pmap = &nfs_server->pmap;
return probe_port(nfs_server, probe_nfs2_only, probe_udp_only);
}
-int probe_mntport(clnt_addr_t *mnt_server)
+static int probe_mntport(clnt_addr_t *mnt_server)
{
struct pmap *pmap = &mnt_server->pmap;
return 0;
}
+
+/*
+ * nfs_call_umount - ask the server to remove a share from it's rmtab
+ * @mnt_server: address of RPC MNT program server
+ * @argp: directory path of share to "unmount"
+ *
+ * Returns one if the unmount call succeeded; zero if the unmount
+ * failed for any reason.
+ *
+ * Note that a side effect of calling this function is that rpccreateerr
+ * is set.
+ */
+int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp)
+{
+ CLIENT *clnt;
+ enum clnt_stat res = 0;
+ int msock;
+
+ switch (mnt_server->pmap.pm_vers) {
+ case 3:
+ case 2:
+ case 1:
+ if (!probe_mntport(mnt_server))
+ return 0;
+ clnt = mnt_openclnt(mnt_server, &msock);
+ if (!clnt)
+ return 0;
+ res = clnt_call(clnt, MOUNTPROC_UMNT,
+ (xdrproc_t)xdr_dirpath, (caddr_t)argp,
+ (xdrproc_t)xdr_void, NULL,
+ TIMEOUT);
+ mnt_closeclnt(clnt, msock);
+ if (res == RPC_SUCCESS)
+ return 1;
+ break;
+ default:
+ res = RPC_SUCCESS;
+ break;
+ }
+
+ if (res == RPC_SUCCESS)
+ return 1;
+ return 0;
+}