blob: 676cefa52035487747c2bffea67837f66b4c08dd [file] [log] [blame] [raw]
--- /dev/null 2019-03-22 13:44:00.000000000 +0800
+++ freebsd-11.1/usr/src/sbin/mount_nfs/build.sh 2019-03-22 13:35:08.823709000 +0800
@@ -0,0 +1,3 @@
+#!/bin/sh
+#gcc -Wall -O1 -I ../mount -I ../../usr.sbin/rpc.umntall mount.nfs.c -o mount.nfs ../mount/getmntopts.o ../../usr.sbin/rpc.umntall/mounttab.o -L /usr/home/WHR/src/ToolBox/libgetopt -l getopt
+gcc -Wall -g -O1 -I ../mount -I ../../usr.sbin/rpc.umntall mount.nfs.c -o mount.nfs ../mount/getmntopts.o ../../usr.sbin/rpc.umntall/mounttab.o -L /usr/home/WHR/src/ToolBox/libgetopt -l getopt
--- freebsd-11.1/usr/src/sbin/mount_nfs/mount_nfs.c 2017-07-21 07:43:25.000000000 +0800
+++ freebsd-11.1/usr/src/sbin/mount_nfs/mount.nfs.c 2019-03-22 13:35:08.824961000 +0800
@@ -160,11 +160,8 @@
memset(errmsg, 0, sizeof(errmsg));
gssname = NULL;
- fstype = strrchr(argv[0], '_');
- if (fstype == NULL)
- errx(EX_USAGE, "argv[0] must end in _fstype");
-
- ++fstype;
+ // Fstype is the new nfs (V4) by default
+ fstype = "nfs";
while ((c = getopt(argc, argv,
"23a:bcdD:g:I:iLlNo:PR:r:sTt:w:x:U")) != -1)
@@ -267,12 +264,13 @@
} else if (strcmp(opt, "nfsv2") == 0) {
pass_flag_to_nmount=0;
mountmode = V2;
+ fstype = "oldnfs";
} else if (strcmp(opt, "nfsv3") == 0) {
mountmode = V3;
+ fstype = "oldnfs";
} else if (strcmp(opt, "nfsv4") == 0) {
pass_flag_to_nmount=0;
mountmode = V4;
- fstype = "nfs";
nfsproto = IPPROTO_TCP;
if (portspec == NULL)
portspec = "2049";
@@ -347,9 +345,11 @@
switch (num) {
case 2:
mountmode = V2;
+ fstype = "oldnfs";
break;
case 3:
mountmode = V3;
+ fstype = "oldnfs";
build_iovec(&iov, &iovlen,
"nfsv3", NULL, 0);
break;
@@ -684,6 +684,7 @@
int doconnect, nfsvers, mntvers, sotype;
enum clnt_stat clntstat;
enum mountmode trymntmode;
+ int try_any = mountmode == ANY;
sotype = 0;
trymntmode = mountmode;
@@ -724,21 +725,38 @@
}
tryagain:
- if (trymntmode == V4) {
- nfsvers = 4;
- mntvers = 3; /* Workaround for GCC. */
+ if (trymntmode == V3) {
+ nfsvers = 3;
+ mntvers = 3;
} else if (trymntmode == V2) {
nfsvers = 2;
mntvers = 1;
} else {
- nfsvers = 3;
- mntvers = 3;
+ // V4 is the default
+ nfsvers = 4;
+ mntvers = 3; /* Workaround for GCC. */
+ trymntmode = V4;
}
if (portspec != NULL) {
/* `ai' contains the complete nfsd sockaddr. */
nfs_nb.buf = ai->ai_addr;
nfs_nb.len = nfs_nb.maxlen = ai->ai_addrlen;
+#if 0
+ } else if(nfsvers == 4) {
+ /* Port number default to 2049 for V4 */
+ nfs_nb.buf = &nfs_ss;
+ nfs_nb.len = nfs_nb.maxlen = ai->ai_addrlen;
+ memcpy(&nfs_ss, ai->ai_addr, ai->ai_addrlen);
+ switch(ai->ai_family) {
+ case AF_INET:
+ ((struct sockaddr_in *)&nfs_ss)->sin_port = htons(2049);
+ break;
+ case AF_INET6:
+ ((struct sockaddr_in6 *)&nfs_ss)->sin6_port = htons(2049);
+ break;
+ }
+#endif
} else {
/* Ask the remote rpcbind. */
nfs_nb.buf = &nfs_ss;
@@ -747,8 +765,8 @@
if (!rpcb_getaddr(NFS_PROGRAM, nfsvers, nconf, &nfs_nb,
hostp)) {
if (rpc_createerr.cf_stat == RPC_PROGVERSMISMATCH &&
- trymntmode == ANY) {
- trymntmode = V2;
+ try_any) {
+ trymntmode = trymntmode == V4 ? V3 : V2;
goto tryagain;
}
snprintf(errbuf, sizeof errbuf, "[%s] %s:%s: %s",
@@ -789,7 +807,7 @@
clntstat = clnt_call(clp, NFSPROC_NULL, (xdrproc_t)xdr_void, NULL,
(xdrproc_t)xdr_void, NULL, try);
if (clntstat != RPC_SUCCESS) {
- if (clntstat == RPC_PROGVERSMISMATCH && trymntmode == ANY) {
+ if (clntstat == RPC_PROGVERSMISMATCH && try_any) {
clnt_destroy(clp);
trymntmode = V2;
goto tryagain;
@@ -846,7 +864,7 @@
try);
auth_destroy(clp->cl_auth);
if (clntstat != RPC_SUCCESS) {
- if (clntstat == RPC_PROGVERSMISMATCH && trymntmode == ANY) {
+ if (clntstat == RPC_PROGVERSMISMATCH && try_any) {
clnt_destroy(clp);
trymntmode = V2;
goto tryagain;
@@ -1035,7 +1053,7 @@
usage(void)
{
(void)fprintf(stderr, "%s\n%s\n%s\n%s\n",
-"usage: mount_nfs [-23bcdiLlNPsTU] [-a maxreadahead] [-D deadthresh]",
+"Usage: mount.nfs [-23bcdiLlNPsTU] [-a maxreadahead] [-D deadthresh]",
" [-g maxgroups] [-I readdirsize] [-o options] [-R retrycnt]",
" [-r readsize] [-t timeout] [-w writesize] [-x retrans]",
" rhost:path node");