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$ */
|
|
|
|
|
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>
|
|
|
|
|
|
|
|
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;
|
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;
|
|
|
|
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 */
|
1996-02-17 15:11:29 +00:00
|
|
|
|
2007-11-02 14:51:53 +00:00
|
|
|
void create_service(struct netconfig *nconf);
|
2008-03-26 15:23:12 +00:00
|
|
|
void lookup_addresses(struct netconfig *nconf);
|
2001-04-17 20:45:23 +00:00
|
|
|
void init_nsm(void);
|
2002-03-21 22:52:45 +00:00
|
|
|
void nlm_prog_0(struct svc_req *, SVCXPRT *);
|
|
|
|
void nlm_prog_1(struct svc_req *, SVCXPRT *);
|
|
|
|
void nlm_prog_3(struct svc_req *, SVCXPRT *);
|
|
|
|
void nlm_prog_4(struct svc_req *, SVCXPRT *);
|
2007-11-02 14:51:53 +00:00
|
|
|
void out_of_mem(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;
|
|
|
|
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;
|
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-27 11:54:20 +00:00
|
|
|
while ((ch = getopt(argc, argv, "d:g: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;
|
|
|
|
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 = hosts;
|
|
|
|
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:
|
|
|
|
case '?':
|
|
|
|
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;
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
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) {
|
|
|
|
hosts = malloc(sizeof(char**));
|
|
|
|
if (hosts == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
|
|
|
|
hosts[0] = "*";
|
|
|
|
nhosts = 1;
|
|
|
|
} else {
|
|
|
|
hosts_bak = hosts;
|
|
|
|
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;
|
|
|
|
hosts[nhosts - 2] = "::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
|
|
|
}
|
2007-11-02 14:51:53 +00:00
|
|
|
hosts[nhosts - 1] = "127.0.0.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
|
|
|
|
2008-03-26 15:23:12 +00:00
|
|
|
if (kernel_lockd) {
|
|
|
|
/*
|
|
|
|
* For the kernel lockd case, 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. This can go away
|
|
|
|
* entirely if/when we move the client side of NFS
|
|
|
|
* locking into the kernel.
|
|
|
|
*/
|
|
|
|
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");
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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 {
|
|
|
|
lookup_addresses(nconf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
endnetconfig(nc_handle);
|
|
|
|
} else {
|
|
|
|
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 {
|
|
|
|
create_service(nconf);
|
|
|
|
}
|
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
|
|
|
endnetconfig(nc_handle);
|
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.
|
|
|
|
*/
|
2004-07-16 12:50:10 +00:00
|
|
|
if (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) {
|
|
|
|
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 {
|
|
|
|
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
|
|
|
|
* addresses. It gets called one time for each transport and
|
|
|
|
* registrates the service with rpcbind on that trasport.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
create_service(struct netconfig *nconf)
|
|
|
|
{
|
|
|
|
struct addrinfo hints, *res = NULL;
|
|
|
|
struct sockaddr_in *sin;
|
|
|
|
struct sockaddr_in6 *sin6;
|
|
|
|
struct __rpc_sockinfo si;
|
|
|
|
struct netbuf servaddr;
|
|
|
|
SVCXPRT *transp = NULL;
|
|
|
|
int aicode;
|
|
|
|
int fd;
|
|
|
|
int nhostsbak;
|
|
|
|
int r;
|
|
|
|
int registered = 0;
|
|
|
|
u_int32_t host_addr[4]; /* IPv4 or IPv6 */
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get rpc.statd's address on this transport */
|
|
|
|
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;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Bind to specific IPs if asked to
|
|
|
|
*/
|
|
|
|
nhostsbak = nhosts;
|
|
|
|
while (nhostsbak > 0) {
|
|
|
|
--nhostsbak;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XXX - using RPC library internal functions.
|
|
|
|
*/
|
|
|
|
if ((fd = __rpc_nconf2fd(nconf)) < 0) {
|
|
|
|
syslog(LOG_ERR, "cannot create socket for %s",
|
|
|
|
nconf->nc_netid);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (hints.ai_family) {
|
|
|
|
case AF_INET:
|
|
|
|
if (inet_pton(AF_INET, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
hints.ai_flags &= AI_NUMERICHOST;
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* Skip if we have an AF_INET6 address.
|
|
|
|
*/
|
|
|
|
if (inet_pton(AF_INET6, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
close(fd);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case AF_INET6:
|
|
|
|
if (inet_pton(AF_INET6, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
hints.ai_flags &= AI_NUMERICHOST;
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* Skip if we have an AF_INET address.
|
|
|
|
*/
|
|
|
|
if (inet_pton(AF_INET, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
close(fd);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If no hosts were specified, just bind to INADDR_ANY
|
|
|
|
*/
|
|
|
|
if (strcmp("*", hosts[nhostsbak]) == 0) {
|
|
|
|
if (svcport_str == NULL) {
|
|
|
|
res = malloc(sizeof(struct addrinfo));
|
|
|
|
if (res == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
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)
|
|
|
|
sizeof(res->ai_addr);
|
|
|
|
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;
|
|
|
|
res->ai_addrlen = (socklen_t) sizeof(res->ai_addr);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} 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));
|
|
|
|
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));
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
r = bindresvport_sa(fd, res->ai_addr);
|
|
|
|
if (r != 0) {
|
|
|
|
syslog(LOG_ERR, "bindresvport_sa: %m");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
if (svcport_str == NULL) {
|
|
|
|
svcport_str = malloc(NI_MAXSERV * sizeof(char));
|
|
|
|
if (svcport_str == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
|
|
|
|
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");
|
|
|
|
}
|
|
|
|
|
|
|
|
if((aicode = getaddrinfo(NULL, svcport_str, &hints,
|
|
|
|
&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 */
|
|
|
|
}
|
|
|
|
|
2008-03-26 15:23:12 +00:00
|
|
|
/*
|
|
|
|
* Look up addresses for the kernel to create transports for.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
lookup_addresses(struct netconfig *nconf)
|
|
|
|
{
|
|
|
|
struct addrinfo hints, *res = NULL;
|
|
|
|
struct sockaddr_in *sin;
|
|
|
|
struct sockaddr_in6 *sin6;
|
|
|
|
struct __rpc_sockinfo si;
|
|
|
|
struct netbuf servaddr;
|
|
|
|
SVCXPRT *transp = NULL;
|
|
|
|
int aicode;
|
|
|
|
int nhostsbak;
|
|
|
|
int r;
|
|
|
|
int registered = 0;
|
|
|
|
u_int32_t host_addr[4]; /* IPv4 or IPv6 */
|
|
|
|
char *uaddr;
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get rpc.statd's address on this transport */
|
|
|
|
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;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Bind to specific IPs if asked to
|
|
|
|
*/
|
|
|
|
nhostsbak = nhosts;
|
|
|
|
while (nhostsbak > 0) {
|
|
|
|
--nhostsbak;
|
|
|
|
|
|
|
|
switch (hints.ai_family) {
|
|
|
|
case AF_INET:
|
|
|
|
if (inet_pton(AF_INET, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
hints.ai_flags &= AI_NUMERICHOST;
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* Skip if we have an AF_INET6 address.
|
|
|
|
*/
|
|
|
|
if (inet_pton(AF_INET6, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case AF_INET6:
|
|
|
|
if (inet_pton(AF_INET6, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
hints.ai_flags &= AI_NUMERICHOST;
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* Skip if we have an AF_INET address.
|
|
|
|
*/
|
|
|
|
if (inet_pton(AF_INET, hosts[nhostsbak],
|
|
|
|
host_addr) == 1) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If no hosts were specified, just bind to INADDR_ANY
|
|
|
|
*/
|
|
|
|
if (strcmp("*", hosts[nhostsbak]) == 0) {
|
|
|
|
if (svcport_str == NULL) {
|
|
|
|
res = malloc(sizeof(struct addrinfo));
|
|
|
|
if (res == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
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)
|
|
|
|
sizeof(res->ai_addr);
|
|
|
|
break;
|
|
|
|
case AF_INET6:
|
|
|
|
sin6 = malloc(sizeof(struct sockaddr_in6));
|
|
|
|
if (sin6 == NULL)
|
|
|
|
out_of_mem();
|
|
|
|
sin6->sin6_family = AF_INET6;
|
|
|
|
sin6->sin6_port = htons(0);
|
|
|
|
sin6->sin6_addr = in6addr_any;
|
|
|
|
res->ai_addr = (struct sockaddr*) sin6;
|
|
|
|
res->ai_addrlen = (socklen_t) sizeof(res->ai_addr);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} 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));
|
|
|
|
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));
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
servaddr.len = servaddr.maxlen = res->ai_addr->sa_len;
|
|
|
|
servaddr.buf = res->ai_addr;
|
|
|
|
uaddr = taddr2uaddr(nconf, &servaddr);
|
|
|
|
|
|
|
|
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++;
|
|
|
|
} /* end while */
|
|
|
|
}
|
|
|
|
|
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>]"
|
2007-11-02 14:51:53 +00:00
|
|
|
" [-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";
|
|
|
|
char localhost[] = "localhost";
|
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);
|
|
|
|
}
|