Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
/* $NetBSD: lockd.c,v 1.7 2000/08/12 18:08:44 thorpej Exp $ */
|
|
|
|
/* $FreeBSD$ */
|
|
|
|
|
2017-11-18 14:26:50 +00:00
|
|
|
/*-
|
|
|
|
* SPDX-License-Identifier: BSD-4-Clause
|
|
|
|
*
|
1996-02-17 15:11:29 +00:00
|
|
|
* Copyright (c) 1995
|
|
|
|
* A.R. Gordon (andrew.gordon@net-tel.co.uk). All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed for the FreeBSD project
|
|
|
|
* 4. Neither the name of the author nor the names of any co-contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY ANDREW GORDON AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
#include <sys/cdefs.h>
|
1997-10-13 11:13:33 +00:00
|
|
|
#ifndef lint
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
__RCSID("$NetBSD: lockd.c,v 1.7 2000/08/12 18:08:44 thorpej Exp $");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* main() function for NFS lock daemon. Most of the code in this
|
|
|
|
* file was generated by running rpcgen /usr/include/rpcsvc/nlm_prot.x.
|
|
|
|
*
|
|
|
|
* The actual program logic is in the file lock_proc.c
|
|
|
|
*/
|
1996-02-17 15:11:29 +00:00
|
|
|
|
2008-03-27 11:54:20 +00:00
|
|
|
#include <sys/param.h>
|
|
|
|
#include <sys/linker.h>
|
|
|
|
#include <sys/module.h>
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
#include <sys/socket.h>
|
2008-03-26 15:23:12 +00:00
|
|
|
#include <sys/stat.h>
|
1996-02-17 15:11:29 +00:00
|
|
|
|
2007-11-02 14:51:53 +00:00
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
|
1997-10-13 11:13:33 +00:00
|
|
|
#include <err.h>
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
#include <stdio.h>
|
1997-10-13 11:13:33 +00:00
|
|
|
#include <stdlib.h>
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
#include <errno.h>
|
|
|
|
#include <syslog.h>
|
|
|
|
#include <signal.h>
|
1997-10-13 11:13:33 +00:00
|
|
|
#include <string.h>
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <libutil.h>
|
|
|
|
#include <netconfig.h>
|
2007-11-02 14:51:53 +00:00
|
|
|
#include <netdb.h>
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
|
1997-10-13 11:13:33 +00:00
|
|
|
#include <rpc/rpc.h>
|
2003-01-16 07:27:30 +00:00
|
|
|
#include <rpc/rpc_com.h>
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
#include <rpcsvc/sm_inter.h>
|
|
|
|
|
1996-02-17 15:11:29 +00:00
|
|
|
#include "lockd.h"
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
#include <rpcsvc/nlm_prot.h>
|
|
|
|
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
#define GETPORT_MAXTRY 20 /* Max tries to get a port # */
|
|
|
|
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
int debug_level = 0; /* 0 = no debugging syslog() calls */
|
|
|
|
int _rpcsvcdirty = 0;
|
|
|
|
|
|
|
|
int grace_expired;
|
2001-04-17 20:45:23 +00:00
|
|
|
int nsm_state;
|
2008-03-26 15:23:12 +00:00
|
|
|
int kernel_lockd;
|
2008-06-26 10:21:54 +00:00
|
|
|
int kernel_lockd_client;
|
2001-04-17 20:45:23 +00:00
|
|
|
pid_t client_pid;
|
|
|
|
struct mon mon_host;
|
2007-11-02 14:51:53 +00:00
|
|
|
char **hosts, *svcport_str = NULL;
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
static int mallocd_svcport = 0;
|
|
|
|
static int *sock_fd;
|
|
|
|
static int sock_fdcnt;
|
|
|
|
static int sock_fdpos;
|
2007-11-02 14:51:53 +00:00
|
|
|
int nhosts = 0;
|
|
|
|
int xcreated = 0;
|
2008-03-26 15:23:12 +00:00
|
|
|
char **addrs; /* actually (netid, uaddr) pairs */
|
|
|
|
int naddrs; /* count of how many (netid, uaddr) pairs */
|
2010-12-20 21:12:18 +00:00
|
|
|
char localhost[] = "localhost";
|
1996-02-17 15:11:29 +00:00
|
|
|
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
static int create_service(struct netconfig *nconf);
|
|
|
|
static void complete_service(struct netconfig *nconf, char *port_str);
|
|
|
|
static void clearout_service(void);
|
2017-06-21 06:34:06 +00:00
|
|
|
static void out_of_mem(void) __dead2;
|
2001-04-17 20:45:23 +00:00
|
|
|
void init_nsm(void);
|
2002-03-21 22:52:45 +00:00
|
|
|
void usage(void);
|
|
|
|
|
|
|
|
void sigalarm_handler(void);
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
|
2008-03-26 15:23:12 +00:00
|
|
|
/*
|
|
|
|
* XXX move to some header file.
|
|
|
|
*/
|
|
|
|
#define _PATH_RPCLOCKDSOCK "/var/run/rpclockd.sock"
|
|
|
|
|
1997-10-13 11:13:33 +00:00
|
|
|
int
|
2007-11-02 14:51:53 +00:00
|
|
|
main(int argc, char **argv)
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
{
|
2007-11-02 14:51:53 +00:00
|
|
|
int ch, i, s;
|
|
|
|
void *nc_handle;
|
|
|
|
char *endptr, **hosts_bak;
|
2001-11-29 17:36:45 +00:00
|
|
|
struct sigaction sigalarm;
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
int grace_period = 30;
|
2019-11-22 16:53:30 +00:00
|
|
|
int foreground = 0;
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
struct netconfig *nconf;
|
2007-11-02 14:51:53 +00:00
|
|
|
int have_v6 = 1;
|
2003-01-16 07:27:30 +00:00
|
|
|
int maxrec = RPC_MAXDATASIZE;
|
2007-04-03 20:58:28 +00:00
|
|
|
in_port_t svcport = 0;
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
int attempt_cnt, port_len, port_pos, ret;
|
|
|
|
char **port_list;
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
|
2019-11-22 16:53:30 +00:00
|
|
|
while ((ch = getopt(argc, argv, "d:Fg:h:p:")) != (-1)) {
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
switch (ch) {
|
|
|
|
case 'd':
|
|
|
|
debug_level = atoi(optarg);
|
|
|
|
if (!debug_level) {
|
|
|
|
usage();
|
|
|
|
/* NOTREACHED */
|
|
|
|
}
|
|
|
|
break;
|
2019-11-22 16:53:30 +00:00
|
|
|
case 'F':
|
|
|
|
foreground = 1;
|
|
|
|
break;
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
case 'g':
|
|
|
|
grace_period = atoi(optarg);
|
|
|
|
if (!grace_period) {
|
|
|
|
usage();
|
|
|
|
/* NOTREACHED */
|
|
|
|
}
|
|
|
|
break;
|
2007-11-02 14:51:53 +00:00
|
|
|
case 'h':
|
|
|
|
++nhosts;
|
|
|
|
hosts_bak = realloc(hosts, nhosts * sizeof(char *));
|
|
|
|
if (hosts_bak == NULL) {
|
|
|
|
if (hosts != NULL) {
|
|
|
|
for (i = 0; i < nhosts; i++)
|
|
|
|
free(hosts[i]);
|
|
|
|
free(hosts);
|
|
|
|
out_of_mem();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
hosts = hosts_bak;
|
|
|
|
hosts[nhosts - 1] = strdup(optarg);
|
|
|
|
if (hosts[nhosts - 1] == NULL) {
|
|
|
|
for (i = 0; i < (nhosts - 1); i++)
|
|
|
|
free(hosts[i]);
|
|
|
|
free(hosts);
|
|
|
|
out_of_mem();
|
|
|
|
}
|
|
|
|
break;
|
2007-04-03 20:58:28 +00:00
|
|
|
case 'p':
|
|
|
|
endptr = NULL;
|
|
|
|
svcport = (in_port_t)strtoul(optarg, &endptr, 10);
|
|
|
|
if (endptr == NULL || *endptr != '\0' ||
|
|
|
|
svcport == 0 || svcport >= IPPORT_MAX)
|
|
|
|
usage();
|
2007-11-02 14:51:53 +00:00
|
|
|
svcport_str = strdup(optarg);
|
2007-04-03 20:58:28 +00:00
|
|
|
break;
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
default:
|
|
|
|
usage();
|
|
|
|
/* NOTREACHED */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (geteuid()) { /* This command allowed only to root */
|
|
|
|
fprintf(stderr, "Sorry. You are not superuser\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2008-03-27 11:54:20 +00:00
|
|
|
kernel_lockd = FALSE;
|
2008-06-26 10:21:54 +00:00
|
|
|
kernel_lockd_client = FALSE;
|
2008-03-27 11:54:20 +00:00
|
|
|
if (modfind("nfslockd") < 0) {
|
|
|
|
if (kldload("nfslockd") < 0) {
|
|
|
|
fprintf(stderr, "Can't find or load kernel support for rpc.lockd - using non-kernel implementation\n");
|
2008-04-10 12:54:53 +00:00
|
|
|
} else {
|
|
|
|
kernel_lockd = TRUE;
|
2008-03-27 11:54:20 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
kernel_lockd = TRUE;
|
|
|
|
}
|
2008-06-26 10:21:54 +00:00
|
|
|
if (kernel_lockd) {
|
|
|
|
if (getosreldate() >= 800040)
|
|
|
|
kernel_lockd_client = TRUE;
|
|
|
|
}
|
2008-03-27 11:54:20 +00:00
|
|
|
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
(void)rpcb_unset(NLM_PROG, NLM_SM, NULL);
|
|
|
|
(void)rpcb_unset(NLM_PROG, NLM_VERS, NULL);
|
|
|
|
(void)rpcb_unset(NLM_PROG, NLM_VERSX, NULL);
|
|
|
|
(void)rpcb_unset(NLM_PROG, NLM_VERS4, NULL);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Check if IPv6 support is present.
|
|
|
|
*/
|
|
|
|
s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
|
|
|
|
if (s < 0)
|
2007-11-02 14:51:53 +00:00
|
|
|
have_v6 = 0;
|
|
|
|
else
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
close(s);
|
2007-04-03 20:58:28 +00:00
|
|
|
|
2003-01-16 07:27:30 +00:00
|
|
|
rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec);
|
|
|
|
|
2007-11-02 14:51:53 +00:00
|
|
|
/*
|
|
|
|
* If no hosts were specified, add a wildcard entry to bind to
|
|
|
|
* INADDR_ANY. Otherwise make sure 127.0.0.1 and ::1 are added to the
|
|
|
|
* list.
|
|
|
|
*/
|
|
|
|
if (nhosts == 0) {
|
2015-12-29 11:24:41 +00:00
|
|
|
hosts = malloc(sizeof(char *));
|
2007-11-02 14:51:53 +00:00
|
|
|
if (hosts == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
|
2014-01-04 01:12:28 +00:00
|
|
|
hosts[0] = strdup("*");
|
2007-11-02 14:51:53 +00:00
|
|
|
nhosts = 1;
|
|
|
|
} else {
|
|
|
|
if (have_v6) {
|
|
|
|
hosts_bak = realloc(hosts, (nhosts + 2) *
|
|
|
|
sizeof(char *));
|
|
|
|
if (hosts_bak == NULL) {
|
|
|
|
for (i = 0; i < nhosts; i++)
|
|
|
|
free(hosts[i]);
|
|
|
|
free(hosts);
|
|
|
|
out_of_mem();
|
|
|
|
} else
|
|
|
|
hosts = hosts_bak;
|
|
|
|
|
|
|
|
nhosts += 2;
|
2014-01-04 01:12:28 +00:00
|
|
|
hosts[nhosts - 2] = strdup("::1");
|
2007-04-03 20:58:28 +00:00
|
|
|
} else {
|
2007-11-02 14:51:53 +00:00
|
|
|
hosts_bak = realloc(hosts, (nhosts + 1) * sizeof(char *));
|
|
|
|
if (hosts_bak == NULL) {
|
|
|
|
for (i = 0; i < nhosts; i++)
|
|
|
|
free(hosts[i]);
|
|
|
|
|
|
|
|
free(hosts);
|
|
|
|
out_of_mem();
|
|
|
|
} else {
|
|
|
|
nhosts += 1;
|
|
|
|
hosts = hosts_bak;
|
|
|
|
}
|
2007-04-03 20:58:28 +00:00
|
|
|
}
|
2014-01-04 01:12:28 +00:00
|
|
|
hosts[nhosts - 1] = strdup("127.0.0.1");
|
2007-11-02 14:51:53 +00:00
|
|
|
}
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
|
2008-03-26 15:23:12 +00:00
|
|
|
if (kernel_lockd) {
|
2008-06-26 10:21:54 +00:00
|
|
|
if (!kernel_lockd_client) {
|
|
|
|
/*
|
|
|
|
* For the case where we have a kernel lockd but it
|
|
|
|
* doesn't provide client locking, we run a cut-down
|
|
|
|
* RPC service on a local-domain socket. The kernel's
|
|
|
|
* RPC server will pass what it can't handle (mainly
|
|
|
|
* client replies) down to us.
|
|
|
|
*/
|
|
|
|
struct sockaddr_un sun;
|
|
|
|
int fd, oldmask;
|
|
|
|
SVCXPRT *xprt;
|
|
|
|
|
|
|
|
memset(&sun, 0, sizeof sun);
|
|
|
|
sun.sun_family = AF_LOCAL;
|
|
|
|
unlink(_PATH_RPCLOCKDSOCK);
|
|
|
|
strcpy(sun.sun_path, _PATH_RPCLOCKDSOCK);
|
|
|
|
sun.sun_len = SUN_LEN(&sun);
|
|
|
|
fd = socket(AF_LOCAL, SOCK_STREAM, 0);
|
|
|
|
if (!fd) {
|
|
|
|
err(1, "Can't create local lockd socket");
|
|
|
|
}
|
|
|
|
oldmask = umask(S_IXUSR|S_IRWXG|S_IRWXO);
|
|
|
|
if (bind(fd, (struct sockaddr *) &sun, sun.sun_len) < 0) {
|
|
|
|
err(1, "Can't bind local lockd socket");
|
|
|
|
}
|
|
|
|
umask(oldmask);
|
|
|
|
if (listen(fd, SOMAXCONN) < 0) {
|
|
|
|
err(1, "Can't listen on local lockd socket");
|
|
|
|
}
|
|
|
|
xprt = svc_vc_create(fd, RPC_MAXDATASIZE, RPC_MAXDATASIZE);
|
|
|
|
if (!xprt) {
|
|
|
|
err(1, "Can't create transport for local lockd socket");
|
|
|
|
}
|
|
|
|
if (!svc_reg(xprt, NLM_PROG, NLM_VERS4, nlm_prog_4, NULL)) {
|
|
|
|
err(1, "Can't register service for local lockd socket");
|
|
|
|
}
|
2008-03-26 15:23:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We need to look up the addresses so that we can
|
|
|
|
* hand uaddrs (ascii encoded address+port strings) to
|
|
|
|
* the kernel.
|
|
|
|
*/
|
|
|
|
nc_handle = setnetconfig();
|
|
|
|
while ((nconf = getnetconfig(nc_handle))) {
|
|
|
|
/* We want to listen only on udp6, tcp6, udp, tcp transports */
|
|
|
|
if (nconf->nc_flag & NC_VISIBLE) {
|
|
|
|
/* Skip if there's no IPv6 support */
|
|
|
|
if (have_v6 == 0 && strcmp(nconf->nc_protofmly, "inet6") == 0) {
|
|
|
|
/* DO NOTHING */
|
|
|
|
} else {
|
2017-06-21 06:34:06 +00:00
|
|
|
create_service(nconf);
|
2008-03-26 15:23:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
endnetconfig(nc_handle);
|
|
|
|
} else {
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
attempt_cnt = 1;
|
|
|
|
sock_fdcnt = 0;
|
|
|
|
sock_fd = NULL;
|
|
|
|
port_list = NULL;
|
|
|
|
port_len = 0;
|
2008-03-26 15:23:12 +00:00
|
|
|
nc_handle = setnetconfig();
|
|
|
|
while ((nconf = getnetconfig(nc_handle))) {
|
|
|
|
/* We want to listen only on udp6, tcp6, udp, tcp transports */
|
|
|
|
if (nconf->nc_flag & NC_VISIBLE) {
|
|
|
|
/* Skip if there's no IPv6 support */
|
|
|
|
if (have_v6 == 0 && strcmp(nconf->nc_protofmly, "inet6") == 0) {
|
|
|
|
/* DO NOTHING */
|
|
|
|
} else {
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
ret = create_service(nconf);
|
|
|
|
if (ret == 1)
|
|
|
|
/* Ignore this call */
|
|
|
|
continue;
|
|
|
|
if (ret < 0) {
|
|
|
|
/*
|
|
|
|
* Failed to bind port, so close
|
|
|
|
* off all sockets created and
|
|
|
|
* try again if the port# was
|
|
|
|
* dynamically assigned via
|
|
|
|
* bind(2).
|
|
|
|
*/
|
|
|
|
clearout_service();
|
|
|
|
if (mallocd_svcport != 0 &&
|
|
|
|
attempt_cnt <
|
|
|
|
GETPORT_MAXTRY) {
|
|
|
|
free(svcport_str);
|
|
|
|
svcport_str = NULL;
|
|
|
|
mallocd_svcport = 0;
|
|
|
|
} else {
|
|
|
|
errno = EADDRINUSE;
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"bindresvport_sa: %m");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Start over at the first
|
|
|
|
* service.
|
|
|
|
*/
|
|
|
|
free(sock_fd);
|
|
|
|
sock_fdcnt = 0;
|
|
|
|
sock_fd = NULL;
|
|
|
|
nc_handle = setnetconfig();
|
|
|
|
attempt_cnt++;
|
|
|
|
} else if (mallocd_svcport != 0 &&
|
|
|
|
attempt_cnt == GETPORT_MAXTRY) {
|
|
|
|
/*
|
|
|
|
* For the last attempt, allow
|
|
|
|
* different port #s for each
|
|
|
|
* nconf by saving the
|
|
|
|
* svcport_str and setting it
|
|
|
|
* back to NULL.
|
|
|
|
*/
|
|
|
|
port_list = realloc(port_list,
|
|
|
|
(port_len + 1) *
|
|
|
|
sizeof(char *));
|
|
|
|
if (port_list == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
port_list[port_len++] =
|
|
|
|
svcport_str;
|
|
|
|
svcport_str = NULL;
|
|
|
|
mallocd_svcport = 0;
|
|
|
|
}
|
2008-03-26 15:23:12 +00:00
|
|
|
}
|
2007-11-02 14:51:53 +00:00
|
|
|
}
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
}
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Successfully bound the ports, so call complete_service() to
|
|
|
|
* do the rest of the setup on the service(s).
|
|
|
|
*/
|
|
|
|
sock_fdpos = 0;
|
|
|
|
port_pos = 0;
|
|
|
|
nc_handle = setnetconfig();
|
|
|
|
while ((nconf = getnetconfig(nc_handle))) {
|
|
|
|
/* We want to listen only on udp6, tcp6, udp, tcp transports */
|
|
|
|
if (nconf->nc_flag & NC_VISIBLE) {
|
|
|
|
/* Skip if there's no IPv6 support */
|
|
|
|
if (have_v6 == 0 && strcmp(nconf->nc_protofmly, "inet6") == 0) {
|
|
|
|
/* DO NOTHING */
|
|
|
|
} else if (port_list != NULL) {
|
|
|
|
if (port_pos >= port_len) {
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"too many port#s");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
complete_service(nconf,
|
|
|
|
port_list[port_pos++]);
|
|
|
|
} else
|
|
|
|
complete_service(nconf, svcport_str);
|
|
|
|
}
|
|
|
|
}
|
2008-03-26 15:23:12 +00:00
|
|
|
endnetconfig(nc_handle);
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
free(sock_fd);
|
|
|
|
if (port_list != NULL) {
|
|
|
|
for (port_pos = 0; port_pos < port_len; port_pos++)
|
|
|
|
free(port_list[port_pos]);
|
|
|
|
free(port_list);
|
|
|
|
}
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note that it is NOT sensible to run this program from inetd - the
|
|
|
|
* protocol assumes that it will run immediately at boot time.
|
|
|
|
*/
|
2019-11-22 16:53:30 +00:00
|
|
|
if ((foreground == 0) && daemon(0, debug_level > 0)) {
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
err(1, "cannot fork");
|
|
|
|
/* NOTREACHED */
|
|
|
|
}
|
|
|
|
|
|
|
|
openlog("rpc.lockd", 0, LOG_DAEMON);
|
|
|
|
if (debug_level)
|
|
|
|
syslog(LOG_INFO, "Starting, debug level %d", debug_level);
|
|
|
|
else
|
|
|
|
syslog(LOG_INFO, "Starting");
|
|
|
|
|
2001-11-13 11:24:23 +00:00
|
|
|
sigalarm.sa_handler = (sig_t) sigalarm_handler;
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
sigemptyset(&sigalarm.sa_mask);
|
|
|
|
sigalarm.sa_flags = SA_RESETHAND; /* should only happen once */
|
|
|
|
sigalarm.sa_flags |= SA_RESTART;
|
|
|
|
if (sigaction(SIGALRM, &sigalarm, NULL) != 0) {
|
|
|
|
syslog(LOG_WARNING, "sigaction(SIGALRM) failed: %s",
|
|
|
|
strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2008-03-26 15:23:12 +00:00
|
|
|
if (kernel_lockd) {
|
2008-06-26 10:21:54 +00:00
|
|
|
if (!kernel_lockd_client) {
|
|
|
|
init_nsm();
|
|
|
|
client_pid = client_request();
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create a child process to enter the kernel and then
|
|
|
|
* wait for RPCs on our local domain socket.
|
|
|
|
*/
|
|
|
|
if (!fork())
|
|
|
|
nlm_syscall(debug_level, grace_period,
|
|
|
|
naddrs, addrs);
|
|
|
|
else
|
|
|
|
svc_run();
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* The kernel lockd implementation provides
|
|
|
|
* both client and server so we don't need to
|
|
|
|
* do anything else.
|
|
|
|
*/
|
2008-03-26 15:23:12 +00:00
|
|
|
nlm_syscall(debug_level, grace_period, naddrs, addrs);
|
2008-06-26 10:21:54 +00:00
|
|
|
}
|
2008-03-26 15:23:12 +00:00
|
|
|
} else {
|
|
|
|
grace_expired = 0;
|
|
|
|
alarm(grace_period);
|
|
|
|
|
|
|
|
init_nsm();
|
2001-04-17 20:45:23 +00:00
|
|
|
|
2008-03-26 15:23:12 +00:00
|
|
|
client_pid = client_request();
|
2001-04-17 20:45:23 +00:00
|
|
|
|
2008-03-26 15:23:12 +00:00
|
|
|
svc_run(); /* Should never return */
|
|
|
|
}
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2007-11-02 14:51:53 +00:00
|
|
|
/*
|
|
|
|
* This routine creates and binds sockets on the appropriate
|
2017-06-21 06:34:06 +00:00
|
|
|
* addresses if lockd for user NLM, or perform a lookup of
|
|
|
|
* addresses for the kernel to create transports.
|
|
|
|
*
|
|
|
|
* It gets called one time for each transport.
|
|
|
|
*
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
* It returns 0 upon success, 1 for ingore the call and -1 to indicate
|
|
|
|
* bind failed with EADDRINUSE.
|
2017-06-21 06:34:06 +00:00
|
|
|
*
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
* Any file descriptors that have been created are stored in sock_fd and
|
|
|
|
* the total count of them is maintained in sock_fdcnt.
|
2007-11-02 14:51:53 +00:00
|
|
|
*/
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
static int
|
2007-11-02 14:51:53 +00:00
|
|
|
create_service(struct netconfig *nconf)
|
|
|
|
{
|
|
|
|
struct addrinfo hints, *res = NULL;
|
|
|
|
struct sockaddr_in *sin;
|
|
|
|
struct sockaddr_in6 *sin6;
|
|
|
|
struct __rpc_sockinfo si;
|
|
|
|
int aicode;
|
|
|
|
int fd;
|
|
|
|
int nhostsbak;
|
|
|
|
int r;
|
|
|
|
u_int32_t host_addr[4]; /* IPv4 or IPv6 */
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
int mallocd_res;
|
2007-11-02 14:51:53 +00:00
|
|
|
|
|
|
|
if ((nconf->nc_semantics != NC_TPI_CLTS) &&
|
|
|
|
(nconf->nc_semantics != NC_TPI_COTS) &&
|
|
|
|
(nconf->nc_semantics != NC_TPI_COTS_ORD))
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
return (1); /* not my type */
|
2007-11-02 14:51:53 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* XXX - using RPC library internal functions.
|
|
|
|
*/
|
|
|
|
if (!__rpc_nconf2sockinfo(nconf, &si)) {
|
|
|
|
syslog(LOG_ERR, "cannot get information for %s",
|
|
|
|
nconf->nc_netid);
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
return (1);
|
2007-11-02 14:51:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Get rpc.statd's address on this transport */
|
|
|
|
memset(&hints, 0, sizeof hints);
|
|
|
|
hints.ai_family = si.si_af;
|
|
|
|
hints.ai_socktype = si.si_socktype;
|
|
|
|
hints.ai_protocol = si.si_proto;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Bind to specific IPs if asked to
|
|
|
|
*/
|
|
|
|
nhostsbak = nhosts;
|
|
|
|
while (nhostsbak > 0) {
|
|
|
|
--nhostsbak;
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
mallocd_res = 0;
|
2015-01-19 00:33:32 +00:00
|
|
|
hints.ai_flags = AI_PASSIVE;
|
2007-11-02 14:51:53 +00:00
|
|
|
|
2017-06-21 06:34:06 +00:00
|
|
|
if (!kernel_lockd) {
|
|
|
|
sock_fd = realloc(sock_fd, (sock_fdcnt + 1) * sizeof(int));
|
|
|
|
if (sock_fd == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XXX - using RPC library internal functions.
|
|
|
|
*/
|
|
|
|
if ((fd = __rpc_nconf2fd(nconf)) < 0) {
|
|
|
|
syslog(LOG_ERR, "cannot create socket for %s",
|
|
|
|
nconf->nc_netid);
|
|
|
|
continue;
|
|
|
|
}
|
2007-11-02 14:51:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (hints.ai_family) {
|
|
|
|
case AF_INET:
|
|
|
|
if (inet_pton(AF_INET, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
hints.ai_flags |= AI_NUMERICHOST;
|
2007-11-02 14:51:53 +00:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* Skip if we have an AF_INET6 address.
|
|
|
|
*/
|
|
|
|
if (inet_pton(AF_INET6, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
2017-06-21 06:34:06 +00:00
|
|
|
if (!kernel_lockd)
|
|
|
|
close(fd);
|
2007-11-02 14:51:53 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case AF_INET6:
|
|
|
|
if (inet_pton(AF_INET6, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
hints.ai_flags |= AI_NUMERICHOST;
|
2007-11-02 14:51:53 +00:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* Skip if we have an AF_INET address.
|
|
|
|
*/
|
|
|
|
if (inet_pton(AF_INET, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
2017-06-21 06:34:06 +00:00
|
|
|
if (!kernel_lockd)
|
|
|
|
close(fd);
|
2007-11-02 14:51:53 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If no hosts were specified, just bind to INADDR_ANY
|
|
|
|
*/
|
|
|
|
if (strcmp("*", hosts[nhostsbak]) == 0) {
|
|
|
|
if (svcport_str == NULL) {
|
2017-06-21 06:34:06 +00:00
|
|
|
if ((res = malloc(sizeof(struct addrinfo))) == NULL)
|
2007-11-02 14:51:53 +00:00
|
|
|
out_of_mem();
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
mallocd_res = 1;
|
2007-11-02 14:51:53 +00:00
|
|
|
res->ai_flags = hints.ai_flags;
|
|
|
|
res->ai_family = hints.ai_family;
|
|
|
|
res->ai_protocol = hints.ai_protocol;
|
|
|
|
switch (res->ai_family) {
|
|
|
|
case AF_INET:
|
|
|
|
sin = malloc(sizeof(struct sockaddr_in));
|
|
|
|
if (sin == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
sin->sin_family = AF_INET;
|
|
|
|
sin->sin_port = htons(0);
|
|
|
|
sin->sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
|
res->ai_addr = (struct sockaddr*) sin;
|
|
|
|
res->ai_addrlen = (socklen_t)
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
sizeof(struct sockaddr_in);
|
2007-11-02 14:51:53 +00:00
|
|
|
break;
|
|
|
|
case AF_INET6:
|
|
|
|
sin6 = malloc(sizeof(struct sockaddr_in6));
|
2007-11-07 10:21:36 +00:00
|
|
|
if (sin6 == NULL)
|
2007-11-02 14:51:53 +00:00
|
|
|
out_of_mem();
|
|
|
|
sin6->sin6_family = AF_INET6;
|
|
|
|
sin6->sin6_port = htons(0);
|
|
|
|
sin6->sin6_addr = in6addr_any;
|
|
|
|
res->ai_addr = (struct sockaddr*) sin6;
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
res->ai_addrlen = (socklen_t)
|
|
|
|
sizeof(struct sockaddr_in6);
|
2007-11-02 14:51:53 +00:00
|
|
|
break;
|
|
|
|
default:
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
syslog(LOG_ERR,
|
2017-06-21 06:34:06 +00:00
|
|
|
"bad address family %d",
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
res->ai_family);
|
|
|
|
exit(1);
|
2007-11-02 14:51:53 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ((aicode = getaddrinfo(NULL, svcport_str,
|
|
|
|
&hints, &res)) != 0) {
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"cannot get local address for %s: %s",
|
|
|
|
nconf->nc_netid,
|
|
|
|
gai_strerror(aicode));
|
2017-06-21 06:34:06 +00:00
|
|
|
if (!kernel_lockd)
|
|
|
|
close(fd);
|
2007-11-02 14:51:53 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ((aicode = getaddrinfo(hosts[nhostsbak], svcport_str,
|
|
|
|
&hints, &res)) != 0) {
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"cannot get local address for %s: %s",
|
|
|
|
nconf->nc_netid, gai_strerror(aicode));
|
2017-06-21 06:34:06 +00:00
|
|
|
if (!kernel_lockd)
|
|
|
|
close(fd);
|
2007-11-02 14:51:53 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-21 06:34:06 +00:00
|
|
|
if (kernel_lockd) {
|
|
|
|
struct netbuf servaddr;
|
|
|
|
char *uaddr;
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
|
2017-06-21 06:34:06 +00:00
|
|
|
/*
|
|
|
|
* Look up addresses for the kernel to create transports for.
|
|
|
|
*/
|
|
|
|
servaddr.len = servaddr.maxlen = res->ai_addrlen;
|
|
|
|
servaddr.buf = res->ai_addr;
|
|
|
|
uaddr = taddr2uaddr(nconf, &servaddr);
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
|
2017-06-21 06:34:06 +00:00
|
|
|
addrs = realloc(addrs, 2 * (naddrs + 1) * sizeof(char *));
|
|
|
|
if (!addrs)
|
|
|
|
out_of_mem();
|
|
|
|
addrs[2 * naddrs] = strdup(nconf->nc_netid);
|
|
|
|
addrs[2 * naddrs + 1] = uaddr;
|
|
|
|
naddrs++;
|
|
|
|
} else {
|
|
|
|
/* Store the fd. */
|
|
|
|
sock_fd[sock_fdcnt - 1] = fd;
|
|
|
|
|
|
|
|
/* Now, attempt the bind. */
|
|
|
|
r = bindresvport_sa(fd, res->ai_addr);
|
|
|
|
if (r != 0) {
|
|
|
|
if (errno == EADDRINUSE && mallocd_svcport != 0) {
|
|
|
|
if (mallocd_res != 0) {
|
|
|
|
free(res->ai_addr);
|
|
|
|
free(res);
|
|
|
|
} else
|
|
|
|
freeaddrinfo(res);
|
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
syslog(LOG_ERR, "bindresvport_sa: %m");
|
|
|
|
exit(1);
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
}
|
2007-11-02 14:51:53 +00:00
|
|
|
|
2017-06-21 06:34:06 +00:00
|
|
|
if (svcport_str == NULL) {
|
|
|
|
svcport_str = malloc(NI_MAXSERV * sizeof(char));
|
|
|
|
if (svcport_str == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
mallocd_svcport = 1;
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
|
2017-06-21 06:34:06 +00:00
|
|
|
if (getnameinfo(res->ai_addr,
|
|
|
|
res->ai_addr->sa_len, NULL, NI_MAXHOST,
|
|
|
|
svcport_str, NI_MAXSERV * sizeof(char),
|
|
|
|
NI_NUMERICHOST | NI_NUMERICSERV))
|
|
|
|
errx(1, "Cannot get port number");
|
|
|
|
}
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
}
|
2017-06-21 06:34:06 +00:00
|
|
|
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
if (mallocd_res != 0) {
|
|
|
|
free(res->ai_addr);
|
|
|
|
free(res);
|
|
|
|
} else
|
|
|
|
freeaddrinfo(res);
|
|
|
|
res = NULL;
|
|
|
|
}
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Called after all the create_service() calls have succeeded, to complete
|
|
|
|
* the setup and registration.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
complete_service(struct netconfig *nconf, char *port_str)
|
|
|
|
{
|
|
|
|
struct addrinfo hints, *res = NULL;
|
|
|
|
struct __rpc_sockinfo si;
|
|
|
|
struct netbuf servaddr;
|
|
|
|
SVCXPRT *transp = NULL;
|
|
|
|
int aicode, fd, nhostsbak;
|
|
|
|
int registered = 0;
|
|
|
|
|
|
|
|
if ((nconf->nc_semantics != NC_TPI_CLTS) &&
|
|
|
|
(nconf->nc_semantics != NC_TPI_COTS) &&
|
|
|
|
(nconf->nc_semantics != NC_TPI_COTS_ORD))
|
|
|
|
return; /* not my type */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XXX - using RPC library internal functions.
|
|
|
|
*/
|
|
|
|
if (!__rpc_nconf2sockinfo(nconf, &si)) {
|
|
|
|
syslog(LOG_ERR, "cannot get information for %s",
|
|
|
|
nconf->nc_netid);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nhostsbak = nhosts;
|
|
|
|
while (nhostsbak > 0) {
|
|
|
|
--nhostsbak;
|
|
|
|
if (sock_fdpos >= sock_fdcnt) {
|
|
|
|
/* Should never happen. */
|
|
|
|
syslog(LOG_ERR, "Ran out of socket fd's");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
fd = sock_fd[sock_fdpos++];
|
|
|
|
if (fd < 0)
|
|
|
|
continue;
|
|
|
|
|
2008-04-06 13:52:17 +00:00
|
|
|
if (nconf->nc_semantics != NC_TPI_CLTS)
|
|
|
|
listen(fd, SOMAXCONN);
|
|
|
|
|
2007-11-02 14:51:53 +00:00
|
|
|
transp = svc_tli_create(fd, nconf, NULL,
|
|
|
|
RPC_MAXDATASIZE, RPC_MAXDATASIZE);
|
|
|
|
|
|
|
|
if (transp != (SVCXPRT *) NULL) {
|
|
|
|
if (!svc_reg(transp, NLM_PROG, NLM_SM, nlm_prog_0,
|
|
|
|
NULL))
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"can't register %s NLM_PROG, NLM_SM service",
|
|
|
|
nconf->nc_netid);
|
|
|
|
|
|
|
|
if (!svc_reg(transp, NLM_PROG, NLM_VERS, nlm_prog_1,
|
|
|
|
NULL))
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"can't register %s NLM_PROG, NLM_VERS service",
|
|
|
|
nconf->nc_netid);
|
|
|
|
|
|
|
|
if (!svc_reg(transp, NLM_PROG, NLM_VERSX, nlm_prog_3,
|
|
|
|
NULL))
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"can't register %s NLM_PROG, NLM_VERSX service",
|
|
|
|
nconf->nc_netid);
|
|
|
|
|
|
|
|
if (!svc_reg(transp, NLM_PROG, NLM_VERS4, nlm_prog_4,
|
|
|
|
NULL))
|
|
|
|
syslog(LOG_ERR,
|
|
|
|
"can't register %s NLM_PROG, NLM_VERS4 service",
|
|
|
|
nconf->nc_netid);
|
|
|
|
|
|
|
|
} else
|
|
|
|
syslog(LOG_WARNING, "can't create %s services",
|
|
|
|
nconf->nc_netid);
|
|
|
|
|
|
|
|
if (registered == 0) {
|
|
|
|
registered = 1;
|
|
|
|
memset(&hints, 0, sizeof hints);
|
|
|
|
hints.ai_flags = AI_PASSIVE;
|
|
|
|
hints.ai_family = si.si_af;
|
|
|
|
hints.ai_socktype = si.si_socktype;
|
|
|
|
hints.ai_protocol = si.si_proto;
|
|
|
|
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
if ((aicode = getaddrinfo(NULL, port_str, &hints,
|
2007-11-02 14:51:53 +00:00
|
|
|
&res)) != 0) {
|
|
|
|
syslog(LOG_ERR, "cannot get local address: %s",
|
|
|
|
gai_strerror(aicode));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
servaddr.buf = malloc(res->ai_addrlen);
|
|
|
|
memcpy(servaddr.buf, res->ai_addr, res->ai_addrlen);
|
|
|
|
servaddr.len = res->ai_addrlen;
|
|
|
|
|
|
|
|
rpcb_set(NLM_PROG, NLM_SM, nconf, &servaddr);
|
|
|
|
rpcb_set(NLM_PROG, NLM_VERS, nconf, &servaddr);
|
|
|
|
rpcb_set(NLM_PROG, NLM_VERSX, nconf, &servaddr);
|
|
|
|
rpcb_set(NLM_PROG, NLM_VERS4, nconf, &servaddr);
|
|
|
|
|
|
|
|
xcreated++;
|
|
|
|
freeaddrinfo(res);
|
|
|
|
}
|
|
|
|
} /* end while */
|
|
|
|
}
|
|
|
|
|
Fix the nfs related daemons so that they don't intermittently
fail with "bind: address already in use". This problem was reported
to the freebsd-stable@ mailing list on Feb. 19 under the subject
heading "statd/lockd startup failure" by george+freebsd at m5p dot com.
The problem is that the first combination of {udp,tcp X ipv4,ipv6}
would select a port# dynamically, but one of the other three combinations
would have that port# already in use. The patch is somewhat involved
because it was requested by dougb@ that the four combinations use the
same port# wherever possible. The patch splits the create_service()
function into two functions. The first goes as far as bind(2) in a
loop for up to GETPORT_MAXTRY - 1 times, attempting to use the same port#
for all four cases. If these attempts fail, the last attempt allows
the 4 cases to use different port #s. After this function has succeeded,
the second function, called complete_service(), does the rest of what
create_service() did.
The three daemons mountd, rpc.lockd and rpc.statd all have a
create_service() function that is patched in a similar way. However,
create_service() has non-trivial differences for the three daemons
that made it impractical to share the same functions between them.
Reviewed by: jhb
MFC after: 2 weeks
2011-06-02 19:49:47 +00:00
|
|
|
/*
|
|
|
|
* Clear out sockets after a failure to bind one of them, so that the
|
|
|
|
* cycle of socket creation/binding can start anew.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
clearout_service(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < sock_fdcnt; i++) {
|
|
|
|
if (sock_fd[i] >= 0) {
|
|
|
|
shutdown(sock_fd[i], SHUT_RDWR);
|
|
|
|
close(sock_fd[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
void
|
2001-11-13 11:24:23 +00:00
|
|
|
sigalarm_handler(void)
|
1996-02-17 15:11:29 +00:00
|
|
|
{
|
2001-11-13 11:24:23 +00:00
|
|
|
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
grace_expired = 1;
|
1996-02-17 15:11:29 +00:00
|
|
|
}
|
1997-10-13 11:13:33 +00:00
|
|
|
|
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and
associated changes that had to happen to make this possible as well as
bugs fixed along the way.
Bring in required TLI library routines to support this.
Since we don't support TLI we've essentially copied what NetBSD
has done, adding a thin layer to emulate direct the TLI calls
into BSD socket calls.
This is mostly from Sun's tirpc release that was made in 1994,
however some fixes were backported from the 1999 release (supposedly
only made available after this porting effort was underway).
The submitter has agreed to continue on and bring us up to the
1999 release.
Several key features are introduced with this update:
Client calls are thread safe. (1999 code has server side thread
safe)
Updated, a more modern interface.
Many userland updates were done to bring the code up to par with
the recent RPC API.
There is an update to the pthreads library, a function
pthread_main_np() was added to emulate a function of Sun's threads
library.
While we're at it, bring in NetBSD's lockd, it's been far too
long of a wait.
New rpcbind(8) replaces portmap(8) (supporting communication over
an authenticated Unix-domain socket, and by default only allowing
set and unset requests over that channel). It's much more secure
than the old portmapper.
Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded
to support TI-RPC and to support IPV6.
Umount(8) is also fixed to unmount pathnames longer than 80 chars,
which are currently truncated by the Kernel statfs structure.
Submitted by: Martin Blapp <mb@imp.ch>
Manpage review: ru
Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
|
|
|
void
|
1997-10-13 11:13:33 +00:00
|
|
|
usage()
|
|
|
|
{
|
2008-03-27 15:11:02 +00:00
|
|
|
errx(1, "usage: rpc.lockd [-d <debuglevel>]"
|
2019-11-22 16:53:30 +00:00
|
|
|
" [-F] [-g <grace period>] [-h <bindip>] [-p <port>]");
|
1997-10-13 11:13:33 +00:00
|
|
|
}
|
2001-04-17 20:45:23 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* init_nsm --
|
|
|
|
* Reset the NSM state-of-the-world and acquire its state.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
init_nsm(void)
|
|
|
|
{
|
|
|
|
enum clnt_stat ret;
|
|
|
|
my_id id;
|
|
|
|
sm_stat stat;
|
2002-03-22 20:02:54 +00:00
|
|
|
char name[] = "NFS NLM";
|
2001-04-17 20:45:23 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* !!!
|
|
|
|
* The my_id structure isn't used by the SM_UNMON_ALL call, as far
|
|
|
|
* as I know. Leave it empty for now.
|
|
|
|
*/
|
|
|
|
memset(&id, 0, sizeof(id));
|
2002-03-22 20:02:54 +00:00
|
|
|
id.my_name = name;
|
2001-04-17 20:45:23 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* !!!
|
|
|
|
* The statd program must already be registered when lockd runs.
|
|
|
|
*/
|
|
|
|
do {
|
|
|
|
ret = callrpc("localhost", SM_PROG, SM_VERS, SM_UNMON_ALL,
|
2003-10-26 06:10:44 +00:00
|
|
|
(xdrproc_t)xdr_my_id, &id, (xdrproc_t)xdr_sm_stat, &stat);
|
2001-04-17 20:45:23 +00:00
|
|
|
if (ret == RPC_PROGUNAVAIL) {
|
2003-04-24 14:38:42 +00:00
|
|
|
syslog(LOG_WARNING, "%lu %s", SM_PROG,
|
|
|
|
clnt_sperrno(ret));
|
2001-04-17 20:45:23 +00:00
|
|
|
sleep(2);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
} while (0);
|
|
|
|
|
|
|
|
if (ret != 0) {
|
2003-04-24 14:38:42 +00:00
|
|
|
syslog(LOG_ERR, "%lu %s", SM_PROG, clnt_sperrno(ret));
|
|
|
|
exit(1);
|
2001-04-17 20:45:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nsm_state = stat.state;
|
|
|
|
|
|
|
|
/* setup constant data for SM_MON calls */
|
2002-03-22 20:02:54 +00:00
|
|
|
mon_host.mon_id.my_id.my_name = localhost;
|
2001-04-17 20:45:23 +00:00
|
|
|
mon_host.mon_id.my_id.my_prog = NLM_PROG;
|
|
|
|
mon_host.mon_id.my_id.my_vers = NLM_SM;
|
|
|
|
mon_host.mon_id.my_id.my_proc = NLM_SM_NOTIFY; /* bsdi addition */
|
|
|
|
}
|
2007-11-02 14:51:53 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Out of memory, fatal
|
|
|
|
*/
|
|
|
|
void out_of_mem()
|
|
|
|
{
|
|
|
|
syslog(LOG_ERR, "out of memory");
|
|
|
|
exit(2);
|
|
|
|
}
|