Merge from Lite2 (use new getvfsbyname() and mount(2) interface, cleanup)
This commit is contained in:
parent
72696bbced
commit
a90491ec90
@ -1,7 +1,8 @@
|
||||
# From: @(#)Makefile 8.3 (Berkeley) 1/25/94
|
||||
# $Id$
|
||||
# $Id: Makefile,v 1.6 1997/02/22 14:33:01 peter Exp $
|
||||
|
||||
PROG= mountd
|
||||
CFLAGS+= -D_NEW_VFSCONF
|
||||
CFLAGS+=-DNFS -DMFS -DCD9660 -DMSDOSFS
|
||||
MAN5= exports.5 netgroup.5
|
||||
MAN8= mountd.8
|
||||
|
@ -29,9 +29,9 @@
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)exports.5 8.2 (Berkeley) 1/28/94
|
||||
.\" @(#)exports.5 8.3 (Berkeley) 3/29/95
|
||||
.\"
|
||||
.Dd January 28, 1994
|
||||
.Dd March 29, 1995
|
||||
.Dt EXPORTS 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -74,7 +74,9 @@ followed by the
|
||||
.Fl alldirs
|
||||
flag;
|
||||
this form allows the host(s) to mount at any point within the filesystem,
|
||||
including regular files if the ``-r'' option is used on mountd.
|
||||
including regular files if the
|
||||
.Fl r
|
||||
option is used on mountd.
|
||||
The pathnames must not have any symbolic links in them and should not have
|
||||
any "." or ".." components.
|
||||
Mount points for a filesystem may appear on multiple lines each with
|
||||
@ -143,7 +145,7 @@ The
|
||||
.Fl kerb
|
||||
option specifies that the Kerberos authentication server should be
|
||||
used to authenticate and map client credentials.
|
||||
This requires that the kernel be built with the NFSKERB option.
|
||||
This option requires that the kernel be built with the NFSKERB option.
|
||||
.Pp
|
||||
The
|
||||
.Fl ro
|
||||
|
@ -29,10 +29,10 @@
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" From: @(#)mountd.8 8.1 (Berkeley) 6/9/93
|
||||
.\" $Id$
|
||||
.\" @(#)mountd.8 8.4 (Berkeley) 4/28/95
|
||||
.\" $Id: mountd.8,v 1.7 1997/02/22 14:33:02 peter Exp $
|
||||
.\"
|
||||
.Dd September 22, 1994
|
||||
.Dd April 28, 1995
|
||||
.Dt MOUNTD 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -71,11 +71,15 @@ that require it.
|
||||
The
|
||||
.Fl r
|
||||
option allows mount RPCs requests for regular files to be served.
|
||||
Although this seems to violate the mount protocol specification, some diskless
|
||||
workstations do mount requests for their swapfiles and expect them to be
|
||||
regular files. Since a regular file cannot be specified in /etc/exports, the
|
||||
entire file system that the swapfiles reside in will have to be exported with
|
||||
the ``-alldirs'' flag.
|
||||
Although this seems to violate the mount protocol specification,
|
||||
some diskless workstations do mount requests for
|
||||
their swapfiles and expect them to be regular files.
|
||||
Since a regular file cannot be specified in
|
||||
.Pa /etc/exports ,
|
||||
the entire file system in which the swapfiles resides
|
||||
will have to be exported with the
|
||||
.Fl alldirs
|
||||
flag.
|
||||
.It Ar exportsfile
|
||||
The
|
||||
.Ar exportsfile
|
||||
@ -90,7 +94,7 @@ After changing the exports file,
|
||||
a hangup signal should be sent to the mountd daemon
|
||||
to get it to reload the export information.
|
||||
After sending the SIGHUP
|
||||
(kill -HUP `cat /var/run/mountd.pid`),
|
||||
(kill \-s HUP `cat /var/run/mountd.pid`),
|
||||
check the syslog output to see if mountd logged any parsing
|
||||
errors in the exports file.
|
||||
.Pp
|
||||
|
@ -41,9 +41,9 @@ static char copyright[] =
|
||||
#endif /*not lint*/
|
||||
|
||||
#ifndef lint
|
||||
/*static char sccsid[] = "From: @(#)mountd.c 8.8 (Berkeley) 2/20/94";*/
|
||||
/*static char sccsid[] = "@(#)mountd.c 8.15 (Berkeley) 5/1/95"; */
|
||||
static const char rcsid[] =
|
||||
"$Id$";
|
||||
"$Id: mountd.c,v 1.13 1997/02/22 14:33:02 peter Exp $";
|
||||
#endif /*not lint*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -63,6 +63,9 @@ static const char rcsid[] =
|
||||
#endif
|
||||
#include <nfs/rpcv2.h>
|
||||
#include <nfs/nfsproto.h>
|
||||
#include <ufs/ufs/ufsmount.h>
|
||||
#include <msdosfs/msdosfsmount.h>
|
||||
#include <isofs/cd9660/cd9660_mount.h> /* XXX need isofs in include */
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
@ -250,18 +253,18 @@ main(argc, argv)
|
||||
SVCXPRT *udptransp, *tcptransp;
|
||||
int c;
|
||||
#ifdef __FreeBSD__
|
||||
struct vfsconf *vfc;
|
||||
struct vfsconf vfc;
|
||||
int error;
|
||||
|
||||
vfc = getvfsbyname("nfs");
|
||||
if(!vfc && vfsisloadable("nfs")) {
|
||||
error = getvfsbyname("nfs", &vfc);
|
||||
if (error && vfsisloadable("nfs")) {
|
||||
if(vfsload("nfs"))
|
||||
err(1, "vfsload(nfs)");
|
||||
endvfsent(); /* flush cache */
|
||||
vfc = getvfsbyname("nfs");
|
||||
error = getvfsbyname("nfs", &vfc);
|
||||
}
|
||||
if(!vfc) {
|
||||
if (error)
|
||||
errx(1, "NFS support is not available in the running kernel");
|
||||
}
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
while ((c = getopt(argc, argv, "dnr")) != EOF)
|
||||
@ -276,7 +279,7 @@ main(argc, argv)
|
||||
debug = debug ? 0 : 1;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Usage: mountd [-r] [-n] [export_file]\n");
|
||||
fprintf(stderr, "Usage: mountd [-d] [-r] [-n] [export_file]\n");
|
||||
exit(1);
|
||||
};
|
||||
argc -= optind;
|
||||
@ -341,13 +344,12 @@ mntsrv(rqstp, transp)
|
||||
struct exportlist *ep;
|
||||
struct dirlist *dp;
|
||||
struct fhreturn fhr;
|
||||
struct authunix_parms *ucr;
|
||||
struct stat stb;
|
||||
struct statfs fsb;
|
||||
struct hostent *hp;
|
||||
u_long saddr;
|
||||
u_short sport;
|
||||
char rpcpath[RPCMNT_PATHLEN+1], dirpath[MAXPATHLEN];
|
||||
char rpcpath[RPCMNT_PATHLEN + 1], dirpath[MAXPATHLEN];
|
||||
int bad = ENOENT, defset, hostset;
|
||||
sigset_t sighup_mask;
|
||||
|
||||
@ -404,7 +406,7 @@ mntsrv(rqstp, transp)
|
||||
fhr.fhr_flag = defset;
|
||||
fhr.fhr_vers = rqstp->rq_vers;
|
||||
/* Get the file handle */
|
||||
bzero((caddr_t)&fhr.fhr_fh, sizeof(nfsfh_t));
|
||||
memset(&fhr.fhr_fh, 0, sizeof(nfsfh_t));
|
||||
if (getfh(dirpath, (fhandle_t *)&fhr.fhr_fh) < 0) {
|
||||
bad = errno;
|
||||
syslog(LOG_ERR, "Can't get fh for %s", dirpath);
|
||||
@ -691,7 +693,7 @@ get_exportlist()
|
||||
* And delete exports that are in the kernel for all local
|
||||
* file systems.
|
||||
* XXX: Should know how to handle all local exportable file systems
|
||||
* instead of just MOUNT_UFS.
|
||||
* instead of just "ufs".
|
||||
*/
|
||||
num = getmntinfo(&fsp, MNT_NOWAIT);
|
||||
for (i = 0; i < num; i++) {
|
||||
@ -699,29 +701,16 @@ get_exportlist()
|
||||
struct ufs_args ua;
|
||||
struct iso_args ia;
|
||||
struct mfs_args ma;
|
||||
#ifdef __NetBSD__
|
||||
struct msdosfs_args da;
|
||||
} targs;
|
||||
|
||||
if (!strcmp(fsp->f_fstypename, MOUNT_MFS) ||
|
||||
!strcmp(fsp->f_fstypename, MOUNT_UFS) ||
|
||||
!strcmp(fsp->f_fstypename, MOUNT_MSDOS) ||
|
||||
!strcmp(fsp->f_fstypename, MOUNT_CD9660)) {
|
||||
if (!strcmp(fsp->f_fstypename, "mfs") ||
|
||||
!strcmp(fsp->f_fstypename, "ufs") ||
|
||||
!strcmp(fsp->f_fstypename, "msdos") ||
|
||||
!strcmp(fsp->f_fstypename, "cd9660")) {
|
||||
targs.ua.fspec = NULL;
|
||||
targs.ua.export.ex_flags = MNT_DELEXPORT;
|
||||
if (mount(fsp->f_fstypename, fsp->f_mntonname,
|
||||
#else
|
||||
} targs;
|
||||
|
||||
switch (fsp->f_type) {
|
||||
case MOUNT_MFS:
|
||||
case MOUNT_UFS:
|
||||
case MOUNT_CD9660:
|
||||
case MOUNT_MSDOS:
|
||||
targs.ua.fspec = NULL;
|
||||
targs.ua.export.ex_flags = MNT_DELEXPORT;
|
||||
if (mount(fsp->f_type, fsp->f_mntonname,
|
||||
#endif
|
||||
fsp->f_flags | MNT_UPDATE,
|
||||
(caddr_t)&targs) < 0)
|
||||
syslog(LOG_ERR, "Can't delete exports for %s",
|
||||
@ -963,7 +952,7 @@ get_exp()
|
||||
ep = (struct exportlist *)malloc(sizeof (struct exportlist));
|
||||
if (ep == (struct exportlist *)NULL)
|
||||
out_of_mem();
|
||||
bzero((caddr_t)ep, sizeof (struct exportlist));
|
||||
memset(ep, 0, sizeof(struct exportlist));
|
||||
return (ep);
|
||||
}
|
||||
|
||||
@ -978,7 +967,7 @@ get_grp()
|
||||
gp = (struct grouplist *)malloc(sizeof (struct grouplist));
|
||||
if (gp == (struct grouplist *)NULL)
|
||||
out_of_mem();
|
||||
bzero((caddr_t)gp, sizeof (struct grouplist));
|
||||
memset(gp, 0, sizeof(struct grouplist));
|
||||
return (gp);
|
||||
}
|
||||
|
||||
@ -1270,12 +1259,12 @@ do_opt(cpp, endcpp, ep, grp, has_hostp, exflagsp, cr)
|
||||
while (cpopt && *cpopt) {
|
||||
allflag = 1;
|
||||
usedarg = -2;
|
||||
if (cpoptend = index(cpopt, ',')) {
|
||||
if (cpoptend = strchr(cpopt, ',')) {
|
||||
*cpoptend++ = '\0';
|
||||
if (cpoptarg = index(cpopt, '='))
|
||||
if (cpoptarg = strchr(cpopt, '='))
|
||||
*cpoptarg++ = '\0';
|
||||
} else {
|
||||
if (cpoptarg = index(cpopt, '='))
|
||||
if (cpoptarg = strchr(cpopt, '='))
|
||||
*cpoptarg++ = '\0';
|
||||
else {
|
||||
*cp = savedc;
|
||||
@ -1418,13 +1407,12 @@ get_host(cp, grp, tgrp)
|
||||
malloc(sizeof(struct hostent));
|
||||
if (nhp == (struct hostent *)NULL)
|
||||
out_of_mem();
|
||||
bcopy((caddr_t)hp, (caddr_t)nhp,
|
||||
sizeof(struct hostent));
|
||||
memmove(nhp, hp, sizeof(struct hostent));
|
||||
i = strlen(hp->h_name)+1;
|
||||
nhp->h_name = (char *)malloc(i);
|
||||
if (nhp->h_name == (char *)NULL)
|
||||
out_of_mem();
|
||||
bcopy(hp->h_name, nhp->h_name, i);
|
||||
memmove(nhp->h_name, hp->h_name, i);
|
||||
addrp = hp->h_addr_list;
|
||||
i = 1;
|
||||
while (*addrp++)
|
||||
@ -1439,8 +1427,7 @@ get_host(cp, grp, tgrp)
|
||||
malloc(hp->h_length);
|
||||
if (*naddrp == (char *)NULL)
|
||||
out_of_mem();
|
||||
bcopy(*addrp, *naddrp,
|
||||
hp->h_length);
|
||||
memmove(*naddrp, *addrp, hp->h_length);
|
||||
addrp++;
|
||||
naddrp++;
|
||||
}
|
||||
@ -1519,10 +1506,9 @@ get_isoaddr(cp, grp)
|
||||
malloc(sizeof (struct sockaddr_iso));
|
||||
if (isoaddr == (struct sockaddr_iso *)NULL)
|
||||
out_of_mem();
|
||||
bzero((caddr_t)isoaddr, sizeof (struct sockaddr_iso));
|
||||
bcopy((caddr_t)isop, (caddr_t)&isoaddr->siso_addr,
|
||||
sizeof (struct iso_addr));
|
||||
isoaddr->siso_len = sizeof (struct sockaddr_iso);
|
||||
memset(isoaddr, 0, sizeof(struct sockaddr_iso));
|
||||
memmove(&isoaddr->siso_addr, isop, sizeof(struct iso_addr));
|
||||
isoaddr->siso_len = sizeof(struct sockaddr_iso);
|
||||
isoaddr->siso_family = AF_ISO;
|
||||
grp->gr_type = GT_ISO;
|
||||
grp->gr_ptr.gt_isoaddr = isoaddr;
|
||||
@ -1573,8 +1559,8 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
|
||||
args.ua.fspec = 0;
|
||||
args.ua.export.ex_flags = exflags;
|
||||
args.ua.export.ex_anon = *anoncrp;
|
||||
bzero((char *)&sin, sizeof(sin));
|
||||
bzero((char *)&imask, sizeof(imask));
|
||||
memset(&sin, 0, sizeof(sin));
|
||||
memset(&imask, 0, sizeof(imask));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_len = sizeof(sin);
|
||||
imask.sin_family = AF_INET;
|
||||
@ -1640,13 +1626,9 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
|
||||
* Maybe I should just use the fsb->f_mntonname path instead
|
||||
* of looping back up the dirp to the mount point??
|
||||
* Also, needs to know how to export all types of local
|
||||
* exportable file systems and not just MOUNT_UFS.
|
||||
* exportable file systems and not just "ufs".
|
||||
*/
|
||||
#ifdef __NetBSD__
|
||||
while (mount(fsb->f_fstypename, dirp,
|
||||
#else
|
||||
while (mount(fsb->f_type, dirp,
|
||||
#endif
|
||||
fsb->f_flags | MNT_UPDATE, (caddr_t)&args) < 0) {
|
||||
if (cp)
|
||||
*cp-- = savedc;
|
||||
@ -1896,7 +1878,7 @@ void
|
||||
get_mountlist()
|
||||
{
|
||||
struct mountlist *mlp, **mlpp;
|
||||
char *eos, *dirp;
|
||||
char *host, *dirp, *cp;
|
||||
int len;
|
||||
char str[STRSIZ];
|
||||
FILE *mlfile;
|
||||
@ -1907,27 +1889,16 @@ get_mountlist()
|
||||
}
|
||||
mlpp = &mlhead;
|
||||
while (fgets(str, STRSIZ, mlfile) != NULL) {
|
||||
if ((dirp = index(str, '\t')) == NULL &&
|
||||
(dirp = index(str, ' ')) == NULL)
|
||||
cp = str;
|
||||
host = strsep(&cp, " \t\n");
|
||||
dirp = strsep(&cp, " \t\n");
|
||||
if (host == NULL || dirp == NULL)
|
||||
continue;
|
||||
mlp = (struct mountlist *)malloc(sizeof (*mlp));
|
||||
len = dirp-str;
|
||||
if (len > RPCMNT_NAMELEN)
|
||||
len = RPCMNT_NAMELEN;
|
||||
bcopy(str, mlp->ml_host, len);
|
||||
mlp->ml_host[len] = '\0';
|
||||
while (*dirp == '\t' || *dirp == ' ')
|
||||
dirp++;
|
||||
if ((eos = index(dirp, '\t')) == NULL &&
|
||||
(eos = index(dirp, ' ')) == NULL &&
|
||||
(eos = index(dirp, '\n')) == NULL)
|
||||
len = strlen(dirp);
|
||||
else
|
||||
len = eos-dirp;
|
||||
if (len > RPCMNT_PATHLEN)
|
||||
len = RPCMNT_PATHLEN;
|
||||
bcopy(dirp, mlp->ml_dirp, len);
|
||||
mlp->ml_dirp[len] = '\0';
|
||||
strncpy(mlp->ml_host, host, RPCMNT_NAMELEN);
|
||||
mlp->ml_host[RPCMNT_NAMELEN] = '\0';
|
||||
strncpy(mlp->ml_dirp, dirp, RPCMNT_PATHLEN);
|
||||
mlp->ml_dirp[RPCMNT_PATHLEN] = '\0';
|
||||
mlp->ml_next = (struct mountlist *)NULL;
|
||||
*mlpp = mlp;
|
||||
mlpp = &mlp->ml_next;
|
||||
|
@ -1,7 +1,8 @@
|
||||
# From: @(#)Makefile 8.3 (Berkeley) 1/25/94
|
||||
# $Id$
|
||||
# $Id: Makefile,v 1.6 1997/02/22 14:33:01 peter Exp $
|
||||
|
||||
PROG= mountd
|
||||
CFLAGS+= -D_NEW_VFSCONF
|
||||
CFLAGS+=-DNFS -DMFS -DCD9660 -DMSDOSFS
|
||||
MAN5= exports.5 netgroup.5
|
||||
MAN8= mountd.8
|
||||
|
@ -29,9 +29,9 @@
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)exports.5 8.2 (Berkeley) 1/28/94
|
||||
.\" @(#)exports.5 8.3 (Berkeley) 3/29/95
|
||||
.\"
|
||||
.Dd January 28, 1994
|
||||
.Dd March 29, 1995
|
||||
.Dt EXPORTS 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -74,7 +74,9 @@ followed by the
|
||||
.Fl alldirs
|
||||
flag;
|
||||
this form allows the host(s) to mount at any point within the filesystem,
|
||||
including regular files if the ``-r'' option is used on mountd.
|
||||
including regular files if the
|
||||
.Fl r
|
||||
option is used on mountd.
|
||||
The pathnames must not have any symbolic links in them and should not have
|
||||
any "." or ".." components.
|
||||
Mount points for a filesystem may appear on multiple lines each with
|
||||
@ -143,7 +145,7 @@ The
|
||||
.Fl kerb
|
||||
option specifies that the Kerberos authentication server should be
|
||||
used to authenticate and map client credentials.
|
||||
This requires that the kernel be built with the NFSKERB option.
|
||||
This option requires that the kernel be built with the NFSKERB option.
|
||||
.Pp
|
||||
The
|
||||
.Fl ro
|
||||
|
@ -29,10 +29,10 @@
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" From: @(#)mountd.8 8.1 (Berkeley) 6/9/93
|
||||
.\" $Id$
|
||||
.\" @(#)mountd.8 8.4 (Berkeley) 4/28/95
|
||||
.\" $Id: mountd.8,v 1.7 1997/02/22 14:33:02 peter Exp $
|
||||
.\"
|
||||
.Dd September 22, 1994
|
||||
.Dd April 28, 1995
|
||||
.Dt MOUNTD 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -71,11 +71,15 @@ that require it.
|
||||
The
|
||||
.Fl r
|
||||
option allows mount RPCs requests for regular files to be served.
|
||||
Although this seems to violate the mount protocol specification, some diskless
|
||||
workstations do mount requests for their swapfiles and expect them to be
|
||||
regular files. Since a regular file cannot be specified in /etc/exports, the
|
||||
entire file system that the swapfiles reside in will have to be exported with
|
||||
the ``-alldirs'' flag.
|
||||
Although this seems to violate the mount protocol specification,
|
||||
some diskless workstations do mount requests for
|
||||
their swapfiles and expect them to be regular files.
|
||||
Since a regular file cannot be specified in
|
||||
.Pa /etc/exports ,
|
||||
the entire file system in which the swapfiles resides
|
||||
will have to be exported with the
|
||||
.Fl alldirs
|
||||
flag.
|
||||
.It Ar exportsfile
|
||||
The
|
||||
.Ar exportsfile
|
||||
@ -90,7 +94,7 @@ After changing the exports file,
|
||||
a hangup signal should be sent to the mountd daemon
|
||||
to get it to reload the export information.
|
||||
After sending the SIGHUP
|
||||
(kill -HUP `cat /var/run/mountd.pid`),
|
||||
(kill \-s HUP `cat /var/run/mountd.pid`),
|
||||
check the syslog output to see if mountd logged any parsing
|
||||
errors in the exports file.
|
||||
.Pp
|
||||
|
@ -41,9 +41,9 @@ static char copyright[] =
|
||||
#endif /*not lint*/
|
||||
|
||||
#ifndef lint
|
||||
/*static char sccsid[] = "From: @(#)mountd.c 8.8 (Berkeley) 2/20/94";*/
|
||||
/*static char sccsid[] = "@(#)mountd.c 8.15 (Berkeley) 5/1/95"; */
|
||||
static const char rcsid[] =
|
||||
"$Id$";
|
||||
"$Id: mountd.c,v 1.13 1997/02/22 14:33:02 peter Exp $";
|
||||
#endif /*not lint*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -63,6 +63,9 @@ static const char rcsid[] =
|
||||
#endif
|
||||
#include <nfs/rpcv2.h>
|
||||
#include <nfs/nfsproto.h>
|
||||
#include <ufs/ufs/ufsmount.h>
|
||||
#include <msdosfs/msdosfsmount.h>
|
||||
#include <isofs/cd9660/cd9660_mount.h> /* XXX need isofs in include */
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
@ -250,18 +253,18 @@ main(argc, argv)
|
||||
SVCXPRT *udptransp, *tcptransp;
|
||||
int c;
|
||||
#ifdef __FreeBSD__
|
||||
struct vfsconf *vfc;
|
||||
struct vfsconf vfc;
|
||||
int error;
|
||||
|
||||
vfc = getvfsbyname("nfs");
|
||||
if(!vfc && vfsisloadable("nfs")) {
|
||||
error = getvfsbyname("nfs", &vfc);
|
||||
if (error && vfsisloadable("nfs")) {
|
||||
if(vfsload("nfs"))
|
||||
err(1, "vfsload(nfs)");
|
||||
endvfsent(); /* flush cache */
|
||||
vfc = getvfsbyname("nfs");
|
||||
error = getvfsbyname("nfs", &vfc);
|
||||
}
|
||||
if(!vfc) {
|
||||
if (error)
|
||||
errx(1, "NFS support is not available in the running kernel");
|
||||
}
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
while ((c = getopt(argc, argv, "dnr")) != EOF)
|
||||
@ -276,7 +279,7 @@ main(argc, argv)
|
||||
debug = debug ? 0 : 1;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Usage: mountd [-r] [-n] [export_file]\n");
|
||||
fprintf(stderr, "Usage: mountd [-d] [-r] [-n] [export_file]\n");
|
||||
exit(1);
|
||||
};
|
||||
argc -= optind;
|
||||
@ -341,13 +344,12 @@ mntsrv(rqstp, transp)
|
||||
struct exportlist *ep;
|
||||
struct dirlist *dp;
|
||||
struct fhreturn fhr;
|
||||
struct authunix_parms *ucr;
|
||||
struct stat stb;
|
||||
struct statfs fsb;
|
||||
struct hostent *hp;
|
||||
u_long saddr;
|
||||
u_short sport;
|
||||
char rpcpath[RPCMNT_PATHLEN+1], dirpath[MAXPATHLEN];
|
||||
char rpcpath[RPCMNT_PATHLEN + 1], dirpath[MAXPATHLEN];
|
||||
int bad = ENOENT, defset, hostset;
|
||||
sigset_t sighup_mask;
|
||||
|
||||
@ -404,7 +406,7 @@ mntsrv(rqstp, transp)
|
||||
fhr.fhr_flag = defset;
|
||||
fhr.fhr_vers = rqstp->rq_vers;
|
||||
/* Get the file handle */
|
||||
bzero((caddr_t)&fhr.fhr_fh, sizeof(nfsfh_t));
|
||||
memset(&fhr.fhr_fh, 0, sizeof(nfsfh_t));
|
||||
if (getfh(dirpath, (fhandle_t *)&fhr.fhr_fh) < 0) {
|
||||
bad = errno;
|
||||
syslog(LOG_ERR, "Can't get fh for %s", dirpath);
|
||||
@ -691,7 +693,7 @@ get_exportlist()
|
||||
* And delete exports that are in the kernel for all local
|
||||
* file systems.
|
||||
* XXX: Should know how to handle all local exportable file systems
|
||||
* instead of just MOUNT_UFS.
|
||||
* instead of just "ufs".
|
||||
*/
|
||||
num = getmntinfo(&fsp, MNT_NOWAIT);
|
||||
for (i = 0; i < num; i++) {
|
||||
@ -699,29 +701,16 @@ get_exportlist()
|
||||
struct ufs_args ua;
|
||||
struct iso_args ia;
|
||||
struct mfs_args ma;
|
||||
#ifdef __NetBSD__
|
||||
struct msdosfs_args da;
|
||||
} targs;
|
||||
|
||||
if (!strcmp(fsp->f_fstypename, MOUNT_MFS) ||
|
||||
!strcmp(fsp->f_fstypename, MOUNT_UFS) ||
|
||||
!strcmp(fsp->f_fstypename, MOUNT_MSDOS) ||
|
||||
!strcmp(fsp->f_fstypename, MOUNT_CD9660)) {
|
||||
if (!strcmp(fsp->f_fstypename, "mfs") ||
|
||||
!strcmp(fsp->f_fstypename, "ufs") ||
|
||||
!strcmp(fsp->f_fstypename, "msdos") ||
|
||||
!strcmp(fsp->f_fstypename, "cd9660")) {
|
||||
targs.ua.fspec = NULL;
|
||||
targs.ua.export.ex_flags = MNT_DELEXPORT;
|
||||
if (mount(fsp->f_fstypename, fsp->f_mntonname,
|
||||
#else
|
||||
} targs;
|
||||
|
||||
switch (fsp->f_type) {
|
||||
case MOUNT_MFS:
|
||||
case MOUNT_UFS:
|
||||
case MOUNT_CD9660:
|
||||
case MOUNT_MSDOS:
|
||||
targs.ua.fspec = NULL;
|
||||
targs.ua.export.ex_flags = MNT_DELEXPORT;
|
||||
if (mount(fsp->f_type, fsp->f_mntonname,
|
||||
#endif
|
||||
fsp->f_flags | MNT_UPDATE,
|
||||
(caddr_t)&targs) < 0)
|
||||
syslog(LOG_ERR, "Can't delete exports for %s",
|
||||
@ -963,7 +952,7 @@ get_exp()
|
||||
ep = (struct exportlist *)malloc(sizeof (struct exportlist));
|
||||
if (ep == (struct exportlist *)NULL)
|
||||
out_of_mem();
|
||||
bzero((caddr_t)ep, sizeof (struct exportlist));
|
||||
memset(ep, 0, sizeof(struct exportlist));
|
||||
return (ep);
|
||||
}
|
||||
|
||||
@ -978,7 +967,7 @@ get_grp()
|
||||
gp = (struct grouplist *)malloc(sizeof (struct grouplist));
|
||||
if (gp == (struct grouplist *)NULL)
|
||||
out_of_mem();
|
||||
bzero((caddr_t)gp, sizeof (struct grouplist));
|
||||
memset(gp, 0, sizeof(struct grouplist));
|
||||
return (gp);
|
||||
}
|
||||
|
||||
@ -1270,12 +1259,12 @@ do_opt(cpp, endcpp, ep, grp, has_hostp, exflagsp, cr)
|
||||
while (cpopt && *cpopt) {
|
||||
allflag = 1;
|
||||
usedarg = -2;
|
||||
if (cpoptend = index(cpopt, ',')) {
|
||||
if (cpoptend = strchr(cpopt, ',')) {
|
||||
*cpoptend++ = '\0';
|
||||
if (cpoptarg = index(cpopt, '='))
|
||||
if (cpoptarg = strchr(cpopt, '='))
|
||||
*cpoptarg++ = '\0';
|
||||
} else {
|
||||
if (cpoptarg = index(cpopt, '='))
|
||||
if (cpoptarg = strchr(cpopt, '='))
|
||||
*cpoptarg++ = '\0';
|
||||
else {
|
||||
*cp = savedc;
|
||||
@ -1418,13 +1407,12 @@ get_host(cp, grp, tgrp)
|
||||
malloc(sizeof(struct hostent));
|
||||
if (nhp == (struct hostent *)NULL)
|
||||
out_of_mem();
|
||||
bcopy((caddr_t)hp, (caddr_t)nhp,
|
||||
sizeof(struct hostent));
|
||||
memmove(nhp, hp, sizeof(struct hostent));
|
||||
i = strlen(hp->h_name)+1;
|
||||
nhp->h_name = (char *)malloc(i);
|
||||
if (nhp->h_name == (char *)NULL)
|
||||
out_of_mem();
|
||||
bcopy(hp->h_name, nhp->h_name, i);
|
||||
memmove(nhp->h_name, hp->h_name, i);
|
||||
addrp = hp->h_addr_list;
|
||||
i = 1;
|
||||
while (*addrp++)
|
||||
@ -1439,8 +1427,7 @@ get_host(cp, grp, tgrp)
|
||||
malloc(hp->h_length);
|
||||
if (*naddrp == (char *)NULL)
|
||||
out_of_mem();
|
||||
bcopy(*addrp, *naddrp,
|
||||
hp->h_length);
|
||||
memmove(*naddrp, *addrp, hp->h_length);
|
||||
addrp++;
|
||||
naddrp++;
|
||||
}
|
||||
@ -1519,10 +1506,9 @@ get_isoaddr(cp, grp)
|
||||
malloc(sizeof (struct sockaddr_iso));
|
||||
if (isoaddr == (struct sockaddr_iso *)NULL)
|
||||
out_of_mem();
|
||||
bzero((caddr_t)isoaddr, sizeof (struct sockaddr_iso));
|
||||
bcopy((caddr_t)isop, (caddr_t)&isoaddr->siso_addr,
|
||||
sizeof (struct iso_addr));
|
||||
isoaddr->siso_len = sizeof (struct sockaddr_iso);
|
||||
memset(isoaddr, 0, sizeof(struct sockaddr_iso));
|
||||
memmove(&isoaddr->siso_addr, isop, sizeof(struct iso_addr));
|
||||
isoaddr->siso_len = sizeof(struct sockaddr_iso);
|
||||
isoaddr->siso_family = AF_ISO;
|
||||
grp->gr_type = GT_ISO;
|
||||
grp->gr_ptr.gt_isoaddr = isoaddr;
|
||||
@ -1573,8 +1559,8 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
|
||||
args.ua.fspec = 0;
|
||||
args.ua.export.ex_flags = exflags;
|
||||
args.ua.export.ex_anon = *anoncrp;
|
||||
bzero((char *)&sin, sizeof(sin));
|
||||
bzero((char *)&imask, sizeof(imask));
|
||||
memset(&sin, 0, sizeof(sin));
|
||||
memset(&imask, 0, sizeof(imask));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_len = sizeof(sin);
|
||||
imask.sin_family = AF_INET;
|
||||
@ -1640,13 +1626,9 @@ do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
|
||||
* Maybe I should just use the fsb->f_mntonname path instead
|
||||
* of looping back up the dirp to the mount point??
|
||||
* Also, needs to know how to export all types of local
|
||||
* exportable file systems and not just MOUNT_UFS.
|
||||
* exportable file systems and not just "ufs".
|
||||
*/
|
||||
#ifdef __NetBSD__
|
||||
while (mount(fsb->f_fstypename, dirp,
|
||||
#else
|
||||
while (mount(fsb->f_type, dirp,
|
||||
#endif
|
||||
fsb->f_flags | MNT_UPDATE, (caddr_t)&args) < 0) {
|
||||
if (cp)
|
||||
*cp-- = savedc;
|
||||
@ -1896,7 +1878,7 @@ void
|
||||
get_mountlist()
|
||||
{
|
||||
struct mountlist *mlp, **mlpp;
|
||||
char *eos, *dirp;
|
||||
char *host, *dirp, *cp;
|
||||
int len;
|
||||
char str[STRSIZ];
|
||||
FILE *mlfile;
|
||||
@ -1907,27 +1889,16 @@ get_mountlist()
|
||||
}
|
||||
mlpp = &mlhead;
|
||||
while (fgets(str, STRSIZ, mlfile) != NULL) {
|
||||
if ((dirp = index(str, '\t')) == NULL &&
|
||||
(dirp = index(str, ' ')) == NULL)
|
||||
cp = str;
|
||||
host = strsep(&cp, " \t\n");
|
||||
dirp = strsep(&cp, " \t\n");
|
||||
if (host == NULL || dirp == NULL)
|
||||
continue;
|
||||
mlp = (struct mountlist *)malloc(sizeof (*mlp));
|
||||
len = dirp-str;
|
||||
if (len > RPCMNT_NAMELEN)
|
||||
len = RPCMNT_NAMELEN;
|
||||
bcopy(str, mlp->ml_host, len);
|
||||
mlp->ml_host[len] = '\0';
|
||||
while (*dirp == '\t' || *dirp == ' ')
|
||||
dirp++;
|
||||
if ((eos = index(dirp, '\t')) == NULL &&
|
||||
(eos = index(dirp, ' ')) == NULL &&
|
||||
(eos = index(dirp, '\n')) == NULL)
|
||||
len = strlen(dirp);
|
||||
else
|
||||
len = eos-dirp;
|
||||
if (len > RPCMNT_PATHLEN)
|
||||
len = RPCMNT_PATHLEN;
|
||||
bcopy(dirp, mlp->ml_dirp, len);
|
||||
mlp->ml_dirp[len] = '\0';
|
||||
strncpy(mlp->ml_host, host, RPCMNT_NAMELEN);
|
||||
mlp->ml_host[RPCMNT_NAMELEN] = '\0';
|
||||
strncpy(mlp->ml_dirp, dirp, RPCMNT_PATHLEN);
|
||||
mlp->ml_dirp[RPCMNT_PATHLEN] = '\0';
|
||||
mlp->ml_next = (struct mountlist *)NULL;
|
||||
*mlpp = mlp;
|
||||
mlpp = &mlp->ml_next;
|
||||
|
Loading…
Reference in New Issue
Block a user