blob: ed3455b3a50f2f1c291ace6c2209d535438fba0f [file] [log] [blame] [raw]
Ignore RPC register failures if NFSv4 is enabled.
Add option '-p' to skip RPC registering in nfsd(8).
diff -ru --exclude-from freebsd-src-diff-exclude-names /var/archive3/public/freebsd-releng-10.4-src/usr.sbin/nfsd/nfsd.c freebsd-10.4/usr.sbin/nfsd/nfsd.c
--- /var/archive3/public/freebsd-releng-10.4-src/usr.sbin/nfsd/nfsd.c 2017-09-29 08:20:24.000000000 +0800
+++ freebsd-10.4/usr.sbin/nfsd/nfsd.c 2019-08-18 09:57:34.595101984 +0800
@@ -157,7 +157,7 @@
int on = 1, unregister, reregister, sock;
int tcp6sock, ip6flag, tcpflag, tcpsock;
int udpflag, ecode, error, s, srvcnt;
- int bindhostc, bindanyflag, rpcbreg, rpcbregcnt;
+ int bindhostc, bindanyflag, rpcbreg, rpcbregcnt, no_rpc_reg = 0;
int nfssvc_addsock;
int longindex = 0;
const char *lopt;
@@ -170,7 +170,7 @@
getopt_shortopts = "ah:n:rdtueo";
getopt_usage =
"usage:\n"
- " nfsd [-ardtueo] [-h bindip]\n"
+ " nfsd [-ardtueop] [-h bindip]\n"
" [-n numservers] [--minthreads #] [--maxthreads #]\n";
while ((ch = getopt_long(argc, argv, getopt_shortopts, longopts,
&longindex)) != -1)
@@ -192,6 +192,7 @@
break;
case 'r':
reregister = 1;
+ no_rpc_reg = 0;
break;
case 'd':
unregister = 1;
@@ -208,6 +209,10 @@
case 'o':
run_v4server = 0;
break;
+ case 'p':
+ no_rpc_reg = 1;
+ reregister = 0;
+ break;
case 0:
lopt = longopts[longindex].name;
if (!strcmp(lopt, "minthreads")) {
@@ -503,7 +508,7 @@
(void)close(sock);
}
}
- if (rpcbreg == 1) {
+ if (!no_rpc_reg && rpcbreg == 1) {
memset(&hints, 0, sizeof hints);
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET;
@@ -572,7 +577,7 @@
(void)close(sock);
}
}
- if (rpcbreg == 1) {
+ if (!no_rpc_reg && rpcbreg == 1) {
memset(&hints, 0, sizeof hints);
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET6;
@@ -637,7 +642,7 @@
connect_type_cnt++;
}
}
- if (rpcbreg == 1) {
+ if (!no_rpc_reg && rpcbreg == 1) {
memset(&hints, 0, sizeof hints);
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET;
@@ -657,8 +662,11 @@
nb_tcp.len = nb_tcp.maxlen = ai_tcp->ai_addrlen;
if ((!rpcb_set(NFS_PROGRAM, 2, nconf_tcp,
&nb_tcp)) || (!rpcb_set(NFS_PROGRAM, 3,
- nconf_tcp, &nb_tcp)))
- err(1, "rpcb_set tcp failed");
+ nconf_tcp, &nb_tcp))) {
+ run_v4server ?
+ warn("rpcb_set tcp failed") :
+ err(1, "rpcb_set tcp failed");
+ }
freeaddrinfo(ai_tcp);
}
}
@@ -713,7 +721,7 @@
connect_type_cnt++;
}
}
- if (rpcbreg == 1) {
+ if (!no_rpc_reg && rpcbreg == 1) {
memset(&hints, 0, sizeof hints);
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET6;
@@ -731,17 +739,15 @@
nb_tcp6.buf = ai_tcp6->ai_addr;
nb_tcp6.len = nb_tcp6.maxlen = ai_tcp6->ai_addrlen;
if ((!rpcb_set(NFS_PROGRAM, 2, nconf_tcp6, &nb_tcp6)) ||
- (!rpcb_set(NFS_PROGRAM, 3, nconf_tcp6, &nb_tcp6)))
- err(1, "rpcb_set tcp6 failed");
+ (!rpcb_set(NFS_PROGRAM, 3, nconf_tcp6, &nb_tcp6))) {
+ run_v4server ?
+ warn("rpcb_set tcp failed") :
+ err(1, "rpcb_set tcp failed");
+ }
freeaddrinfo(ai_tcp6);
}
}
- if (rpcbregcnt == 0) {
- syslog(LOG_ERR, "rpcb_set() failed, nothing to do: %m");
- nfsd_exit(1);
- }
-
if (tcpflag && connect_type_cnt == 0) {
syslog(LOG_ERR, "tcp connects == 0, nothing to do: %m");
nfsd_exit(1);