]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/network.c
libnfs.a: move more mount-only functions out of libnfs.a
[nfs-utils.git] / utils / mount / network.c
index c997c4cc0ee30e86d482bd23c4cc7646d53c5a49..c092571044b0c31d61cec3f7862c16a93c8f8650 100644 (file)
@@ -57,6 +57,40 @@ extern int nfs_mount_data_version;
 extern char *progname;
 extern int verbose;
 
+static const unsigned long nfs_to_mnt[] = {
+       0,
+       0,
+       1,
+       3,
+};
+
+static const unsigned long mnt_to_nfs[] = {
+       0,
+       2,
+       2,
+       3,
+};
+
+/*
+ * Map an NFS version into the corresponding Mountd version
+ */
+unsigned long nfsvers_to_mnt(const unsigned long vers)
+{
+       if (vers <= 3)
+               return nfs_to_mnt[vers];
+       return 0;
+}
+
+/*
+ * Map a Mountd version into the corresponding NFS version
+ */
+static unsigned long mntvers_to_nfs(const unsigned long vers)
+{
+       if (vers <= 3)
+               return mnt_to_nfs[vers];
+       return 0;
+}
+
 static const unsigned int probe_udp_only[] = {
        IPPROTO_UDP,
        0,
@@ -429,3 +463,50 @@ int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp)
                return 1;
        return 0;
 }
+
+CLIENT *mnt_openclnt(clnt_addr_t *mnt_server, int *msock)
+{
+       struct sockaddr_in *mnt_saddr = &mnt_server->saddr;
+       struct pmap *mnt_pmap = &mnt_server->pmap;
+       CLIENT *clnt = NULL;
+
+       mnt_saddr->sin_port = htons((u_short)mnt_pmap->pm_port);
+       *msock = get_socket(mnt_saddr, mnt_pmap->pm_prot, TRUE, FALSE);
+       if (*msock == RPC_ANYSOCK) {
+               if (rpc_createerr.cf_error.re_errno == EADDRINUSE)
+                       /*
+                        * Probably in-use by a TIME_WAIT connection,
+                        * It is worth waiting a while and trying again.
+                        */
+                       rpc_createerr.cf_stat = RPC_TIMEDOUT;
+               return NULL;
+       }
+
+       switch (mnt_pmap->pm_prot) {
+       case IPPROTO_UDP:
+               clnt = clntudp_bufcreate(mnt_saddr,
+                                        mnt_pmap->pm_prog, mnt_pmap->pm_vers,
+                                        RETRY_TIMEOUT, msock,
+                                        MNT_SENDBUFSIZE, MNT_RECVBUFSIZE);
+               break;
+       case IPPROTO_TCP:
+               clnt = clnttcp_create(mnt_saddr,
+                                     mnt_pmap->pm_prog, mnt_pmap->pm_vers,
+                                     msock,
+                                     MNT_SENDBUFSIZE, MNT_RECVBUFSIZE);
+               break;
+       }
+       if (clnt) {
+               /* try to mount hostname:dirname */
+               clnt->cl_auth = authunix_create_default();
+               return clnt;
+       }
+       return NULL;
+}
+
+void mnt_closeclnt(CLIENT *clnt, int msock)
+{
+       auth_destroy(clnt->cl_auth);
+       clnt_destroy(clnt);
+       close(msock);
+}