]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/network.c
umount.nfs: move nfs_call_umount to network.c
[nfs-utils.git] / utils / mount / network.c
index 8da57d9cb0bec897e812be76ff8ec96f90d28774..b04491c7e38605c8a0056803eb4bea962d4eccef 100644 (file)
@@ -106,12 +106,13 @@ int nfs_gethostbyname(const char *hostname, struct sockaddr_in *saddr)
        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);
@@ -244,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;
 
@@ -257,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;
 
@@ -361,3 +362,34 @@ int start_statd(void)
 
        return 0;
 }
+
+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))
+                       goto out_bad;
+               clnt = mnt_openclnt(mnt_server, &msock);
+               if (!clnt)
+                       goto out_bad;
+               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 = 1;
+               break;
+       }
+ out_bad:
+       return res;
+}