]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/network.c
Make sure nfs_call_umount's callers are handling its return code correctly
[nfs-utils.git] / utils / mount / network.c
index ab8cfb751a021989721074486f8c87791415e280..12fc7620877b11eb6d8e84e042302a445b42f465 100644 (file)
@@ -245,7 +245,7 @@ out_ok:
        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;
 
@@ -258,7 +258,7 @@ int probe_nfsport(clnt_addr_t *nfs_server)
                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;
 
@@ -362,3 +362,47 @@ int start_statd(void)
 
        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;
+}